From 1109b4cb35a37ac09cca4754e9e822ea81d0ce07 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 4 Feb 2013 15:03:24 +0530 Subject: [PATCH 001/110] [IMP]add session tag for yaml and based on session user whole yaml tested bzr revid: sgo@tinyerp.com-20130204093324-6jdty26tepmvjhhs --- .../addons/base/security/ir.model.access.csv | 2 +- openerp/tools/yaml_import.py | 17 ++++++++++++++--- openerp/tools/yaml_tag.py | 13 +++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv index 35d5b82bc41..3a29108d61e 100644 --- a/openerp/addons/base/security/ir.model.access.csv +++ b/openerp/addons/base/security/ir.model.access.csv @@ -17,7 +17,7 @@ "access_ir_model_constraint","ir_model_constraint","model_ir_model_constraint",,1,0,0,0 "access_ir_model_relation","ir_model_relation","model_ir_model_relation",,1,0,0,0 "access_ir_model_access_all","ir_model_access_all","model_ir_model_access",,1,0,0,0 -"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,0,0,0 +"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,1,1,1 "access_ir_model_fields_all","ir_model_fields all","model_ir_model_fields",,1,0,0,0 "access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category",,1,0,0,0 "access_ir_module_module_group_user","ir_module_module group_user","model_ir_module_module","group_system",1,1,1,1 diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 3172caac1f4..1629ee1b9be 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -88,6 +88,9 @@ def is_ir_set(node): def is_string(node): return isinstance(node, basestring) +def is_session(node): + return _is_yaml_mapping(node, yaml_tag.Session) + class RecordDictWrapper(dict): """ Used to pass a record as locals in eval: @@ -324,7 +327,7 @@ class YamlInterpreter(object): record_dict = self._create_record(model, fields, view_info, default=default) _logger.debug("RECORD_DICT %s" % record_dict) - id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, record.model, \ + id = self.pool.get('ir.model.data')._update(self.cr, self.uid, record.model, \ self.module, record_dict, record.id, noupdate=self.isnoupdate(record), mode=self.mode, context=context) self.id_map[record.id] = int(id) if config.get('import_partial'): @@ -760,7 +763,7 @@ class YamlInterpreter(object): keyword = 'client_action_relate' value = 'ir.actions.act_window,%s' % id replace = node.replace or True - self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', keyword, \ + self.pool.get('ir.model.data').ir_set(self.cr, self.uid, 'action', keyword, \ node.id, [node.src_model], value, replace=replace, noupdate=self.isnoupdate(node), isobject=True, xml_id=node.id) # TODO add remove ir.model.data @@ -775,10 +778,16 @@ class YamlInterpreter(object): self.pool.get(node.model).unlink(self.cr, self.uid, ids) else: self._log("Record not deleted.") + + def process_session(self, node): + record, fields = node.items()[0] + uid = self.get_id(record.uid) + self.uid = uid + _logger.debug("RECORD_DICT %s" % uid) def process_url(self, node): self.validate_xml_id(node.id) - + res = {'name': node.name, 'url': node.url, 'target': node.target} id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, \ @@ -889,6 +898,8 @@ class YamlInterpreter(object): self.process_act_window(node) elif is_report(node): self.process_report(node) + elif is_session(node): + self.process_session(node) elif is_workflow(node): if isinstance(node, types.DictionaryType): self.process_workflow(node) diff --git a/openerp/tools/yaml_tag.py b/openerp/tools/yaml_tag.py index b22787ddf98..c4d5f251479 100644 --- a/openerp/tools/yaml_tag.py +++ b/openerp/tools/yaml_tag.py @@ -32,6 +32,13 @@ class Record(YamlTag): def __str__(self): return '!record {model: %s, id: %s}:' % (str(self.model,), str(self.id,)) +class Session(YamlTag): + def __init__(self, uid, **kwargs): + self.uid = uid + super(Session, self).__init__(**kwargs) + def __str__(self): + return '!session {uid: %s}:' % (str(self.uid,)) + class Python(YamlTag): def __init__(self, model, severity=logging.ERROR, name="", **kwargs): self.model= model @@ -113,6 +120,11 @@ def record_constructor(loader, node): assert "id" in kwargs, "'id' argument is required for !record" return Record(**kwargs) +def session_constructor(loader, node): + kwargs = loader.construct_mapping(node) + assert "uid" in kwargs, "'uid' argument is required for !session" + return Session(**kwargs) + def python_constructor(loader, node): kwargs = loader.construct_mapping(node) return Python(**kwargs) @@ -182,6 +194,7 @@ def add_constructors(): yaml.add_constructor(u"!eval", eval_constructor) yaml.add_multi_constructor(u"!ref", ref_constructor) yaml.add_constructor(u"!ir_set", ir_set_constructor) + yaml.add_constructor(u"!session", session_constructor) add_constructors() From 5ec04f670303a984c53b11bcdc0c0fed0bd51720 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 4 Feb 2013 15:04:25 +0530 Subject: [PATCH 002/110] [IMP]add yml file based on new session tag which test yml as per session user bzr revid: sgo@tinyerp.com-20130204093425-blivw1198zxhsh2u --- addons/sale/__openerp__.py | 3 ++- addons/sale/test/sale_order_demo.yml | 16 ---------------- 2 files changed, 2 insertions(+), 17 deletions(-) delete mode 100644 addons/sale/test/sale_order_demo.yml diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index 8cc4919e3a1..6ba3a02bb00 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -80,7 +80,8 @@ The Dashboard for the Sales Manager will include ], 'demo': ['sale_demo.xml'], 'test': [ - 'test/sale_order_demo.yml', + 'test/sale_order_salesmanager_demo.yml', + 'test/sale_order_salesman_demo.yml', 'test/manual_order_policy.yml', 'test/cancel_order.yml', 'test/delete_order.yml', diff --git a/addons/sale/test/sale_order_demo.yml b/addons/sale/test/sale_order_demo.yml deleted file mode 100644 index 7e5a223e8b0..00000000000 --- a/addons/sale/test/sale_order_demo.yml +++ /dev/null @@ -1,16 +0,0 @@ -- - In order to test process of the Sale Order, I create sale order -- - !record {model: sale.order, id: sale_order_test1}: - partner_id: base.res_partner_2 - note: Invoice after delivery - payment_term: account.account_payment_term - order_line: - - product_id: product.product_product_7 - product_uom_qty: 8 -- - I verify that the onchange was correctly triggered -- - !assert {model: sale.order, id: sale.sale_order_test1, string: The onchange function of product was not correctly triggered}: - - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' - - order_line[0].price_unit == 1350.0 From 72043cfbc34586a937918ea2ac1a5f7ab177fb25 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 4 Feb 2013 18:02:12 +0530 Subject: [PATCH 003/110] [ADD]yml files bzr revid: sgo@tinyerp.com-20130204123212-psghdi2mnp4r2lut --- addons/sale/test/sale_order_salesman_demo.yml | 32 +++++++++++++++++++ .../test/sale_order_salesmanager_demo.yml | 28 ++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 addons/sale/test/sale_order_salesman_demo.yml create mode 100644 addons/sale/test/sale_order_salesmanager_demo.yml diff --git a/addons/sale/test/sale_order_salesman_demo.yml b/addons/sale/test/sale_order_salesman_demo.yml new file mode 100644 index 00000000000..4e297249322 --- /dev/null +++ b/addons/sale/test/sale_order_salesman_demo.yml @@ -0,0 +1,32 @@ +- + In order to test process of the Sale Order, I create sale order +- + Create a user 'Salesman' +- + !record {model: res.users, id: res_users_salesman}: + company_id: base.main_company + name: Salesman + login: su + password: su + groups_id: + - base.group_sale_salesman_all_leads +- + Create a user 'Salesman' +- + Now, check the data with salesman +- + !session {uid: res_users_salesman}: +- + !record {model: sale.order, id: sale_order_test2}: + partner_id: base.res_partner_3 + note: Invoice after delivery + payment_term: account.account_payment_term + order_line: + - product_id: product.product_product_7 + product_uom_qty: 7 +- + I verify that the onchange was correctly triggered +- + !assert {model: sale.order, id: sale.sale_order_test2, string: The onchange function of product was not correctly triggered}: + - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' + - order_line[0].price_unit == 1350.0 diff --git a/addons/sale/test/sale_order_salesmanager_demo.yml b/addons/sale/test/sale_order_salesmanager_demo.yml new file mode 100644 index 00000000000..f4d7750029d --- /dev/null +++ b/addons/sale/test/sale_order_salesmanager_demo.yml @@ -0,0 +1,28 @@ +- + In order to test process of the Sale Order, I create sale order +- + !record {model: res.users, id: res_users_salesmanager}: + company_id: base.main_company + name: Sales manager + login: sm + password: sm + groups_id: + - base.group_sale_manager +- + Now, check the data with sales Manager +- + !session {uid: res_users_salesmanager}: +- + !record {model: sale.order, id: sale_order_test1}: + partner_id: base.res_partner_2 + note: Invoice after delivery + payment_term: account.account_payment_term + order_line: + - product_id: product.product_product_7 + product_uom_qty: 8 +- + I verify that the onchange was correctly triggered +- + !assert {model: sale.order, id: sale.sale_order_test1, string: The onchange function of product was not correctly triggered}: + - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' + - order_line[0].price_unit == 1350.0 From 74a681e9dbafa5759ada82ec9262fe893ed99f9f Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 18 Feb 2013 11:40:14 +0530 Subject: [PATCH 004/110] [IMP]revert changes as per new spec bzr revid: sgo@tinyerp.com-20130218061014-lg6uk108vajx43mo --- openerp/tools/yaml_import.py | 13 +------------ openerp/tools/yaml_tag.py | 13 ------------- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 1629ee1b9be..9a8b2a6cd8d 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -88,9 +88,6 @@ def is_ir_set(node): def is_string(node): return isinstance(node, basestring) -def is_session(node): - return _is_yaml_mapping(node, yaml_tag.Session) - class RecordDictWrapper(dict): """ Used to pass a record as locals in eval: @@ -763,7 +760,7 @@ class YamlInterpreter(object): keyword = 'client_action_relate' value = 'ir.actions.act_window,%s' % id replace = node.replace or True - self.pool.get('ir.model.data').ir_set(self.cr, self.uid, 'action', keyword, \ + self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', keyword, \ node.id, [node.src_model], value, replace=replace, noupdate=self.isnoupdate(node), isobject=True, xml_id=node.id) # TODO add remove ir.model.data @@ -779,12 +776,6 @@ class YamlInterpreter(object): else: self._log("Record not deleted.") - def process_session(self, node): - record, fields = node.items()[0] - uid = self.get_id(record.uid) - self.uid = uid - _logger.debug("RECORD_DICT %s" % uid) - def process_url(self, node): self.validate_xml_id(node.id) @@ -898,8 +889,6 @@ class YamlInterpreter(object): self.process_act_window(node) elif is_report(node): self.process_report(node) - elif is_session(node): - self.process_session(node) elif is_workflow(node): if isinstance(node, types.DictionaryType): self.process_workflow(node) diff --git a/openerp/tools/yaml_tag.py b/openerp/tools/yaml_tag.py index c4d5f251479..b22787ddf98 100644 --- a/openerp/tools/yaml_tag.py +++ b/openerp/tools/yaml_tag.py @@ -32,13 +32,6 @@ class Record(YamlTag): def __str__(self): return '!record {model: %s, id: %s}:' % (str(self.model,), str(self.id,)) -class Session(YamlTag): - def __init__(self, uid, **kwargs): - self.uid = uid - super(Session, self).__init__(**kwargs) - def __str__(self): - return '!session {uid: %s}:' % (str(self.uid,)) - class Python(YamlTag): def __init__(self, model, severity=logging.ERROR, name="", **kwargs): self.model= model @@ -120,11 +113,6 @@ def record_constructor(loader, node): assert "id" in kwargs, "'id' argument is required for !record" return Record(**kwargs) -def session_constructor(loader, node): - kwargs = loader.construct_mapping(node) - assert "uid" in kwargs, "'uid' argument is required for !session" - return Session(**kwargs) - def python_constructor(loader, node): kwargs = loader.construct_mapping(node) return Python(**kwargs) @@ -194,7 +182,6 @@ def add_constructors(): yaml.add_constructor(u"!eval", eval_constructor) yaml.add_multi_constructor(u"!ref", ref_constructor) yaml.add_constructor(u"!ir_set", ir_set_constructor) - yaml.add_constructor(u"!session", session_constructor) add_constructors() From 3be3625587d11fbb44f2df3ca0c920d58831ad1b Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 18 Feb 2013 12:58:21 +0530 Subject: [PATCH 005/110] [IMP]improve code as per new spec bzr revid: sgo@tinyerp.com-20130218072821-c1x1bwvv1gp77w9t --- addons/sale/test/sale_order_salesman_demo.yml | 3 ++- addons/sale/test/sale_order_salesmanager_demo.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/sale/test/sale_order_salesman_demo.yml b/addons/sale/test/sale_order_salesman_demo.yml index 4e297249322..dbaf35c7a8f 100644 --- a/addons/sale/test/sale_order_salesman_demo.yml +++ b/addons/sale/test/sale_order_salesman_demo.yml @@ -15,7 +15,8 @@ - Now, check the data with salesman - - !session {uid: res_users_salesman}: + !context + 'uid': 'res_users_salesman' - !record {model: sale.order, id: sale_order_test2}: partner_id: base.res_partner_3 diff --git a/addons/sale/test/sale_order_salesmanager_demo.yml b/addons/sale/test/sale_order_salesmanager_demo.yml index f4d7750029d..47bb9081a55 100644 --- a/addons/sale/test/sale_order_salesmanager_demo.yml +++ b/addons/sale/test/sale_order_salesmanager_demo.yml @@ -11,7 +11,8 @@ - Now, check the data with sales Manager - - !session {uid: res_users_salesmanager}: + !context + 'uid': 'res_users_salesmanager' - !record {model: sale.order, id: sale_order_test1}: partner_id: base.res_partner_2 From e983e49f209d4ac7283a6cc034cfbc9e27c3138d Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 18 Feb 2013 15:40:43 +0530 Subject: [PATCH 006/110] [IMP]improve code bzr revid: sgo@tinyerp.com-20130218101043-7hy8m5goylr7fv2t --- addons/sale/test/sale_order_salesman_demo.yml | 6 ++---- addons/sale/test/sale_order_salesmanager_demo.yml | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/sale/test/sale_order_salesman_demo.yml b/addons/sale/test/sale_order_salesman_demo.yml index dbaf35c7a8f..56c781d1451 100644 --- a/addons/sale/test/sale_order_salesman_demo.yml +++ b/addons/sale/test/sale_order_salesman_demo.yml @@ -1,7 +1,7 @@ - In order to test process of the Sale Order, I create sale order - - Create a user 'Salesman' + Create a user as 'Salesman' - !record {model: res.users, id: res_users_salesman}: company_id: base.main_company @@ -10,13 +10,11 @@ password: su groups_id: - base.group_sale_salesman_all_leads -- - Create a user 'Salesman' - Now, check the data with salesman - !context - 'uid': 'res_users_salesman' + uid: 'res_users_salesman' - !record {model: sale.order, id: sale_order_test2}: partner_id: base.res_partner_3 diff --git a/addons/sale/test/sale_order_salesmanager_demo.yml b/addons/sale/test/sale_order_salesmanager_demo.yml index 47bb9081a55..f09e1327a75 100644 --- a/addons/sale/test/sale_order_salesmanager_demo.yml +++ b/addons/sale/test/sale_order_salesmanager_demo.yml @@ -1,5 +1,7 @@ - In order to test process of the Sale Order, I create sale order +- + Create a user as 'Salesmanager' - !record {model: res.users, id: res_users_salesmanager}: company_id: base.main_company @@ -12,7 +14,7 @@ Now, check the data with sales Manager - !context - 'uid': 'res_users_salesmanager' + uid: 'res_users_salesmanager' - !record {model: sale.order, id: sale_order_test1}: partner_id: base.res_partner_2 From 095af7d4932006e94ec30d06889ea6e86594c3b4 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 18 Feb 2013 17:02:38 +0530 Subject: [PATCH 007/110] [IMP]remove extra spaces bzr revid: sgo@tinyerp.com-20130218113238-x6wf0vxjmv0etwft --- openerp/tools/yaml_import.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 9a8b2a6cd8d..46168f40bae 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -775,10 +775,9 @@ class YamlInterpreter(object): self.pool.get(node.model).unlink(self.cr, self.uid, ids) else: self._log("Record not deleted.") - + def process_url(self, node): self.validate_xml_id(node.id) - res = {'name': node.name, 'url': node.url, 'target': node.target} id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, \ From 83af08294e7ca5b0f788ea99822a19ba4fd0660f Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 19 Feb 2013 12:57:34 +0530 Subject: [PATCH 008/110] [IMP]improve yaml for cancel order bzr revid: sgo@tinyerp.com-20130219072734-70093wqxyory3arz --- addons/sale/__openerp__.py | 2 +- ..._order.yml => cancel_order_sale_manager.yml} | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) rename addons/sale/test/{cancel_order.yml => cancel_order_sale_manager.yml} (89%) diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index 6ba3a02bb00..26014e8cadd 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -83,7 +83,7 @@ The Dashboard for the Sales Manager will include 'test/sale_order_salesmanager_demo.yml', 'test/sale_order_salesman_demo.yml', 'test/manual_order_policy.yml', - 'test/cancel_order.yml', + 'test/cancel_order_sale_manager.yml', 'test/delete_order.yml', 'test/edi_sale_order.yml', ], diff --git a/addons/sale/test/cancel_order.yml b/addons/sale/test/cancel_order_sale_manager.yml similarity index 89% rename from addons/sale/test/cancel_order.yml rename to addons/sale/test/cancel_order_sale_manager.yml index 12b28fcb7e8..78a3af6113b 100644 --- a/addons/sale/test/cancel_order.yml +++ b/addons/sale/test/cancel_order_sale_manager.yml @@ -3,7 +3,21 @@ I confirm order (with at least 2 lines) - !workflow {model: sale.order, action: order_confirm, ref: sale_order_8} - +- + Create a user as 'Salesmanager for cancel order' +- + !record {model: res.users, id: res_users_can_so}: + company_id: base.main_company + name: Sales manager for cancel + login: smc + password: smc + groups_id: + - base.group_sale_manager +- + Now, check the data with sales Manager for cancel order. +- + !context + uid: 'res_users_can_so' - I check state of order in 'Sale Order'. - @@ -32,6 +46,7 @@ ctx = context.copy() ctx.update({"active_model": 'sale.order', "active_ids": [ref("sale_order_8")], "active_id":ref("sale_order_8")}) pay_id = self.create(cr, uid, {'advance_payment_method': 'fixed', 'amount': 5}) + print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.",uid self.create_invoices(cr, uid, [pay_id], context=ctx) invoice_ids = self.pool.get('sale.order').browse(cr, uid, ref("sale_order_8")).invoice_ids From 3e01083a1bb6bac3e2b46734cbd154a685283634 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 19 Feb 2013 14:23:28 +0530 Subject: [PATCH 009/110] [IMP]improve code bzr revid: sgo@tinyerp.com-20130219085328-um1q8bs4iw773ivs --- addons/sale/test/cancel_order_sale_manager.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/sale/test/cancel_order_sale_manager.yml b/addons/sale/test/cancel_order_sale_manager.yml index 78a3af6113b..770d1a5924d 100644 --- a/addons/sale/test/cancel_order_sale_manager.yml +++ b/addons/sale/test/cancel_order_sale_manager.yml @@ -46,7 +46,6 @@ ctx = context.copy() ctx.update({"active_model": 'sale.order', "active_ids": [ref("sale_order_8")], "active_id":ref("sale_order_8")}) pay_id = self.create(cr, uid, {'advance_payment_method': 'fixed', 'amount': 5}) - print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.",uid self.create_invoices(cr, uid, [pay_id], context=ctx) invoice_ids = self.pool.get('sale.order').browse(cr, uid, ref("sale_order_8")).invoice_ids From d4a1cec260ffa9fb1c10430df6e8c38880ecaf6a Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 19 Feb 2013 18:49:21 +0530 Subject: [PATCH 010/110] [IMP]improve code and yml bzr revid: sgo@tinyerp.com-20130219131921-nbfs273xujvriomu --- addons/sale/__openerp__.py | 4 +- addons/sale/test/create_sale_users.yml | 20 +++++++++ addons/sale/test/sale_order_demo.yml | 41 +++++++++++++++++++ .../test/sale_order_salesmanager_demo.yml | 31 -------------- 4 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 addons/sale/test/create_sale_users.yml create mode 100644 addons/sale/test/sale_order_demo.yml delete mode 100644 addons/sale/test/sale_order_salesmanager_demo.yml diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index 6ba3a02bb00..2bea86b41af 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -80,8 +80,8 @@ The Dashboard for the Sales Manager will include ], 'demo': ['sale_demo.xml'], 'test': [ - 'test/sale_order_salesmanager_demo.yml', - 'test/sale_order_salesman_demo.yml', + 'test/create_sale_users.yml', + 'test/sale_order_demo.yml', 'test/manual_order_policy.yml', 'test/cancel_order.yml', 'test/delete_order.yml', diff --git a/addons/sale/test/create_sale_users.yml b/addons/sale/test/create_sale_users.yml new file mode 100644 index 00000000000..a61c4bd7c99 --- /dev/null +++ b/addons/sale/test/create_sale_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Salesmanager' +- + !record {model: res.users, id: res_users_salesmanager}: + company_id: base.main_company + name: Sales manager + login: sm + password: sm + groups_id: + - base.group_sale_manager +- + Create a user as 'Salesman' +- + !record {model: res.users, id: res_users_salesman}: + company_id: base.main_company + name: Salesman + login: su + password: su + groups_id: + - base.group_sale_salesman_all_leads diff --git a/addons/sale/test/sale_order_demo.yml b/addons/sale/test/sale_order_demo.yml new file mode 100644 index 00000000000..84aaa43a3cf --- /dev/null +++ b/addons/sale/test/sale_order_demo.yml @@ -0,0 +1,41 @@ +- + Test the data with salesman, +- + !context + uid: 'res_users_salesman' +- + In order to test process of the Sale Order, I create sale order +- + !record {model: sale.order, id: sale_order_test1}: + partner_id: base.res_partner_2 + note: Invoice after delivery + payment_term: account.account_payment_term + order_line: + - product_id: product.product_product_7 + product_uom_qty: 8 +- + I verify that the onchange was correctly triggered +- + !assert {model: sale.order, id: sale.sale_order_test1, string: The onchange function of product was not correctly triggered}: + - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' + - order_line[0].price_unit == 1350.0 + - order_line[0].product_uom_qty == 8 + - order_line[0].product_uom.id == ref('product.product_uom_unit') + +- + I create another sale order +- + !record {model: sale.order, id: sale_order_test2}: + partner_id: base.res_partner_2 + order_line: + - product_id: product.product_product_7 + product_uom_qty: 16 + product_uom: product.product_uom_dozen +- + I verify that the onchange was correctly triggered +- + !assert {model: sale.order, id: sale.sale_order_test2, string: The onchange function of product was not correctly triggered}: + - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' + - order_line[0].price_unit == 1350.0 * 12 + - order_line[0].product_uom.id == ref('product.product_uom_dozen') + - order_line[0].product_uom_qty == 16 \ No newline at end of file diff --git a/addons/sale/test/sale_order_salesmanager_demo.yml b/addons/sale/test/sale_order_salesmanager_demo.yml deleted file mode 100644 index f09e1327a75..00000000000 --- a/addons/sale/test/sale_order_salesmanager_demo.yml +++ /dev/null @@ -1,31 +0,0 @@ -- - In order to test process of the Sale Order, I create sale order -- - Create a user as 'Salesmanager' -- - !record {model: res.users, id: res_users_salesmanager}: - company_id: base.main_company - name: Sales manager - login: sm - password: sm - groups_id: - - base.group_sale_manager -- - Now, check the data with sales Manager -- - !context - uid: 'res_users_salesmanager' -- - !record {model: sale.order, id: sale_order_test1}: - partner_id: base.res_partner_2 - note: Invoice after delivery - payment_term: account.account_payment_term - order_line: - - product_id: product.product_product_7 - product_uom_qty: 8 -- - I verify that the onchange was correctly triggered -- - !assert {model: sale.order, id: sale.sale_order_test1, string: The onchange function of product was not correctly triggered}: - - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' - - order_line[0].price_unit == 1350.0 From 33636c1dcfdd95e231d5e6b202775129d8e8ddd8 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 19 Feb 2013 18:57:12 +0530 Subject: [PATCH 011/110] [REM]remove file bzr revid: sgo@tinyerp.com-20130219132712-hr0sns52uy0821th --- addons/sale/test/sale_order_salesman_demo.yml | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 addons/sale/test/sale_order_salesman_demo.yml diff --git a/addons/sale/test/sale_order_salesman_demo.yml b/addons/sale/test/sale_order_salesman_demo.yml deleted file mode 100644 index 56c781d1451..00000000000 --- a/addons/sale/test/sale_order_salesman_demo.yml +++ /dev/null @@ -1,31 +0,0 @@ -- - In order to test process of the Sale Order, I create sale order -- - Create a user as 'Salesman' -- - !record {model: res.users, id: res_users_salesman}: - company_id: base.main_company - name: Salesman - login: su - password: su - groups_id: - - base.group_sale_salesman_all_leads -- - Now, check the data with salesman -- - !context - uid: 'res_users_salesman' -- - !record {model: sale.order, id: sale_order_test2}: - partner_id: base.res_partner_3 - note: Invoice after delivery - payment_term: account.account_payment_term - order_line: - - product_id: product.product_product_7 - product_uom_qty: 7 -- - I verify that the onchange was correctly triggered -- - !assert {model: sale.order, id: sale.sale_order_test2, string: The onchange function of product was not correctly triggered}: - - order_line[0].name == u'[LCD17] 17\u201d LCD Monitor' - - order_line[0].price_unit == 1350.0 From fad27029faa105e9ca8d934d00680373d1487dc5 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Wed, 20 Feb 2013 10:27:34 +0530 Subject: [PATCH 012/110] [IMP] add yml file & improve code in crm bzr revid: fka@tinyerp.com-20130220045734-auwnnd55vpimt3ep --- addons/crm/__openerp__.py | 1 + addons/crm/security/ir.model.access.csv | 1 + .../crm/test/process/lead2opportunity2win.yml | 5 +++ .../lead2opportunity_assign_salesmen.yml | 45 ++++++++++--------- addons/crm/test/process/merge_opportunity.yml | 1 - addons/crm/test/process/phonecalls.yml | 5 +++ addons/crm/test/ui/crm_access_group_users.yml | 20 +++++++++ addons/mail/security/ir.model.access.csv | 4 +- 8 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 addons/crm/test/ui/crm_access_group_users.yml diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py index 0dd075d48e6..1d0ea32c0bc 100644 --- a/addons/crm/__openerp__.py +++ b/addons/crm/__openerp__.py @@ -103,6 +103,7 @@ Dashboard for CRM will include: 'crm_action_rule_demo.xml', ], 'test': [ + 'test/ui/crm_access_group_users.yml', 'test/process/communication_with_customer.yml', 'test/process/lead2opportunity2win.yml', 'test/process/lead2opportunity_assign_salesmen.yml', diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 74394d3c5ce..0f2cf267b47 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -29,6 +29,7 @@ access_calendar_attendee_crm_manager,calendar.attendee.crm.manager,model_calenda access_res_partner,res.partner.crm.user,base.model_res_partner,base.group_sale_salesman,1,1,1,0 access_res_partner_category,res.partner.category.crm.user,base.model_res_partner_category,base.group_sale_salesman,1,1,1,0 mail_mailgate_thread,mail.thread,mail.model_mail_thread,base.group_sale_salesman,1,1,1,1 +access_mail_message,mail.message,mail.model_mail_message,base.group_sale_salesman,1,1,1,0 access_crm_case_categ_manager,crm.case.categ manager,model_crm_case_categ,base.group_sale_manager,1,1,1,1 access_base_action_rule_manager,base.action.rule manager,base_action_rule.model_base_action_rule,base.group_sale_manager,1,1,1,1 access_crm_lead_report_user,crm.lead.report user,model_crm_lead_report,base.group_sale_salesman,1,1,1,1 diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index 94e7149ef77..fc56b513588 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -1,3 +1,8 @@ +- + Now, check the data with Salesman. +- + !context + uid: 'crm_res_users_salesman' - In order to test the conversion of a lead into a opportunity, - diff --git a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml b/addons/crm/test/process/lead2opportunity_assign_salesmen.yml index 0edd3b8edce..0d823dc87f4 100644 --- a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml +++ b/addons/crm/test/process/lead2opportunity_assign_salesmen.yml @@ -1,5 +1,30 @@ - During a lead to opp conversion, salesmen should be assigned to leads following the round-robin method. Start by creating 6 leads (1 to 6) and 4 salesmen (A to D). +- + !record {model: res.users, id: test_res_user_01}: + name: 'Test user A' + login: 'tua' + new_password: 'tua' +- + !record {model: res.users, id: test_res_user_02}: + name: 'Test user B' + login: 'tub' + new_password: 'tub' +- + !record {model: res.users, id: test_res_user_03}: + name: 'Test user C' + login: 'tuc' + new_password: 'tuc' +- + !record {model: res.users, id: test_res_user_04}: + name: 'Test user D' + login: 'tud' + new_password: 'tud' +- + Now, check the data with Salesman. +- + !context + uid: 'crm_res_users_salesman' - !record {model: crm.lead, id: test_crm_lead_01}: type: 'lead' @@ -36,26 +61,6 @@ name: 'Test lead 6' partner_name: 'Agrolait SuperSeed SA' stage_id: stage_lead1 -- - !record {model: res.users, id: test_res_user_01}: - name: 'Test user A' - login: 'tua' - new_password: 'tua' -- - !record {model: res.users, id: test_res_user_02}: - name: 'Test user B' - login: 'tub' - new_password: 'tub' -- - !record {model: res.users, id: test_res_user_03}: - name: 'Test user C' - login: 'tuc' - new_password: 'tuc' -- - !record {model: res.users, id: test_res_user_04}: - name: 'Test user D' - login: 'tud' - new_password: 'tud' - I create a mass convert wizard and convert all the leads. - diff --git a/addons/crm/test/process/merge_opportunity.yml b/addons/crm/test/process/merge_opportunity.yml index c50af5214e6..e9027e228d7 100644 --- a/addons/crm/test/process/merge_opportunity.yml +++ b/addons/crm/test/process/merge_opportunity.yml @@ -1,4 +1,3 @@ - - During a mixed merge (involving leads and opps), data should be handled a certain way following their type (m2o, m2m, text, ...) Start by creating two leads and an opp. - diff --git a/addons/crm/test/process/phonecalls.yml b/addons/crm/test/process/phonecalls.yml index 51a933f3223..a71bfc05e03 100644 --- a/addons/crm/test/process/phonecalls.yml +++ b/addons/crm/test/process/phonecalls.yml @@ -1,3 +1,8 @@ +- + Now, check the data with Salesman. +- + !context + uid: 'crm_res_users_salesman' - I schedule a phone call with a customer. - diff --git a/addons/crm/test/ui/crm_access_group_users.yml b/addons/crm/test/ui/crm_access_group_users.yml new file mode 100644 index 00000000000..194c202ef15 --- /dev/null +++ b/addons/crm/test/ui/crm_access_group_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Salesmanager' +- + !record {model: res.users, id: crm_res_users_salesmanager}: + company_id: base.main_company + name: Sales manager + login: csm + password: csm + groups_id: + - base.group_sale_manager +- + Create a user as 'Salesman' +- + !record {model: res.users, id: crm_res_users_salesman}: + company_id: base.main_company + name: Salesman + login: csu + password: csu + groups_id: + - base.group_sale_salesman_all_leads diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 1141a3f928d..8faa06b0aa5 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -7,12 +7,12 @@ access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1 access_mail_followers_all,mail.followers.all,model_mail_followers,,1,0,0,0 access_mail_followers_user,mail.followers.user,model_mail_followers,base.group_user,1,1,0,0 access_mail_followers_system,mail.followers.system,model_mail_followers,base.group_system,1,1,1,1 -access_mail_notification_all,mail.notification.all,model_mail_notification,,1,0,0,0 +access_mail_notification_all,mail.notification.all,model_mail_notification,,1,0,1,0 access_mail_notification_user,mail.notification.user,model_mail_notification,base.group_user,1,1,1,0 access_mail_notification_system,mail.notification.system,model_mail_notification,base.group_system,1,1,1,1 access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0 access_mail_group_user,mail.group.user,model_mail_group,base.group_user,1,1,1,1 -access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0 +access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,1,0 access_mail_alias_user,mail.alias.user,model_mail_alias,base.group_user,1,1,1,0 access_mail_alias_system,mail.alias.system,model_mail_alias,base.group_system,1,1,1,1 access_mail_message_subtype_all,mail.message.subtype.all,model_mail_message_subtype,,1,0,0,0 From e07255568279284eebf4e337131ec7fb6af3984d Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Wed, 20 Feb 2013 11:33:26 +0530 Subject: [PATCH 013/110] [IMP]improve yml give them to appropriate access rights bzr revid: sgo@tinyerp.com-20130220060326-q22mdh5yob7erh7e --- addons/sale/test/cancel_order.yml | 5 +++++ addons/sale/test/delete_order.yml | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/addons/sale/test/cancel_order.yml b/addons/sale/test/cancel_order.yml index 12b28fcb7e8..48c6b91d2c4 100644 --- a/addons/sale/test/cancel_order.yml +++ b/addons/sale/test/cancel_order.yml @@ -1,3 +1,8 @@ +- + Salesman can also cancel order therfore test with that user which have salesman rights, +- + !context + uid: 'res_users_salesman' - In order to test the cancel sale order. I confirm order (with at least 2 lines) diff --git a/addons/sale/test/delete_order.yml b/addons/sale/test/delete_order.yml index abc68cb3af3..69c89020ad9 100644 --- a/addons/sale/test/delete_order.yml +++ b/addons/sale/test/delete_order.yml @@ -1,3 +1,8 @@ +- + Sales manager can only delete order therfore test with that user which have sales manager rights, +- + !context + uid: 'res_users_salesmanager' - I try to delete In progress order and check Error Message. - From 0dd9f460dad5bc1ef93bcf28370c08341d01bfb4 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Wed, 20 Feb 2013 12:07:25 +0530 Subject: [PATCH 014/110] [IMP] improve yml bzr revid: fka@tinyerp.com-20130220063725-dpa9tr2j57dor16c --- addons/crm/security/ir.model.access.csv | 1 + addons/crm/test/process/cancel_lead.yml | 19 +++++++++++-------- .../process/communication_with_customer.yml | 5 +++++ .../crm/test/process/lead2opportunity2win.yml | 2 +- .../lead2opportunity_assign_salesmen.yml | 6 +++--- addons/crm/test/ui/crm_demo.yml | 12 ++++++++---- addons/crm/test/ui/delete_lead.yml | 7 ++++++- addons/mail/security/ir.model.access.csv | 2 +- 8 files changed, 36 insertions(+), 18 deletions(-) diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 0f2cf267b47..cd460cf35d9 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -30,6 +30,7 @@ access_res_partner,res.partner.crm.user,base.model_res_partner,base.group_sale_s access_res_partner_category,res.partner.category.crm.user,base.model_res_partner_category,base.group_sale_salesman,1,1,1,0 mail_mailgate_thread,mail.thread,mail.model_mail_thread,base.group_sale_salesman,1,1,1,1 access_mail_message,mail.message,mail.model_mail_message,base.group_sale_salesman,1,1,1,0 +mail_mail_message,mail.message,mail.model_mail_message,base.group_sale_manager,1,1,1,1 access_crm_case_categ_manager,crm.case.categ manager,model_crm_case_categ,base.group_sale_manager,1,1,1,1 access_base_action_rule_manager,base.action.rule manager,base_action_rule.model_base_action_rule,base.group_sale_manager,1,1,1,1 access_crm_lead_report_user,crm.lead.report user,model_crm_lead_report,base.group_sale_salesman,1,1,1,1 diff --git a/addons/crm/test/process/cancel_lead.yml b/addons/crm/test/process/cancel_lead.yml index edaf844952a..ae2b6294c68 100644 --- a/addons/crm/test/process/cancel_lead.yml +++ b/addons/crm/test/process/cancel_lead.yml @@ -1,10 +1,13 @@ - - I cancel unqualified lead. + Salesman cancel unqualified lead. +- + !context + uid: 'crm_res_users_salesman' - !python {model: crm.lead}: | self.case_cancel(cr, uid, [ref("crm_case_1")]) - - I check cancelled lead. + Salesman check cancelled lead. - !python {model: crm.lead}: | lead = self.browse(cr, uid, ref('crm_case_1')) @@ -12,34 +15,34 @@ assert lead.state == 'cancel', "Opportunity is not in 'cancel' state." assert lead.probability == 0.0, 'Opportunity is probably wrong and should be 0.0.' - - I reset cancelled lead into unqualified lead. + Salesman reset cancelled lead into unqualified lead. - !python {model: crm.lead}: | self.case_reset(cr, uid, [ref("crm_case_1")]) - - I check unqualified lead after reset. + Salesman check unqualified lead after reset. - !assert {model: crm.lead, id: crm.crm_case_1, string: Lead is in draft state}: - state == "draft" - - I re-open the lead + Salesman re-open the lead - !python {model: crm.lead}: | self.case_open(cr, uid, [ref("crm_case_1")]) - - I check stage and state of the re-opened lead + Salesman check stage and state of the re-opened lead - !python {model: crm.lead}: | lead = self.browse(cr, uid, ref('crm.crm_case_1')) assert lead.stage_id.id == ref('crm.stage_lead2'), "Opportunity stage should be 'Qualification'." assert lead.state == 'open', "Opportunity should be in 'open' state." - - I escalate the lead to parent team. + Salesman escalate the lead to parent team. - !python {model: crm.lead}: | self.case_escalate(cr, uid, [ref("crm_case_1")]) - - I check the lead is correctly escalated to the parent team. + Salesman check the lead is correctly escalated to the parent team. - !assert {model: crm.lead, id: crm.crm_case_1, string: Escalate lead to parent team}: - section_id.name == "Support Department" diff --git a/addons/crm/test/process/communication_with_customer.yml b/addons/crm/test/process/communication_with_customer.yml index 221a4ab634f..4a36aeebd02 100644 --- a/addons/crm/test/process/communication_with_customer.yml +++ b/addons/crm/test/process/communication_with_customer.yml @@ -1,3 +1,8 @@ +- + Salesman communication with customer. +- + !context + uid: 'crm_res_users_salesman' - Customer interested in our product, so he sends request by email to get more details. - diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index fc56b513588..c69eb09ac31 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -1,5 +1,5 @@ - - Now, check the data with Salesman. + Salesman convert the lead into opportunity. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml b/addons/crm/test/process/lead2opportunity_assign_salesmen.yml index 0d823dc87f4..9583c6034bf 100644 --- a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml +++ b/addons/crm/test/process/lead2opportunity_assign_salesmen.yml @@ -1,5 +1,5 @@ - - During a lead to opp conversion, salesmen should be assigned to leads following the round-robin method. Start by creating 6 leads (1 to 6) and 4 salesmen (A to D). + During a lead to opp conversion, salesmen should be assigned to leads following the round-robin method. Start by creating 4 salesmen (A to D) and 6 leads (1 to 6). - !record {model: res.users, id: test_res_user_01}: name: 'Test user A' @@ -21,7 +21,7 @@ login: 'tud' new_password: 'tud' - - Now, check the data with Salesman. + Salesman creates lead. - !context uid: 'crm_res_users_salesman' @@ -62,7 +62,7 @@ partner_name: 'Agrolait SuperSeed SA' stage_id: stage_lead1 - - I create a mass convert wizard and convert all the leads. + Salesman create a mass convert wizard and convert all the leads. - !python {model: crm.lead2opportunity.partner.mass}: | context.update({'active_model': 'crm.lead', 'active_ids': [ref("test_crm_lead_01"), ref("test_crm_lead_02"), ref("test_crm_lead_03"), ref("test_crm_lead_04"), ref("test_crm_lead_05"), ref("test_crm_lead_06")], 'active_id': ref("test_crm_lead_01")}) diff --git a/addons/crm/test/ui/crm_demo.yml b/addons/crm/test/ui/crm_demo.yml index 9154ffdf513..85ed1cf7403 100644 --- a/addons/crm/test/ui/crm_demo.yml +++ b/addons/crm/test/ui/crm_demo.yml @@ -1,5 +1,9 @@ + - - I create a lead record to call a partner onchange, stage onchange and mailing opt-in onchange method. + Sales manager create a lead record to call a partner onchange, stage onchange and mailing opt-in onchange method. +- + !context + uid: 'crm_res_users_salesmanager' - !record {model: crm.lead, id: crm_case_25}: name: 'Need more info about your pc2' @@ -8,7 +12,7 @@ stage_id: crm.stage_lead1 state: draft - - I create a lead record to call a mailing opt-out onchange method. + Sales manager create a lead record to call a mailing opt-out onchange method. - !record {model: crm.lead, id: crm_case_18}: name: 'Need 20 Days of Consultancy' @@ -16,13 +20,13 @@ state: draft opt_out: True - - I create a phonecall record to call a partner onchange method. + Sales manager create a phonecall record to call a partner onchange method. - !record {model: crm.phonecall, id: crm_phonecall_5}: name: 'Bad time' partner_id: base.res_partner_5 - - I set the next stage to "New" for the lead. + Sales manager set the next stage to "New" for the lead. - !python {model: crm.lead}: | self.stage_next(cr, uid, [ref("crm_case_4")], context={'stage_type': 'lead'}) diff --git a/addons/crm/test/ui/delete_lead.yml b/addons/crm/test/ui/delete_lead.yml index 49713039f22..f68061ba6cd 100644 --- a/addons/crm/test/ui/delete_lead.yml +++ b/addons/crm/test/ui/delete_lead.yml @@ -1,5 +1,10 @@ - - I Unlink the Lead. + Sales manager can delete lead. +- + !context + uid: 'crm_res_users_salesmanager' +- + Sales manager Unlink the Lead. - !python {model: crm.lead}: | self.unlink(cr, uid, [ref("crm_case_4")]) diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 8faa06b0aa5..81b2356938b 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -1,7 +1,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_mail_message_all,mail.message.all,model_mail_message,,1,0,0,0 access_mail_message_user,mail.message.user,model_mail_message,base.group_user,1,1,1,1 -access_mail_mail_all,mail.mail.all,model_mail_mail,,1,0,0,0 +access_mail_mail_all,mail.mail.all,model_mail_mail,,1,0,1,0 access_mail_mail_user,mail.mail.user,model_mail_mail,base.group_user,1,1,1,0 access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1,1 access_mail_followers_all,mail.followers.all,model_mail_followers,,1,0,0,0 From 99cb34cee9d978e883e2922004230a094a9037a4 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Wed, 20 Feb 2013 13:02:36 +0530 Subject: [PATCH 015/110] [IMP] add access rights in merge_opportunity.yml bzr revid: fka@tinyerp.com-20130220073236-7v3i73ui0zua4uo9 --- addons/crm/test/process/merge_opportunity.yml | 5 ++++- addons/crm/test/process/phonecalls.yml | 2 +- addons/crm/test/ui/crm_access_group_users.yml | 2 +- addons/crm/test/ui/delete_lead.yml | 4 +--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/crm/test/process/merge_opportunity.yml b/addons/crm/test/process/merge_opportunity.yml index e9027e228d7..a85372bdf7b 100644 --- a/addons/crm/test/process/merge_opportunity.yml +++ b/addons/crm/test/process/merge_opportunity.yml @@ -1,5 +1,8 @@ - - During a mixed merge (involving leads and opps), data should be handled a certain way following their type (m2o, m2m, text, ...) Start by creating two leads and an opp. + During a mixed merge (involving leads and opps), data should be handled a certain way following their type (m2o, m2m, text, ...) Start by creating two leads and an opp and giving the rights of Sales manager. +- + !context + uid: 'crm_res_users_salesmanager' - !record {model: crm.lead, id: test_crm_lead_01}: type: 'lead' diff --git a/addons/crm/test/process/phonecalls.yml b/addons/crm/test/process/phonecalls.yml index a71bfc05e03..63df8ac89c2 100644 --- a/addons/crm/test/process/phonecalls.yml +++ b/addons/crm/test/process/phonecalls.yml @@ -1,5 +1,5 @@ - - Now, check the data with Salesman. + Salesman check the phone calls data. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/ui/crm_access_group_users.yml b/addons/crm/test/ui/crm_access_group_users.yml index 194c202ef15..cc5be01ee85 100644 --- a/addons/crm/test/ui/crm_access_group_users.yml +++ b/addons/crm/test/ui/crm_access_group_users.yml @@ -1,5 +1,5 @@ - - Create a user as 'Salesmanager' + Create a user as 'Salesmanager' - !record {model: res.users, id: crm_res_users_salesmanager}: company_id: base.main_company diff --git a/addons/crm/test/ui/delete_lead.yml b/addons/crm/test/ui/delete_lead.yml index f68061ba6cd..10d2de82e7e 100644 --- a/addons/crm/test/ui/delete_lead.yml +++ b/addons/crm/test/ui/delete_lead.yml @@ -1,10 +1,8 @@ - - Sales manager can delete lead. + Sales manager Unlink the Lead. - !context uid: 'crm_res_users_salesmanager' -- - Sales manager Unlink the Lead. - !python {model: crm.lead}: | self.unlink(cr, uid, [ref("crm_case_4")]) From 49ef7d89a8b525acf59fd6f69d9131ec68e2d147 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Wed, 20 Feb 2013 15:02:27 +0530 Subject: [PATCH 016/110] [IMP] add yml file & add access rights in event bzr revid: fka@tinyerp.com-20130220093227-uf6oom9fginl2jdc --- addons/event/__openerp__.py | 2 +- addons/event/security/ir.model.access.csv | 2 ++ .../event/test/process/event_draft2done.yml | 5 +++++ addons/event/test/ui/event_users.yml | 20 +++++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 addons/event/test/ui/event_users.yml diff --git a/addons/event/__openerp__.py b/addons/event/__openerp__.py index 54b77c82f69..e8ecb09bf03 100644 --- a/addons/event/__openerp__.py +++ b/addons/event/__openerp__.py @@ -52,7 +52,7 @@ Key Features 'email_template.xml', ], 'demo': ['event_demo.xml'], - 'test': ['test/process/event_draft2done.yml'], + 'test': ['test/ui/event_users.yml','test/process/event_draft2done.yml'], 'css': ['static/src/css/event.css'], 'installable': True, 'application': True, diff --git a/addons/event/security/ir.model.access.csv b/addons/event/security/ir.model.access.csv index b6cdc4c4ec6..0801b8306f0 100644 --- a/addons/event/security/ir.model.access.csv +++ b/addons/event/security/ir.model.access.csv @@ -6,3 +6,5 @@ access_event_registration,event.registration,model_event_registration,event.grou access_report_event_registration,report.event.registration,model_report_event_registration,event.group_event_user,1,1,1,1 access_event_event_portal,event.event,model_event_event,,1,0,0,0 access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0 +access_event_partner,res.partner,model_res_partner,event.group_event_user,1,1,1,0 +access_mail_message,mail.message,mail.model_mail_message,event.group_event_user,1,1,1,0 diff --git a/addons/event/test/process/event_draft2done.yml b/addons/event/test/process/event_draft2done.yml index eb40340befd..e485cb5af6c 100644 --- a/addons/event/test/process/event_draft2done.yml +++ b/addons/event/test/process/event_draft2done.yml @@ -1,3 +1,8 @@ +- + give the access rights of Event user to organize an event and also do registration. +- + !context + uid: 'res_users_eventuser' - I want to organize an event, into this conference I should create two registration. diff --git a/addons/event/test/ui/event_users.yml b/addons/event/test/ui/event_users.yml new file mode 100644 index 00000000000..34564d6c433 --- /dev/null +++ b/addons/event/test/ui/event_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Event manager' +- + !record {model: res.users, id: res_users_eventmanager}: + company_id: base.main_company + name: Event manager + login: em + password: em + groups_id: + - event.group_event_manager +- + Create a user as 'Event user' +- + !record {model: res.users, id: res_users_eventuser}: + company_id: base.main_company + name: User + login: eu + password: eu + groups_id: + - event.group_event_user \ No newline at end of file From 96ec54e330a394a9aa0b92faad7280ec97512f98 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Wed, 20 Feb 2013 18:45:24 +0530 Subject: [PATCH 017/110] [IMP] add yml file in purchase bzr revid: fka@tinyerp.com-20130220131524-joc0qyy5dfdc1o6j --- addons/purchase/__openerp__.py | 3 ++- addons/purchase/purchase_order_demo.yml | 5 +++++ addons/purchase/test/process/cancel_order.yml | 5 +++++ .../test/process/generate_invoice_from_reception.yml | 5 +++++ addons/purchase/test/process/merge_order.yml | 5 +++++ addons/purchase/test/ui/delete_order.yml | 5 +++++ 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index a7c66344f4a..3f3acdf9f0f 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -67,6 +67,8 @@ Dashboard / Reports for Purchase Management will include: 'res_config_view.xml', ], 'test': [ + 'test/ui/purchase_users.yml', + 'purchase_order_demo.yml', 'test/process/cancel_order.yml', 'test/process/rfq2order2done.yml', 'test/process/generate_invoice_from_reception.yml', @@ -79,7 +81,6 @@ Dashboard / Reports for Purchase Management will include: 'test/ui/delete_order.yml', ], 'demo': [ - 'purchase_order_demo.yml', 'purchase_demo.xml', ], 'installable': True, diff --git a/addons/purchase/purchase_order_demo.yml b/addons/purchase/purchase_order_demo.yml index 9c83ff84406..fb49bfc1248 100644 --- a/addons/purchase/purchase_order_demo.yml +++ b/addons/purchase/purchase_order_demo.yml @@ -1,3 +1,8 @@ +- + Give access rights of Purchase user to create purchase order +- + !context + uid: 'res_users_purchase_user' - !record {model: purchase.order, id: purchase_order_1}: partner_id: base.res_partner_1 diff --git a/addons/purchase/test/process/cancel_order.yml b/addons/purchase/test/process/cancel_order.yml index 80fd7b5ff57..d3695cba6c8 100644 --- a/addons/purchase/test/process/cancel_order.yml +++ b/addons/purchase/test/process/cancel_order.yml @@ -1,3 +1,8 @@ +- + Purchase user can also cancel order therfore test with that user which have Purchase user rights. +- + !context + uid: 'res_users_purchase_user' - In order to test the cancel flow, I start it from canceling confirmed purchase order. - diff --git a/addons/purchase/test/process/generate_invoice_from_reception.yml b/addons/purchase/test/process/generate_invoice_from_reception.yml index 6390413b418..565f52f258f 100644 --- a/addons/purchase/test/process/generate_invoice_from_reception.yml +++ b/addons/purchase/test/process/generate_invoice_from_reception.yml @@ -1,3 +1,8 @@ +- + Purchase user can create an invoice for order on receptions therfore test with that user which have Purchase user rights. +- + !context + uid: 'res_users_purchase_user' - I confirm another order where invoice control is 'Bases on incoming shipments'. - diff --git a/addons/purchase/test/process/merge_order.yml b/addons/purchase/test/process/merge_order.yml index fb39bed310c..fdc7f0092e7 100644 --- a/addons/purchase/test/process/merge_order.yml +++ b/addons/purchase/test/process/merge_order.yml @@ -1,3 +1,8 @@ +- + Give access rights of Purchase user to merge two RFQ. +- + !context + uid: 'res_users_purchase_user' - In order to merge RFQ, I merge two RFQ which has same supplier and check new merged order. - diff --git a/addons/purchase/test/ui/delete_order.yml b/addons/purchase/test/ui/delete_order.yml index f8795007622..6f9ba54e89d 100644 --- a/addons/purchase/test/ui/delete_order.yml +++ b/addons/purchase/test/ui/delete_order.yml @@ -1,3 +1,8 @@ +- + Give access rights of Purchase user to delete purchase order +- + !context + uid: 'res_users_purchase_user' - In order to test to delete process on purchase order. - From 5252d9ac9cdf02f6a405bbe041cb54e62d7d4428 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 21 Feb 2013 10:44:59 +0530 Subject: [PATCH 018/110] [IMP] add yml file in purchase_reqisition bzr revid: fka@tinyerp.com-20130221051459-v20ilhc128ipw6yi --- addons/purchase/test/ui/purchase_users.yml | 20 +++++++++++++++++++ addons/purchase_requisition/__openerp__.py | 1 + .../test/cancel_purchase_requisition.yml | 5 +++++ .../test/purchase_reqisition_users.yml | 20 +++++++++++++++++++ .../test/purchase_requisition.yml | 5 +++++ .../test/purchase_requisition_demo.yml | 5 +++++ 6 files changed, 56 insertions(+) create mode 100644 addons/purchase/test/ui/purchase_users.yml create mode 100644 addons/purchase_requisition/test/purchase_reqisition_users.yml diff --git a/addons/purchase/test/ui/purchase_users.yml b/addons/purchase/test/ui/purchase_users.yml new file mode 100644 index 00000000000..e36d8140d28 --- /dev/null +++ b/addons/purchase/test/ui/purchase_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Purchase manager' +- + !record {model: res.users, id: res_users_purchase_manager}: + company_id: base.main_company + name: Purchase Manager + login: pm + password: pm + groups_id: + - purchase.group_purchase_manager +- + Create a user as 'Purchase user' +- + !record {model: res.users, id: res_users_purchase_user}: + company_id: base.main_company + name: Purchase User + login: pu + password: pu + groups_id: + - purchase.group_purchase_user \ No newline at end of file diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index 2ba0ad95e09..d2a94365318 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -43,6 +43,7 @@ keep track and order all your purchase orders. ], 'auto_install': False, 'test': [ + 'test/purchase_reqisition_users.yml', 'test/purchase_requisition_demo.yml', 'test/purchase_requisition.yml', 'test/cancel_purchase_requisition.yml', diff --git a/addons/purchase_requisition/test/cancel_purchase_requisition.yml b/addons/purchase_requisition/test/cancel_purchase_requisition.yml index 389c328a5cf..a865cb0548a 100644 --- a/addons/purchase_requisition/test/cancel_purchase_requisition.yml +++ b/addons/purchase_requisition/test/cancel_purchase_requisition.yml @@ -1,3 +1,8 @@ +- + Give access rights of Purchase Requisition User to cancelled requisition +- + !context + uid: 'res_users_purchase_requisition_user' - I cancel requisition. - diff --git a/addons/purchase_requisition/test/purchase_reqisition_users.yml b/addons/purchase_requisition/test/purchase_reqisition_users.yml new file mode 100644 index 00000000000..aa07e8a53f1 --- /dev/null +++ b/addons/purchase_requisition/test/purchase_reqisition_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Purchase Reqisition Manager' +- + !record {model: res.users, id: res_users_purchase_requisition_manager}: + company_id: base.main_company + name: Purchase Reqisition Manager + login: prm + password: prm + groups_id: + - purchase_reqisition.group_purchase_requisition_manager +- + Create a user as 'Purchase Reqisition User' +- + !record {model: res.users, id: res_users_purchase_requisition_user}: + company_id: base.main_company + name: Purchase Reqisition User + login: pru + password: pru + groups_id: + - purchase_reqisition.group_purchase_requisition_user \ No newline at end of file diff --git a/addons/purchase_requisition/test/purchase_requisition.yml b/addons/purchase_requisition/test/purchase_requisition.yml index 8fd36e07d71..5477f46e18b 100644 --- a/addons/purchase_requisition/test/purchase_requisition.yml +++ b/addons/purchase_requisition/test/purchase_requisition.yml @@ -1,3 +1,8 @@ +- + Give access rights of Purchase Requisition User +- + !context + uid: 'res_users_purchase_requisition_user' - I create the procurement order and run that procurement. - diff --git a/addons/purchase_requisition/test/purchase_requisition_demo.yml b/addons/purchase_requisition/test/purchase_requisition_demo.yml index 5e441f26ea3..8265e6c72da 100755 --- a/addons/purchase_requisition/test/purchase_requisition_demo.yml +++ b/addons/purchase_requisition/test/purchase_requisition_demo.yml @@ -1,3 +1,8 @@ +- + Give access rights of Purchase Requisition User to create requisition +- + !context + uid: 'res_users_purchase_requisition_user' - In order to test process of the purchase requisition ,I create requisition - From 56cb7db019b771014a0a62a5b8824abe241022b4 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Thu, 21 Feb 2013 10:59:58 +0530 Subject: [PATCH 019/110] [IMP]improve yml for account bzr revid: sgo@tinyerp.com-20130221052958-metvr090gsubdc5u --- addons/account/__openerp__.py | 1 + addons/account/security/account_security.xml | 2 +- .../account/test/account_customer_invoice.yml | 5 +++++ addons/account/test/account_invoice_state.yml | 5 +++++ addons/account/test/account_test_users.yml | 20 +++++++++++++++++++ .../test/account_validate_account_move.yml | 5 +++++ 6 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 addons/account/test/account_test_users.yml diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index 43aaa2f58c1..d72711424f2 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -146,6 +146,7 @@ for a particular financial year and for preparation of vouchers there is a modul 'account_unit_test.xml', ], 'test': [ + 'test/account_test_users.yml', 'test/account_customer_invoice.yml', 'test/account_supplier_invoice.yml', 'test/account_change_currency.yml', diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml index 9a2383de45b..c86e1cf5eb6 100644 --- a/addons/account/security/account_security.xml +++ b/addons/account/security/account_security.xml @@ -12,7 +12,7 @@ Accountant - + diff --git a/addons/account/test/account_customer_invoice.yml b/addons/account/test/account_customer_invoice.yml index b2d87e753de..866e8921220 100644 --- a/addons/account/test/account_customer_invoice.yml +++ b/addons/account/test/account_customer_invoice.yml @@ -11,6 +11,11 @@ footer: True bank: base.res_bank_1 bank_name: Reserve +- + Test with that user which have rights to make Invoicing and payment and who is accountant. +- + !context + uid: 'res_users_account_user' - I create a customer invoice - diff --git a/addons/account/test/account_invoice_state.yml b/addons/account/test/account_invoice_state.yml index 7b995150af0..34ac53e7b85 100644 --- a/addons/account/test/account_invoice_state.yml +++ b/addons/account/test/account_invoice_state.yml @@ -1,3 +1,8 @@ +- + Test with that user which have rights to make Invoicing. +- + !context + uid: 'res_users_account_user' - In order to test Confirm Draft Invoice wizard I create an invoice and confirm it with this wizard - diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml new file mode 100644 index 00000000000..55e57968f50 --- /dev/null +++ b/addons/account/test/account_test_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Accountant' +- + !record {model: res.users, id: res_users_account_user}: + company_id: base.main_company + name: Accountant + login: acc + password: acc + groups_id: + - account.group_account_user +- + Create a user as 'Financial Manager' +- + !record {model: res.users, id: res_users_account_manager}: + company_id: base.main_company + name: Financial Manager + login: fm + password: fm + groups_id: + - account.group_account_manager \ No newline at end of file diff --git a/addons/account/test/account_validate_account_move.yml b/addons/account/test/account_validate_account_move.yml index d47ee564019..a99ae3b4d43 100644 --- a/addons/account/test/account_validate_account_move.yml +++ b/addons/account/test/account_validate_account_move.yml @@ -1,3 +1,8 @@ +- + Test validate account move with user who is accountant which have its rights.' +- + !context + uid: 'res_users_account_user' - In order to test the account move lines in OpenERP, I create account move - From c7a417ea03e80da6f8895f6514d00d17362450e0 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 21 Feb 2013 11:47:37 +0530 Subject: [PATCH 020/110] [IMP] improve code bzr revid: fka@tinyerp.com-20130221061737-d7vyr9lpwnas1qay --- addons/purchase/__openerp__.py | 4 ++-- .../purchase_requisition/security/purchase_tender.xml | 1 + .../test/purchase_reqisition_users.yml | 4 ++-- .../purchase_requisition/test/purchase_requisition.yml | 10 +++++----- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index 3f3acdf9f0f..b75c84e332b 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -67,8 +67,6 @@ Dashboard / Reports for Purchase Management will include: 'res_config_view.xml', ], 'test': [ - 'test/ui/purchase_users.yml', - 'purchase_order_demo.yml', 'test/process/cancel_order.yml', 'test/process/rfq2order2done.yml', 'test/process/generate_invoice_from_reception.yml', @@ -81,6 +79,8 @@ Dashboard / Reports for Purchase Management will include: 'test/ui/delete_order.yml', ], 'demo': [ + 'test/ui/purchase_users.yml', + 'purchase_order_demo.yml', 'purchase_demo.xml', ], 'installable': True, diff --git a/addons/purchase_requisition/security/purchase_tender.xml b/addons/purchase_requisition/security/purchase_tender.xml index e60665e202b..f365643a8fe 100644 --- a/addons/purchase_requisition/security/purchase_tender.xml +++ b/addons/purchase_requisition/security/purchase_tender.xml @@ -10,6 +10,7 @@ User + diff --git a/addons/purchase_requisition/test/purchase_reqisition_users.yml b/addons/purchase_requisition/test/purchase_reqisition_users.yml index aa07e8a53f1..abf62286998 100644 --- a/addons/purchase_requisition/test/purchase_reqisition_users.yml +++ b/addons/purchase_requisition/test/purchase_reqisition_users.yml @@ -7,7 +7,7 @@ login: prm password: prm groups_id: - - purchase_reqisition.group_purchase_requisition_manager + - purchase_requisition.group_purchase_requisition_manager - Create a user as 'Purchase Reqisition User' - @@ -17,4 +17,4 @@ login: pru password: pru groups_id: - - purchase_reqisition.group_purchase_requisition_user \ No newline at end of file + - purchase_requisition.group_purchase_requisition_user \ No newline at end of file diff --git a/addons/purchase_requisition/test/purchase_requisition.yml b/addons/purchase_requisition/test/purchase_requisition.yml index 5477f46e18b..648425829cb 100644 --- a/addons/purchase_requisition/test/purchase_requisition.yml +++ b/addons/purchase_requisition/test/purchase_requisition.yml @@ -1,8 +1,3 @@ -- - Give access rights of Purchase Requisition User -- - !context - uid: 'res_users_purchase_requisition_user' - I create the procurement order and run that procurement. - @@ -35,6 +30,11 @@ assert line.product_id.id == procurement.product_id.id, "Product is not correspond." assert line.product_uom_id.id == procurement.product_uom.id, "UOM is not correspond." assert line.product_qty == procurement.product_qty, "Quantity is not correspond." +- + Give access rights of Purchase Requisition User to open requisition +- + !context + uid: 'res_users_purchase_requisition_user' - I open another requisition. - From 12701f01a66944f37d21616ad24ffbcbb48455f6 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Thu, 21 Feb 2013 12:19:44 +0530 Subject: [PATCH 021/110] [IMP]add manager in supplier invoice yml bzr revid: sgo@tinyerp.com-20130221064944-zhgumhtnum6z21jz --- addons/account/test/account_supplier_invoice.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/account/test/account_supplier_invoice.yml b/addons/account/test/account_supplier_invoice.yml index 02c3d367050..e1528abd980 100644 --- a/addons/account/test/account_supplier_invoice.yml +++ b/addons/account/test/account_supplier_invoice.yml @@ -1,3 +1,8 @@ +- + Test with that Finance manager who can only create supplier invoice. +- + !context + uid: 'res_users_account_manager' - In order to test account invoice I create a new supplier invoice - From 794926267e07eb14e73ce3b9845e61e0910cd6d1 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 21 Feb 2013 12:31:28 +0530 Subject: [PATCH 022/110] [IMP] add hr_users.yml in hr bzr revid: fka@tinyerp.com-20130221070128-bycahqtp3sqjm06d --- addons/hr/__openerp__.py | 1 + addons/hr/test/hr_demo.yml | 5 ++++ addons/hr/test/hr_users.yml | 30 +++++++++++++++++++++++ addons/hr/test/open2recruit2close_job.yml | 5 ++++ 4 files changed, 41 insertions(+) create mode 100644 addons/hr/test/hr_users.yml diff --git a/addons/hr/__openerp__.py b/addons/hr/__openerp__.py index b4b8e982845..001933ad2bf 100644 --- a/addons/hr/__openerp__.py +++ b/addons/hr/__openerp__.py @@ -62,6 +62,7 @@ You can manage: ], 'demo': ['hr_demo.xml'], 'test': [ + 'test/hr_users.yml', 'test/open2recruit2close_job.yml', 'test/hr_demo.yml', ], diff --git a/addons/hr/test/hr_demo.yml b/addons/hr/test/hr_demo.yml index 7c184a25c52..c9de2e4ff21 100644 --- a/addons/hr/test/hr_demo.yml +++ b/addons/hr/test/hr_demo.yml @@ -1,3 +1,8 @@ +- + give the access rights of Hr Officer to create employee. +- + !context + uid: 'res_users_hr_officer' - !record {model: hr.job, id: job_developer, view: False}: no_of_employee: 0.0 diff --git a/addons/hr/test/hr_users.yml b/addons/hr/test/hr_users.yml new file mode 100644 index 00000000000..3415b20efbd --- /dev/null +++ b/addons/hr/test/hr_users.yml @@ -0,0 +1,30 @@ +- + Create a user as 'HR Manager' +- + !record {model: res.users, id: res_users_hr_manager}: + company_id: base.main_company + name: HR manager + login: hrm + password: hrm + groups_id: + - base.group_hr_manager +- + Create a user as 'HR Officer' +- + !record {model: res.users, id: res_users_hr_officer}: + company_id: base.main_company + name: HR Officer + login: hro + password: hro + groups_id: + - base.group_hr_user +- + Create a user as 'Employee' +- + !record {model: res.users, id: res_users_employee}: + company_id: base.main_company + name: Employee + login: emp + password: emp + groups_id: + - base.group_user \ No newline at end of file diff --git a/addons/hr/test/open2recruit2close_job.yml b/addons/hr/test/open2recruit2close_job.yml index 5a01b55439b..66fdfa393c8 100644 --- a/addons/hr/test/open2recruit2close_job.yml +++ b/addons/hr/test/open2recruit2close_job.yml @@ -1,3 +1,8 @@ +- + give the access rights of Hr Officer to the user to test the process of Human Resource Management. +- + !context + uid: 'res_users_hr_officer' - In order to test the process of Human Resource Management, I open Job Postion for "Developer". - From d9d8abd8b0960c26a63b2cce783fbde03a5dbca6 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 21 Feb 2013 14:33:00 +0530 Subject: [PATCH 023/110] [IMP] add access rights in hr_attendance bzr revid: fka@tinyerp.com-20130221090300-is57aytddja1m4f5 --- addons/hr_attendance/test/attendance_process.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/addons/hr_attendance/test/attendance_process.yml b/addons/hr_attendance/test/attendance_process.yml index 7902bf11d9d..9f197341b55 100644 --- a/addons/hr_attendance/test/attendance_process.yml +++ b/addons/hr_attendance/test/attendance_process.yml @@ -1,3 +1,18 @@ +- + Create a user as 'HR Attendance Officer' +- + !record {model: res.users, id: res_users_attendance_officer}: + company_id: base.main_company + name: HR Officer + login: ao + password: ao + groups_id: + - base.group_hr_user +- + give the access rights of Hr Officer to test attendance process. +- + !context + uid: 'res_users_attendance_officer' - In order to test attendance process in OpenERP, I entry of SignIn of employee. - From 8d7669d0ade7ccd7e6cef7b0630bac6cb6dbf729 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 21 Feb 2013 16:09:22 +0530 Subject: [PATCH 024/110] [IMP] add access rights in hr_recruitment bzr revid: fka@tinyerp.com-20130221103922-tczeru30rer8ae6e --- .../security/hr_recruitment_security.xml | 3 +++ .../hr_recruitment/test/recruitment_process.yml | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/addons/hr_recruitment/security/hr_recruitment_security.xml b/addons/hr_recruitment/security/hr_recruitment_security.xml index 570b0f036cd..a85643b62ec 100644 --- a/addons/hr_recruitment/security/hr_recruitment_security.xml +++ b/addons/hr_recruitment/security/hr_recruitment_security.xml @@ -9,6 +9,9 @@ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml index f2d4e4736fa..0359f253dd9 100644 --- a/addons/hr_recruitment/test/recruitment_process.yml +++ b/addons/hr_recruitment/test/recruitment_process.yml @@ -1,5 +1,18 @@ - - In Order to test process of Recruitment, + Create a user as 'HR Recruitment Officer' +- + !record {model: res.users, id: res_users_hr_officer}: + company_id: base.main_company + name: HR Officer + login: hrro + password: hrro + groups_id: + - base.group_hr_user +- + In Order to test process of Recruitment so giving HR officer's rights, +- + !context + uid: 'res_users_hr_officer' - An applicant is interested in the job position. So he sends a resume by email. - From fa94d5e112bb7dcce1d53fb80f6af3a25838e5d3 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Thu, 21 Feb 2013 16:47:28 +0530 Subject: [PATCH 025/110] [IMP]improve yml for account_voucher bzr revid: sgo@tinyerp.com-20130221111728-jlvv0lf5w258ujbz --- addons/account_voucher/__openerp__.py | 1 + .../account_voucher/test/account_voucher.yml | 6 ++++++ .../test/account_voucher_users.yml | 20 +++++++++++++++++++ addons/account_voucher/test/case_eur_usd.yml | 5 +++++ addons/account_voucher/test/sales_payment.yml | 5 +++++ addons/account_voucher/test/sales_receipt.yml | 5 +++++ 6 files changed, 42 insertions(+) create mode 100644 addons/account_voucher/test/account_voucher_users.yml diff --git a/addons/account_voucher/__openerp__.py b/addons/account_voucher/__openerp__.py index 345c3378aa0..a6cbc9a3e40 100644 --- a/addons/account_voucher/__openerp__.py +++ b/addons/account_voucher/__openerp__.py @@ -61,6 +61,7 @@ This module manages: 'account_voucher_data.xml', ], 'test' : [ + 'test/account_voucher_users.yml', 'test/case5_suppl_usd_usd.yml', 'test/account_voucher.yml', 'test/sales_receipt.yml', diff --git a/addons/account_voucher/test/account_voucher.yml b/addons/account_voucher/test/account_voucher.yml index c9270dc695c..e2df6b8597f 100644 --- a/addons/account_voucher/test/account_voucher.yml +++ b/addons/account_voucher/test/account_voucher.yml @@ -1,3 +1,9 @@ +- + I check the voucher module with user who is accountant. +- + !context + uid: 'res_users_account_voucher_user' + - In order to check account voucher module in OpenERP I create a customer voucher - diff --git a/addons/account_voucher/test/account_voucher_users.yml b/addons/account_voucher/test/account_voucher_users.yml new file mode 100644 index 00000000000..e8a4fa3e612 --- /dev/null +++ b/addons/account_voucher/test/account_voucher_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Accountant for voucher' +- + !record {model: res.users, id: res_users_account_voucher_user}: + company_id: base.main_company + name: Voucher Accountant + login: vacc + password: acc + groups_id: + - account.group_account_user +- + Create a user as 'Financial Manager for account voucher' +- + !record {model: res.users, id: res_users_account_voucher_manager}: + company_id: base.main_company + name: Financial Manager for voucher + login: fmv + password: fmv + groups_id: + - account.group_account_manager \ No newline at end of file diff --git a/addons/account_voucher/test/case_eur_usd.yml b/addons/account_voucher/test/case_eur_usd.yml index 94f0c718980..23a35d8ad24 100644 --- a/addons/account_voucher/test/case_eur_usd.yml +++ b/addons/account_voucher/test/case_eur_usd.yml @@ -1,4 +1,9 @@ ##YAML test on the account_voucher as depicted in this bug report: https://bugs.launchpad.net/openobject-addons/+bug/954155 +- + Only manager can create and take decision about bank and currency there I checkd this test with user who is finance manager. +- + !context + uid: 'res_users_account_voucher_manager' - In order to check the payment with multi-currency in OpenERP, I create an invoice in EUR and make payment in USD based on the currency rating. diff --git a/addons/account_voucher/test/sales_payment.yml b/addons/account_voucher/test/sales_payment.yml index 37264de114a..005c5cc79c3 100644 --- a/addons/account_voucher/test/sales_payment.yml +++ b/addons/account_voucher/test/sales_payment.yml @@ -1,3 +1,8 @@ +- + I test sales payment with user who is accountant. +- + !context + uid: 'res_users_account_voucher_user' - Create an invoice for the partner Seagate with amount 450.0 - diff --git a/addons/account_voucher/test/sales_receipt.yml b/addons/account_voucher/test/sales_receipt.yml index dc5602753fd..c637cfd8835 100644 --- a/addons/account_voucher/test/sales_receipt.yml +++ b/addons/account_voucher/test/sales_receipt.yml @@ -1,3 +1,8 @@ +- + Accountant can also be created receipt and validate it there for I checked it with that user who is accountant. +- + !context + uid: 'res_users_account_voucher_user' - Creating a Voucher Receipt for partner Seagate with amount 30000.0 - From edc4077c54ba215228036a4316706e07a094b5df Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 22 Feb 2013 12:57:57 +0530 Subject: [PATCH 026/110] [IMP] remove access rights in mail,crm,event bzr revid: fka@tinyerp.com-20130222072757-0fain23pzyb8dzk9 --- addons/crm/security/crm_security.xml | 1 + addons/crm/security/ir.model.access.csv | 2 -- addons/event/security/event_security.xml | 1 + addons/event/security/ir.model.access.csv | 2 -- addons/mail/security/ir.model.access.csv | 6 +++--- 5 files changed, 5 insertions(+), 7 deletions(-) diff --git a/addons/crm/security/crm_security.xml b/addons/crm/security/crm_security.xml index 2c34252209c..97bc220cf04 100644 --- a/addons/crm/security/crm_security.xml +++ b/addons/crm/security/crm_security.xml @@ -5,6 +5,7 @@ User: Own Leads Only + the user will have access to his own data in the sales application. diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index cd460cf35d9..74394d3c5ce 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -29,8 +29,6 @@ access_calendar_attendee_crm_manager,calendar.attendee.crm.manager,model_calenda access_res_partner,res.partner.crm.user,base.model_res_partner,base.group_sale_salesman,1,1,1,0 access_res_partner_category,res.partner.category.crm.user,base.model_res_partner_category,base.group_sale_salesman,1,1,1,0 mail_mailgate_thread,mail.thread,mail.model_mail_thread,base.group_sale_salesman,1,1,1,1 -access_mail_message,mail.message,mail.model_mail_message,base.group_sale_salesman,1,1,1,0 -mail_mail_message,mail.message,mail.model_mail_message,base.group_sale_manager,1,1,1,1 access_crm_case_categ_manager,crm.case.categ manager,model_crm_case_categ,base.group_sale_manager,1,1,1,1 access_base_action_rule_manager,base.action.rule manager,base_action_rule.model_base_action_rule,base.group_sale_manager,1,1,1,1 access_crm_lead_report_user,crm.lead.report user,model_crm_lead_report,base.group_sale_salesman,1,1,1,1 diff --git a/addons/event/security/event_security.xml b/addons/event/security/event_security.xml index 83039ca4686..470365dd5f0 100644 --- a/addons/event/security/event_security.xml +++ b/addons/event/security/event_security.xml @@ -10,6 +10,7 @@ User + diff --git a/addons/event/security/ir.model.access.csv b/addons/event/security/ir.model.access.csv index 0801b8306f0..b6cdc4c4ec6 100644 --- a/addons/event/security/ir.model.access.csv +++ b/addons/event/security/ir.model.access.csv @@ -6,5 +6,3 @@ access_event_registration,event.registration,model_event_registration,event.grou access_report_event_registration,report.event.registration,model_report_event_registration,event.group_event_user,1,1,1,1 access_event_event_portal,event.event,model_event_event,,1,0,0,0 access_event_registration_portal,event.registration,model_event_registration,,1,0,0,0 -access_event_partner,res.partner,model_res_partner,event.group_event_user,1,1,1,0 -access_mail_message,mail.message,mail.model_mail_message,event.group_event_user,1,1,1,0 diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index 81b2356938b..1141a3f928d 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -1,18 +1,18 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_mail_message_all,mail.message.all,model_mail_message,,1,0,0,0 access_mail_message_user,mail.message.user,model_mail_message,base.group_user,1,1,1,1 -access_mail_mail_all,mail.mail.all,model_mail_mail,,1,0,1,0 +access_mail_mail_all,mail.mail.all,model_mail_mail,,1,0,0,0 access_mail_mail_user,mail.mail.user,model_mail_mail,base.group_user,1,1,1,0 access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1,1 access_mail_followers_all,mail.followers.all,model_mail_followers,,1,0,0,0 access_mail_followers_user,mail.followers.user,model_mail_followers,base.group_user,1,1,0,0 access_mail_followers_system,mail.followers.system,model_mail_followers,base.group_system,1,1,1,1 -access_mail_notification_all,mail.notification.all,model_mail_notification,,1,0,1,0 +access_mail_notification_all,mail.notification.all,model_mail_notification,,1,0,0,0 access_mail_notification_user,mail.notification.user,model_mail_notification,base.group_user,1,1,1,0 access_mail_notification_system,mail.notification.system,model_mail_notification,base.group_system,1,1,1,1 access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0 access_mail_group_user,mail.group.user,model_mail_group,base.group_user,1,1,1,1 -access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,1,0 +access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0 access_mail_alias_user,mail.alias.user,model_mail_alias,base.group_user,1,1,1,0 access_mail_alias_system,mail.alias.system,model_mail_alias,base.group_system,1,1,1,1 access_mail_message_subtype_all,mail.message.subtype.all,model_mail_message_subtype,,1,0,0,0 From bf814eb41456d692cb166581dcbda13980ecadd6 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 22 Feb 2013 15:03:15 +0530 Subject: [PATCH 027/110] [IMP] improve yml string bzr revid: fka@tinyerp.com-20130222093315-efl5r3wjwn7wu2nd --- addons/crm/test/process/cancel_lead.yml | 2 +- addons/crm/test/process/communication_with_customer.yml | 2 +- addons/crm/test/process/lead2opportunity2win.yml | 2 +- addons/crm/test/process/lead2opportunity_assign_salesmen.yml | 2 +- addons/crm/test/process/phonecalls.yml | 2 +- addons/crm/test/ui/delete_lead.yml | 2 +- addons/event/test/process/event_draft2done.yml | 2 +- addons/hr/test/hr_demo.yml | 2 +- addons/hr/test/open2recruit2close_job.yml | 2 +- addons/hr_attendance/test/attendance_process.yml | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/crm/test/process/cancel_lead.yml b/addons/crm/test/process/cancel_lead.yml index ae2b6294c68..bbd17dc2bb0 100644 --- a/addons/crm/test/process/cancel_lead.yml +++ b/addons/crm/test/process/cancel_lead.yml @@ -1,5 +1,5 @@ - - Salesman cancel unqualified lead. + Salesman can also cancelled unqualified lead and re-open lead so giving access rights of salesman. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/process/communication_with_customer.yml b/addons/crm/test/process/communication_with_customer.yml index 4a36aeebd02..8cce69dada9 100644 --- a/addons/crm/test/process/communication_with_customer.yml +++ b/addons/crm/test/process/communication_with_customer.yml @@ -1,5 +1,5 @@ - - Salesman communication with customer. + Give the access rights of Salesman to communicat with customer. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml index c69eb09ac31..1e42fba0e9c 100644 --- a/addons/crm/test/process/lead2opportunity2win.yml +++ b/addons/crm/test/process/lead2opportunity2win.yml @@ -1,5 +1,5 @@ - - Salesman convert the lead into opportunity. + Giving access rights of salesman to convert the lead into opportunity. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml b/addons/crm/test/process/lead2opportunity_assign_salesmen.yml index 9583c6034bf..5a750c94b72 100644 --- a/addons/crm/test/process/lead2opportunity_assign_salesmen.yml +++ b/addons/crm/test/process/lead2opportunity_assign_salesmen.yml @@ -21,7 +21,7 @@ login: 'tud' new_password: 'tud' - - Salesman creates lead. + Salesman also creates lead so giving access rights of salesman. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/process/phonecalls.yml b/addons/crm/test/process/phonecalls.yml index 63df8ac89c2..e92ae999a87 100644 --- a/addons/crm/test/process/phonecalls.yml +++ b/addons/crm/test/process/phonecalls.yml @@ -1,5 +1,5 @@ - - Salesman check the phone calls data. + Salesman check the phone calls data so test with the access rights of salesman. - !context uid: 'crm_res_users_salesman' diff --git a/addons/crm/test/ui/delete_lead.yml b/addons/crm/test/ui/delete_lead.yml index 10d2de82e7e..be545e53773 100644 --- a/addons/crm/test/ui/delete_lead.yml +++ b/addons/crm/test/ui/delete_lead.yml @@ -1,5 +1,5 @@ - - Sales manager Unlink the Lead. + Only Sales manager Unlink the Lead so test with Manager's access rights'. - !context uid: 'crm_res_users_salesmanager' diff --git a/addons/event/test/process/event_draft2done.yml b/addons/event/test/process/event_draft2done.yml index e485cb5af6c..2ad762682e5 100644 --- a/addons/event/test/process/event_draft2done.yml +++ b/addons/event/test/process/event_draft2done.yml @@ -1,5 +1,5 @@ - - give the access rights of Event user to organize an event and also do registration. + Give the access rights of Event user to organize an event and also do registration. - !context uid: 'res_users_eventuser' diff --git a/addons/hr/test/hr_demo.yml b/addons/hr/test/hr_demo.yml index c9de2e4ff21..db0d0037c4a 100644 --- a/addons/hr/test/hr_demo.yml +++ b/addons/hr/test/hr_demo.yml @@ -1,5 +1,5 @@ - - give the access rights of Hr Officer to create employee. + Give the access rights of Hr Officer to create employee. - !context uid: 'res_users_hr_officer' diff --git a/addons/hr/test/open2recruit2close_job.yml b/addons/hr/test/open2recruit2close_job.yml index 66fdfa393c8..5519635d2fc 100644 --- a/addons/hr/test/open2recruit2close_job.yml +++ b/addons/hr/test/open2recruit2close_job.yml @@ -1,5 +1,5 @@ - - give the access rights of Hr Officer to the user to test the process of Human Resource Management. + Give the access rights of Hr Officer to the user to test the process of Human Resource Management. - !context uid: 'res_users_hr_officer' diff --git a/addons/hr_attendance/test/attendance_process.yml b/addons/hr_attendance/test/attendance_process.yml index 9f197341b55..8348757b63e 100644 --- a/addons/hr_attendance/test/attendance_process.yml +++ b/addons/hr_attendance/test/attendance_process.yml @@ -9,7 +9,7 @@ groups_id: - base.group_hr_user - - give the access rights of Hr Officer to test attendance process. + Give the access rights of Hr Officer to test attendance process. - !context uid: 'res_users_attendance_officer' From ca1bf8f8f71a9b88af89c8903199e9f4bd1356d1 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 22 Feb 2013 18:59:40 +0530 Subject: [PATCH 028/110] [IMP] add access rights of ir_property in crm bzr revid: fka@tinyerp.com-20130222132940-2r0kuv66ul3k3pdu --- addons/crm/security/ir.model.access.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 74394d3c5ce..3aada0d10be 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -37,3 +37,4 @@ access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.gro access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1 access_crm_payment_mode_user,crm.payment.mode,model_crm_payment_mode,base.group_sale_salesman,1,0,0,0 access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1 +access_ir_property_salesman,ir_property_salesman,base.model_ir_property,base.group_sale_salesman,1,1,1,0 From ffc81649c6c1948ac2f812cbe3b5c9175b160cd2 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 26 Feb 2013 15:20:17 +0530 Subject: [PATCH 029/110] [IMP]improve code bzr revid: sgo@tinyerp.com-20130226095017-f7bbnnqngszfq95r --- addons/account/security/account_security.xml | 2 +- addons/account/security/ir.model.access.csv | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml index c86e1cf5eb6..9a2383de45b 100644 --- a/addons/account/security/account_security.xml +++ b/addons/account/security/account_security.xml @@ -12,7 +12,7 @@ Accountant - + diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index d1f0bbab6b5..d164b8026ce 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -71,6 +71,7 @@ access_report_account_type_sales,report.account_type.sales,model_report_account_ access_report_account_sales,report.account.sales,model_report_account_sales,account.group_account_manager,1,1,1,1 access_account_invoice_report,account.invoice.report,model_account_invoice_report,account.group_account_manager,1,1,1,1 access_res_partner_group_account_manager,res_partner group_account_manager,model_res_partner,account.group_account_manager,1,0,0,0 +access_res_partner_group_account_user,res_partner group_account_user,model_res_partner,account.group_account_user,1,1,1,0 access_account_invoice_accountant,account.invoice accountant,model_account_invoice,account.group_account_user,1,0,0,0 access_account_tax_code_accountant,account.tax.code accountant,model_account_tax_code,account.group_account_user,1,1,1,1 access_account_move_line_manager,account.move.line manager,model_account_move_line,account.group_account_manager,1,0,0,0 From 345845415d0e3a507cac078c4c5b887d7ab19213 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 28 Feb 2013 10:30:26 +0530 Subject: [PATCH 030/110] [IMP] change all data of stock yml bzr revid: fka@tinyerp.com-20130228050026-5yaf2ftrps77jlff --- addons/stock/__openerp__.py | 8 +- addons/stock/product.py | 5 +- addons/stock/stock.py | 1 - addons/stock/stock_demo.yml | 118 ++++++++++++++-------------- addons/stock/test/opening_stock.yml | 62 +++++++-------- addons/stock/test/shipment.yml | 103 ++++++++++++------------ 6 files changed, 146 insertions(+), 151 deletions(-) diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py index b3d7e30f1ce..e1c96ba0c25 100644 --- a/addons/stock/__openerp__.py +++ b/addons/stock/__openerp__.py @@ -59,7 +59,6 @@ Dashboard / Reports for Warehouse Management will include: 'sequence': 16, 'demo': [ 'stock_demo.xml', -# 'stock_demo.yml', ], 'data': [ 'security/stock_security.xml', @@ -91,9 +90,10 @@ Dashboard / Reports for Warehouse Management will include: 'res_config_view.xml', ], 'test': [ -# 'test/opening_stock.yml', -# 'test/shipment.yml', -# 'test/stock_report.yml', + 'stock_demo.yml', + 'test/opening_stock.yml', + 'test/shipment.yml', + #'test/stock_report.yml', ], 'installable': True, 'application': True, diff --git a/addons/stock/product.py b/addons/stock/product.py index 1d56ce64988..b00f8615667 100644 --- a/addons/stock/product.py +++ b/addons/stock/product.py @@ -55,15 +55,14 @@ class product_product(osv.osv): if context is None: context = {} product_obj = self.pool.get('product.product').browse(cr, uid, product_id, context=context) - stock_input_acc = product_obj.property_stock_account_input and product_obj.property_stock_account_input.id or False if not stock_input_acc: stock_input_acc = product_obj.categ_id.property_stock_account_input_categ and product_obj.categ_id.property_stock_account_input_categ.id or False - + stock_output_acc = product_obj.property_stock_account_output and product_obj.property_stock_account_output.id or False if not stock_output_acc: stock_output_acc = product_obj.categ_id.property_stock_account_output_categ and product_obj.categ_id.property_stock_account_output_categ.id or False - + journal_id = product_obj.categ_id.property_stock_journal and product_obj.categ_id.property_stock_journal.id or False account_valuation = product_obj.categ_id.property_stock_valuation_account_id and product_obj.categ_id.property_stock_valuation_account_id.id or False return { diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 8e4611dc5d0..ed2b36bd1f5 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -2233,7 +2233,6 @@ class stock_move(osv.osv): acc_valuation = accounts.get('property_stock_valuation_account_id', False) journal_id = accounts['stock_journal'] - if acc_dest == acc_valuation: raise osv.except_osv(_('Error!'), _('Cannot create Journal Entry, Output Account of this product and Valuation account on category of this product are same.')) diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml index 99565f0c08c..8e9ea4977b8 100644 --- a/addons/stock/stock_demo.yml +++ b/addons/stock/stock_demo.yml @@ -1,99 +1,97 @@ - - !record {model: stock.location, id: location_refrigerator}: - name: Refrigerator + !record {model: stock.location, id: location_monitor}: + name: chicago shop usage: internal - - !record {model: stock.location, id: location_delivery_counter}: - name: Delivery Counter + !record {model: stock.location, id: stock_location_output}: + name: Output usage: internal - - !record {model: stock.location, id: location_refrigerator_small}: - name: Small Refrigerator + !record {model: stock.location, id: location_monitor_small}: + name: Small chicago shop usage: internal - location_id: location_refrigerator + location_id: location_monitor - !record {model: stock.location, id: location_opening}: name: opening usage: inventory - - !record {model: stock.location, id: location_convenience_shop}: - name: Convenient Store + !record {model: stock.location, id: stock_location_3}: + name: IT Suppliers usage: supplier - - !record {model: stock.warehouse, id: warehouse_icecream}: - name: Ice Cream Shop - lot_input_id: location_refrigerator - lot_stock_id: location_refrigerator - lot_output_id: location_delivery_counter + !record {model: stock.warehouse, id: stock_warehouse_shop0}: + name: Chicago Warehouse + lot_input_id: location_monitor + lot_stock_id: location_monitor + lot_output_id: stock_location_output - - !record {model: product.product, id: product_icecream}: - default_code: 001 - name: Ice Cream - type: product - categ_id: product.product_category_1 - list_price: 100.0 - standard_price: 70.0 - uom_id: product.product_uom_kgm - uom_po_id: product.product_uom_kgm - procure_method: make_to_stock + !record {model: product.product, id: product_product_6}: + default_code: LCD15 + name: 15” LCD Monitor + type: consu + categ_id: product.product_category_8 + list_price: 1200.0 + standard_price: 800.0 + uom_id: product.product_uom_unit + uom_po_id: product.product_uom_unit property_stock_inventory: location_opening valuation: real_time cost_method: average - property_stock_account_input: account.o_expense - property_stock_account_output: account.o_income - description: Ice cream can be mass-produced and thus is widely available in developed parts of the world. Ice cream can be purchased in large cartons (vats and squrounds) from supermarkets and grocery stores, in smaller quantities from ice cream shops, convenience stores, and milk bars, and in individual servings from small carts or vans at public events. - + property_stock_account_input: account.conf_o_expense + property_stock_account_output: account.conf_o_income - - !record {model: stock.production.lot, id: lot_icecream_0}: - name: Lot0 for Ice cream - product_id: product_icecream + !record {model: stock.production.lot, id: lot_monitor_0}: + name: Lot0 for LCD Monitor + product_id: product_product_6 - - !record {model: stock.production.lot, id: lot_icecream_1}: - name: Lot1 for Ice cream - product_id: product_icecream + !record {model: stock.production.lot, id: lot_monitor_1}: + name: Lot1 for LCD Monitor + product_id: product_product_6 - - !record {model: stock.inventory, id: stock_inventory_icecream}: - name: Inventory for icecream + !record {model: stock.inventory, id: stock_inventory_0}: + name: Starting Inventory + state: draft - - !record {model: stock.inventory.line, id: stock_inventory_line_icecream_lot0}: - product_id: product_icecream - product_uom: product.product_uom_kgm - inventory_id: stock_inventory_icecream + !record {model: stock.inventory.line, id: stock_inventory_line_3}: + product_id: product_product_6 + product_uom: product.product_uom_unit + inventory_id: stock_inventory_0 product_qty: 50.0 - prod_lot_id: lot_icecream_0 - location_id: location_refrigerator + prod_lot_id: lot_monitor_0 + location_id: location_monitor - - !record {model: stock.inventory.line, id: stock_inventory_line_icecream_lot1}: - product_id: product_icecream - product_uom: product.product_uom_kgm - inventory_id: stock_inventory_icecream + !record {model: stock.inventory.line, id: stock_inventory_line_monitor}: + product_id: product_product_6 + product_uom: product.product_uom_unit + inventory_id: stock_inventory_0 product_qty: 40.0 - prod_lot_id: lot_icecream_1 - location_id: location_refrigerator + prod_lot_id: lot_monitor_1 + location_id: location_monitor - !record {model: stock.picking, id: outgoing_shipment}: type: out - location_dest_id: location_delivery_counter + location_dest_id: stock_location_output - - !record {model: stock.move, id: outgoing_shipment_icecream}: + !record {model: stock.move, id: outgoing_shipment_monitor}: picking_id: outgoing_shipment - product_id: product_icecream - product_uom: product.product_uom_kgm + product_id: product_product_6 + product_uom: product.product_uom_unit product_qty: 130.0 - location_id: location_refrigerator - location_dest_id: location_delivery_counter + location_id: location_monitor + location_dest_id: stock_location_output - !record {model: stock.picking, id: incomming_shipment}: type: in invoice_state: 2binvoiced partner_id: base.res_partner_address_9 - location_dest_id: location_refrigerator + location_dest_id: location_monitor - - !record {model: stock.move, id: incomming_shipment_icecream}: + !record {model: stock.move, id: incomming_shipment_monitor}: picking_id: incomming_shipment - product_id: product_icecream - product_uom: product.product_uom_kgm + product_id: product_product_6 + product_uom: product.product_uom_unit product_qty: 50.0 - location_id: location_convenience_shop - location_dest_id: location_refrigerator + location_id: stock_location_3 + location_dest_id: location_monitor diff --git a/addons/stock/test/opening_stock.yml b/addons/stock/test/opening_stock.yml index 2e3eaeadc74..41b906e560c 100644 --- a/addons/stock/test/opening_stock.yml +++ b/addons/stock/test/opening_stock.yml @@ -1,42 +1,42 @@ - - I update the price of the Ice-cream. + I update the price of the 15” LCD Monitor. - !python {model: stock.change.standard.price}: | - context.update({'active_model':'product.product', 'active_id': ref('product_icecream'), 'active_ids':[ref('product_icecream')]}) + context.update({'active_model':'product.product', 'active_id': ref('product_product_6'), 'active_ids':[ref('product_product_6')]}) - !record {model: stock.change.standard.price, id: change_price}: - new_price: 120 + new_price: 1500 - !python {model: stock.change.standard.price}: | self.change_price(cr, uid, [ref('change_price')], context=context) - - I check price of Ice-cream after update price. + I check price of 15” LCD Monitor after update price. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) - assert product.standard_price == 120, "Price is not updated." + product = self.browse(cr, uid, ref('product_product_6'), context=context) + assert product.standard_price == 1500, "Price is not updated." - - I update the current stock of the Ice-cream with 10 kgm in Small Refrigerator in lot0. + I update the current stock of the 15” LCD Monitor with 10 unit in stock location shop1 in lot0. - !record {model: stock.change.product.qty, id: change_qty}: - location_id: location_refrigerator_small + location_id: location_monitor_small new_quantity: 10 - product_id: product_icecream - prodlot_id: lot_icecream_1 + product_id: product_product_6 + prodlot_id: lot_monitor_1 - !python {model: stock.change.product.qty}: | self.change_product_qty(cr, uid, [ref('change_qty')], context=context) - - I check available stock of Ice-cream after update stock. + I check available stock of 15” LCD Monitor after update stock. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) + product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 10, "Stock is not updated." - I merge inventory. - !python {model: stock.inventory.merge }: | - context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_icecream'), 'active_ids': [ref('stock_inventory_icecream')]}) + context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_0'), 'active_ids': [ref('stock_inventory_0')]}) - !record {model: stock.inventory.merge, id: merge_inventory}: - @@ -46,22 +46,22 @@ I cancel inventory. - !python {model: stock.inventory}: | - self.action_cancel_inventory(cr, uid, [ref('stock_inventory_icecream')]) + self.action_cancel_inventory(cr, uid, [ref('stock_inventory_0')]) - I reset to draft inventory. - !python {model: stock.inventory}: | - self.action_cancel_draft(cr, uid, [ref('stock_inventory_icecream')]) + self.action_cancel_draft(cr, uid, [ref('stock_inventory_0')]) - - I confirm physical inventory of Ice-cream which are came in different lots. + I confirm physical inventory of 15” LCD Monitor which are came in different lots. - !python {model: stock.inventory}: | - self.action_confirm(cr, uid, [ref('stock_inventory_icecream')], context=context) + self.action_confirm(cr, uid, [ref('stock_inventory_0')], context=context) - I check move details after confirmed physical inventory. - !python {model: stock.inventory}: | - inventory = self.browse(cr, uid, ref('stock_inventory_icecream'), context=context) + inventory = self.browse(cr, uid, ref('stock_inventory_0'), context=context) assert len(inventory.move_ids) == len(inventory.inventory_line_id), "moves are not correspond." for move_line in inventory.move_ids: for line in inventory.inventory_line_id: @@ -77,15 +77,15 @@ I split inventory line. - !python {model: stock.inventory.line.split}: | - context.update({'active_model': 'stock.inventory.line', 'active_id': ref('stock_inventory_line_icecream_lot0'), 'active_ids': [ref('stock_inventory_line_icecream_lot0')]}) + context.update({'active_model': 'stock.inventory.line', 'active_id': ref('stock_inventory_line_3'), 'active_ids': [ref('stock_inventory_line_3')]}) - !record {model: stock.inventory.line.split, id: split_inventory_lot0}: use_exist: True line_exist_ids: - quantity: 6 - prodlot_id: lot_icecream_0 + prodlot_id: lot_monitor_0 - quantity: 4 - prodlot_id: lot_icecream_0 + prodlot_id: lot_monitor_0 - !python {model: stock.inventory.line.split }: | self.split_lot(cr, uid, [ref('split_inventory_lot0')], context=context) @@ -93,39 +93,39 @@ I fill inventory line. - !python {model: stock.fill.inventory}: | - context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_icecream'), 'active_ids': [ref('stock_inventory_icecream')]}) + context.update({'active_model': 'stock.inventory', 'active_id': ref('stock_inventory_0'), 'active_ids': [ref('stock_inventory_0')]}) - !record {model: stock.fill.inventory, id: fill_inventory}: - location_id: location_refrigerator + location_id: location_monitor recursive: True - !python {model: stock.fill.inventory }: | self.fill_inventory(cr, uid, [ref('fill_inventory')], context=context) - - Now I check vitual stock of Ice-cream after confirmed physical inventory. + Now I check vitual stock of 15” LCD Monitor after confirmed physical inventory. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) + product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.virtual_available == 100, "Vitual stock is not updated." - - I close physical inventory of Ice-cream. + I close physical inventory of 15” LCD Monitor. - !python {model: stock.inventory}: | - self.action_done(cr, uid, [ref('stock_inventory_icecream')], context=context) + self.action_done(cr, uid, [ref('stock_inventory_0')], context=context) - - I check closed move and real stock of Ice-cream after closed physical inventory. + I check closed move and real stock of 15” LCD Monitor after closed physical inventory. - !python {model: stock.inventory}: | - inventory = self.browse(cr, uid, ref('stock_inventory_icecream'), context=context) + inventory = self.browse(cr, uid, ref('stock_inventory_0'), context=context) assert inventory.state == 'done', "inventory is not closed." for move_line in inventory.move_ids: assert move_line.state == 'done', "Move is not closed." - product = self.pool.get('product.product').browse(cr, uid, ref('product_icecream'), context=context) + product = self.pool.get('product.product').browse(cr, uid, ref('product_product_6'), context=context) product.qty_available == 100, "Real stock is not updated." - I check stock in lot. - !python {model: stock.production.lot}: | - lot = self.browse(cr, uid, ref('lot_icecream_0'), context=context) + lot = self.browse(cr, uid, ref('lot_monitor_0'), context=context) assert lot.stock_available == 50, "Stock in lot is not correspond." diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index b30feccdacf..27d5c44d199 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -1,5 +1,5 @@ - - I confirm outgoing shipment of 130 kgm Ice-cream. + I confirm outgoing shipment of 130 unit 15” LCD Monitor. - !workflow {model: stock.picking, action: button_confirm, ref: outgoing_shipment} - @@ -12,18 +12,18 @@ assert move_line.state == "confirmed", "Move should be confirmed." - - Now I check vitual stock of Ice-cream after confirmed outgoing shipment. + Now I check vitual stock of 15” LCD Monitor after confirmed outgoing shipment. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) + product = self.browse(cr, uid, ref('product_product_6'), context=context) product.virtual_available == -30, "Vitual stock is not updated." - - I confirm incomming shipment of 50 kgm Ice-cream. + I confirm incomming shipment of 50 unit 15” LCD Monitor. - !workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment} - - I receive 40kgm Ice-cream so I make backorder of incomming shipment for 40 kgm. + I receive 40 unit 15” LCD Monitor so I make backorder of incomming shipment for 40 unit. - !python {model: stock.partial.picking}: | context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]}) @@ -31,11 +31,11 @@ !record {model: stock.partial.picking, id: partial_incomming}: move_ids: - quantity: 40 - product_id: product_icecream - product_uom: product.product_uom_kgm - move_id: incomming_shipment_icecream - location_id: location_convenience_shop - location_dest_id: location_refrigerator + product_id: product_product_6 + product_uom: product.product_uom_unit + move_id: incomming_shipment_monitor + location_id: stock_location_3 + location_dest_id: location_monitor - !python {model: stock.partial.picking }: | self.do_partial(cr, uid, [ref('partial_incomming')], context=context) @@ -51,16 +51,16 @@ assert move_line.product_qty == 40, "Qty in backorder does not correspond." assert move_line.state == 'done', "Move line of backorder should be closed." - - I receive another 10kgm Ice-cream. + I receive another 10 unit 15” LCD Monitor. - !record {model: stock.partial.picking, id: partial_incomming}: move_ids: - quantity: 10 - product_id: product_icecream - product_uom: product.product_uom_kgm - move_id: incomming_shipment_icecream - location_id: location_convenience_shop - location_dest_id: location_refrigerator + product_id: product_product_6 + product_uom: product.product_uom_unit + move_id: incomming_shipment_monitor + location_id: stock_location_3 + location_dest_id: location_monitor - !python {model: stock.partial.picking }: | self.do_partial(cr, uid, [ref('partial_incomming')], context=context) @@ -77,7 +77,7 @@ assert move_line.state == 'done', "Move line should be closed." - - I return last incomming shipment for 10 kgm Ice-cream. + I return last incomming shipment for 10 unit 15” LCD Monitor. - !record {model: stock.return.picking, id: return_incomming}: invoice_state: none @@ -115,11 +115,11 @@ I check available stock after received incomming shipping. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) + product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 140, "Stock does not correspond." assert product.virtual_available == 0, "Vitual stock does not correspond." - - I split incomming shipment into lots. each lot contain 10 kgm Ice-cream. + I split incomming shipment into lots. each lot contain 10 unit 15” LCD Monitor. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("incomming_shipment")) @@ -147,7 +147,7 @@ lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])]) assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.' - move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_refrigerator')),('prodlot_id','in',lot_ids)]) + move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)]) assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.' for move in self.browse(cr, uid, move_ids, context=context): assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond." @@ -171,39 +171,39 @@ assert account_move_line.credit == 0.0, "Credit amount does not correspond." assert account_move_line.debit == 800.0, "Debit amount does not correspond." - - I consume 1 kgm ice-cream from each incoming lots into internal production. + I consume 1 unit 15” LCD Monitor from each incoming lots into internal production. - !record {model: stock.move.consume, id: consume_lot_incomming}: product_qty: 1 - location_id: location_refrigerator + location_id: location_monitor - !python {model: stock.move.consume}: | self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context) - - I scrap 10 gm ice-cream from each incoming lots into scrap location. + I scrap 1 unit 15” LCD Monitor from each incoming lots into scrap location. - !record {model: stock.move.scrap, id: scrap_lot_incomming}: - product_qty: 0.010 + product_qty: 1 - !python {model: stock.move.scrap}: | self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context) - - I check stock in scrap location and refrigerator location. + I check stock in scrap location and stock location shop0. - !python {model: stock.location}: | - ctx = {'product_id': ref('product_icecream')} - refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_refrigerator'), context=ctx) - assert refrigerator_location.stock_real == 135.96, 'stock does not correspond in refrigerator location.' + ctx = {'product_id': ref('product_product_6')} + refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) + assert refrigerator_location.stock_real == 36.0, 'stock does not correspond in stock location shop0.' scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) - assert scrapped_location.stock_real == 0.010*4, 'scraped stock does not correspond in scrap location.' + assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.' - I check availabile stock after consumed and scraped. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) - assert product.qty_available == 135.96, "Stock does not correspond." - assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond." + product = self.browse(cr, uid, ref('product_product_6'), context=context) + assert product.qty_available == 136.0, "Stock does not correspond." + assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." - I trace all incoming lots. - @@ -212,40 +212,39 @@ lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])]) self.action_traceability(cr, uid, lot_ids, context=context) - - I check outgoing shipment after stock availablity in refrigerator. + I check outgoing shipment after stock availablity in Chicago shop. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context) - self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines]) #TOFIX: assignment of move lines should be call before testing assigment otherwise picking never gone in assign state - #TOFIX: shipment should be assigned if stock available - #assert shipment.state == "assigned", "Shipment should be assigned." - #for move_line in shipment.move_lines: - # assert move_line.state == "assigned", "Move should be assigned." + self.pool.get('stock.move').action_assign(cr, uid, [x.id for x in shipment.move_lines]) + assert shipment.state == "assigned", "Shipment should be assigned." + for move_line in shipment.move_lines: + assert move_line.state == "assigned", "Move should be assigned." self.force_assign(cr, uid, [shipment.id]) - - I deliver 5kgm Ice-cream to customer so I make partial deliver + I deliver 5 unit 15” LCD Monitor to customer so I make partial deliver - !python {model: stock.partial.move}: | - context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_icecream'), 'active_ids': [ref('outgoing_shipment_icecream')]}) + context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_monitor'), 'active_ids': [ref('outgoing_shipment_monitor')]}) - - !record {model: stock.partial.move, id: partial_outgoing_icecream}: + !record {model: stock.partial.move, id: partial_outgoing_monitor}: move_ids: - quantity: 5 - product_id: product_icecream - product_uom: product.product_uom_kgm - move_id: outgoing_shipment_icecream - location_id: location_refrigerator - location_dest_id: location_delivery_counter + product_id: product_product_6 + product_uom: product.product_uom_unit + move_id: outgoing_shipment_monitor + location_id: location_monitor + location_dest_id: stock_location_output - !python {model: stock.partial.move }: | - self.do_partial(cr, uid, [ref('partial_outgoing_icecream')], context=context) + self.do_partial(cr, uid, [ref('partial_outgoing_monitor')], context=context) - - I packing outgoing shipment into box per 10kgm with unique tracking lot. + I packing outgoing shipment into box per 10 unit with unique tracking lot. - !python {model: stock.move}: | stock_split = self.pool.get('stock.split.into') - move = self.browse(cr, uid, ref('outgoing_shipment_icecream'), context=context) + move = self.browse(cr, uid, ref('outgoing_shipment_monitor'), context=context) context.update({'active_model': 'stock.move', 'active_id': move.id, 'active_ids': [move.id]}) total_qty = move.product_qty split_qty = 10 @@ -277,6 +276,6 @@ I check availaible stock after deliver. - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_icecream'), context=context) - assert round(product.qty_available, 2) == 5.96, "Stock does not correspond." - assert round(product.virtual_available, 2) == -4.04, "Vitual stock does not correspond." + product = self.browse(cr, uid, ref('product_product_6'), context=context) + assert round(product.qty_available, 2) == 6, "Stock does not correspond." + assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." From 4de42a4254bb6abc30321d183c8609e04dc18009 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 28 Feb 2013 12:01:46 +0530 Subject: [PATCH 031/110] [IMP] improve stock yml bzr revid: fka@tinyerp.com-20130228063146-kfy538aq3p1hh029 --- addons/stock/stock_demo.yml | 4 ++-- addons/stock/test/shipment.yml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml index 8e9ea4977b8..b79fd68d509 100644 --- a/addons/stock/stock_demo.yml +++ b/addons/stock/stock_demo.yml @@ -38,8 +38,8 @@ property_stock_inventory: location_opening valuation: real_time cost_method: average - property_stock_account_input: account.conf_o_expense - property_stock_account_output: account.conf_o_income + property_stock_account_input: account.conf_o_income + property_stock_account_output: account.conf_o_expense - !record {model: stock.production.lot, id: lot_monitor_0}: name: Lot0 for LCD Monitor diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 27d5c44d199..4622e0072bc 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -165,11 +165,11 @@ for account_move_line in account_move.line_id: for stock_move in incomming_shipment.move_lines: if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id: - assert account_move_line.credit == 800.0, "Credit amount does not correspond." + assert account_move_line.credit == 10000.0, "Credit amount does not correspond." assert account_move_line.debit == 0.0, "Debit amount does not correspond." else: assert account_move_line.credit == 0.0, "Credit amount does not correspond." - assert account_move_line.debit == 800.0, "Debit amount does not correspond." + assert account_move_line.debit == 10000.0, "Debit amount does not correspond." - I consume 1 unit 15” LCD Monitor from each incoming lots into internal production. - @@ -193,7 +193,7 @@ !python {model: stock.location}: | ctx = {'product_id': ref('product_product_6')} refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) - assert refrigerator_location.stock_real == 36.0, 'stock does not correspond in stock location shop0.' + assert refrigerator_location.stock_real == 136.0, 'stock does not correspond in stock location shop0.' scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.' From 506b7c9c64f5e0022aa15aeab05d18ca6b766fed Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 28 Feb 2013 12:13:38 +0530 Subject: [PATCH 032/110] [IMP] change data of stock_report.yml bzr revid: fka@tinyerp.com-20130228064338-r93gtraqgrfc76mc --- addons/stock/__openerp__.py | 2 +- addons/stock/test/shipment.yml | 4 ++-- addons/stock/test/stock_report.yml | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py index e1c96ba0c25..323fac889be 100644 --- a/addons/stock/__openerp__.py +++ b/addons/stock/__openerp__.py @@ -93,7 +93,7 @@ Dashboard / Reports for Warehouse Management will include: 'stock_demo.yml', 'test/opening_stock.yml', 'test/shipment.yml', - #'test/stock_report.yml', + 'test/stock_report.yml', ], 'installable': True, 'application': True, diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 4622e0072bc..96273a081b7 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -192,8 +192,8 @@ - !python {model: stock.location}: | ctx = {'product_id': ref('product_product_6')} - refrigerator_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) - assert refrigerator_location.stock_real == 136.0, 'stock does not correspond in stock location shop0.' + monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) + assert monitor_location.stock_real == 136.0, 'stock does not correspond in stock location shop0.' scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.' diff --git a/addons/stock/test/stock_report.yml b/addons/stock/test/stock_report.yml index b1590a4d819..b16ade8a085 100644 --- a/addons/stock/test/stock_report.yml +++ b/addons/stock/test/stock_report.yml @@ -4,7 +4,7 @@ !python {model: stock.location}: | import os from openerp import netsvc, tools - (data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_refrigerator')], {}, {}) + (data, format) = netsvc.LocalService('report.lot.stock.overview').create(cr, uid, [ref('location_monitor')], {}, {}) if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'stock-overview'+format), 'wb+').write(data) - @@ -13,7 +13,7 @@ !python {model: stock.location}: | import os from openerp import netsvc, tools - (data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_refrigerator')], {}, {}) + (data, format) = netsvc.LocalService('report.lot.stock.overview_all').create(cr, uid, [ref('location_monitor')], {}, {}) if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'stock-overviewall'+format), 'wb+').write(data) - @@ -22,7 +22,7 @@ !python {model: stock.inventory}: | import os from openerp import netsvc, tools - (data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_icecream')], {}, {}) + (data, format) = netsvc.LocalService('report.stock.inventory.move').create(cr, uid, [ref('stock_inventory_0')], {}, {}) if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'stock-stock_inventory_move.'+format), 'wb+').write(data) - @@ -40,7 +40,7 @@ !python {model: product.product}: | import os from openerp import netsvc, tools - (data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_icecream')], {}, {}) + (data, format) = netsvc.LocalService('report.stock.product.history').create(cr, uid, [ref('product_product_6')], {}, {}) if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'stock-product_stock_report.'+format), 'wb+').write(data) From 721daed4c6bdd35ae44476ad9ae0c3edbb823e89 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 28 Feb 2013 14:35:06 +0530 Subject: [PATCH 033/110] [IMP] add stock_users.yml file in stock for test access rights bzr revid: fka@tinyerp.com-20130228090506-esh7d6nycoqqymay --- addons/stock/__openerp__.py | 1 + addons/stock/stock_demo.yml | 10 ++++++++++ addons/stock/test/stock_users.yml | 20 ++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 addons/stock/test/stock_users.yml diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py index 323fac889be..dd2a996f6dd 100644 --- a/addons/stock/__openerp__.py +++ b/addons/stock/__openerp__.py @@ -90,6 +90,7 @@ Dashboard / Reports for Warehouse Management will include: 'res_config_view.xml', ], 'test': [ + 'test/stock_users.yml', 'stock_demo.yml', 'test/opening_stock.yml', 'test/shipment.yml', diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml index b79fd68d509..64be92f8d06 100644 --- a/addons/stock/stock_demo.yml +++ b/addons/stock/stock_demo.yml @@ -1,3 +1,8 @@ +- + Only stock manager can create location,warehouse and product, so let's check data with giving the access rights of manager +- + !context + uid: 'res_users_stock_manager' - !record {model: stock.location, id: location_monitor}: name: chicago shop @@ -40,6 +45,11 @@ cost_method: average property_stock_account_input: account.conf_o_income property_stock_account_output: account.conf_o_expense +- + Stock user can handled production lot,inventory and picking, so let's check data with giving the access rights of user +- + !context + uid: 'res_users_stock_user' - !record {model: stock.production.lot, id: lot_monitor_0}: name: Lot0 for LCD Monitor diff --git a/addons/stock/test/stock_users.yml b/addons/stock/test/stock_users.yml new file mode 100644 index 00000000000..82d48197b0d --- /dev/null +++ b/addons/stock/test/stock_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Stock Manager' +- + !record {model: res.users, id: res_users_stock_manager}: + company_id: base.main_company + name: Stock Manager + login: sam + password: sam + groups_id: + - stock.group_stock_manager +- + Create a user as 'Stock User' +- + !record {model: res.users, id: res_users_stock_user}: + company_id: base.main_company + name: Stock User + login: sau + password: sau + groups_id: + - stock.group_stock_user From 8009999e2981260e73fd11e11bacfa8a1fd84e2f Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 28 Feb 2013 18:58:36 +0530 Subject: [PATCH 034/110] [IMP] give access rights to the user in stock ymls bzr revid: fka@tinyerp.com-20130228132836-e2f7rknoodpqix0p --- addons/stock/security/stock_security.xml | 2 +- addons/stock/test/opening_stock.yml | 30 ++++++++++++++++++++++++ addons/stock/test/stock_report.yml | 5 ++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/addons/stock/security/stock_security.xml b/addons/stock/security/stock_security.xml index 10ae6a16d59..e51f20c67c9 100644 --- a/addons/stock/security/stock_security.xml +++ b/addons/stock/security/stock_security.xml @@ -10,7 +10,7 @@ Manager - + diff --git a/addons/stock/test/opening_stock.yml b/addons/stock/test/opening_stock.yml index 41b906e560c..9efcfd3af99 100644 --- a/addons/stock/test/opening_stock.yml +++ b/addons/stock/test/opening_stock.yml @@ -1,3 +1,8 @@ +- + Only stock manager can change the price and update stock of products, so let's check data with giving the access rights of manager +- + !context + uid: 'res_users_stock_manager' - I update the price of the 15” LCD Monitor. - @@ -32,6 +37,11 @@ !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 10, "Stock is not updated." +- + Stock user can merge inventory, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_stock_user' - I merge inventory. - @@ -42,11 +52,21 @@ - !python {model: stock.inventory.merge }: | self.do_merge(cr, uid, [ref('merge_inventory')], context=context) +- + Only stock manager cancelled inventory, so let's check data with giving the access rights of manager +- + !context + uid: 'res_users_stock_manager' - I cancel inventory. - !python {model: stock.inventory}: | self.action_cancel_inventory(cr, uid, [ref('stock_inventory_0')]) +- + stock user can reset inventory, so let's check data with giving the access rights of user +- + !context + uid: 'res_users_stock_user' - I reset to draft inventory. - @@ -108,11 +128,21 @@ !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.virtual_available == 100, "Vitual stock is not updated." +- + Only stock manager can close physical inventory, so let's check data with giving the access rights of manager +- + !context + uid: 'res_users_stock_manager' - I close physical inventory of 15” LCD Monitor. - !python {model: stock.inventory}: | self.action_done(cr, uid, [ref('stock_inventory_0')], context=context) +- + Stock user can check closed move and real stock, so let's check data with giving the access rights of user +- + !context + uid: 'res_users_stock_user' - I check closed move and real stock of 15” LCD Monitor after closed physical inventory. - diff --git a/addons/stock/test/stock_report.yml b/addons/stock/test/stock_report.yml index b16ade8a085..f1a31f23d93 100644 --- a/addons/stock/test/stock_report.yml +++ b/addons/stock/test/stock_report.yml @@ -1,3 +1,8 @@ +- + Stock user can print all reports related to stock, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_stock_user' - I print a stock overview report of location. - From 8eb3f28c28d54a7cca27ac274f78054db9185991 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 1 Mar 2013 11:12:53 +0530 Subject: [PATCH 035/110] [IMP] remove space bzr revid: fka@tinyerp.com-20130301054253-qbep31elzopq6xa4 --- addons/stock/product.py | 5 +++-- addons/stock/stock.py | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/stock/product.py b/addons/stock/product.py index b00f8615667..254eb53d255 100644 --- a/addons/stock/product.py +++ b/addons/stock/product.py @@ -55,14 +55,15 @@ class product_product(osv.osv): if context is None: context = {} product_obj = self.pool.get('product.product').browse(cr, uid, product_id, context=context) + stock_input_acc = product_obj.property_stock_account_input and product_obj.property_stock_account_input.id or False if not stock_input_acc: stock_input_acc = product_obj.categ_id.property_stock_account_input_categ and product_obj.categ_id.property_stock_account_input_categ.id or False - + stock_output_acc = product_obj.property_stock_account_output and product_obj.property_stock_account_output.id or False if not stock_output_acc: stock_output_acc = product_obj.categ_id.property_stock_account_output_categ and product_obj.categ_id.property_stock_account_output_categ.id or False - + journal_id = product_obj.categ_id.property_stock_journal and product_obj.categ_id.property_stock_journal.id or False account_valuation = product_obj.categ_id.property_stock_valuation_account_id and product_obj.categ_id.property_stock_valuation_account_id.id or False return { diff --git a/addons/stock/stock.py b/addons/stock/stock.py index ed2b36bd1f5..8e4611dc5d0 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -2233,6 +2233,7 @@ class stock_move(osv.osv): acc_valuation = accounts.get('property_stock_valuation_account_id', False) journal_id = accounts['stock_journal'] + if acc_dest == acc_valuation: raise osv.except_osv(_('Error!'), _('Cannot create Journal Entry, Output Account of this product and Valuation account on category of this product are same.')) From b6cbd45d01274615bdb1ee17a831dbddc4fdc091 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 1 Mar 2013 11:17:45 +0530 Subject: [PATCH 036/110] [IMP] remove space bzr revid: fka@tinyerp.com-20130301054745-52t0n0mh8b3xo4qt --- addons/stock/product.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/stock/product.py b/addons/stock/product.py index 254eb53d255..1d56ce64988 100644 --- a/addons/stock/product.py +++ b/addons/stock/product.py @@ -55,15 +55,15 @@ class product_product(osv.osv): if context is None: context = {} product_obj = self.pool.get('product.product').browse(cr, uid, product_id, context=context) - + stock_input_acc = product_obj.property_stock_account_input and product_obj.property_stock_account_input.id or False if not stock_input_acc: stock_input_acc = product_obj.categ_id.property_stock_account_input_categ and product_obj.categ_id.property_stock_account_input_categ.id or False - + stock_output_acc = product_obj.property_stock_account_output and product_obj.property_stock_account_output.id or False if not stock_output_acc: stock_output_acc = product_obj.categ_id.property_stock_account_output_categ and product_obj.categ_id.property_stock_account_output_categ.id or False - + journal_id = product_obj.categ_id.property_stock_journal and product_obj.categ_id.property_stock_journal.id or False account_valuation = product_obj.categ_id.property_stock_valuation_account_id and product_obj.categ_id.property_stock_valuation_account_id.id or False return { From ab83bc5d851b6339806c56804adb0eee151816a0 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 1 Mar 2013 14:58:05 +0530 Subject: [PATCH 037/110] [IMP] add yml of mrp_users and give access rights bzr revid: fka@tinyerp.com-20130301092805-56z3lzm8obeon6re --- addons/mrp/__openerp__.py | 7 ++++--- addons/mrp/security/ir.model.access.csv | 1 + addons/mrp/security/mrp_security.xml | 1 + addons/mrp/test/cancel_order.yml | 5 +++++ addons/mrp/test/mrp_users.yml | 20 ++++++++++++++++++++ addons/mrp/test/order_demo.yml | 5 +++++ addons/mrp/test/order_process.yml | 5 +++++ 7 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 addons/mrp/test/mrp_users.yml diff --git a/addons/mrp/__openerp__.py b/addons/mrp/__openerp__.py index 6e025ae2d90..5f5ded337a7 100644 --- a/addons/mrp/__openerp__.py +++ b/addons/mrp/__openerp__.py @@ -77,9 +77,10 @@ Dashboard / Reports for MRP will include: #TODO: This yml tests are needed to be completely reviewed again because the product wood panel is removed in product demo as it does not suit for new demo context of computer and consultant company # so the ymls are too complex to change at this stage 'test': [ -# 'test/order_demo.yml', -# 'test/order_process.yml', -# 'test/cancel_order.yml', + 'test/mrp_users.yml', + 'test/order_demo.yml', + 'test/order_process.yml', + 'test/cancel_order.yml', ], 'installable': True, 'application': True, diff --git a/addons/mrp/security/ir.model.access.csv b/addons/mrp/security/ir.model.access.csv index 7a94b1a660c..2d0a478c33d 100644 --- a/addons/mrp/security/ir.model.access.csv +++ b/addons/mrp/security/ir.model.access.csv @@ -1,4 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_analytic_line_user,account.analytic.line,account.model_account_analytic_line,group_mrp_user,1,1,1,0 access_mrp_workcenter,mrp.workcenter,model_mrp_workcenter,mrp.group_mrp_user,1,0,0,0 access_mrp_routing,mrp.routing,model_mrp_routing,mrp.group_mrp_user,1,0,0,0 access_mrp_routing_workcenter,mrp.routing.workcenter,model_mrp_routing_workcenter,mrp.group_mrp_user,1,0,0,0 diff --git a/addons/mrp/security/mrp_security.xml b/addons/mrp/security/mrp_security.xml index 35aae42b53d..9e5dc919720 100644 --- a/addons/mrp/security/mrp_security.xml +++ b/addons/mrp/security/mrp_security.xml @@ -4,6 +4,7 @@ User + diff --git a/addons/mrp/test/cancel_order.yml b/addons/mrp/test/cancel_order.yml index 9e197156b15..2f721b6c653 100644 --- a/addons/mrp/test/cancel_order.yml +++ b/addons/mrp/test/cancel_order.yml @@ -1,3 +1,8 @@ +- + MRP user can cancelled Production Order, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_mrp_user' - I first confirm order for PC Assemble SC349. - diff --git a/addons/mrp/test/mrp_users.yml b/addons/mrp/test/mrp_users.yml new file mode 100644 index 00000000000..d18cc51e8e6 --- /dev/null +++ b/addons/mrp/test/mrp_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'MRP Manager' +- + !record {model: res.users, id: res_users_mrp_manager}: + company_id: base.main_company + name: MRP Manager + login: mam + password: mam + groups_id: + - mrp.group_mrp_manager +- + Create a user as 'MRP User' +- + !record {model: res.users, id: res_users_mrp_user}: + company_id: base.main_company + name: MRP User + login: mau + password: mau + groups_id: + - mrp.group_mrp_user diff --git a/addons/mrp/test/order_demo.yml b/addons/mrp/test/order_demo.yml index ee21fee96df..0e4914390fb 100644 --- a/addons/mrp/test/order_demo.yml +++ b/addons/mrp/test/order_demo.yml @@ -1,3 +1,8 @@ +- + MRP user can create Production Order, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_mrp_user' - I create Production Order of PC Assemble SC349 to produce 5.0 Unit. - diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml index 89331d5c255..8aa408483e9 100644 --- a/addons/mrp/test/order_process.yml +++ b/addons/mrp/test/order_process.yml @@ -1,3 +1,8 @@ +- + MRP user can doing all process related to Production Order, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_mrp_user' - I compute the production order. - From b98082337bae437ac615465e40226a4f42838575 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 12 Mar 2013 14:09:55 +0530 Subject: [PATCH 038/110] [IMP]Improve yml and make work with purchase user bzr revid: sgo@tinyerp.com-20130312083955-la478tbdpfqtv1wr --- addons/purchase/test/process/invoice_on_poline.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/purchase/test/process/invoice_on_poline.yml b/addons/purchase/test/process/invoice_on_poline.yml index 8a391b13ebb..d31b371f009 100644 --- a/addons/purchase/test/process/invoice_on_poline.yml +++ b/addons/purchase/test/process/invoice_on_poline.yml @@ -1,3 +1,8 @@ +- + Purchase User confirm the order and create invoice based on purchase order line. +- + !context + uid: 'res_users_purchase_user' - I confirm purchase order which has invoicing control method "Based on Purchase Order Lines". - @@ -17,10 +22,4 @@ !python {model: purchase.order}: | purchase_order = self.browse(cr, uid, ref("purchase_order_6")) for purchase_line in purchase_order.order_line: - assert len(purchase_order.invoice_ids) == 1, "Invoice should be generated." -- - I set the default invoicing control method "Based on Purchase Order Lines". -- - !python {model: purchase.config.settings}: | - new_id = self.create(cr, uid, {'default_invoice_method': 'manual'}) - self.execute(cr, uid, [new_id]) + assert len(purchase_order.invoice_ids) == 1, "Invoice should be generated." \ No newline at end of file From 15f6bea1e9eacbe97b90b38337105a1c4219d757 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 12 Mar 2013 16:57:00 +0530 Subject: [PATCH 039/110] [IMP]improve yml for project and add access rights as needed bzr revid: sgo@tinyerp.com-20130312112700-zamjzcjp5d9nv5n0 --- addons/project/__openerp__.py | 1 + addons/project/security/ir.model.access.csv | 1 + addons/project/security/project_security.xml | 1 + addons/project/test/project_demo.yml | 23 +++++++++---- addons/project/test/project_process.yml | 5 +++ addons/project/test/project_users.yml | 20 +++++++++++ addons/project/test/task_process.yml | 35 +++++++++++--------- 7 files changed, 65 insertions(+), 21 deletions(-) create mode 100644 addons/project/test/project_users.yml diff --git a/addons/project/__openerp__.py b/addons/project/__openerp__.py index c0a516cf555..94761835656 100644 --- a/addons/project/__openerp__.py +++ b/addons/project/__openerp__.py @@ -79,6 +79,7 @@ Dashboard / Reports for Project Management will include: ], 'demo': ['project_demo.xml'], 'test': [ + 'test/project_users.yml', 'test/project_demo.yml', 'test/project_process.yml', 'test/task_process.yml', diff --git a/addons/project/security/ir.model.access.csv b/addons/project/security/ir.model.access.csv index a76faa0fcce..1428f445e43 100644 --- a/addons/project/security/ir.model.access.csv +++ b/addons/project/security/ir.model.access.csv @@ -19,6 +19,7 @@ access_project_task_history,project.task.history project,project.model_project_t access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_manager,1,0,0,0 access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_user,1,0,0,0 access_resource_calendar,project.resource_calendar manager,resource.model_resource_calendar,project.group_project_manager,1,0,0,0 +access_resource_calendar_leaves,project.resource_calendar_leaves manager,resource.model_resource_calendar_leaves,project.group_project_manager,1,0,0,0 access_project_category,project.project_category,model_project_category,,1,0,0,0 access_project_category_manager,project.project_category,model_project_category,project.group_project_manager,1,1,1,1 access_mail_alias,mail.alias,mail.model_mail_alias,project.group_project_manager,1,1,1,1 diff --git a/addons/project/security/project_security.xml b/addons/project/security/project_security.xml index f1d8c7e760f..f17c781d702 100644 --- a/addons/project/security/project_security.xml +++ b/addons/project/security/project_security.xml @@ -4,6 +4,7 @@ User + diff --git a/addons/project/test/project_demo.yml b/addons/project/test/project_demo.yml index 5f6acbb913e..21d0af324ff 100644 --- a/addons/project/test/project_demo.yml +++ b/addons/project/test/project_demo.yml @@ -1,12 +1,23 @@ +- + I Update project and create the new task with project manager +- + !context + uid: 'res_users_project_manager' +- + Change partner for The Jackson Group's Project - !record {model: project.project, id: project_project_1, view: False}: partner_id: base.res_partner_2 - - !record {model: project.task, id: project_task_1, view: False}: + I create task for The Jackson Group's Project project user can create task. +- + !context + uid: 'res_users_project_user' +- + !record {model: project.task, id: project_task_for_project1}: + name: Worked on new specification + user_id: res_users_project_user remaining_hours: 10.00 -- - !record {model: project.task, id: project_task_1, view: False}: planned_hours: 10.00 -- - !record {model: project.task, id: project_task_1, view: False}: - project_id: project_project_1 \ No newline at end of file + project_id: project_project_1 + stage_id: project_tt_specification \ No newline at end of file diff --git a/addons/project/test/project_process.yml b/addons/project/test/project_process.yml index c2a5c072e9d..9ef488a07b4 100644 --- a/addons/project/test/project_process.yml +++ b/addons/project/test/project_process.yml @@ -1,3 +1,8 @@ +- + Test the whole project process with project manager. +- + !context + uid: 'res_users_project_manager' - In order to Test Process of Project Management, - diff --git a/addons/project/test/project_users.yml b/addons/project/test/project_users.yml new file mode 100644 index 00000000000..b23ab0fc7f6 --- /dev/null +++ b/addons/project/test/project_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Project manager' +- + !record {model: res.users, id: res_users_project_manager}: + company_id: base.main_company + name: Project Manager + login: prm + password: prm + groups_id: + - project.group_project_manager +- + Create a user as 'Project user' +- + !record {model: res.users, id: res_users_project_user}: + company_id: base.main_company + name: Project User + login: pru + password: pru + groups_id: + - project.group_project_user \ No newline at end of file diff --git a/addons/project/test/task_process.yml b/addons/project/test/task_process.yml index e37b2116714..664f0b1563e 100644 --- a/addons/project/test/task_process.yml +++ b/addons/project/test/task_process.yml @@ -1,46 +1,51 @@ +- + Test the whole task process with project user. +- + !context + uid: 'res_users_project_user' - I put task in pending due to specification is not clear. - !python {model: project.task}: | - self.do_pending(cr, uid, [ref("project_task_1")]) - context.update({"active_id": ref("project_task_1")}) + self.do_pending(cr, uid, [ref("project_task_for_project1")]) + context.update({"active_id": ref("project_task_for_project1")}) - I check state of task after put in pending. - - !assert {model: project.task, id: project_task_1, severity: error, string: task should be in pending state}: + !assert {model: project.task, id: project_task_for_project1, severity: error, string: task should be in pending state}: - state == "pending" - !record {model: project.task.delegate, id: delegate_id}: - user_id: base.user_demo + user_id: res_users_project_user planned_hours: 12.0 planned_hours_me: 2.0 - Now I delegate task to team member. - !python {model: project.task.delegate}: | - self.delegate(cr, uid, [ref("delegate_id")], {"active_id": ref("project_task_1")}) + self.delegate(cr, uid, [ref("delegate_id")], {"active_id": ref("project_task_for_project1")}) - I check delegated task details. - !python {model: project.task}: | - task = self.browse(cr, uid, ref("project_task_1"), context=context) + task = self.browse(cr, uid, ref("project_task_for_project1"), context=context) assert task.planned_hours == 2.0, "Planning hours is not correct after delegated." assert task.state == "pending", "Task should be in Pending after delegated." - I re-open the task. - !python {model: project.task}: | - self.do_reopen(cr, uid, [ref("project_task_1")]) + self.do_reopen(cr, uid, [ref("project_task_for_project1")]) - I check reopened task details. - - !assert {model: project.task, id: project_task_1, severity: error, string: task should be open.}: + !assert {model: project.task, id: project_task_for_project1, severity: error, string: task should be open.}: - state == "open" - I change the stage of task to next stage. - !python {model: project.task}: | - self.stage_next(cr, uid, [ref("project_task_1")]) + self.stage_next(cr, uid, [ref("project_task_for_project1")]) - !record {model: project.task.reevaluate, id: reevaluate_id}: remaining_hours : 120 @@ -48,29 +53,29 @@ I reevaluate task with remaining hours. - !python {model: project.task.reevaluate}: | - self.compute_hours(cr, uid, [ref("reevaluate_id")], {"active_id": ref("project_task_1")}) + self.compute_hours(cr, uid, [ref("reevaluate_id")], {"active_id": ref("project_task_for_project1")}) - I check remaining hours after reevaluated task. - - !assert {model: project.task, id: project_task_1, severity: error, string: task should be reevaluated}: + !assert {model: project.task, id: project_task_for_project1, severity: error, string: task should be reevaluated}: - remaining_hours == 120.0 - I close the task. - !python {model: project.task}: | - self.action_close(cr, uid, [ref("project_task_1")]) + self.action_close(cr, uid, [ref("project_task_for_project1")]) - I check state after closed. - - !assert {model: project.task, id: project_task_1, severity: error, string: task is in open state}: + !assert {model: project.task, id: project_task_for_project1, severity: error, string: task is in open state}: - state == "done" - I change the stage of task to previous stage. - !python {model: project.task}: | - self.stage_previous(cr, uid, [ref("project_task_1")]) + self.stage_previous(cr, uid, [ref("project_task_for_project1")]) - I cancel Task. - !python {model: project.task}: | - self.do_cancel(cr, uid, [ref("project_task_2")]) + self.do_cancel(cr, uid, [ref("project_task_for_project1")]) From 6bc66196127703dfc15245872fa99ee23dc91946 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 14 Mar 2013 15:11:01 +0530 Subject: [PATCH 040/110] [IMP] give access rights in project issue bzr revid: fka@tinyerp.com-20130314094101-3n3mkiw1msm0vyrc --- addons/project_issue/__openerp__.py | 1 + addons/project_issue/test/cancel_issue.yml | 5 +++++ addons/project_issue/test/issue_demo.yml | 5 +++++ addons/project_issue/test/issue_process.yml | 15 ++++++++++++++ addons/project_issue/test/issue_users.yml | 20 +++++++++++++++++++ addons/project_issue/test/subscribe_issue.yml | 7 ++++++- 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 addons/project_issue/test/issue_users.yml diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py index 2c5f311c044..553268ca224 100644 --- a/addons/project_issue/__openerp__.py +++ b/addons/project_issue/__openerp__.py @@ -53,6 +53,7 @@ It allows the manager to quickly check the issues, assign them and decide on the ], 'demo': ['project_issue_demo.xml'], 'test': [ + 'test/issue_users.yml', 'test/subscribe_issue.yml', 'test/issue_process.yml', 'test/cancel_issue.yml', diff --git a/addons/project_issue/test/cancel_issue.yml b/addons/project_issue/test/cancel_issue.yml index 76ffa212638..b69f95675c6 100644 --- a/addons/project_issue/test/cancel_issue.yml +++ b/addons/project_issue/test/cancel_issue.yml @@ -1,3 +1,8 @@ +- + Project user can cancelled issue, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_project_issue_user' - In order to test process of issue tracking in OpenERP, I cancel the unqualified Issue. - diff --git a/addons/project_issue/test/issue_demo.yml b/addons/project_issue/test/issue_demo.yml index 4e3790361e5..7040b631f46 100644 --- a/addons/project_issue/test/issue_demo.yml +++ b/addons/project_issue/test/issue_demo.yml @@ -1,3 +1,8 @@ +- + Test the whole create project issue with project user. +- + !context + uid: 'res_users_project_issue_user' - !record {model: project.issue, id: project_task_1, view: False}: task_id: 'project.project_task_17' diff --git a/addons/project_issue/test/issue_process.yml b/addons/project_issue/test/issue_process.yml index afb68a9b6c2..b5fe763fb43 100644 --- a/addons/project_issue/test/issue_process.yml +++ b/addons/project_issue/test/issue_process.yml @@ -1,3 +1,8 @@ +- + Project user can subscribe issue, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_project_issue_user' - In order to test process of issue tracking in OpenERP, I Open the Issue. - @@ -40,11 +45,21 @@ - !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue should be in open state}: - state == 'open' +- + Only project manager can create Task for Issue, so let's check data with giving the access rights of manager. +- + !context + uid: 'res_users_project_issue_manager' - I create Task for Issue. - !python {model: project.issue}: | self.convert_issue_task(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + After resolving Issue Project user can close issue, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_project_issue_user' - I close Issue after resolving it - diff --git a/addons/project_issue/test/issue_users.yml b/addons/project_issue/test/issue_users.yml new file mode 100644 index 00000000000..3493ac58ffc --- /dev/null +++ b/addons/project_issue/test/issue_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'Project manager' +- + !record {model: res.users, id: res_users_project_issue_manager}: + company_id: base.main_company + name: Project Manager + login: prim + password: prim + groups_id: + - project.group_project_manager +- + Create a user as 'Project user' +- + !record {model: res.users, id: res_users_project_issue_user}: + company_id: base.main_company + name: Project User + login: priu + password: priu + groups_id: + - project.group_project_user \ No newline at end of file diff --git a/addons/project_issue/test/subscribe_issue.yml b/addons/project_issue/test/subscribe_issue.yml index 9f16dc80b97..e07c8704a14 100644 --- a/addons/project_issue/test/subscribe_issue.yml +++ b/addons/project_issue/test/subscribe_issue.yml @@ -1,5 +1,10 @@ - - In Order to test process of Issue in OpenERP, Custmer send the issue by email. + Project user can subscribe issue, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_project_issue_user' +- + In Order to test process of Issue in OpenERP, Customer send the issue by email. - !python {model: mail.thread}: | from openerp import addons From 6f4588cc62f212ba1f0040f83ab21b0546c62989 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 14 Mar 2013 15:44:49 +0530 Subject: [PATCH 041/110] [IMP] give access rights in yml of mrp operations bzr revid: fka@tinyerp.com-20130314101449-a51uxlekaod33s8f --- addons/mrp_operations/__openerp__.py | 2 +- .../test/workcenter_operations.yml | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/addons/mrp_operations/__openerp__.py b/addons/mrp_operations/__openerp__.py index 7fedb426edd..12d86e0b532 100644 --- a/addons/mrp_operations/__openerp__.py +++ b/addons/mrp_operations/__openerp__.py @@ -70,7 +70,7 @@ So, that we can compare the theoretic delay and real delay. 'mrp_operations_demo.yml' ], 'test': [ -# 'test/workcenter_operations.yml', + 'test/workcenter_operations.yml', ], 'installable': True, 'auto_install': False, diff --git a/addons/mrp_operations/test/workcenter_operations.yml b/addons/mrp_operations/test/workcenter_operations.yml index 4754bb463ff..3bcdc77ecab 100644 --- a/addons/mrp_operations/test/workcenter_operations.yml +++ b/addons/mrp_operations/test/workcenter_operations.yml @@ -1,6 +1,19 @@ +- + Create a user as 'MRP User' +- + !record {model: res.users, id: res_mrp_operation_user}: + company_id: base.main_company + name: MRP User + login: maou + password: maou + groups_id: + - mrp.group_mrp_user - In order to test mrp_operations with OpenERP, I refer created production order of PC Assemble SC349 - with routing - Manual Component's Assembly to test complete production process with respect of workcenter. + with routing - Manual Component's Assembly to test complete production process with respect of workcenter with giving access rights of MRP User. +- + !context + uid: 'res_mrp_operation_user' - I compute the production order. - @@ -92,7 +105,7 @@ I print a Barcode Report of Operation line. - !python {model: mrp_operations.operation.code}: | - import netsvc, tools, os + from openerp import netsvc, tools (data, format) = netsvc.LocalService('report.mrp.code.barcode').create(cr, uid, [ref('mrp_operations.mrp_op_1'),ref('mrp_operations.mrp_op_2'),ref('mrp_operations.mrp_op_3'),ref('mrp_operations.mrp_op_4'),ref('mrp_operations.mrp_op_5')], {}, {}) if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'mrp_operations-barcode_report.'+format), 'wb+').write(data) @@ -101,7 +114,7 @@ I print Workcenter's Barcode Report. - !python {model: mrp.workcenter}: | - import netsvc, tools, os + from openerp import netsvc, tools (data, format) = netsvc.LocalService('report.mrp.wc.barcode').create(cr, uid, [ref('mrp.mrp_workcenter_0'),ref('mrp.mrp_workcenter_1')], {}, {}) if tools.config['test_report_directory']: file(os.path.join(tools.config['test_report_directory'], 'mrp_operations-workcenter_barcode_report.'+format), 'wb+').write(data) From d3905268bc08f08db34669b8e90045fc2fb6f8f6 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 14 Mar 2013 16:24:11 +0530 Subject: [PATCH 042/110] [IMP] give access rights in yml of mrp repair bzr revid: fka@tinyerp.com-20130314105411-cgqik9a6grk0pqjl --- addons/mrp_repair/__openerp__.py | 3 ++- addons/mrp_repair/test/mrp_repair_users.yml | 20 +++++++++++++++++++ .../test/test_mrp_repair_afterinv.yml | 5 ++++- .../mrp_repair/test/test_mrp_repair_b4inv.yml | 5 ++++- .../test/test_mrp_repair_cancel.yml | 5 ++++- .../test/test_mrp_repair_noneinv.yml | 5 ++++- 6 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 addons/mrp_repair/test/mrp_repair_users.yml diff --git a/addons/mrp_repair/__openerp__.py b/addons/mrp_repair/__openerp__.py index 26480e975ce..a274cbc3ef4 100644 --- a/addons/mrp_repair/__openerp__.py +++ b/addons/mrp_repair/__openerp__.py @@ -52,7 +52,8 @@ The following topics should be covered by this module: 'mrp_repair_report.xml', ], 'demo': ['mrp_repair_demo.yml'], - 'test': ['test/test_mrp_repair_noneinv.yml', + 'test': ['test/mrp_repair_users.yml', + 'test/test_mrp_repair_noneinv.yml', 'test/test_mrp_repair_b4inv.yml', 'test/test_mrp_repair_afterinv.yml', 'test/test_mrp_repair_cancel.yml', diff --git a/addons/mrp_repair/test/mrp_repair_users.yml b/addons/mrp_repair/test/mrp_repair_users.yml new file mode 100644 index 00000000000..dee61653209 --- /dev/null +++ b/addons/mrp_repair/test/mrp_repair_users.yml @@ -0,0 +1,20 @@ +- + Create a user as 'MRP Repair Manager' +- + !record {model: res.users, id: res_mrp_repair_manager}: + company_id: base.main_company + name: MRP Manager + login: marm + password: marm + groups_id: + - mrp.group_mrp_manager +- + Create a user as 'MRP Repair User' +- + !record {model: res.users, id: res_mrp_repair_user}: + company_id: base.main_company + name: MRP User + login: maru + password: maru + groups_id: + - mrp.group_mrp_user \ No newline at end of file diff --git a/addons/mrp_repair/test/test_mrp_repair_afterinv.yml b/addons/mrp_repair/test/test_mrp_repair_afterinv.yml index 5ceb3f9b02b..583518ee7de 100644 --- a/addons/mrp_repair/test/test_mrp_repair_afterinv.yml +++ b/addons/mrp_repair/test/test_mrp_repair_afterinv.yml @@ -1,5 +1,8 @@ - - In order to test Invoice Method 'After Repair'. + In order to test Invoice Method 'After Repair' with giving the access rights of mrp user. +- + !context + uid: 'res_mrp_repair_user' - I confirm Repair order taking Invoice Method 'After Repair'. - diff --git a/addons/mrp_repair/test/test_mrp_repair_b4inv.yml b/addons/mrp_repair/test/test_mrp_repair_b4inv.yml index 47e301cd0bd..0b31c3970de 100644 --- a/addons/mrp_repair/test/test_mrp_repair_b4inv.yml +++ b/addons/mrp_repair/test/test_mrp_repair_b4inv.yml @@ -1,5 +1,8 @@ - - Now I test for Invoice Method 'Before Repair'. + Now I test for Invoice Method 'Before Repair' with giving the access rights of mrp user. +- + !context + uid: 'res_mrp_repair_user' - I confirm Repair order for Invoice Method 'Before Repair'. - diff --git a/addons/mrp_repair/test/test_mrp_repair_cancel.yml b/addons/mrp_repair/test/test_mrp_repair_cancel.yml index ee0e9c379e7..83a8b901fd3 100644 --- a/addons/mrp_repair/test/test_mrp_repair_cancel.yml +++ b/addons/mrp_repair/test/test_mrp_repair_cancel.yml @@ -1,6 +1,9 @@ - In order to test the cancel flow of mrp_repair module, - I start by creating new copy Repair order for "PC Assemble SC234" product. + I start by creating new copy Repair order for "PC Assemble SC234" product with giving access rights of mrp user. +- + !context + uid: 'res_mrp_repair_user' - !python {model: mrp.repair}: | copy_id = self.copy(cr, uid, ref("mrp_repair_rmrp1")) diff --git a/addons/mrp_repair/test/test_mrp_repair_noneinv.yml b/addons/mrp_repair/test/test_mrp_repair_noneinv.yml index 4334af01958..1e411e45605 100644 --- a/addons/mrp_repair/test/test_mrp_repair_noneinv.yml +++ b/addons/mrp_repair/test/test_mrp_repair_noneinv.yml @@ -1,5 +1,8 @@ - - In order to test "mrp_repair" module, I start with confirm state, and start repair. + In order to test "mrp_repair" module, I start with confirm state, and start repair with giving the access rights of mrp user. +- + !context + uid: 'res_mrp_repair_user' - I confirm Repair order for Invoice Method 'No Invoice'. - From 541a46fb877043ccb0f65768178495e8a30900c9 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 14 Mar 2013 16:50:18 +0530 Subject: [PATCH 043/110] [IMP] give access rights in yml of hr_timesheet bzr revid: fka@tinyerp.com-20130314112018-oy0m2lhwc0euq3nh --- addons/hr_timesheet/__openerp__.py | 1 + .../hr_timesheet/test/hr_timesheet_demo.yml | 5 ++++ .../hr_timesheet/test/hr_timesheet_users.yml | 30 +++++++++++++++++++ .../hr_timesheet/test/test_hr_timesheet.yml | 10 +++++++ 4 files changed, 46 insertions(+) create mode 100644 addons/hr_timesheet/test/hr_timesheet_users.yml diff --git a/addons/hr_timesheet/__openerp__.py b/addons/hr_timesheet/__openerp__.py index bff25e8e55d..3c026ac2d07 100644 --- a/addons/hr_timesheet/__openerp__.py +++ b/addons/hr_timesheet/__openerp__.py @@ -57,6 +57,7 @@ up a management by affair. ], 'demo': ['hr_timesheet_demo.xml'], 'test': [ + 'test/hr_timesheet_users.yml', 'test/test_hr_timesheet.yml', 'test/hr_timesheet_report.yml', 'test/hr_timesheet_demo.yml', diff --git a/addons/hr_timesheet/test/hr_timesheet_demo.yml b/addons/hr_timesheet/test/hr_timesheet_demo.yml index a868be2d710..723e3a1a08c 100644 --- a/addons/hr_timesheet/test/hr_timesheet_demo.yml +++ b/addons/hr_timesheet/test/hr_timesheet_demo.yml @@ -1,3 +1,8 @@ +- + Give the access rights of Hr Officer to create employee. +- + !context + uid: 'res_hr_timesheet_officer' - !record {model: hr.analytic.timesheet, id: working_hours_coding, view: False}: user_id: base.user_demo diff --git a/addons/hr_timesheet/test/hr_timesheet_users.yml b/addons/hr_timesheet/test/hr_timesheet_users.yml new file mode 100644 index 00000000000..428c1b7c40f --- /dev/null +++ b/addons/hr_timesheet/test/hr_timesheet_users.yml @@ -0,0 +1,30 @@ +- + Create a user as 'HR Manager' +- + !record {model: res.users, id: res_hr_timesheet_manager}: + company_id: base.main_company + name: HR manager + login: hrtm + password: hrtm + groups_id: + - base.group_hr_manager +- + Create a user as 'HR Officer' +- + !record {model: res.users, id: res_hr_timesheet_officer}: + company_id: base.main_company + name: HR Officer + login: hrto + password: hrto + groups_id: + - base.group_hr_user +- + Create a user as 'Employee' +- + !record {model: res.users, id: res_hr_timesheet_employee}: + company_id: base.main_company + name: Employee + login: empt + password: empt + groups_id: + - base.group_user \ No newline at end of file diff --git a/addons/hr_timesheet/test/test_hr_timesheet.yml b/addons/hr_timesheet/test/test_hr_timesheet.yml index 59d688f183b..b9010ce5e53 100644 --- a/addons/hr_timesheet/test/test_hr_timesheet.yml +++ b/addons/hr_timesheet/test/test_hr_timesheet.yml @@ -1,6 +1,11 @@ - In order to test hr_timesheet Module in OpenERP, I make "Sign In/Sign Out for Project" to encode and track time spent on the different projects. +- + Give the access rights of Hr Officer to create employee. +- + !context + uid: 'res_hr_timesheet_officer' - I create employee "Quentin Paolino" as "User". - @@ -9,6 +14,11 @@ name: Quentin Paolino parent_id: 'hr.employee_al' user_id: 'base.user_demo' +- + Give the access rights of Employee to Sign In/Sign Out in Project. +- + !context + uid: 'res_hr_timesheet_employee' - On "Sign In/Sign Out by Project" wizard i click on "Sign In/Sign Out" button of this wizard. - From 5a3acd71ed1aba2817189d4e8ffef72099c1148b Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Thu, 14 Mar 2013 19:07:50 +0530 Subject: [PATCH 044/110] [IMP] give access rights in yml of sale_stock bzr revid: fka@tinyerp.com-20130314133750-r034ygbcna6l49m6 --- addons/sale_stock/__openerp__.py | 3 +- .../test/cancel_order_sale_stock.yml | 17 +++++++- .../sale_stock/test/picking_order_policy.yml | 25 ++++++++++- .../sale_stock/test/prepaid_order_policy.yml | 5 ++- .../sale_stock/test/sale_order_onchange.yml | 5 +++ addons/sale_stock/test/sale_stock_users.yml | 41 +++++++++++++++++++ 6 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 addons/sale_stock/test/sale_stock_users.yml diff --git a/addons/sale_stock/__openerp__.py b/addons/sale_stock/__openerp__.py index a849df295d4..a1941524868 100644 --- a/addons/sale_stock/__openerp__.py +++ b/addons/sale_stock/__openerp__.py @@ -59,7 +59,8 @@ You can choose flexible invoicing methods: ], 'data': ['sale_stock_data.xml'], 'demo_xml': ['sale_stock_demo.xml'], - 'test': ['test/cancel_order_sale_stock.yml', + 'test': ['test/sale_stock_users.yml', + 'test/cancel_order_sale_stock.yml', 'test/picking_order_policy.yml', 'test/prepaid_order_policy.yml', 'test/sale_order_onchange.yml', diff --git a/addons/sale_stock/test/cancel_order_sale_stock.yml b/addons/sale_stock/test/cancel_order_sale_stock.yml index 9081cac9fa3..397bc0e49fe 100644 --- a/addons/sale_stock/test/cancel_order_sale_stock.yml +++ b/addons/sale_stock/test/cancel_order_sale_stock.yml @@ -1,6 +1,9 @@ - - In order to test the cancel sale order. + In order to test the cancel sale order with that user which have salesman rights. First I confirm order. +- + !context + uid: 'res_sale_stock_salesman' - !workflow {model: sale.order, action: order_confirm, ref: sale.sale_order_8} - @@ -8,7 +11,7 @@ - !python {model: stock.picking}: | delivery_orders = self.search(cr, uid, [('sale_id','=',ref("sale.sale_order_8"))]) - first_picking = self.browse(cr, uid, delivery_orders[0], context=context) + first_picking = self.browse(cr, uid, delivery_orders[0], context=None) if first_picking.force_assign(cr, uid, first_picking): first_move = first_picking.move_lines[0] values = {'move%s'%(first_move.id): {'product_qty': 2, 'product_uom':ref('product.product_uom_unit')}} @@ -20,12 +23,22 @@ delivery_orders = self.search(cr, uid, [('sale_id','=',ref("sale.sale_order_8"))]) last_delivery_order_id = delivery_orders[0] self.pool.get('stock.picking').signal_button_cancel(cr, uid, [last_delivery_order_id]) +- + Only Stock User can change data related warehouse therfore test with that user which have stcok user rights, +- + !context + uid: 'res_stock_user' - I run the scheduler. - !python {model: procurement.order}: | self.run_scheduler(cr, uid) +- + Salesman can also check order therfore test with that user which have salesman rights, +- + !context + uid: 'res_sale_stock_salesman' - I check order status in "Ship Exception". - diff --git a/addons/sale_stock/test/picking_order_policy.yml b/addons/sale_stock/test/picking_order_policy.yml index f761dfb65db..003bfbc1f30 100644 --- a/addons/sale_stock/test/picking_order_policy.yml +++ b/addons/sale_stock/test/picking_order_policy.yml @@ -1,5 +1,8 @@ - - In order to test process of the Sale Order, + In order to test process of the Sale Order with access rights of saleman, +- + !context + uid: 'res_sale_stock_salesman' - First I check the total amount of the Quotation before Approved. - @@ -33,11 +36,21 @@ assert procurement.product_qty == order_line.product_uom_qty, "Qty is not correspond." assert procurement.product_uom.id == order_line.product_uom.id, "UOM is not correspond." assert procurement.procure_method == order_line.type, "Procurement method is not correspond." +- + Only Stock User can change data related warehouse therfore test with that user which have stcok user rights, +- + !context + uid: 'res_stock_user' - I run the scheduler. - !python {model: procurement.order}: | self.run_scheduler(cr, uid) +- + Salesman can also check order therfore test with that user which have salesman rights, +- + !context + uid: 'res_sale_stock_salesman' - I check the details of delivery order after confirmed quotation. - @@ -128,6 +141,11 @@ assert inv_line.price_unit == so_line.price_unit , "Price Unit is not correspond." assert inv_line.quantity == (so_line.product_uos and so_line.product_uos_qty) or so_line.product_uom_qty , "Product qty is not correspond." assert inv_line.price_subtotal == so_line.price_subtotal, "Price sub total is not correspond." +- + Only Stock manager can open the Invoice therfore test with that user which have stock manager rights, +- + !context + uid: 'res_stock_manager' - I open the Invoice. - @@ -149,6 +167,11 @@ journal_ids[0], ref('account.cash'), ref('account.period_8'), journal_ids[0], name='test') +- + To test process of the Sale Order with access rights of saleman, +- + !context + uid: 'res_sale_stock_salesman' - I check the order after paid invoice. - diff --git a/addons/sale_stock/test/prepaid_order_policy.yml b/addons/sale_stock/test/prepaid_order_policy.yml index e35a9a82cf9..0e0345868d0 100644 --- a/addons/sale_stock/test/prepaid_order_policy.yml +++ b/addons/sale_stock/test/prepaid_order_policy.yml @@ -1,5 +1,8 @@ - - Now I confirm the Quotation with "Pay before delivery" policy. + Now I confirm the Quotation with "Pay before delivery" policy with access rights of salesman. +- + !context + uid: 'res_sale_stock_salesman' - !workflow {model: sale.order, action: order_confirm, ref: sale.sale_order_4} - diff --git a/addons/sale_stock/test/sale_order_onchange.yml b/addons/sale_stock/test/sale_order_onchange.yml index 1026e5627c3..d37dd74e1ef 100644 --- a/addons/sale_stock/test/sale_order_onchange.yml +++ b/addons/sale_stock/test/sale_order_onchange.yml @@ -1,3 +1,8 @@ +- + In sale order to test process of onchange of Sale Order with access rights of salemanager, +- + !context + uid: 'res_sale_stock_salesmanager' - In order to test the onchange of the Sale Order, I create a product - diff --git a/addons/sale_stock/test/sale_stock_users.yml b/addons/sale_stock/test/sale_stock_users.yml new file mode 100644 index 00000000000..f9bd1cf1727 --- /dev/null +++ b/addons/sale_stock/test/sale_stock_users.yml @@ -0,0 +1,41 @@ +- + Create a user as 'Salesmanager' +- + !record {model: res.users, id: res_sale_stock_salesmanager}: + company_id: base.main_company + name: Sales manager + login: ssm + password: ssm + groups_id: + - base.group_sale_manager +- + Create a user as 'Salesman' +- + !record {model: res.users, id: res_sale_stock_salesman}: + company_id: base.main_company + name: Salesman + login: ssu + password: ssu + groups_id: + - base.group_sale_salesman_all_leads +- + Create a user as 'Stock User' +- + !record {model: res.users, id: res_stock_user}: + company_id: base.main_company + name: Stock User + login: sau + password: sau + groups_id: + - stock.group_stock_user +- + Create a user as 'Stock Manager' +- + !record {model: res.users, id: res_stock_manager}: + company_id: base.main_company + name: Stock Manager + login: sam + password: sam + email: admin@portal.example.com + groups_id: + - stock.group_stock_manager \ No newline at end of file From 093f0f771abf94e4ec5896cf6d9b9a9572a162a9 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Fri, 15 Mar 2013 10:57:29 +0530 Subject: [PATCH 045/110] [IMP] improve yml of sale_stock bzr revid: fka@tinyerp.com-20130315052729-31z589lryen4wcy0 --- addons/sale_stock/test/sale_order_onchange.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/sale_stock/test/sale_order_onchange.yml b/addons/sale_stock/test/sale_order_onchange.yml index d37dd74e1ef..f21f88c9eb7 100644 --- a/addons/sale_stock/test/sale_order_onchange.yml +++ b/addons/sale_stock/test/sale_order_onchange.yml @@ -1,5 +1,5 @@ - - In sale order to test process of onchange of Sale Order with access rights of salemanager, + Only sales manager Creates product so let's check with access rights of salemanager. - !context uid: 'res_sale_stock_salesmanager' @@ -10,6 +10,11 @@ name: 'Devil Worship Book' list_price: 66.6 procure_method: 'make_to_order' +- + In sale order to test process of onchange of Sale Order with access rights of saleman. +- + !context + uid: 'res_sale_stock_salesman' - Now i create a sale order that uses my new product - From 2496811ec42cc6b06fa9293ff97123c85e593433 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Mon, 18 Mar 2013 11:24:12 +0530 Subject: [PATCH 046/110] [IMP] improve yml strings bzr revid: fka@tinyerp.com-20130318055412-se3c890mlckxd8ty --- addons/sale/test/cancel_order.yml | 2 +- addons/sale/test/delete_order.yml | 2 +- addons/sale_stock/test/cancel_order_sale_stock.yml | 6 +++--- addons/sale_stock/test/picking_order_policy.yml | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/sale/test/cancel_order.yml b/addons/sale/test/cancel_order.yml index 48c6b91d2c4..a2c62e16031 100644 --- a/addons/sale/test/cancel_order.yml +++ b/addons/sale/test/cancel_order.yml @@ -1,5 +1,5 @@ - - Salesman can also cancel order therfore test with that user which have salesman rights, + Salesman can also cancel order therefore test with that user which have salesman rights, - !context uid: 'res_users_salesman' diff --git a/addons/sale/test/delete_order.yml b/addons/sale/test/delete_order.yml index 69c89020ad9..9d8db337d5b 100644 --- a/addons/sale/test/delete_order.yml +++ b/addons/sale/test/delete_order.yml @@ -1,5 +1,5 @@ - - Sales manager can only delete order therfore test with that user which have sales manager rights, + Sales manager can only delete order therefore test with that user which have sales manager rights, - !context uid: 'res_users_salesmanager' diff --git a/addons/sale_stock/test/cancel_order_sale_stock.yml b/addons/sale_stock/test/cancel_order_sale_stock.yml index 397bc0e49fe..1109124705c 100644 --- a/addons/sale_stock/test/cancel_order_sale_stock.yml +++ b/addons/sale_stock/test/cancel_order_sale_stock.yml @@ -11,7 +11,7 @@ - !python {model: stock.picking}: | delivery_orders = self.search(cr, uid, [('sale_id','=',ref("sale.sale_order_8"))]) - first_picking = self.browse(cr, uid, delivery_orders[0], context=None) + first_picking = self.browse(cr, uid, delivery_orders[0]) if first_picking.force_assign(cr, uid, first_picking): first_move = first_picking.move_lines[0] values = {'move%s'%(first_move.id): {'product_qty': 2, 'product_uom':ref('product.product_uom_unit')}} @@ -24,7 +24,7 @@ last_delivery_order_id = delivery_orders[0] self.pool.get('stock.picking').signal_button_cancel(cr, uid, [last_delivery_order_id]) - - Only Stock User can change data related warehouse therfore test with that user which have stcok user rights, + Only Stock User can change data related warehouse therefore test with that user which have stcok user rights, - !context uid: 'res_stock_user' @@ -35,7 +35,7 @@ self.run_scheduler(cr, uid) - - Salesman can also check order therfore test with that user which have salesman rights, + Salesman can also check order therefore test with that user which have salesman rights, - !context uid: 'res_sale_stock_salesman' diff --git a/addons/sale_stock/test/picking_order_policy.yml b/addons/sale_stock/test/picking_order_policy.yml index 003bfbc1f30..50d79058764 100644 --- a/addons/sale_stock/test/picking_order_policy.yml +++ b/addons/sale_stock/test/picking_order_policy.yml @@ -37,7 +37,7 @@ assert procurement.product_uom.id == order_line.product_uom.id, "UOM is not correspond." assert procurement.procure_method == order_line.type, "Procurement method is not correspond." - - Only Stock User can change data related warehouse therfore test with that user which have stcok user rights, + Only Stock User can change data related warehouse therefore test with that user which have stcok user rights, - !context uid: 'res_stock_user' @@ -47,7 +47,7 @@ !python {model: procurement.order}: | self.run_scheduler(cr, uid) - - Salesman can also check order therfore test with that user which have salesman rights, + Salesman can also check order therefore test with that user which have salesman rights, - !context uid: 'res_sale_stock_salesman' @@ -142,7 +142,7 @@ assert inv_line.quantity == (so_line.product_uos and so_line.product_uos_qty) or so_line.product_uom_qty , "Product qty is not correspond." assert inv_line.price_subtotal == so_line.price_subtotal, "Price sub total is not correspond." - - Only Stock manager can open the Invoice therfore test with that user which have stock manager rights, + Only Stock manager can open the Invoice therefore test with that user which have stock manager rights, - !context uid: 'res_stock_manager' From f748568f3c32f7c48c98518119bc19de056df36f Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 18 Mar 2013 17:19:12 +0530 Subject: [PATCH 047/110] [IMP]add access rights for create, read and write to acccount.journal and res.partner.bank bzr revid: sgo@tinyerp.com-20130318114912-klopr2dtalsgbp4g --- addons/account/security/ir.model.access.csv | 2 ++ addons/account/test/account_customer_invoice.yml | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index d164b8026ce..d6ba955aabc 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -37,6 +37,7 @@ access_account_payment_term_manager,account.payment.term,model_account_payment_t access_account_payment_term_line_manager,account.payment.term.line,model_account_payment_term_line,account.group_account_manager,1,1,1,1 access_account_tax_manager,account.tax,model_account_tax,account.group_account_manager,1,1,1,1 access_account_journal_manager,account.journal,model_account_journal,account.group_account_manager,1,1,1,1 +access_account_journal_user,account.journal,model_account_journal,account.group_account_user,1,1,1,0 access_account_journal_invoice,account.journal invoice,model_account_journal,account.group_account_invoice,1,0,0,0 access_account_period_manager,account.period,model_account_period,account.group_account_manager,1,1,1,1 access_account_period_invoice,account.period invoice,model_account_period,account.group_account_invoice,1,0,0,0 @@ -99,3 +100,4 @@ access_account_sequence_fiscal_year_sale_manager,account.sequence.fiscalyear.sal access_account_treasury_report_manager,account.treasury.report.manager,model_account_treasury_report,account.group_account_manager,1,0,0,0 access_account_financial_report,account.financial.report,model_account_financial_report,account.group_account_user,1,1,1,1 access_account_financial_report_invoice,account.financial.report invoice,model_account_financial_report,account.group_account_invoice,1,0,0,0 +access_res_partner_bank,res.partner.bank,model_res_partner_bank,account.group_account_user,1,1,1,0 diff --git a/addons/account/test/account_customer_invoice.yml b/addons/account/test/account_customer_invoice.yml index 866e8921220..a41ca9bbfe4 100644 --- a/addons/account/test/account_customer_invoice.yml +++ b/addons/account/test/account_customer_invoice.yml @@ -1,3 +1,8 @@ +- + Test with that user which have rights to make Invoicing and payment and who is accountant. +- + !context + uid: 'res_users_account_user' - In order to test account invoice I create a new customer invoice - @@ -11,11 +16,6 @@ footer: True bank: base.res_bank_1 bank_name: Reserve -- - Test with that user which have rights to make Invoicing and payment and who is accountant. -- - !context - uid: 'res_users_account_user' - I create a customer invoice - From 1c52635020820ebe927d400c26825d350da9262d Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 19 Mar 2013 14:28:54 +0530 Subject: [PATCH 048/110] [IMP] add user group in context bzr revid: fka@tinyerp.com-20130319085854-norcgk7smiz37fs8 --- addons/crm/test/ui/crm_access_group_users.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/crm/test/ui/crm_access_group_users.yml b/addons/crm/test/ui/crm_access_group_users.yml index cc5be01ee85..407eb8007e5 100644 --- a/addons/crm/test/ui/crm_access_group_users.yml +++ b/addons/crm/test/ui/crm_access_group_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Salesmanager' +- + !context + default_groups_ref: ['base.group_sale_manager'] - !record {model: res.users, id: crm_res_users_salesmanager}: company_id: base.main_company name: Sales manager login: csm password: csm - groups_id: - - base.group_sale_manager - Create a user as 'Salesman' +- + !context + default_groups_ref: ['base.group_sale_salesman_all_leads'] - !record {model: res.users, id: crm_res_users_salesman}: company_id: base.main_company name: Salesman login: csu password: csu - groups_id: - - base.group_sale_salesman_all_leads From b358bcd430399d9f0801903434ede39879f23cba Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 19 Mar 2013 14:44:40 +0530 Subject: [PATCH 049/110] [IMP] add user group in context of project & project_issue yml files bzr revid: fka@tinyerp.com-20130319091440-i6xrkrxzdskeayvs --- addons/project/test/project_users.yml | 10 ++++++---- addons/project_issue/test/issue_users.yml | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/addons/project/test/project_users.yml b/addons/project/test/project_users.yml index b23ab0fc7f6..ad8503d5f76 100644 --- a/addons/project/test/project_users.yml +++ b/addons/project/test/project_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Project manager' +- + !context + default_groups_ref: ['project.group_project_manager'] - !record {model: res.users, id: res_users_project_manager}: company_id: base.main_company name: Project Manager login: prm password: prm - groups_id: - - project.group_project_manager - Create a user as 'Project user' +- + !context + default_groups_ref: ['project.group_project_user'] - !record {model: res.users, id: res_users_project_user}: company_id: base.main_company name: Project User login: pru password: pru - groups_id: - - project.group_project_user \ No newline at end of file diff --git a/addons/project_issue/test/issue_users.yml b/addons/project_issue/test/issue_users.yml index 3493ac58ffc..04789eb6334 100644 --- a/addons/project_issue/test/issue_users.yml +++ b/addons/project_issue/test/issue_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Project manager' +- + !context + default_groups_ref: ['project.group_project_manager'] - !record {model: res.users, id: res_users_project_issue_manager}: company_id: base.main_company name: Project Manager login: prim password: prim - groups_id: - - project.group_project_manager - Create a user as 'Project user' +- + !context + default_groups_ref: ['project.group_project_user'] - !record {model: res.users, id: res_users_project_issue_user}: company_id: base.main_company name: Project User login: priu password: priu - groups_id: - - project.group_project_user \ No newline at end of file From 4d2f294a1287443f242f2fd3ada2e89014e7ceff Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 19 Mar 2013 15:03:08 +0530 Subject: [PATCH 050/110] [IMP] add user group in context of hr & hr_recruitment yml files bzr revid: fka@tinyerp.com-20130319093308-mjopwflkzi8tasf4 --- addons/hr/test/hr_users.yml | 15 +++++++++------ .../hr_recruitment/test/recruitment_process.yml | 5 +++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/addons/hr/test/hr_users.yml b/addons/hr/test/hr_users.yml index 3415b20efbd..265482ca457 100644 --- a/addons/hr/test/hr_users.yml +++ b/addons/hr/test/hr_users.yml @@ -1,30 +1,33 @@ - Create a user as 'HR Manager' +- + !context + default_groups_ref: [base.group_hr_manager] - !record {model: res.users, id: res_users_hr_manager}: company_id: base.main_company name: HR manager login: hrm password: hrm - groups_id: - - base.group_hr_manager - Create a user as 'HR Officer' +- + !context + default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_users_hr_officer}: company_id: base.main_company name: HR Officer login: hro password: hro - groups_id: - - base.group_hr_user - Create a user as 'Employee' +- + !context + default_groups_ref: [base.group_user] - !record {model: res.users, id: res_users_employee}: company_id: base.main_company name: Employee login: emp password: emp - groups_id: - - base.group_user \ No newline at end of file diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml index 0359f253dd9..c284aeb2181 100644 --- a/addons/hr_recruitment/test/recruitment_process.yml +++ b/addons/hr_recruitment/test/recruitment_process.yml @@ -1,13 +1,14 @@ - Create a user as 'HR Recruitment Officer' +- + !context + default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_users_hr_officer}: company_id: base.main_company name: HR Officer login: hrro password: hrro - groups_id: - - base.group_hr_user - In Order to test process of Recruitment so giving HR officer's rights, - From 8b123b8d744633693cdf8ce3d3e8b72a0a1cde4d Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 19 Mar 2013 15:32:52 +0530 Subject: [PATCH 051/110] [IMP] add user group in context of event & hr_timesheet yml files bzr revid: fka@tinyerp.com-20130319100252-74kzr5qc41gj6d2t --- addons/event/test/ui/event_users.yml | 10 ++++++---- addons/hr_attendance/test/attendance_process.yml | 5 +++-- addons/hr_timesheet/test/hr_timesheet_users.yml | 15 +++++++++------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/addons/event/test/ui/event_users.yml b/addons/event/test/ui/event_users.yml index 34564d6c433..e08464bdfd8 100644 --- a/addons/event/test/ui/event_users.yml +++ b/addons/event/test/ui/event_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Event manager' +- + !context + default_groups_ref: [event.group_event_manager] - !record {model: res.users, id: res_users_eventmanager}: company_id: base.main_company name: Event manager login: em password: em - groups_id: - - event.group_event_manager - Create a user as 'Event user' +- + !context + default_groups_ref: [event.group_event_user] - !record {model: res.users, id: res_users_eventuser}: company_id: base.main_company name: User login: eu password: eu - groups_id: - - event.group_event_user \ No newline at end of file diff --git a/addons/hr_attendance/test/attendance_process.yml b/addons/hr_attendance/test/attendance_process.yml index 8348757b63e..383cf209bd4 100644 --- a/addons/hr_attendance/test/attendance_process.yml +++ b/addons/hr_attendance/test/attendance_process.yml @@ -1,13 +1,14 @@ - Create a user as 'HR Attendance Officer' +- + !context + default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_users_attendance_officer}: company_id: base.main_company name: HR Officer login: ao password: ao - groups_id: - - base.group_hr_user - Give the access rights of Hr Officer to test attendance process. - diff --git a/addons/hr_timesheet/test/hr_timesheet_users.yml b/addons/hr_timesheet/test/hr_timesheet_users.yml index 428c1b7c40f..4a557bff44f 100644 --- a/addons/hr_timesheet/test/hr_timesheet_users.yml +++ b/addons/hr_timesheet/test/hr_timesheet_users.yml @@ -1,30 +1,33 @@ - Create a user as 'HR Manager' +- + !context + default_groups_ref: [base.group_hr_manager] - !record {model: res.users, id: res_hr_timesheet_manager}: company_id: base.main_company name: HR manager login: hrtm password: hrtm - groups_id: - - base.group_hr_manager - Create a user as 'HR Officer' +- + !context + default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_hr_timesheet_officer}: company_id: base.main_company name: HR Officer login: hrto password: hrto - groups_id: - - base.group_hr_user - Create a user as 'Employee' +- + !context + default_groups_ref: [base.group_user] - !record {model: res.users, id: res_hr_timesheet_employee}: company_id: base.main_company name: Employee login: empt password: empt - groups_id: - - base.group_user \ No newline at end of file From eff57d769b8e0792e937353525d291d4f7db53da Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 19 Mar 2013 16:24:35 +0530 Subject: [PATCH 052/110] [IMP]add user access rights as per new improvement bzr revid: sgo@tinyerp.com-20130319105435-es76c9arqghz2rys --- addons/account/test/account_test_users.yml | 10 ++++++---- addons/account_voucher/test/account_voucher_users.yml | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml index 55e57968f50..7f4ccf1ed09 100644 --- a/addons/account/test/account_test_users.yml +++ b/addons/account/test/account_test_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Accountant' +- + !context + default_groups_ref: [account.group_account_user] - !record {model: res.users, id: res_users_account_user}: company_id: base.main_company name: Accountant login: acc password: acc - groups_id: - - account.group_account_user - Create a user as 'Financial Manager' +- + !context + default_groups_ref: [account.group_account_manager] - !record {model: res.users, id: res_users_account_manager}: company_id: base.main_company name: Financial Manager login: fm password: fm - groups_id: - - account.group_account_manager \ No newline at end of file diff --git a/addons/account_voucher/test/account_voucher_users.yml b/addons/account_voucher/test/account_voucher_users.yml index e8a4fa3e612..c1ecb7f59f2 100644 --- a/addons/account_voucher/test/account_voucher_users.yml +++ b/addons/account_voucher/test/account_voucher_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Accountant for voucher' +- + !context + default_groups_ref: [account.group_account_user] - !record {model: res.users, id: res_users_account_voucher_user}: company_id: base.main_company name: Voucher Accountant login: vacc password: acc - groups_id: - - account.group_account_user - Create a user as 'Financial Manager for account voucher' +- + !context + default_groups_ref: [account.group_account_manager] - !record {model: res.users, id: res_users_account_voucher_manager}: company_id: base.main_company name: Financial Manager for voucher login: fmv password: fmv - groups_id: - - account.group_account_manager \ No newline at end of file From 5823dc85635d5817d8cb244a9b496d73ff64b8ac Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 19 Mar 2013 16:56:21 +0530 Subject: [PATCH 053/110] [IMP] add user group in context in all yml files bzr revid: fka@tinyerp.com-20130319112621-ohy33bgzwmtmw8kl --- addons/mrp/test/mrp_users.yml | 10 ++++++---- .../test/workcenter_operations.yml | 5 +++-- addons/mrp_repair/test/mrp_repair_users.yml | 10 ++++++---- addons/purchase/test/ui/purchase_users.yml | 10 ++++++---- .../test/purchase_reqisition_users.yml | 10 ++++++---- addons/sale/test/create_sale_users.yml | 10 ++++++---- addons/sale_stock/test/sale_stock_users.yml | 20 +++++++++++-------- addons/stock/test/stock_users.yml | 10 ++++++---- 8 files changed, 51 insertions(+), 34 deletions(-) diff --git a/addons/mrp/test/mrp_users.yml b/addons/mrp/test/mrp_users.yml index d18cc51e8e6..ccbb37e133c 100644 --- a/addons/mrp/test/mrp_users.yml +++ b/addons/mrp/test/mrp_users.yml @@ -1,20 +1,22 @@ - Create a user as 'MRP Manager' +- + !context + default_groups_ref: [mrp.group_mrp_manager] - !record {model: res.users, id: res_users_mrp_manager}: company_id: base.main_company name: MRP Manager login: mam password: mam - groups_id: - - mrp.group_mrp_manager - Create a user as 'MRP User' +- + !context + default_groups_ref: [mrp.group_mrp_user] - !record {model: res.users, id: res_users_mrp_user}: company_id: base.main_company name: MRP User login: mau password: mau - groups_id: - - mrp.group_mrp_user diff --git a/addons/mrp_operations/test/workcenter_operations.yml b/addons/mrp_operations/test/workcenter_operations.yml index 3bcdc77ecab..14eab36e345 100644 --- a/addons/mrp_operations/test/workcenter_operations.yml +++ b/addons/mrp_operations/test/workcenter_operations.yml @@ -1,13 +1,14 @@ - Create a user as 'MRP User' +- + !context + default_groups_ref: [mrp.group_mrp_user] - !record {model: res.users, id: res_mrp_operation_user}: company_id: base.main_company name: MRP User login: maou password: maou - groups_id: - - mrp.group_mrp_user - In order to test mrp_operations with OpenERP, I refer created production order of PC Assemble SC349 with routing - Manual Component's Assembly to test complete production process with respect of workcenter with giving access rights of MRP User. diff --git a/addons/mrp_repair/test/mrp_repair_users.yml b/addons/mrp_repair/test/mrp_repair_users.yml index dee61653209..986320ed941 100644 --- a/addons/mrp_repair/test/mrp_repair_users.yml +++ b/addons/mrp_repair/test/mrp_repair_users.yml @@ -1,20 +1,22 @@ - Create a user as 'MRP Repair Manager' +- + !context + default_groups_ref: [mrp.group_mrp_manager] - !record {model: res.users, id: res_mrp_repair_manager}: company_id: base.main_company name: MRP Manager login: marm password: marm - groups_id: - - mrp.group_mrp_manager - Create a user as 'MRP Repair User' +- + !context + default_groups_ref: [mrp.group_mrp_user] - !record {model: res.users, id: res_mrp_repair_user}: company_id: base.main_company name: MRP User login: maru password: maru - groups_id: - - mrp.group_mrp_user \ No newline at end of file diff --git a/addons/purchase/test/ui/purchase_users.yml b/addons/purchase/test/ui/purchase_users.yml index e36d8140d28..c0a60955d99 100644 --- a/addons/purchase/test/ui/purchase_users.yml +++ b/addons/purchase/test/ui/purchase_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Purchase manager' +- + !context + default_groups_ref: ['purchase.group_purchase_manager'] - !record {model: res.users, id: res_users_purchase_manager}: company_id: base.main_company name: Purchase Manager login: pm password: pm - groups_id: - - purchase.group_purchase_manager - Create a user as 'Purchase user' +- + !context + default_groups_ref: ['purchase.group_purchase_user'] - !record {model: res.users, id: res_users_purchase_user}: company_id: base.main_company name: Purchase User login: pu password: pu - groups_id: - - purchase.group_purchase_user \ No newline at end of file diff --git a/addons/purchase_requisition/test/purchase_reqisition_users.yml b/addons/purchase_requisition/test/purchase_reqisition_users.yml index abf62286998..9a903cde306 100644 --- a/addons/purchase_requisition/test/purchase_reqisition_users.yml +++ b/addons/purchase_requisition/test/purchase_reqisition_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Purchase Reqisition Manager' +- + !context + default_groups_ref: ['purchase_requisition.group_purchase_requisition_manager'] - !record {model: res.users, id: res_users_purchase_requisition_manager}: company_id: base.main_company name: Purchase Reqisition Manager login: prm password: prm - groups_id: - - purchase_requisition.group_purchase_requisition_manager - Create a user as 'Purchase Reqisition User' +- + !context + default_groups_ref: ['purchase_requisition.group_purchase_requisition_user'] - !record {model: res.users, id: res_users_purchase_requisition_user}: company_id: base.main_company name: Purchase Reqisition User login: pru password: pru - groups_id: - - purchase_requisition.group_purchase_requisition_user \ No newline at end of file diff --git a/addons/sale/test/create_sale_users.yml b/addons/sale/test/create_sale_users.yml index a61c4bd7c99..29e09b38b80 100644 --- a/addons/sale/test/create_sale_users.yml +++ b/addons/sale/test/create_sale_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Salesmanager' +- + !context + default_groups_ref: ['base.group_sale_manager'] - !record {model: res.users, id: res_users_salesmanager}: company_id: base.main_company name: Sales manager login: sm password: sm - groups_id: - - base.group_sale_manager - Create a user as 'Salesman' +- + !context + default_groups_ref: ['base.group_sale_salesman_all_leads'] - !record {model: res.users, id: res_users_salesman}: company_id: base.main_company name: Salesman login: su password: su - groups_id: - - base.group_sale_salesman_all_leads diff --git a/addons/sale_stock/test/sale_stock_users.yml b/addons/sale_stock/test/sale_stock_users.yml index f9bd1cf1727..d64fcac2503 100644 --- a/addons/sale_stock/test/sale_stock_users.yml +++ b/addons/sale_stock/test/sale_stock_users.yml @@ -1,35 +1,41 @@ - Create a user as 'Salesmanager' +- + !context + default_groups_ref: ['base.group_sale_manager'] - !record {model: res.users, id: res_sale_stock_salesmanager}: company_id: base.main_company name: Sales manager login: ssm password: ssm - groups_id: - - base.group_sale_manager - Create a user as 'Salesman' +- + !context + default_groups_ref: ['base.group_sale_salesman_all_leads'] - !record {model: res.users, id: res_sale_stock_salesman}: company_id: base.main_company name: Salesman login: ssu password: ssu - groups_id: - - base.group_sale_salesman_all_leads - Create a user as 'Stock User' +- + !context + default_groups_ref: ['stock.group_stock_user'] - !record {model: res.users, id: res_stock_user}: company_id: base.main_company name: Stock User login: sau password: sau - groups_id: - - stock.group_stock_user - Create a user as 'Stock Manager' +- + !context + default_groups_ref: ['stock.group_stock_manager'] - !record {model: res.users, id: res_stock_manager}: company_id: base.main_company @@ -37,5 +43,3 @@ login: sam password: sam email: admin@portal.example.com - groups_id: - - stock.group_stock_manager \ No newline at end of file diff --git a/addons/stock/test/stock_users.yml b/addons/stock/test/stock_users.yml index 82d48197b0d..13074d752f3 100644 --- a/addons/stock/test/stock_users.yml +++ b/addons/stock/test/stock_users.yml @@ -1,20 +1,22 @@ - Create a user as 'Stock Manager' +- + !context + default_groups_ref: ['stock.group_stock_manager'] - !record {model: res.users, id: res_users_stock_manager}: company_id: base.main_company name: Stock Manager login: sam password: sam - groups_id: - - stock.group_stock_manager - Create a user as 'Stock User' +- + !context + default_groups_ref: ['stock.group_stock_user'] - !record {model: res.users, id: res_users_stock_user}: company_id: base.main_company name: Stock User login: sau password: sau - groups_id: - - stock.group_stock_user From 1e14b224351b5a784479de09ef51fd2306ec19b3 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Wed, 20 Mar 2013 11:10:49 +0530 Subject: [PATCH 054/110] [IMP]add email to user as per new improvement bzr revid: sgo@tinyerp.com-20130320054049-4cr1a52dlpfw2lgf --- addons/account/test/account_test_users.yml | 2 ++ addons/account_voucher/test/account_voucher_users.yml | 2 ++ addons/crm/test/ui/crm_access_group_users.yml | 2 ++ addons/event/test/ui/event_users.yml | 2 ++ addons/hr_recruitment/test/recruitment_process.yml | 1 + addons/mrp/test/mrp_users.yml | 2 ++ addons/mrp_operations/test/workcenter_operations.yml | 1 + addons/mrp_repair/test/mrp_repair_users.yml | 2 ++ addons/project/test/project_users.yml | 2 ++ addons/project_issue/test/issue_users.yml | 2 ++ addons/purchase/test/ui/purchase_users.yml | 2 ++ addons/purchase_requisition/__openerp__.py | 2 +- ..._reqisition_users.yml => purchase_requisition_users.yml} | 6 ++++-- addons/sale/test/create_sale_users.yml | 2 ++ addons/sale_stock/test/sale_stock_users.yml | 5 +++++ addons/stock/test/stock_users.yml | 2 ++ 16 files changed, 34 insertions(+), 3 deletions(-) rename addons/purchase_requisition/test/{purchase_reqisition_users.yml => purchase_requisition_users.yml} (77%) diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml index 7f4ccf1ed09..322bc527ad7 100644 --- a/addons/account/test/account_test_users.yml +++ b/addons/account/test/account_test_users.yml @@ -9,6 +9,7 @@ name: Accountant login: acc password: acc + email: accountuser@yourcompany.com - Create a user as 'Financial Manager' - @@ -20,3 +21,4 @@ name: Financial Manager login: fm password: fm + email: accountmanager@yourcompany.com diff --git a/addons/account_voucher/test/account_voucher_users.yml b/addons/account_voucher/test/account_voucher_users.yml index c1ecb7f59f2..8888885f476 100644 --- a/addons/account_voucher/test/account_voucher_users.yml +++ b/addons/account_voucher/test/account_voucher_users.yml @@ -9,6 +9,7 @@ name: Voucher Accountant login: vacc password: acc + email: accountant@yourcompany.com - Create a user as 'Financial Manager for account voucher' - @@ -20,3 +21,4 @@ name: Financial Manager for voucher login: fmv password: fmv + email: finmanager@yourcompany.com diff --git a/addons/crm/test/ui/crm_access_group_users.yml b/addons/crm/test/ui/crm_access_group_users.yml index 407eb8007e5..158a11b5881 100644 --- a/addons/crm/test/ui/crm_access_group_users.yml +++ b/addons/crm/test/ui/crm_access_group_users.yml @@ -9,6 +9,7 @@ name: Sales manager login: csm password: csm + email: crmmanager@yourcompany.com - Create a user as 'Salesman' - @@ -20,3 +21,4 @@ name: Salesman login: csu password: csu + email: crmuser@yourcompany.com diff --git a/addons/event/test/ui/event_users.yml b/addons/event/test/ui/event_users.yml index e08464bdfd8..92c8316a5d9 100644 --- a/addons/event/test/ui/event_users.yml +++ b/addons/event/test/ui/event_users.yml @@ -9,6 +9,7 @@ name: Event manager login: em password: em + email: eventmanager@yourcompany.com - Create a user as 'Event user' - @@ -20,3 +21,4 @@ name: User login: eu password: eu + email: eventuser@yourcompany.com diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml index c284aeb2181..930f95039f8 100644 --- a/addons/hr_recruitment/test/recruitment_process.yml +++ b/addons/hr_recruitment/test/recruitment_process.yml @@ -9,6 +9,7 @@ name: HR Officer login: hrro password: hrro + email: hrofcr@yourcompany.com - In Order to test process of Recruitment so giving HR officer's rights, - diff --git a/addons/mrp/test/mrp_users.yml b/addons/mrp/test/mrp_users.yml index ccbb37e133c..965a809eddc 100644 --- a/addons/mrp/test/mrp_users.yml +++ b/addons/mrp/test/mrp_users.yml @@ -9,6 +9,7 @@ name: MRP Manager login: mam password: mam + email: mrp_manager@yourcompany.com - Create a user as 'MRP User' - @@ -20,3 +21,4 @@ name: MRP User login: mau password: mau + email: mrp_user@yourcompany.com diff --git a/addons/mrp_operations/test/workcenter_operations.yml b/addons/mrp_operations/test/workcenter_operations.yml index 14eab36e345..3fc5b332d18 100644 --- a/addons/mrp_operations/test/workcenter_operations.yml +++ b/addons/mrp_operations/test/workcenter_operations.yml @@ -9,6 +9,7 @@ name: MRP User login: maou password: maou + email: mrp_operation_user@yourcompany.com - In order to test mrp_operations with OpenERP, I refer created production order of PC Assemble SC349 with routing - Manual Component's Assembly to test complete production process with respect of workcenter with giving access rights of MRP User. diff --git a/addons/mrp_repair/test/mrp_repair_users.yml b/addons/mrp_repair/test/mrp_repair_users.yml index 986320ed941..f7ee95314e2 100644 --- a/addons/mrp_repair/test/mrp_repair_users.yml +++ b/addons/mrp_repair/test/mrp_repair_users.yml @@ -9,6 +9,7 @@ name: MRP Manager login: marm password: marm + email: mrp_repair_manager@yourcompany.com - Create a user as 'MRP Repair User' - @@ -20,3 +21,4 @@ name: MRP User login: maru password: maru + email: mrp_repair_user@yourcompany.com diff --git a/addons/project/test/project_users.yml b/addons/project/test/project_users.yml index ad8503d5f76..8ae3c23dca1 100644 --- a/addons/project/test/project_users.yml +++ b/addons/project/test/project_users.yml @@ -9,6 +9,7 @@ name: Project Manager login: prm password: prm + email: projectmanager@yourcompany.com - Create a user as 'Project user' - @@ -20,3 +21,4 @@ name: Project User login: pru password: pru + email: projectuser@yourcompany.com diff --git a/addons/project_issue/test/issue_users.yml b/addons/project_issue/test/issue_users.yml index 04789eb6334..402478b1c54 100644 --- a/addons/project_issue/test/issue_users.yml +++ b/addons/project_issue/test/issue_users.yml @@ -9,6 +9,7 @@ name: Project Manager login: prim password: prim + email: issuemanager@yourcompany.com - Create a user as 'Project user' - @@ -20,3 +21,4 @@ name: Project User login: priu password: priu + email: issueuser@yourcompany.com diff --git a/addons/purchase/test/ui/purchase_users.yml b/addons/purchase/test/ui/purchase_users.yml index c0a60955d99..9dd5e9c0195 100644 --- a/addons/purchase/test/ui/purchase_users.yml +++ b/addons/purchase/test/ui/purchase_users.yml @@ -9,6 +9,7 @@ name: Purchase Manager login: pm password: pm + email: purchasemanager@yourcompany.com - Create a user as 'Purchase user' - @@ -20,3 +21,4 @@ name: Purchase User login: pu password: pu + email: purchaseuser@yourcompany.com diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index d2a94365318..3f5fce3e8cc 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -43,7 +43,7 @@ keep track and order all your purchase orders. ], 'auto_install': False, 'test': [ - 'test/purchase_reqisition_users.yml', + 'test/purchase_requisition_users.yml', 'test/purchase_requisition_demo.yml', 'test/purchase_requisition.yml', 'test/cancel_purchase_requisition.yml', diff --git a/addons/purchase_requisition/test/purchase_reqisition_users.yml b/addons/purchase_requisition/test/purchase_requisition_users.yml similarity index 77% rename from addons/purchase_requisition/test/purchase_reqisition_users.yml rename to addons/purchase_requisition/test/purchase_requisition_users.yml index 9a903cde306..41bc7cd318e 100644 --- a/addons/purchase_requisition/test/purchase_reqisition_users.yml +++ b/addons/purchase_requisition/test/purchase_requisition_users.yml @@ -6,9 +6,10 @@ - !record {model: res.users, id: res_users_purchase_requisition_manager}: company_id: base.main_company - name: Purchase Reqisition Manager + name: Purchase requisition Manager login: prm password: prm + email: requisition_manager@yourcompany.com - Create a user as 'Purchase Reqisition User' - @@ -17,6 +18,7 @@ - !record {model: res.users, id: res_users_purchase_requisition_user}: company_id: base.main_company - name: Purchase Reqisition User + name: Purchase requisition User login: pru password: pru + email: requisition_user@yourcompany.com diff --git a/addons/sale/test/create_sale_users.yml b/addons/sale/test/create_sale_users.yml index 29e09b38b80..ed575073f5d 100644 --- a/addons/sale/test/create_sale_users.yml +++ b/addons/sale/test/create_sale_users.yml @@ -9,6 +9,7 @@ name: Sales manager login: sm password: sm + email: salesmanager@yourcompany.com - Create a user as 'Salesman' - @@ -20,3 +21,4 @@ name: Salesman login: su password: su + email: salesman@yourcompany.com diff --git a/addons/sale_stock/test/sale_stock_users.yml b/addons/sale_stock/test/sale_stock_users.yml index d64fcac2503..c1ebd54392c 100644 --- a/addons/sale_stock/test/sale_stock_users.yml +++ b/addons/sale_stock/test/sale_stock_users.yml @@ -9,6 +9,7 @@ name: Sales manager login: ssm password: ssm + email: ss_salesmanager@yourcompany.com - Create a user as 'Salesman' - @@ -20,6 +21,7 @@ name: Salesman login: ssu password: ssu + email: ss_salesman@yourcompany.com - Create a user as 'Stock User' - @@ -31,6 +33,8 @@ name: Stock User login: sau password: sau + email: stock_user@yourcompany.com + - Create a user as 'Stock Manager' - @@ -43,3 +47,4 @@ login: sam password: sam email: admin@portal.example.com + email: stock_manager@yourcompany.com diff --git a/addons/stock/test/stock_users.yml b/addons/stock/test/stock_users.yml index 13074d752f3..b8fe0783ca1 100644 --- a/addons/stock/test/stock_users.yml +++ b/addons/stock/test/stock_users.yml @@ -9,6 +9,7 @@ name: Stock Manager login: sam password: sam + email: stockmanager@yourcompany.com - Create a user as 'Stock User' - @@ -20,3 +21,4 @@ name: Stock User login: sau password: sau + email: stockuser@yourcompany.com From 21c4fee43dde9587a42527fbb7a809f1a45b1df0 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Thu, 28 Mar 2013 17:28:01 +0530 Subject: [PATCH 055/110] [IMP]improve mrp yaml bzr revid: sgo@tinyerp.com-20130328115801-kh4k8ctnh3x5oae2 --- addons/mrp/test/order_process.yml | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml index 8aa408483e9..d5cc6dee964 100644 --- a/addons/mrp/test/order_process.yml +++ b/addons/mrp/test/order_process.yml @@ -1,8 +1,3 @@ -- - MRP user can doing all process related to Production Order, so let's check data with giving the access rights of user. -- - !context - uid: 'res_users_mrp_user' - I compute the production order. - @@ -28,6 +23,7 @@ I confirm the Production Order. - !workflow {model: mrp.production, action: button_confirm, ref: mrp_production_test1} + - I check details of Produce Move of Production Order to trace Final Product. - @@ -63,6 +59,16 @@ assert move_line.product_uos.id == order_line.product_uos.id, "UOS is not correspond in 'To consume line'." assert move_line.location_id.id == routing_loc or order.location_src_id.id, "Source location is not correspond in 'To consume line'." assert move_line.location_dest_id.id == source_location_id, "Destination Location is not correspond in 'To consume line'." +- + I consume raw materials and put one material in scrap location due to waste it. +- + !python {model: mrp.production}: | + scrap_location_ids = self.pool.get('stock.location').search(cr, uid, [('scrap_location','=',True)]) + scrap_location_id = scrap_location_ids[0] + order = self.browse(cr, uid, ref("mrp_production_test1")) + for move in order.move_lines: + if move.product_id.id == ref("product.product_product_6"): + move.action_scrap(5.0, scrap_location_id) - I check details of an Internal Shipment after confirmed production order to bring components in Raw Materials Location. - @@ -154,17 +160,6 @@ !python {model: mrp.production}: | order = self.browse(cr, uid, ref("mrp_production_test1")) assert order.state == 'in_production', 'Production order should be in production State.' -- - I consume raw materials and put one material in scrap location due to waste it. -- - !python {model: mrp.production}: | - scrap_location_ids = self.pool.get('stock.location').search(cr, uid, [('scrap_location','=',True)]) - scrap_location_id = scrap_location_ids[0] - order = self.browse(cr, uid, ref("mrp_production_test1")) - for move in order.move_lines: - move.action_consume(move.product_qty) - if move.product_id.id == ref("product.product_product_6"): - move.action_scrap(5.0, scrap_location_id) - I produce product. - From 037f2f590d8da0cdfda22738a727e2beaa1edcdd Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Thu, 28 Mar 2013 18:29:39 +0530 Subject: [PATCH 056/110] [IMP]improve stock shipment.yml bzr revid: sgo@tinyerp.com-20130328125939-06de8aj23spjc5uu --- addons/stock/test/shipment.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 96273a081b7..4c715584756 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -193,7 +193,7 @@ !python {model: stock.location}: | ctx = {'product_id': ref('product_product_6')} monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) - assert monitor_location.stock_real == 136.0, 'stock does not correspond in stock location shop0.' + assert monitor_location.stock_real == 132.0, 'stock does not correspond in stock location shop0.' scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.' @@ -202,8 +202,8 @@ - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert product.qty_available == 136.0, "Stock does not correspond." - assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." + assert product.qty_available == 132.0, "Stock does not correspond." + assert round(product.virtual_available, 2) == -8.00, "Vitual stock does not correspond." - I trace all incoming lots. - @@ -277,5 +277,5 @@ - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert round(product.qty_available, 2) == 6, "Stock does not correspond." - assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." + assert round(product.qty_available, 2) == 2, "Stock does not correspond." + assert round(product.virtual_available, 2) == -8.00, "Vitual stock does not correspond." From 412efcda33bbf48aaff3c94dff5c5b8863cfa9cf Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Thu, 28 Mar 2013 18:37:43 +0530 Subject: [PATCH 057/110] [IMP]improve mrp yaml minor changes bzr revid: sgo@tinyerp.com-20130328130743-ky1hz52gskju1q7t --- addons/mrp/test/order_process.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml index d5cc6dee964..aac6064443d 100644 --- a/addons/mrp/test/order_process.yml +++ b/addons/mrp/test/order_process.yml @@ -1,3 +1,8 @@ +- + MRP user can doing all process related to Production Order, so let's check data with giving the access rights of user. +- + !context + uid: 'res_users_mrp_user' - I compute the production order. - From 94c7156ebe4218836df56f0407c8853345f66827 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Fri, 29 Mar 2013 14:35:58 +0530 Subject: [PATCH 058/110] [IMP]improve stock shipment yml and add test with manager bzr revid: sgo@tinyerp.com-20130329090558-ksv44h3cakskf57l --- addons/stock/test/shipment.yml | 87 ++++------------------------------ 1 file changed, 8 insertions(+), 79 deletions(-) diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 4c715584756..59b6a6aad48 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -1,3 +1,8 @@ +- + Only stock manager can confirm shipment and picking, so let's check data with giving the access rights of manager +- + !context + uid: 'res_users_stock_manager' - I confirm outgoing shipment of 130 unit 15” LCD Monitor. - @@ -91,7 +96,7 @@ !python {model: stock.picking}: | # the cancel is not on the return, but on the incomming shipment (which now has a quantity of 10, thanks to the # backorder). This situation is a little weird as we returned a move that we finally cancelled... As result, only - # 30Kg from the original 50Kg will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity)) + # 30Unit from the original 50Unit will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity)) self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context) - I make invoice of backorder of incomming shipment. @@ -118,41 +123,6 @@ product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 140, "Stock does not correspond." assert product.virtual_available == 0, "Vitual stock does not correspond." -- - I split incomming shipment into lots. each lot contain 10 unit 15” LCD Monitor. -- - !python {model: stock.picking}: | - shipment = self.browse(cr, uid, ref("incomming_shipment")) - move_ids = [x.id for x in shipment.backorder_id.move_lines] - context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids}) -- - !record {model: stock.move.split, id: split_lot_incomming}: - line_ids: - - name: incoming_lot0 - quantity: 10 - - name: incoming_lot1 - quantity: 10 - - name: incoming_lot2 - quantity: 10 - - name: incoming_lot3 - quantity: 10 - -- - !python {model: stock.move.split }: | - self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context) -- - I check move lines after spliting -- - !python {model: stock.move}: | - lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) - lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])]) - assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.' - move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)]) - assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.' - for move in self.browse(cr, uid, move_ids, context=context): - assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond." - assert move.product_qty == 10, "qty does not correspond per production lot." - context.update({'active_model':'stock.move', 'active_id':move_ids[0],'active_ids': move_ids}) - I check the stock valuation account entries. - @@ -170,47 +140,6 @@ else: assert account_move_line.credit == 0.0, "Credit amount does not correspond." assert account_move_line.debit == 10000.0, "Debit amount does not correspond." -- - I consume 1 unit 15” LCD Monitor from each incoming lots into internal production. -- - !record {model: stock.move.consume, id: consume_lot_incomming}: - product_qty: 1 - location_id: location_monitor -- - !python {model: stock.move.consume}: | - self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context) -- - I scrap 1 unit 15” LCD Monitor from each incoming lots into scrap location. -- - !record {model: stock.move.scrap, id: scrap_lot_incomming}: - product_qty: 1 -- - !python {model: stock.move.scrap}: | - self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context) -- - I check stock in scrap location and stock location shop0. -- - !python {model: stock.location}: | - ctx = {'product_id': ref('product_product_6')} - monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) - assert monitor_location.stock_real == 132.0, 'stock does not correspond in stock location shop0.' - scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) - assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.' - -- - I check availabile stock after consumed and scraped. -- - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert product.qty_available == 132.0, "Stock does not correspond." - assert round(product.virtual_available, 2) == -8.00, "Vitual stock does not correspond." -- - I trace all incoming lots. -- - !python {model: stock.production.lot }: | - lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) - lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])]) - self.action_traceability(cr, uid, lot_ids, context=context) - I check outgoing shipment after stock availablity in Chicago shop. - @@ -277,5 +206,5 @@ - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert round(product.qty_available, 2) == 2, "Stock does not correspond." - assert round(product.virtual_available, 2) == -8.00, "Vitual stock does not correspond." + assert round(product.qty_available, 2) == 10, "Stock does not correspond." + From 382171d4174379567a1abe535a0cb3348ccbe089 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Fri, 29 Mar 2013 21:04:03 +0530 Subject: [PATCH 059/110] [IMP]: stock: Improved shipment.yml for split lot problem for stock manager bzr revid: rpa@tinyerp.com-20130329153403-n85d6kwk6edrplor --- addons/stock/stock_demo.yml | 2 +- addons/stock/test/shipment.yml | 191 +++++++++++++++++---------------- 2 files changed, 100 insertions(+), 93 deletions(-) diff --git a/addons/stock/stock_demo.yml b/addons/stock/stock_demo.yml index 64be92f8d06..d925ba4dc8e 100644 --- a/addons/stock/stock_demo.yml +++ b/addons/stock/stock_demo.yml @@ -44,7 +44,7 @@ valuation: real_time cost_method: average property_stock_account_input: account.conf_o_income - property_stock_account_output: account.conf_o_expense + property_stock_account_output: account.a_expense - Stock user can handled production lot,inventory and picking, so let's check data with giving the access rights of user - diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 4c715584756..909050d0483 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -1,3 +1,6 @@ +- + !context + uid: 'res_users_stock_manager' - I confirm outgoing shipment of 130 unit 15” LCD Monitor. - @@ -16,29 +19,68 @@ - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) - product.virtual_available == -30, "Vitual stock is not updated." + assert product.virtual_available == -30, "Vitual stock is not updated." - I confirm incomming shipment of 50 unit 15” LCD Monitor. - !workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment} +- + I split incomming shipment into lots. each lot contain 10 unit 15” LCD Monitor. +- + !python {model: stock.picking}: | + shipment = self.browse(cr, uid, ref("incomming_shipment")) + move_ids = [x.id for x in shipment.move_lines] + context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids}) +- + !record {model: stock.move.split, id: split_lot_incomming}: + line_ids: + - name: incoming_lot0 + quantity: 10 + - name: incoming_lot1 + quantity: 10 + - name: incoming_lot2 + quantity: 10 + - name: incoming_lot3 + quantity: 10 +- + !python {model: stock.move.split }: | + self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context) +- + I check move lines after spliting +- + !python {model: stock.move}: | + mm = self.browse(cr, uid, ref("incomming_shipment_monitor")) + lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) + lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])]) + assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.' + move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)]) + assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.' + for move in self.browse(cr, uid, move_ids, context=context): + assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond." + assert move.product_qty == 10, "qty does not correspond per production lot." - I receive 40 unit 15” LCD Monitor so I make backorder of incomming shipment for 40 unit. - !python {model: stock.partial.picking}: | context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]}) - - !record {model: stock.partial.picking, id: partial_incomming}: - move_ids: - - quantity: 40 - product_id: product_product_6 - product_uom: product.product_uom_unit - move_id: incomming_shipment_monitor - location_id: stock_location_3 - location_dest_id: location_monitor -- - !python {model: stock.partial.picking }: | - self.do_partial(cr, uid, [ref('partial_incomming')], context=context) + !python {model: stock.partial.picking}: | + partial = [] + for move in self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment")).move_lines: + if move.prodlot_id: + partial.append((0, 0, { + 'quantity': move.product_qty, + 'product_id': move.product_id.id, + 'product_uom': move.product_uom.id, + 'move_id': move.id, + 'location_id': move.location_id.id, + 'location_dest_id': move.location_dest_id.id, + 'prodlot_id': move.prodlot_id.id, + 'cost': move.product_id.standard_price + })) + partial_id = self.create(cr, uid, {'move_ids': partial}, context=context) + self.do_partial(cr, uid, [partial_id], context=context) - I check backorder shipment after received partial shipment. - @@ -46,10 +88,12 @@ shipment = self.browse(cr, uid, ref("incomming_shipment")) backorder = shipment.backorder_id assert backorder, "Backorder should be created after partial shipment." - assert backorder.state == 'done', "Backorder should be close after received." + assert backorder.state == 'done', "Backorder should be closed after received." + qty = 0 for move_line in backorder.move_lines: - assert move_line.product_qty == 40, "Qty in backorder does not correspond." assert move_line.state == 'done', "Move line of backorder should be closed." + qty += move_line.product_qty + assert qty == 40, "Qty in backorder does not correspond." - I receive another 10 unit 15” LCD Monitor. - @@ -64,18 +108,16 @@ - !python {model: stock.partial.picking }: | self.do_partial(cr, uid, [ref('partial_incomming')], context=context) - - - I check incomming shipment after received. + I check incomming shipment after receiving it. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("incomming_shipment")) - assert shipment.state == 'done', "shipment should be close after received." + assert shipment.state == 'done', "shipment should be closed after receiving." for move_line in shipment.move_lines: assert move_line.product_qty == 10, "Qty does not correspond." assert move_line.product_id.virtual_available == 20, "Virtual stock does not correspond." assert move_line.state == 'done', "Move line should be closed." - - I return last incomming shipment for 10 unit 15” LCD Monitor. - @@ -91,7 +133,7 @@ !python {model: stock.picking}: | # the cancel is not on the return, but on the incomming shipment (which now has a quantity of 10, thanks to the # backorder). This situation is a little weird as we returned a move that we finally cancelled... As result, only - # 30Kg from the original 50Kg will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity)) + # 30Unit from the original 50Unit will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity)) self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context) - I make invoice of backorder of incomming shipment. @@ -118,41 +160,6 @@ product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 140, "Stock does not correspond." assert product.virtual_available == 0, "Vitual stock does not correspond." -- - I split incomming shipment into lots. each lot contain 10 unit 15” LCD Monitor. -- - !python {model: stock.picking}: | - shipment = self.browse(cr, uid, ref("incomming_shipment")) - move_ids = [x.id for x in shipment.backorder_id.move_lines] - context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids}) -- - !record {model: stock.move.split, id: split_lot_incomming}: - line_ids: - - name: incoming_lot0 - quantity: 10 - - name: incoming_lot1 - quantity: 10 - - name: incoming_lot2 - quantity: 10 - - name: incoming_lot3 - quantity: 10 - -- - !python {model: stock.move.split }: | - self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context) -- - I check move lines after spliting -- - !python {model: stock.move}: | - lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) - lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])]) - assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.' - move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)]) - assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.' - for move in self.browse(cr, uid, move_ids, context=context): - assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond." - assert move.product_qty == 10, "qty does not correspond per production lot." - context.update({'active_model':'stock.move', 'active_id':move_ids[0],'active_ids': move_ids}) - I check the stock valuation account entries. - @@ -165,45 +172,11 @@ for account_move_line in account_move.line_id: for stock_move in incomming_shipment.move_lines: if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id: - assert account_move_line.credit == 10000.0, "Credit amount does not correspond." + assert account_move_line.credit == 14000.0, "Credit amount does not correspond." assert account_move_line.debit == 0.0, "Debit amount does not correspond." else: assert account_move_line.credit == 0.0, "Credit amount does not correspond." - assert account_move_line.debit == 10000.0, "Debit amount does not correspond." -- - I consume 1 unit 15” LCD Monitor from each incoming lots into internal production. -- - !record {model: stock.move.consume, id: consume_lot_incomming}: - product_qty: 1 - location_id: location_monitor -- - !python {model: stock.move.consume}: | - self.do_move_consume(cr, uid, [ref('consume_lot_incomming')], context=context) -- - I scrap 1 unit 15” LCD Monitor from each incoming lots into scrap location. -- - !record {model: stock.move.scrap, id: scrap_lot_incomming}: - product_qty: 1 -- - !python {model: stock.move.scrap}: | - self.move_scrap(cr, uid, [ref('scrap_lot_incomming')], context=context) -- - I check stock in scrap location and stock location shop0. -- - !python {model: stock.location}: | - ctx = {'product_id': ref('product_product_6')} - monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) - assert monitor_location.stock_real == 132.0, 'stock does not correspond in stock location shop0.' - scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) - assert scrapped_location.stock_real == 1*4, 'scraped stock does not correspond in scrap location.' - -- - I check availabile stock after consumed and scraped. -- - !python {model: product.product}: | - product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert product.qty_available == 132.0, "Stock does not correspond." - assert round(product.virtual_available, 2) == -8.00, "Vitual stock does not correspond." + assert account_move_line.debit == 14000.0, "Debit amount does not correspond." - I trace all incoming lots. - @@ -221,6 +194,40 @@ for move_line in shipment.move_lines: assert move_line.state == "assigned", "Move should be assigned." self.force_assign(cr, uid, [shipment.id]) + context.update({'active_model':'stock.move', 'active_id':shipment.move_lines[0].id,'active_ids': [shipment.move_lines[0].id]}) +- + I scrap 4 units of 15” LCD Monitor into scrap location. +- + !record {model: stock.move.scrap, id: scrap_monitor1}: + product_qty: 4 +- + !python {model: stock.move.scrap}: | + self.move_scrap(cr, uid, [ref('scrap_monitor1')], context=context) +- + I consume 4 units of 15” LCD Monitor. +- + !record {model: stock.move.consume, id: consume_monitor1}: + product_qty: 4 + location_id: location_monitor +- + !python {model: stock.move.consume}: | + self.do_move_consume(cr, uid, [ref('consume_monitor1')], context=context) +- + I check stock in scrap location and stock location shop0. +- + !python {model: stock.location}: | + ctx = {'product_id': ref('product_product_6')} + monitor_location = self.pool.get('stock.location').browse(cr, uid, ref('location_monitor'), context=ctx) + assert monitor_location.stock_real == 132.0, 'stock does not correspond in stock location shop0.' + scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) + assert scrapped_location.stock_real == 4, 'scraped stock does not correspond in scrap location.' +- + I check availabile stock after consumed and scraped. +- + !python {model: product.product}: | + product = self.browse(cr, uid, ref('product_product_6'), context=context) + assert product.qty_available == 132.0, "Stock does not correspond." + assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." - I deliver 5 unit 15” LCD Monitor to customer so I make partial deliver - @@ -277,5 +284,5 @@ - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert round(product.qty_available, 2) == 2, "Stock does not correspond." - assert round(product.virtual_available, 2) == -8.00, "Vitual stock does not correspond." + assert round(product.qty_available, 2) == 6, "Stock does not correspond." + assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." From 70995ec63dce5ca4191d1e3326b9961a6c38c8e0 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Fri, 29 Mar 2013 21:13:18 +0530 Subject: [PATCH 060/110] [FIX]: stock: Fixed typo and grammar in shipment.yml bzr revid: rpa@tinyerp.com-20130329154318-2wswvugrl17ncy9l --- addons/stock/test/shipment.yml | 112 ++++++++++++++++----------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 909050d0483..75249aea842 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -2,11 +2,11 @@ !context uid: 'res_users_stock_manager' - - I confirm outgoing shipment of 130 unit 15” LCD Monitor. + I confirm outgoing shipment of 130 Unit 15” LCD Monitor. - !workflow {model: stock.picking, action: button_confirm, ref: outgoing_shipment} - - I check shipment details after confirmed. + I check shipment details after confirmation. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("outgoing_shipment")) @@ -15,25 +15,25 @@ assert move_line.state == "confirmed", "Move should be confirmed." - - Now I check vitual stock of 15” LCD Monitor after confirmed outgoing shipment. + Now, I check virtual stock of 15” LCD Monitor after confirming outgoing shipment. - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) - assert product.virtual_available == -30, "Vitual stock is not updated." + assert product.virtual_available == -30, "Virtual stock is not updated." - - I confirm incomming shipment of 50 unit 15” LCD Monitor. + I confirm incoming shipment of 50 Unit 15” LCD Monitor. - - !workflow {model: stock.picking, action: button_confirm, ref: incomming_shipment} + !workflow {model: stock.picking, action: button_confirm, ref: incoming_shipment} - - I split incomming shipment into lots. each lot contain 10 unit 15” LCD Monitor. + I split incoming shipment into lots. each lot contain 10 Unit 15” LCD Monitor. - !python {model: stock.picking}: | - shipment = self.browse(cr, uid, ref("incomming_shipment")) + shipment = self.browse(cr, uid, ref("incoming_shipment")) move_ids = [x.id for x in shipment.move_lines] context.update({'active_model': 'stock.move', 'active_id': move_ids[0], 'active_ids': move_ids}) - - !record {model: stock.move.split, id: split_lot_incomming}: + !record {model: stock.move.split, id: split_lot_incoming}: line_ids: - name: incoming_lot0 quantity: 10 @@ -45,29 +45,29 @@ quantity: 10 - !python {model: stock.move.split }: | - self.split_lot(cr, uid, [ref('split_lot_incomming')], context=context) + self.split_lot(cr, uid, [ref('split_lot_incoming')], context=context) - - I check move lines after spliting + I check move lines after splitting. - !python {model: stock.move}: | - mm = self.browse(cr, uid, ref("incomming_shipment_monitor")) - lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) + mm = self.browse(cr, uid, ref("incoming_shipment_monitor")) + lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incoming'), context=context) lot_ids = self.pool.get('stock.production.lot').search(cr, uid, [('name','in',[x.name for x in lot.line_ids])]) - assert len(lot_ids) == 4, 'lots of incomming shipment are not correspond.' + assert len(lot_ids) == 4, 'lots of incoming shipment are not correspond.' move_ids = self.search(cr, uid, [('location_dest_id','=',ref('location_monitor')),('prodlot_id','in',lot_ids)]) - assert len(move_ids) == 4, 'move lines are not correspond per prodcution lot after splited.' + assert len(move_ids) == 4, 'move lines are not correspond per production lot after splitting.' for move in self.browse(cr, uid, move_ids, context=context): assert move.prodlot_id.name in ['incoming_lot0', 'incoming_lot1', 'incoming_lot2', 'incoming_lot3'], "lot does not correspond." assert move.product_qty == 10, "qty does not correspond per production lot." - - I receive 40 unit 15” LCD Monitor so I make backorder of incomming shipment for 40 unit. + I receive 40 units of 15” LCD Monitor. - !python {model: stock.partial.picking}: | - context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]}) + context.update({'active_model': 'stock.picking', 'active_id': ref('incoming_shipment'), 'active_ids': [ref('incoming_shipment')]}) - !python {model: stock.partial.picking}: | partial = [] - for move in self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment")).move_lines: + for move in self.pool.get('stock.picking').browse(cr, uid, ref("incoming_shipment")).move_lines: if move.prodlot_id: partial.append((0, 0, { 'quantity': move.product_qty, @@ -82,10 +82,10 @@ partial_id = self.create(cr, uid, {'move_ids': partial}, context=context) self.do_partial(cr, uid, [partial_id], context=context) - - I check backorder shipment after received partial shipment. + I check backorder shipment after receiving partial shipment. - !python {model: stock.picking}: | - shipment = self.browse(cr, uid, ref("incomming_shipment")) + shipment = self.browse(cr, uid, ref("incoming_shipment")) backorder = shipment.backorder_id assert backorder, "Backorder should be created after partial shipment." assert backorder.state == 'done', "Backorder should be closed after received." @@ -95,82 +95,82 @@ qty += move_line.product_qty assert qty == 40, "Qty in backorder does not correspond." - - I receive another 10 unit 15” LCD Monitor. + I receive another 10 units of 15” LCD Monitor. - - !record {model: stock.partial.picking, id: partial_incomming}: + !record {model: stock.partial.picking, id: partial_incoming}: move_ids: - quantity: 10 product_id: product_product_6 product_uom: product.product_uom_unit - move_id: incomming_shipment_monitor + move_id: incoming_shipment_monitor location_id: stock_location_3 location_dest_id: location_monitor - !python {model: stock.partial.picking }: | - self.do_partial(cr, uid, [ref('partial_incomming')], context=context) + self.do_partial(cr, uid, [ref('partial_incoming')], context=context) - - I check incomming shipment after receiving it. + I check incoming shipment after receiving it. - !python {model: stock.picking}: | - shipment = self.browse(cr, uid, ref("incomming_shipment")) + shipment = self.browse(cr, uid, ref("incoming_shipment")) assert shipment.state == 'done', "shipment should be closed after receiving." for move_line in shipment.move_lines: assert move_line.product_qty == 10, "Qty does not correspond." assert move_line.product_id.virtual_available == 20, "Virtual stock does not correspond." assert move_line.state == 'done', "Move line should be closed." - - I return last incomming shipment for 10 unit 15” LCD Monitor. + I return last incoming shipment for 10 Unit 15” LCD Monitor. - - !record {model: stock.return.picking, id: return_incomming}: + !record {model: stock.return.picking, id: return_incoming}: invoice_state: none - !python {model: stock.return.picking }: | # this work without giving the id of the picking to return, magically, thanks to the context - self.create_returns(cr, uid, [ref('return_incomming')], context=context) + self.create_returns(cr, uid, [ref('return_incoming')], context=context) - - I cancel incomming shipment after return it. + I cancel incoming shipment after returning it. - !python {model: stock.picking}: | - # the cancel is not on the return, but on the incomming shipment (which now has a quantity of 10, thanks to the + # the cancel is not on the return, but on the incoming shipment (which now has a quantity of 10, thanks to the # backorder). This situation is a little weird as we returned a move that we finally cancelled... As result, only # 30Unit from the original 50Unit will be counted in the stock (50 - 10 (cancelled quantity) - 10 (returned quantity)) - self.action_cancel(cr, uid, [ref("incomming_shipment")], context=context) + self.action_cancel(cr, uid, [ref("incoming_shipment")], context=context) - - I make invoice of backorder of incomming shipment. + I make invoice of backorder of incoming shipment. - !python {model: stock.invoice.onshipping}: | - shipment = self.pool.get('stock.picking').browse(cr, uid, ref("incomming_shipment")) + shipment = self.pool.get('stock.picking').browse(cr, uid, ref("incoming_shipment")) context.update({'active_model': 'stock.picking', 'active_id': shipment.backorder_id.id, 'active_ids': [shipment.backorder_id.id]}) - - !record {model: stock.invoice.onshipping, id: invoice_incomming}: + !record {model: stock.invoice.onshipping, id: invoice_incoming}: group: False - !python {model: stock.invoice.onshipping }: | - self.create_invoice(cr, uid, [ref('invoice_incomming')], context=context) + self.create_invoice(cr, uid, [ref('invoice_incoming')], context=context) - - I check invoice state of backorder of incomming shipment. + I check invoice status of backorder of incoming shipment. - !python {model: stock.picking}: | - shipment = self.browse(cr, uid, ref("incomming_shipment")) - assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not upadted.' + shipment = self.browse(cr, uid, ref("incoming_shipment")) + assert shipment.backorder_id.invoice_state == 'invoiced', 'Invoice state is not updated.' - - I check available stock after received incomming shipping. + I check available stock after receiving incoming shipping. - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 140, "Stock does not correspond." - assert product.virtual_available == 0, "Vitual stock does not correspond." + assert product.virtual_available == 0, "Virtual stock does not correspond." - I check the stock valuation account entries. - !python {model: account.move}: | - incomming_shipment = self.pool.get('stock.picking').browse(cr, uid, ref('incomming_shipment'), context=context) - account_move_ids = self.search(cr, uid, [('ref','=',incomming_shipment.name)]) + incoming_shipment = self.pool.get('stock.picking').browse(cr, uid, ref('incoming_shipment'), context=context) + account_move_ids = self.search(cr, uid, [('ref','=',incoming_shipment.name)]) assert len(account_move_ids), "account move should be created." account_move = self.browse(cr, uid, account_move_ids[0], context=context) - assert len(account_move.line_id) == len(incomming_shipment.move_lines) + 1, 'accuont entries are not correspond.' + assert len(account_move.line_id) == len(incoming_shipment.move_lines) + 1, 'Accounting entries does not correspond.' for account_move_line in account_move.line_id: - for stock_move in incomming_shipment.move_lines: + for stock_move in incoming_shipment.move_lines: if account_move_line.account_id.id == stock_move.product_id.property_stock_account_input.id: assert account_move_line.credit == 14000.0, "Credit amount does not correspond." assert account_move_line.debit == 0.0, "Debit amount does not correspond." @@ -181,11 +181,11 @@ I trace all incoming lots. - !python {model: stock.production.lot }: | - lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incomming'), context=context) + lot = self.pool.get('stock.move.split').browse(cr, uid, ref('split_lot_incoming'), context=context) lot_ids = self.search(cr, uid, [('name', 'in', [x.name for x in lot.line_ids])]) self.action_traceability(cr, uid, lot_ids, context=context) - - I check outgoing shipment after stock availablity in Chicago shop. + I check outgoing shipment after stock availability in Chicago shop. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context) @@ -213,7 +213,7 @@ !python {model: stock.move.consume}: | self.do_move_consume(cr, uid, [ref('consume_monitor1')], context=context) - - I check stock in scrap location and stock location shop0. + I check stock in scrap location and stock location. - !python {model: stock.location}: | ctx = {'product_id': ref('product_product_6')} @@ -222,14 +222,14 @@ scrapped_location = self.browse(cr, uid, ref('stock_location_scrapped'), context=ctx) assert scrapped_location.stock_real == 4, 'scraped stock does not correspond in scrap location.' - - I check availabile stock after consumed and scraped. + I check available stock after consumed and scraped move. - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) assert product.qty_available == 132.0, "Stock does not correspond." - assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." + assert round(product.virtual_available, 2) == -4.00, "Virtual stock does not correspond." - - I deliver 5 unit 15” LCD Monitor to customer so I make partial deliver + I deliver 5 Unit 15” LCD Monitor to customer partially. - !python {model: stock.partial.move}: | context.update({'active_model': 'stock.move', 'active_id': ref('outgoing_shipment_monitor'), 'active_ids': [ref('outgoing_shipment_monitor')]}) @@ -247,7 +247,7 @@ self.do_partial(cr, uid, [ref('partial_outgoing_monitor')], context=context) - - I packing outgoing shipment into box per 10 unit with unique tracking lot. + I pack outgoing shipment into box of 10 Unit with unique tracking lot. - !python {model: stock.move}: | stock_split = self.pool.get('stock.split.into') @@ -260,7 +260,7 @@ stock_split.split(cr, uid, [split_id], context=context) total_qty -= split_qty - - I deliver outgoing shipment. + I deliver the outgoing shipment. - !python {model: stock.partial.picking}: | context.update({'active_model': 'stock.picking', 'active_id': ref('outgoing_shipment'), 'active_ids': [ref('outgoing_shipment')]}) @@ -272,7 +272,7 @@ self.do_partial(cr, uid, [ref('partial_outgoing')], context=context) - - I check outgoing shipment after deliver. + I check outgoing shipment after delivery. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("outgoing_shipment"), context=context) @@ -280,9 +280,9 @@ for move_line in shipment.move_lines: assert move_line.state == "done", "Move should be closed." - - I check availaible stock after deliver. + I check available stock after delivery. - !python {model: product.product}: | product = self.browse(cr, uid, ref('product_product_6'), context=context) assert round(product.qty_available, 2) == 6, "Stock does not correspond." - assert round(product.virtual_available, 2) == -4.00, "Vitual stock does not correspond." + assert round(product.virtual_available, 2) == -4.00, "Virtual stock does not correspond." From 5848f817fbb7fed0d3cddfec27886952a2a03ff2 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 1 Apr 2013 12:13:59 +0530 Subject: [PATCH 061/110] [IMP]add string in shipment yml bzr revid: sgo@tinyerp.com-20130401064359-40s1a4azsvd2099v --- addons/stock/test/shipment.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/stock/test/shipment.yml b/addons/stock/test/shipment.yml index 86b4a092108..5f2f4686621 100644 --- a/addons/stock/test/shipment.yml +++ b/addons/stock/test/shipment.yml @@ -1,3 +1,5 @@ +- + Stock manager can only test whole process related to Shipment, so let's check data with stock manager. - !context uid: 'res_users_stock_manager' From 2a7bb9a9100011088d1f7240ea265881ba1410de Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Wed, 17 Apr 2013 16:05:44 +0530 Subject: [PATCH 062/110] [IMP]Improve yml for issue demo which creates duplicate issue and improve code bzr revid: sgo@tinyerp.com-20130417103544-df29vwms1lc5xq6t --- addons/project_issue/test/issue_demo.yml | 4 ---- addons/project_issue/test/subscribe_issue.yml | 5 ----- 2 files changed, 9 deletions(-) diff --git a/addons/project_issue/test/issue_demo.yml b/addons/project_issue/test/issue_demo.yml index 7040b631f46..b7342b435ab 100644 --- a/addons/project_issue/test/issue_demo.yml +++ b/addons/project_issue/test/issue_demo.yml @@ -3,10 +3,6 @@ - !context uid: 'res_users_project_issue_user' -- - !record {model: project.issue, id: project_task_1, view: False}: - task_id: 'project.project_task_17' - name: 'Error in account module' - !record {model: project.issue, id: project01, view: False}: project_id: 'project.project_project_2' diff --git a/addons/project_issue/test/subscribe_issue.yml b/addons/project_issue/test/subscribe_issue.yml index e07c8704a14..8d7b038dccc 100644 --- a/addons/project_issue/test/subscribe_issue.yml +++ b/addons/project_issue/test/subscribe_issue.yml @@ -1,8 +1,3 @@ -- - Project user can subscribe issue, so let's check data with giving the access rights of user. -- - !context - uid: 'res_users_project_issue_user' - In Order to test process of Issue in OpenERP, Customer send the issue by email. - From bbd2c2ea5e939e6db529742754093def84e9a84c Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 29 Apr 2013 16:10:42 +0530 Subject: [PATCH 063/110] [IMP]give access rights for contact creation bzr revid: sgo@tinyerp.com-20130429104042-1elyyf00shx03rsk --- addons/account/test/account_test_users.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml index 322bc527ad7..be89afefdd1 100644 --- a/addons/account/test/account_test_users.yml +++ b/addons/account/test/account_test_users.yml @@ -2,7 +2,7 @@ Create a user as 'Accountant' - !context - default_groups_ref: [account.group_account_user] + default_groups_ref: [base.group_partner_manager,account.group_account_user] - !record {model: res.users, id: res_users_account_user}: company_id: base.main_company From 2f19755c2a46a1c03af81279390013bf333ad4ca Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 29 Apr 2013 16:57:39 +0530 Subject: [PATCH 064/110] [IMP]give access rights for contact creation in account voucher yml user bzr revid: sgo@tinyerp.com-20130429112739-f06w3v6g7q9wi2fh --- addons/account_voucher/test/account_voucher_users.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account_voucher/test/account_voucher_users.yml b/addons/account_voucher/test/account_voucher_users.yml index 8888885f476..0dd8fa528b5 100644 --- a/addons/account_voucher/test/account_voucher_users.yml +++ b/addons/account_voucher/test/account_voucher_users.yml @@ -2,7 +2,7 @@ Create a user as 'Accountant for voucher' - !context - default_groups_ref: [account.group_account_user] + default_groups_ref: [base.group_partner_manager,account.group_account_user] - !record {model: res.users, id: res_users_account_voucher_user}: company_id: base.main_company @@ -14,7 +14,7 @@ Create a user as 'Financial Manager for account voucher' - !context - default_groups_ref: [account.group_account_manager] + default_groups_ref: [base.group_partner_manager,account.group_account_manager] - !record {model: res.users, id: res_users_account_voucher_manager}: company_id: base.main_company From d947b32b96e4e5934483ce2a3b57d4a0697daa85 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 30 Apr 2013 16:20:12 +0530 Subject: [PATCH 065/110] [IMP]remove delete access rights from ir_model_data for all user which are not needed bzr revid: sgo@tinyerp.com-20130430105012-damnh3zqdr9wdap1 --- openerp/addons/base/security/ir.model.access.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv index 3a29108d61e..e104f485a51 100644 --- a/openerp/addons/base/security/ir.model.access.csv +++ b/openerp/addons/base/security/ir.model.access.csv @@ -17,7 +17,7 @@ "access_ir_model_constraint","ir_model_constraint","model_ir_model_constraint",,1,0,0,0 "access_ir_model_relation","ir_model_relation","model_ir_model_relation",,1,0,0,0 "access_ir_model_access_all","ir_model_access_all","model_ir_model_access",,1,0,0,0 -"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,1,1,1 +"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,1,1,0 "access_ir_model_fields_all","ir_model_fields all","model_ir_model_fields",,1,0,0,0 "access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category",,1,0,0,0 "access_ir_module_module_group_user","ir_module_module group_user","model_ir_module_module","group_system",1,1,1,1 From ed220968a3f02ee43b5ca542053eae28864f9ad6 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 6 May 2013 15:09:10 +0530 Subject: [PATCH 066/110] [MERGE]put yml in test from demo in purchase bzr revid: sgo@tinyerp.com-20130506093910-mlyc8a1a1hz4y433 --- addons/purchase/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/purchase/__openerp__.py b/addons/purchase/__openerp__.py index b75c84e332b..9d72579cc77 100644 --- a/addons/purchase/__openerp__.py +++ b/addons/purchase/__openerp__.py @@ -67,6 +67,7 @@ Dashboard / Reports for Purchase Management will include: 'res_config_view.xml', ], 'test': [ + 'test/ui/purchase_users.yml', 'test/process/cancel_order.yml', 'test/process/rfq2order2done.yml', 'test/process/generate_invoice_from_reception.yml', @@ -79,7 +80,6 @@ Dashboard / Reports for Purchase Management will include: 'test/ui/delete_order.yml', ], 'demo': [ - 'test/ui/purchase_users.yml', 'purchase_order_demo.yml', 'purchase_demo.xml', ], From ca60821869332c95d0959e8645f16865d66be531 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 6 May 2013 17:05:57 +0530 Subject: [PATCH 067/110] [IMP]improve yml code bzr revid: sgo@tinyerp.com-20130506113557-mh99n29zv2ve5pv3 --- addons/purchase/purchase_order_demo.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/purchase/purchase_order_demo.yml b/addons/purchase/purchase_order_demo.yml index fb49bfc1248..7a0fae7ef68 100644 --- a/addons/purchase/purchase_order_demo.yml +++ b/addons/purchase/purchase_order_demo.yml @@ -1,8 +1,5 @@ - Give access rights of Purchase user to create purchase order -- - !context - uid: 'res_users_purchase_user' - !record {model: purchase.order, id: purchase_order_1}: partner_id: base.res_partner_1 From 5f203720edba35397296bdea2262706b2c3ebeb7 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 11:59:14 +0530 Subject: [PATCH 068/110] [IMP]remove default_groups_ref and added to groups_id in yml in account and account_Voucher bzr revid: sgo@tinyerp.com-20130507062914-t8bmem3auvjob5bl --- addons/account/test/account_test_users.yml | 19 +++++++++++----- .../test/account_voucher_users.yml | 22 +++++++++++++------ 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml index be89afefdd1..3b0fd72f0bf 100644 --- a/addons/account/test/account_test_users.yml +++ b/addons/account/test/account_test_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Accountant' -- - !context - default_groups_ref: [base.group_partner_manager,account.group_account_user] - !record {model: res.users, id: res_users_account_user}: company_id: base.main_company @@ -11,10 +8,14 @@ password: acc email: accountuser@yourcompany.com - - Create a user as 'Financial Manager' + I added groups for Accountant which needed. - - !context - default_groups_ref: [account.group_account_manager] + !record {model: res.users, id: res_users_account_user}: + groups_id: + - account.group_account_user + - base.group_partner_manager +- + Create a user as 'Financial Manager' - !record {model: res.users, id: res_users_account_manager}: company_id: base.main_company @@ -22,3 +23,9 @@ login: fm password: fm email: accountmanager@yourcompany.com +- + I added groups for Financial Manager which needed. +- + !record {model: res.users, id: res_users_account_manager}: + groups_id: + - account.group_account_manager \ No newline at end of file diff --git a/addons/account_voucher/test/account_voucher_users.yml b/addons/account_voucher/test/account_voucher_users.yml index 0dd8fa528b5..feb19c0e3fb 100644 --- a/addons/account_voucher/test/account_voucher_users.yml +++ b/addons/account_voucher/test/account_voucher_users.yml @@ -1,8 +1,5 @@ - - Create a user as 'Accountant for voucher' -- - !context - default_groups_ref: [base.group_partner_manager,account.group_account_user] + Create a user as 'Accountant for account voucher' - !record {model: res.users, id: res_users_account_voucher_user}: company_id: base.main_company @@ -11,10 +8,14 @@ password: acc email: accountant@yourcompany.com - - Create a user as 'Financial Manager for account voucher' + I added groups to Accountant for account voucher which needed. - - !context - default_groups_ref: [base.group_partner_manager,account.group_account_manager] + !record {model: res.users, id: res_users_account_voucher_user}: + groups_id: + - base.group_partner_manager + - account.group_account_user +- + Create a user as 'Financial Manager for account voucher' - !record {model: res.users, id: res_users_account_voucher_manager}: company_id: base.main_company @@ -22,3 +23,10 @@ login: fmv password: fmv email: finmanager@yourcompany.com +- + I added groups to Financial Manager for account voucher which needed. +- + !record {model: res.users, id: res_users_account_voucher_manager}: + groups_id: + - base.group_partner_manager + - account.group_account_manager From 0f312151471b625c7ade63004d8293eb8ad950f2 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 12:34:46 +0530 Subject: [PATCH 069/110] [IMP]done changes as per new yml changes in crm bzr revid: sgo@tinyerp.com-20130507070446-ejlju0cnui74vy21 --- addons/crm/__openerp__.py | 2 +- addons/crm/test/{ui => }/crm_access_group_users.yml | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename addons/crm/test/{ui => }/crm_access_group_users.yml (100%) diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py index ac0a06a384c..bc74c3350ac 100644 --- a/addons/crm/__openerp__.py +++ b/addons/crm/__openerp__.py @@ -106,7 +106,7 @@ Dashboard for CRM will include: 'crm_action_rule_demo.xml', ], 'test': [ - 'test/ui/crm_access_group_users.yml', + 'test/crm_access_group_users.yml', 'test/crm_lead_message.yml', 'test/lead2opportunity2win.yml', 'test/lead2opportunity_assign_salesmen.yml', diff --git a/addons/crm/test/ui/crm_access_group_users.yml b/addons/crm/test/crm_access_group_users.yml similarity index 100% rename from addons/crm/test/ui/crm_access_group_users.yml rename to addons/crm/test/crm_access_group_users.yml From 1373b5cda00c791b3c9a229dd0ef10a28c723679 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 12:49:59 +0530 Subject: [PATCH 070/110] [IMP]improve string and add groups in groups_id in crm and event bzr revid: sgo@tinyerp.com-20130507071959-kwqmv7wwy7gqcsfj --- addons/account/test/account_test_users.yml | 4 ++-- .../test/account_voucher_users.yml | 4 ++-- addons/crm/test/crm_access_group_users.yml | 18 ++++++++++++------ addons/event/test/ui/event_users.yml | 18 ++++++++++++------ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml index 3b0fd72f0bf..b257feedff8 100644 --- a/addons/account/test/account_test_users.yml +++ b/addons/account/test/account_test_users.yml @@ -8,7 +8,7 @@ password: acc email: accountuser@yourcompany.com - - I added groups for Accountant which needed. + I added groups for Accountant. - !record {model: res.users, id: res_users_account_user}: groups_id: @@ -24,7 +24,7 @@ password: fm email: accountmanager@yourcompany.com - - I added groups for Financial Manager which needed. + I added groups for Financial Manager. - !record {model: res.users, id: res_users_account_manager}: groups_id: diff --git a/addons/account_voucher/test/account_voucher_users.yml b/addons/account_voucher/test/account_voucher_users.yml index feb19c0e3fb..c96645f0190 100644 --- a/addons/account_voucher/test/account_voucher_users.yml +++ b/addons/account_voucher/test/account_voucher_users.yml @@ -8,7 +8,7 @@ password: acc email: accountant@yourcompany.com - - I added groups to Accountant for account voucher which needed. + I added groups to Accountant for account voucher. - !record {model: res.users, id: res_users_account_voucher_user}: groups_id: @@ -24,7 +24,7 @@ password: fmv email: finmanager@yourcompany.com - - I added groups to Financial Manager for account voucher which needed. + I added groups to Financial Manager for account voucher. - !record {model: res.users, id: res_users_account_voucher_manager}: groups_id: diff --git a/addons/crm/test/crm_access_group_users.yml b/addons/crm/test/crm_access_group_users.yml index 158a11b5881..50ee9ed5367 100644 --- a/addons/crm/test/crm_access_group_users.yml +++ b/addons/crm/test/crm_access_group_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Salesmanager' -- - !context - default_groups_ref: ['base.group_sale_manager'] - !record {model: res.users, id: crm_res_users_salesmanager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: csm email: crmmanager@yourcompany.com - - Create a user as 'Salesman' + I added groups for Salesmanager. - - !context - default_groups_ref: ['base.group_sale_salesman_all_leads'] + !record {model: res.users, id: crm_res_users_salesmanager}: + groups_id: + - base.group_sale_manager +- + Create a user as 'Salesman' - !record {model: res.users, id: crm_res_users_salesman}: company_id: base.main_company @@ -22,3 +22,9 @@ login: csu password: csu email: crmuser@yourcompany.com +- + I added groups for Salesman. +- + !record {model: res.users, id: crm_res_users_salesman}: + groups_id: + - base.group_sale_salesman_all_leads diff --git a/addons/event/test/ui/event_users.yml b/addons/event/test/ui/event_users.yml index 92c8316a5d9..b6927dbdaa6 100644 --- a/addons/event/test/ui/event_users.yml +++ b/addons/event/test/ui/event_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Event manager' -- - !context - default_groups_ref: [event.group_event_manager] - !record {model: res.users, id: res_users_eventmanager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: em email: eventmanager@yourcompany.com - - Create a user as 'Event user' + I added groups for Event manager. - - !context - default_groups_ref: [event.group_event_user] + !record {model: res.users, id: res_users_eventmanager}: + groups_id: + - event.group_event_manager +- + Create a user as 'Event user' - !record {model: res.users, id: res_users_eventuser}: company_id: base.main_company @@ -22,3 +22,9 @@ login: eu password: eu email: eventuser@yourcompany.com +- + I added groups for Event manager. +- + !record {model: res.users, id: res_users_eventuser}: + groups_id: + - event.group_event_user From 5f629a2f0bb5a582d366097927eae36321959b95 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 12:57:22 +0530 Subject: [PATCH 071/110] [IMP]improve string bzr revid: sgo@tinyerp.com-20130507072722-jf0912rfbakddo36 --- addons/event/test/ui/event_users.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/event/test/ui/event_users.yml b/addons/event/test/ui/event_users.yml index b6927dbdaa6..cda4ebda750 100644 --- a/addons/event/test/ui/event_users.yml +++ b/addons/event/test/ui/event_users.yml @@ -23,7 +23,7 @@ password: eu email: eventuser@yourcompany.com - - I added groups for Event manager. + I added groups for Event user. - !record {model: res.users, id: res_users_eventuser}: groups_id: From fbfd8a4b423c232269c6abfafede527bd26ee7e3 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 14:13:16 +0530 Subject: [PATCH 072/110] [IMP]improve string and add groups in groups_id in sale and sale stock bzr revid: sgo@tinyerp.com-20130507084316-v1tiw294n8imfj1v --- addons/crm/test/crm_access_group_users.yml | 12 +++--- addons/sale/test/create_sale_users.yml | 18 ++++++--- addons/sale_stock/test/sale_stock_users.yml | 43 +++++++++++++-------- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/addons/crm/test/crm_access_group_users.yml b/addons/crm/test/crm_access_group_users.yml index 50ee9ed5367..c9080ee530e 100644 --- a/addons/crm/test/crm_access_group_users.yml +++ b/addons/crm/test/crm_access_group_users.yml @@ -1,29 +1,29 @@ - - Create a user as 'Salesmanager' + Create a user as 'Crm Salesmanager' - !record {model: res.users, id: crm_res_users_salesmanager}: company_id: base.main_company - name: Sales manager + name: Crm Sales manager login: csm password: csm email: crmmanager@yourcompany.com - - I added groups for Salesmanager. + I added groups for Crm Salesmanager. - !record {model: res.users, id: crm_res_users_salesmanager}: groups_id: - base.group_sale_manager - - Create a user as 'Salesman' + Create a user as 'Crm Salesman' - !record {model: res.users, id: crm_res_users_salesman}: company_id: base.main_company - name: Salesman + name: Crm Salesman login: csu password: csu email: crmuser@yourcompany.com - - I added groups for Salesman. + I added groups for Crm Salesman. - !record {model: res.users, id: crm_res_users_salesman}: groups_id: diff --git a/addons/sale/test/create_sale_users.yml b/addons/sale/test/create_sale_users.yml index ed575073f5d..e86fbc8ebfe 100644 --- a/addons/sale/test/create_sale_users.yml +++ b/addons/sale/test/create_sale_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Salesmanager' -- - !context - default_groups_ref: ['base.group_sale_manager'] - !record {model: res.users, id: res_users_salesmanager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: sm email: salesmanager@yourcompany.com - - Create a user as 'Salesman' + I added groups for Salesmanager. - - !context - default_groups_ref: ['base.group_sale_salesman_all_leads'] + !record {model: res.users, id: res_users_salesmanager}: + groups_id: + - base.group_sale_manager +- + Create a user as 'Salesman' - !record {model: res.users, id: res_users_salesman}: company_id: base.main_company @@ -22,3 +22,9 @@ login: su password: su email: salesman@yourcompany.com +- + I added groups for Salesman. +- + !record {model: res.users, id: res_users_salesman}: + groups_id: + - base.group_sale_salesman_all_leads diff --git a/addons/sale_stock/test/sale_stock_users.yml b/addons/sale_stock/test/sale_stock_users.yml index c1ebd54392c..594cbe42240 100644 --- a/addons/sale_stock/test/sale_stock_users.yml +++ b/addons/sale_stock/test/sale_stock_users.yml @@ -1,32 +1,35 @@ - - Create a user as 'Salesmanager' -- - !context - default_groups_ref: ['base.group_sale_manager'] + Create a user as 'Stock Salesmanager' - !record {model: res.users, id: res_sale_stock_salesmanager}: company_id: base.main_company - name: Sales manager + name: Stock Sales manager login: ssm password: ssm email: ss_salesmanager@yourcompany.com - - Create a user as 'Salesman' + I added groups for Salesmanager. - - !context - default_groups_ref: ['base.group_sale_salesman_all_leads'] + !record {model: res.users, id: res_sale_stock_salesmanager}: + groups_id: + - base.group_sale_manager +- + Create a user as 'Stock Salesman' - !record {model: res.users, id: res_sale_stock_salesman}: company_id: base.main_company - name: Salesman + name: Stock Salesman login: ssu password: ssu email: ss_salesman@yourcompany.com - - Create a user as 'Stock User' + I added groups for Stock Salesman. - - !context - default_groups_ref: ['stock.group_stock_user'] + !record {model: res.users, id: res_sale_stock_salesman}: + groups_id: + - base.group_sale_salesman_all_leads +- + Create a user as 'Stock User' - !record {model: res.users, id: res_stock_user}: company_id: base.main_company @@ -34,12 +37,14 @@ login: sau password: sau email: stock_user@yourcompany.com - +- + I added groups for Stock User. +- + !record {model: res.users, id: res_stock_user}: + groups_id: + - stock.group_stock_user - Create a user as 'Stock Manager' -- - !context - default_groups_ref: ['stock.group_stock_manager'] - !record {model: res.users, id: res_stock_manager}: company_id: base.main_company @@ -48,3 +53,9 @@ password: sam email: admin@portal.example.com email: stock_manager@yourcompany.com +- + I added groups for Stock Manager. +- + !record {model: res.users, id: res_stock_manager}: + groups_id: + - stock.group_stock_manager From 76451bef7680e6d309b2c95722587f7c667e1f1a Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 14:19:01 +0530 Subject: [PATCH 073/110] [IMP]add groups in groups_id in purchase and purchase_requisition bzr revid: sgo@tinyerp.com-20130507084901-c4n3scfvt7vrs0gg --- addons/purchase/test/ui/purchase_users.yml | 18 +++++++++++------ .../test/purchase_requisition_users.yml | 20 ++++++++++++------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/addons/purchase/test/ui/purchase_users.yml b/addons/purchase/test/ui/purchase_users.yml index 9dd5e9c0195..bfff922bf83 100644 --- a/addons/purchase/test/ui/purchase_users.yml +++ b/addons/purchase/test/ui/purchase_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Purchase manager' -- - !context - default_groups_ref: ['purchase.group_purchase_manager'] - !record {model: res.users, id: res_users_purchase_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: pm email: purchasemanager@yourcompany.com - - Create a user as 'Purchase user' + I added groups for Purchase manager. - - !context - default_groups_ref: ['purchase.group_purchase_user'] + !record {model: res.users, id: res_users_purchase_manager}: + groups_id: + - purchase.group_purchase_manager +- + Create a user as 'Purchase user' - !record {model: res.users, id: res_users_purchase_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: pu password: pu email: purchaseuser@yourcompany.com +- + I added groups for Purchase user. +- + !record {model: res.users, id: res_users_purchase_user}: + groups_id: + - purchase.group_purchase_user diff --git a/addons/purchase_requisition/test/purchase_requisition_users.yml b/addons/purchase_requisition/test/purchase_requisition_users.yml index 41bc7cd318e..5b5e6d5e8cb 100644 --- a/addons/purchase_requisition/test/purchase_requisition_users.yml +++ b/addons/purchase_requisition/test/purchase_requisition_users.yml @@ -1,8 +1,5 @@ - - Create a user as 'Purchase Reqisition Manager' -- - !context - default_groups_ref: ['purchase_requisition.group_purchase_requisition_manager'] + Create a user as 'Purchase Requisition Manager' - !record {model: res.users, id: res_users_purchase_requisition_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: prm email: requisition_manager@yourcompany.com - - Create a user as 'Purchase Reqisition User' + I added groups for Purchase Requisition Manager. - - !context - default_groups_ref: ['purchase_requisition.group_purchase_requisition_user'] + !record {model: res.users, id: res_users_purchase_requisition_manager}: + groups_id: + - purchase_requisition.group_purchase_requisition_manager +- + Create a user as 'Purchase Requisition User' - !record {model: res.users, id: res_users_purchase_requisition_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: pru password: pru email: requisition_user@yourcompany.com +- + I added groups for Purchase Requisition User. +- + !record {model: res.users, id: res_users_purchase_requisition_user}: + groups_id: + - purchase_requisition.group_purchase_requisition_user \ No newline at end of file From df013f64025f72f0770abcf67d76518a2ae2c6b6 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 14:32:04 +0530 Subject: [PATCH 074/110] [IMP]add groups in groups_id for hr, hr_attandance and recruitment bzr revid: sgo@tinyerp.com-20130507090204-13gkyryyn3lxtz8z --- addons/hr/test/hr_users.yml | 27 ++++++++++++------- .../hr_attendance/test/attendance_process.yml | 9 ++++--- .../test/recruitment_process.yml | 13 +++++---- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/addons/hr/test/hr_users.yml b/addons/hr/test/hr_users.yml index 265482ca457..115924d5c1c 100644 --- a/addons/hr/test/hr_users.yml +++ b/addons/hr/test/hr_users.yml @@ -1,8 +1,5 @@ - Create a user as 'HR Manager' -- - !context - default_groups_ref: [base.group_hr_manager] - !record {model: res.users, id: res_users_hr_manager}: company_id: base.main_company @@ -10,10 +7,13 @@ login: hrm password: hrm - - Create a user as 'HR Officer' + I added groups for HR Manager. - - !context - default_groups_ref: [base.group_hr_user] + !record {model: res.users, id: res_users_hr_manager}: + groups_id: + - base.group_hr_manager +- + Create a user as 'HR Officer' - !record {model: res.users, id: res_users_hr_officer}: company_id: base.main_company @@ -21,13 +21,22 @@ login: hro password: hro - - Create a user as 'Employee' + I added groups for HR Officer. - - !context - default_groups_ref: [base.group_user] + !record {model: res.users, id: res_users_hr_officer}: + groups_id: + - base.group_hr_user +- + Create a user as 'Employee' - !record {model: res.users, id: res_users_employee}: company_id: base.main_company name: Employee login: emp password: emp +- + I added groups for Employee. +- + !record {model: res.users, id: res_users_employee}: + groups_id: + - base.group_user diff --git a/addons/hr_attendance/test/attendance_process.yml b/addons/hr_attendance/test/attendance_process.yml index 383cf209bd4..814f0ee9b8a 100644 --- a/addons/hr_attendance/test/attendance_process.yml +++ b/addons/hr_attendance/test/attendance_process.yml @@ -1,14 +1,17 @@ - Create a user as 'HR Attendance Officer' -- - !context - default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_users_attendance_officer}: company_id: base.main_company name: HR Officer login: ao password: ao +- + I added groups for HR Attendance Officer. +- + !record {model: res.users, id: res_users_attendance_officer}: + groups_id: + - base.group_hr_user - Give the access rights of Hr Officer to test attendance process. - diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml index 2b7c534c270..8cf924b5d05 100644 --- a/addons/hr_recruitment/test/recruitment_process.yml +++ b/addons/hr_recruitment/test/recruitment_process.yml @@ -1,15 +1,18 @@ - Create a user as 'HR Recruitment Officer' - - !context - default_groups_ref: [base.group_hr_user] -- - !record {model: res.users, id: res_users_hr_officer}: + !record {model: res.users, id: res_users_hr_recruitment_officer}: company_id: base.main_company - name: HR Officer + name: HR Recruitment Officer login: hrro password: hrro email: hrofcr@yourcompany.com +- + I added groups for HR Recruitment Officer. +- + !record {model: res.users, id: res_users_hr_recruitment_officer}: + groups_id: + - base.group_hr_user - In Order to test process of Recruitment so giving HR officer's rights, - From a28d4d7cad0a55c4c4f1d97ca17035a2e01c8d07 Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 7 May 2013 14:39:44 +0530 Subject: [PATCH 075/110] [IMP] add group_id in project and project_issue for assign groups bzr revid: fka@tinyerp.com-20130507090944-m8oqqxx7wekyh09c --- addons/project/test/project_users.yml | 18 ++++++++++++------ addons/project_issue/test/issue_users.yml | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/addons/project/test/project_users.yml b/addons/project/test/project_users.yml index 8ae3c23dca1..f61d2042b6b 100644 --- a/addons/project/test/project_users.yml +++ b/addons/project/test/project_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Project manager' -- - !context - default_groups_ref: ['project.group_project_manager'] - !record {model: res.users, id: res_users_project_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: prm email: projectmanager@yourcompany.com - - Create a user as 'Project user' + I added groups for Project manager. - - !context - default_groups_ref: ['project.group_project_user'] + !record {model: res.users, id: res_users_project_manager}: + groups_id: + - project.group_project_manager +- + Create a user as 'Project user' - !record {model: res.users, id: res_users_project_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: pru password: pru email: projectuser@yourcompany.com +- + I added groups for Project user. +- + !record {model: res.users, id: res_users_project_user}: + groups_id: + - project.group_project_user \ No newline at end of file diff --git a/addons/project_issue/test/issue_users.yml b/addons/project_issue/test/issue_users.yml index 402478b1c54..c40d142684a 100644 --- a/addons/project_issue/test/issue_users.yml +++ b/addons/project_issue/test/issue_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Project manager' -- - !context - default_groups_ref: ['project.group_project_manager'] - !record {model: res.users, id: res_users_project_issue_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: prim email: issuemanager@yourcompany.com - - Create a user as 'Project user' + I added groups for Project manager. - - !context - default_groups_ref: ['project.group_project_user'] + !record {model: res.users, id: res_users_project_issue_manager}: + groups_id: + - project.group_project_manager +- + Create a user as 'Project user' - !record {model: res.users, id: res_users_project_issue_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: priu password: priu email: issueuser@yourcompany.com +- + I added groups for Project user. +- + !record {model: res.users, id: res_users_project_issue_user}: + groups_id: + - project.group_project_user \ No newline at end of file From de7fdad10fe952cb26c4213e3fc0e3c2437dda77 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 14:40:56 +0530 Subject: [PATCH 076/110] [IMP]add groups in groups_id for hr timesheet bzr revid: sgo@tinyerp.com-20130507091056-ume659zsu3q2fgig --- .../hr_timesheet/test/hr_timesheet_users.yml | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/addons/hr_timesheet/test/hr_timesheet_users.yml b/addons/hr_timesheet/test/hr_timesheet_users.yml index 4a557bff44f..8b8b799e503 100644 --- a/addons/hr_timesheet/test/hr_timesheet_users.yml +++ b/addons/hr_timesheet/test/hr_timesheet_users.yml @@ -1,33 +1,45 @@ - - Create a user as 'HR Manager' -- - !context - default_groups_ref: [base.group_hr_manager] + Create a user as 'HR timesheet Manager' - !record {model: res.users, id: res_hr_timesheet_manager}: company_id: base.main_company - name: HR manager + name: HR timesheet manager login: hrtm password: hrtm - - Create a user as 'HR Officer' + I added groups for HR timesheet Manager. +- + !record {model: res.users, id: res_hr_timesheet_manager}: + groups_id: + - base.group_hr_manager +- + Create a user as 'HR timesheet Officer' - !context default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_hr_timesheet_officer}: company_id: base.main_company - name: HR Officer + name: HR timesheet Officer login: hrto password: hrto - - Create a user as 'Employee' + I added groups for HR timesheet Officer. - - !context - default_groups_ref: [base.group_user] + !record {model: res.users, id: res_hr_timesheet_officer}: + groups_id: + - base.group_hr_user +- + Create a user as 'Timesheet Employee' - !record {model: res.users, id: res_hr_timesheet_employee}: company_id: base.main_company - name: Employee + name: Timesheet Employee login: empt password: empt +- + I added groups for Timesheet Employee. +- + !record {model: res.users, id: res_hr_timesheet_employee}: + groups_id: + - base.group_user From f0ecb9c56a6b4eb850fc67256c5b54ba9a263ee2 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 14:43:12 +0530 Subject: [PATCH 077/110] [IMP]add groups in groups_id for stock bzr revid: sgo@tinyerp.com-20130507091312-gnrhyr0osq56ddb1 --- addons/stock/test/stock_users.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/addons/stock/test/stock_users.yml b/addons/stock/test/stock_users.yml index b8fe0783ca1..d0c09dc745d 100644 --- a/addons/stock/test/stock_users.yml +++ b/addons/stock/test/stock_users.yml @@ -1,8 +1,5 @@ - Create a user as 'Stock Manager' -- - !context - default_groups_ref: ['stock.group_stock_manager'] - !record {model: res.users, id: res_users_stock_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: sam email: stockmanager@yourcompany.com - - Create a user as 'Stock User' + I added groups for Stock Manager. - - !context - default_groups_ref: ['stock.group_stock_user'] + !record {model: res.users, id: res_users_stock_manager}: + groups_id: + - stock.group_stock_manager +- + Create a user as 'Stock User' - !record {model: res.users, id: res_users_stock_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: sau password: sau email: stockuser@yourcompany.com +- + I added groups for Stock User. +- + !record {model: res.users, id: res_users_stock_user}: + groups_id: + - stock.group_stock_user From 693e52e928d76c13d3c814e2b91615fcffbc593c Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 15:04:13 +0530 Subject: [PATCH 078/110] [IMP]improve code bzr revid: sgo@tinyerp.com-20130507093413-42qiuvslavp0w4n1 --- addons/hr_recruitment/test/recruitment_process.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_recruitment/test/recruitment_process.yml b/addons/hr_recruitment/test/recruitment_process.yml index 8cf924b5d05..1fa59328ef4 100644 --- a/addons/hr_recruitment/test/recruitment_process.yml +++ b/addons/hr_recruitment/test/recruitment_process.yml @@ -17,7 +17,7 @@ In Order to test process of Recruitment so giving HR officer's rights, - !context - uid: 'res_users_hr_officer' + uid: 'res_users_hr_recruitment_officer' - An applicant is interested in the job position. So he sends a resume by email. - From 2126f36ad127802dba5d46f4b04431e3eb7a8a9f Mon Sep 17 00:00:00 2001 From: "Foram Katharotiya (OpenERP)" Date: Tue, 7 May 2013 15:08:48 +0530 Subject: [PATCH 079/110] [IMP] add group_id in MRP,mrp_repair and mrp_operations for assign groups bzr revid: fka@tinyerp.com-20130507093848-lrpqfao6kumlgepy --- addons/mrp/test/mrp_users.yml | 18 ++++++++++++------ .../test/workcenter_operations.yml | 9 ++++++--- addons/mrp_repair/test/mrp_repair_users.yml | 18 ++++++++++++------ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/addons/mrp/test/mrp_users.yml b/addons/mrp/test/mrp_users.yml index 965a809eddc..b01f4f975bd 100644 --- a/addons/mrp/test/mrp_users.yml +++ b/addons/mrp/test/mrp_users.yml @@ -1,8 +1,5 @@ - Create a user as 'MRP Manager' -- - !context - default_groups_ref: [mrp.group_mrp_manager] - !record {model: res.users, id: res_users_mrp_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: mam email: mrp_manager@yourcompany.com - - Create a user as 'MRP User' + I added groups for MRP Manager. - - !context - default_groups_ref: [mrp.group_mrp_user] + !record {model: res.users, id: res_users_mrp_manager}: + groups_id: + - mrp.group_mrp_manager +- + Create a user as 'MRP User' - !record {model: res.users, id: res_users_mrp_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: mau password: mau email: mrp_user@yourcompany.com +- + I added groups for MRP User. +- + !record {model: res.users, id: res_users_mrp_user}: + groups_id: + - mrp.group_mrp_user \ No newline at end of file diff --git a/addons/mrp_operations/test/workcenter_operations.yml b/addons/mrp_operations/test/workcenter_operations.yml index 3fc5b332d18..588ad639659 100644 --- a/addons/mrp_operations/test/workcenter_operations.yml +++ b/addons/mrp_operations/test/workcenter_operations.yml @@ -1,8 +1,5 @@ - Create a user as 'MRP User' -- - !context - default_groups_ref: [mrp.group_mrp_user] - !record {model: res.users, id: res_mrp_operation_user}: company_id: base.main_company @@ -10,6 +7,12 @@ login: maou password: maou email: mrp_operation_user@yourcompany.com +- + I added groups for MRP User. +- + !record {model: res.users, id: res_mrp_operation_user}: + groups_id: + - mrp.group_mrp_user - In order to test mrp_operations with OpenERP, I refer created production order of PC Assemble SC349 with routing - Manual Component's Assembly to test complete production process with respect of workcenter with giving access rights of MRP User. diff --git a/addons/mrp_repair/test/mrp_repair_users.yml b/addons/mrp_repair/test/mrp_repair_users.yml index f7ee95314e2..d5762e69b27 100644 --- a/addons/mrp_repair/test/mrp_repair_users.yml +++ b/addons/mrp_repair/test/mrp_repair_users.yml @@ -1,8 +1,5 @@ - Create a user as 'MRP Repair Manager' -- - !context - default_groups_ref: [mrp.group_mrp_manager] - !record {model: res.users, id: res_mrp_repair_manager}: company_id: base.main_company @@ -11,10 +8,13 @@ password: marm email: mrp_repair_manager@yourcompany.com - - Create a user as 'MRP Repair User' + I added groups for MRP Repair Manager. - - !context - default_groups_ref: [mrp.group_mrp_user] + !record {model: res.users, id: res_mrp_repair_manager}: + groups_id: + - mrp.group_mrp_manager +- + Create a user as 'MRP Repair User' - !record {model: res.users, id: res_mrp_repair_user}: company_id: base.main_company @@ -22,3 +22,9 @@ login: maru password: maru email: mrp_repair_user@yourcompany.com +- + I added groups for MRP Repair User. +- + !record {model: res.users, id: res_mrp_repair_user}: + groups_id: + - mrp.group_mrp_user \ No newline at end of file From 5d267f4b41654b98afabf2551574b46768f8d553 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 15:51:00 +0530 Subject: [PATCH 080/110] [IMP]improve code remove unused code bzr revid: sgo@tinyerp.com-20130507102100-7x01f5hglnw37jwb --- addons/hr_timesheet/test/hr_timesheet_users.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/addons/hr_timesheet/test/hr_timesheet_users.yml b/addons/hr_timesheet/test/hr_timesheet_users.yml index 8b8b799e503..cb59f77df69 100644 --- a/addons/hr_timesheet/test/hr_timesheet_users.yml +++ b/addons/hr_timesheet/test/hr_timesheet_users.yml @@ -14,9 +14,6 @@ - base.group_hr_manager - Create a user as 'HR timesheet Officer' -- - !context - default_groups_ref: [base.group_hr_user] - !record {model: res.users, id: res_hr_timesheet_officer}: company_id: base.main_company From c9271122b24b96198ff62485809d08f0f005cbfc Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 16:46:57 +0530 Subject: [PATCH 081/110] [IMP]remove access rights of account user and improve code bzr revid: sgo@tinyerp.com-20130507111657-gg47ca2206q3knd7 --- addons/account/security/ir.model.access.csv | 3 --- addons/account/test/account_customer_invoice.yml | 15 +++++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/account/security/ir.model.access.csv b/addons/account/security/ir.model.access.csv index d6ba955aabc..d1f0bbab6b5 100644 --- a/addons/account/security/ir.model.access.csv +++ b/addons/account/security/ir.model.access.csv @@ -37,7 +37,6 @@ access_account_payment_term_manager,account.payment.term,model_account_payment_t access_account_payment_term_line_manager,account.payment.term.line,model_account_payment_term_line,account.group_account_manager,1,1,1,1 access_account_tax_manager,account.tax,model_account_tax,account.group_account_manager,1,1,1,1 access_account_journal_manager,account.journal,model_account_journal,account.group_account_manager,1,1,1,1 -access_account_journal_user,account.journal,model_account_journal,account.group_account_user,1,1,1,0 access_account_journal_invoice,account.journal invoice,model_account_journal,account.group_account_invoice,1,0,0,0 access_account_period_manager,account.period,model_account_period,account.group_account_manager,1,1,1,1 access_account_period_invoice,account.period invoice,model_account_period,account.group_account_invoice,1,0,0,0 @@ -72,7 +71,6 @@ access_report_account_type_sales,report.account_type.sales,model_report_account_ access_report_account_sales,report.account.sales,model_report_account_sales,account.group_account_manager,1,1,1,1 access_account_invoice_report,account.invoice.report,model_account_invoice_report,account.group_account_manager,1,1,1,1 access_res_partner_group_account_manager,res_partner group_account_manager,model_res_partner,account.group_account_manager,1,0,0,0 -access_res_partner_group_account_user,res_partner group_account_user,model_res_partner,account.group_account_user,1,1,1,0 access_account_invoice_accountant,account.invoice accountant,model_account_invoice,account.group_account_user,1,0,0,0 access_account_tax_code_accountant,account.tax.code accountant,model_account_tax_code,account.group_account_user,1,1,1,1 access_account_move_line_manager,account.move.line manager,model_account_move_line,account.group_account_manager,1,0,0,0 @@ -100,4 +98,3 @@ access_account_sequence_fiscal_year_sale_manager,account.sequence.fiscalyear.sal access_account_treasury_report_manager,account.treasury.report.manager,model_account_treasury_report,account.group_account_manager,1,0,0,0 access_account_financial_report,account.financial.report,model_account_financial_report,account.group_account_user,1,1,1,1 access_account_financial_report_invoice,account.financial.report invoice,model_account_financial_report,account.group_account_invoice,1,0,0,0 -access_res_partner_bank,res.partner.bank,model_res_partner_bank,account.group_account_user,1,1,1,0 diff --git a/addons/account/test/account_customer_invoice.yml b/addons/account/test/account_customer_invoice.yml index a41ca9bbfe4..d0b445fcff5 100644 --- a/addons/account/test/account_customer_invoice.yml +++ b/addons/account/test/account_customer_invoice.yml @@ -1,12 +1,10 @@ -- - Test with that user which have rights to make Invoicing and payment and who is accountant. -- - !context - uid: 'res_users_account_user' - In order to test account invoice I create a new customer invoice - - I will create bank detail + I will create bank detail with using manager access rights because account manager can only create bank details. +- + !context + uid: 'res_users_account_manager' - !record {model: res.partner.bank, id: res_partner_bank_0}: state: bank @@ -16,6 +14,11 @@ footer: True bank: base.res_bank_1 bank_name: Reserve +- + Test with that user which have rights to make Invoicing and payment and who is accountant. +- + !context + uid: 'res_users_account_user' - I create a customer invoice - From c9688c9d5d503df98e58f15632a075247837f2cf Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 17:04:19 +0530 Subject: [PATCH 082/110] [IMP] improve code bzr revid: sgo@tinyerp.com-20130507113419-hvk6cc9u3fxbpjl5 --- addons/account/test/account_test_users.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account/test/account_test_users.yml b/addons/account/test/account_test_users.yml index b257feedff8..143e8bb5473 100644 --- a/addons/account/test/account_test_users.yml +++ b/addons/account/test/account_test_users.yml @@ -28,4 +28,5 @@ - !record {model: res.users, id: res_users_account_manager}: groups_id: - - account.group_account_manager \ No newline at end of file + - account.group_account_manager + - base.group_partner_manager \ No newline at end of file From bdc2be1aa4a6d348e30acab83ed975e18f494cf3 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Tue, 7 May 2013 18:11:54 +0530 Subject: [PATCH 083/110] [IMP]remove access rights of crm user and improve code bzr revid: sgo@tinyerp.com-20130507124154-4mrcpbocuafv4ny7 --- addons/crm/security/ir.model.access.csv | 1 - addons/crm/test/crm_access_group_users.yml | 1 + addons/crm/test/crm_lead_message.yml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 1589b50c016..b09c201df2b 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -35,6 +35,5 @@ access_crm_lead_partner_manager,crm.lead.partner.manager,model_crm_lead,base.gro access_crm_phonecall_partner_manager,crm.phonecall.partner.manager,model_crm_phonecall,base.group_partner_manager,1,1,1,1 access_crm_payment_mode_user,crm.payment.mode,model_crm_payment_mode,base.group_sale_salesman,1,0,0,0 access_crm_payment_mode,crm.payment.mode,model_crm_payment_mode,base.group_sale_manager,1,1,1,1 -access_ir_property_salesman,ir_property_salesman,base.model_ir_property,base.group_sale_salesman,1,1,1,0 access_base_partner_merge_line_manager,base_partner_merge_line.manager,model_base_partner_merge_line,base.group_system,1,1,1,1 access_base_partner_merge_manager,base_partner_merge.manager,model_base_partner_merge_automatic_wizard,base.group_system,1,1,1,1 diff --git a/addons/crm/test/crm_access_group_users.yml b/addons/crm/test/crm_access_group_users.yml index c9080ee530e..51cf52c0abc 100644 --- a/addons/crm/test/crm_access_group_users.yml +++ b/addons/crm/test/crm_access_group_users.yml @@ -28,3 +28,4 @@ !record {model: res.users, id: crm_res_users_salesman}: groups_id: - base.group_sale_salesman_all_leads + - base.group_partner_manager diff --git a/addons/crm/test/crm_lead_message.yml b/addons/crm/test/crm_lead_message.yml index f2463bab255..fcfe658a8f5 100644 --- a/addons/crm/test/crm_lead_message.yml +++ b/addons/crm/test/crm_lead_message.yml @@ -1,5 +1,5 @@ - - Give the access rights of Salesman to communicat with customer. + Give the access rights of Salesman to communicate with customer. - !context uid: 'crm_res_users_salesman' From c697009dea09da447564095d4b0a7df0b6c6bfdc Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Tue, 14 May 2013 15:26:29 +0200 Subject: [PATCH 084/110] [IMP]mrp: avoid adding account rights to users and create lines with superuser_id bzr revid: mat@openerp.com-20130514132629-91qrc32j04a1t5he --- addons/mrp/mrp.py | 9 ++++++--- addons/mrp/security/ir.model.access.csv | 1 - addons/mrp/test/mrp_users.yml | 1 + addons/mrp/test/order_process.yml | 8 +++++++- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index 7fb40ce12af..f3b89a86d65 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -27,7 +27,7 @@ from openerp.osv import fields, osv from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DATETIME_FORMATS_MAP from openerp.tools import float_compare from openerp.tools.translate import _ -from openerp import tools +from openerp import tools, SUPERUSER_ID #---------------------------------------------------------- # Work Centers @@ -803,7 +803,10 @@ class mrp_production(osv.osv): account = wc.costs_hour_account_id.id if value and account: amount += value - analytic_line_obj.create(cr, uid, { + # we user SUPERUSER_ID as we do not garantee an mrp user + # has access to account analytic lines but still should be + # able to produce orders + analytic_line_obj.create(cr, SUPERUSER_ID, { 'name': wc_line.name + ' (H)', 'amount': value, 'account_id': account, @@ -819,7 +822,7 @@ class mrp_production(osv.osv): account = wc.costs_cycle_account_id.id if value and account: amount += value - analytic_line_obj.create(cr, uid, { + analytic_line_obj.create(cr, SUPERUSER_ID, { 'name': wc_line.name+' (C)', 'amount': value, 'account_id': account, diff --git a/addons/mrp/security/ir.model.access.csv b/addons/mrp/security/ir.model.access.csv index 2d0a478c33d..7a94b1a660c 100644 --- a/addons/mrp/security/ir.model.access.csv +++ b/addons/mrp/security/ir.model.access.csv @@ -1,5 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_account_analytic_line_user,account.analytic.line,account.model_account_analytic_line,group_mrp_user,1,1,1,0 access_mrp_workcenter,mrp.workcenter,model_mrp_workcenter,mrp.group_mrp_user,1,0,0,0 access_mrp_routing,mrp.routing,model_mrp_routing,mrp.group_mrp_user,1,0,0,0 access_mrp_routing_workcenter,mrp.routing.workcenter,model_mrp_routing_workcenter,mrp.group_mrp_user,1,0,0,0 diff --git a/addons/mrp/test/mrp_users.yml b/addons/mrp/test/mrp_users.yml index b01f4f975bd..05c4889cf28 100644 --- a/addons/mrp/test/mrp_users.yml +++ b/addons/mrp/test/mrp_users.yml @@ -13,6 +13,7 @@ !record {model: res.users, id: res_users_mrp_manager}: groups_id: - mrp.group_mrp_manager + - account.group_account_user - Create a user as 'MRP User' - diff --git a/addons/mrp/test/order_process.yml b/addons/mrp/test/order_process.yml index 4d45b1d0968..ba4e1b79d66 100644 --- a/addons/mrp/test/order_process.yml +++ b/addons/mrp/test/order_process.yml @@ -183,7 +183,10 @@ order = self.browse(cr, uid, ref("mrp_production_test1")) assert order.state == 'done', "Production order should be closed." - - I check Total Costs at End of Production. + I check Total Costs at End of Production as a manager. +- + !context + uid: 'res_users_mrp_manager' - !python {model: mrp.production}: | order = self.browse(cr, uid, ref("mrp_production_test1")) @@ -217,6 +220,9 @@ assert line.product_uom_id.id == wc.product_id.uom_id.id, "UOM is not correspond." - I print a "BOM Structure". +- + !context + uid: 'res_users_mrp_user' - !python {model: mrp.production}: | import os From 143b485baf8adb7936d7784e314ccd405d1b8c14 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Tue, 14 May 2013 15:42:27 +0200 Subject: [PATCH 085/110] [IMP]resource: avoid better permissions on calendar_leaves bzr revid: mat@openerp.com-20130514134227-xnvyzjikwph8bp5k --- addons/project/security/ir.model.access.csv | 1 - addons/resource/__openerp__.py | 1 + addons/resource/security/ir.model.access.csv | 1 + addons/resource/security/resource_security.xml | 16 ++++++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 addons/resource/security/resource_security.xml diff --git a/addons/project/security/ir.model.access.csv b/addons/project/security/ir.model.access.csv index 1428f445e43..a76faa0fcce 100644 --- a/addons/project/security/ir.model.access.csv +++ b/addons/project/security/ir.model.access.csv @@ -19,7 +19,6 @@ access_project_task_history,project.task.history project,project.model_project_t access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_manager,1,0,0,0 access_project_task_history_cumulative,project.task.history project,project.model_project_task_history_cumulative,project.group_project_user,1,0,0,0 access_resource_calendar,project.resource_calendar manager,resource.model_resource_calendar,project.group_project_manager,1,0,0,0 -access_resource_calendar_leaves,project.resource_calendar_leaves manager,resource.model_resource_calendar_leaves,project.group_project_manager,1,0,0,0 access_project_category,project.project_category,model_project_category,,1,0,0,0 access_project_category_manager,project.project_category,model_project_category,project.group_project_manager,1,1,1,1 access_mail_alias,mail.alias,mail.model_mail_alias,project.group_project_manager,1,1,1,1 diff --git a/addons/resource/__openerp__.py b/addons/resource/__openerp__.py index b8a9f57c910..806e02e8c2b 100644 --- a/addons/resource/__openerp__.py +++ b/addons/resource/__openerp__.py @@ -38,6 +38,7 @@ associated to every resource. It also manages the leaves of every resource. 'depends': ['process'], 'data': [ 'security/ir.model.access.csv', + 'security/resource_security.xml', 'resource_view.xml', ], 'demo': ['resource_demo.xml'], diff --git a/addons/resource/security/ir.model.access.csv b/addons/resource/security/ir.model.access.csv index 533ad419274..058626831c6 100644 --- a/addons/resource/security/ir.model.access.csv +++ b/addons/resource/security/ir.model.access.csv @@ -3,4 +3,5 @@ access_resource_calendar,resource.calendar,model_resource_calendar,base.group_sy access_resource_calendar_attendance,resource.calendar.attendance,model_resource_calendar_attendance,base.group_system,1,1,1,1 access_resource_resource,resource.resource,model_resource_resource,base.group_system,1,0,0,0 access_resource_resource_all,resource.resource all,model_resource_resource,,1,0,0,0 +access_resource_calendar_leaves_all,resource.calendar.leaves,model_resource_calendar_leaves,,1,0,0,0 access_resource_calendar_leaves,resource.calendar.leaves,model_resource_calendar_leaves,base.group_system,1,1,1,1 diff --git a/addons/resource/security/resource_security.xml b/addons/resource/security/resource_security.xml new file mode 100644 index 00000000000..77d9a11751a --- /dev/null +++ b/addons/resource/security/resource_security.xml @@ -0,0 +1,16 @@ + + + + + + Resource: see own leaves + + + ['|', + ('resource_id', '=', False), + ('resource_id.user_id', '=', user.id), + ] + + + + From ff73b066ed6adee1cd00b70241a17394d55f7436 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Wed, 26 Jun 2013 17:29:47 +0530 Subject: [PATCH 086/110] [IMP]only manager can cancel lead so give access rights of manager for test bzr revid: sgo@tinyerp.com-20130626115947-idn10u0vtvkrvtb8 --- addons/crm/test/crm_lead_cancel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/crm/test/crm_lead_cancel.yml b/addons/crm/test/crm_lead_cancel.yml index 13c3c18ed26..4d9b2e82925 100644 --- a/addons/crm/test/crm_lead_cancel.yml +++ b/addons/crm/test/crm_lead_cancel.yml @@ -2,7 +2,7 @@ I set a new sale team (with Marketing at parent) and I cancel unqualified lead giving access rights of salesman. - !context - uid: 'crm_res_users_salesman' + uid: 'crm_res_users_salesmanager' - !python {model: crm.lead}: | section_id = self.pool.get('crm.case.section').create(cr, uid, {'name': "Phone Marketing", 'parent_id': ref("crm.crm_case_section_2")}) From 7ec16a69c4e13b9b3223bfc752d699addf6f0b9c Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 1 Jul 2013 16:12:29 +0530 Subject: [PATCH 087/110] [IMP]only manager can create issue bzr revid: sgo@tinyerp.com-20130701104229-2xq8pyxkbymhdtfh --- addons/project_issue/test/issue_demo.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/project_issue/test/issue_demo.yml b/addons/project_issue/test/issue_demo.yml index b7342b435ab..f84c716baeb 100644 --- a/addons/project_issue/test/issue_demo.yml +++ b/addons/project_issue/test/issue_demo.yml @@ -1,9 +1,14 @@ - - Test the whole create project issue with project user. + Test the whole create project issue with project manager. - !context - uid: 'res_users_project_issue_user' + uid: 'res_users_project_issue_manager' +- + !record {model: project.issue, id: project_task_1, view: False}: + task_id: 'project.project_task_17' + name: 'Error in account module' - !record {model: project.issue, id: project01, view: False}: project_id: 'project.project_project_2' name: 'OpenERP Integration' + From 9349ba848497b9c5b7ded809a4db6b1e3b26b6a6 Mon Sep 17 00:00:00 2001 From: "sgo@tinyerp.com" <> Date: Mon, 1 Jul 2013 17:16:25 +0530 Subject: [PATCH 088/110] [IMP]define context to yml function bzr revid: sgo@tinyerp.com-20130701114625-vshpugzujnvgdf5x --- addons/sale_stock/test/cancel_order_sale_stock.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/sale_stock/test/cancel_order_sale_stock.yml b/addons/sale_stock/test/cancel_order_sale_stock.yml index 0278bd52713..29581b944bf 100644 --- a/addons/sale_stock/test/cancel_order_sale_stock.yml +++ b/addons/sale_stock/test/cancel_order_sale_stock.yml @@ -10,6 +10,7 @@ I send delivery in two shipments, so I am doing a partial delivery order. - !python {model: stock.picking}: | + context={} delivery_orders = self.search(cr, uid, [('sale_id','=',ref("sale.sale_order_8"))]) first_picking = self.browse(cr, uid, delivery_orders[-1], context=context) if first_picking.force_assign(cr, uid, first_picking): From 4bc4547cb90f158d80ffb3275ae47fe2ead66192 Mon Sep 17 00:00:00 2001 From: "Bharat R. Devnani (OpenERP)" Date: Fri, 30 Aug 2013 19:26:43 +0530 Subject: [PATCH 089/110] [ADD] added the functionalities mentioned on pad bzr revid: bde@tinyerp.com-20130830135643-ehzm0bdtvq8lltdi --- addons/account/account.py | 4 ++++ addons/account/account_installer.xml | 2 +- addons/l10n_ar/l10n_ar_wizard.xml | 10 +++++++--- addons/l10n_at/l10n_chart_at_wizard.xml | 10 +++++++--- addons/l10n_be/wizard/account_wizard.xml | 12 +++++++++--- addons/l10n_bo/l10n_bo_wizard.xml | 10 +++++++--- addons/l10n_br/l10n_br_wizard.xml | 12 +++++++++--- addons/l10n_ca/l10n_ca_wizard.xml | 6 +++++- addons/l10n_ch/wizard.xml | 6 ++++++ addons/l10n_cl/l10n_cl_wizard.xml | 7 ++++++- addons/l10n_cn/l10n_chart_cn_wizard.xml | 7 ++++++- addons/l10n_co/data/l10n_chart_mx_wizard.xml | 6 ++++++ addons/l10n_cr/l10n_wizard.xml | 7 ++++++- addons/l10n_de/l10n_de_wizard.xml | 6 +++++- addons/l10n_ec/l10n_chart_ec_wizard.xml | 7 ++++++- addons/l10n_es/l10n_es_wizard.xml | 5 +++++ addons/l10n_et/l10n_et_wizard.xml | 6 ++++++ addons/l10n_fr/l10n_fr_wizard.xml | 5 +++++ addons/l10n_gr/l10n_gr_wizard.xml | 7 ++++++- addons/l10n_gt/l10n_gt_base.xml | 4 ++++ addons/l10n_hn/l10n_hn_base.xml | 4 ++++ addons/l10n_hr/l10n_hr_wizard.xml | 6 ++++++ addons/l10n_in/l10n_in_wizard.xml | 5 +++++ addons/l10n_it/l10n_chart_it_generic.xml | 6 ++++++ addons/l10n_lu/l10n_lu_wizard.xml | 5 +++++ addons/l10n_ma/l10n_ma_tax.xml | 3 ++- addons/l10n_ma/l10n_ma_wizard.xml | 5 +++++ addons/l10n_mx/data/l10n_chart_mx_wizard.xml | 12 +++++++++--- addons/l10n_nl/l10n_nl_wizard.xml | 7 ++++++- addons/l10n_pa/l10n_pa_wizard.xml | 4 ++++ addons/l10n_pe/l10n_pe_wizard.xml | 4 ++++ addons/l10n_pl/l10n_chart_pl_wizard.xml | 5 +++++ addons/l10n_pt/l10n_chart_pt_wizard.xml | 5 +++++ addons/l10n_ro/l10n_chart_ro_wizard.xml | 5 +++++ addons/l10n_si/l10n_si_wizard.xml | 6 ++++++ .../l10n_syscohada/l10n_syscohada_wizard.xml | 6 ++++++ addons/l10n_th/account_data.xml | 6 ++++++ addons/l10n_tr/l10n_tr_wizard.xml | 6 ++++++ addons/l10n_uk/l10n_uk_wizard.xml | 5 +++++ addons/l10n_us/__openerp__.py | 3 ++- addons/l10n_us/l10n_us_wizard.xml | 11 ++++++++++- addons/l10n_uy/l10n_uy_wizard.xml | 5 +++++ addons/l10n_ve/data/account_tax.xml | 18 ++---------------- addons/l10n_ve/data/l10n_chart_ve_wizard.xml | 5 +++++ addons/l10n_vn/l10n_vn_wizard.xml | 4 ++++ 45 files changed, 244 insertions(+), 46 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 33b52b643ed..3a5e2f12cfc 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -3030,6 +3030,9 @@ class wizard_multi_charts_accounts(osv.osv_memory): } def onchange_company_id(self, cr, uid, ids, company_id, context=None): + if context.get('default_currency_id', False): + dummy, view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', context.get('default_currency_id')) + return {'value': {'currency_id': view_id}} currency_id = False if company_id: currency_id = self.pool.get('res.company').browse(cr, uid, company_id, context=context).currency_id.id @@ -3067,6 +3070,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): res.update({'company_id': self.pool.get('res.users').browse(cr, uid, [uid], context=context)[0].company_id.id}) if 'currency_id' in fields: company_id = res.get('company_id') or False + if company_id: company_obj = self.pool.get('res.company') country_id = company_obj.browse(cr, uid, company_id, context=context).country_id.id diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml index b03babc63ac..79557b3f406 100644 --- a/addons/account/account_installer.xml +++ b/addons/account/account_installer.xml @@ -51,6 +51,6 @@ 3 automatic - + diff --git a/addons/l10n_ar/l10n_ar_wizard.xml b/addons/l10n_ar/l10n_ar_wizard.xml index 82e7671b4d3..f21b5cd8c11 100644 --- a/addons/l10n_ar/l10n_ar_wizard.xml +++ b/addons/l10n_ar/l10n_ar_wizard.xml @@ -2,9 +2,13 @@ - - open - + + open + + + + done + diff --git a/addons/l10n_at/l10n_chart_at_wizard.xml b/addons/l10n_at/l10n_chart_at_wizard.xml index 19d27fb47c7..350ea995edc 100644 --- a/addons/l10n_at/l10n_chart_at_wizard.xml +++ b/addons/l10n_at/l10n_chart_at_wizard.xml @@ -1,9 +1,13 @@ - - open - + + open + + + + done + diff --git a/addons/l10n_be/wizard/account_wizard.xml b/addons/l10n_be/wizard/account_wizard.xml index dde7a77516a..27785c1b6cf 100644 --- a/addons/l10n_be/wizard/account_wizard.xml +++ b/addons/l10n_be/wizard/account_wizard.xml @@ -1,7 +1,13 @@ - - open - + + + open + + + + done + + diff --git a/addons/l10n_bo/l10n_bo_wizard.xml b/addons/l10n_bo/l10n_bo_wizard.xml index 4de61247b90..cc2f17058ff 100644 --- a/addons/l10n_bo/l10n_bo_wizard.xml +++ b/addons/l10n_bo/l10n_bo_wizard.xml @@ -2,9 +2,13 @@ - - open - + + open + + + + done + diff --git a/addons/l10n_br/l10n_br_wizard.xml b/addons/l10n_br/l10n_br_wizard.xml index 748b8913660..5988a2ccd40 100644 --- a/addons/l10n_br/l10n_br_wizard.xml +++ b/addons/l10n_br/l10n_br_wizard.xml @@ -1,8 +1,14 @@ - - open - + + + open + + + + done + + \ No newline at end of file diff --git a/addons/l10n_ca/l10n_ca_wizard.xml b/addons/l10n_ca/l10n_ca_wizard.xml index 19d27fb47c7..007f2badc7a 100644 --- a/addons/l10n_ca/l10n_ca_wizard.xml +++ b/addons/l10n_ca/l10n_ca_wizard.xml @@ -4,6 +4,10 @@ open - + + + done + + diff --git a/addons/l10n_ch/wizard.xml b/addons/l10n_ch/wizard.xml index dde7a77516a..8247cf51cc0 100644 --- a/addons/l10n_ch/wizard.xml +++ b/addons/l10n_ch/wizard.xml @@ -1,7 +1,13 @@ + open + + + done + + diff --git a/addons/l10n_cl/l10n_cl_wizard.xml b/addons/l10n_cl/l10n_cl_wizard.xml index 704ac4daf38..f05a8d4d664 100644 --- a/addons/l10n_cl/l10n_cl_wizard.xml +++ b/addons/l10n_cl/l10n_cl_wizard.xml @@ -1,9 +1,14 @@ + open - + + + done + + diff --git a/addons/l10n_cn/l10n_chart_cn_wizard.xml b/addons/l10n_cn/l10n_chart_cn_wizard.xml index 52aaa88fdab..d93d83a37aa 100644 --- a/addons/l10n_cn/l10n_chart_cn_wizard.xml +++ b/addons/l10n_cn/l10n_chart_cn_wizard.xml @@ -1,8 +1,13 @@ + open - + + + done + + diff --git a/addons/l10n_co/data/l10n_chart_mx_wizard.xml b/addons/l10n_co/data/l10n_chart_mx_wizard.xml index e73c75c3506..c6f013cbdb3 100644 --- a/addons/l10n_co/data/l10n_chart_mx_wizard.xml +++ b/addons/l10n_co/data/l10n_chart_mx_wizard.xml @@ -1,8 +1,14 @@ + open + + + done + + diff --git a/addons/l10n_cr/l10n_wizard.xml b/addons/l10n_cr/l10n_wizard.xml index 6919eb199b6..2199faa9366 100644 --- a/addons/l10n_cr/l10n_wizard.xml +++ b/addons/l10n_cr/l10n_wizard.xml @@ -1,8 +1,13 @@ + open - + + + done + + diff --git a/addons/l10n_de/l10n_de_wizard.xml b/addons/l10n_de/l10n_de_wizard.xml index 19d27fb47c7..007f2badc7a 100644 --- a/addons/l10n_de/l10n_de_wizard.xml +++ b/addons/l10n_de/l10n_de_wizard.xml @@ -4,6 +4,10 @@ open - + + + done + + diff --git a/addons/l10n_ec/l10n_chart_ec_wizard.xml b/addons/l10n_ec/l10n_chart_ec_wizard.xml index 52aaa88fdab..71b98ed174b 100644 --- a/addons/l10n_ec/l10n_chart_ec_wizard.xml +++ b/addons/l10n_ec/l10n_chart_ec_wizard.xml @@ -1,8 +1,13 @@ + open - + + + done + + diff --git a/addons/l10n_es/l10n_es_wizard.xml b/addons/l10n_es/l10n_es_wizard.xml index 52aaa88fdab..22953449166 100644 --- a/addons/l10n_es/l10n_es_wizard.xml +++ b/addons/l10n_es/l10n_es_wizard.xml @@ -1,8 +1,13 @@ + open + + done + + diff --git a/addons/l10n_et/l10n_et_wizard.xml b/addons/l10n_et/l10n_et_wizard.xml index cbbb56b7989..1027cc5874f 100644 --- a/addons/l10n_et/l10n_et_wizard.xml +++ b/addons/l10n_et/l10n_et_wizard.xml @@ -1,8 +1,14 @@ + open + + + done + + diff --git a/addons/l10n_fr/l10n_fr_wizard.xml b/addons/l10n_fr/l10n_fr_wizard.xml index 704ac4daf38..193de99eeb4 100644 --- a/addons/l10n_fr/l10n_fr_wizard.xml +++ b/addons/l10n_fr/l10n_fr_wizard.xml @@ -1,9 +1,14 @@ + open + + done + + diff --git a/addons/l10n_gr/l10n_gr_wizard.xml b/addons/l10n_gr/l10n_gr_wizard.xml index 52aaa88fdab..71b98ed174b 100644 --- a/addons/l10n_gr/l10n_gr_wizard.xml +++ b/addons/l10n_gr/l10n_gr_wizard.xml @@ -1,8 +1,13 @@ + open - + + + done + + diff --git a/addons/l10n_gt/l10n_gt_base.xml b/addons/l10n_gt/l10n_gt_base.xml index 8caf6ebe48c..ddce9748193 100644 --- a/addons/l10n_gt/l10n_gt_base.xml +++ b/addons/l10n_gt/l10n_gt_base.xml @@ -4,6 +4,10 @@ open + + + done + diff --git a/addons/l10n_hn/l10n_hn_base.xml b/addons/l10n_hn/l10n_hn_base.xml index b8b85c3f2a7..63cf79a441f 100644 --- a/addons/l10n_hn/l10n_hn_base.xml +++ b/addons/l10n_hn/l10n_hn_base.xml @@ -5,6 +5,10 @@ open + + + done + diff --git a/addons/l10n_hr/l10n_hr_wizard.xml b/addons/l10n_hr/l10n_hr_wizard.xml index b736f241607..25cc74eb4a6 100644 --- a/addons/l10n_hr/l10n_hr_wizard.xml +++ b/addons/l10n_hr/l10n_hr_wizard.xml @@ -1,8 +1,14 @@ + open + + + done + + diff --git a/addons/l10n_in/l10n_in_wizard.xml b/addons/l10n_in/l10n_in_wizard.xml index 704ac4daf38..193de99eeb4 100644 --- a/addons/l10n_in/l10n_in_wizard.xml +++ b/addons/l10n_in/l10n_in_wizard.xml @@ -1,9 +1,14 @@ + open + + done + + diff --git a/addons/l10n_it/l10n_chart_it_generic.xml b/addons/l10n_it/l10n_chart_it_generic.xml index dde7a77516a..71b98ed174b 100644 --- a/addons/l10n_it/l10n_chart_it_generic.xml +++ b/addons/l10n_it/l10n_chart_it_generic.xml @@ -1,7 +1,13 @@ + open + + + done + + diff --git a/addons/l10n_lu/l10n_lu_wizard.xml b/addons/l10n_lu/l10n_lu_wizard.xml index 52aaa88fdab..22953449166 100644 --- a/addons/l10n_lu/l10n_lu_wizard.xml +++ b/addons/l10n_lu/l10n_lu_wizard.xml @@ -1,8 +1,13 @@ + open + + done + + diff --git a/addons/l10n_ma/l10n_ma_tax.xml b/addons/l10n_ma/l10n_ma_tax.xml index 070d2d4fc9b..f296b22edca 100644 --- a/addons/l10n_ma/l10n_ma_tax.xml +++ b/addons/l10n_ma/l10n_ma_tax.xml @@ -742,7 +742,8 @@ - + + diff --git a/addons/l10n_ma/l10n_ma_wizard.xml b/addons/l10n_ma/l10n_ma_wizard.xml index 52aaa88fdab..22953449166 100644 --- a/addons/l10n_ma/l10n_ma_wizard.xml +++ b/addons/l10n_ma/l10n_ma_wizard.xml @@ -1,8 +1,13 @@ + open + + done + + diff --git a/addons/l10n_mx/data/l10n_chart_mx_wizard.xml b/addons/l10n_mx/data/l10n_chart_mx_wizard.xml index e73c75c3506..baf1a49fc54 100644 --- a/addons/l10n_mx/data/l10n_chart_mx_wizard.xml +++ b/addons/l10n_mx/data/l10n_chart_mx_wizard.xml @@ -1,8 +1,14 @@ - - open - + + + open + + + + done + + diff --git a/addons/l10n_nl/l10n_nl_wizard.xml b/addons/l10n_nl/l10n_nl_wizard.xml index 52aaa88fdab..3b11bd90c90 100644 --- a/addons/l10n_nl/l10n_nl_wizard.xml +++ b/addons/l10n_nl/l10n_nl_wizard.xml @@ -1,8 +1,13 @@ + open - + + + done + + diff --git a/addons/l10n_pa/l10n_pa_wizard.xml b/addons/l10n_pa/l10n_pa_wizard.xml index 4de61247b90..8acb61d7edf 100644 --- a/addons/l10n_pa/l10n_pa_wizard.xml +++ b/addons/l10n_pa/l10n_pa_wizard.xml @@ -6,5 +6,9 @@ open + + done + + diff --git a/addons/l10n_pe/l10n_pe_wizard.xml b/addons/l10n_pe/l10n_pe_wizard.xml index 82e7671b4d3..b18ee6e26ca 100644 --- a/addons/l10n_pe/l10n_pe_wizard.xml +++ b/addons/l10n_pe/l10n_pe_wizard.xml @@ -6,5 +6,9 @@ open + + done + + diff --git a/addons/l10n_pl/l10n_chart_pl_wizard.xml b/addons/l10n_pl/l10n_chart_pl_wizard.xml index 52aaa88fdab..22953449166 100644 --- a/addons/l10n_pl/l10n_chart_pl_wizard.xml +++ b/addons/l10n_pl/l10n_chart_pl_wizard.xml @@ -1,8 +1,13 @@ + open + + done + + diff --git a/addons/l10n_pt/l10n_chart_pt_wizard.xml b/addons/l10n_pt/l10n_chart_pt_wizard.xml index 52aaa88fdab..22953449166 100644 --- a/addons/l10n_pt/l10n_chart_pt_wizard.xml +++ b/addons/l10n_pt/l10n_chart_pt_wizard.xml @@ -1,8 +1,13 @@ + open + + done + + diff --git a/addons/l10n_ro/l10n_chart_ro_wizard.xml b/addons/l10n_ro/l10n_chart_ro_wizard.xml index 52aaa88fdab..22953449166 100644 --- a/addons/l10n_ro/l10n_chart_ro_wizard.xml +++ b/addons/l10n_ro/l10n_chart_ro_wizard.xml @@ -1,8 +1,13 @@ + open + + done + + diff --git a/addons/l10n_si/l10n_si_wizard.xml b/addons/l10n_si/l10n_si_wizard.xml index 5a4b51a01e9..65e60217eb3 100644 --- a/addons/l10n_si/l10n_si_wizard.xml +++ b/addons/l10n_si/l10n_si_wizard.xml @@ -1,8 +1,14 @@ + open + + + done + + diff --git a/addons/l10n_syscohada/l10n_syscohada_wizard.xml b/addons/l10n_syscohada/l10n_syscohada_wizard.xml index dde7a77516a..2f815a22ff6 100644 --- a/addons/l10n_syscohada/l10n_syscohada_wizard.xml +++ b/addons/l10n_syscohada/l10n_syscohada_wizard.xml @@ -1,7 +1,13 @@ + open + + + done + + diff --git a/addons/l10n_th/account_data.xml b/addons/l10n_th/account_data.xml index 9ae3d9e3364..5df58bc3867 100644 --- a/addons/l10n_th/account_data.xml +++ b/addons/l10n_th/account_data.xml @@ -645,8 +645,14 @@ + open + + + done + + diff --git a/addons/l10n_tr/l10n_tr_wizard.xml b/addons/l10n_tr/l10n_tr_wizard.xml index 66b9d37221b..a2c8c45c2de 100644 --- a/addons/l10n_tr/l10n_tr_wizard.xml +++ b/addons/l10n_tr/l10n_tr_wizard.xml @@ -1,8 +1,14 @@ + open + + + done + + diff --git a/addons/l10n_uk/l10n_uk_wizard.xml b/addons/l10n_uk/l10n_uk_wizard.xml index 8a6f1a5a83c..b488b5b53f0 100644 --- a/addons/l10n_uk/l10n_uk_wizard.xml +++ b/addons/l10n_uk/l10n_uk_wizard.xml @@ -1,9 +1,14 @@ + open + + done + + diff --git a/addons/l10n_us/__openerp__.py b/addons/l10n_us/__openerp__.py index 90c0e6fd4ad..cc0de9350f2 100644 --- a/addons/l10n_us/__openerp__.py +++ b/addons/l10n_us/__openerp__.py @@ -36,7 +36,8 @@ United States - Chart of accounts. 'account_tax_code_template.xml', 'account_tax_template.xml', 'account_chart_template_after.xml', - 'l10n_us_wizard.xml' + 'l10n_us_wizard.xml', + 'account_chart_template_set_accounts.xml' ], 'demo': [], 'test': [], diff --git a/addons/l10n_us/l10n_us_wizard.xml b/addons/l10n_us/l10n_us_wizard.xml index 52aaa88fdab..7d53a61910c 100644 --- a/addons/l10n_us/l10n_us_wizard.xml +++ b/addons/l10n_us/l10n_us_wizard.xml @@ -1,8 +1,17 @@ + + + {'default_currency_id': "USD"} + + open - + + + done + + diff --git a/addons/l10n_uy/l10n_uy_wizard.xml b/addons/l10n_uy/l10n_uy_wizard.xml index 3dea57dc5c2..4a82f72ca23 100644 --- a/addons/l10n_uy/l10n_uy_wizard.xml +++ b/addons/l10n_uy/l10n_uy_wizard.xml @@ -4,5 +4,10 @@ open + + + done + + diff --git a/addons/l10n_ve/data/account_tax.xml b/addons/l10n_ve/data/account_tax.xml index d28b0d1d8f3..915761fc92a 100644 --- a/addons/l10n_ve/data/account_tax.xml +++ b/addons/l10n_ve/data/account_tax.xml @@ -1,12 +1,12 @@ - + Exento 0.00000 percent - sale + all @@ -14,7 +14,6 @@ - IVA (12.0%) ventas @@ -54,19 +53,6 @@ - - - Exento - 0.00000 - percent - purchase - - - - - - - IVA (12.0%) compras diff --git a/addons/l10n_ve/data/l10n_chart_ve_wizard.xml b/addons/l10n_ve/data/l10n_chart_ve_wizard.xml index dde7a77516a..e772699014f 100644 --- a/addons/l10n_ve/data/l10n_chart_ve_wizard.xml +++ b/addons/l10n_ve/data/l10n_chart_ve_wizard.xml @@ -3,5 +3,10 @@ open + + + done + + diff --git a/addons/l10n_vn/l10n_vn_wizard.xml b/addons/l10n_vn/l10n_vn_wizard.xml index 368a3cbd8b3..f84b8d654e4 100755 --- a/addons/l10n_vn/l10n_vn_wizard.xml +++ b/addons/l10n_vn/l10n_vn_wizard.xml @@ -5,6 +5,10 @@ open + + + done + \ No newline at end of file From 00711ec5bdd7df523196f3f5a2d712f47ccace9a Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Mon, 2 Sep 2013 16:06:29 +0530 Subject: [PATCH 090/110] [IMP] set defalut cot as per last configuration wizard. bzr revid: tpa@tinyerp.com-20130902103629-9d1joumo51b7w8qg --- addons/account/account.py | 5 ++++- addons/account/account_installer.xml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 33b52b643ed..4773547df30 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -3076,7 +3076,10 @@ class wizard_multi_charts_accounts(osv.osv_memory): ids = self.pool.get('account.chart.template').search(cr, uid, [('visible', '=', True)], context=context) if ids: if 'chart_template_id' in fields: - res.update({'only_one_chart_template': len(ids) == 1, 'chart_template_id': ids[0]}) + chart_id = ids[0] + if context.get("default_charts"): + chart_id = self.pool.get('ir.model.data').search_read(cr, uid, [('model','=','account.chart.template'),('module','=',context.get("default_charts"))], ['res_id'], context=context)[0]['res_id'] + res.update({'only_one_chart_template': len(ids) == 1, 'chart_template_id': chart_id}) if 'sale_tax' in fields: sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id" , "=", ids[0]), ('type_tax_use', 'in', ('sale','all'))], order="sequence") diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml index b03babc63ac..8d1b25b299f 100644 --- a/addons/account/account_installer.xml +++ b/addons/account/account_installer.xml @@ -10,7 +10,7 @@
-
From 1b0ad7b55f013f94e39aac141d4f8edf0cd31847 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Mon, 2 Sep 2013 16:59:43 +0530 Subject: [PATCH 091/110] [IMP] l10n_us: improved code to set default recivable and payble accounts. bzr revid: tpa@tinyerp.com-20130902112943-cj3jbtn1bt5n15y2 --- addons/account/account.py | 1 + addons/l10n_us/account_chart_template_after.xml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/addons/account/account.py b/addons/account/account.py index c298a15646b..45308a9e7d4 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -3030,6 +3030,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): } def onchange_company_id(self, cr, uid, ids, company_id, context=None): + if context is None:context = {} if context.get('default_currency_id', False): dummy, view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', context.get('default_currency_id')) return {'value': {'currency_id': view_id}} diff --git a/addons/l10n_us/account_chart_template_after.xml b/addons/l10n_us/account_chart_template_after.xml index 5ca3a169aba..4dea930f09f 100644 --- a/addons/l10n_us/account_chart_template_after.xml +++ b/addons/l10n_us/account_chart_template_after.xml @@ -6,6 +6,8 @@ + + From 34862b9d247571606b11b751542751b9720d5627 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Mon, 2 Sep 2013 18:38:39 +0530 Subject: [PATCH 092/110] [ADD] added currency_id in account.chart.template and remove onchange from company_id to set currency in account data configuration wizard and set currency_in in l10n_us. bzr revid: tpa@tinyerp.com-20130902130839-mpvu7nfzefmzh9kq --- addons/account/account.py | 14 +++----------- addons/account/account_view.xml | 2 +- addons/l10n_us/account_chart_template.xml | 9 +++++++++ addons/l10n_us/l10n_us_wizard.xml | 8 ++------ 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 45308a9e7d4..1a593e4ad59 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2774,6 +2774,7 @@ class account_chart_template(osv.osv): 'parent_id': fields.many2one('account.chart.template', 'Parent Chart Template'), 'code_digits': fields.integer('# of Digits', required=True, help="No. of Digits to use for account code"), 'visible': fields.boolean('Can be Visible?', help="Set this to False if you don't want this template to be used actively in the wizard that generate Chart of Accounts from templates, this is useful when you want to generate accounts of this template only when loading its child template."), + 'currency_id': fields.many2one('res.currency', 'Currency'), 'complete_tax_set': fields.boolean('Complete Set of Taxes', help='This boolean helps you to choose if you want to propose to the user to encode the sale and purchase rates or choose from list of taxes. This last choice assumes that the set of tax defined on this template is complete'), 'account_root_id': fields.many2one('account.account.template', 'Root Account', domain=[('parent_id','=',False)]), 'tax_code_root_id': fields.many2one('account.tax.code.template', 'Root Tax Code', domain=[('parent_id','=',False)]), @@ -3029,16 +3030,6 @@ class wizard_multi_charts_accounts(osv.osv_memory): 'complete_tax_set': fields.boolean('Complete Set of Taxes', help='This boolean helps you to choose if you want to propose to the user to encode the sales and purchase rates or use the usual m2o fields. This last choice assumes that the set of tax defined for the chosen template is complete'), } - def onchange_company_id(self, cr, uid, ids, company_id, context=None): - if context is None:context = {} - if context.get('default_currency_id', False): - dummy, view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'base', context.get('default_currency_id')) - return {'value': {'currency_id': view_id}} - currency_id = False - if company_id: - currency_id = self.pool.get('res.company').browse(cr, uid, company_id, context=context).currency_id.id - return {'value': {'currency_id': currency_id}} - def onchange_tax_rate(self, cr, uid, ids, rate=False, context=None): return {'value': {'purchase_tax_rate': rate or False}} @@ -3048,7 +3039,8 @@ class wizard_multi_charts_accounts(osv.osv_memory): res['value'] = {'complete_tax_set': False, 'sale_tax': False, 'purchase_tax': False} if chart_template_id: data = self.pool.get('account.chart.template').browse(cr, uid, chart_template_id, context=context) - res['value'].update({'complete_tax_set': data.complete_tax_set}) + currency_id = data.currency_id.id or self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.currency_id.id + res['value'].update({'complete_tax_set': data.complete_tax_set, 'currency_id': currency_id}) if data.complete_tax_set: # default tax is given by the lowest sequence. For same sequence we will take the latest created as it will be the case for tax created while isntalling the generic chart of account sale_tax_ids = tax_templ_obj.search(cr, uid, [("chart_template_id" diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 91c6d6608fd..cb53d7d8fdc 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -2120,7 +2120,7 @@ - + @@ -13,45 +14,53 @@ + Advertising + Agriculture + Construction Trades (Plumber, Electrician, HVAC, etc.) + Financial Services other than Accounting or Bookkeeping + General Service-Based Business + Legal Services + General Product-Based Business + diff --git a/addons/l10n_us/l10n_us_wizard.xml b/addons/l10n_us/l10n_us_wizard.xml index 9373935b22c..19d27fb47c7 100644 --- a/addons/l10n_us/l10n_us_wizard.xml +++ b/addons/l10n_us/l10n_us_wizard.xml @@ -1,13 +1,9 @@ - - - {'default_currency_id': "USD"} - - + open - + From e7ef5b87909dc6acaedf8b0660b2ba87189e1d6c Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Tue, 3 Sep 2013 11:07:15 +0530 Subject: [PATCH 093/110] [IMP] in order to set default chart which was last created set max of ids. bzr revid: tpa@tinyerp.com-20130903053715-zyduv0q0b81lz0vq --- addons/account/account.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/account/account.py b/addons/account/account.py index 1a593e4ad59..9f9ee187d69 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -3072,7 +3072,8 @@ class wizard_multi_charts_accounts(osv.osv_memory): ids = self.pool.get('account.chart.template').search(cr, uid, [('visible', '=', True)], context=context) if ids: if 'chart_template_id' in fields: - chart_id = ids[0] + #in order to get set default chart which was last created set max of ids. + chart_id = max(ids) if context.get("default_charts"): chart_id = self.pool.get('ir.model.data').search_read(cr, uid, [('model','=','account.chart.template'),('module','=',context.get("default_charts"))], ['res_id'], context=context)[0]['res_id'] res.update({'only_one_chart_template': len(ids) == 1, 'chart_template_id': chart_id}) From 305e9f5cddf209db45e5bb5c6cfa7d7838b171f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 3 Sep 2013 16:58:40 +0200 Subject: [PATCH 094/110] [ADD] web, web_kanban: moved sparkline and gauge widgets from crm and sale_crm into web, because other modules will have to use it in kanban veiws. bzr revid: tde@openerp.com-20130903145840-uxt0blhjcly1oz3o --- addons/web/__openerp__.py | 2 + .../lib/jquery.sparkline/jquery.sparkline.js | 3047 +++++++++++++++++ .../web/static/lib/justgage/justgage.1.0.1.js | 946 +++++ addons/web/static/lib/qweb/qweb2.js | 1 + addons/web_kanban/static/src/js/kanban.js | 142 + 5 files changed, 4138 insertions(+) create mode 100644 addons/web/static/lib/jquery.sparkline/jquery.sparkline.js create mode 100644 addons/web/static/lib/justgage/justgage.1.0.1.js diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 5c8d27e11cb..32a108c131d 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -32,9 +32,11 @@ This module provides the core of the OpenERP Web Client. "static/lib/jquery.ui.notify/js/jquery.notify.js", "static/lib/jquery.deferred-queue/jquery.deferred-queue.js", "static/lib/jquery.scrollTo/jquery.scrollTo-min.js", + "static/lib/jquery.sparkline/jquery.sparkline.js", "static/lib/jquery.tipsy/jquery.tipsy.js", "static/lib/jquery.textext/jquery.textext.js", "static/lib/jquery.timeago/jquery.timeago.js", + "static/lib/justgage/justgage.1.0.1.js", "static/lib/qweb/qweb2.js", "static/lib/underscore/underscore.js", "static/lib/underscore.string/lib/underscore.string.js", diff --git a/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js b/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js new file mode 100644 index 00000000000..8069db45fe9 --- /dev/null +++ b/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js @@ -0,0 +1,3047 @@ +/** +* +* jquery.sparkline.js +* +* v2.1.1 +* (c) Splunk, Inc +* Contact: Gareth Watts (gareth@splunk.com) +* http://omnipotent.net/jquery.sparkline/ +* +* Generates inline sparkline charts from data supplied either to the method +* or inline in HTML +* +* Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag +* (Firefox 2.0+, Safari, Opera, etc) +* +* License: New BSD License +* +* Copyright (c) 2012, Splunk Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* * Neither the name of Splunk Inc nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +* Usage: +* $(selector).sparkline(values, options) +* +* If values is undefined or set to 'html' then the data values are read from the specified tag: +*

Sparkline: 1,4,6,6,8,5,3,5

+* $('.sparkline').sparkline(); +* There must be no spaces in the enclosed data set +* +* Otherwise values must be an array of numbers or null values +*

Sparkline: This text replaced if the browser is compatible

+* $('#sparkline1').sparkline([1,4,6,6,8,5,3,5]) +* $('#sparkline2').sparkline([1,4,6,null,null,5,3,5]) +* +* Values can also be specified in an HTML comment, or as a values attribute: +*

Sparkline:

+*

Sparkline:

+* $('.sparkline').sparkline(); +* +* For line charts, x values can also be specified: +*

Sparkline: 1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5

+* $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ]) +* +* By default, options should be passed in as teh second argument to the sparkline function: +* $('.sparkline').sparkline([1,2,3,4], {type: 'bar'}) +* +* Options can also be set by passing them on the tag itself. This feature is disabled by default though +* as there's a slight performance overhead: +* $('.sparkline').sparkline([1,2,3,4], {enableTagOptions: true}) +*

Sparkline: loading

+* Prefix all options supplied as tag attribute with "spark" (configurable by setting tagOptionPrefix) +* +* Supported options: +* lineColor - Color of the line used for the chart +* fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart +* width - Width of the chart - Defaults to 3 times the number of values in pixels +* height - Height of the chart - Defaults to the height of the containing element +* chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied +* chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied +* chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax +* chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied +* chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied +* composite - If true then don't erase any existing chart attached to the tag, but draw +* another chart over the top - Note that width and height are ignored if an +* existing chart is detected. +* tagValuesAttribute - Name of tag attribute to check for data values - Defaults to 'values' +* enableTagOptions - Whether to check tags for sparkline options +* tagOptionPrefix - Prefix used for options supplied as tag attributes - Defaults to 'spark' +* disableHiddenCheck - If set to true, then the plugin will assume that charts will never be drawn into a +* hidden dom element, avoding a browser reflow +* disableInteraction - If set to true then all mouseover/click interaction behaviour will be disabled, +* making the plugin perform much like it did in 1.x +* disableTooltips - If set to true then tooltips will be disabled - Defaults to false (tooltips enabled) +* disableHighlight - If set to true then highlighting of selected chart elements on mouseover will be disabled +* defaults to false (highlights enabled) +* highlightLighten - Factor to lighten/darken highlighted chart values by - Defaults to 1.4 for a 40% increase +* tooltipContainer - Specify which DOM element the tooltip should be rendered into - defaults to document.body +* tooltipClassname - Optional CSS classname to apply to tooltips - If not specified then a default style will be applied +* tooltipOffsetX - How many pixels away from the mouse pointer to render the tooltip on the X axis +* tooltipOffsetY - How many pixels away from the mouse pointer to render the tooltip on the r axis +* tooltipFormatter - Optional callback that allows you to override the HTML displayed in the tooltip +* callback is given arguments of (sparkline, options, fields) +* tooltipChartTitle - If specified then the tooltip uses the string specified by this setting as a title +* tooltipFormat - A format string or SPFormat object (or an array thereof for multiple entries) +* to control the format of the tooltip +* tooltipPrefix - A string to prepend to each field displayed in a tooltip +* tooltipSuffix - A string to append to each field displayed in a tooltip +* tooltipSkipNull - If true then null values will not have a tooltip displayed (defaults to true) +* tooltipValueLookups - An object or range map to map field values to tooltip strings +* (eg. to map -1 to "Lost", 0 to "Draw", and 1 to "Win") +* numberFormatter - Optional callback for formatting numbers in tooltips +* numberDigitGroupSep - Character to use for group separator in numbers "1,234" - Defaults to "," +* numberDecimalMark - Character to use for the decimal point when formatting numbers - Defaults to "." +* numberDigitGroupCount - Number of digits between group separator - Defaults to 3 +* +* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default), +* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box' +* line - Line chart. Options: +* spotColor - Set to '' to not end each line in a circular spot +* minSpotColor - If set, color of spot at minimum value +* maxSpotColor - If set, color of spot at maximum value +* spotRadius - Radius in pixels +* lineWidth - Width of line in pixels +* normalRangeMin +* normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal" +* or expected range of values +* normalRangeColor - Color to use for the above bar +* drawNormalOnTop - Draw the normal range above the chart fill color if true +* defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart +* highlightSpotColor - The color to use for drawing a highlight spot on mouseover - Set to null to disable +* highlightLineColor - The color to use for drawing a highlight line on mouseover - Set to null to disable +* valueSpots - Specify which points to draw spots on, and in which color. Accepts a range map +* +* bar - Bar chart. Options: +* barColor - Color of bars for postive values +* negBarColor - Color of bars for negative values +* zeroColor - Color of bars with zero values +* nullColor - Color of bars with null values - Defaults to omitting the bar entirely +* barWidth - Width of bars in pixels +* colorMap - Optional mappnig of values to colors to override the *BarColor values above +* can be an Array of values to control the color of individual bars or a range map +* to specify colors for individual ranges of values +* barSpacing - Gap between bars in pixels +* zeroAxis - Centers the y-axis around zero if true +* +* tristate - Charts values of win (>0), lose (<0) or draw (=0) +* posBarColor - Color of win values +* negBarColor - Color of lose values +* zeroBarColor - Color of draw values +* barWidth - Width of bars in pixels +* barSpacing - Gap between bars in pixels +* colorMap - Optional mappnig of values to colors to override the *BarColor values above +* can be an Array of values to control the color of individual bars or a range map +* to specify colors for individual ranges of values +* +* discrete - Options: +* lineHeight - Height of each line in pixels - Defaults to 30% of the graph height +* thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor +* thresholdColor +* +* bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ... +* options: +* targetColor - The color of the vertical target marker +* targetWidth - The width of the target marker in pixels +* performanceColor - The color of the performance measure horizontal bar +* rangeColors - Colors to use for each qualitative range background color +* +* pie - Pie chart. Options: +* sliceColors - An array of colors to use for pie slices +* offset - Angle in degrees to offset the first slice - Try -90 or +90 +* borderWidth - Width of border to draw around the pie chart, in pixels - Defaults to 0 (no border) +* borderColor - Color to use for the pie chart border - Defaults to #000 +* +* box - Box plot. Options: +* raw - Set to true to supply pre-computed plot points as values +* values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier +* When set to false you can supply any number of values and the box plot will +* be computed for you. Default is false. +* showOutliers - Set to true (default) to display outliers as circles +* outlierIQR - Interquartile range used to determine outliers. Default 1.5 +* boxLineColor - Outline color of the box +* boxFillColor - Fill color for the box +* whiskerColor - Line color used for whiskers +* outlierLineColor - Outline color of outlier circles +* outlierFillColor - Fill color of the outlier circles +* spotRadius - Radius of outlier circles +* medianColor - Line color of the median line +* target - Draw a target cross hair at the supplied value (default undefined) +* +* +* +* Examples: +* $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false }); +* $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 }); +* $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }): +* $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' }); +* $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' }); +* $('#pie').sparkline([1,1,2], { type:'pie' }); +*/ + +/*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */ + +(function(factory) { + if(typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } + else { + factory(jQuery); + } +} +(function($) { + 'use strict'; + + var UNSET_OPTION = {}, + getDefaults, createClass, SPFormat, clipval, quartile, normalizeValue, normalizeValues, + remove, isNumber, all, sum, addCSS, ensureArray, formatNumber, RangeMap, + MouseHandler, Tooltip, barHighlightMixin, + line, bar, tristate, discrete, bullet, pie, box, defaultStyles, initStyles, + VShape, VCanvas_base, VCanvas_canvas, VCanvas_vml, pending, shapeCount = 0; + + /** + * Default configuration settings + */ + getDefaults = function () { + return { + // Settings common to most/all chart types + common: { + type: 'line', + lineColor: '#00f', + fillColor: '#cdf', + defaultPixelsPerValue: 3, + width: 'auto', + height: 'auto', + composite: false, + tagValuesAttribute: 'values', + tagOptionsPrefix: 'spark', + enableTagOptions: false, + enableHighlight: true, + highlightLighten: 1.4, + tooltipSkipNull: true, + tooltipPrefix: '', + tooltipSuffix: '', + disableHiddenCheck: false, + numberFormatter: false, + numberDigitGroupCount: 3, + numberDigitGroupSep: ',', + numberDecimalMark: '.', + disableTooltips: false, + disableInteraction: false + }, + // Defaults for line charts + line: { + spotColor: '#f80', + highlightSpotColor: '#5f5', + highlightLineColor: '#f22', + spotRadius: 1.5, + minSpotColor: '#f80', + maxSpotColor: '#f80', + lineWidth: 1, + normalRangeMin: undefined, + normalRangeMax: undefined, + normalRangeColor: '#ccc', + drawNormalOnTop: false, + chartRangeMin: undefined, + chartRangeMax: undefined, + chartRangeMinX: undefined, + chartRangeMaxX: undefined, + tooltipFormat: new SPFormat(' {{prefix}}{{y}}{{suffix}}') + }, + // Defaults for bar charts + bar: { + barColor: '#3366cc', + negBarColor: '#f44', + stackedBarColor: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', + '#dd4477', '#0099c6', '#990099'], + zeroColor: undefined, + nullColor: undefined, + zeroAxis: true, + barWidth: 4, + barSpacing: 1, + chartRangeMax: undefined, + chartRangeMin: undefined, + chartRangeClip: false, + colorMap: undefined, + tooltipFormat: new SPFormat(' {{prefix}}{{value}}{{suffix}}') + }, + // Defaults for tristate charts + tristate: { + barWidth: 4, + barSpacing: 1, + posBarColor: '#6f6', + negBarColor: '#f44', + zeroBarColor: '#999', + colorMap: {}, + tooltipFormat: new SPFormat(' {{value:map}}'), + tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } } + }, + // Defaults for discrete charts + discrete: { + lineHeight: 'auto', + thresholdColor: undefined, + thresholdValue: 0, + chartRangeMax: undefined, + chartRangeMin: undefined, + chartRangeClip: false, + tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}') + }, + // Defaults for bullet charts + bullet: { + targetColor: '#f33', + targetWidth: 3, // width of the target bar in pixels + performanceColor: '#33f', + rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'], + base: undefined, // set this to a number to change the base start number + tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'), + tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} } + }, + // Defaults for pie charts + pie: { + offset: 0, + sliceColors: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', + '#dd4477', '#0099c6', '#990099'], + borderWidth: 0, + borderColor: '#000', + tooltipFormat: new SPFormat(' {{value}} ({{percent.1}}%)') + }, + // Defaults for box plots + box: { + raw: false, + boxLineColor: '#000', + boxFillColor: '#cdf', + whiskerColor: '#000', + outlierLineColor: '#333', + outlierFillColor: '#fff', + medianColor: '#f00', + showOutliers: true, + outlierIQR: 1.5, + spotRadius: 1.5, + target: undefined, + targetColor: '#4a2', + chartRangeMax: undefined, + chartRangeMin: undefined, + tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'), + tooltipFormatFieldlistKey: 'field', + tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median', + uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier', + lw: 'Left Whisker', rw: 'Right Whisker'} } + } + }; + }; + + // You can have tooltips use a css class other than jqstooltip by specifying tooltipClassname + defaultStyles = '.jqstooltip { ' + + 'position: absolute;' + + 'left: 0px;' + + 'top: 0px;' + + 'visibility: hidden;' + + 'background: rgb(0, 0, 0) transparent;' + + 'background-color: rgba(0,0,0,0.6);' + + 'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);' + + '-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";' + + 'color: white;' + + 'font: 10px arial, san serif;' + + 'text-align: left;' + + 'white-space: nowrap;' + + 'padding: 5px;' + + 'border: 1px solid white;' + + 'z-index: 10000;' + + '}' + + '.jqsfield { ' + + 'color: white;' + + 'font: 10px arial, san serif;' + + 'text-align: left;' + + '}'; + + /** + * Utilities + */ + + createClass = function (/* [baseclass, [mixin, ...]], definition */) { + var Class, args; + Class = function () { + this.init.apply(this, arguments); + }; + if (arguments.length > 1) { + if (arguments[0]) { + Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]); + Class._super = arguments[0].prototype; + } else { + Class.prototype = arguments[arguments.length - 1]; + } + if (arguments.length > 2) { + args = Array.prototype.slice.call(arguments, 1, -1); + args.unshift(Class.prototype); + $.extend.apply($, args); + } + } else { + Class.prototype = arguments[0]; + } + Class.prototype.cls = Class; + return Class; + }; + + /** + * Wraps a format string for tooltips + * {{x}} + * {{x.2} + * {{x:months}} + */ + $.SPFormatClass = SPFormat = createClass({ + fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g, + precre: /(\w+)\.(\d+)/, + + init: function (format, fclass) { + this.format = format; + this.fclass = fclass; + }, + + render: function (fieldset, lookups, options) { + var self = this, + fields = fieldset, + match, token, lookupkey, fieldvalue, prec; + return this.format.replace(this.fre, function () { + var lookup; + token = arguments[1]; + lookupkey = arguments[3]; + match = self.precre.exec(token); + if (match) { + prec = match[2]; + token = match[1]; + } else { + prec = false; + } + fieldvalue = fields[token]; + if (fieldvalue === undefined) { + return ''; + } + if (lookupkey && lookups && lookups[lookupkey]) { + lookup = lookups[lookupkey]; + if (lookup.get) { // RangeMap + return lookups[lookupkey].get(fieldvalue) || fieldvalue; + } else { + return lookups[lookupkey][fieldvalue] || fieldvalue; + } + } + if (isNumber(fieldvalue)) { + if (options.get('numberFormatter')) { + fieldvalue = options.get('numberFormatter')(fieldvalue); + } else { + fieldvalue = formatNumber(fieldvalue, prec, + options.get('numberDigitGroupCount'), + options.get('numberDigitGroupSep'), + options.get('numberDecimalMark')); + } + } + return fieldvalue; + }); + } + }); + + // convience method to avoid needing the new operator + $.spformat = function(format, fclass) { + return new SPFormat(format, fclass); + }; + + clipval = function (val, min, max) { + if (val < min) { + return min; + } + if (val > max) { + return max; + } + return val; + }; + + quartile = function (values, q) { + var vl; + if (q === 2) { + vl = Math.floor(values.length / 2); + return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2; + } else { + if (values.length % 2 ) { // odd + vl = (values.length * q + q) / 4; + return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; + } else { //even + vl = (values.length * q + 2) / 4; + return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; + + } + } + }; + + normalizeValue = function (val) { + var nf; + switch (val) { + case 'undefined': + val = undefined; + break; + case 'null': + val = null; + break; + case 'true': + val = true; + break; + case 'false': + val = false; + break; + default: + nf = parseFloat(val); + if (val == nf) { + val = nf; + } + } + return val; + }; + + normalizeValues = function (vals) { + var i, result = []; + for (i = vals.length; i--;) { + result[i] = normalizeValue(vals[i]); + } + return result; + }; + + remove = function (vals, filter) { + var i, vl, result = []; + for (i = 0, vl = vals.length; i < vl; i++) { + if (vals[i] !== filter) { + result.push(vals[i]); + } + } + return result; + }; + + isNumber = function (num) { + return !isNaN(parseFloat(num)) && isFinite(num); + }; + + formatNumber = function (num, prec, groupsize, groupsep, decsep) { + var p, i; + num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split(''); + p = (p = $.inArray('.', num)) < 0 ? num.length : p; + if (p < num.length) { + num[p] = decsep; + } + for (i = p - groupsize; i > 0; i -= groupsize) { + num.splice(i, 0, groupsep); + } + return num.join(''); + }; + + // determine if all values of an array match a value + // returns true if the array is empty + all = function (val, arr, ignoreNull) { + var i; + for (i = arr.length; i--; ) { + if (ignoreNull && arr[i] === null) continue; + if (arr[i] !== val) { + return false; + } + } + return true; + }; + + // sums the numeric values in an array, ignoring other values + sum = function (vals) { + var total = 0, i; + for (i = vals.length; i--;) { + total += typeof vals[i] === 'number' ? vals[i] : 0; + } + return total; + }; + + ensureArray = function (val) { + return $.isArray(val) ? val : [val]; + }; + + // http://paulirish.com/2008/bookmarklet-inject-new-css-rules/ + addCSS = function(css) { + var tag; + //if ('\v' == 'v') /* ie only */ { + if (document.createStyleSheet) { + document.createStyleSheet().cssText = css; + } else { + tag = document.createElement('style'); + tag.type = 'text/css'; + document.getElementsByTagName('head')[0].appendChild(tag); + tag[(typeof document.body.style.WebkitAppearance == 'string') /* webkit only */ ? 'innerText' : 'innerHTML'] = css; + } + }; + + // Provide a cross-browser interface to a few simple drawing primitives + $.fn.simpledraw = function (width, height, useExisting, interact) { + var target, mhandler; + if (useExisting && (target = this.data('_jqs_vcanvas'))) { + return target; + } + if (width === undefined) { + width = $(this).innerWidth(); + } + if (height === undefined) { + height = $(this).innerHeight(); + } + if ($.fn.sparkline.hasCanvas) { + target = new VCanvas_canvas(width, height, this, interact); + } else if ($.fn.sparkline.hasVML) { + target = new VCanvas_vml(width, height, this); + } else { + return false; + } + mhandler = $(this).data('_jqs_mhandler'); + if (mhandler) { + mhandler.registerCanvas(target); + } + return target; + }; + + $.fn.cleardraw = function () { + var target = this.data('_jqs_vcanvas'); + if (target) { + target.reset(); + } + }; + + $.RangeMapClass = RangeMap = createClass({ + init: function (map) { + var key, range, rangelist = []; + for (key in map) { + if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) { + range = key.split(':'); + range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]); + range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]); + range[2] = map[key]; + rangelist.push(range); + } + } + this.map = map; + this.rangelist = rangelist || false; + }, + + get: function (value) { + var rangelist = this.rangelist, + i, range, result; + if ((result = this.map[value]) !== undefined) { + return result; + } + if (rangelist) { + for (i = rangelist.length; i--;) { + range = rangelist[i]; + if (range[0] <= value && range[1] >= value) { + return range[2]; + } + } + } + return undefined; + } + }); + + // Convenience function + $.range_map = function(map) { + return new RangeMap(map); + }; + + MouseHandler = createClass({ + init: function (el, options) { + var $el = $(el); + this.$el = $el; + this.options = options; + this.currentPageX = 0; + this.currentPageY = 0; + this.el = el; + this.splist = []; + this.tooltip = null; + this.over = false; + this.displayTooltips = !options.get('disableTooltips'); + this.highlightEnabled = !options.get('disableHighlight'); + }, + + registerSparkline: function (sp) { + this.splist.push(sp); + if (this.over) { + this.updateDisplay(); + } + }, + + registerCanvas: function (canvas) { + var $canvas = $(canvas.canvas); + this.canvas = canvas; + this.$canvas = $canvas; + $canvas.mouseenter($.proxy(this.mouseenter, this)); + $canvas.mouseleave($.proxy(this.mouseleave, this)); + $canvas.click($.proxy(this.mouseclick, this)); + }, + + reset: function (removeTooltip) { + this.splist = []; + if (this.tooltip && removeTooltip) { + this.tooltip.remove(); + this.tooltip = undefined; + } + }, + + mouseclick: function (e) { + var clickEvent = $.Event('sparklineClick'); + clickEvent.originalEvent = e; + clickEvent.sparklines = this.splist; + this.$el.trigger(clickEvent); + }, + + mouseenter: function (e) { + $(document.body).unbind('mousemove.jqs'); + $(document.body).bind('mousemove.jqs', $.proxy(this.mousemove, this)); + this.over = true; + this.currentPageX = e.pageX; + this.currentPageY = e.pageY; + this.currentEl = e.target; + if (!this.tooltip && this.displayTooltips) { + this.tooltip = new Tooltip(this.options); + this.tooltip.updatePosition(e.pageX, e.pageY); + } + this.updateDisplay(); + }, + + mouseleave: function () { + $(document.body).unbind('mousemove.jqs'); + var splist = this.splist, + spcount = splist.length, + needsRefresh = false, + sp, i; + this.over = false; + this.currentEl = null; + + if (this.tooltip) { + this.tooltip.remove(); + this.tooltip = null; + } + + for (i = 0; i < spcount; i++) { + sp = splist[i]; + if (sp.clearRegionHighlight()) { + needsRefresh = true; + } + } + + if (needsRefresh) { + this.canvas.render(); + } + }, + + mousemove: function (e) { + this.currentPageX = e.pageX; + this.currentPageY = e.pageY; + this.currentEl = e.target; + if (this.tooltip) { + this.tooltip.updatePosition(e.pageX, e.pageY); + } + this.updateDisplay(); + }, + + updateDisplay: function () { + var splist = this.splist, + spcount = splist.length, + needsRefresh = false, + offset = this.$canvas.offset(), + localX = this.currentPageX - offset.left, + localY = this.currentPageY - offset.top, + tooltiphtml, sp, i, result, changeEvent; + if (!this.over) { + return; + } + for (i = 0; i < spcount; i++) { + sp = splist[i]; + result = sp.setRegionHighlight(this.currentEl, localX, localY); + if (result) { + needsRefresh = true; + } + } + if (needsRefresh) { + changeEvent = $.Event('sparklineRegionChange'); + changeEvent.sparklines = this.splist; + this.$el.trigger(changeEvent); + if (this.tooltip) { + tooltiphtml = ''; + for (i = 0; i < spcount; i++) { + sp = splist[i]; + tooltiphtml += sp.getCurrentRegionTooltip(); + } + this.tooltip.setContent(tooltiphtml); + } + if (!this.disableHighlight) { + this.canvas.render(); + } + } + if (result === null) { + this.mouseleave(); + } + } + }); + + + Tooltip = createClass({ + sizeStyle: 'position: static !important;' + + 'display: block !important;' + + 'visibility: hidden !important;' + + 'float: left !important;', + + init: function (options) { + var tooltipClassname = options.get('tooltipClassname', 'jqstooltip'), + sizetipStyle = this.sizeStyle, + offset; + this.container = options.get('tooltipContainer') || document.body; + this.tooltipOffsetX = options.get('tooltipOffsetX', 10); + this.tooltipOffsetY = options.get('tooltipOffsetY', 12); + // remove any previous lingering tooltip + $('#jqssizetip').remove(); + $('#jqstooltip').remove(); + this.sizetip = $('
', { + id: 'jqssizetip', + style: sizetipStyle, + 'class': tooltipClassname + }); + this.tooltip = $('
', { + id: 'jqstooltip', + 'class': tooltipClassname + }).appendTo(this.container); + // account for the container's location + offset = this.tooltip.offset(); + this.offsetLeft = offset.left; + this.offsetTop = offset.top; + this.hidden = true; + $(window).unbind('resize.jqs scroll.jqs'); + $(window).bind('resize.jqs scroll.jqs', $.proxy(this.updateWindowDims, this)); + this.updateWindowDims(); + }, + + updateWindowDims: function () { + this.scrollTop = $(window).scrollTop(); + this.scrollLeft = $(window).scrollLeft(); + this.scrollRight = this.scrollLeft + $(window).width(); + this.updatePosition(); + }, + + getSize: function (content) { + this.sizetip.html(content).appendTo(this.container); + this.width = this.sizetip.width() + 1; + this.height = this.sizetip.height(); + this.sizetip.remove(); + }, + + setContent: function (content) { + if (!content) { + this.tooltip.css('visibility', 'hidden'); + this.hidden = true; + return; + } + this.getSize(content); + this.tooltip.html(content) + .css({ + 'width': this.width, + 'height': this.height, + 'visibility': 'visible' + }); + if (this.hidden) { + this.hidden = false; + this.updatePosition(); + } + }, + + updatePosition: function (x, y) { + if (x === undefined) { + if (this.mousex === undefined) { + return; + } + x = this.mousex - this.offsetLeft; + y = this.mousey - this.offsetTop; + + } else { + this.mousex = x = x - this.offsetLeft; + this.mousey = y = y - this.offsetTop; + } + if (!this.height || !this.width || this.hidden) { + return; + } + + y -= this.height + this.tooltipOffsetY; + x += this.tooltipOffsetX; + + if (y < this.scrollTop) { + y = this.scrollTop; + } + if (x < this.scrollLeft) { + x = this.scrollLeft; + } else if (x + this.width > this.scrollRight) { + x = this.scrollRight - this.width; + } + + this.tooltip.css({ + 'left': x, + 'top': y + }); + }, + + remove: function () { + this.tooltip.remove(); + this.sizetip.remove(); + this.sizetip = this.tooltip = undefined; + $(window).unbind('resize.jqs scroll.jqs'); + } + }); + + initStyles = function() { + addCSS(defaultStyles); + }; + + $(initStyles); + + pending = []; + $.fn.sparkline = function (userValues, userOptions) { + return this.each(function () { + var options = new $.fn.sparkline.options(this, userOptions), + $this = $(this), + render, i; + render = function () { + var values, width, height, tmp, mhandler, sp, vals; + if (userValues === 'html' || userValues === undefined) { + vals = this.getAttribute(options.get('tagValuesAttribute')); + if (vals === undefined || vals === null) { + vals = $this.html(); + } + values = vals.replace(/(^\s*\s*$)|\s+/g, '').split(','); + } else { + values = userValues; + } + + width = options.get('width') === 'auto' ? values.length * options.get('defaultPixelsPerValue') : options.get('width'); + if (options.get('height') === 'auto') { + if (!options.get('composite') || !$.data(this, '_jqs_vcanvas')) { + // must be a better way to get the line height + tmp = document.createElement('span'); + tmp.innerHTML = 'a'; + $this.html(tmp); + height = $(tmp).innerHeight() || $(tmp).height(); + $(tmp).remove(); + tmp = null; + } + } else { + height = options.get('height'); + } + + if (!options.get('disableInteraction')) { + mhandler = $.data(this, '_jqs_mhandler'); + if (!mhandler) { + mhandler = new MouseHandler(this, options); + $.data(this, '_jqs_mhandler', mhandler); + } else if (!options.get('composite')) { + mhandler.reset(); + } + } else { + mhandler = false; + } + + if (options.get('composite') && !$.data(this, '_jqs_vcanvas')) { + if (!$.data(this, '_jqs_errnotify')) { + alert('Attempted to attach a composite sparkline to an element with no existing sparkline'); + $.data(this, '_jqs_errnotify', true); + } + return; + } + + sp = new $.fn.sparkline[options.get('type')](this, values, options, width, height); + + sp.render(); + + if (mhandler) { + mhandler.registerSparkline(sp); + } + }; + // jQuery 1.3.0 completely changed the meaning of :hidden :-/ + if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || ($.fn.jquery < '1.3.0' && $(this).parents().is(':hidden')) || !$(this).parents('body').length) { + if (!options.get('composite') && $.data(this, '_jqs_pending')) { + // remove any existing references to the element + for (i = pending.length; i; i--) { + if (pending[i - 1][0] == this) { + pending.splice(i - 1, 1); + } + } + } + pending.push([this, render]); + $.data(this, '_jqs_pending', true); + } else { + render.call(this); + } + }); + }; + + $.fn.sparkline.defaults = getDefaults(); + + + $.sparkline_display_visible = function () { + var el, i, pl; + var done = []; + for (i = 0, pl = pending.length; i < pl; i++) { + el = pending[i][0]; + if ($(el).is(':visible') && !$(el).parents().is(':hidden')) { + pending[i][1].call(el); + $.data(pending[i][0], '_jqs_pending', false); + done.push(i); + } else if (!$(el).closest('html').length && !$.data(el, '_jqs_pending')) { + // element has been inserted and removed from the DOM + // If it was not yet inserted into the dom then the .data request + // will return true. + // removing from the dom causes the data to be removed. + $.data(pending[i][0], '_jqs_pending', false); + done.push(i); + } + } + for (i = done.length; i; i--) { + pending.splice(done[i - 1], 1); + } + }; + + + /** + * User option handler + */ + $.fn.sparkline.options = createClass({ + init: function (tag, userOptions) { + var extendedOptions, defaults, base, tagOptionType; + this.userOptions = userOptions = userOptions || {}; + this.tag = tag; + this.tagValCache = {}; + defaults = $.fn.sparkline.defaults; + base = defaults.common; + this.tagOptionsPrefix = userOptions.enableTagOptions && (userOptions.tagOptionsPrefix || base.tagOptionsPrefix); + + tagOptionType = this.getTagSetting('type'); + if (tagOptionType === UNSET_OPTION) { + extendedOptions = defaults[userOptions.type || base.type]; + } else { + extendedOptions = defaults[tagOptionType]; + } + this.mergedOptions = $.extend({}, base, extendedOptions, userOptions); + }, + + + getTagSetting: function (key) { + var prefix = this.tagOptionsPrefix, + val, i, pairs, keyval; + if (prefix === false || prefix === undefined) { + return UNSET_OPTION; + } + if (this.tagValCache.hasOwnProperty(key)) { + val = this.tagValCache.key; + } else { + val = this.tag.getAttribute(prefix + key); + if (val === undefined || val === null) { + val = UNSET_OPTION; + } else if (val.substr(0, 1) === '[') { + val = val.substr(1, val.length - 2).split(','); + for (i = val.length; i--;) { + val[i] = normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g, '')); + } + } else if (val.substr(0, 1) === '{') { + pairs = val.substr(1, val.length - 2).split(','); + val = {}; + for (i = pairs.length; i--;) { + keyval = pairs[i].split(':', 2); + val[keyval[0].replace(/(^\s*)|(\s*$)/g, '')] = normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g, '')); + } + } else { + val = normalizeValue(val); + } + this.tagValCache.key = val; + } + return val; + }, + + get: function (key, defaultval) { + var tagOption = this.getTagSetting(key), + result; + if (tagOption !== UNSET_OPTION) { + return tagOption; + } + return (result = this.mergedOptions[key]) === undefined ? defaultval : result; + } + }); + + + $.fn.sparkline._base = createClass({ + disabled: false, + + init: function (el, values, options, width, height) { + this.el = el; + this.$el = $(el); + this.values = values; + this.options = options; + this.width = width; + this.height = height; + this.currentRegion = undefined; + }, + + /** + * Setup the canvas + */ + initTarget: function () { + var interactive = !this.options.get('disableInteraction'); + if (!(this.target = this.$el.simpledraw(this.width, this.height, this.options.get('composite'), interactive))) { + this.disabled = true; + } else { + this.canvasWidth = this.target.pixelWidth; + this.canvasHeight = this.target.pixelHeight; + } + }, + + /** + * Actually render the chart to the canvas + */ + render: function () { + if (this.disabled) { + this.el.innerHTML = ''; + return false; + } + return true; + }, + + /** + * Return a region id for a given x/y co-ordinate + */ + getRegion: function (x, y) { + }, + + /** + * Highlight an item based on the moused-over x,y co-ordinate + */ + setRegionHighlight: function (el, x, y) { + var currentRegion = this.currentRegion, + highlightEnabled = !this.options.get('disableHighlight'), + newRegion; + if (x > this.canvasWidth || y > this.canvasHeight || x < 0 || y < 0) { + return null; + } + newRegion = this.getRegion(el, x, y); + if (currentRegion !== newRegion) { + if (currentRegion !== undefined && highlightEnabled) { + this.removeHighlight(); + } + this.currentRegion = newRegion; + if (newRegion !== undefined && highlightEnabled) { + this.renderHighlight(); + } + return true; + } + return false; + }, + + /** + * Reset any currently highlighted item + */ + clearRegionHighlight: function () { + if (this.currentRegion !== undefined) { + this.removeHighlight(); + this.currentRegion = undefined; + return true; + } + return false; + }, + + renderHighlight: function () { + this.changeHighlight(true); + }, + + removeHighlight: function () { + this.changeHighlight(false); + }, + + changeHighlight: function (highlight) {}, + + /** + * Fetch the HTML to display as a tooltip + */ + getCurrentRegionTooltip: function () { + var options = this.options, + header = '', + entries = [], + fields, formats, formatlen, fclass, text, i, + showFields, showFieldsKey, newFields, fv, + formatter, format, fieldlen, j; + if (this.currentRegion === undefined) { + return ''; + } + fields = this.getCurrentRegionFields(); + formatter = options.get('tooltipFormatter'); + if (formatter) { + return formatter(this, options, fields); + } + if (options.get('tooltipChartTitle')) { + header += '
' + options.get('tooltipChartTitle') + '
\n'; + } + formats = this.options.get('tooltipFormat'); + if (!formats) { + return ''; + } + if (!$.isArray(formats)) { + formats = [formats]; + } + if (!$.isArray(fields)) { + fields = [fields]; + } + showFields = this.options.get('tooltipFormatFieldlist'); + showFieldsKey = this.options.get('tooltipFormatFieldlistKey'); + if (showFields && showFieldsKey) { + // user-selected ordering of fields + newFields = []; + for (i = fields.length; i--;) { + fv = fields[i][showFieldsKey]; + if ((j = $.inArray(fv, showFields)) != -1) { + newFields[j] = fields[i]; + } + } + fields = newFields; + } + formatlen = formats.length; + fieldlen = fields.length; + for (i = 0; i < formatlen; i++) { + format = formats[i]; + if (typeof format === 'string') { + format = new SPFormat(format); + } + fclass = format.fclass || 'jqsfield'; + for (j = 0; j < fieldlen; j++) { + if (!fields[j].isNull || !options.get('tooltipSkipNull')) { + $.extend(fields[j], { + prefix: options.get('tooltipPrefix'), + suffix: options.get('tooltipSuffix') + }); + text = format.render(fields[j], options.get('tooltipValueLookups'), options); + entries.push('
' + text + '
'); + } + } + } + if (entries.length) { + return header + entries.join('\n'); + } + return ''; + }, + + getCurrentRegionFields: function () {}, + + calcHighlightColor: function (color, options) { + var highlightColor = options.get('highlightColor'), + lighten = options.get('highlightLighten'), + parse, mult, rgbnew, i; + if (highlightColor) { + return highlightColor; + } + if (lighten) { + // extract RGB values + parse = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color) || /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color); + if (parse) { + rgbnew = []; + mult = color.length === 4 ? 16 : 1; + for (i = 0; i < 3; i++) { + rgbnew[i] = clipval(Math.round(parseInt(parse[i + 1], 16) * mult * lighten), 0, 255); + } + return 'rgb(' + rgbnew.join(',') + ')'; + } + + } + return color; + } + + }); + + barHighlightMixin = { + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + target = this.target, + shapeids = this.regionShapes[currentRegion], + newShapes; + // will be null if the region value was null + if (shapeids) { + newShapes = this.renderRegion(currentRegion, highlight); + if ($.isArray(newShapes) || $.isArray(shapeids)) { + target.replaceWithShapes(shapeids, newShapes); + this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) { + return newShape.id; + }); + } else { + target.replaceWithShape(shapeids, newShapes); + this.regionShapes[currentRegion] = newShapes.id; + } + } + }, + + render: function () { + var values = this.values, + target = this.target, + regionShapes = this.regionShapes, + shapes, ids, i, j; + + if (!this.cls._super.render.call(this)) { + return; + } + for (i = values.length; i--;) { + shapes = this.renderRegion(i); + if (shapes) { + if ($.isArray(shapes)) { + ids = []; + for (j = shapes.length; j--;) { + shapes[j].append(); + ids.push(shapes[j].id); + } + regionShapes[i] = ids; + } else { + shapes.append(); + regionShapes[i] = shapes.id; // store just the shapeid + } + } else { + // null value + regionShapes[i] = null; + } + } + target.render(); + } + }; + + /** + * Line charts + */ + $.fn.sparkline.line = line = createClass($.fn.sparkline._base, { + type: 'line', + + init: function (el, values, options, width, height) { + line._super.init.call(this, el, values, options, width, height); + this.vertices = []; + this.regionMap = []; + this.xvalues = []; + this.yvalues = []; + this.yminmax = []; + this.hightlightSpotId = null; + this.lastShapeId = null; + this.initTarget(); + }, + + getRegion: function (el, x, y) { + var i, + regionMap = this.regionMap; // maps regions to value positions + for (i = regionMap.length; i--;) { + if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) { + return regionMap[i][2]; + } + } + return undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.yvalues[currentRegion] === null, + x: this.xvalues[currentRegion], + y: this.yvalues[currentRegion], + color: this.options.get('lineColor'), + fillColor: this.options.get('fillColor'), + offset: currentRegion + }; + }, + + renderHighlight: function () { + var currentRegion = this.currentRegion, + target = this.target, + vertex = this.vertices[currentRegion], + options = this.options, + spotRadius = options.get('spotRadius'), + highlightSpotColor = options.get('highlightSpotColor'), + highlightLineColor = options.get('highlightLineColor'), + highlightSpot, highlightLine; + + if (!vertex) { + return; + } + if (spotRadius && highlightSpotColor) { + highlightSpot = target.drawCircle(vertex[0], vertex[1], + spotRadius, undefined, highlightSpotColor); + this.highlightSpotId = highlightSpot.id; + target.insertAfterShape(this.lastShapeId, highlightSpot); + } + if (highlightLineColor) { + highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0], + this.canvasTop + this.canvasHeight, highlightLineColor); + this.highlightLineId = highlightLine.id; + target.insertAfterShape(this.lastShapeId, highlightLine); + } + }, + + removeHighlight: function () { + var target = this.target; + if (this.highlightSpotId) { + target.removeShapeId(this.highlightSpotId); + this.highlightSpotId = null; + } + if (this.highlightLineId) { + target.removeShapeId(this.highlightLineId); + this.highlightLineId = null; + } + }, + + scanValues: function () { + var values = this.values, + valcount = values.length, + xvalues = this.xvalues, + yvalues = this.yvalues, + yminmax = this.yminmax, + i, val, isStr, isArray, sp; + for (i = 0; i < valcount; i++) { + val = values[i]; + isStr = typeof(values[i]) === 'string'; + isArray = typeof(values[i]) === 'object' && values[i] instanceof Array; + sp = isStr && values[i].split(':'); + if (isStr && sp.length === 2) { // x:y + xvalues.push(Number(sp[0])); + yvalues.push(Number(sp[1])); + yminmax.push(Number(sp[1])); + } else if (isArray) { + xvalues.push(val[0]); + yvalues.push(val[1]); + yminmax.push(val[1]); + } else { + xvalues.push(i); + if (values[i] === null || values[i] === 'null') { + yvalues.push(null); + } else { + yvalues.push(Number(val)); + yminmax.push(Number(val)); + } + } + } + if (this.options.get('xvalues')) { + xvalues = this.options.get('xvalues'); + } + + this.maxy = this.maxyorg = Math.max.apply(Math, yminmax); + this.miny = this.minyorg = Math.min.apply(Math, yminmax); + + this.maxx = Math.max.apply(Math, xvalues); + this.minx = Math.min.apply(Math, xvalues); + + this.xvalues = xvalues; + this.yvalues = yvalues; + this.yminmax = yminmax; + + }, + + processRangeOptions: function () { + var options = this.options, + normalRangeMin = options.get('normalRangeMin'), + normalRangeMax = options.get('normalRangeMax'); + + if (normalRangeMin !== undefined) { + if (normalRangeMin < this.miny) { + this.miny = normalRangeMin; + } + if (normalRangeMax > this.maxy) { + this.maxy = normalRangeMax; + } + } + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) { + this.miny = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) { + this.maxy = options.get('chartRangeMax'); + } + if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) { + this.minx = options.get('chartRangeMinX'); + } + if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) { + this.maxx = options.get('chartRangeMaxX'); + } + + }, + + drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) { + var normalRangeMin = this.options.get('normalRangeMin'), + normalRangeMax = this.options.get('normalRangeMax'), + ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))), + height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey); + this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append(); + }, + + render: function () { + var options = this.options, + target = this.target, + canvasWidth = this.canvasWidth, + canvasHeight = this.canvasHeight, + vertices = this.vertices, + spotRadius = options.get('spotRadius'), + regionMap = this.regionMap, + rangex, rangey, yvallast, + canvasTop, canvasLeft, + vertex, path, paths, x, y, xnext, xpos, xposnext, + last, next, yvalcount, lineShapes, fillShapes, plen, + valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i; + + if (!line._super.render.call(this)) { + return; + } + + this.scanValues(); + this.processRangeOptions(); + + xvalues = this.xvalues; + yvalues = this.yvalues; + + if (!this.yminmax.length || this.yvalues.length < 2) { + // empty or all null valuess + return; + } + + canvasTop = canvasLeft = 0; + + rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx; + rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny; + yvallast = this.yvalues.length - 1; + + if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) { + spotRadius = 0; + } + if (spotRadius) { + // adjust the canvas size as required so that spots will fit + hlSpotsEnabled = options.get('highlightSpotColor') && !options.get('disableInteraction'); + if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) { + canvasHeight -= Math.ceil(spotRadius); + } + if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) { + canvasHeight -= Math.ceil(spotRadius); + canvasTop += Math.ceil(spotRadius); + } + if (hlSpotsEnabled || + ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) { + canvasLeft += Math.ceil(spotRadius); + canvasWidth -= Math.ceil(spotRadius); + } + if (hlSpotsEnabled || options.get('spotColor') || + (options.get('minSpotColor') || options.get('maxSpotColor') && + (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) { + canvasWidth -= Math.ceil(spotRadius); + } + } + + + canvasHeight--; + + if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) { + this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); + } + + path = []; + paths = [path]; + last = next = null; + yvalcount = yvalues.length; + for (i = 0; i < yvalcount; i++) { + x = xvalues[i]; + xnext = xvalues[i + 1]; + y = yvalues[i]; + xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)); + xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth; + next = xpos + ((xposnext - xpos) / 2); + regionMap[i] = [last || 0, next, i]; + last = next; + if (y === null) { + if (i) { + if (yvalues[i - 1] !== null) { + path = []; + paths.push(path); + } + vertices.push(null); + } + } else { + if (y < this.miny) { + y = this.miny; + } + if (y > this.maxy) { + y = this.maxy; + } + if (!path.length) { + // previous value was null + path.push([xpos, canvasTop + canvasHeight]); + } + vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))]; + path.push(vertex); + vertices.push(vertex); + } + } + + lineShapes = []; + fillShapes = []; + plen = paths.length; + for (i = 0; i < plen; i++) { + path = paths[i]; + if (path.length) { + if (options.get('fillColor')) { + path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]); + fillShapes.push(path.slice(0)); + path.pop(); + } + // if there's only a single point in this path, then we want to display it + // as a vertical line which means we keep path[0] as is + if (path.length > 2) { + // else we want the first value + path[0] = [path[0][0], path[1][1]]; + } + lineShapes.push(path); + } + } + + // draw the fill first, then optionally the normal range, then the line on top of that + plen = fillShapes.length; + for (i = 0; i < plen; i++) { + target.drawShape(fillShapes[i], + options.get('fillColor'), options.get('fillColor')).append(); + } + + if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) { + this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); + } + + plen = lineShapes.length; + for (i = 0; i < plen; i++) { + target.drawShape(lineShapes[i], options.get('lineColor'), undefined, + options.get('lineWidth')).append(); + } + + if (spotRadius && options.get('valueSpots')) { + valueSpots = options.get('valueSpots'); + if (valueSpots.get === undefined) { + valueSpots = new RangeMap(valueSpots); + } + for (i = 0; i < yvalcount; i++) { + color = valueSpots.get(yvalues[i]); + if (color) { + target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))), + spotRadius, undefined, + color).append(); + } + } + + } + if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) { + target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))), + spotRadius, undefined, + options.get('spotColor')).append(); + } + if (this.maxy !== this.minyorg) { + if (spotRadius && options.get('minSpotColor')) { + x = xvalues[$.inArray(this.minyorg, yvalues)]; + target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))), + spotRadius, undefined, + options.get('minSpotColor')).append(); + } + if (spotRadius && options.get('maxSpotColor')) { + x = xvalues[$.inArray(this.maxyorg, yvalues)]; + target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))), + spotRadius, undefined, + options.get('maxSpotColor')).append(); + } + } + + this.lastShapeId = target.getLastShapeId(); + this.canvasTop = canvasTop; + target.render(); + } + }); + + /** + * Bar charts + */ + $.fn.sparkline.bar = bar = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'bar', + + init: function (el, values, options, width, height) { + var barWidth = parseInt(options.get('barWidth'), 10), + barSpacing = parseInt(options.get('barSpacing'), 10), + chartRangeMin = options.get('chartRangeMin'), + chartRangeMax = options.get('chartRangeMax'), + chartRangeClip = options.get('chartRangeClip'), + stackMin = Infinity, + stackMax = -Infinity, + isStackString, groupMin, groupMax, stackRanges, + numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax, + stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf; + bar._super.init.call(this, el, values, options, width, height); + + // scan values to determine whether to stack bars + for (i = 0, vlen = values.length; i < vlen; i++) { + val = values[i]; + isStackString = typeof(val) === 'string' && val.indexOf(':') > -1; + if (isStackString || $.isArray(val)) { + stacked = true; + if (isStackString) { + val = values[i] = normalizeValues(val.split(':')); + } + val = remove(val, null); // min/max will treat null as zero + groupMin = Math.min.apply(Math, val); + groupMax = Math.max.apply(Math, val); + if (groupMin < stackMin) { + stackMin = groupMin; + } + if (groupMax > stackMax) { + stackMax = groupMax; + } + } + } + + this.stacked = stacked; + this.regionShapes = {}; + this.barWidth = barWidth; + this.barSpacing = barSpacing; + this.totalBarWidth = barWidth + barSpacing; + this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); + + this.initTarget(); + + if (chartRangeClip) { + clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin; + clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax; + } + + numValues = []; + stackRanges = stacked ? [] : numValues; + var stackTotals = []; + var stackRangesNeg = []; + for (i = 0, vlen = values.length; i < vlen; i++) { + if (stacked) { + vlist = values[i]; + values[i] = svals = []; + stackTotals[i] = 0; + stackRanges[i] = stackRangesNeg[i] = 0; + for (j = 0, slen = vlist.length; j < slen; j++) { + val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j]; + if (val !== null) { + if (val > 0) { + stackTotals[i] += val; + } + if (stackMin < 0 && stackMax > 0) { + if (val < 0) { + stackRangesNeg[i] += Math.abs(val); + } else { + stackRanges[i] += val; + } + } else { + stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin)); + } + numValues.push(val); + } + } + } else { + val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i]; + val = values[i] = normalizeValue(val); + if (val !== null) { + numValues.push(val); + } + } + } + this.max = max = Math.max.apply(Math, numValues); + this.min = min = Math.min.apply(Math, numValues); + this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max; + this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min; + + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) { + min = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) { + max = options.get('chartRangeMax'); + } + + this.zeroAxis = zeroAxis = options.get('zeroAxis', true); + if (min <= 0 && max >= 0 && zeroAxis) { + xaxisOffset = 0; + } else if (zeroAxis == false) { + xaxisOffset = min; + } else if (min > 0) { + xaxisOffset = min; + } else { + xaxisOffset = max; + } + this.xaxisOffset = xaxisOffset; + + range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - min; + + // as we plot zero/min values a single pixel line, we add a pixel to all other + // values - Reduce the effective canvas size to suit + this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1; + + if (min < xaxisOffset) { + yMaxCalc = (stacked && max >= 0) ? stackMax : max; + yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight; + if (yoffset !== Math.ceil(yoffset)) { + this.canvasHeightEf -= 2; + yoffset = Math.ceil(yoffset); + } + } else { + yoffset = this.canvasHeight; + } + this.yoffset = yoffset; + + if ($.isArray(options.get('colorMap'))) { + this.colorMapByIndex = options.get('colorMap'); + this.colorMapByValue = null; + } else { + this.colorMapByIndex = null; + this.colorMapByValue = options.get('colorMap'); + if (this.colorMapByValue && this.colorMapByValue.get === undefined) { + this.colorMapByValue = new RangeMap(this.colorMapByValue); + } + } + + this.range = range; + }, + + getRegion: function (el, x, y) { + var result = Math.floor(x / this.totalBarWidth); + return (result < 0 || result >= this.values.length) ? undefined : result; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion, + values = ensureArray(this.values[currentRegion]), + result = [], + value, i; + for (i = values.length; i--;) { + value = values[i]; + result.push({ + isNull: value === null, + value: value, + color: this.calcColor(i, value, currentRegion), + offset: currentRegion + }); + } + return result; + }, + + calcColor: function (stacknum, value, valuenum) { + var colorMapByIndex = this.colorMapByIndex, + colorMapByValue = this.colorMapByValue, + options = this.options, + color, newColor; + if (this.stacked) { + color = options.get('stackedBarColor'); + } else { + color = (value < 0) ? options.get('negBarColor') : options.get('barColor'); + } + if (value === 0 && options.get('zeroColor') !== undefined) { + color = options.get('zeroColor'); + } + if (colorMapByValue && (newColor = colorMapByValue.get(value))) { + color = newColor; + } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { + color = colorMapByIndex[valuenum]; + } + return $.isArray(color) ? color[stacknum % color.length] : color; + }, + + /** + * Render bar(s) for a region + */ + renderRegion: function (valuenum, highlight) { + var vals = this.values[valuenum], + options = this.options, + xaxisOffset = this.xaxisOffset, + result = [], + range = this.range, + stacked = this.stacked, + target = this.target, + x = valuenum * this.totalBarWidth, + canvasHeightEf = this.canvasHeightEf, + yoffset = this.yoffset, + y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin; + + vals = $.isArray(vals) ? vals : [vals]; + valcount = vals.length; + val = vals[0]; + isNull = all(null, vals); + allMin = all(xaxisOffset, vals, true); + + if (isNull) { + if (options.get('nullColor')) { + color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options); + y = (yoffset > 0) ? yoffset - 1 : yoffset; + return target.drawRect(x, y, this.barWidth - 1, 0, color, color); + } else { + return undefined; + } + } + yoffsetNeg = yoffset; + for (i = 0; i < valcount; i++) { + val = vals[i]; + + if (stacked && val === xaxisOffset) { + if (!allMin || minPlotted) { + continue; + } + minPlotted = true; + } + + if (range > 0) { + height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range))) + 1; + } else { + height = 1; + } + if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) { + y = yoffsetNeg; + yoffsetNeg += height; + } else { + y = yoffset - height; + yoffset -= height; + } + color = this.calcColor(i, val, valuenum); + if (highlight) { + color = this.calcHighlightColor(color, options); + } + result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color)); + } + if (result.length === 1) { + return result[0]; + } + return result; + } + }); + + /** + * Tristate charts + */ + $.fn.sparkline.tristate = tristate = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'tristate', + + init: function (el, values, options, width, height) { + var barWidth = parseInt(options.get('barWidth'), 10), + barSpacing = parseInt(options.get('barSpacing'), 10); + tristate._super.init.call(this, el, values, options, width, height); + + this.regionShapes = {}; + this.barWidth = barWidth; + this.barSpacing = barSpacing; + this.totalBarWidth = barWidth + barSpacing; + this.values = $.map(values, Number); + this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); + + if ($.isArray(options.get('colorMap'))) { + this.colorMapByIndex = options.get('colorMap'); + this.colorMapByValue = null; + } else { + this.colorMapByIndex = null; + this.colorMapByValue = options.get('colorMap'); + if (this.colorMapByValue && this.colorMapByValue.get === undefined) { + this.colorMapByValue = new RangeMap(this.colorMapByValue); + } + } + this.initTarget(); + }, + + getRegion: function (el, x, y) { + return Math.floor(x / this.totalBarWidth); + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + color: this.calcColor(this.values[currentRegion], currentRegion), + offset: currentRegion + }; + }, + + calcColor: function (value, valuenum) { + var values = this.values, + options = this.options, + colorMapByIndex = this.colorMapByIndex, + colorMapByValue = this.colorMapByValue, + color, newColor; + + if (colorMapByValue && (newColor = colorMapByValue.get(value))) { + color = newColor; + } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { + color = colorMapByIndex[valuenum]; + } else if (values[valuenum] < 0) { + color = options.get('negBarColor'); + } else if (values[valuenum] > 0) { + color = options.get('posBarColor'); + } else { + color = options.get('zeroBarColor'); + } + return color; + }, + + renderRegion: function (valuenum, highlight) { + var values = this.values, + options = this.options, + target = this.target, + canvasHeight, height, halfHeight, + x, y, color; + + canvasHeight = target.pixelHeight; + halfHeight = Math.round(canvasHeight / 2); + + x = valuenum * this.totalBarWidth; + if (values[valuenum] < 0) { + y = halfHeight; + height = halfHeight - 1; + } else if (values[valuenum] > 0) { + y = 0; + height = halfHeight - 1; + } else { + y = halfHeight - 1; + height = 2; + } + color = this.calcColor(values[valuenum], valuenum); + if (color === null) { + return; + } + if (highlight) { + color = this.calcHighlightColor(color, options); + } + return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color); + } + }); + + /** + * Discrete charts + */ + $.fn.sparkline.discrete = discrete = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'discrete', + + init: function (el, values, options, width, height) { + discrete._super.init.call(this, el, values, options, width, height); + + this.regionShapes = {}; + this.values = values = $.map(values, Number); + this.min = Math.min.apply(Math, values); + this.max = Math.max.apply(Math, values); + this.range = this.max - this.min; + this.width = width = options.get('width') === 'auto' ? values.length * 2 : this.width; + this.interval = Math.floor(width / values.length); + this.itemWidth = width / values.length; + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) { + this.min = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) { + this.max = options.get('chartRangeMax'); + } + this.initTarget(); + if (this.target) { + this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight'); + } + }, + + getRegion: function (el, x, y) { + return Math.floor(x / this.itemWidth); + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + offset: currentRegion + }; + }, + + renderRegion: function (valuenum, highlight) { + var values = this.values, + options = this.options, + min = this.min, + max = this.max, + range = this.range, + interval = this.interval, + target = this.target, + canvasHeight = this.canvasHeight, + lineHeight = this.lineHeight, + pheight = canvasHeight - lineHeight, + ytop, val, color, x; + + val = clipval(values[valuenum], min, max); + x = valuenum * interval; + ytop = Math.round(pheight - pheight * ((val - min) / range)); + color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor'); + if (highlight) { + color = this.calcHighlightColor(color, options); + } + return target.drawLine(x, ytop, x, ytop + lineHeight, color); + } + }); + + /** + * Bullet charts + */ + $.fn.sparkline.bullet = bullet = createClass($.fn.sparkline._base, { + type: 'bullet', + + init: function (el, values, options, width, height) { + var min, max, vals; + bullet._super.init.call(this, el, values, options, width, height); + + // values: target, performance, range1, range2, range3 + this.values = values = normalizeValues(values); + // target or performance could be null + vals = values.slice(); + vals[0] = vals[0] === null ? vals[2] : vals[0]; + vals[1] = values[1] === null ? vals[2] : vals[1]; + min = Math.min.apply(Math, values); + max = Math.max.apply(Math, values); + if (options.get('base') === undefined) { + min = min < 0 ? min : 0; + } else { + min = options.get('base'); + } + this.min = min; + this.max = max; + this.range = max - min; + this.shapes = {}; + this.valueShapes = {}; + this.regiondata = {}; + this.width = width = options.get('width') === 'auto' ? '4.0em' : width; + this.target = this.$el.simpledraw(width, height, options.get('composite')); + if (!values.length) { + this.disabled = true; + } + this.initTarget(); + }, + + getRegion: function (el, x, y) { + var shapeid = this.target.getShapeAt(el, x, y); + return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + fieldkey: currentRegion.substr(0, 1), + value: this.values[currentRegion.substr(1)], + region: currentRegion + }; + }, + + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + shapeid = this.valueShapes[currentRegion], + shape; + delete this.shapes[shapeid]; + switch (currentRegion.substr(0, 1)) { + case 'r': + shape = this.renderRange(currentRegion.substr(1), highlight); + break; + case 'p': + shape = this.renderPerformance(highlight); + break; + case 't': + shape = this.renderTarget(highlight); + break; + } + this.valueShapes[currentRegion] = shape.id; + this.shapes[shape.id] = currentRegion; + this.target.replaceWithShape(shapeid, shape); + }, + + renderRange: function (rn, highlight) { + var rangeval = this.values[rn], + rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)), + color = this.options.get('rangeColors')[rn - 2]; + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color); + }, + + renderPerformance: function (highlight) { + var perfval = this.values[1], + perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)), + color = this.options.get('performanceColor'); + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1, + Math.round(this.canvasHeight * 0.4) - 1, color, color); + }, + + renderTarget: function (highlight) { + var targetval = this.values[0], + x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)), + targettop = Math.round(this.canvasHeight * 0.10), + targetheight = this.canvasHeight - (targettop * 2), + color = this.options.get('targetColor'); + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color); + }, + + render: function () { + var vlen = this.values.length, + target = this.target, + i, shape; + if (!bullet._super.render.call(this)) { + return; + } + for (i = 2; i < vlen; i++) { + shape = this.renderRange(i).append(); + this.shapes[shape.id] = 'r' + i; + this.valueShapes['r' + i] = shape.id; + } + if (this.values[1] !== null) { + shape = this.renderPerformance().append(); + this.shapes[shape.id] = 'p1'; + this.valueShapes.p1 = shape.id; + } + if (this.values[0] !== null) { + shape = this.renderTarget().append(); + this.shapes[shape.id] = 't0'; + this.valueShapes.t0 = shape.id; + } + target.render(); + } + }); + + /** + * Pie charts + */ + $.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, { + type: 'pie', + + init: function (el, values, options, width, height) { + var total = 0, i; + + pie._super.init.call(this, el, values, options, width, height); + + this.shapes = {}; // map shape ids to value offsets + this.valueShapes = {}; // maps value offsets to shape ids + this.values = values = $.map(values, Number); + + if (options.get('width') === 'auto') { + this.width = this.height; + } + + if (values.length > 0) { + for (i = values.length; i--;) { + total += values[i]; + } + } + this.total = total; + this.initTarget(); + this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2); + }, + + getRegion: function (el, x, y) { + var shapeid = this.target.getShapeAt(el, x, y); + return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + percent: this.values[currentRegion] / this.total * 100, + color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length], + offset: currentRegion + }; + }, + + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + newslice = this.renderSlice(currentRegion, highlight), + shapeid = this.valueShapes[currentRegion]; + delete this.shapes[shapeid]; + this.target.replaceWithShape(shapeid, newslice); + this.valueShapes[currentRegion] = newslice.id; + this.shapes[newslice.id] = currentRegion; + }, + + renderSlice: function (valuenum, highlight) { + var target = this.target, + options = this.options, + radius = this.radius, + borderWidth = options.get('borderWidth'), + offset = options.get('offset'), + circle = 2 * Math.PI, + values = this.values, + total = this.total, + next = offset ? (2*Math.PI)*(offset/360) : 0, + start, end, i, vlen, color; + + vlen = values.length; + for (i = 0; i < vlen; i++) { + start = next; + end = next; + if (total > 0) { // avoid divide by zero + end = next + (circle * (values[i] / total)); + } + if (valuenum === i) { + color = options.get('sliceColors')[i % options.get('sliceColors').length]; + if (highlight) { + color = this.calcHighlightColor(color, options); + } + + return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color); + } + next = end; + } + }, + + render: function () { + var target = this.target, + values = this.values, + options = this.options, + radius = this.radius, + borderWidth = options.get('borderWidth'), + shape, i; + + if (!pie._super.render.call(this)) { + return; + } + if (borderWidth) { + target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)), + options.get('borderColor'), undefined, borderWidth).append(); + } + for (i = values.length; i--;) { + if (values[i]) { // don't render zero values + shape = this.renderSlice(i).append(); + this.valueShapes[i] = shape.id; // store just the shapeid + this.shapes[shape.id] = i; + } + } + target.render(); + } + }); + + /** + * Box plots + */ + $.fn.sparkline.box = box = createClass($.fn.sparkline._base, { + type: 'box', + + init: function (el, values, options, width, height) { + box._super.init.call(this, el, values, options, width, height); + this.values = $.map(values, Number); + this.width = options.get('width') === 'auto' ? '4.0em' : width; + this.initTarget(); + if (!this.values.length) { + this.disabled = 1; + } + }, + + /** + * Simulate a single region + */ + getRegion: function () { + return 1; + }, + + getCurrentRegionFields: function () { + var result = [ + { field: 'lq', value: this.quartiles[0] }, + { field: 'med', value: this.quartiles[1] }, + { field: 'uq', value: this.quartiles[2] } + ]; + if (this.loutlier !== undefined) { + result.push({ field: 'lo', value: this.loutlier}); + } + if (this.routlier !== undefined) { + result.push({ field: 'ro', value: this.routlier}); + } + if (this.lwhisker !== undefined) { + result.push({ field: 'lw', value: this.lwhisker}); + } + if (this.rwhisker !== undefined) { + result.push({ field: 'rw', value: this.rwhisker}); + } + return result; + }, + + render: function () { + var target = this.target, + values = this.values, + vlen = values.length, + options = this.options, + canvasWidth = this.canvasWidth, + canvasHeight = this.canvasHeight, + minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'), + maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'), + canvasLeft = 0, + lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i, + size, unitSize; + + if (!box._super.render.call(this)) { + return; + } + + if (options.get('raw')) { + if (options.get('showOutliers') && values.length > 5) { + loutlier = values[0]; + lwhisker = values[1]; + q1 = values[2]; + q2 = values[3]; + q3 = values[4]; + rwhisker = values[5]; + routlier = values[6]; + } else { + lwhisker = values[0]; + q1 = values[1]; + q2 = values[2]; + q3 = values[3]; + rwhisker = values[4]; + } + } else { + values.sort(function (a, b) { return a - b; }); + q1 = quartile(values, 1); + q2 = quartile(values, 2); + q3 = quartile(values, 3); + iqr = q3 - q1; + if (options.get('showOutliers')) { + lwhisker = rwhisker = undefined; + for (i = 0; i < vlen; i++) { + if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) { + lwhisker = values[i]; + } + if (values[i] < q3 + (iqr * options.get('outlierIQR'))) { + rwhisker = values[i]; + } + } + loutlier = values[0]; + routlier = values[vlen - 1]; + } else { + lwhisker = values[0]; + rwhisker = values[vlen - 1]; + } + } + this.quartiles = [q1, q2, q3]; + this.lwhisker = lwhisker; + this.rwhisker = rwhisker; + this.loutlier = loutlier; + this.routlier = routlier; + + unitSize = canvasWidth / (maxValue - minValue + 1); + if (options.get('showOutliers')) { + canvasLeft = Math.ceil(options.get('spotRadius')); + canvasWidth -= 2 * Math.ceil(options.get('spotRadius')); + unitSize = canvasWidth / (maxValue - minValue + 1); + if (loutlier < lwhisker) { + target.drawCircle((loutlier - minValue) * unitSize + canvasLeft, + canvasHeight / 2, + options.get('spotRadius'), + options.get('outlierLineColor'), + options.get('outlierFillColor')).append(); + } + if (routlier > rwhisker) { + target.drawCircle((routlier - minValue) * unitSize + canvasLeft, + canvasHeight / 2, + options.get('spotRadius'), + options.get('outlierLineColor'), + options.get('outlierFillColor')).append(); + } + } + + // box + target.drawRect( + Math.round((q1 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.1), + Math.round((q3 - q1) * unitSize), + Math.round(canvasHeight * 0.8), + options.get('boxLineColor'), + options.get('boxFillColor')).append(); + // left whisker + target.drawLine( + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + Math.round((q1 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + options.get('lineColor')).append(); + target.drawLine( + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 4), + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight - canvasHeight / 4), + options.get('whiskerColor')).append(); + // right whisker + target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + Math.round((q3 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + options.get('lineColor')).append(); + target.drawLine( + Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 4), + Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight - canvasHeight / 4), + options.get('whiskerColor')).append(); + // median line + target.drawLine( + Math.round((q2 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.1), + Math.round((q2 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.9), + options.get('medianColor')).append(); + if (options.get('target')) { + size = Math.ceil(options.get('spotRadius')); + target.drawLine( + Math.round((options.get('target') - minValue) * unitSize + canvasLeft), + Math.round((canvasHeight / 2) - size), + Math.round((options.get('target') - minValue) * unitSize + canvasLeft), + Math.round((canvasHeight / 2) + size), + options.get('targetColor')).append(); + target.drawLine( + Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size), + Math.round(canvasHeight / 2), + Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size), + Math.round(canvasHeight / 2), + options.get('targetColor')).append(); + } + target.render(); + } + }); + + // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier + // This is accessible as $(foo).simpledraw() + + // Detect browser renderer support + (function() { + if (document.namespaces && !document.namespaces.v) { + $.fn.sparkline.hasVML = true; + document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); + } else { + $.fn.sparkline.hasVML = false; + } + + var el = document.createElement('canvas'); + $.fn.sparkline.hasCanvas = !!(el.getContext && el.getContext('2d')); + + })() + + VShape = createClass({ + init: function (target, id, type, args) { + this.target = target; + this.id = id; + this.type = type; + this.args = args; + }, + append: function () { + this.target.appendShape(this); + return this; + } + }); + + VCanvas_base = createClass({ + _pxregex: /(\d+)(px)?\s*$/i, + + init: function (width, height, target) { + if (!width) { + return; + } + this.width = width; + this.height = height; + this.target = target; + this.lastShapeId = null; + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + }, + + drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) { + return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth); + }, + + drawShape: function (path, lineColor, fillColor, lineWidth) { + return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]); + }, + + drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) { + return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]); + }, + + drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) { + return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]); + }, + + drawRect: function (x, y, width, height, lineColor, fillColor) { + return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]); + }, + + getElement: function () { + return this.canvas; + }, + + /** + * Return the most recently inserted shape id + */ + getLastShapeId: function () { + return this.lastShapeId; + }, + + /** + * Clear and reset the canvas + */ + reset: function () { + alert('reset not implemented'); + }, + + _insert: function (el, target) { + $(target).html(el); + }, + + /** + * Calculate the pixel dimensions of the canvas + */ + _calculatePixelDims: function (width, height, canvas) { + // XXX This should probably be a configurable option + var match; + match = this._pxregex.exec(height); + if (match) { + this.pixelHeight = match[1]; + } else { + this.pixelHeight = $(canvas).height(); + } + match = this._pxregex.exec(width); + if (match) { + this.pixelWidth = match[1]; + } else { + this.pixelWidth = $(canvas).width(); + } + }, + + /** + * Generate a shape object and id for later rendering + */ + _genShape: function (shapetype, shapeargs) { + var id = shapeCount++; + shapeargs.unshift(id); + return new VShape(this, id, shapetype, shapeargs); + }, + + /** + * Add a shape to the end of the render queue + */ + appendShape: function (shape) { + alert('appendShape not implemented'); + }, + + /** + * Replace one shape with another + */ + replaceWithShape: function (shapeid, shape) { + alert('replaceWithShape not implemented'); + }, + + /** + * Insert one shape after another in the render queue + */ + insertAfterShape: function (shapeid, shape) { + alert('insertAfterShape not implemented'); + }, + + /** + * Remove a shape from the queue + */ + removeShapeId: function (shapeid) { + alert('removeShapeId not implemented'); + }, + + /** + * Find a shape at the specified x/y co-ordinates + */ + getShapeAt: function (el, x, y) { + alert('getShapeAt not implemented'); + }, + + /** + * Render all queued shapes onto the canvas + */ + render: function () { + alert('render not implemented'); + } + }); + + VCanvas_canvas = createClass(VCanvas_base, { + init: function (width, height, target, interact) { + VCanvas_canvas._super.init.call(this, width, height, target); + this.canvas = document.createElement('canvas'); + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + $(this.canvas).css({ display: 'inline-block', width: width, height: height, verticalAlign: 'top' }); + this._insert(this.canvas, target); + this._calculatePixelDims(width, height, this.canvas); + this.canvas.width = this.pixelWidth; + this.canvas.height = this.pixelHeight; + this.interact = interact; + this.shapes = {}; + this.shapeseq = []; + this.currentTargetShapeId = undefined; + $(this.canvas).css({width: this.pixelWidth, height: this.pixelHeight}); + }, + + _getContext: function (lineColor, fillColor, lineWidth) { + var context = this.canvas.getContext('2d'); + if (lineColor !== undefined) { + context.strokeStyle = lineColor; + } + context.lineWidth = lineWidth === undefined ? 1 : lineWidth; + if (fillColor !== undefined) { + context.fillStyle = fillColor; + } + return context; + }, + + reset: function () { + var context = this._getContext(); + context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); + this.shapes = {}; + this.shapeseq = []; + this.currentTargetShapeId = undefined; + }, + + _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { + var context = this._getContext(lineColor, fillColor, lineWidth), + i, plen; + context.beginPath(); + context.moveTo(path[0][0] + 0.5, path[0][1] + 0.5); + for (i = 1, plen = path.length; i < plen; i++) { + context.lineTo(path[i][0] + 0.5, path[i][1] + 0.5); // the 0.5 offset gives us crisp pixel-width lines + } + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor !== undefined) { + context.fill(); + } + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + }, + + _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { + var context = this._getContext(lineColor, fillColor, lineWidth); + context.beginPath(); + context.arc(x, y, radius, 0, 2 * Math.PI, false); + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor !== undefined) { + context.fill(); + } + }, + + _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { + var context = this._getContext(lineColor, fillColor); + context.beginPath(); + context.moveTo(x, y); + context.arc(x, y, radius, startAngle, endAngle, false); + context.lineTo(x, y); + context.closePath(); + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor) { + context.fill(); + } + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + }, + + _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { + return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor); + }, + + appendShape: function (shape) { + this.shapes[shape.id] = shape; + this.shapeseq.push(shape.id); + this.lastShapeId = shape.id; + return shape.id; + }, + + replaceWithShape: function (shapeid, shape) { + var shapeseq = this.shapeseq, + i; + this.shapes[shape.id] = shape; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] == shapeid) { + shapeseq[i] = shape.id; + } + } + delete this.shapes[shapeid]; + }, + + replaceWithShapes: function (shapeids, shapes) { + var shapeseq = this.shapeseq, + shapemap = {}, + sid, i, first; + + for (i = shapeids.length; i--;) { + shapemap[shapeids[i]] = true; + } + for (i = shapeseq.length; i--;) { + sid = shapeseq[i]; + if (shapemap[sid]) { + shapeseq.splice(i, 1); + delete this.shapes[sid]; + first = i; + } + } + for (i = shapes.length; i--;) { + shapeseq.splice(first, 0, shapes[i].id); + this.shapes[shapes[i].id] = shapes[i]; + } + + }, + + insertAfterShape: function (shapeid, shape) { + var shapeseq = this.shapeseq, + i; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] === shapeid) { + shapeseq.splice(i + 1, 0, shape.id); + this.shapes[shape.id] = shape; + return; + } + } + }, + + removeShapeId: function (shapeid) { + var shapeseq = this.shapeseq, + i; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] === shapeid) { + shapeseq.splice(i, 1); + break; + } + } + delete this.shapes[shapeid]; + }, + + getShapeAt: function (el, x, y) { + this.targetX = x; + this.targetY = y; + this.render(); + return this.currentTargetShapeId; + }, + + render: function () { + var shapeseq = this.shapeseq, + shapes = this.shapes, + shapeCount = shapeseq.length, + context = this._getContext(), + shapeid, shape, i; + context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); + for (i = 0; i < shapeCount; i++) { + shapeid = shapeseq[i]; + shape = shapes[shapeid]; + this['_draw' + shape.type].apply(this, shape.args); + } + if (!this.interact) { + // not interactive so no need to keep the shapes array + this.shapes = {}; + this.shapeseq = []; + } + } + + }); + + VCanvas_vml = createClass(VCanvas_base, { + init: function (width, height, target) { + var groupel; + VCanvas_vml._super.init.call(this, width, height, target); + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + this.canvas = document.createElement('span'); + $(this.canvas).css({ display: 'inline-block', position: 'relative', overflow: 'hidden', width: width, height: height, margin: '0px', padding: '0px', verticalAlign: 'top'}); + this._insert(this.canvas, target); + this._calculatePixelDims(width, height, this.canvas); + this.canvas.width = this.pixelWidth; + this.canvas.height = this.pixelHeight; + groupel = ''; + this.canvas.insertAdjacentHTML('beforeEnd', groupel); + this.group = $(this.canvas).children()[0]; + this.rendered = false; + this.prerender = ''; + }, + + _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { + var vpath = [], + initial, stroke, fill, closed, vel, plen, i; + for (i = 0, plen = path.length; i < plen; i++) { + vpath[i] = '' + (path[i][0]) + ',' + (path[i][1]); + } + initial = vpath.splice(0, 1); + lineWidth = lineWidth === undefined ? 1 : lineWidth; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + closed = vpath[0] === vpath[vpath.length - 1] ? 'x ' : ''; + vel = '' + + ' '; + return vel; + }, + + _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { + var stroke, fill, vel; + x -= radius; + y -= radius; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + vel = ''; + return vel; + + }, + + _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { + var vpath, startx, starty, endx, endy, stroke, fill, vel; + if (startAngle === endAngle) { + return ''; // VML seems to have problem when start angle equals end angle. + } + if ((endAngle - startAngle) === (2 * Math.PI)) { + startAngle = 0.0; // VML seems to have a problem when drawing a full circle that doesn't start 0 + endAngle = (2 * Math.PI); + } + + startx = x + Math.round(Math.cos(startAngle) * radius); + starty = y + Math.round(Math.sin(startAngle) * radius); + endx = x + Math.round(Math.cos(endAngle) * radius); + endy = y + Math.round(Math.sin(endAngle) * radius); + + if (startx === endx && starty === endy) { + if ((endAngle - startAngle) < Math.PI) { + // Prevent very small slices from being mistaken as a whole pie + return ''; + } + // essentially going to be the entire circle, so ignore startAngle + startx = endx = x + radius; + starty = endy = y; + } + + if (startx === endx && starty === endy && (endAngle - startAngle) < Math.PI) { + return ''; + } + + vpath = [x - radius, y - radius, x + radius, y + radius, startx, starty, endx, endy]; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="1px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + vel = '' + + ' '; + return vel; + }, + + _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { + return this._drawShape(shapeid, [[x, y], [x, y + height], [x + width, y + height], [x + width, y], [x, y]], lineColor, fillColor); + }, + + reset: function () { + this.group.innerHTML = ''; + }, + + appendShape: function (shape) { + var vel = this['_draw' + shape.type].apply(this, shape.args); + if (this.rendered) { + this.group.insertAdjacentHTML('beforeEnd', vel); + } else { + this.prerender += vel; + } + this.lastShapeId = shape.id; + return shape.id; + }, + + replaceWithShape: function (shapeid, shape) { + var existing = $('#jqsshape' + shapeid), + vel = this['_draw' + shape.type].apply(this, shape.args); + existing[0].outerHTML = vel; + }, + + replaceWithShapes: function (shapeids, shapes) { + // replace the first shapeid with all the new shapes then toast the remaining old shapes + var existing = $('#jqsshape' + shapeids[0]), + replace = '', + slen = shapes.length, + i; + for (i = 0; i < slen; i++) { + replace += this['_draw' + shapes[i].type].apply(this, shapes[i].args); + } + existing[0].outerHTML = replace; + for (i = 1; i < shapeids.length; i++) { + $('#jqsshape' + shapeids[i]).remove(); + } + }, + + insertAfterShape: function (shapeid, shape) { + var existing = $('#jqsshape' + shapeid), + vel = this['_draw' + shape.type].apply(this, shape.args); + existing[0].insertAdjacentHTML('afterEnd', vel); + }, + + removeShapeId: function (shapeid) { + var existing = $('#jqsshape' + shapeid); + this.group.removeChild(existing[0]); + }, + + getShapeAt: function (el, x, y) { + var shapeid = el.id.substr(8); + return shapeid; + }, + + render: function () { + if (!this.rendered) { + // batch the intial render into a single repaint + this.group.innerHTML = this.prerender; + this.rendered = true; + } + } + }); + +})); diff --git a/addons/web/static/lib/justgage/justgage.1.0.1.js b/addons/web/static/lib/justgage/justgage.1.0.1.js new file mode 100644 index 00000000000..24540beb293 --- /dev/null +++ b/addons/web/static/lib/justgage/justgage.1.0.1.js @@ -0,0 +1,946 @@ +/** + * JustGage - this is work-in-progress, unreleased, unofficial code, so it might not work top-notch :) + * Check http://www.justgage.com for official releases + * Licensed under MIT. + * @author Bojan Djuricic (@Toorshia) + * + * LATEST UPDATES + + * ----------------------------- + * April 18, 2013. + * ----------------------------- + * parentNode - use this instead of id, to attach gauge to node which is outside of DOM tree - https://github.com/toorshia/justgage/issues/48 + * width - force gauge width + * height - force gauge height + + * ----------------------------- + * April 17, 2013. + * ----------------------------- + * fix - https://github.com/toorshia/justgage/issues/49 + + * ----------------------------- + * April 01, 2013. + * ----------------------------- + * fix - https://github.com/toorshia/justgage/issues/46 + + * ----------------------------- + * March 26, 2013. + * ----------------------------- + * customSectors - define specific color for value range (0-10 : red, 10-30 : blue etc.) + + * ----------------------------- + * March 23, 2013. + * ----------------------------- + * counter - option to animate value in counting fashion + * fix - https://github.com/toorshia/justgage/issues/45 + + * ----------------------------- + * March 13, 2013. + * ----------------------------- + * refresh method - added optional 'max' parameter to use when you need to update max value + + * ----------------------------- + * February 26, 2013. + * ----------------------------- + * decimals - option to define/limit number of decimals when not using humanFriendly or customRenderer to display value + * fixed a missing parameters bug when calling generateShadow() for IE < 9 + + * ----------------------------- + * December 31, 2012. + * ----------------------------- + * fixed text y-position for hidden divs - workaround for Raphael 'dy' bug - https://github.com/DmitryBaranovskiy/raphael/issues/491 + * 'show' parameters, like showMinMax are now 'hide' because I am lame developer - please update these in your setups + * Min and Max labels are now auto-off when in donut mode + * Start angle in donut mode is now 90 + * donutStartAngle - option to define start angle for donut + + * ----------------------------- + * November 25, 2012. + * ----------------------------- + * Option to define custom rendering function for displayed value + + * ----------------------------- + * November 19, 2012. + * ----------------------------- + * Config.value is now updated after gauge refresh + + * ----------------------------- + * November 13, 2012. + * ----------------------------- + * Donut display mode added + * Option to hide value label + * Option to enable responsive gauge size + * Removed default title attribute + * Option to accept min and max defined as string values + * Option to configure value symbol + * Fixed bad aspect ratio calculations + * Option to configure minimum font size for all texts + * Option to show shorthand big numbers (human friendly) + */ + + JustGage = function(config) { + + // if (!config.id) {alert("Missing id parameter for gauge!"); return false;} + // if (!document.getElementById(config.id)) {alert("No element with id: \""+config.id+"\" found!"); return false;} + + var obj = this; + + // configurable parameters + obj.config = + { + // id : string + // this is container element id + id : config.id, + + // parentNode : node object + // this is container element + parentNode : (config.parentNode) ? config.parentNode : null, + + // width : int + // gauge width + width : (config.width) ? config.width : null, + + // height : int + // gauge height + height : (config.height) ? config.height : null, + + // title : string + // gauge title + title : (config.title) ? config.title : "", + + // titleFontColor : string + // color of gauge title + titleFontColor : (config.titleFontColor) ? config.titleFontColor : "#999999", + + // value : int + // value gauge is showing + value : (config.value) ? config.value : 0, + + // valueFontColor : string + // color of label showing current value + valueFontColor : (config.valueFontColor) ? config.valueFontColor : "#010101", + + // symbol : string + // special symbol to show next to value + symbol : (config.symbol) ? config.symbol : "", + + // min : int + // min value + min : (config.min !== undefined) ? parseFloat(config.min) : 0, + + // max : int + // max value + max : (config.max !== undefined) ? parseFloat(config.max) : 100, + + // humanFriendlyDecimal : int + // number of decimal places for our human friendly number to contain + humanFriendlyDecimal : (config.humanFriendlyDecimal) ? config.humanFriendlyDecimal : 0, + + // textRenderer: func + // function applied before rendering text + textRenderer : (config.textRenderer) ? config.textRenderer : null, + + // gaugeWidthScale : float + // width of the gauge element + gaugeWidthScale : (config.gaugeWidthScale) ? config.gaugeWidthScale : 1.0, + + // gaugeColor : string + // background color of gauge element + gaugeColor : (config.gaugeColor) ? config.gaugeColor : "#edebeb", + + // label : string + // text to show below value + label : (config.label) ? config.label : "", + + // labelFontColor : string + // color of label showing label under value + labelFontColor : (config.labelFontColor) ? config.labelFontColor : "#b3b3b3", + + // shadowOpacity : int + // 0 ~ 1 + shadowOpacity : (config.shadowOpacity) ? config.shadowOpacity : 0.2, + + // shadowSize: int + // inner shadow size + shadowSize : (config.shadowSize) ? config.shadowSize : 5, + + // shadowVerticalOffset : int + // how much shadow is offset from top + shadowVerticalOffset : (config.shadowVerticalOffset) ? config.shadowVerticalOffset : 3, + + // levelColors : string[] + // colors of indicator, from lower to upper, in RGB format + levelColors : (config.levelColors) ? config.levelColors : [ + "#a9d70b", + "#f9c802", + "#ff0000" + ], + + // startAnimationTime : int + // length of initial animation + startAnimationTime : (config.startAnimationTime) ? config.startAnimationTime : 700, + + // startAnimationType : string + // type of initial animation (linear, >, <, <>, bounce) + startAnimationType : (config.startAnimationType) ? config.startAnimationType : ">", + + // refreshAnimationTime : int + // length of refresh animation + refreshAnimationTime : (config.refreshAnimationTime) ? config.refreshAnimationTime : 700, + + // refreshAnimationType : string + // type of refresh animation (linear, >, <, <>, bounce) + refreshAnimationType : (config.refreshAnimationType) ? config.refreshAnimationType : ">", + + // donutStartAngle : int + // angle to start from when in donut mode + donutStartAngle : (config.donutStartAngle) ? config.donutStartAngle : 90, + + // valueMinFontSize : int + // absolute minimum font size for the value + valueMinFontSize : config.valueMinFontSize || 16, + + // titleMinFontSize + // absolute minimum font size for the title + titleMinFontSize : config.titleMinFontSize || 10, + + // labelMinFontSize + // absolute minimum font size for the label + labelMinFontSize : config.labelMinFontSize || 10, + + // minLabelMinFontSize + // absolute minimum font size for the minimum label + minLabelMinFontSize : config.minLabelMinFontSize || 10, + + // maxLabelMinFontSize + // absolute minimum font size for the maximum label + maxLabelMinFontSize : config.maxLabelMinFontSize || 10, + + // hideValue : bool + // hide value text + hideValue : (config.hideValue) ? config.hideValue : false, + + // hideMinMax : bool + // hide min and max values + hideMinMax : (config.hideMinMax) ? config.hideMinMax : false, + + // hideInnerShadow : bool + // hide inner shadow + hideInnerShadow : (config.hideInnerShadow) ? config.hideInnerShadow : false, + + // humanFriendly : bool + // convert large numbers for min, max, value to human friendly (e.g. 1234567 -> 1.23M) + humanFriendly : (config.humanFriendly) ? config.humanFriendly : false, + + // noGradient : bool + // whether to use gradual color change for value, or sector-based + noGradient : (config.noGradient) ? config.noGradient : false, + + // donut : bool + // show full donut gauge + donut : (config.donut) ? config.donut : false, + + // relativeGaugeSize : bool + // whether gauge size should follow changes in container element size + relativeGaugeSize : (config.relativeGaugeSize) ? config.relativeGaugeSize : false, + + // counter : bool + // animate level number change + counter : (config.counter) ? config.counter : false, + + // decimals : int + // number of digits after floating point + decimals : (config.decimals) ? config.decimals : 0, + + // customSectors : [] of objects + // number of digits after floating point + customSectors : (config.customSectors) ? config.customSectors : [] + }; + + // variables + var + canvasW, + canvasH, + widgetW, + widgetH, + aspect, + dx, + dy, + titleFontSize, + titleX, + titleY, + valueFontSize, + valueX, + valueY, + labelFontSize, + labelX, + labelY, + minFontSize, + minX, + minY, + maxFontSize, + maxX, + maxY; + + // overflow values + if (obj.config.value > obj.config.max) obj.config.value = obj.config.max; + if (obj.config.value < obj.config.min) obj.config.value = obj.config.min; + obj.originalValue = config.value; + + // create canvas + if (obj.config.id !== null && (document.getElementById(obj.config.id)) !== null) { + obj.canvas = Raphael(obj.config.id, "100%", "100%"); + } else if (obj.config.parentNode !== null) { + obj.canvas = Raphael(obj.config.parentNode, "100%", "100%"); + } + + if (obj.config.relativeGaugeSize === true) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + } + + // canvas dimensions + if (obj.config.relativeGaugeSize === true) { + canvasW = 200; + canvasH = 150; + } else if (obj.config.width !== null && obj.config.height !== null) { + canvasW = obj.config.width; + canvasH = obj.config.height; + } else if (obj.config.parentNode !== null) { + obj.canvas.setViewBox(0, 0, 200, 150, true); + canvasW = 200; + canvasH = 150; + } else { + canvasW = getStyle(document.getElementById(obj.config.id), "width").slice(0, -2) * 1; + canvasH = getStyle(document.getElementById(obj.config.id), "height").slice(0, -2) * 1; + } + + // widget dimensions + if (obj.config.donut === true) { + + // DONUT ******************************* + + // width more than height + if(canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH; + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW; + // if height don't fit, rescale both + if(widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW; + } + + // delta + dx = (canvasW - widgetW)/2; + dy = (canvasH - widgetH)/2; + + // title + titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 11; + + // value + valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18; + valueX = dx + widgetW / 2; + if(obj.config.label !== '') { + valueY = dy + widgetH / 1.85; + } else { + valueY = dy + widgetH / 1.7; + } + + // label + labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + labelX = dx + widgetW / 2; + labelY = valueY + labelFontSize; + + // min + minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2 ; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2 ; + maxY = labelY; + + } else { + // HALF ******************************* + + // width more than height + if(canvasW > canvasH) { + widgetH = canvasH; + widgetW = widgetH * 1.25; + //if width doesn't fit, rescale both + if(widgetW > canvasW) { + aspect = widgetW / canvasW; + widgetW = widgetW / aspect; + widgetH = widgetH / aspect; + } + // width less than height + } else if (canvasW < canvasH) { + widgetW = canvasW; + widgetH = widgetW / 1.25; + // if height don't fit, rescale both + if(widgetH > canvasH) { + aspect = widgetH / canvasH; + widgetH = widgetH / aspect; + widgetW = widgetH / aspect; + } + // equal + } else { + widgetW = canvasW; + widgetH = widgetW * 0.75; + } + + // delta + dx = (canvasW - widgetW)/2; + dy = (canvasH - widgetH)/2; + + // title + titleFontSize = ((widgetH / 8) > obj.config.titleMinFontSize) ? (widgetH / 10) : obj.config.titleMinFontSize; + titleX = dx + widgetW / 2; + titleY = dy + widgetH / 6.4; + + // value + valueFontSize = ((widgetH / 6.5) > obj.config.valueMinFontSize) ? (widgetH / 6.5) : obj.config.valueMinFontSize; + valueX = dx + widgetW / 2; + valueY = dy + widgetH / 1.275; + + // label + labelFontSize = ((widgetH / 16) > obj.config.labelMinFontSize) ? (widgetH / 16) : obj.config.labelMinFontSize; + labelX = dx + widgetW / 2; + labelY = valueY + valueFontSize / 2 + 5; + + // min + minFontSize = ((widgetH / 16) > obj.config.minLabelMinFontSize) ? (widgetH / 16) : obj.config.minLabelMinFontSize; + minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2 ; + minY = labelY; + + // max + maxFontSize = ((widgetH / 16) > obj.config.maxLabelMinFontSize) ? (widgetH / 16) : obj.config.maxLabelMinFontSize; + maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * obj.config.gaugeWidthScale) / 2 ; + maxY = labelY; + } + + // parameters + obj.params = { + canvasW : canvasW, + canvasH : canvasH, + widgetW : widgetW, + widgetH : widgetH, + dx : dx, + dy : dy, + titleFontSize : titleFontSize, + titleX : titleX, + titleY : titleY, + valueFontSize : valueFontSize, + valueX : valueX, + valueY : valueY, + labelFontSize : labelFontSize, + labelX : labelX, + labelY : labelY, + minFontSize : minFontSize, + minX : minX, + minY : minY, + maxFontSize : maxFontSize, + maxX : maxX, + maxY : maxY + }; + + // var clear + canvasW, canvasH, widgetW, widgetH, aspect, dx, dy, titleFontSize, titleX, titleY, valueFontSize, valueX, valueY, labelFontSize, labelX, labelY, minFontSize, minX, minY, maxFontSize, maxX, maxY = null + + // pki - custom attribute for generating gauge paths + obj.canvas.customAttributes.pki = function (value, min, max, w, h, dx, dy, gws, donut) { + + var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path; + + if (donut) { + alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 7; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.95 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) + 0 - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) + 0 - Ri * Math.sin(alpha); + + path += "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ro + "," + Ro + " 0 0 1 " + (Cx + Ro) + "," + Cy + " "; + } + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + if (value > ((max - min) / 2)) { + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx + Ri) + "," + Cy + " "; + } + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { path: path }; + + } else { + alpha = (1 - (value - min) / (max - min)) * Math.PI; + Ro = w / 2 - w / 10; + Ri = Ro - w / 6.666666666666667 * gws; + + Cx = w / 2 + dx; + Cy = h / 1.25 + dy; + + Xo = w / 2 + dx + Ro * Math.cos(alpha); + Yo = h - (h - Cy) + 0 - Ro * Math.sin(alpha); + Xi = w / 2 + dx + Ri * Math.cos(alpha); + Yi = h - (h - Cy) + 0 - Ri * Math.sin(alpha); + + path += "M" + (Cx - Ri) + "," + Cy + " "; + path += "L" + (Cx - Ro) + "," + Cy + " "; + path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; + path += "L" + Xi + "," + Yi + " "; + path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; + path += "Z "; + + return { path: path }; + } + + // var clear + alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path = null; + }; + + // gauge + obj.gauge = obj.canvas.path().attr({ + "stroke": "none", + "fill": obj.config.gaugeColor, + pki: [ + obj.config.max, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }); + + // level + obj.level = obj.canvas.path().attr({ + "stroke": "none", + "fill": getColor(obj.config.value, (obj.config.value - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors), + pki: [ + obj.config.min, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }); + if(obj.config.donut) { + obj.level.transform("r" + obj.config.donutStartAngle + ", " + (obj.params.widgetW/2 + obj.params.dx) + ", " + (obj.params.widgetH/1.95 + obj.params.dy)); + } + + // title + obj.txtTitle = obj.canvas.text(obj.params.titleX, obj.params.titleY, obj.config.title); + obj.txtTitle.attr({ + "font-size":obj.params.titleFontSize, + "font-weight":"bold", + "font-family":"Arial", + "fill":obj.config.titleFontColor, + "fill-opacity":"1" + }); + setDy(obj.txtTitle, obj.params.titleFontSize, obj.params.titleY); + + // value + obj.txtValue = obj.canvas.text(obj.params.valueX, obj.params.valueY, 0); + obj.txtValue.attr({ + "font-size":obj.params.valueFontSize, + "font-weight":"bold", + "font-family":"Arial", + "fill":obj.config.valueFontColor, + "fill-opacity":"0" + }); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + + // label + obj.txtLabel = obj.canvas.text(obj.params.labelX, obj.params.labelY, obj.config.label); + obj.txtLabel.attr({ + "font-size":obj.params.labelFontSize, + "font-weight":"normal", + "font-family":"Arial", + "fill":obj.config.labelFontColor, + "fill-opacity":"0" + }); + setDy(obj.txtLabel, obj.params.labelFontSize, obj.params.labelY); + + // min + obj.txtMinimum = obj.config.min; + if( obj.config.humanFriendly ) obj.txtMinimum = humanFriendlyNumber( obj.config.min, obj.config.humanFriendlyDecimal ); + obj.txtMin = obj.canvas.text(obj.params.minX, obj.params.minY, obj.txtMinimum); + obj.txtMin.attr({ + "font-size":obj.params.minFontSize, + "font-weight":"normal", + "font-family":"Arial", + "fill":obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut)? "0" : "1" + }); + setDy(obj.txtMin, obj.params.minFontSize, obj.params.minY); + + // max + obj.txtMaximum = obj.config.max; + if( obj.config.humanFriendly ) obj.txtMaximum = humanFriendlyNumber( obj.config.max, obj.config.humanFriendlyDecimal ); + obj.txtMax = obj.canvas.text(obj.params.maxX, obj.params.maxY, obj.txtMaximum); + obj.txtMax.attr({ + "font-size":obj.params.maxFontSize, + "font-weight":"normal", + "font-family":"Arial", + "fill":obj.config.labelFontColor, + "fill-opacity": (obj.config.hideMinMax || obj.config.donut)? "0" : "1" + }); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + + var defs = obj.canvas.canvas.childNodes[1]; + var svg = "http://www.w3.org/2000/svg"; + + if (ie < 9) { + onCreateElementNsReady(function() { + obj.generateShadow(svg, defs); + }); + } else { + obj.generateShadow(svg, defs); + } + + // var clear + defs, svg = null; + + // set value to display + if(obj.config.textRenderer) { + obj.originalValue = obj.config.textRenderer(obj.originalValue); + } else if(obj.config.humanFriendly) { + obj.originalValue = humanFriendlyNumber( obj.originalValue, obj.config.humanFriendlyDecimal ) + obj.config.symbol; + } else { + obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + + if(obj.config.counter === true) { + //on each animation frame + eve.on("raphael.anim.frame." + (obj.level.id), function() { + var currentValue = obj.level.attr("pki"); + if(obj.config.textRenderer) { + obj.txtValue.attr("text", obj.config.textRenderer(Math.floor(currentValue[0]))); + } else if(obj.config.humanFriendly) { + obj.txtValue.attr("text", humanFriendlyNumber( Math.floor(currentValue[0]), obj.config.humanFriendlyDecimal ) + obj.config.symbol); + } else { + obj.txtValue.attr("text", (currentValue[0] * 1).toFixed(obj.config.decimals) + obj.config.symbol); + } + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + currentValue = null; + }); + //on animation end + eve.on("raphael.anim.finish." + (obj.level.id), function() { + obj.txtValue.attr({"text" : obj.originalValue}); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } else { + //on animation start + eve.on("raphael.anim.start." + (obj.level.id), function() { + obj.txtValue.attr({"text" : obj.originalValue}); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + }); + } + + // animate gauge level, value & label + obj.level.animate({ + pki: [ + obj.config.value, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ] + }, obj.config.startAnimationTime, obj.config.startAnimationType); + obj.txtValue.animate({"fill-opacity":(obj.config.hideValue)?"0":"1"}, obj.config.startAnimationTime, obj.config.startAnimationType); + obj.txtLabel.animate({"fill-opacity":"1"}, obj.config.startAnimationTime, obj.config.startAnimationType); +}; + +/** Refresh gauge level */ +JustGage.prototype.refresh = function(val, max) { + + var obj = this; + var displayVal, color, max = max || null; + + // set new max + if(max !== null) { + obj.config.max = max; + + obj.txtMaximum = obj.config.max; + if( obj.config.humanFriendly ) obj.txtMaximum = humanFriendlyNumber( obj.config.max, obj.config.humanFriendlyDecimal ); + obj.txtMax.attr({"text" : obj.txtMaximum}); + setDy(obj.txtMax, obj.params.maxFontSize, obj.params.maxY); + } + + // overflow values + displayVal = val; + if ((val * 1) > (obj.config.max * 1)) {val = (obj.config.max * 1);} + if ((val * 1) < (obj.config.min * 1)) {val = (obj.config.min * 1);} + + color = getColor(val, (val - obj.config.min) / (obj.config.max - obj.config.min), obj.config.levelColors, obj.config.noGradient, obj.config.customSectors); + + if(obj.config.textRenderer) { + displayVal = obj.config.textRenderer(displayVal); + } else if( obj.config.humanFriendly ) { + displayVal = humanFriendlyNumber( displayVal, obj.config.humanFriendlyDecimal ) + obj.config.symbol; + } else { + displayVal = (displayVal * 1).toFixed(obj.config.decimals) + obj.config.symbol; + } + obj.originalValue = displayVal; + obj.config.value = val * 1; + + if(!obj.config.counter) { + obj.txtValue.attr({"text":displayVal}); + setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); + } + + obj.level.animate({ + pki: [ + obj.config.value, + obj.config.min, + obj.config.max, + obj.params.widgetW, + obj.params.widgetH, + obj.params.dx, + obj.params.dy, + obj.config.gaugeWidthScale, + obj.config.donut + ], + "fill":color + }, obj.config.refreshAnimationTime, obj.config.refreshAnimationType); + + // var clear + obj, displayVal, color, max = null; +}; + +/** Generate shadow */ +JustGage.prototype.generateShadow = function(svg, defs) { + + var obj = this; + var gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3; + + // FILTER + gaussFilter = document.createElementNS(svg,"filter"); + gaussFilter.setAttribute("id","inner-shadow"); + defs.appendChild(gaussFilter); + + // offset + feOffset = document.createElementNS(svg,"feOffset"); + feOffset.setAttribute("dx", 0); + feOffset.setAttribute("dy", obj.config.shadowVerticalOffset); + gaussFilter.appendChild(feOffset); + + // blur + feGaussianBlur = document.createElementNS(svg,"feGaussianBlur"); + feGaussianBlur.setAttribute("result","offset-blur"); + feGaussianBlur.setAttribute("stdDeviation", obj.config.shadowSize); + gaussFilter.appendChild(feGaussianBlur); + + // composite 1 + feComposite1 = document.createElementNS(svg,"feComposite"); + feComposite1.setAttribute("operator","out"); + feComposite1.setAttribute("in", "SourceGraphic"); + feComposite1.setAttribute("in2","offset-blur"); + feComposite1.setAttribute("result","inverse"); + gaussFilter.appendChild(feComposite1); + + // flood + feFlood = document.createElementNS(svg,"feFlood"); + feFlood.setAttribute("flood-color","black"); + feFlood.setAttribute("flood-opacity", obj.config.shadowOpacity); + feFlood.setAttribute("result","color"); + gaussFilter.appendChild(feFlood); + + // composite 2 + feComposite2 = document.createElementNS(svg,"feComposite"); + feComposite2.setAttribute("operator","in"); + feComposite2.setAttribute("in", "color"); + feComposite2.setAttribute("in2","inverse"); + feComposite2.setAttribute("result","shadow"); + gaussFilter.appendChild(feComposite2); + + // composite 3 + feComposite3 = document.createElementNS(svg,"feComposite"); + feComposite3.setAttribute("operator","over"); + feComposite3.setAttribute("in", "shadow"); + feComposite3.setAttribute("in2","SourceGraphic"); + gaussFilter.appendChild(feComposite3); + + // set shadow + if (!obj.config.hideInnerShadow) { + obj.canvas.canvas.childNodes[2].setAttribute("filter", "url(#inner-shadow)"); + obj.canvas.canvas.childNodes[3].setAttribute("filter", "url(#inner-shadow)"); + } + + // var clear + gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3 = null; + +}; + +/** Get color for value */ +function getColor(val, pct, col, noGradient, custSec) { + + var no, inc, colors, percentage, rval, gval, bval, lower, upper, range, rangePct, pctLower, pctUpper, color; + var noGradient = noGradient || custSec.length > 0; + + if(custSec.length > 0) { + for(var i = 0; i < custSec.length; i++) { + if(val > custSec[i].lo && val <= custSec[i].hi) { + return custSec[i].color; + } + } + } + + no = col.length; + if (no === 1) return col[0]; + inc = (noGradient) ? (1 / no) : (1 / (no - 1)); + colors = []; + for (var i = 0; i < col.length; i++) { + percentage = (noGradient) ? (inc * (i + 1)) : (inc * i); + rval = parseInt((cutHex(col[i])).substring(0,2),16); + gval = parseInt((cutHex(col[i])).substring(2,4),16); + bval = parseInt((cutHex(col[i])).substring(4,6),16); + colors[i] = { pct: percentage, color: { r: rval, g: gval, b: bval } }; + } + + if(pct === 0) { + return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')'; + } + + for (var j = 0; j < colors.length; j++) { + if (pct <= colors[j].pct) { + if (noGradient) { + return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')'; + } else { + lower = colors[j - 1]; + upper = colors[j]; + range = upper.pct - lower.pct; + rangePct = (pct - lower.pct) / range; + pctLower = 1 - rangePct; + pctUpper = rangePct; + color = { + r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), + g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), + b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) + }; + return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; + } + } + } + +} + +/** Fix Raphael display:none tspan dy attribute bug */ +function setDy(elem, fontSize, txtYpos) { + if (!ie || ie > 9) { + elem.node.firstChild.attributes.dy.value = 0; + } +} + +/** Random integer */ +function getRandomInt (min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +/** Cut hex */ +function cutHex(str) { + return (str.charAt(0)=="#") ? str.substring(1,7):str; +} + +/** Human friendly number suffix - From: http://stackoverflow.com/questions/2692323/code-golf-friendly-number-abbreviator */ +function humanFriendlyNumber( n, d ) { + var p, d2, i, s; + + p = Math.pow; + d2 = p(10, d); + i = 7; + while( i ) { + s = p(10,i--*3); + if( s <= n ) { + n = Math.round(n*d2/s)/d2+"KMGTPE"[i]; + } + } + return n; +} + +/** Get style */ +function getStyle(oElm, strCssRule){ + var strValue = ""; + if(document.defaultView && document.defaultView.getComputedStyle){ + strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); + } + else if(oElm.currentStyle){ + strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ + return p1.toUpperCase(); + }); + strValue = oElm.currentStyle[strCssRule]; + } + return strValue; +} + +/** Create Element NS Ready */ +function onCreateElementNsReady(func) { + if (document.createElementNS !== undefined) { + func(); + } else { + setTimeout(function() { onCreateElementNsReady(func); }, 100); + } +} + +/** Get IE version */ +// ---------------------------------------------------------- +// A short snippet for detecting versions of IE in JavaScript +// without resorting to user-agent sniffing +// ---------------------------------------------------------- +// If you're not in IE (or IE version is less than 5) then: +// ie === undefined +// If you're in IE (>=5) then you can determine which version: +// ie === 7; // IE7 +// Thus, to detect IE: +// if (ie) {} +// And to detect the version: +// ie === 6 // IE6 +// ie > 7 // IE8, IE9 ... +// ie < 9 // Anything less than IE9 +// ---------------------------------------------------------- +// UPDATE: Now using Live NodeList idea from @jdalton +var ie = (function(){ + + var undef, + v = 3, + div = document.createElement('div'), + all = div.getElementsByTagName('i'); + + while ( + div.innerHTML = '', + all[0] + ); + return v > 4 ? v : undef; +}()); \ No newline at end of file diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js index 52e975322e5..44db469cd89 100644 --- a/addons/web/static/lib/qweb/qweb2.js +++ b/addons/web/static/lib/qweb/qweb2.js @@ -384,6 +384,7 @@ QWeb2.Engine = (function() { this.compiled_templates[template] = tcompiled; return this.render(template, dict); } else { + console.log(this.compiled_templates, template); return this.tools.exception("Template '" + template + "' not found"); } }, diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 6f47f9c128d..aff3673f687 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -1231,6 +1231,148 @@ instance.web_kanban.AbstractField = instance.web.Widget.extend(instance.web_kanb }); instance.web_kanban.fields_registry = new instance.web.Registry({}); + + +/** + * Kanban widgets: Sparkline + * + */ + +instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.extend({ + className: "oe_sparkline_bar", + start: function() { + var self = this; + var title = this.$node.html() || this.field.string; + setTimeout(function () { + var value = _.pluck(self.field.value, 'value'); + var tooltips = _.pluck(self.field.value, 'tooltip'); + var sparkline_options = _.extend({ + type: 'bar', + barWidth: 5, + height: '50px', + barWidth: '10px', + barSpacing: '5px', + barColor: '#96d854', + tooltipFormat: '{{offset:offset}} {{value}}', + tooltipValueLookups: { + 'offset': tooltips + } + }, this.options); + self.$el.sparkline(value, sparkline_options); + self.$el.tipsy({'delayIn': 0, 'html': true, 'title': function(){return title}, 'gravity': 'n'}); + }, 0); + }, +}); + +instance.web_kanban.fields_registry.add("sparkline_bar", "instance.web_kanban.SparklineBarWidget"); + + +/** + * Kanban widgets: GaugeWidget + * + */ + +instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ + className: "oe_gauge", + start: function() { + var self = this; + var max = 100; + if (this.options.max_field) { + max = this.getParent().record[this.options.max_field].raw_value; + } + var label = this.options.label || ""; + if (this.options.label_field) { + label = this.getParent().record[this.options.label_field].raw_value; + } + var val = this.field.value; + var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; + var title = this.$node.html() || this.field.string; + console.log(value, title, max); + this.gage = new JustGage({ + parentNode: this.$el[0], + value: value, + title: title, + min: 0, + max: max, + relativeGaugeSize: true, + humanFriendly: true, + label: label, + levelColors: [ + "#ff0000", + "#f9c802", + "#a9d70b" + ] + }); + + var flag_open = false; + if (self.options.action_change) { + var $svg = self.$el.find('svg'); + var css = { + 'text-align': 'center', + 'position': 'absolute', + 'width': self.$el.outerWidth() + 'px', + 'top': (self.$el.outerHeight()/2-5) + 'px' + }; + + self.$el.click(function (event) { + event.stopPropagation(); + flag_open = false; + if (!parent.view.is_action_enabled('edit')) { + return; + } + if (!self.$el.find(".oe_justgage_edit").size()) { + $div = $('
'); + $div.css(css); + $input = $('').val(value); + $input.css({ + 'text-align': 'center', + 'margin': 'auto', + 'width': ($svg.outerWidth()-40) + 'px' + }); + $div.append($input); + self.$el.prepend($div) + $input.focus() + .keydown(function (event) { + event.stopPropagation(); + if (event.keyCode == 13 || event.keyCode == 9) { + if ($input.val() != value) { + parent.view.dataset.call(self.options.action_change, [parent.id, $input.val()]).then(function () { + parent.do_reload(); + }); + } else { + $div.remove(); + } + } + }) + .click(function (event) { + event.stopPropagation(); + flag_open = false; + }) + .blur(function (event) { + if(!flag_open) { + self.$el.find(".oe_justgage_edit").remove(); + } else { + flag_open = false; + setTimeout(function () {$input.focus();}, 0); + } + }); + } + }).mousedown(function () { + flag_open = true; + }); + + if (!+value) { + $svg.fadeTo(0, 0.3); + $div = $('
').text(_t("Click to change value")); + $div.css(css); + self.$el.append($div); + } + } + }, +}); + +instance.web_kanban.fields_registry.add("gauge", "instance.web_kanban.GaugeWidget"); + }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: From bf1fd1d071e709ae246018a6cd75c3015fab20ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 3 Sep 2013 17:20:28 +0200 Subject: [PATCH 095/110] [FIX] sparkline widget: fixed some default values computation bzr revid: tde@openerp.com-20130903152028-6gr51965tmva0npu --- addons/web_kanban/static/src/js/kanban.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index aff3673f687..bd1c116aded 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -1249,15 +1249,15 @@ instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.exten var sparkline_options = _.extend({ type: 'bar', barWidth: 5, - height: '50px', - barWidth: '10px', - barSpacing: '5px', + height: '20px', + barWidth: 4, + barSpacing: 1, barColor: '#96d854', tooltipFormat: '{{offset:offset}} {{value}}', tooltipValueLookups: { 'offset': tooltips } - }, this.options); + }, self.options); self.$el.sparkline(value, sparkline_options); self.$el.tipsy({'delayIn': 0, 'html': true, 'title': function(){return title}, 'gravity': 'n'}); }, 0); @@ -1287,7 +1287,6 @@ instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ var val = this.field.value; var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; var title = this.$node.html() || this.field.string; - console.log(value, title, max); this.gage = new JustGage({ parentNode: this.$el[0], value: value, From a937b5679ba6b829f769cc4e119de7a22009a8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 6 Sep 2013 11:32:21 +0200 Subject: [PATCH 096/110] [IMP] [FIX] kanban: updated justgage and sparklin libraries; fixed gauge widget showing 0 as value by forcing a refresh bzr revid: tde@openerp.com-20130906093221-n94whqrrj2meknwf --- addons/web/__openerp__.py | 2 +- .../lib/jquery.sparkline/jquery.sparkline.js | 61 +++++++++++-------- .../{justgage.1.0.1.js => justgage.js} | 0 addons/web_kanban/static/src/js/kanban.js | 25 +++++--- 4 files changed, 53 insertions(+), 35 deletions(-) rename addons/web/static/lib/justgage/{justgage.1.0.1.js => justgage.js} (100%) diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 32a108c131d..9b13fd48b0a 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -36,7 +36,7 @@ This module provides the core of the OpenERP Web Client. "static/lib/jquery.tipsy/jquery.tipsy.js", "static/lib/jquery.textext/jquery.textext.js", "static/lib/jquery.timeago/jquery.timeago.js", - "static/lib/justgage/justgage.1.0.1.js", + "static/lib/justgage/justgage.js", "static/lib/qweb/qweb2.js", "static/lib/underscore/underscore.js", "static/lib/underscore.string/lib/underscore.string.js", diff --git a/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js b/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js index 8069db45fe9..43b24c080a6 100644 --- a/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js +++ b/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js @@ -2,7 +2,7 @@ * * jquery.sparkline.js * -* v2.1.1 +* v2.1.2 * (c) Splunk, Inc * Contact: Gareth Watts (gareth@splunk.com) * http://omnipotent.net/jquery.sparkline/ @@ -202,11 +202,11 @@ /*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */ +(function(document, Math, undefined) { // performance/minified-size optimization (function(factory) { if(typeof define === 'function' && define.amd) { define(['jquery'], factory); - } - else { + } else if (jQuery && !jQuery.fn.sparkline) { factory(jQuery); } } @@ -597,19 +597,41 @@ if (useExisting && (target = this.data('_jqs_vcanvas'))) { return target; } + + if ($.fn.sparkline.canvas === false) { + // We've already determined that neither Canvas nor VML are available + return false; + + } else if ($.fn.sparkline.canvas === undefined) { + // No function defined yet -- need to see if we support Canvas or VML + var el = document.createElement('canvas'); + if (!!(el.getContext && el.getContext('2d'))) { + // Canvas is available + $.fn.sparkline.canvas = function(width, height, target, interact) { + return new VCanvas_canvas(width, height, target, interact); + }; + } else if (document.namespaces && !document.namespaces.v) { + // VML is available + document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); + $.fn.sparkline.canvas = function(width, height, target, interact) { + return new VCanvas_vml(width, height, target); + }; + } else { + // Neither Canvas nor VML are available + $.fn.sparkline.canvas = false; + return false; + } + } + if (width === undefined) { width = $(this).innerWidth(); } if (height === undefined) { height = $(this).innerHeight(); } - if ($.fn.sparkline.hasCanvas) { - target = new VCanvas_canvas(width, height, this, interact); - } else if ($.fn.sparkline.hasVML) { - target = new VCanvas_vml(width, height, this); - } else { - return false; - } + + target = $.fn.sparkline.canvas(width, height, this, interact); + mhandler = $(this).data('_jqs_mhandler'); if (mhandler) { mhandler.registerCanvas(target); @@ -977,8 +999,7 @@ mhandler.registerSparkline(sp); } }; - // jQuery 1.3.0 completely changed the meaning of :hidden :-/ - if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || ($.fn.jquery < '1.3.0' && $(this).parents().is(':hidden')) || !$(this).parents('body').length) { + if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || !$(this).parents('body').length) { if (!options.get('composite') && $.data(this, '_jqs_pending')) { // remove any existing references to the element for (i = pending.length; i; i--) { @@ -2528,20 +2549,6 @@ // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier // This is accessible as $(foo).simpledraw() - // Detect browser renderer support - (function() { - if (document.namespaces && !document.namespaces.v) { - $.fn.sparkline.hasVML = true; - document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); - } else { - $.fn.sparkline.hasVML = false; - } - - var el = document.createElement('canvas'); - $.fn.sparkline.hasCanvas = !!(el.getContext && el.getContext('2d')); - - })() - VShape = createClass({ init: function (target, id, type, args) { this.target = target; @@ -3044,4 +3051,4 @@ } }); -})); +}))}(document, Math)); \ No newline at end of file diff --git a/addons/web/static/lib/justgage/justgage.1.0.1.js b/addons/web/static/lib/justgage/justgage.js similarity index 100% rename from addons/web/static/lib/justgage/justgage.1.0.1.js rename to addons/web/static/lib/justgage/justgage.js diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index bd1c116aded..9bc8e3bd785 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -1276,6 +1276,7 @@ instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ className: "oe_gauge", start: function() { var self = this; + var parent = this.getParent(); var max = 100; if (this.options.max_field) { max = this.getParent().record[this.options.max_field].raw_value; @@ -1287,33 +1288,43 @@ instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ var val = this.field.value; var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; var title = this.$node.html() || this.field.string; + // var unique_id = _.uniqueId("JustGage"); + + this.$el.empty() + .attr('style', this.$node.attr('style') + ';position:relative; display:inline-block;'); + this.gage = new JustGage({ parentNode: this.$el[0], + // id: unique_id, value: value, title: title, min: 0, max: max, relativeGaugeSize: true, humanFriendly: true, + titleFontColor: '#333333', + valueFontColor: '#333333', + labelFontColor: '#000', label: label, levelColors: [ "#ff0000", "#f9c802", "#a9d70b" - ] + ], }); + this.gage.refresh(value, max); var flag_open = false; - if (self.options.action_change) { - var $svg = self.$el.find('svg'); + if (this.options.action_change) { + var $svg = this.$el.find('svg'); var css = { 'text-align': 'center', 'position': 'absolute', - 'width': self.$el.outerWidth() + 'px', - 'top': (self.$el.outerHeight()/2-5) + 'px' + 'width': this.$el.outerWidth() + 'px', + 'top': (this.$el.outerHeight()/2-5) + 'px' }; - self.$el.click(function (event) { + this.$el.click(function (event) { event.stopPropagation(); flag_open = false; if (!parent.view.is_action_enabled('edit')) { @@ -1364,7 +1375,7 @@ instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ $svg.fadeTo(0, 0.3); $div = $('
').text(_t("Click to change value")); $div.css(css); - self.$el.append($div); + this.$el.append($div); } } }, From 5245e732bc31dfe65d2480565bf0b9f3be307dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 6 Sep 2013 12:05:28 +0200 Subject: [PATCH 097/110] [MOV] [ADD] Moved gauge and sparkline widgets into their own modules. Introducing two new web modules: web_kanban_gauge and web_kanban_sparkline. bzr revid: tde@openerp.com-20130906100528-rfk9u9op5u8kadl9 --- addons/web/__openerp__.py | 2 - addons/web_kanban/static/src/js/kanban.js | 151 ------------------ addons/web_kanban_gauge/__init__.py | 0 addons/web_kanban_gauge/__openerp__.py | 18 +++ .../static/lib/justgage/justgage.js | 0 .../static/src/js/kanban_gauge.js | 119 ++++++++++++++ addons/web_kanban_sparkline/__init__.py | 0 addons/web_kanban_sparkline/__openerp__.py | 18 +++ .../lib/jquery.sparkline/jquery.sparkline.js | 0 .../static/src/js/kanban_sparkline.js | 37 +++++ 10 files changed, 192 insertions(+), 153 deletions(-) create mode 100644 addons/web_kanban_gauge/__init__.py create mode 100644 addons/web_kanban_gauge/__openerp__.py rename addons/{web => web_kanban_gauge}/static/lib/justgage/justgage.js (100%) create mode 100644 addons/web_kanban_gauge/static/src/js/kanban_gauge.js create mode 100644 addons/web_kanban_sparkline/__init__.py create mode 100644 addons/web_kanban_sparkline/__openerp__.py rename addons/{web => web_kanban_sparkline}/static/lib/jquery.sparkline/jquery.sparkline.js (100%) create mode 100644 addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 9b13fd48b0a..5c8d27e11cb 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -32,11 +32,9 @@ This module provides the core of the OpenERP Web Client. "static/lib/jquery.ui.notify/js/jquery.notify.js", "static/lib/jquery.deferred-queue/jquery.deferred-queue.js", "static/lib/jquery.scrollTo/jquery.scrollTo-min.js", - "static/lib/jquery.sparkline/jquery.sparkline.js", "static/lib/jquery.tipsy/jquery.tipsy.js", "static/lib/jquery.textext/jquery.textext.js", "static/lib/jquery.timeago/jquery.timeago.js", - "static/lib/justgage/justgage.js", "static/lib/qweb/qweb2.js", "static/lib/underscore/underscore.js", "static/lib/underscore.string/lib/underscore.string.js", diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 9bc8e3bd785..8ec11e37d25 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -1232,157 +1232,6 @@ instance.web_kanban.AbstractField = instance.web.Widget.extend(instance.web_kanb instance.web_kanban.fields_registry = new instance.web.Registry({}); - -/** - * Kanban widgets: Sparkline - * - */ - -instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.extend({ - className: "oe_sparkline_bar", - start: function() { - var self = this; - var title = this.$node.html() || this.field.string; - setTimeout(function () { - var value = _.pluck(self.field.value, 'value'); - var tooltips = _.pluck(self.field.value, 'tooltip'); - var sparkline_options = _.extend({ - type: 'bar', - barWidth: 5, - height: '20px', - barWidth: 4, - barSpacing: 1, - barColor: '#96d854', - tooltipFormat: '{{offset:offset}} {{value}}', - tooltipValueLookups: { - 'offset': tooltips - } - }, self.options); - self.$el.sparkline(value, sparkline_options); - self.$el.tipsy({'delayIn': 0, 'html': true, 'title': function(){return title}, 'gravity': 'n'}); - }, 0); - }, -}); - -instance.web_kanban.fields_registry.add("sparkline_bar", "instance.web_kanban.SparklineBarWidget"); - - -/** - * Kanban widgets: GaugeWidget - * - */ - -instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ - className: "oe_gauge", - start: function() { - var self = this; - var parent = this.getParent(); - var max = 100; - if (this.options.max_field) { - max = this.getParent().record[this.options.max_field].raw_value; - } - var label = this.options.label || ""; - if (this.options.label_field) { - label = this.getParent().record[this.options.label_field].raw_value; - } - var val = this.field.value; - var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; - var title = this.$node.html() || this.field.string; - // var unique_id = _.uniqueId("JustGage"); - - this.$el.empty() - .attr('style', this.$node.attr('style') + ';position:relative; display:inline-block;'); - - this.gage = new JustGage({ - parentNode: this.$el[0], - // id: unique_id, - value: value, - title: title, - min: 0, - max: max, - relativeGaugeSize: true, - humanFriendly: true, - titleFontColor: '#333333', - valueFontColor: '#333333', - labelFontColor: '#000', - label: label, - levelColors: [ - "#ff0000", - "#f9c802", - "#a9d70b" - ], - }); - this.gage.refresh(value, max); - - var flag_open = false; - if (this.options.action_change) { - var $svg = this.$el.find('svg'); - var css = { - 'text-align': 'center', - 'position': 'absolute', - 'width': this.$el.outerWidth() + 'px', - 'top': (this.$el.outerHeight()/2-5) + 'px' - }; - - this.$el.click(function (event) { - event.stopPropagation(); - flag_open = false; - if (!parent.view.is_action_enabled('edit')) { - return; - } - if (!self.$el.find(".oe_justgage_edit").size()) { - $div = $('
'); - $div.css(css); - $input = $('').val(value); - $input.css({ - 'text-align': 'center', - 'margin': 'auto', - 'width': ($svg.outerWidth()-40) + 'px' - }); - $div.append($input); - self.$el.prepend($div) - $input.focus() - .keydown(function (event) { - event.stopPropagation(); - if (event.keyCode == 13 || event.keyCode == 9) { - if ($input.val() != value) { - parent.view.dataset.call(self.options.action_change, [parent.id, $input.val()]).then(function () { - parent.do_reload(); - }); - } else { - $div.remove(); - } - } - }) - .click(function (event) { - event.stopPropagation(); - flag_open = false; - }) - .blur(function (event) { - if(!flag_open) { - self.$el.find(".oe_justgage_edit").remove(); - } else { - flag_open = false; - setTimeout(function () {$input.focus();}, 0); - } - }); - } - }).mousedown(function () { - flag_open = true; - }); - - if (!+value) { - $svg.fadeTo(0, 0.3); - $div = $('
').text(_t("Click to change value")); - $div.css(css); - this.$el.append($div); - } - } - }, -}); - -instance.web_kanban.fields_registry.add("gauge", "instance.web_kanban.GaugeWidget"); - }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/web_kanban_gauge/__init__.py b/addons/web_kanban_gauge/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/web_kanban_gauge/__openerp__.py b/addons/web_kanban_gauge/__openerp__.py new file mode 100644 index 00000000000..19b2d6f0da3 --- /dev/null +++ b/addons/web_kanban_gauge/__openerp__.py @@ -0,0 +1,18 @@ +{ + 'name': 'Gauge Widget for Kanban', + 'category': 'Hidden', + 'description': """ +This widget allows to display gauges using jquery.sparkline library. +""", + 'version': '1.0', + 'depends': ['web_kanban'], + 'js': [ + 'static/lib/justgage/justgage.js', + 'static/src/js/kanban_gauge.js' + ], + 'css': [ + ], + 'qweb': [ + ], + 'auto_install': False, +} diff --git a/addons/web/static/lib/justgage/justgage.js b/addons/web_kanban_gauge/static/lib/justgage/justgage.js similarity index 100% rename from addons/web/static/lib/justgage/justgage.js rename to addons/web_kanban_gauge/static/lib/justgage/justgage.js diff --git a/addons/web_kanban_gauge/static/src/js/kanban_gauge.js b/addons/web_kanban_gauge/static/src/js/kanban_gauge.js new file mode 100644 index 00000000000..cb2faf6874b --- /dev/null +++ b/addons/web_kanban_gauge/static/src/js/kanban_gauge.js @@ -0,0 +1,119 @@ +openerp.web_kanban_gauge = function (instance) { + +/** + * Kanban widgets: GaugeWidget + * + */ + +instance.web_kanban.GaugeWidget = instance.web_kanban.AbstractField.extend({ + className: "oe_gauge", + start: function() { + var self = this; + var parent = this.getParent(); + var max = 100; + if (this.options.max_field) { + max = this.getParent().record[this.options.max_field].raw_value; + } + var label = this.options.label || ""; + if (this.options.label_field) { + label = this.getParent().record[this.options.label_field].raw_value; + } + var val = this.field.value; + var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; + var title = this.$node.html() || this.field.string; + // var unique_id = _.uniqueId("JustGage"); + + this.$el.empty() + .attr('style', this.$node.attr('style') + ';position:relative; display:inline-block;'); + + this.gage = new JustGage({ + parentNode: this.$el[0], + // id: unique_id, + value: value, + title: title, + min: 0, + max: max, + relativeGaugeSize: true, + humanFriendly: true, + titleFontColor: '#333333', + valueFontColor: '#333333', + labelFontColor: '#000', + label: label, + levelColors: [ + "#ff0000", + "#f9c802", + "#a9d70b" + ], + }); + this.gage.refresh(value, max); + + var flag_open = false; + if (this.options.action_change) { + var $svg = this.$el.find('svg'); + var css = { + 'text-align': 'center', + 'position': 'absolute', + 'width': this.$el.outerWidth() + 'px', + 'top': (this.$el.outerHeight()/2-5) + 'px' + }; + + this.$el.click(function (event) { + event.stopPropagation(); + flag_open = false; + if (!parent.view.is_action_enabled('edit')) { + return; + } + if (!self.$el.find(".oe_justgage_edit").size()) { + $div = $('
'); + $div.css(css); + $input = $('').val(value); + $input.css({ + 'text-align': 'center', + 'margin': 'auto', + 'width': ($svg.outerWidth()-40) + 'px' + }); + $div.append($input); + self.$el.prepend($div) + $input.focus() + .keydown(function (event) { + event.stopPropagation(); + if (event.keyCode == 13 || event.keyCode == 9) { + if ($input.val() != value) { + parent.view.dataset.call(self.options.action_change, [parent.id, $input.val()]).then(function () { + parent.do_reload(); + }); + } else { + $div.remove(); + } + } + }) + .click(function (event) { + event.stopPropagation(); + flag_open = false; + }) + .blur(function (event) { + if(!flag_open) { + self.$el.find(".oe_justgage_edit").remove(); + } else { + flag_open = false; + setTimeout(function () {$input.focus();}, 0); + } + }); + } + }).mousedown(function () { + flag_open = true; + }); + + if (!+value) { + $svg.fadeTo(0, 0.3); + $div = $('
').text(_t("Click to change value")); + $div.css(css); + this.$el.append($div); + } + } + }, +}); + +instance.web_kanban.fields_registry.add("gauge", "instance.web_kanban.GaugeWidget"); + +} diff --git a/addons/web_kanban_sparkline/__init__.py b/addons/web_kanban_sparkline/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/web_kanban_sparkline/__openerp__.py b/addons/web_kanban_sparkline/__openerp__.py new file mode 100644 index 00000000000..3fb4e13b4f7 --- /dev/null +++ b/addons/web_kanban_sparkline/__openerp__.py @@ -0,0 +1,18 @@ +{ + 'name': 'Sparkline Widget for Kanban', + 'category': 'Hidden', + 'description': """ +This widget allows to display sparklines using jquery.sparkline library. +""", + 'version': '1.0', + 'depends': ['web_kanban'], + 'js': [ + "static/lib/jquery.sparkline/jquery.sparkline.js", + 'static/src/js/kanban_sparkline.js' + ], + 'css': [ + ], + 'qweb': [ + ], + 'auto_install': False, +} diff --git a/addons/web/static/lib/jquery.sparkline/jquery.sparkline.js b/addons/web_kanban_sparkline/static/lib/jquery.sparkline/jquery.sparkline.js similarity index 100% rename from addons/web/static/lib/jquery.sparkline/jquery.sparkline.js rename to addons/web_kanban_sparkline/static/lib/jquery.sparkline/jquery.sparkline.js diff --git a/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js b/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js new file mode 100644 index 00000000000..de21cbba945 --- /dev/null +++ b/addons/web_kanban_sparkline/static/src/js/kanban_sparkline.js @@ -0,0 +1,37 @@ +openerp.web_kanban_sparkline = function (instance) { + +/** + * Kanban widgets: Sparkline + * + */ + +instance.web_kanban.SparklineBarWidget = instance.web_kanban.AbstractField.extend({ + className: "oe_sparkline_bar", + start: function() { + var self = this; + var title = this.$node.html() || this.field.string; + setTimeout(function () { + var value = _.pluck(self.field.value, 'value'); + var tooltips = _.pluck(self.field.value, 'tooltip'); + var sparkline_options = _.extend({ + type: 'bar', + barWidth: 5, + height: '20px', + barWidth: 4, + barSpacing: 1, + barColor: '#96d854', + tooltipFormat: '{{offset:offset}} {{value}}', + tooltipValueLookups: { + 'offset': tooltips + } + }, self.options); + self.$el.sparkline(value, sparkline_options); + self.$el.tipsy({'delayIn': 0, 'html': true, 'title': function(){return title}, 'gravity': 'n'}); + }, 0); + }, +}); + +instance.web_kanban.fields_registry.add("sparkline_bar", "instance.web_kanban.SparklineBarWidget"); + + +} From 205a5c37c0925d82507ea97884ef427f0794ef27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 6 Sep 2013 12:11:55 +0200 Subject: [PATCH 098/110] [CLEAN] qweb, kanban: removed forgotten console.log + unnecessary void line bzr revid: tde@openerp.com-20130906101155-0o58oycwb992s093 --- addons/web/static/lib/qweb/qweb2.js | 1 - addons/web_kanban/static/src/js/kanban.js | 1 - 2 files changed, 2 deletions(-) diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js index 44db469cd89..52e975322e5 100644 --- a/addons/web/static/lib/qweb/qweb2.js +++ b/addons/web/static/lib/qweb/qweb2.js @@ -384,7 +384,6 @@ QWeb2.Engine = (function() { this.compiled_templates[template] = tcompiled; return this.render(template, dict); } else { - console.log(this.compiled_templates, template); return this.tools.exception("Template '" + template + "' not found"); } }, diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 8ec11e37d25..6f47f9c128d 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -1231,7 +1231,6 @@ instance.web_kanban.AbstractField = instance.web.Widget.extend(instance.web_kanb }); instance.web_kanban.fields_registry = new instance.web.Registry({}); - }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: From 87ff039a2aa41435e4fc593b97aaf58ce275f140 Mon Sep 17 00:00:00 2001 From: "Sunil Sharma (OpenERP Trainee)" Date: Fri, 6 Sep 2013 16:27:05 +0530 Subject: [PATCH 099/110] [IMP]:trunk account chart template data bzr revid: sunilsharma.sharma07@gmail.com-20130906105705-j2u30ldytf3qev3r --- addons/l10n_ar/l10n_ar_chart.xml | 1 + addons/l10n_at/account_chart.xml | 1 + addons/l10n_be/account_chart_template.xml | 1 + addons/l10n_bo/l10n_bo_chart.xml | 1 + addons/l10n_br/data/account_chart_template.xml | 1 + addons/l10n_ca/account_chart_template_en.xml | 1 + addons/l10n_ca/account_chart_template_fr.xml | 1 + addons/l10n_ch/sterchi_chart/account.xml | 1 + addons/l10n_cl/l10n_cl_chart.xml | 1 + addons/l10n_cn/account_chart.xml | 1 + addons/l10n_co/data/account_chart.xml | 1 + addons/l10n_cr/data/account_chart_template.xml | 2 ++ addons/l10n_de/account_chart_template_skr03.xml | 1 + addons/l10n_de/account_chart_template_skr04.xml | 1 + addons/l10n_ec/account_chart.xml | 3 ++- addons/l10n_es/account_chart.xml | 1 + addons/l10n_es/account_chart_assoc.xml | 1 + addons/l10n_es/account_chart_pymes.xml | 1 + addons/l10n_fr/fr_pcg_taxes.xml | 1 + addons/l10n_gr/account_tax.xml | 1 + addons/l10n_gt/l10n_gt_base.xml | 1 + addons/l10n_hn/l10n_hn_base.xml | 1 + addons/l10n_hr/l10n_hr_chart_template.xml | 1 + addons/l10n_in/l10n_in_private_chart.xml | 1 + addons/l10n_in/l10n_in_public_chart.xml | 1 + addons/l10n_it/account_chart.xml | 1 + addons/l10n_lu/account_chart_template.xml | 1 + addons/l10n_ma/l10n_ma_tax.xml | 1 + addons/l10n_mx/data/account_chart.xml | 1 + addons/l10n_nl/account_chart_netherlands.xml | 1 + addons/l10n_pa/l10n_pa_chart.xml | 1 + addons/l10n_pe/l10n_pe_chart.xml | 3 ++- addons/l10n_pl/account_chart.xml | 1 + addons/l10n_pt/account_chart_template.xml | 1 + addons/l10n_ro/account_chart.xml | 2 +- addons/l10n_syscohada/l10n_syscohada_data.xml | 1 + addons/l10n_th/account_data.xml | 1 + addons/l10n_tr/account_chart_template.xml | 1 + addons/l10n_us/account_chart_template_after.xml | 8 ++++++++ addons/l10n_uy/account_chart_template.xml | 1 + addons/l10n_ve/data/account_chart.xml | 1 + addons/l10n_vn/account_chart.xml | 4 ++-- 42 files changed, 53 insertions(+), 5 deletions(-) diff --git a/addons/l10n_ar/l10n_ar_chart.xml b/addons/l10n_ar/l10n_ar_chart.xml index 062697d5aa6..02b2f3e97bf 100644 --- a/addons/l10n_ar/l10n_ar_chart.xml +++ b/addons/l10n_ar/l10n_ar_chart.xml @@ -252,6 +252,7 @@ + diff --git a/addons/l10n_at/account_chart.xml b/addons/l10n_at/account_chart.xml index 51d0c9a85a8..eca220994e6 100644 --- a/addons/l10n_at/account_chart.xml +++ b/addons/l10n_at/account_chart.xml @@ -2518,6 +2518,7 @@ + diff --git a/addons/l10n_be/account_chart_template.xml b/addons/l10n_be/account_chart_template.xml index 55726fdc335..48e506ded79 100644 --- a/addons/l10n_be/account_chart_template.xml +++ b/addons/l10n_be/account_chart_template.xml @@ -13,6 +13,7 @@ + diff --git a/addons/l10n_bo/l10n_bo_chart.xml b/addons/l10n_bo/l10n_bo_chart.xml index dc9e9598909..3d7e5cc1935 100644 --- a/addons/l10n_bo/l10n_bo_chart.xml +++ b/addons/l10n_bo/l10n_bo_chart.xml @@ -249,6 +249,7 @@ + diff --git a/addons/l10n_br/data/account_chart_template.xml b/addons/l10n_br/data/account_chart_template.xml index c99bbd03d2f..598c3191cba 100644 --- a/addons/l10n_br/data/account_chart_template.xml +++ b/addons/l10n_br/data/account_chart_template.xml @@ -11,6 +11,7 @@ + diff --git a/addons/l10n_ca/account_chart_template_en.xml b/addons/l10n_ca/account_chart_template_en.xml index 635fa7b8bb1..64e0632382e 100644 --- a/addons/l10n_ca/account_chart_template_en.xml +++ b/addons/l10n_ca/account_chart_template_en.xml @@ -13,6 +13,7 @@ + diff --git a/addons/l10n_ca/account_chart_template_fr.xml b/addons/l10n_ca/account_chart_template_fr.xml index 7d1cc0a9ae2..510153200c6 100644 --- a/addons/l10n_ca/account_chart_template_fr.xml +++ b/addons/l10n_ca/account_chart_template_fr.xml @@ -12,6 +12,7 @@ + diff --git a/addons/l10n_ch/sterchi_chart/account.xml b/addons/l10n_ch/sterchi_chart/account.xml index ddad62946ae..acee99cad4a 100644 --- a/addons/l10n_ch/sterchi_chart/account.xml +++ b/addons/l10n_ch/sterchi_chart/account.xml @@ -11812,6 +11812,7 @@ + diff --git a/addons/l10n_cl/l10n_cl_chart.xml b/addons/l10n_cl/l10n_cl_chart.xml index 8bc4272c2eb..e6d7b1d75bd 100644 --- a/addons/l10n_cl/l10n_cl_chart.xml +++ b/addons/l10n_cl/l10n_cl_chart.xml @@ -248,6 +248,7 @@ + diff --git a/addons/l10n_cn/account_chart.xml b/addons/l10n_cn/account_chart.xml index afcb3e04b0c..fe4690e306c 100644 --- a/addons/l10n_cn/account_chart.xml +++ b/addons/l10n_cn/account_chart.xml @@ -957,6 +957,7 @@ + diff --git a/addons/l10n_co/data/account_chart.xml b/addons/l10n_co/data/account_chart.xml index 2fe4ac9a1b9..06d6d471e1e 100644 --- a/addons/l10n_co/data/account_chart.xml +++ b/addons/l10n_co/data/account_chart.xml @@ -103348,6 +103348,7 @@ participacion, de conformidad con las disposiciones legales vigentes. + diff --git a/addons/l10n_cr/data/account_chart_template.xml b/addons/l10n_cr/data/account_chart_template.xml index e84ea73fbed..a8a08647c00 100644 --- a/addons/l10n_cr/data/account_chart_template.xml +++ b/addons/l10n_cr/data/account_chart_template.xml @@ -16,6 +16,7 @@ + Costa Rica - Company 1 @@ -28,6 +29,7 @@ + diff --git a/addons/l10n_de/account_chart_template_skr03.xml b/addons/l10n_de/account_chart_template_skr03.xml index 058424188f6..ce71f132de3 100644 --- a/addons/l10n_de/account_chart_template_skr03.xml +++ b/addons/l10n_de/account_chart_template_skr03.xml @@ -12,6 +12,7 @@ + diff --git a/addons/l10n_de/account_chart_template_skr04.xml b/addons/l10n_de/account_chart_template_skr04.xml index c33c0d415eb..fee680af379 100644 --- a/addons/l10n_de/account_chart_template_skr04.xml +++ b/addons/l10n_de/account_chart_template_skr04.xml @@ -12,6 +12,7 @@ + diff --git a/addons/l10n_ec/account_chart.xml b/addons/l10n_ec/account_chart.xml index 17f1b71d047..1cf12529c6c 100644 --- a/addons/l10n_ec/account_chart.xml +++ b/addons/l10n_ec/account_chart.xml @@ -4202,7 +4202,8 @@ - + + diff --git a/addons/l10n_es/account_chart.xml b/addons/l10n_es/account_chart.xml index 1bc63f6419f..8260a76dca1 100644 --- a/addons/l10n_es/account_chart.xml +++ b/addons/l10n_es/account_chart.xml @@ -13333,6 +13333,7 @@ + diff --git a/addons/l10n_es/account_chart_assoc.xml b/addons/l10n_es/account_chart_assoc.xml index 670eed53c9b..105be447ca8 100644 --- a/addons/l10n_es/account_chart_assoc.xml +++ b/addons/l10n_es/account_chart_assoc.xml @@ -12420,6 +12420,7 @@ + diff --git a/addons/l10n_es/account_chart_pymes.xml b/addons/l10n_es/account_chart_pymes.xml index 223d80e3193..1986a532a66 100644 --- a/addons/l10n_es/account_chart_pymes.xml +++ b/addons/l10n_es/account_chart_pymes.xml @@ -11464,6 +11464,7 @@ + diff --git a/addons/l10n_fr/fr_pcg_taxes.xml b/addons/l10n_fr/fr_pcg_taxes.xml index 78b34f2d696..2279b077383 100644 --- a/addons/l10n_fr/fr_pcg_taxes.xml +++ b/addons/l10n_fr/fr_pcg_taxes.xml @@ -441,6 +441,7 @@ + diff --git a/addons/l10n_gr/account_tax.xml b/addons/l10n_gr/account_tax.xml index c3de033869b..36148f49a9b 100644 --- a/addons/l10n_gr/account_tax.xml +++ b/addons/l10n_gr/account_tax.xml @@ -21,6 +21,7 @@ + diff --git a/addons/l10n_gt/l10n_gt_base.xml b/addons/l10n_gt/l10n_gt_base.xml index 8caf6ebe48c..bfc91ddb83e 100644 --- a/addons/l10n_gt/l10n_gt_base.xml +++ b/addons/l10n_gt/l10n_gt_base.xml @@ -31,6 +31,7 @@ + diff --git a/addons/l10n_hn/l10n_hn_base.xml b/addons/l10n_hn/l10n_hn_base.xml index b8b85c3f2a7..8b9acf5c50a 100644 --- a/addons/l10n_hn/l10n_hn_base.xml +++ b/addons/l10n_hn/l10n_hn_base.xml @@ -17,6 +17,7 @@ + diff --git a/addons/l10n_hr/l10n_hr_chart_template.xml b/addons/l10n_hr/l10n_hr_chart_template.xml index d9a7db5710c..1cd998115c6 100644 --- a/addons/l10n_hr/l10n_hr_chart_template.xml +++ b/addons/l10n_hr/l10n_hr_chart_template.xml @@ -15,6 +15,7 @@ + diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml index 4b8e4be55bf..efaa9844416 100644 --- a/addons/l10n_in/l10n_in_private_chart.xml +++ b/addons/l10n_in/l10n_in_private_chart.xml @@ -550,6 +550,7 @@ + diff --git a/addons/l10n_in/l10n_in_public_chart.xml b/addons/l10n_in/l10n_in_public_chart.xml index 91d285408d5..18633af054f 100644 --- a/addons/l10n_in/l10n_in_public_chart.xml +++ b/addons/l10n_in/l10n_in_public_chart.xml @@ -988,6 +988,7 @@ + diff --git a/addons/l10n_it/account_chart.xml b/addons/l10n_it/account_chart.xml index 6dd7b539b49..ca64348d482 100644 --- a/addons/l10n_it/account_chart.xml +++ b/addons/l10n_it/account_chart.xml @@ -11,6 +11,7 @@ + diff --git a/addons/l10n_lu/account_chart_template.xml b/addons/l10n_lu/account_chart_template.xml index f0986277343..254feaa932e 100644 --- a/addons/l10n_lu/account_chart_template.xml +++ b/addons/l10n_lu/account_chart_template.xml @@ -13,6 +13,7 @@ + diff --git a/addons/l10n_ma/l10n_ma_tax.xml b/addons/l10n_ma/l10n_ma_tax.xml index f296b22edca..5bc59035861 100644 --- a/addons/l10n_ma/l10n_ma_tax.xml +++ b/addons/l10n_ma/l10n_ma_tax.xml @@ -744,6 +744,7 @@ + diff --git a/addons/l10n_mx/data/account_chart.xml b/addons/l10n_mx/data/account_chart.xml index 491942e4b72..daa564fd10e 100644 --- a/addons/l10n_mx/data/account_chart.xml +++ b/addons/l10n_mx/data/account_chart.xml @@ -3695,6 +3695,7 @@ Cuentas del plan + diff --git a/addons/l10n_nl/account_chart_netherlands.xml b/addons/l10n_nl/account_chart_netherlands.xml index c7eefb42cde..03d9879a100 100644 --- a/addons/l10n_nl/account_chart_netherlands.xml +++ b/addons/l10n_nl/account_chart_netherlands.xml @@ -4102,6 +4102,7 @@ + - + diff --git a/addons/l10n_syscohada/l10n_syscohada_data.xml b/addons/l10n_syscohada/l10n_syscohada_data.xml index d90988e00e3..d4be067bfa2 100644 --- a/addons/l10n_syscohada/l10n_syscohada_data.xml +++ b/addons/l10n_syscohada/l10n_syscohada_data.xml @@ -1850,6 +1850,7 @@ + diff --git a/addons/l10n_th/account_data.xml b/addons/l10n_th/account_data.xml index 9ae3d9e3364..a6de0ced477 100644 --- a/addons/l10n_th/account_data.xml +++ b/addons/l10n_th/account_data.xml @@ -477,6 +477,7 @@ + diff --git a/addons/l10n_tr/account_chart_template.xml b/addons/l10n_tr/account_chart_template.xml index 3e10353298e..60853ff7127 100644 --- a/addons/l10n_tr/account_chart_template.xml +++ b/addons/l10n_tr/account_chart_template.xml @@ -12,6 +12,7 @@ + diff --git a/addons/l10n_us/account_chart_template_after.xml b/addons/l10n_us/account_chart_template_after.xml index 4dea930f09f..4cd1472773d 100644 --- a/addons/l10n_us/account_chart_template_after.xml +++ b/addons/l10n_us/account_chart_template_after.xml @@ -8,33 +8,41 @@ + + + + + + + + diff --git a/addons/l10n_uy/account_chart_template.xml b/addons/l10n_uy/account_chart_template.xml index 4ce35184967..8433ed18c25 100644 --- a/addons/l10n_uy/account_chart_template.xml +++ b/addons/l10n_uy/account_chart_template.xml @@ -1895,6 +1895,7 @@ + diff --git a/addons/l10n_ve/data/account_chart.xml b/addons/l10n_ve/data/account_chart.xml index 05645805a84..7c859083aed 100644 --- a/addons/l10n_ve/data/account_chart.xml +++ b/addons/l10n_ve/data/account_chart.xml @@ -3315,6 +3315,7 @@ + diff --git a/addons/l10n_vn/account_chart.xml b/addons/l10n_vn/account_chart.xml index c7d3f6a9ee3..a4d63681e01 100755 --- a/addons/l10n_vn/account_chart.xml +++ b/addons/l10n_vn/account_chart.xml @@ -1,4 +1,4 @@ - + @@ -2015,7 +2015,7 @@ - + From 7650083606d0eaac4572d71f4bf08601d22268ee Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Fri, 6 Sep 2013 18:18:36 +0530 Subject: [PATCH 100/110] [IMP] l10n_de: improved currency. bzr revid: tpa@tinyerp.com-20130906124836-40p7xtnu0qwl8g94 --- addons/l10n_de/account_chart_template_skr03.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/l10n_de/account_chart_template_skr03.xml b/addons/l10n_de/account_chart_template_skr03.xml index ce71f132de3..0e2e239fd19 100644 --- a/addons/l10n_de/account_chart_template_skr03.xml +++ b/addons/l10n_de/account_chart_template_skr03.xml @@ -12,7 +12,7 @@ - + From 099fedc7a47efe82bf411a00531367a3f072138d Mon Sep 17 00:00:00 2001 From: "Sunil Sharma (OpenERP Trainee)" Date: Mon, 9 Sep 2013 10:29:51 +0530 Subject: [PATCH 101/110] [IMP]:improved currency. bzr revid: sunilsharma.sharma07@gmail.com-20130909045951-t2wjsr5xu5ajw432 --- addons/l10n_cl/l10n_cl_chart.xml | 2 +- addons/l10n_de/account_chart_template_skr03.xml | 2 +- addons/l10n_ec/account_chart.xml | 2 +- addons/l10n_pl/account_chart.xml | 2 +- addons/l10n_ro/account_chart.xml | 2 +- addons/l10n_tr/account_chart_template.xml | 2 +- addons/l10n_uy/account_chart_template.xml | 2 +- addons/l10n_ve/data/account_chart.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/l10n_cl/l10n_cl_chart.xml b/addons/l10n_cl/l10n_cl_chart.xml index e6d7b1d75bd..2e2339f212e 100644 --- a/addons/l10n_cl/l10n_cl_chart.xml +++ b/addons/l10n_cl/l10n_cl_chart.xml @@ -248,7 +248,7 @@ - + diff --git a/addons/l10n_de/account_chart_template_skr03.xml b/addons/l10n_de/account_chart_template_skr03.xml index 0e2e239fd19..ea3c0cff3d7 100644 --- a/addons/l10n_de/account_chart_template_skr03.xml +++ b/addons/l10n_de/account_chart_template_skr03.xml @@ -12,7 +12,7 @@ - + diff --git a/addons/l10n_ec/account_chart.xml b/addons/l10n_ec/account_chart.xml index 1cf12529c6c..afa847ea5a9 100644 --- a/addons/l10n_ec/account_chart.xml +++ b/addons/l10n_ec/account_chart.xml @@ -4203,7 +4203,7 @@ - + diff --git a/addons/l10n_pl/account_chart.xml b/addons/l10n_pl/account_chart.xml index fcd1d216762..c2213c801dc 100644 --- a/addons/l10n_pl/account_chart.xml +++ b/addons/l10n_pl/account_chart.xml @@ -3202,7 +3202,7 @@ - + diff --git a/addons/l10n_ro/account_chart.xml b/addons/l10n_ro/account_chart.xml index 8f531d1ffbf..169e4bfa206 100644 --- a/addons/l10n_ro/account_chart.xml +++ b/addons/l10n_ro/account_chart.xml @@ -4587,7 +4587,7 @@ - + diff --git a/addons/l10n_tr/account_chart_template.xml b/addons/l10n_tr/account_chart_template.xml index 60853ff7127..a15af467932 100644 --- a/addons/l10n_tr/account_chart_template.xml +++ b/addons/l10n_tr/account_chart_template.xml @@ -12,7 +12,7 @@ - + diff --git a/addons/l10n_uy/account_chart_template.xml b/addons/l10n_uy/account_chart_template.xml index 8433ed18c25..2e800e4c5cb 100644 --- a/addons/l10n_uy/account_chart_template.xml +++ b/addons/l10n_uy/account_chart_template.xml @@ -1895,7 +1895,7 @@ - + diff --git a/addons/l10n_ve/data/account_chart.xml b/addons/l10n_ve/data/account_chart.xml index 7c859083aed..2dba15f1b18 100644 --- a/addons/l10n_ve/data/account_chart.xml +++ b/addons/l10n_ve/data/account_chart.xml @@ -3315,7 +3315,7 @@ - + From dd84b00b0b122b2e80d0be4b1ec6f45bb37a683f Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 11 Sep 2013 13:21:08 +0200 Subject: [PATCH 102/110] [IMP] revert changes in yaml_import bzr revid: mat@openerp.com-20130911112108-z0ivfwqy1zlqhnec --- openerp/tools/yaml_import.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index b115799129c..aba9db25f13 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -322,7 +322,7 @@ class YamlInterpreter(object): record_dict = self._create_record(model, fields, view_info, default=default) _logger.debug("RECORD_DICT %s" % record_dict) - id = self.pool['ir.model.data']._update(self.cr, self.uid, record.model, \ + id = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, record.model, \ self.module, record_dict, record.id, noupdate=self.isnoupdate(record), mode=self.mode, context=context) self.id_map[record.id] = int(id) if config.get('import_partial'): @@ -781,6 +781,7 @@ class YamlInterpreter(object): def process_url(self, node): self.validate_xml_id(node.id) + res = {'name': node.name, 'url': node.url, 'target': node.target} id = self.pool['ir.model.data']._update(self.cr, SUPERUSER_ID, \ From c312cac0fa40c6bddd7785f29c6feaadd1ff384d Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 11 Sep 2013 14:11:32 +0200 Subject: [PATCH 103/110] [IMP] remove merged conflict bzr revid: mat@openerp.com-20130911121132-47g2d267ld4b2cyl --- addons/project_issue/test/issue_process.yml | 46 --------------------- 1 file changed, 46 deletions(-) diff --git a/addons/project_issue/test/issue_process.yml b/addons/project_issue/test/issue_process.yml index 08e576d86dd..61ebe2e646c 100644 --- a/addons/project_issue/test/issue_process.yml +++ b/addons/project_issue/test/issue_process.yml @@ -1,32 +1,4 @@ - -<<<<<<< TREE - Project user can subscribe issue, so let's check data with giving the access rights of user. -- - !context - uid: 'res_users_project_issue_user' -- - In order to test process of issue tracking in OpenERP, I Open the Issue. -- - !python {model: project.issue}: | - self.case_open(cr, uid, [ref("crm_case_buginaccountsmodule0")]) -- - I check state of Issue after opened it. -- - !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue should be in open state}: - - state == 'open' -- - Now I put Issue in pending due to need more information. -- - !python {model: project.issue}: | - self.case_pending(cr, uid, [ref("crm_case_buginaccountsmodule0")]) -- - I check state after put in pending. -- - !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue should be in pending state}: - - state == 'pending' -- -======= ->>>>>>> MERGE-SOURCE I send mail to get more details. TODO revert mail.mail to mail.compose.message (conversion to customer should be automatic). - !python {model: mail.mail }: | @@ -48,21 +20,3 @@ - !python {model: project.issue}: | self.convert_issue_task(cr, uid, [ref("crm_case_buginaccountsmodule0")]) -<<<<<<< TREE -- - After resolving Issue Project user can close issue, so let's check data with giving the access rights of user. -- - !context - uid: 'res_users_project_issue_user' -- - I close Issue after resolving it -- - !python {model: project.issue}: | - self.case_close(cr, uid, [ref("crm_case_buginaccountsmodule0")]) -- - I Check state of Issue after closed. -- - !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue should be in done state}: - - state == 'done' -======= ->>>>>>> MERGE-SOURCE From 5e051e9484d8e44da9742d623326c1e09b21aec3 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 11 Sep 2013 16:25:49 +0200 Subject: [PATCH 104/110] [FIX] resource: better access rights bzr revid: mat@openerp.com-20130911142549-cpzg8588ol31b8k1 --- addons/hr_holidays/security/ir_rule.xml | 7 +++++++ addons/resource/security/ir.model.access.csv | 2 +- addons/resource/security/resource_security.xml | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/hr_holidays/security/ir_rule.xml b/addons/hr_holidays/security/ir_rule.xml index e2c0ffb1a6f..1ff12f41244 100644 --- a/addons/hr_holidays/security/ir_rule.xml +++ b/addons/hr_holidays/security/ir_rule.xml @@ -15,5 +15,12 @@ + + Leaves Officer + + [(1,'=',1)] + + + diff --git a/addons/resource/security/ir.model.access.csv b/addons/resource/security/ir.model.access.csv index 058626831c6..bf8504e2f46 100644 --- a/addons/resource/security/ir.model.access.csv +++ b/addons/resource/security/ir.model.access.csv @@ -3,5 +3,5 @@ access_resource_calendar,resource.calendar,model_resource_calendar,base.group_sy access_resource_calendar_attendance,resource.calendar.attendance,model_resource_calendar_attendance,base.group_system,1,1,1,1 access_resource_resource,resource.resource,model_resource_resource,base.group_system,1,0,0,0 access_resource_resource_all,resource.resource all,model_resource_resource,,1,0,0,0 -access_resource_calendar_leaves_all,resource.calendar.leaves,model_resource_calendar_leaves,,1,0,0,0 +access_resource_calendar_leaves_user,resource.calendar.leaves,model_resource_calendar_leaves,base.group_user,1,0,0,0 access_resource_calendar_leaves,resource.calendar.leaves,model_resource_calendar_leaves,base.group_system,1,1,1,1 diff --git a/addons/resource/security/resource_security.xml b/addons/resource/security/resource_security.xml index 77d9a11751a..43bfa6c3a4b 100644 --- a/addons/resource/security/resource_security.xml +++ b/addons/resource/security/resource_security.xml @@ -5,7 +5,7 @@ Resource: see own leaves - + ['|', ('resource_id', '=', False), ('resource_id.user_id', '=', user.id), From f5d8d2a451f719b98440203deed26a6ace41e1b4 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 11 Sep 2013 17:31:50 +0200 Subject: [PATCH 105/110] [FIX] crm: better test bzr revid: mat@openerp.com-20130911153150-uje35usg4jj8710l --- addons/crm/test/crm_lead_onchange.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/crm/test/crm_lead_onchange.yml b/addons/crm/test/crm_lead_onchange.yml index 6e11c7c54c3..ca6dd88d085 100644 --- a/addons/crm/test/crm_lead_onchange.yml +++ b/addons/crm/test/crm_lead_onchange.yml @@ -24,6 +24,7 @@ !record {model: crm.phonecall, id: crm_phonecall_5}: name: 'Bad time' partner_id: base.res_partner_5 +- Sales manager set the next stage to "New" for the lead. - !python {model: crm.lead}: | From bed4a740d48916569b9e120079eacf42b7b4006c Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 12 Sep 2013 09:06:47 +0200 Subject: [PATCH 106/110] [FIX] crm: removed useless test with state -> stage bzr revid: mat@openerp.com-20130912070647-abvqj0j57nazap6l --- addons/crm/test/crm_lead_onchange.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/addons/crm/test/crm_lead_onchange.yml b/addons/crm/test/crm_lead_onchange.yml index ca6dd88d085..c9ce6210c17 100644 --- a/addons/crm/test/crm_lead_onchange.yml +++ b/addons/crm/test/crm_lead_onchange.yml @@ -1,4 +1,3 @@ - - Sales manager create a lead record to call a partner onchange, stage onchange and mailing opt-in onchange method. - @@ -24,8 +23,3 @@ !record {model: crm.phonecall, id: crm_phonecall_5}: name: 'Bad time' partner_id: base.res_partner_5 -- - Sales manager set the next stage to "New" for the lead. -- - !python {model: crm.lead}: | - self.stage_next(cr, uid, [ref("crm_case_4")], context={'stage_type': 'lead'}) From 5175ce9e77f6343637309c7e05bc178a07768d2e Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 12 Sep 2013 09:53:53 +0200 Subject: [PATCH 107/110] [IMP] ir_model_data: restrict ir_model_data rule to read only for user and add create to group_user bzr revid: mat@openerp.com-20130912075353-s1hjsz3b0lvzhzj3 --- openerp/addons/base/security/ir.model.access.csv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/security/ir.model.access.csv b/openerp/addons/base/security/ir.model.access.csv index 77687c09ae1..fe5d622ca82 100644 --- a/openerp/addons/base/security/ir.model.access.csv +++ b/openerp/addons/base/security/ir.model.access.csv @@ -17,7 +17,8 @@ "access_ir_model_constraint","ir_model_constraint","model_ir_model_constraint",,1,0,0,0 "access_ir_model_relation","ir_model_relation","model_ir_model_relation",,1,0,0,0 "access_ir_model_access_all","ir_model_access_all","model_ir_model_access",,1,0,0,0 -"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,1,1,0 +"access_ir_model_data_all","ir_model_data all","model_ir_model_data",,1,0,0,0 +"access_ir_model_data_user","ir_model_data user","model_ir_model_data",base.group_user,1,0,1,0 "access_ir_model_fields_all","ir_model_fields all","model_ir_model_fields",,1,0,0,0 "access_ir_module_category_group_user","ir_module_category group_user","model_ir_module_category",,1,0,0,0 "access_ir_module_module_group_user","ir_module_module group_user","model_ir_module_module","group_system",1,1,1,1 From 837f2c7cb4d634ab5c5f069ce91a2d09b8a36ca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 12 Sep 2013 10:00:22 +0200 Subject: [PATCH 108/110] [DOC] web_kanban_gauge, web_kanban_sparkline: added doc with changelog bzr revid: tde@openerp.com-20130912080022-fmzl4hll4wca2yy2 --- addons/web_kanban_gauge/__openerp__.py | 2 +- addons/web_kanban_gauge/doc/changelog.rst | 10 ++++++++++ addons/web_kanban_gauge/doc/index.rst | 10 ++++++++++ addons/web_kanban_sparkline/doc/changelog.rst | 10 ++++++++++ addons/web_kanban_sparkline/doc/index.rst | 10 ++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 addons/web_kanban_gauge/doc/changelog.rst create mode 100644 addons/web_kanban_gauge/doc/index.rst create mode 100644 addons/web_kanban_sparkline/doc/changelog.rst create mode 100644 addons/web_kanban_sparkline/doc/index.rst diff --git a/addons/web_kanban_gauge/__openerp__.py b/addons/web_kanban_gauge/__openerp__.py index 19b2d6f0da3..fd4c2cfba66 100644 --- a/addons/web_kanban_gauge/__openerp__.py +++ b/addons/web_kanban_gauge/__openerp__.py @@ -2,7 +2,7 @@ 'name': 'Gauge Widget for Kanban', 'category': 'Hidden', 'description': """ -This widget allows to display gauges using jquery.sparkline library. +This widget allows to display gauges using justgage library. """, 'version': '1.0', 'depends': ['web_kanban'], diff --git a/addons/web_kanban_gauge/doc/changelog.rst b/addons/web_kanban_gauge/doc/changelog.rst new file mode 100644 index 00000000000..5b3e8fb6857 --- /dev/null +++ b/addons/web_kanban_gauge/doc/changelog.rst @@ -0,0 +1,10 @@ +.. _changelog: + +Changelog +========= + +`trunk (saas-2)` +---------------- + + - Module ``web_kanban_gauge`` created. It comes from the refactoring of + custom kanban widgets used in other modules, now standardized. diff --git a/addons/web_kanban_gauge/doc/index.rst b/addons/web_kanban_gauge/doc/index.rst new file mode 100644 index 00000000000..5c5740853d4 --- /dev/null +++ b/addons/web_kanban_gauge/doc/index.rst @@ -0,0 +1,10 @@ +Gauge for Kanban module documentation +====================================== + +Changelog +''''''''' + +.. toctree:: + :maxdepth: 1 + + changelog.rst diff --git a/addons/web_kanban_sparkline/doc/changelog.rst b/addons/web_kanban_sparkline/doc/changelog.rst new file mode 100644 index 00000000000..4c920a005ff --- /dev/null +++ b/addons/web_kanban_sparkline/doc/changelog.rst @@ -0,0 +1,10 @@ +.. _changelog: + +Changelog +========= + +`trunk (saas-2)` +---------------- + + - Module ``web_kanban_sparkline`` created. It comes from the refactoring of + custom kanban widgets used in other modules, now standardized. diff --git a/addons/web_kanban_sparkline/doc/index.rst b/addons/web_kanban_sparkline/doc/index.rst new file mode 100644 index 00000000000..869a323c62f --- /dev/null +++ b/addons/web_kanban_sparkline/doc/index.rst @@ -0,0 +1,10 @@ +Sparkline for Kanban module documentation +========================================= + +Changelog +''''''''' + +.. toctree:: + :maxdepth: 1 + + changelog.rst From 8f78d705a6a39ea01ea32ba22ff496460b8d33be Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Fri, 13 Sep 2013 05:39:30 +0000 Subject: [PATCH 109/110] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20130913053904-ur2s9sv8ghejd8ui bzr revid: launchpad_translations_on_behalf_of_openerp-20130913053930-0bdx9o2i5047r20e --- addons/mrp/i18n/da.po | 38 +- openerp/addons/base/i18n/es_BO.po | 15319 ++++++++++++++++++++++++++++ 2 files changed, 15342 insertions(+), 15 deletions(-) create mode 100644 openerp/addons/base/i18n/es_BO.po diff --git a/addons/mrp/i18n/da.po b/addons/mrp/i18n/da.po index 8020bb4afcf..11bb2b377cc 100644 --- a/addons/mrp/i18n/da.po +++ b/addons/mrp/i18n/da.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-12-21 17:04+0000\n" -"PO-Revision-Date: 2011-11-09 21:53+0000\n" -"Last-Translator: OpenERP Danmark / Henning Dinsen \n" +"PO-Revision-Date: 2013-09-12 17:27+0000\n" +"Last-Translator: John Mertens Pallesen \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2013-09-12 05:03+0000\n" +"X-Launchpad-Export-Date: 2013-09-13 05:39+0000\n" "X-Generator: Launchpad (build 16761)\n" #. module: mrp @@ -29,6 +29,14 @@ msgid "" " * Notes for the technician and for the final customer.\n" " This installs the module mrp_repair." msgstr "" +"Tillad at administrere alle reperationer på produkter.\n" +" * Tilføj/fjern varer under reparation\n" +" * Påvirkning lager\n" +" * Fakturering (varer og/eller ydelser)\n" +" * Garanti behandling\n" +" * Tilbuds rapport reparation\n" +" * Notes for the technician and for the final customer.\n" +" This installs the module mrp_repair." #. module: mrp #: report:mrp.production.order:0 @@ -38,7 +46,7 @@ msgstr "" #. module: mrp #: help:mrp.production,location_src_id:0 msgid "Location where the system will look for components." -msgstr "" +msgstr "Lokation hvor systemet vil lede efter komponenter." #. module: mrp #: field:mrp.production,workcenter_lines:0 @@ -68,12 +76,12 @@ msgstr "" #: code:addons/mrp/report/price.py:130 #, python-format msgid "Hourly Cost" -msgstr "" +msgstr "Kostpris pr. time." #. module: mrp #: view:mrp.production:0 msgid "Scrap Products" -msgstr "" +msgstr "Kasser vare" #. module: mrp #: view:mrp.workcenter:0 @@ -113,7 +121,7 @@ msgstr "" #. module: mrp #: view:product.product:0 msgid "False" -msgstr "" +msgstr "Falsk" #. module: mrp #: view:mrp.bom:0 @@ -125,12 +133,12 @@ msgstr "" #. module: mrp #: view:mrp.production:0 msgid "Finished Products" -msgstr "" +msgstr "Færdigproduceret vare" #. module: mrp #: view:mrp.production:0 msgid "Manufacturing Orders which are currently in production." -msgstr "" +msgstr "Produktionsordre igang" #. module: mrp #: help:mrp.bom,message_summary:0 @@ -145,7 +153,7 @@ msgstr "" #: model:process.transition,name:mrp.process_transition_servicerfq0 #: model:process.transition,name:mrp.process_transition_stockrfq0 msgid "To Buy" -msgstr "" +msgstr "Indkøb" #. module: mrp #: model:process.transition,note:mrp.process_transition_purchaseprocure0 @@ -187,12 +195,12 @@ msgstr "" #. module: mrp #: model:process.node,note:mrp.process_node_purchaseprocure0 msgid "For purchased material" -msgstr "" +msgstr "Indkøbte matrialer" #. module: mrp #: model:ir.ui.menu,name:mrp.menu_mrp_production_order_action msgid "Order Planning" -msgstr "" +msgstr "Ordreplanlægning" #. module: mrp #: field:mrp.config.settings,module_mrp_operations:0 @@ -203,7 +211,7 @@ msgstr "" #: code:addons/mrp/mrp.py:633 #, python-format msgid "Cannot cancel manufacturing order!" -msgstr "" +msgstr "Det er ikke muligt at annullere produktionsordre !" #. module: mrp #: field:mrp.workcenter,costs_cycle_account_id:0 @@ -250,7 +258,7 @@ msgstr "" #: view:mrp.production:0 #: field:mrp.production,move_created_ids2:0 msgid "Produced Products" -msgstr "" +msgstr "Produceret vare" #. module: mrp #: report:mrp.production.order:0 @@ -265,7 +273,7 @@ msgstr "" #. module: mrp #: field:mrp.config.settings,module_mrp_byproduct:0 msgid "Produce several products from one manufacturing order" -msgstr "" +msgstr "Producer flere varer på samme produktionsordre" #. module: mrp #: help:mrp.config.settings,group_mrp_properties:0 diff --git a/openerp/addons/base/i18n/es_BO.po b/openerp/addons/base/i18n/es_BO.po new file mode 100644 index 00000000000..dcda7fac9c2 --- /dev/null +++ b/openerp/addons/base/i18n/es_BO.po @@ -0,0 +1,15319 @@ +# Spanish (Bolivia) translation for openobject-server +# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 +# This file is distributed under the same license as the openobject-server package. +# FIRST AUTHOR , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-server\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-12-21 17:04+0000\n" +"PO-Revision-Date: 2013-09-12 21:36+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Spanish (Bolivia) \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2013-09-13 05:39+0000\n" +"X-Generator: Launchpad (build 16761)\n" + +#. module: base +#: model:ir.module.module,description:base.module_account_check_writing +msgid "" +"\n" +"Module for the Check Writing and Check Printing.\n" +"================================================\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.sh +msgid "Saint Helena" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +msgid "Other Configuration" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +msgid "DateTime" +msgstr "" + +#. module: base +#: code:addons/fields.py:652 +#, python-format +msgid "" +"The second argument of the many2many field %s must be a SQL table !You used " +"%s, which is not a valid SQL table name." +msgstr "" + +#. module: base +#: field:ir.ui.view,arch:0 +#: field:ir.ui.view.custom,arch:0 +msgid "View Architecture" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_sale_stock +msgid "Quotation, Sale Orders, Delivery & Invoicing Control" +msgstr "" + +#. module: base +#: selection:ir.sequence,implementation:0 +msgid "No gap" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Hungarian / Magyar" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (PY) / Español (PY)" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_project_management +msgid "" +"Helps you manage your projects and tasks by tracking them, generating " +"plannings, etc..." +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_point_of_sale +msgid "Touchscreen Interface for Shops" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll +msgid "Indian Payroll" +msgstr "" + +#. module: base +#: help:ir.cron,model:0 +msgid "" +"Model name on which the method to be called is located, e.g. 'res.partner'." +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Created Views" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_product_manufacturer +msgid "" +"\n" +"A module that adds manufacturers and attributes on the product form.\n" +"====================================================================\n" +"\n" +"You can now define the following for a product:\n" +"-----------------------------------------------\n" +" * Manufacturer\n" +" * Manufacturer Product Name\n" +" * Manufacturer Product Code\n" +" * Product Attributes\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.client,params:0 +msgid "Supplementary arguments" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_google_base_account +msgid "" +"\n" +"The module adds google user in res user.\n" +"========================================\n" +msgstr "" + +#. module: base +#: help:res.partner,employee:0 +msgid "Check this box if this contact is an Employee." +msgstr "" + +#. module: base +#: help:ir.model.fields,domain:0 +msgid "" +"The optional domain to restrict possible values for relationship fields, " +"specified as a Python expression defining a list of triplets. For example: " +"[('color','=','red')]" +msgstr "" + +#. module: base +#: field:res.partner,ref:0 +msgid "Reference" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba +msgid "Belgium - Structured Communication" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,target:0 +msgid "Target Window" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_rml:0 +msgid "Main Report File Path" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans +msgid "Sales Analytic Distribution" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_timesheet_invoice +msgid "" +"\n" +"Generate your Invoices from Expenses, Timesheet Entries.\n" +"========================================================\n" +"\n" +"Module to generate invoices based on costs (human resources, expenses, " +"...).\n" +"\n" +"You can define price lists in analytic account, make some theoretical " +"revenue\n" +"reports." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_sequence.py:134 +#: code:addons/base/ir/ir_sequence.py:160 +#: code:addons/base/res/res_users.py:473 +#, python-format +msgid "Warning!" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:405 +#, python-format +msgid "" +"Properties of base fields cannot be altered in this manner! Please modify " +"them through Python code, preferably through a custom addon!" +msgstr "" + +#. module: base +#: code:addons/osv.py:151 +#, python-format +msgid "Constraint Error" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_ui_view_custom +msgid "ir.ui.view.custom" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:374 +#, python-format +msgid "Renaming sparse field \"%s\" is not allowed" +msgstr "" + +#. module: base +#: model:res.country,name:base.sz +msgid "Swaziland" +msgstr "" + +#. module: base +#: code:addons/orm.py:4485 +#, python-format +msgid "created." +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_xsl:0 +msgid "XSL Path" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_tr +msgid "Turkey - Accounting" +msgstr "" + +#. module: base +#: field:ir.sequence,number_increment:0 +msgid "Increment Number" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_res_company_tree +#: model:ir.ui.menu,name:base.menu_action_res_company_tree +msgid "Company's Structure" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Inuktitut / ᐃᓄᒃᑎᑐᑦ" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_multi_currency +msgid "Multi Currencies" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_cl +msgid "" +"\n" +"Chilean accounting chart and tax localization.\n" +"==============================================\n" +"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n" +"\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale +msgid "Sales Management" +msgstr "" + +#. module: base +#: help:res.partner,user_id:0 +msgid "" +"The internal user that is in charge of communicating with this contact if " +"any." +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Search Partner" +msgstr "" + +#. module: base +#: field:ir.module.category,module_nr:0 +msgid "Number of Modules" +msgstr "" + +#. module: base +#: help:multi_company.default,company_dest_id:0 +msgid "Company to store the current record" +msgstr "" + +#. module: base +#: field:res.partner.bank.type.field,size:0 +msgid "Max. Size" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,res_id:0 +msgid "" +"Database ID of record to open in form view, when ``view_mode`` is set to " +"'form' only" +msgstr "" + +#. module: base +#: help:ir.values,key2:0 +msgid "" +"For actions, one of the possible action slots: \n" +" - client_action_multi\n" +" - client_print_multi\n" +" - client_action_relate\n" +" - tree_but_open\n" +"For defaults, an optional condition" +msgstr "" + +#. module: base +#: sql_constraint:res.lang:0 +msgid "The name of the language must be unique !" +msgstr "" + +#. module: base +#: selection:res.request,state:0 +msgid "active" +msgstr "" + +#. module: base +#: field:ir.actions.wizard,wiz_name:0 +msgid "Wizard Name" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_knowledge +msgid "" +"\n" +"Installer for knowledge-based Hidden.\n" +"=====================================\n" +"\n" +"Makes the Knowledge Application Configuration available from where you can " +"install\n" +"document and Wiki based Hidden.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_customer_relationship_management +msgid "Customer Relationship Management" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_delivery +msgid "" +"\n" +"Allows you to add delivery methods in sale orders and picking.\n" +"==============================================================\n" +"\n" +"You can define your own carrier and delivery grids for prices. When creating " +"\n" +"invoices from picking, OpenERP is able to add and compute the shipping " +"line.\n" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_filters.py:80 +#, python-format +msgid "" +"There is already a shared filter set as default for %(model)s, delete or " +"change it before setting a new default" +msgstr "" + +#. module: base +#: code:addons/orm.py:2649 +#, python-format +msgid "Invalid group_by" +msgstr "" + +#. module: base +#: field:ir.module.category,child_ids:0 +msgid "Child Applications" +msgstr "" + +#. module: base +#: field:res.partner,credit_limit:0 +msgid "Credit Limit" +msgstr "" + +#. module: base +#: field:ir.model.constraint,date_update:0 +#: field:ir.model.data,date_update:0 +#: field:ir.model.relation,date_update:0 +msgid "Update Date" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_action_rule +msgid "Automated Action Rules" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: field:ir.attachment,create_uid:0 +msgid "Owner" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +msgid "Source Object" +msgstr "" + +#. module: base +#: model:res.partner.bank.type,format_layout:base.bank_normal +msgid "%(bank_name)s: %(acc_number)s" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Config Wizard Steps" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_ui_view_sc +msgid "ir.ui.view_sc" +msgstr "" + +#. module: base +#: view:ir.model.access:0 +#: field:ir.model.access,group_id:0 +#: view:res.groups:0 +msgid "Group" +msgstr "" + +#. module: base +#: constraint:res.lang:0 +msgid "" +"Invalid date/time format directive specified. Please refer to the list of " +"allowed directives, displayed when you edit a language." +msgstr "" + +#. module: base +#: code:addons/orm.py:4153 +#, python-format +msgid "" +"One of the records you are trying to modify has already been deleted " +"(Document type: %s)." +msgstr "" + +#. module: base +#: help:ir.actions.act_window,views:0 +msgid "" +"This function field computes the ordered list of views that should be " +"enabled when displaying the result of an action, federating view mode, views " +"and reference view. The result is returned as an ordered list of pairs " +"(view_id,view_mode)." +msgstr "" + +#. module: base +#: field:ir.model.relation,name:0 +msgid "Relation Name" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Create Access Right" +msgstr "" + +#. module: base +#: model:res.country,name:base.tv +msgid "Tuvalu" +msgstr "" + +#. module: base +#: field:ir.actions.configuration.wizard,note:0 +msgid "Next Wizard" +msgstr "" + +#. module: base +#: field:res.lang,date_format:0 +msgid "Date Format" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_report_designer +msgid "OpenOffice Report Designer" +msgstr "" + +#. module: base +#: model:res.country,name:base.an +msgid "Netherlands Antilles" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:311 +#, python-format +msgid "" +"You can not remove the admin user as it is used internally for resources " +"created by OpenERP (updates, module installation, ...)" +msgstr "" + +#. module: base +#: view:workflow.transition:0 +msgid "Workflow Transition" +msgstr "" + +#. module: base +#: model:res.country,name:base.gf +msgid "French Guyana" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_hr +msgid "Jobs, Departments, Employees Details" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_analytic +msgid "" +"\n" +"Module for defining analytic accounting object.\n" +"===============================================\n" +"\n" +"In OpenERP, analytic accounts are linked to general accounts but are " +"treated\n" +"totally independently. So, you can enter various different analytic " +"operations\n" +"that have no counterpart in the general financial accounts.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_idea +msgid "Ideas" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_event +msgid "" +"\n" +"Organization and management of Events.\n" +"======================================\n" +"\n" +"The event module allows you to efficiently organise events and all related " +"tasks: planification, registration tracking,\n" +"attendances, etc.\n" +"\n" +"Key Features\n" +"------------\n" +"* Manage your Events and Registrations\n" +"* Use emails to automatically confirm and send acknowledgements for any " +"event registration\n" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Bosnian / bosanski jezik" +msgstr "" + +#. module: base +#: help:ir.actions.report.xml,attachment_use:0 +msgid "" +"If you check this, then the second time the user prints with same attachment " +"name, it returns the previous report." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_mrp_byproduct +msgid "" +"\n" +"This module allows you to produce several products from one production " +"order.\n" +"=============================================================================" +"\n" +"\n" +"You can configure by-products in the bill of material.\n" +"\n" +"Without this module:\n" +"--------------------\n" +" A + B + C -> D\n" +"\n" +"With this module:\n" +"-----------------\n" +" A + B + C -> D + E\n" +" " +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (VE) / Español (VE)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice +msgid "Invoice on Timesheets" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +msgid "Your system will be updated." +msgstr "" + +#. module: base +#: field:ir.actions.todo,note:0 +#: selection:ir.property,type:0 +msgid "Text" +msgstr "" + +#. module: base +#: field:res.country,name:0 +msgid "Country Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.co +msgid "Colombia" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_mister +msgid "Mister" +msgstr "" + +#. module: base +#: help:res.country,code:0 +msgid "" +"The ISO country code in two chars.\n" +"You can use this field for quick search." +msgstr "" + +#. module: base +#: model:res.country,name:base.pw +msgid "Palau" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Sales & Purchases" +msgstr "" + +#. module: base +#: view:ir.translation:0 +msgid "Untranslated" +msgstr "" + +#. module: base +#: view:ir.mail_server:0 +msgid "Outgoing Mail Server" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,context:0 +#: help:ir.actions.client,context:0 +msgid "" +"Context dictionary as Python expression, empty by default (Default: {})" +msgstr "" + +#. module: base +#: field:res.company,logo_web:0 +msgid "Logo Web" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:344 +#, python-format +msgid "Custom fields must have a name that starts with 'x_' !" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_mx +msgid "Mexico - Accounting" +msgstr "" + +#. module: base +#: help:ir.actions.server,action_id:0 +msgid "Select the Action Window, Report, Wizard to be executed." +msgstr "" + +#. module: base +#: sql_constraint:ir.config_parameter:0 +msgid "Key must be unique." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_plugin_outlook +msgid "Outlook Plug-In" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account +msgid "" +"\n" +"Accounting and Financial Management.\n" +"====================================\n" +"\n" +"Financial and accounting module that covers:\n" +"--------------------------------------------\n" +" * General Accounting\n" +" * Cost/Analytic accounting\n" +" * Third party accounting\n" +" * Taxes management\n" +" * Budgets\n" +" * Customer and Supplier Invoices\n" +" * Bank statements\n" +" * Reconciliation process by partner\n" +"\n" +"Creates a dashboard for accountants that includes:\n" +"--------------------------------------------------\n" +" * List of Customer Invoice to Approve\n" +" * Company Analysis\n" +" * Graph of Treasury\n" +"\n" +"The processes like maintaining of general ledger is done through the defined " +"financial Journals (entry move line orgrouping is maintained through " +"journal) \n" +"for a particular financial year and for preparation of vouchers there is a " +"module named account_voucher.\n" +" " +msgstr "" + +#. module: base +#: view:ir.model:0 +#: field:ir.model,name:0 +msgid "Model Description" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_marketing +msgid "" +"\n" +"Menu for Marketing.\n" +"===================\n" +"\n" +"Contains the installer for marketing-related modules.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_linkedin +msgid "" +"\n" +"OpenERP Web LinkedIn module.\n" +"============================\n" +"This module provides the Integration of the LinkedIn with OpenERP.\n" +" " +msgstr "" + +#. module: base +#: help:ir.actions.act_window,src_model:0 +msgid "" +"Optional model name of the objects on which this action should be visible" +msgstr "" + +#. module: base +#: field:workflow.transition,trigger_expr_id:0 +msgid "Trigger Expression" +msgstr "" + +#. module: base +#: model:res.country,name:base.jo +msgid "Jordan" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_hr +msgid "Croatia - RRIF 2012 COA" +msgstr "" + +#. module: base +#: help:ir.cron,nextcall:0 +msgid "Next planned execution date for this job." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_ui_view +msgid "ir.ui.view" +msgstr "" + +#. module: base +#: model:res.country,name:base.er +msgid "Eritrea" +msgstr "" + +#. module: base +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_base_action_rule_admin +msgid "Automated Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ro +msgid "Romania - Accounting" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_config_settings +msgid "res.config.settings" +msgstr "" + +#. module: base +#: help:res.partner,image_small:0 +msgid "" +"Small-sized image of this contact. It is automatically resized as a 64x64px " +"image, with aspect ratio preserved. Use this field anywhere a small image is " +"required." +msgstr "" + +#. module: base +#: help:ir.actions.server,mobile:0 +msgid "" +"Provides fields that be used to fetch the mobile number, e.g. you select the " +"invoice, then `object.invoice_address_id.mobile` is the field which gives " +"the correct mobile number" +msgstr "" + +#. module: base +#: view:ir.mail_server:0 +msgid "Security and Authentication" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_calendar +msgid "Web Calendar" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Swedish / svenska" +msgstr "" + +#. module: base +#: field:base.language.export,name:0 +#: field:ir.attachment,datas_fname:0 +msgid "File Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.rs +msgid "Serbia" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "Wizard View" +msgstr "" + +#. module: base +#: model:res.country,name:base.kh +msgid "Cambodia, Kingdom of" +msgstr "" + +#. module: base +#: field:base.language.import,overwrite:0 +#: field:base.language.install,overwrite:0 +msgid "Overwrite Existing Terms" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_holidays +msgid "" +"\n" +"Manage leaves and allocation requests\n" +"=====================================\n" +"\n" +"This application controls the holiday schedule of your company. It allows " +"employees to request holidays. Then, managers can review requests for " +"holidays and approve or reject them. This way you can control the overall " +"holiday planning for the company or department.\n" +"\n" +"You can configure several kinds of leaves (sickness, holidays, paid days, " +"...) and allocate leaves to an employee or department quickly using " +"allocation requests. An employee can also make a request for more days off " +"by making a new Allocation. It will increase the total of available days for " +"that leave type (if the request is accepted).\n" +"\n" +"You can keep track of leaves in different ways by following reports: \n" +"\n" +"* Leaves Summary\n" +"* Leaves by Department\n" +"* Leaves Analysis\n" +"\n" +"A synchronization with an internal agenda (Meetings of the CRM module) is " +"also possible in order to automatically create a meeting when a holiday " +"request is accepted by setting up a type of meeting in Leave Type.\n" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Albanian / Shqip" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_crm_config_opportunity +msgid "Opportunities" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_language_export +msgid "base.language.export" +msgstr "" + +#. module: base +#: model:res.country,name:base.pg +msgid "Papua New Guinea" +msgstr "" + +#. module: base +#: help:ir.actions.report.xml,report_type:0 +msgid "Report Type, e.g. pdf, html, raw, sxw, odt, html2html, mako2html, ..." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_document_webdav +msgid "Shared Repositories (WebDAV)" +msgstr "" + +#. module: base +#: view:res.users:0 +msgid "Email Preferences" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:195 +#, python-format +msgid "'%s' does not seem to be a valid date for field '%%(field)s'" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "My Partners" +msgstr "" + +#. module: base +#: model:res.country,name:base.zw +msgid "Zimbabwe" +msgstr "" + +#. module: base +#: help:ir.model.constraint,type:0 +msgid "" +"Type of the constraint: `f` for a foreign key, `u` for other constraints." +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +msgid "XML Report" +msgstr "" + +#. module: base +#: model:res.country,name:base.es +msgid "Spain" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,domain:0 +msgid "" +"Optional domain filtering of the destination data, as a Python expression" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_module_upgrade +msgid "Module Upgrade" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (UY) / Español (UY)" +msgstr "" + +#. module: base +#: field:res.partner,mobile:0 +msgid "Mobile" +msgstr "" + +#. module: base +#: model:res.country,name:base.om +msgid "Oman" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_mrp +msgid "MRP" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_attendance +msgid "" +"\n" +"This module aims to manage employee's attendances.\n" +"==================================================\n" +"\n" +"Keeps account of the attendances of the employees on the basis of the\n" +"actions(Sign in/Sign out) performed by them.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.nu +msgid "Niue" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_membership +msgid "Membership Management" +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "Other OSI Approved Licence" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_gantt +msgid "Web Gantt" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.act_menu_create +#: view:wizard.ir.model.menu.create:0 +msgid "Create Menu" +msgstr "" + +#. module: base +#: model:res.country,name:base.in +msgid "India" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.res_request_link-act +#: model:ir.ui.menu,name:base.menu_res_request_link_act +msgid "Request Reference Types" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_google_base_account +msgid "Google Users" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_fleet +msgid "Fleet Management" +msgstr "" + +#. module: base +#: help:ir.server.object.lines,value:0 +msgid "" +"Expression containing a value specification. \n" +"When Formula type is selected, this field may be a Python expression that " +"can use the same values as for the condition field on the server action.\n" +"If Value type is selected, the value will be used directly without " +"evaluation." +msgstr "" + +#. module: base +#: model:res.country,name:base.ad +msgid "Andorra, Principality of" +msgstr "" + +#. module: base +#: field:ir.rule,perm_read:0 +msgid "Apply for Read" +msgstr "" + +#. module: base +#: model:res.country,name:base.mn +msgid "Mongolia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_crm +msgid "" +"\n" +"The generic OpenERP Customer Relationship Management\n" +"====================================================\n" +"\n" +"This application enables a group of people to intelligently and efficiently " +"manage leads, opportunities, meetings and phone calls.\n" +"\n" +"It manages key tasks such as communication, identification, prioritization, " +"assignment, resolution and notification.\n" +"\n" +"OpenERP ensures that all cases are successfully tracked by users, customers " +"and suppliers. It can automatically send reminders, escalate the request, " +"trigger specific methods and many other actions based on your own enterprise " +"rules.\n" +"\n" +"The greatest thing about this system is that users don't need to do anything " +"special. The CRM module has an email gateway for the synchronization " +"interface between mails and OpenERP. That way, users can just send emails to " +"the request tracker.\n" +"\n" +"OpenERP will take care of thanking them for their message, automatically " +"routing it to the appropriate staff and make sure all future correspondence " +"gets to the right place.\n" +"\n" +"\n" +"Dashboard for CRM will include:\n" +"-------------------------------\n" +"* Planned Revenue by Stage and User (graph)\n" +"* Opportunities by Stage (graph)\n" +msgstr "" + +#. module: base +#: selection:base.language.export,format:0 +msgid "TGZ Archive" +msgstr "" + +#. module: base +#: view:res.groups:0 +msgid "" +"Users added to this group are automatically added in the following groups." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:732 +#: code:addons/base/ir/ir_model.py:735 +#, python-format +msgid "Document model" +msgstr "" + +#. module: base +#: view:res.users:0 +msgid "Change the user password." +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%B - Full month name." +msgstr "" + +#. module: base +#: field:ir.actions.todo,type:0 +#: view:ir.attachment:0 +#: field:ir.attachment,type:0 +#: field:ir.model,state:0 +#: field:ir.model.fields,state:0 +#: field:ir.property,type:0 +#: field:ir.server.object.lines,type:0 +#: field:ir.translation,type:0 +#: view:ir.ui.view:0 +#: view:ir.values:0 +#: field:ir.values,key:0 +msgid "Type" +msgstr "" + +#. module: base +#: field:ir.mail_server,smtp_user:0 +msgid "Username" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_br +msgid "" +"\n" +"Base module for the Brazilian localization\n" +"==========================================\n" +"\n" +"This module consists in:\n" +"\n" +" - Generic Brazilian chart of accounts\n" +" - Brazilian taxes such as:\n" +"\n" +" - IPI\n" +" - ICMS\n" +" - PIS\n" +" - COFINS\n" +" - ISS\n" +" - IR\n" +" - IRPJ\n" +" - CSLL\n" +"\n" +"The field tax_discount has also been added in the account.tax.template and \n" +"account.tax objects to allow the proper computation of some Brazilian VATs \n" +"such as ICMS. The chart of account creation wizard has been extended to \n" +"propagate those new data properly.\n" +"\n" +"It's important to note however that this module lack many implementations to " +"\n" +"use OpenERP properly in Brazil. Those implementations (such as the " +"electronic \n" +"fiscal Invoicing which is already operational) are brought by more than 15 \n" +"additional modules of the Brazilian Launchpad localization project \n" +"https://launchpad.net/openerp.pt-br-localiz and their dependencies in the \n" +"extra addons branch. Those modules aim at not breaking with the remarkable \n" +"OpenERP modularity, this is why they are numerous but small. One of the \n" +"reasons for maintaining those modules apart is that Brazilian Localization \n" +"leaders need commit rights agility to complete the localization as companies " +"\n" +"fund the remaining legal requirements (such as soon fiscal ledgers, \n" +"accounting SPED, fiscal SPED and PAF ECF that are still missing as September " +"\n" +"2011). Those modules are also strictly licensed under AGPL V3 and today " +"don't \n" +"come with any additional paid permission for online use of 'private " +"modules'.\n" +msgstr "" + +#. module: base +#: code:addons/orm.py:406 +#, python-format +msgid "" +"Language with code \"%s\" is not defined in your system !\n" +"Define it through the Administration menu." +msgstr "" + +#. module: base +#: model:res.country,name:base.gu +msgid "Guam (USA)" +msgstr "" + +#. module: base +#: sql_constraint:res.country:0 +msgid "The name of the country must be unique !" +msgstr "" + +#. module: base +#: field:ir.module.module,installed_version:0 +msgid "Latest Version" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Delete Access Right" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:214 +#, python-format +msgid "Connection test failed!" +msgstr "" + +#. module: base +#: selection:ir.actions.server,state:0 +#: selection:workflow.activity,kind:0 +msgid "Dummy" +msgstr "" + +#. module: base +#: constraint:ir.ui.view:0 +msgid "Invalid XML for View Architecture!" +msgstr "" + +#. module: base +#: model:res.country,name:base.ky +msgid "Cayman Islands" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Record Rule" +msgstr "" + +#. module: base +#: model:res.country,name:base.kr +msgid "South Korea" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_si +msgid "Kontni načrt za gospodarske družbe" +msgstr "" + +#. module: base +#: code:addons/orm.py:4920 +#, python-format +msgid "Record #%d of %s not found, cannot copy!" +msgstr "" + +#. module: base +#: field:ir.module.module,contributors:0 +msgid "Contributors" +msgstr "" + +#. module: base +#: field:ir.rule,perm_unlink:0 +msgid "Apply for Delete" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +msgid "Char" +msgstr "" + +#. module: base +#: field:ir.module.category,visible:0 +msgid "Visible" +msgstr "" + +#. module: base +#: model:ir.actions.client,name:base.action_client_base_menu +msgid "Open Settings Menu" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (AR) / Español (AR)" +msgstr "" + +#. module: base +#: model:res.country,name:base.ug +msgid "Uganda" +msgstr "" + +#. module: base +#: field:ir.model.access,perm_unlink:0 +msgid "Delete Access" +msgstr "" + +#. module: base +#: model:res.country,name:base.ne +msgid "Niger" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Chinese (HK)" +msgstr "" + +#. module: base +#: model:res.country,name:base.ba +msgid "Bosnia-Herzegovina" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "Wizard Field" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (GT) / Español (GT)" +msgstr "" + +#. module: base +#: field:ir.mail_server,smtp_port:0 +msgid "SMTP Port" +msgstr "" + +#. module: base +#: help:res.users,login:0 +msgid "Used to log into the system" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "" +"TGZ format: this is a compressed archive containing a PO file, directly " +"suitable\n" +" for uploading to OpenERP's translation " +"platform," +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "" +"%W - Week number of the year (Monday as the first day of the week) as a " +"decimal number [00,53]. All days in a new year preceding the first Monday " +"are considered to be in week 0." +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_language_install.py:53 +#, python-format +msgid "Language Pack" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_tests +msgid "Tests" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,attachment:0 +msgid "Save as Attachment Prefix" +msgstr "" + +#. module: base +#: field:ir.ui.view_sc,res_id:0 +msgid "Resource Ref." +msgstr "" + +#. module: base +#: field:ir.actions.act_url,url:0 +msgid "Action URL" +msgstr "" + +#. module: base +#: field:base.module.import,module_name:0 +#: field:ir.module.module,shortdesc:0 +msgid "Module Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.mh +msgid "Marshall Islands" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:429 +#, python-format +msgid "Changing the model of a field is forbidden!" +msgstr "" + +#. module: base +#: model:res.country,name:base.ht +msgid "Haiti" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll +msgid "French Payroll" +msgstr "" + +#. module: base +#: view:ir.ui.view:0 +#: selection:ir.ui.view,type:0 +msgid "Search" +msgstr "" + +#. module: base +#: code:addons/osv.py:154 +#, python-format +msgid "" +"The operation cannot be completed, probably due to the following:\n" +"- deletion: you may be trying to delete a record while other records still " +"reference it\n" +"- creation/update: a mandatory field is not correctly set" +msgstr "" + +#. module: base +#: field:ir.module.category,parent_id:0 +msgid "Parent Application" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_action_wizard +#: view:ir.actions.wizard:0 +#: model:ir.ui.menu,name:base.menu_ir_action_wizard +msgid "Wizards" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:131 +#, python-format +msgid "Operation Canceled" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_document +msgid "Document Management System" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_crm_claim +msgid "Claims Management" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_document_webdav +msgid "" +"\n" +"With this module, the WebDAV server for documents is activated.\n" +"===============================================================\n" +"\n" +"You can then use any compatible browser to remotely see the attachments of " +"OpenObject.\n" +"\n" +"After installation, the WebDAV server can be controlled by a [webdav] " +"section in \n" +"the server's config.\n" +"\n" +"Server Configuration Parameter:\n" +"-------------------------------\n" +"[webdav]:\n" +"+++++++++ \n" +" * enable = True ; Serve webdav over the http(s) servers\n" +" * vdir = webdav ; the directory that webdav will be served at\n" +" * this default val means that webdav will be\n" +" * on \"http://localhost:8069/webdav/\n" +" * verbose = True ; Turn on the verbose messages of webdav\n" +" * debug = True ; Turn on the debugging messages of webdav\n" +" * since the messages are routed to the python logging, with\n" +" * levels \"debug\" and \"debug_rpc\" respectively, you can leave\n" +" * these options on\n" +"\n" +"Also implements IETF RFC 5785 for services discovery on a http server,\n" +"which needs explicit configuration in openerp-server.conf too.\n" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_purchase_management +#: model:ir.ui.menu,name:base.menu_purchase_root +msgid "Purchases" +msgstr "" + +#. module: base +#: model:res.country,name:base.md +msgid "Moldavia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_iban +msgid "" +"\n" +"This module installs the base for IBAN (International Bank Account Number) " +"bank accounts and checks for it's validity.\n" +"=============================================================================" +"=========================================\n" +"\n" +"The ability to extract the correctly represented local accounts from IBAN " +"accounts \n" +"with a single statement.\n" +" " +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Features" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Data" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_claim +msgid "" +"\n" +"This module adds claim menu and features to your portal if claim and portal " +"are installed.\n" +"=============================================================================" +"=============\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_res_partner_bank_account_form +msgid "" +"Configure your company's bank accounts and select those that must appear on " +"the report footer. You can reorder bank accounts from the list view. If you " +"use the accounting application of OpenERP, journals and accounts will be " +"created automatically based on these data." +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Version" +msgstr "" + +#. module: base +#: help:res.users,action_id:0 +msgid "" +"If specified, this action will be opened at logon for this user, in addition " +"to the standard menu." +msgstr "" + +#. module: base +#: model:res.country,name:base.mf +msgid "Saint Martin (French part)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_exports +msgid "ir.exports" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_lu +msgid "" +"\n" +"This is the base module to manage the accounting chart for Luxembourg.\n" +"======================================================================\n" +"\n" +" * the Luxembourg Official Chart of Accounts (law of June 2009 + 2011 " +"chart and Taxes),\n" +" * the Tax Code Chart for Luxembourg\n" +" * the main taxes used in Luxembourg\n" +" * default fiscal position for local, intracom, extracom " +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_update_translations.py:39 +#, python-format +msgid "No language with code \"%s\" exists" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_social_network +#: model:ir.module.module,shortdesc:base.module_mail +msgid "Social Network" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%Y - Year with century." +msgstr "" + +#. module: base +#: view:res.company:0 +msgid "Report Footer Configuration" +msgstr "" + +#. module: base +#: field:ir.translation,comments:0 +msgid "Translation comments" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_lunch +msgid "" +"\n" +"The base module to manage lunch.\n" +"================================\n" +"\n" +"Many companies order sandwiches, pizzas and other, from usual suppliers, for " +"their employees to offer them more facilities. \n" +"\n" +"However lunches management within the company requires proper administration " +"especially when the number of employees or suppliers is important. \n" +"\n" +"The “Lunch Order” module has been developed to make this management easier " +"but also to offer employees more tools and usability. \n" +"\n" +"In addition to a full meal and supplier management, this module offers the " +"possibility to display warning and provides quick order selection based on " +"employee’s preferences.\n" +"\n" +"If you want to save your employees' time and avoid them to always have coins " +"in their pockets, this module is essential.\n" +" " +msgstr "" + +#. module: base +#: view:wizard.ir.model.menu.create:0 +msgid "Create _Menu" +msgstr "" + +#. module: base +#: help:ir.actions.server,trigger_obj_id:0 +msgid "" +"The field on the current object that links to the target object record (must " +"be a many2one, or an integer field with the record ID)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_bank +#: view:res.bank:0 +#: field:res.partner.bank,bank:0 +msgid "Bank" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_exports_line +msgid "ir.exports.line" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_purchase_management +msgid "" +"Helps you manage your purchase-related processes such as requests for " +"quotations, supplier invoices, etc..." +msgstr "" + +#. module: base +#: help:res.partner,website:0 +msgid "Website of Partner or Company" +msgstr "" + +#. module: base +#: help:base.language.install,overwrite:0 +msgid "" +"If you check this box, your customized translations will be overwritten and " +"replaced by the official ones." +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_action_report_xml +#: field:ir.module.module,reports_by_module:0 +#: model:ir.ui.menu,name:base.menu_ir_action_report_xml +msgid "Reports" +msgstr "" + +#. module: base +#: help:ir.actions.act_window.view,multi:0 +#: help:ir.actions.report.xml,multi:0 +msgid "" +"If set to true, the action will not be displayed on the right toolbar of a " +"form view." +msgstr "" + +#. module: base +#: field:workflow,on_create:0 +msgid "On Create" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:913 +#, python-format +msgid "" +"'%s' contains too many dots. XML ids should not contain dots ! These are " +"used to refer to other modules data, as in module.reference_id" +msgstr "" + +#. module: base +#: field:res.users,login:0 +msgid "Login" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "" +"Access all the fields related to the current object using expressions, i.e. " +"object.partner_id.name " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_project_issue +msgid "Portal Issue" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_tools +msgid "Tools" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +msgid "Float" +msgstr "" + +#. module: base +#: help:ir.actions.todo,type:0 +msgid "" +"Manual: Launched manually.\n" +"Automatic: Runs whenever the system is reconfigured.\n" +"Launch Manually Once: after having been launched manually, it sets " +"automatically to Done." +msgstr "" + +#. module: base +#: field:res.partner,image_small:0 +msgid "Small-sized image" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_stock +msgid "Warehouse Management" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_request_link +msgid "res.request.link" +msgstr "" + +#. module: base +#: field:ir.actions.wizard,name:0 +msgid "Wizard Info" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_wizard_lang_export +#: model:ir.ui.menu,name:base.menu_wizard_lang_export +msgid "Export Translation" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_server_action +#: view:ir.actions.server:0 +#: model:ir.ui.menu,name:base.menu_server_action +msgid "Server Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_lu +msgid "Luxembourg - Accounting" +msgstr "" + +#. module: base +#: model:res.country,name:base.tp +msgid "East Timor" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:414 +#: view:ir.module.module:0 +#, python-format +msgid "Install" +msgstr "" + +#. module: base +#: field:res.currency,accuracy:0 +msgid "Computational Accuracy" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_at +msgid "" +"\n" +"This module provides the standard Accounting Chart for Austria which is " +"based on the Template from BMF.gv.at.\n" +"=============================================================================" +"================================ \n" +"Please keep in mind that you should review and adapt it with your " +"Accountant, before using it in a live Environment.\n" +msgstr "" + +#. module: base +#: model:res.country,name:base.kg +msgid "Kyrgyz Republic (Kyrgyzstan)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_accountant +msgid "" +"\n" +"Accounting Access Rights\n" +"========================\n" +"It gives the Administrator user access to all accounting features such as " +"journal items and the chart of accounts.\n" +"\n" +"It assigns manager and user access rights to the Administrator and only user " +"rights to the Demo user. \n" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Day: %(day)s" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_point_of_sale +msgid "" +"Helps you get the most out of your points of sales with fast sale encoding, " +"simplified payment mode encoding, automatic picking lists generation and " +"more." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:164 +#, python-format +msgid "Unknown value '%s' for boolean field '%%(field)s', assuming '%s'" +msgstr "" + +#. module: base +#: model:res.country,name:base.nl +msgid "Netherlands" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_event +msgid "Portal Event" +msgstr "" + +#. module: base +#: selection:ir.translation,state:0 +msgid "Translation in Progress" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_rule +msgid "ir.rule" +msgstr "" + +#. module: base +#: selection:ir.cron,interval_type:0 +msgid "Days" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_fleet +msgid "Vehicle, leasing, insurances, costs" +msgstr "" + +#. module: base +#: view:ir.model.access:0 +#: field:ir.model.access,perm_read:0 +msgid "Read Access" +msgstr "" + +#. module: base +#: help:ir.attachment,res_id:0 +msgid "The record id this is attached to" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_share +msgid "" +"\n" +"This module adds generic sharing tools to your current OpenERP database.\n" +"========================================================================\n" +"\n" +"It specifically adds a 'share' button that is available in the Web client " +"to\n" +"share any kind of OpenERP data with colleagues, customers, friends.\n" +"\n" +"The system will work by creating new users and groups on the fly, and by\n" +"combining the appropriate access rights and ir.rules to ensure that the " +"shared\n" +"users only have access to the data that has been shared with them.\n" +"\n" +"This is extremely useful for collaborative work, knowledge sharing,\n" +"synchronization with other companies.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_process +msgid "Enterprise Process" +msgstr "" + +#. module: base +#: help:res.partner,supplier:0 +msgid "" +"Check this box if this contact is a supplier. If it's not checked, purchase " +"people will not see it when encoding a purchase order." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_evaluation +msgid "Employee Appraisals" +msgstr "" + +#. module: base +#: selection:ir.actions.server,state:0 +msgid "Write Object" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:68 +#, python-format +msgid " (copy)" +msgstr "" + +#. module: base +#: model:res.country,name:base.tm +msgid "Turkmenistan" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "7. %H:%M:%S ==> 18:25:20" +msgstr "" + +#. module: base +#: view:res.partner:0 +#: field:res.partner.category,partner_ids:0 +msgid "Partners" +msgstr "" + +#. module: base +#: field:res.partner.category,parent_left:0 +msgid "Left parent" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project_mrp +msgid "Create Tasks on SO" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:320 +#, python-format +msgid "This column contains module data and cannot be removed!" +msgstr "" + +#. module: base +#: field:res.partner.bank,footer:0 +msgid "Display on Reports" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project_timesheet +msgid "" +"\n" +"Synchronization of project task work entries with timesheet entries.\n" +"====================================================================\n" +"\n" +"This module lets you transfer the entries under tasks defined for Project\n" +"Management to the Timesheet line entries for particular date and particular " +"user\n" +"with the effect of creating, editing and deleting either ways.\n" +" " +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_model_access +msgid "ir.model.access" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_multilang +msgid "" +"\n" +" * Multi language support for Chart of Accounts, Taxes, Tax Codes, " +"Journals,\n" +" Accounting Templates, Analytic Chart of Accounts and Analytic " +"Journals.\n" +" * Setup wizard changes\n" +" - Copy translations for COA, Tax, Tax Code and Fiscal Position from\n" +" templates to target objects.\n" +" " +msgstr "" + +#. module: base +#: field:workflow.transition,act_from:0 +msgid "Source Activity" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Legend (for prefix, suffix)" +msgstr "" + +#. module: base +#: selection:ir.server.object.lines,type:0 +msgid "Formula" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:311 +#, python-format +msgid "Can not remove root user!" +msgstr "" + +#. module: base +#: model:res.country,name:base.mw +msgid "Malawi" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ec +msgid "" +"\n" +"This is the base module to manage the accounting chart for Ecuador in " +"OpenERP.\n" +"=============================================================================" +"=\n" +"\n" +"Accounting chart and localization for Ecuador.\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_filters.py:36 +#: code:addons/base/res/res_partner.py:339 +#: code:addons/base/res/res_users.py:92 +#: code:addons/base/res/res_users.py:335 +#: code:addons/base/res/res_users.py:337 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_chart +msgid "Template of Charts of Accounts" +msgstr "" + +#. module: base +#: field:res.partner,type:0 +msgid "Address Type" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_stock +msgid "" +"\n" +"Manage sales quotations and orders\n" +"==================================\n" +"\n" +"This module makes the link between the sales and warehouses management " +"applications.\n" +"\n" +"Preferences\n" +"-----------\n" +"* Shipping: Choice of delivery at once or partial delivery\n" +"* Invoicing: choose how invoices will be paid\n" +"* Incoterms: International Commercial terms\n" +"\n" +"You can choose flexible invoicing methods:\n" +"\n" +"* *On Demand*: Invoices are created manually from Sales Orders when needed\n" +"* *On Delivery Order*: Invoices are generated from picking (delivery)\n" +"* *Before Delivery*: A Draft invoice is created and must be paid before " +"delivery\n" +msgstr "" + +#. module: base +#: field:ir.ui.menu,complete_name:0 +msgid "Full Path" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "The next step depends on the file format:" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "" +"%U - Week number of the year (Sunday as the first day of the week) as a " +"decimal number [00,53]. All days in a new year preceding the first Sunday " +"are considered to be in week 0." +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "PO(T) format: you should edit it with a PO editor such as" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_administration +#: model:res.groups,name:base.group_system +msgid "Settings" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window,view_type:0 +#: selection:ir.actions.act_window.view,view_mode:0 +#: view:ir.ui.view:0 +#: selection:ir.ui.view,type:0 +msgid "Tree" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Create / Write / Copy" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Second: %(sec)s" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,view_mode:0 +msgid "View Mode" +msgstr "" + +#. module: base +#: help:res.partner.bank,footer:0 +msgid "" +"Display this bank account on the footer of printed documents like invoices " +"and sales orders." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish / Español" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Korean (KP) / 한국어 (KP)" +msgstr "" + +#. module: base +#: model:res.country,name:base.ax +msgid "Åland Islands" +msgstr "" + +#. module: base +#: field:res.company,logo:0 +msgid "Logo" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_cr +msgid "Costa Rica - Accounting" +msgstr "" + +#. module: base +#: selection:ir.actions.act_url,target:0 +#: selection:ir.actions.act_window,target:0 +msgid "New Window" +msgstr "" + +#. module: base +#: field:ir.values,action_id:0 +msgid "Action (change only)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_subscription +msgid "Recurring Documents" +msgstr "" + +#. module: base +#: model:res.country,name:base.bs +msgid "Bahamas" +msgstr "" + +#. module: base +#: field:ir.rule,perm_create:0 +msgid "Apply for Create" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_tools +msgid "Extra Tools" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Attachment" +msgstr "" + +#. module: base +#: model:res.country,name:base.ie +msgid "Ireland" +msgstr "" + +#. module: base +#: help:res.company,rml_header1:0 +msgid "" +"Appears by default on the top right corner of your printed documents (report " +"header)." +msgstr "" + +#. module: base +#: field:base.module.update,update:0 +msgid "Number of modules updated" +msgstr "" + +#. module: base +#: field:ir.cron,function:0 +msgid "Method" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_auth_crypt +msgid "Password Encryption" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +msgid "Workflow Activity" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_timesheet_sheet +msgid "" +"\n" +"Record and validate timesheets and attendances easily\n" +"=====================================================\n" +"\n" +"This application supplies a new screen enabling you to manage both " +"attendances (Sign in/Sign out) and your work encoding (timesheet) by period. " +"Timesheet entries are made by employees each day. At the end of the defined " +"period, employees validate their sheet and the manager must then approve his " +"team's entries. Periods are defined in the company forms and you can set " +"them to run monthly or weekly.\n" +"\n" +"The complete timesheet validation process is:\n" +"---------------------------------------------\n" +"* Draft sheet\n" +"* Confirmation at the end of the period by the employee\n" +"* Validation by the project manager\n" +"\n" +"The validation can be configured in the company:\n" +"------------------------------------------------\n" +"* Period size (Day, Week, Month)\n" +"* Maximal difference between timesheet and attendances\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:341 +#, python-format +msgid "" +"No matching record found for %(field_type)s '%(value)s' in field '%%(field)s'" +msgstr "" + +#. module: base +#: field:change.password.user,new_passwd:0 +msgid "New Password" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_ui_view +msgid "" +"Views allows you to personalize each view of OpenERP. You can add new " +"fields, move fields, rename them or delete the ones that you do not need." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_setup +msgid "Initial Setup Tools" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,groups_id:0 +#: model:ir.actions.act_window,name:base.action_res_groups +#: field:ir.actions.report.xml,groups_id:0 +#: view:ir.actions.todo:0 +#: field:ir.actions.todo,groups_id:0 +#: field:ir.actions.wizard,groups_id:0 +#: view:ir.model:0 +#: field:ir.model.fields,groups:0 +#: field:ir.rule,groups:0 +#: view:ir.ui.menu:0 +#: field:ir.ui.menu,groups_id:0 +#: model:ir.ui.menu,name:base.menu_action_res_groups +#: view:ir.ui.view:0 +#: field:ir.ui.view,groups_id:0 +#: view:res.groups:0 +#: field:res.users,groups_id:0 +msgid "Groups" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (CL) / Español (CL)" +msgstr "" + +#. module: base +#: model:res.country,name:base.bz +msgid "Belize" +msgstr "" + +#. module: base +#: help:ir.actions.report.xml,header:0 +msgid "Add or not the corporate RML header" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_anonymous +msgid "" +"\n" +"Allow anonymous to Access Portal.\n" +"=================================\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.ge +msgid "Georgia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_be_invoice_bba +msgid "" +"\n" +" \n" +"Belgian localization for in- and outgoing invoices (prereq to " +"account_coda):\n" +"============================================================================" +"\n" +" - Rename 'reference' field labels to 'Communication'\n" +" - Add support for Belgian Structured Communication\n" +"\n" +"A Structured Communication can be generated automatically on outgoing " +"invoices according to the following algorithms:\n" +"-----------------------------------------------------------------------------" +"----------------------------------------\n" +" 1) Random : +++RRR/RRRR/RRRDD+++\n" +" **R..R =** Random Digits, **DD =** Check Digits\n" +" 2) Date : +++DOY/YEAR/SSSDD+++\n" +" **DOY =** Day of the Year, **SSS =** Sequence Number, **DD =** Check " +"Digits\n" +" 3) Customer Reference +++RRR/RRRR/SSSDDD+++\n" +" **R..R =** Customer Reference without non-numeric characters, **SSS " +"=** Sequence Number, **DD =** Check Digits \n" +" \n" +"The preferred type of Structured Communication and associated Algorithm can " +"be\n" +"specified on the Partner records. A 'random' Structured Communication will\n" +"generated if no algorithm is specified on the Partner record. \n" +"\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.pl +msgid "Poland" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,view_mode:0 +msgid "" +"Comma-separated list of allowed view modes, such as 'form', 'tree', " +"'calendar', etc. (Default: tree,form)" +msgstr "" + +#. module: base +#: code:addons/orm.py:3843 +#, python-format +msgid "A document was modified since you last viewed it (%s:%d)" +msgstr "" + +#. module: base +#: view:workflow:0 +msgid "Workflow Editor" +msgstr "" + +#. module: base +#: selection:ir.module.module,state:0 +#: selection:ir.module.module.dependency,state:0 +msgid "To be removed" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_sequence +msgid "ir.sequence" +msgstr "" + +#. module: base +#: help:ir.actions.server,expression:0 +msgid "" +"Enter the field/expression that will return the list. E.g. select the sale " +"order in Object, and you can have loop on the sales order line. Expression = " +"`object.order_line`." +msgstr "" + +#. module: base +#: field:ir.mail_server,smtp_debug:0 +msgid "Debugging" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_crm_helpdesk +msgid "" +"\n" +"Helpdesk Management.\n" +"====================\n" +"\n" +"Like records and processing of claims, Helpdesk and Support are good tools\n" +"to trace your interventions. This menu is more adapted to oral " +"communication,\n" +"which is not necessarily related to a claim. Select a customer, add notes\n" +"and categorize your interventions with a channel and a priority level.\n" +" " +msgstr "" + +#. module: base +#: help:ir.actions.act_window,view_type:0 +msgid "" +"View type: Tree type to use for the tree view, set to 'tree' for a " +"hierarchical tree view, or 'form' for a regular list view" +msgstr "" + +#. module: base +#: sql_constraint:ir.ui.view_sc:0 +msgid "Shortcut for this menu already exists!" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Groups (no group = global)" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Extra" +msgstr "" + +#. module: base +#: model:res.country,name:base.st +msgid "Saint Tome (Sao Tome) and Principe" +msgstr "" + +#. module: base +#: selection:res.partner,type:0 +msgid "Invoice" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_product +msgid "" +"\n" +"This is the base module for managing products and pricelists in OpenERP.\n" +"========================================================================\n" +"\n" +"Products support variants, different pricing methods, suppliers " +"information,\n" +"make to stock/order, different unit of measures, packaging and properties.\n" +"\n" +"Pricelists support:\n" +"-------------------\n" +" * Multiple-level of discount (by product, category, quantities)\n" +" * Compute price based on different criteria:\n" +" * Other pricelist\n" +" * Cost price\n" +" * List price\n" +" * Supplier price\n" +"\n" +"Pricelists preferences by product and/or partners.\n" +"\n" +"Print product labels with barcode.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_analytic_default +msgid "" +"\n" +"Set default values for your analytic accounts.\n" +"==============================================\n" +"\n" +"Allows to automatically select analytic accounts based on criterions:\n" +"---------------------------------------------------------------------\n" +" * Product\n" +" * Partner\n" +" * User\n" +" * Company\n" +" * Date\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.bb +msgid "Barbados" +msgstr "" + +#. module: base +#: model:res.country,name:base.mg +msgid "Madagascar" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:127 +#, python-format +msgid "" +"The Object name must start with x_ and not contain any special character !" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_auth_oauth_signup +msgid "Signup with OAuth2 Authentication" +msgstr "" + +#. module: base +#: selection:ir.model,state:0 +msgid "Custom Object" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_menu_admin +#: view:ir.ui.menu:0 +#: field:ir.ui.menu,name:0 +msgid "Menu" +msgstr "" + +#. module: base +#: field:res.currency,rate:0 +msgid "Current Rate" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Greek / Ελληνικά" +msgstr "" + +#. module: base +#: field:res.company,custom_footer:0 +msgid "Custom Footer" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_crm +msgid "Opportunity to Quotation" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_analytic_plans +msgid "" +"\n" +"The base module to manage analytic distribution and sales orders.\n" +"=================================================================\n" +"\n" +"Using this module you will be able to link analytic accounts to sales " +"orders.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_us +msgid "" +"\n" +"United States - Chart of accounts.\n" +"==================================\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.act_url,target:0 +msgid "Action Target" +msgstr "" + +#. module: base +#: model:res.country,name:base.ai +msgid "Anguilla" +msgstr "" + +#. module: base +#: model:ir.actions.report.xml,name:base.report_ir_model_overview +msgid "Model Overview" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_product_margin +msgid "Margins by Products" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_invoiced +msgid "Invoicing" +msgstr "" + +#. module: base +#: field:ir.ui.view_sc,name:0 +msgid "Shortcut Name" +msgstr "" + +#. module: base +#: field:res.partner,contact_address:0 +msgid "Complete Address" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,limit:0 +msgid "Default limit for the list view" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_document +msgid "" +"\n" +"This is a complete document management system.\n" +"==============================================\n" +" * User Authentication\n" +" * Document Indexation:- .pptx and .docx files are not supported in " +"Windows platform.\n" +" * Dashboard for Document that includes:\n" +" * New Files (list)\n" +" * Files by Resource Type (graph)\n" +" * Files by Partner (graph)\n" +" * Files Size by Month (graph)\n" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +msgid "RML Report" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_translation_export +msgid "Import / Export" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale +msgid "" +"\n" +"Manage sales quotations and orders\n" +"==================================\n" +"\n" +"This application allows you to manage your sales goals in an effective and " +"efficient manner by keeping track of all sales orders and history.\n" +"\n" +"It handles the full sales workflow:\n" +"\n" +"* **Quotation** -> **Sales order** -> **Invoice**\n" +"\n" +"Preferences (only with Warehouse Management installed)\n" +"------------------------------------------------------\n" +"\n" +"If you also installed the Warehouse Management, you can deal with the " +"following preferences:\n" +"\n" +"* Shipping: Choice of delivery at once or partial delivery\n" +"* Invoicing: choose how invoices will be paid\n" +"* Incoterms: International Commercial terms\n" +"\n" +"You can choose flexible invoicing methods:\n" +"\n" +"* *On Demand*: Invoices are created manually from Sales Orders when needed\n" +"* *On Delivery Order*: Invoices are generated from picking (delivery)\n" +"* *Before Delivery*: A Draft invoice is created and must be paid before " +"delivery\n" +"\n" +"\n" +"The Dashboard for the Sales Manager will include\n" +"------------------------------------------------\n" +"* My Quotations\n" +"* Monthly Turnover (Graph)\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.act_window,res_id:0 +#: field:ir.model.data,res_id:0 +#: field:ir.translation,res_id:0 +#: field:ir.values,res_id:0 +msgid "Record ID" +msgstr "" + +#. module: base +#: view:ir.filters:0 +msgid "My Filters" +msgstr "" + +#. module: base +#: field:ir.actions.server,email:0 +msgid "Email Address" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_google_docs +msgid "" +"\n" +"Module to attach a google document to any model.\n" +"================================================\n" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:333 +#, python-format +msgid "Found multiple matches for field '%%(field)s' (%d matches)" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "French (BE) / Français (BE)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_pe +msgid "" +"\n" +"Peruvian accounting chart and tax localization. According the PCGE 2010.\n" +"========================================================================\n" +"\n" +"Plan contable peruano e impuestos de acuerdo a disposiciones vigentes de la\n" +"SUNAT 2011 (PCGE 2010).\n" +"\n" +" " +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +#: field:workflow.activity,action_id:0 +msgid "Server Action" +msgstr "" + +#. module: base +#: help:ir.actions.client,params:0 +msgid "Arguments sent to the client along withthe view tag" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_contacts +msgid "Contacts, People and Companies" +msgstr "" + +#. module: base +#: model:res.country,name:base.tt +msgid "Trinidad and Tobago" +msgstr "" + +#. module: base +#: model:res.country,name:base.lv +msgid "Latvia" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Field Mappings" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "Export Translations" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_auth_crypt +msgid "" +"\n" +"Ecrypted passwords\n" +"==================\n" +"\n" +"Interaction with LDAP authentication:\n" +"-------------------------------------\n" +"This module is currently not compatible with the ``user_ldap`` module and\n" +"will disable LDAP authentication completely if installed at the same time.\n" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_hr_manager +#: model:res.groups,name:base.group_sale_manager +#: model:res.groups,name:base.group_tool_manager +msgid "Manager" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:726 +#, python-format +msgid "Sorry, you are not allowed to access this document." +msgstr "" + +#. module: base +#: model:res.country,name:base.py +msgid "Paraguay" +msgstr "" + +#. module: base +#: model:res.country,name:base.fj +msgid "Fiji" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +msgid "Report Xml" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_purchase +msgid "" +"\n" +"Manage goods requirement by Purchase Orders easily\n" +"==================================================\n" +"\n" +"Purchase management enables you to track your suppliers' price quotations " +"and convert them into purchase orders if necessary.\n" +"OpenERP has several methods of monitoring invoices and tracking the receipt " +"of ordered goods. You can handle partial deliveries in OpenERP, so you can " +"keep track of items that are still to be delivered in your orders, and you " +"can issue reminders automatically.\n" +"\n" +"OpenERP’s replenishment management rules enable the system to generate draft " +"purchase orders automatically, or you can configure it to run a lean process " +"driven entirely by current production needs.\n" +"\n" +"Dashboard / Reports for Purchase Management will include:\n" +"---------------------------------------------------------\n" +"* Request for Quotations\n" +"* Purchase Orders Waiting Approval \n" +"* Monthly Purchases by Category\n" +"* Receptions Analysis\n" +"* Purchase Analysis\n" +" " +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_act_window_close +msgid "ir.actions.act_window_close" +msgstr "" + +#. module: base +#: field:ir.server.object.lines,col1:0 +msgid "Destination" +msgstr "" + +#. module: base +#: model:res.country,name:base.lt +msgid "Lithuania" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_graph +msgid "" +"\n" +"Graph Views for Web Client.\n" +"===========================\n" +"\n" +" * Parse a view but allows changing dynamically the presentation\n" +" * Graph Types: pie, lines, areas, bars, radar\n" +" * Stacked/Not Stacked for areas and bars\n" +" * Legends: top, inside (top/left), hidden\n" +" * Features: download as PNG or CSV, browse data grid, switch " +"orientation\n" +" * Unlimited \"Group By\" levels (not stacked), two cross level analysis " +"(stacked)\n" +msgstr "" + +#. module: base +#: view:res.groups:0 +msgid "Inherited" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:146 +#, python-format +msgid "yes" +msgstr "" + +#. module: base +#: field:ir.model.fields,serialization_field_id:0 +msgid "Serialization Field" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_be_hr_payroll +msgid "" +"\n" +"Belgian Payroll Rules.\n" +"======================\n" +"\n" +" * Employee Details\n" +" * Employee Contracts\n" +" * Passport based Contract\n" +" * Allowances/Deductions\n" +" * Allow to configure Basic/Gross/Net Salary\n" +" * Employee Payslip\n" +" * Monthly Payroll Register\n" +" * Integrated with Holiday Management\n" +" * Salary Maj, ONSS, Withholding Tax, Child Allowance, ...\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:174 +#, python-format +msgid "'%s' does not seem to be an integer for field '%%(field)s'" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_report_designer +msgid "" +"Lets you install various tools to simplify and enhance OpenERP's report " +"creation." +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%y - Year without century [00,99]." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_anglo_saxon +msgid "" +"\n" +"This module supports the Anglo-Saxon accounting methodology by changing the " +"accounting logic with stock transactions.\n" +"=============================================================================" +"========================================\n" +"\n" +"The difference between the Anglo-Saxon accounting countries and the Rhine \n" +"(or also called Continental accounting) countries is the moment of taking \n" +"the Cost of Goods Sold versus Cost of Sales. Anglo-Saxons accounting does \n" +"take the cost when sales invoice is created, Continental accounting will \n" +"take the cost at the moment the goods are shipped.\n" +"\n" +"This module will add this functionality by using a interim account, to \n" +"store the value of shipped goods and will contra book this interim \n" +"account when the invoice is created to transfer this amount to the \n" +"debtor or creditor account. Secondly, price differences between actual \n" +"purchase price and fixed product standard price are booked on a separate \n" +"account." +msgstr "" + +#. module: base +#: model:res.country,name:base.si +msgid "Slovenia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_status +msgid "" +"\n" +"This module handles state and stage. It is derived from the crm_base and " +"crm_case classes from crm.\n" +"=============================================================================" +"======================\n" +"\n" +" * ``base_state``: state management\n" +" * ``base_stage``: stage management\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_linkedin +msgid "LinkedIn Integration" +msgstr "" + +#. module: base +#: code:addons/orm.py:2021 +#: code:addons/orm.py:2032 +#, python-format +msgid "Invalid Object Architecture!" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:372 +#: code:addons/base/ir/ir_model.py:374 +#: code:addons/base/ir/ir_model.py:404 +#: code:addons/base/ir/ir_model.py:418 +#: code:addons/base/ir/ir_model.py:420 +#: code:addons/base/ir/ir_model.py:422 +#: code:addons/base/ir/ir_model.py:429 +#: code:addons/base/ir/ir_model.py:432 +#: code:addons/base/module/wizard/base_module_import.py:58 +#: code:addons/base/module/wizard/base_module_import.py:66 +#: code:addons/base/module/wizard/base_update_translations.py:39 +#: code:addons/base/res/res_currency.py:52 +#, python-format +msgid "Error!" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_fr_rib +msgid "French RIB Bank Details" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%p - Equivalent of either AM or PM." +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Iteration Actions" +msgstr "" + +#. module: base +#: help:multi_company.default,company_id:0 +msgid "Company where the user is connected" +msgstr "" + +#. module: base +#: model:res.groups,comment:base.group_sale_manager +msgid "" +"the user will have an access to the sales configuration as well as statistic " +"reports." +msgstr "" + +#. module: base +#: model:res.country,name:base.nz +msgid "New Zealand" +msgstr "" + +#. module: base +#: field:ir.exports.line,name:0 +#: view:ir.model.fields:0 +#: field:res.partner.bank.type.field,name:0 +msgid "Field Name" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_country +msgid "" +"Display and manage the list of all countries that can be assigned to your " +"partner records. You can create or delete countries to make sure the ones " +"you are working on will be maintained." +msgstr "" + +#. module: base +#: model:res.country,name:base.nf +msgid "Norfolk Island" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Korean (KR) / 한국어 (KR)" +msgstr "" + +#. module: base +#: help:ir.model.fields,model:0 +msgid "The technical name of the model this field belongs to" +msgstr "" + +#. module: base +#: field:ir.actions.server,action_id:0 +#: selection:ir.actions.server,state:0 +#: view:ir.values:0 +msgid "Client Action" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_subscription +msgid "" +"\n" +"Create recurring documents.\n" +"===========================\n" +"\n" +"This module allows to create new documents and add subscriptions on that " +"document.\n" +"\n" +"e.g. To have an invoice generated automatically periodically:\n" +"-------------------------------------------------------------\n" +" * Define a document type based on Invoice object\n" +" * Define a subscription whose source document is the document defined " +"as\n" +" above. Specify the interval information and partner to be invoice.\n" +" " +msgstr "" + +#. module: base +#: field:res.company,rml_header1:0 +msgid "Company Tagline" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:674 +#: model:ir.model,name:base.model_ir_module_category +#: field:ir.module.module,application:0 +#: field:res.groups,category_id:0 +#: view:res.users:0 +#, python-format +msgid "Application" +msgstr "" + +#. module: base +#: model:res.groups,comment:base.group_hr_manager +msgid "" +"the user will have an access to the human resources configuration as well as " +"statistic reports." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_pl +msgid "" +"\n" +"This is the module to manage the accounting chart and taxes for Poland in " +"OpenERP.\n" +"=============================================================================" +"=====\n" +"\n" +"To jest moduł do tworzenia wzorcowego planu kont i podstawowych ustawień do " +"podatków\n" +"VAT 0%, 7% i 22%. Moduł ustawia też konta do kupna i sprzedaży towarów " +"zakładając,\n" +"że wszystkie towary są w obrocie hurtowym.\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.client,params_store:0 +msgid "Params storage" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:525 +#, python-format +msgid "Can not upgrade module '%s'. It is not installed." +msgstr "" + +#. module: base +#: model:res.country,name:base.cu +msgid "Cuba" +msgstr "" + +#. module: base +#: code:addons/report_sxw.py:443 +#, python-format +msgid "Unknown report type: %s" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_hr_expense +msgid "Expenses Validation, Invoicing" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_be_hr_payroll_account +msgid "" +"\n" +"Accounting Data for Belgian Payroll Rules.\n" +"==========================================\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.am +msgid "Armenia" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_hr_evaluation +msgid "Periodical Evaluations, Appraisals, Surveys" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_property_form +#: model:ir.ui.menu,name:base.menu_ir_property_form_all +msgid "Configuration Parameters" +msgstr "" + +#. module: base +#: constraint:ir.cron:0 +msgid "Invalid arguments" +msgstr "" + +#. module: base +#: model:res.country,name:base.se +msgid "Sweden" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_file:0 +msgid "Report File" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window.view,view_mode:0 +#: selection:ir.ui.view,type:0 +msgid "Gantt" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_in_hr_payroll +msgid "" +"\n" +"Indian Payroll Salary Rules.\n" +"============================\n" +"\n" +" -Configuration of hr_payroll for India localization\n" +" -All main contributions rules for India payslip.\n" +" * New payslip report\n" +" * Employee Contracts\n" +" * Allow to configure Basic / Gross / Net Salary\n" +" * Employee PaySlip\n" +" * Allowance / Deduction\n" +" * Integrated with Holiday Management\n" +" * Medical Allowance, Travel Allowance, Child Allowance, ...\n" +" - Payroll Advice and Report\n" +" - Yearly Salary by Head and Yearly Salary by Employee Report\n" +" " +msgstr "" + +#. module: base +#: code:addons/orm.py:3871 +#, python-format +msgid "Missing document(s)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_partner_bank_type +#: field:res.partner.bank,state:0 +#: view:res.partner.bank.type:0 +msgid "Bank Account Type" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_expense +msgid "" +"\n" +"Manage expenses by Employees\n" +"============================\n" +"\n" +"This application allows you to manage your employees' daily expenses. It " +"gives you access to your employees’ fee notes and give you the right to " +"complete and validate or refuse the notes. After validation it creates an " +"invoice for the employee.\n" +"Employee can encode their own expenses and the validation flow puts it " +"automatically in the accounting after validation by managers.\n" +"\n" +"\n" +"The whole flow is implemented as:\n" +"---------------------------------\n" +"* Draft expense\n" +"* Confirmation of the sheet by the employee\n" +"* Validation by his manager\n" +"* Validation by the accountant and receipt creation\n" +"\n" +"This module also uses analytic accounting and is compatible with the invoice " +"on timesheet module so that you are able to automatically re-invoice your " +"customers' expenses if your work by project.\n" +" " +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "" +"For more details about translating OpenERP in your language, please refer to " +"the" +msgstr "" + +#. module: base +#: field:res.partner,image:0 +msgid "Image" +msgstr "" + +#. module: base +#: model:res.country,name:base.at +msgid "Austria" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window.view,view_mode:0 +#: model:ir.module.module,shortdesc:base.module_base_calendar +#: model:ir.ui.menu,name:base.menu_calendar_configuration +#: selection:ir.ui.view,type:0 +msgid "Calendar" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_knowledge_management +msgid "Knowledge" +msgstr "" + +#. module: base +#: field:workflow.activity,signal_send:0 +msgid "Signal (subflow.*)" +msgstr "" + +#. module: base +#: code:addons/orm.py:4685 +#, python-format +msgid "" +"Invalid \"order\" specified. A valid \"order\" specification is a comma-" +"separated list of valid field names (optionally followed by asc/desc for the " +"direction)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_module_module_dependency +msgid "Module dependency" +msgstr "" + +#. module: base +#: model:res.country,name:base.bd +msgid "Bangladesh" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_partner_title_contact +msgid "" +"Manage the contact titles you want to have available in your system and the " +"way you want to print them in letters and other documents. Some example: " +"Mr., Mrs. " +msgstr "" + +#. module: base +#: view:ir.model.access:0 +#: view:res.groups:0 +#: field:res.groups,model_access:0 +msgid "Access Controls" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:277 +#, python-format +msgid "" +"The Selection Options expression is not a valid Pythonic expression.Please " +"provide an expression in the [('key','Label'), ...] format." +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_survey_user +msgid "Survey / User" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +#: field:ir.module.module,dependencies_id:0 +msgid "Dependencies" +msgstr "" + +#. module: base +#: field:multi_company.default,company_id:0 +msgid "Main Company" +msgstr "" + +#. module: base +#: field:ir.ui.menu,web_icon_hover:0 +msgid "Web Icon File (hover)" +msgstr "" + +#. module: base +#: help:res.currency,name:0 +msgid "Currency Code (ISO 4217)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_contract +msgid "Employee Contracts" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "" +"If you use a formula type, use a python expression using the variable " +"'object'." +msgstr "" + +#. module: base +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "" + +#. module: base +#: field:res.partner,birthdate:0 +msgid "Birthdate" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_title_contact +#: model:ir.ui.menu,name:base.menu_partner_title_contact +msgid "Contact Titles" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_product_manufacturer +msgid "Products Manufacturers" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:240 +#, python-format +msgid "SMTP-over-SSL mode unavailable" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_survey +#: model:ir.ui.menu,name:base.next_id_10 +msgid "Survey" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (DO) / Español (DO)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_workflow_activity +msgid "workflow.activity" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "Export Complete" +msgstr "" + +#. module: base +#: help:ir.ui.view_sc,res_id:0 +msgid "" +"Reference of the target resource, whose model/table depends on the 'Resource " +"Name' field." +msgstr "" + +#. module: base +#: field:ir.model.fields,select_level:0 +msgid "Searchable" +msgstr "" + +#. module: base +#: model:res.country,name:base.uy +msgid "Uruguay" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Finnish / Suomi" +msgstr "" + +#. module: base +#: view:ir.config_parameter:0 +msgid "System Properties" +msgstr "" + +#. module: base +#: field:ir.sequence,prefix:0 +msgid "Prefix" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "German / Deutsch" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Fields Mapping" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_sir +#: model:res.partner.title,shortcut:base.res_partner_title_sir +msgid "Sir" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ca +msgid "" +"\n" +"This is the module to manage the English and French - Canadian accounting " +"chart in OpenERP.\n" +"=============================================================================" +"==============\n" +"\n" +"Canadian accounting charts and localizations.\n" +" " +msgstr "" + +#. module: base +#: view:base.module.import:0 +msgid "Select module package to import (.zip file):" +msgstr "" + +#. module: base +#: view:ir.filters:0 +msgid "Personal" +msgstr "" + +#. module: base +#: field:base.language.export,modules:0 +msgid "Modules To Export" +msgstr "" + +#. module: base +#: model:res.country,name:base.mt +msgid "Malta" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:732 +#, python-format +msgid "" +"Only users with the following access level are currently allowed to do that" +msgstr "" + +#. module: base +#: field:ir.actions.server,fields_lines:0 +msgid "Field Mappings." +msgstr "" + +#. module: base +#: selection:res.request,priority:0 +msgid "High" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_mrp +msgid "" +"\n" +"Manage the Manufacturing process in OpenERP\n" +"===========================================\n" +"\n" +"The manufacturing module allows you to cover planning, ordering, stocks and " +"the manufacturing or assembly of products from raw materials and components. " +"It handles the consumption and production of products according to a bill of " +"materials and the necessary operations on machinery, tools or human " +"resources according to routings.\n" +"\n" +"It supports complete integration and planification of stockable goods, " +"consumables or services. Services are completely integrated with the rest of " +"the software. For instance, you can set up a sub-contracting service in a " +"bill of materials to automatically purchase on order the assembly of your " +"production.\n" +"\n" +"Key Features\n" +"------------\n" +"* Make to Stock/Make to Order\n" +"* Multi-level bill of materials, no limit\n" +"* Multi-level routing, no limit\n" +"* Routing and work center integrated with analytic accounting\n" +"* Periodical scheduler computation \n" +"* Allows to browse bills of materials in a complete structure that includes " +"child and phantom bills of materials\n" +"\n" +"Dashboard / Reports for MRP will include:\n" +"-----------------------------------------\n" +"* Procurements in Exception (Graph)\n" +"* Stock Value Variation (Graph)\n" +"* Work Order Analysis\n" +" " +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: field:ir.attachment,description:0 +#: field:ir.mail_server,name:0 +#: field:ir.module.category,description:0 +#: view:ir.module.module:0 +#: field:ir.module.module,description:0 +msgid "Description" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_workflow_instance_form +#: model:ir.ui.menu,name:base.menu_workflow_instance +msgid "Instances" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_purchase_requisition +msgid "" +"\n" +"This module allows you to manage your Purchase Requisition.\n" +"===========================================================\n" +"\n" +"When a purchase order is created, you now have the opportunity to save the\n" +"related requisition. This new object will regroup and will allow you to " +"easily\n" +"keep track and order all your purchase orders.\n" +msgstr "" + +#. module: base +#: help:ir.mail_server,smtp_host:0 +msgid "Hostname or IP of SMTP server" +msgstr "" + +#. module: base +#: model:res.country,name:base.aq +msgid "Antarctica" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Persons" +msgstr "" + +#. module: base +#: view:base.language.import:0 +msgid "_Import" +msgstr "" + +#. module: base +#: field:res.users,action_id:0 +msgid "Home Action" +msgstr "" + +#. module: base +#: field:res.lang,grouping:0 +msgid "Separator Format" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_report_webkit +msgid "Webkit Report Engine" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.next_id_9 +msgid "Database Structure" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_mass_mail +msgid "Mass Mailing" +msgstr "" + +#. module: base +#: model:res.country,name:base.yt +msgid "Mayotte" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_crm_todo +msgid "Tasks on CRM" +msgstr "" + +#. module: base +#: help:ir.model.fields,relation_field:0 +msgid "" +"For one2many fields, the field on the target model that implement the " +"opposite many2one relationship" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Interaction between rules" +msgstr "" + +#. module: base +#: field:res.company,rml_footer:0 +#: field:res.company,rml_footer_readonly:0 +msgid "Report Footer" +msgstr "" + +#. module: base +#: selection:res.lang,direction:0 +msgid "Right-to-Left" +msgstr "" + +#. module: base +#: model:res.country,name:base.sx +msgid "Sint Maarten (Dutch part)" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: model:ir.actions.act_window,name:base.actions_ir_filters_view +#: view:ir.filters:0 +#: model:ir.model,name:base.model_ir_filters +msgid "Filters" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_cron_act +#: view:ir.cron:0 +#: model:ir.ui.menu,name:base.menu_ir_cron_act +msgid "Scheduled Actions" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_reporting +#: model:ir.ui.menu,name:base.menu_lunch_reporting +#: model:ir.ui.menu,name:base.menu_reporting +msgid "Reporting" +msgstr "" + +#. module: base +#: field:res.partner,title:0 +#: field:res.partner.title,name:0 +msgid "Title" +msgstr "" + +#. module: base +#: help:ir.property,res_id:0 +msgid "If not set, acts as a default value for new resources" +msgstr "" + +#. module: base +#: code:addons/orm.py:4246 +#, python-format +msgid "Recursivity Detected." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_et +msgid "Ethiopia - Accounting" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:366 +#, python-format +msgid "Recursion error in modules dependencies !" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_analytic_user_function +msgid "" +"\n" +"This module allows you to define what is the default function of a specific " +"user on a given account.\n" +"=============================================================================" +"=======================\n" +"\n" +"This is mostly used when a user encodes his timesheet: the values are " +"retrieved\n" +"and the fields are auto-filled. But the possibility to change these values " +"is\n" +"still available.\n" +"\n" +"Obviously if no data has been recorded for the current account, the default\n" +"value is given as usual by the employee data so that this module is " +"perfectly\n" +"compatible with older configurations.\n" +"\n" +" " +msgstr "" + +#. module: base +#: view:ir.model:0 +msgid "Create a Menu" +msgstr "" + +#. module: base +#: model:res.country,name:base.tg +msgid "Togo" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,res_model:0 +#: field:ir.actions.client,res_model:0 +msgid "Destination Model" +msgstr "" + +#. module: base +#: selection:ir.sequence,implementation:0 +msgid "Standard" +msgstr "" + +#. module: base +#: model:res.country,name:base.ru +msgid "Russian Federation" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Urdu / اردو" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:739 +#: code:addons/orm.py:3567 +#: code:addons/orm.py:3860 +#: code:addons/orm.py:3902 +#, python-format +msgid "Access Denied" +msgstr "" + +#. module: base +#: field:res.company,name:0 +msgid "Company Name" +msgstr "" + +#. module: base +#: code:addons/orm.py:2808 +#, python-format +msgid "" +"Invalid value for reference field \"%s.%s\" (last part must be a non-zero " +"integer): \"%s\"" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_country +#: model:ir.ui.menu,name:base.menu_country_partner +msgid "Countries" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "RML (deprecated - use Report)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_fr_hr_payroll +msgid "" +"\n" +"French Payroll Rules.\n" +"=====================\n" +"\n" +" - Configuration of hr_payroll for French localization\n" +" - All main contributions rules for French payslip, for 'cadre' and 'non-" +"cadre'\n" +" - New payslip report\n" +"\n" +"TODO:\n" +"-----\n" +" - Integration with holidays module for deduction and allowance\n" +" - Integration with hr_payroll_account for the automatic " +"account_move_line\n" +" creation from the payslip\n" +" - Continue to integrate the contribution. Only the main contribution " +"are\n" +" currently implemented\n" +" - Remake the report under webkit\n" +" - The payslip.line with appears_in_payslip = False should appears in " +"the\n" +" payslip interface, but not in the payslip report\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.pm +msgid "Saint Pierre and Miquelon" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Search Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_calendar +msgid "" +"\n" +"This is a full-featured calendar system.\n" +"========================================\n" +"\n" +"It supports:\n" +"------------\n" +" - Calendar of events\n" +" - Recurring events\n" +"\n" +"If you need to manage your meetings, you should install the CRM module.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.je +msgid "Jersey" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_translation +msgid "ir.translation" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "12. %w ==> 5 ( Friday is the 6th day)" +msgstr "" + +#. module: base +#: constraint:res.partner.category:0 +msgid "Error ! You can not create recursive categories." +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%x - Appropriate date representation." +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Tag" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%d - Day of the month [01,31]." +msgstr "" + +#. module: base +#: model:res.country,name:base.tj +msgid "Tajikistan" +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "GPL-2 or later version" +msgstr "" + +#. module: base +#: selection:workflow.activity,kind:0 +msgid "Stop All" +msgstr "" + +#. module: base +#: field:res.company,paper_format:0 +msgid "Paper Format" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:644 +#, python-format +msgid "" +"Can not create the module file:\n" +" %s" +msgstr "" + +#. module: base +#: model:res.country,name:base.sk +msgid "Slovakia" +msgstr "" + +#. module: base +#: model:res.country,name:base.nr +msgid "Nauru" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:166 +#, python-format +msgid "Reg" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_property +msgid "ir.property" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window,view_type:0 +#: selection:ir.actions.act_window.view,view_mode:0 +#: view:ir.ui.view:0 +#: selection:ir.ui.view,type:0 +msgid "Form" +msgstr "" + +#. module: base +#: model:res.country,name:base.pf +msgid "Polynesia (French)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_it +msgid "" +"\n" +"Piano dei conti italiano di un'impresa generica.\n" +"================================================\n" +"\n" +"Italian accounting chart and localization.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.me +msgid "Montenegro" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_fetchmail +msgid "Email Gateway" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:470 +#, python-format +msgid "" +"Mail delivery failed via SMTP server '%s'.\n" +"%s: %s" +msgstr "" + +#. module: base +#: model:res.country,name:base.tk +msgid "Tokelau" +msgstr "" + +#. module: base +#: view:ir.cron:0 +#: view:ir.module.module:0 +msgid "Technical Data" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_co +msgid "" +"\n" +"Chart of account for Colombia\n" +"=============================\n" +"\n" +"Source of this chart of account is here_.\n" +"\n" +"All the documentation available in this website is embeded in this module, " +"to\n" +"be sure when you open OpenERP it has all necesary information to manage \n" +"accounting en Colombia.\n" +"\n" +"The law that enable this chart of account as valid for this country is \n" +"available in this other link_.\n" +"\n" +"This module has the intention to put available out of the box the chart of \n" +"account for Colombia in Openerp.\n" +"\n" +"We recommend install the module account_anglo_sxon to be able to have the " +"cost\n" +"accounting correctly setted in out invoices.\n" +"\n" +"After installing this module, the Configuration wizard for accounting is " +"launched.\n" +" * We have the account templates which can be helpful to generate Charts " +"of Accounts.\n" +" * On that particular wizard, you will be asked to pass the name of the " +"company,\n" +" the chart template to follow, the no. of digits to generate, the code " +"for your\n" +" account and bank account, currency to create journals.\n" +"\n" +".. _here: http://puc.com.co/\n" +".. _link: http://puc.com.co/normatividad/\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_bank_statement_extensions +msgid "" +"\n" +"Module that extends the standard account_bank_statement_line object for " +"improved e-banking support.\n" +"=============================================================================" +"======================\n" +"\n" +"This module adds:\n" +"-----------------\n" +" - valuta date\n" +" - batch payments\n" +" - traceability of changes to bank statement lines\n" +" - bank statement line views\n" +" - bank statements balances report\n" +" - performance improvements for digital import of bank statement (via \n" +" 'ebanking_import' context flag)\n" +" - name_search on res.partner.bank enhanced to allow search on bank \n" +" and iban account numbers\n" +" " +msgstr "" + +#. module: base +#: selection:ir.module.module,state:0 +#: selection:ir.module.module.dependency,state:0 +msgid "To be upgraded" +msgstr "" + +#. module: base +#: model:res.country,name:base.ly +msgid "Libya" +msgstr "" + +#. module: base +#: model:res.country,name:base.cf +msgid "Central African Republic" +msgstr "" + +#. module: base +#: model:res.country,name:base.li +msgid "Liechtenstein" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project_issue_sheet +msgid "Timesheet on Issues" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_ltd +msgid "Ltd" +msgstr "" + +#. module: base +#: model:ir.actions.server,name:base.action_run_ir_action_todo +msgid "Run Remaining Action Todo" +msgstr "" + +#. module: base +#: field:res.partner,ean13:0 +msgid "EAN13" +msgstr "" + +#. module: base +#: code:addons/orm.py:2247 +#, python-format +msgid "Invalid Architecture!" +msgstr "" + +#. module: base +#: model:res.country,name:base.pt +msgid "Portugal" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_share +msgid "Share any Document" +msgstr "" + +#. module: base +#: field:workflow.transition,group_id:0 +msgid "Group Required" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "6. %d, %m ==> 05, 12" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_it +msgid "Italy - Accounting" +msgstr "" + +#. module: base +#: field:ir.actions.act_url,help:0 +#: field:ir.actions.act_window,help:0 +#: field:ir.actions.act_window_close,help:0 +#: field:ir.actions.actions,help:0 +#: field:ir.actions.client,help:0 +#: field:ir.actions.report.xml,help:0 +#: field:ir.actions.server,help:0 +#: field:ir.actions.wizard,help:0 +msgid "Action description" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ma +msgid "" +"\n" +"This is the base module to manage the accounting chart for Maroc.\n" +"=================================================================\n" +"\n" +"Ce Module charge le modèle du plan de comptes standard Marocain et permet " +"de\n" +"générer les états comptables aux normes marocaines (Bilan, CPC (comptes de\n" +"produits et charges), balance générale à 6 colonnes, Grand livre " +"cumulatif...).\n" +"L'intégration comptable a été validé avec l'aide du Cabinet d'expertise " +"comptable\n" +"Seddik au cours du troisième trimestre 2010." +msgstr "" + +#. module: base +#: help:ir.module.module,auto_install:0 +msgid "" +"An auto-installable module is automatically installed by the system when all " +"its dependencies are satisfied. If the module has no dependency, it is " +"always installed." +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.res_lang_act_window +#: model:ir.model,name:base.model_res_lang +#: model:ir.ui.menu,name:base.menu_res_lang_act_window +#: view:res.lang:0 +msgid "Languages" +msgstr "" + +#. module: base +#: selection:workflow.activity,join_mode:0 +#: selection:workflow.activity,split_mode:0 +msgid "Xor" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_localization_account_charts +msgid "Account Charts" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_event_main +msgid "Events Organization" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_customer_form +#: model:ir.actions.act_window,name:base.action_partner_form +#: model:ir.ui.menu,name:base.menu_partner_form +#: view:res.partner:0 +msgid "Customers" +msgstr "" + +#. module: base +#: model:res.country,name:base.au +msgid "Australia" +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Menu :" +msgstr "" + +#. module: base +#: selection:ir.model.fields,state:0 +msgid "Base Field" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_managing_vehicles_and_contracts +msgid "Managing vehicles and contracts" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_setup +msgid "" +"\n" +"This module helps to configure the system at the installation of a new " +"database.\n" +"=============================================================================" +"===\n" +"\n" +"Shows you a list of applications features to install from.\n" +"\n" +" " +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_config +msgid "res.config" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_pl +msgid "Poland - Accounting" +msgstr "" + +#. module: base +#: view:ir.cron:0 +msgid "Action to Trigger" +msgstr "" + +#. module: base +#: field:ir.model.constraint,name:0 +#: selection:ir.translation,type:0 +msgid "Constraint" +msgstr "" + +#. module: base +#: selection:ir.values,key:0 +#: selection:res.partner,type:0 +msgid "Default" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_lunch +msgid "Lunch Order, Meal, Food" +msgstr "" + +#. module: base +#: view:ir.model.fields:0 +#: field:ir.model.fields,required:0 +#: field:res.partner.bank.type.field,required:0 +msgid "Required" +msgstr "" + +#. module: base +#: model:res.country,name:base.ro +msgid "Romania" +msgstr "" + +#. module: base +#: field:ir.module.module,summary:0 +#: field:res.request.history,name:0 +msgid "Summary" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_hidden_dependency +msgid "Dependency" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal +msgid "" +"\n" +"Customize access to your OpenERP database to external users by creating " +"portals.\n" +"=============================================================================" +"===\n" +"A portal defines a specific user menu and access rights for its members. " +"This\n" +"menu can ben seen by portal members, anonymous users and any other user " +"that\n" +"have the access to technical features (e.g. the administrator).\n" +"Also, each portal member is linked to a specific partner.\n" +"\n" +"The module also associates user groups to the portal users (adding a group " +"in\n" +"the portal automatically adds it to the portal users, etc). That feature " +"is\n" +"very handy when used in combination with the module 'share'.\n" +" " +msgstr "" + +#. module: base +#: field:multi_company.default,expression:0 +msgid "Expression" +msgstr "" + +#. module: base +#: view:res.company:0 +msgid "Header/Footer" +msgstr "" + +#. module: base +#: help:ir.mail_server,sequence:0 +msgid "" +"When no specific mail server is requested for a mail, the highest priority " +"one is used. Default priority is 10 (smaller number = higher priority)" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_sale +msgid "Quotations, Sales Orders, Invoicing" +msgstr "" + +#. module: base +#: field:res.partner,parent_id:0 +msgid "Related Company" +msgstr "" + +#. module: base +#: help:ir.actions.act_url,help:0 +#: help:ir.actions.act_window,help:0 +#: help:ir.actions.act_window_close,help:0 +#: help:ir.actions.actions,help:0 +#: help:ir.actions.client,help:0 +#: help:ir.actions.report.xml,help:0 +#: help:ir.actions.server,help:0 +#: help:ir.actions.wizard,help:0 +msgid "" +"Optional help text for the users with a description of the target view, such " +"as its usage and purpose." +msgstr "" + +#. module: base +#: model:res.country,name:base.va +msgid "Holy See (Vatican City State)" +msgstr "" + +#. module: base +#: field:base.module.import,module_file:0 +msgid "Module .ZIP file" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_17 +msgid "Telecom sector" +msgstr "" + +#. module: base +#: field:workflow.transition,trigger_model:0 +msgid "Trigger Object" +msgstr "" + +#. module: base +#: sql_constraint:ir.sequence.type:0 +msgid "`code` must be unique." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_knowledge +msgid "Knowledge Management System" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +#: field:workflow.activity,in_transitions:0 +msgid "Incoming Transitions" +msgstr "" + +#. module: base +#: field:ir.values,value_unpickle:0 +msgid "Default value or action reference" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_note_pad +msgid "" +"\n" +"This module update memos inside OpenERP for using an external pad\n" +"=================================================================\n" +"\n" +"Use for update your text memo in real time with the following user that you " +"invite.\n" +"\n" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_sequence +msgid "" +"\n" +"This module maintains internal sequence number for accounting entries.\n" +"======================================================================\n" +"\n" +"Allows you to configure the accounting sequences to be maintained.\n" +"\n" +"You can customize the following attributes of the sequence:\n" +"-----------------------------------------------------------\n" +" * Prefix\n" +" * Suffix\n" +" * Next Number\n" +" * Increment Number\n" +" * Number Padding\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project_timesheet +msgid "Bill Time on Tasks" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_marketing +#: model:ir.module.module,shortdesc:base.module_marketing +#: model:ir.ui.menu,name:base.marketing_menu +#: model:ir.ui.menu,name:base.menu_report_marketing +msgid "Marketing" +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +msgid "Bank account" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_calendar +msgid "" +"\n" +"OpenERP Web Calendar view.\n" +"==========================\n" +"\n" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (HN) / Español (HN)" +msgstr "" + +#. module: base +#: view:ir.sequence.type:0 +msgid "Sequence Type" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "Unicode/UTF-8" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Hindi / हिंदी" +msgstr "" + +#. module: base +#: view:base.language.install:0 +#: model:ir.actions.act_window,name:base.action_view_base_language_install +#: model:ir.ui.menu,name:base.menu_view_base_language_install +msgid "Load a Translation" +msgstr "" + +#. module: base +#: field:ir.module.module,latest_version:0 +msgid "Installed Version" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_test +msgid "" +"\n" +"Asserts on accounting.\n" +"======================\n" +"With this module you can manually check consistencies and inconsistencies of " +"accounting module from menu Reporting/Accounting/Accounting Tests.\n" +"\n" +"You can write a query in order to create Consistency Test and you will get " +"the result of the test \n" +"in PDF format which can be accessed by Menu Reporting -> Accounting Tests, " +"then select the test \n" +"and print the report from Print button in header area.\n" +msgstr "" + +#. module: base +#: field:ir.module.module,license:0 +msgid "License" +msgstr "" + +#. module: base +#: field:ir.attachment,url:0 +msgid "Url" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "SQL Constraint" +msgstr "" + +#. module: base +#: help:ir.ui.menu,groups_id:0 +msgid "" +"If you have groups, the visibility of this menu will be based on these " +"groups. If this field is empty, OpenERP will compute visibility based on the " +"related object's read access." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_event_sale +msgid "" +"\n" +"Creating registration with sale orders.\n" +"=======================================\n" +"\n" +"This module allows you to automate and connect your registration creation " +"with\n" +"your main sale flow and therefore, to enable the invoicing feature of " +"registrations.\n" +"\n" +"It defines a new kind of service products that offers you the possibility " +"to\n" +"choose an event category associated with it. When you encode a sale order " +"for\n" +"that product, you will be able to choose an existing event of that category " +"and\n" +"when you confirm your sale order it will automatically create a registration " +"for\n" +"this event.\n" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_order_dates +msgid "" +"\n" +"Add additional date information to the sales order.\n" +"===================================================\n" +"\n" +"You can add the following additional dates to a sales order:\n" +"------------------------------------------------------------\n" +" * Requested Date\n" +" * Commitment Date\n" +" * Effective Date\n" +msgstr "" + +#. module: base +#: field:ir.actions.server,srcmodel_id:0 +#: view:ir.filters:0 +#: field:ir.filters,model_id:0 +#: view:ir.model:0 +#: field:ir.model,model:0 +#: field:ir.model.constraint,model:0 +#: field:ir.model.fields,model_id:0 +#: field:ir.model.relation,model:0 +#: view:ir.values:0 +msgid "Model" +msgstr "" + +#. module: base +#: view:base.language.install:0 +msgid "" +"The selected language has been successfully installed. You must change the " +"preferences of the user and open a new menu to view the changes." +msgstr "" + +#. module: base +#: field:ir.actions.act_window.view,view_id:0 +#: field:ir.default,page:0 +#: selection:ir.translation,type:0 +#: view:ir.ui.view:0 +msgid "View" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:146 +#, python-format +msgid "no" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_crm_partner_assign +msgid "" +"\n" +"This is the module used by OpenERP SA to redirect customers to its partners, " +"based on geolocalization.\n" +"=============================================================================" +"=========================\n" +"\n" +"You can geolocalize your opportunities by using this module.\n" +"\n" +"Use geolocalization when assigning opportunities to partners.\n" +"Determine the GPS coordinates according to the address of the partner.\n" +"\n" +"The most appropriate partner can be assigned.\n" +"You can also use the geolocalization without using the GPS coordinates.\n" +" " +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +msgid "Open a Window" +msgstr "" + +#. module: base +#: model:res.country,name:base.gq +msgid "Equatorial Guinea" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_api +msgid "OpenERP Web API" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_fr_rib +msgid "" +"\n" +"This module lets users enter the banking details of Partners in the RIB " +"format (French standard for bank accounts details).\n" +"=============================================================================" +"==============================================\n" +"\n" +"RIB Bank Accounts can be entered in the \"Accounting\" tab of the Partner " +"form by specifying the account type \"RIB\". \n" +"\n" +"The four standard RIB fields will then become mandatory:\n" +"-------------------------------------------------------- \n" +" - Bank Code\n" +" - Office Code\n" +" - Account number\n" +" - RIB key\n" +" \n" +"As a safety measure, OpenERP will check the RIB key whenever a RIB is saved, " +"and\n" +"will refuse to record the data if the key is incorrect. Please bear in mind " +"that\n" +"this can only happen when the user presses the 'save' button, for example on " +"the\n" +"Partner Form. Since each bank account may relate to a Bank, users may enter " +"the\n" +"RIB Bank Code in the Bank form - it will the pre-fill the Bank Code on the " +"RIB\n" +"when they select the Bank. To make this easier, this module will also let " +"users\n" +"find Banks using their RIB code.\n" +"\n" +"The module base_iban can be a useful addition to this module, because French " +"banks\n" +"are now progressively adopting the international IBAN format instead of the " +"RIB format.\n" +"The RIB and IBAN codes for a single account can be entered by recording two " +"Bank\n" +"Accounts in OpenERP: the first with the type 'RIB', the second with the type " +"'IBAN'. \n" +msgstr "" + +#. module: base +#: model:res.country,name:base.ps +msgid "Palestinian Territory, Occupied" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ch +msgid "Switzerland - Accounting" +msgstr "" + +#. module: base +#: field:res.bank,zip:0 +#: field:res.company,zip:0 +#: field:res.partner,zip:0 +#: field:res.partner.bank,zip:0 +msgid "Zip" +msgstr "Casilla" + +#. module: base +#: view:ir.module.module:0 +#: field:ir.module.module,author:0 +msgid "Author" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Set as Todo" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%c - Appropriate date and time representation." +msgstr "" + +#. module: base +#: code:addons/base/res/res_config.py:420 +#, python-format +msgid "" +"Your database is now fully configured.\n" +"\n" +"Click 'Continue' and enjoy your OpenERP experience..." +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_marketing +msgid "Helps you manage your marketing campaigns step by step." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Hebrew / עִבְרִי" +msgstr "" + +#. module: base +#: model:res.country,name:base.bo +msgid "Bolivia" +msgstr "" + +#. module: base +#: model:res.country,name:base.gh +msgid "Ghana" +msgstr "" + +#. module: base +#: field:res.lang,direction:0 +msgid "Direction" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: model:ir.actions.act_window,name:base.action_ui_view +#: field:ir.actions.act_window,view_ids:0 +#: field:ir.actions.act_window,views:0 +#: view:ir.model:0 +#: field:ir.model,view_ids:0 +#: field:ir.module.module,views_by_module:0 +#: model:ir.ui.menu,name:base.menu_action_ui_view +#: view:ir.ui.view:0 +#: view:res.groups:0 +#: field:res.groups,view_access:0 +msgid "Views" +msgstr "" + +#. module: base +#: view:res.groups:0 +#: field:res.groups,rule_groups:0 +msgid "Rules" +msgstr "" + +#. module: base +#: field:ir.mail_server,smtp_host:0 +msgid "SMTP Server" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:320 +#, python-format +msgid "You try to remove a module that is installed or will be installed" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +msgid "The selected modules have been updated / installed !" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (PR) / Español (PR)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_crm_profiling +msgid "" +"\n" +"This module allows users to perform segmentation within partners.\n" +"=================================================================\n" +"\n" +"It uses the profiles criteria from the earlier segmentation module and " +"improve it. \n" +"Thanks to the new concept of questionnaire. You can now regroup questions " +"into a \n" +"questionnaire and directly use it on a partner.\n" +"\n" +"It also has been merged with the earlier CRM & SRM segmentation tool because " +"they \n" +"were overlapping.\n" +"\n" +" **Note:** this module is not compatible with the module segmentation, " +"since it's the same which has been renamed.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.gt +msgid "Guatemala" +msgstr "" + +#. module: base +#: help:ir.actions.server,message:0 +msgid "" +"Email contents, may contain expressions enclosed in double brackets based on " +"the same values as those available in the condition field, e.g. `Dear [[ " +"object.partner_id.name ]]`" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_workflow_form +#: model:ir.ui.menu,name:base.menu_workflow +#: model:ir.ui.menu,name:base.menu_workflow_root +msgid "Workflows" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.next_id_73 +msgid "Purchase" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Portuguese (BR) / Português (BR)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_needaction_mixin +msgid "ir.needaction_mixin" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "This file was generated using the universal" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_7 +msgid "IT Services" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_specific_industry_applications +msgid "Specific Industry Applications" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_google_docs +msgid "Google Docs integration" +msgstr "" + +#. module: base +#: help:ir.attachment,res_model:0 +msgid "The database object this attachment will be attached to" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:327 +#, python-format +msgid "name" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_mrp_operations +msgid "" +"\n" +"This module adds state, date_start, date_stop in manufacturing order " +"operation lines (in the 'Work Orders' tab).\n" +"=============================================================================" +"===================================\n" +"\n" +"Status: draft, confirm, done, cancel\n" +"When finishing/confirming, cancelling manufacturing orders set all state " +"lines\n" +"to the according state.\n" +"\n" +"Create menus:\n" +"-------------\n" +" **Manufacturing** > **Manufacturing** > **Work Orders**\n" +"\n" +"Which is a view on 'Work Orders' lines in manufacturing order.\n" +"\n" +"Add buttons in the form view of manufacturing order under workorders tab:\n" +"-------------------------------------------------------------------------\n" +" * start (set state to confirm), set date_start\n" +" * done (set state to done), set date_stop\n" +" * set to draft (set state to draft)\n" +" * cancel set state to cancel\n" +"\n" +"When the manufacturing order becomes 'ready to produce', operations must\n" +"become 'confirmed'. When the manufacturing order is done, all operations\n" +"must become done.\n" +"\n" +"The field 'Working Hours' is the delay(stop date - start date).\n" +"So, that we can compare the theoretic delay and real delay. \n" +" " +msgstr "" + +#. module: base +#: view:res.config.installer:0 +msgid "Skip" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_event_sale +msgid "Events Sales" +msgstr "" + +#. module: base +#: model:res.country,name:base.ls +msgid "Lesotho" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid ", or your preferred text editor" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_crm_partner_assign +msgid "Partners Geo-Localization" +msgstr "" + +#. module: base +#: model:res.country,name:base.ke +msgid "Kenya" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_translation +#: model:ir.ui.menu,name:base.menu_action_translation +msgid "Translated Terms" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Abkhazian / аҧсуа" +msgstr "" + +#. module: base +#: view:base.module.configuration:0 +msgid "System Configuration Done" +msgstr "" + +#. module: base +#: code:addons/orm.py:1540 +#, python-format +msgid "Error occurred while validating the field(s) %s: %s" +msgstr "" + +#. module: base +#: view:ir.property:0 +msgid "Generic" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_document_ftp +msgid "Shared Repositories (FTP)" +msgstr "" + +#. module: base +#: model:res.country,name:base.sm +msgid "San Marino" +msgstr "" + +#. module: base +#: model:res.country,name:base.bm +msgid "Bermuda" +msgstr "" + +#. module: base +#: model:res.country,name:base.pe +msgid "Peru" +msgstr "" + +#. module: base +#: selection:ir.model.fields,on_delete:0 +msgid "Set NULL" +msgstr "" + +#. module: base +#: view:res.users:0 +msgid "Save" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_xml:0 +msgid "XML Path" +msgstr "" + +#. module: base +#: model:res.country,name:base.bj +msgid "Benin" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_res_partner_bank_type_form +#: model:ir.ui.menu,name:base.menu_action_res_partner_bank_typeform +msgid "Bank Account Types" +msgstr "" + +#. module: base +#: help:ir.sequence,suffix:0 +msgid "Suffix value of the record for the sequence" +msgstr "" + +#. module: base +#: help:ir.mail_server,smtp_user:0 +msgid "Optional username for SMTP authentication" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_actions +msgid "ir.actions.actions" +msgstr "" + +#. module: base +#: selection:ir.model.fields,select_level:0 +msgid "Not Searchable" +msgstr "" + +#. module: base +#: view:ir.config_parameter:0 +#: field:ir.config_parameter,key:0 +msgid "Key" +msgstr "" + +#. module: base +#: field:res.company,rml_header:0 +msgid "RML Header" +msgstr "" + +#. module: base +#: help:res.country,address_format:0 +msgid "" +"You can state here the usual format to use for the addresses belonging to " +"this country.\n" +"\n" +"You can use the python-style string patern with all the field of the address " +"(for example, use '%(street)s' to display the field 'street') plus\n" +" \n" +"%(state_name)s: the name of the state\n" +" \n" +"%(state_code)s: the code of the state\n" +" \n" +"%(country_name)s: the name of the country\n" +" \n" +"%(country_code)s: the code of the country" +msgstr "" + +#. module: base +#: model:res.country,name:base.mu +msgid "Mauritius" +msgstr "" + +#. module: base +#: view:ir.model.access:0 +msgid "Full Access" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_pt +msgid "Plano de contas SNC para Portugal" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: view:ir.actions.report.xml:0 +#: model:ir.ui.menu,name:base.menu_security +msgid "Security" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Portuguese / Português" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:372 +#, python-format +msgid "Changing the storing system for field \"%s\" is not allowed." +msgstr "" + +#. module: base +#: help:res.partner.bank,company_id:0 +msgid "Only if this bank account belong to your company" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:337 +#, python-format +msgid "Unknown sub-field '%s'" +msgstr "" + +#. module: base +#: model:res.country,name:base.za +msgid "South Africa" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +#: selection:ir.module.module,state:0 +#: selection:ir.module.module.dependency,state:0 +msgid "Installed" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Ukrainian / українська" +msgstr "" + +#. module: base +#: model:res.country,name:base.sn +msgid "Senegal" +msgstr "" + +#. module: base +#: model:res.country,name:base.hu +msgid "Hungary" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_analytics +msgid "" +"\n" +"Google Analytics.\n" +"=================\n" +"\n" +"Collects web application usage with Google Analytics.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_recruitment +msgid "Recruitment Process" +msgstr "" + +#. module: base +#: model:res.country,name:base.br +msgid "Brazil" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%M - Minute [00,59]." +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "Affero GPL-3" +msgstr "" + +#. module: base +#: field:ir.sequence,number_next:0 +#: field:ir.sequence,number_next_actual:0 +msgid "Next Number" +msgstr "" + +#. module: base +#: help:workflow.transition,condition:0 +msgid "Expression to be satisfied if we want the transition done." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (PA) / Español (PA)" +msgstr "" + +#. module: base +#: view:res.currency:0 +#: field:res.currency,rate_ids:0 +msgid "Rates" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_email_template +msgid "Email Templates" +msgstr "" + +#. module: base +#: model:res.country,name:base.sy +msgid "Syria" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "======================================================" +msgstr "" + +#. module: base +#: sql_constraint:ir.model:0 +msgid "Each model must be unique!" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_localization +#: model:ir.ui.menu,name:base.menu_localisation +msgid "Localization" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_api +msgid "" +"\n" +"Openerp Web API.\n" +"================\n" +"\n" +msgstr "" + +#. module: base +#: selection:res.request,state:0 +msgid "draft" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +#: field:res.currency,date:0 +#: field:res.currency.rate,name:0 +#: field:res.partner,date:0 +#: field:res.request,date_sent:0 +msgid "Date" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_event_moodle +msgid "Event Moodle" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_email_template +msgid "" +"\n" +"Email Templating (simplified version of the original Power Email by " +"Openlabs).\n" +"=============================================================================" +"=\n" +"\n" +"Lets you design complete email templates related to any OpenERP document " +"(Sale\n" +"Orders, Invoices and so on), including sender, recipient, subject, body " +"(HTML and\n" +"Text). You may also automatically attach files to your templates, or print " +"and\n" +"attach a report.\n" +"\n" +"For advanced use, the templates may include dynamic attributes of the " +"document\n" +"they are related to. For example, you may use the name of a Partner's " +"country\n" +"when writing to them, also providing a safe default in case the attribute " +"is\n" +"not defined. Each template contains a built-in assistant to help with the\n" +"inclusion of these dynamic values.\n" +"\n" +"If you enable the option, a composition assistant will also appear in the " +"sidebar\n" +"of the OpenERP documents to which the template applies (e.g. Invoices).\n" +"This serves as a quick way to send a new email based on the template, after\n" +"reviewing and adapting the contents, if needed.\n" +"This composition assistant will also turn into a mass mailing system when " +"called\n" +"for multiple documents at once.\n" +"\n" +"These email templates are also at the heart of the marketing campaign " +"system\n" +"(see the ``marketing_campaign`` application), if you need to automate " +"larger\n" +"campaigns on any OpenERP document.\n" +"\n" +" **Technical note:** only the templating system of the original Power " +"Email by Openlabs was kept.\n" +" " +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_partner_category_form +msgid "Partner Tags" +msgstr "" + +#. module: base +#: view:res.company:0 +msgid "Preview Header/Footer" +msgstr "" + +#. module: base +#: field:ir.ui.menu,parent_id:0 +#: field:wizard.ir.model.menu.create,menu_id:0 +msgid "Parent Menu" +msgstr "" + +#. module: base +#: field:res.partner.bank,owner_name:0 +msgid "Account Owner Name" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:420 +#, python-format +msgid "Cannot rename column to %s, because that column already exists!" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Attached To" +msgstr "" + +#. module: base +#: field:res.lang,decimal_point:0 +msgid "Decimal Separator" +msgstr "" + +#. module: base +#: code:addons/orm.py:5319 +#, python-format +msgid "Missing required value for the field '%s'." +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Write Access Right" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_res_groups +msgid "" +"A group is a set of functional areas that will be assigned to the user in " +"order to give them access and rights to specific applications and tasks in " +"the system. You can create custom groups or edit the ones existing by " +"default in order to customize the view of the menu that users will be able " +"to see. Whether they can have a read, write, create and delete access right " +"can be managed from here." +msgstr "" + +#. module: base +#: view:ir.filters:0 +#: field:ir.filters,name:0 +msgid "Filter Name" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: view:res.partner:0 +#: field:res.request,history:0 +msgid "History" +msgstr "" + +#. module: base +#: model:res.country,name:base.im +msgid "Isle of Man" +msgstr "" + +#. module: base +#: help:ir.actions.client,res_model:0 +msgid "Optional model, mostly used for needactions." +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:306 +#, python-format +msgid "The name of the module must be unique !" +msgstr "" + +#. module: base +#: model:res.country,name:base.bv +msgid "Bouvet Island" +msgstr "" + +#. module: base +#: field:ir.model.constraint,type:0 +msgid "Constraint Type" +msgstr "" + +#. module: base +#: field:res.company,child_ids:0 +msgid "Child Companies" +msgstr "" + +#. module: base +#: model:res.country,name:base.ni +msgid "Nicaragua" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_stock_invoice_directly +msgid "" +"\n" +"Invoice Wizard for Delivery.\n" +"============================\n" +"\n" +"When you send or deliver goods, this module automatically launch the " +"invoicing\n" +"wizard if the delivery is to be invoiced.\n" +" " +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "Wizard Button" +msgstr "" + +#. module: base +#: view:ir.model.fields:0 +#: field:ir.property,fields_id:0 +#: selection:ir.translation,type:0 +#: field:multi_company.default,field_id:0 +msgid "Field" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project_long_term +msgid "Long Term Projects" +msgstr "" + +#. module: base +#: model:res.country,name:base.ve +msgid "Venezuela" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "9. %j ==> 340" +msgstr "" + +#. module: base +#: model:res.country,name:base.zm +msgid "Zambia" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Launch Configuration Wizard" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_mrp +msgid "Manufacturing Orders, Bill of Materials, Routing" +msgstr "" + +#. module: base +#: field:ir.attachment,name:0 +msgid "Attachment Name" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Cancel Upgrade" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_report_webkit +msgid "" +"\n" +"This module adds a new Report Engine based on WebKit library (wkhtmltopdf) " +"to support reports designed in HTML + CSS.\n" +"=============================================================================" +"========================================\n" +"\n" +"The module structure and some code is inspired by the report_openoffice " +"module.\n" +"\n" +"The module allows:\n" +"------------------\n" +" - HTML report definition\n" +" - Multi header support\n" +" - Multi logo\n" +" - Multi company support\n" +" - HTML and CSS-3 support (In the limit of the actual WebKIT version)\n" +" - JavaScript support\n" +" - Raw HTML debugger\n" +" - Book printing capabilities\n" +" - Margins definition\n" +" - Paper size definition\n" +"\n" +"Multiple headers and logos can be defined per company. CSS style, header " +"and\n" +"footer body are defined per company.\n" +"\n" +"For a sample report see also the webkit_report_sample module, and this " +"video:\n" +" http://files.me.com/nbessi/06n92k.mov\n" +"\n" +"Requirements and Installation:\n" +"------------------------------\n" +"This module requires the ``wkthtmltopdf`` library to render HTML documents " +"as\n" +"PDF. Version 0.9.9 or later is necessary, and can be found at\n" +"http://code.google.com/p/wkhtmltopdf/ for Linux, Mac OS X (i386) and Windows " +"(32bits).\n" +"\n" +"After installing the library on the OpenERP Server machine, you need to set " +"the\n" +"path to the ``wkthtmltopdf`` executable file on each Company.\n" +"\n" +"If you are experiencing missing header/footer problems on Linux, be sure to\n" +"install a 'static' version of the library. The default ``wkhtmltopdf`` on\n" +"Ubuntu is known to have this issue.\n" +"\n" +"\n" +"TODO:\n" +"-----\n" +" * JavaScript support activation deactivation\n" +" * Collated and book format support\n" +" * Zip return for separated PDF\n" +" * Web client WYSIWYG\n" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_sale_salesman_all_leads +msgid "See all Leads" +msgstr "" + +#. module: base +#: model:res.country,name:base.ci +msgid "Ivory Coast (Cote D'Ivoire)" +msgstr "" + +#. module: base +#: model:res.country,name:base.kz +msgid "Kazakhstan" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%w - Weekday number [0(Sunday),6]." +msgstr "" + +#. module: base +#: field:ir.attachment,res_name:0 +#: field:ir.ui.view_sc,resource:0 +msgid "Resource Name" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_ir_filters +msgid "User-defined Filters" +msgstr "" + +#. module: base +#: field:ir.actions.act_window_close,name:0 +#: field:ir.actions.actions,name:0 +#: field:ir.actions.report.xml,name:0 +#: field:ir.actions.todo,name:0 +#: field:ir.cron,name:0 +#: field:ir.model.access,name:0 +#: field:ir.model.fields,name:0 +#: field:ir.module.category,name:0 +#: field:ir.module.module.dependency,name:0 +#: report:ir.module.reference:0 +#: view:ir.property:0 +#: field:ir.property,name:0 +#: field:ir.rule,name:0 +#: field:ir.sequence,name:0 +#: field:ir.sequence.type,name:0 +#: field:ir.values,name:0 +#: view:multi_company.default:0 +#: field:multi_company.default,name:0 +#: field:res.bank,name:0 +#: view:res.currency.rate.type:0 +#: field:res.currency.rate.type,name:0 +#: field:res.groups,name:0 +#: field:res.lang,name:0 +#: view:res.partner:0 +#: field:res.partner,name:0 +#: view:res.partner.bank:0 +#: field:res.partner.bank.type,name:0 +#: field:res.request.link,name:0 +#: view:res.users:0 +#: field:workflow,name:0 +#: field:workflow.activity,name:0 +msgid "Name" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,multi:0 +msgid "" +"If set to true, the action will not be displayed on the right toolbar of a " +"form view" +msgstr "" + +#. module: base +#: model:res.country,name:base.ms +msgid "Montserrat" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_decimal_precision +msgid "Decimal Precision Configuration" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_act_url +#: selection:ir.ui.menu,action:0 +msgid "ir.actions.act_url" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_translation_app +msgid "Application Terms" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.open_module_tree +msgid "" +"

No module found!

\n" +"

You should try others search criteria.

\n" +" " +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_module_module +#: field:ir.model.constraint,module:0 +#: view:ir.model.data:0 +#: field:ir.model.data,module:0 +#: field:ir.model.relation,module:0 +#: view:ir.module.module:0 +#: field:ir.module.module.dependency,module_id:0 +#: report:ir.module.reference:0 +#: field:ir.translation,module:0 +msgid "Module" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "English (UK)" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Japanese / 日本語" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_language_import +msgid "Language Import" +msgstr "" + +#. module: base +#: help:workflow.transition,act_from:0 +msgid "" +"Source activity. When this activity is over, the condition is tested to " +"determine if we can start the ACT_TO activity." +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_generic_modules_accounting +#: view:res.company:0 +msgid "Accounting" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_vat +msgid "" +"\n" +"VAT validation for Partner's VAT numbers.\n" +"=========================================\n" +"\n" +"After installing this module, values entered in the VAT field of Partners " +"will\n" +"be validated for all supported countries. The country is inferred from the\n" +"2-letter country code that prefixes the VAT number, e.g. ``BE0477472701``\n" +"will be validated using the Belgian rules.\n" +"\n" +"There are two different levels of VAT number validation:\n" +"--------------------------------------------------------\n" +" * By default, a simple off-line check is performed using the known " +"validation\n" +" rules for the country, usually a simple check digit. This is quick and " +"\n" +" always available, but allows numbers that are perhaps not truly " +"allocated,\n" +" or not valid anymore.\n" +" \n" +" * When the \"VAT VIES Check\" option is enabled (in the configuration of " +"the user's\n" +" Company), VAT numbers will be instead submitted to the online EU VIES\n" +" database, which will truly verify that the number is valid and " +"currently\n" +" allocated to a EU company. This is a little bit slower than the " +"simple\n" +" off-line check, requires an Internet connection, and may not be " +"available\n" +" all the time. If the service is not available or does not support the\n" +" requested country (e.g. for non-EU countries), a simple check will be " +"performed\n" +" instead.\n" +"\n" +"Supported countries currently include EU countries, and a few non-EU " +"countries\n" +"such as Chile, Colombia, Mexico, Norway or Russia. For unsupported " +"countries,\n" +"only the country code will be validated.\n" +" " +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_act_window_view +msgid "ir.actions.act_window.view" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web +#: report:ir.module.reference:0 +msgid "Web" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_lunch +msgid "Lunch Orders" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "English (CA)" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_human_resources +msgid "Human Resources" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_syscohada +msgid "" +"\n" +"This module implements the accounting chart for OHADA area.\n" +"===========================================================\n" +" \n" +"It allows any company or association to manage its financial accounting.\n" +"\n" +"Countries that use OHADA are the following:\n" +"-------------------------------------------\n" +" Benin, Burkina Faso, Cameroon, Central African Republic, Comoros, " +"Congo,\n" +" \n" +" Ivory Coast, Gabon, Guinea, Guinea Bissau, Equatorial Guinea, Mali, " +"Niger,\n" +" \n" +" Replica of Democratic Congo, Senegal, Chad, Togo.\n" +" " +msgstr "" + +#. module: base +#: view:ir.translation:0 +msgid "Comments" +msgstr "" + +#. module: base +#: model:res.country,name:base.et +msgid "Ethiopia" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_authentication +msgid "Authentication" +msgstr "" + +#. module: base +#: model:res.country,name:base.sj +msgid "Svalbard and Jan Mayen Islands" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_wizard +#: selection:ir.ui.menu,action:0 +msgid "ir.actions.wizard" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_kanban +msgid "Base Kanban" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: view:ir.actions.report.xml:0 +#: view:ir.actions.server:0 +msgid "Group By" +msgstr "" + +#. module: base +#: view:res.config.installer:0 +msgid "title" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:146 +#, python-format +msgid "true" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_language_install +msgid "Install Language" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_11 +msgid "Services" +msgstr "" + +#. module: base +#: view:ir.translation:0 +msgid "Translation" +msgstr "" + +#. module: base +#: selection:res.request,state:0 +msgid "closed" +msgstr "" + +#. module: base +#: selection:base.language.export,state:0 +msgid "get" +msgstr "" + +#. module: base +#: help:ir.model.fields,on_delete:0 +msgid "On delete property for many2one fields" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_accounting_and_finance +msgid "Accounting & Finance" +msgstr "" + +#. module: base +#: field:ir.actions.server,write_id:0 +msgid "Write Id" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_product +msgid "Products" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.act_values_form_defaults +#: model:ir.ui.menu,name:base.menu_values_form_defaults +#: view:ir.values:0 +msgid "User-defined Defaults" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_auth_signup +msgid "" +"\n" +"Allow users to sign up and reset their password\n" +"===============================================\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_usability +#: view:res.users:0 +msgid "Usability" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,domain:0 +msgid "Domain Value" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_association +msgid "" +"\n" +"This module is to configure modules related to an association.\n" +"==============================================================\n" +"\n" +"It installs the profile for associations to manage events, registrations, " +"memberships, \n" +"membership products (schemes).\n" +" " +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_base_config +#: model:ir.ui.menu,name:base.menu_config +#: model:ir.ui.menu,name:base.menu_definitions +#: model:ir.ui.menu,name:base.menu_event_config +#: model:ir.ui.menu,name:base.menu_lunch_survey_root +#: model:ir.ui.menu,name:base.menu_marketing_config_association +#: model:ir.ui.menu,name:base.menu_marketing_config_root +#: model:ir.ui.menu,name:base.menu_reporting_config +#: view:res.company:0 +#: view:res.config:0 +msgid "Configuration" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_edi +msgid "" +"\n" +"Provides a common EDI platform that other Applications can use.\n" +"===============================================================\n" +"\n" +"OpenERP specifies a generic EDI format for exchanging business documents " +"between \n" +"different systems, and provides generic mechanisms to import and export " +"them.\n" +"\n" +"More details about OpenERP's EDI format may be found in the technical " +"OpenERP \n" +"documentation at http://doc.openerp.com.\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/workflow/workflow.py:99 +#, python-format +msgid "Operation forbidden" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "SMS Configuration" +msgstr "" + +#. module: base +#: help:ir.rule,active:0 +msgid "" +"If you uncheck the active field, it will disable the record rule without " +"deleting it (if you delete a native record rule, it may be re-created when " +"you reload the module." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (BO) / Español (BO)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_board +msgid "" +"\n" +"Lets the user create a custom dashboard.\n" +"========================================\n" +"\n" +"Allows users to create custom dashboard.\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_access_act +#: model:ir.ui.menu,name:base.menu_ir_access_act +msgid "Access Controls List" +msgstr "" + +#. module: base +#: model:res.country,name:base.um +msgid "USA Minor Outlying Islands" +msgstr "" + +#. module: base +#: help:ir.cron,numbercall:0 +msgid "" +"How many times the method is called,\n" +"a negative number indicates no limit." +msgstr "" + +#. module: base +#: field:res.partner.bank.type.field,bank_type_id:0 +msgid "Bank Type" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:99 +#, python-format +msgid "The name of the group can not start with \"-\"" +msgstr "" + +#. module: base +#: model:ir.actions.client,name:base.modules_act_cl +#: view:ir.module.module:0 +#: model:ir.ui.menu,name:base.module_mi +msgid "Apps" +msgstr "" + +#. module: base +#: view:ir.ui.view_sc:0 +msgid "Shortcut" +msgstr "" + +#. module: base +#: field:ir.model.data,date_init:0 +msgid "Init Date" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Gujarati / ગુજરાતી" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:361 +#, python-format +msgid "" +"Unable to process module \"%s\" because an external dependency is not met: %s" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll +msgid "Belgium - Payroll" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +#: field:workflow.activity,flow_start:0 +msgid "Flow Start" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_partner_title +msgid "res.partner.title" +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +msgid "Bank Account Owner" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_uncategorized +msgid "Uncategorized" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Phone:" +msgstr "" + +#. module: base +#: field:res.partner,is_company:0 +msgid "Is a Company" +msgstr "" + +#. module: base +#: selection:ir.cron,interval_type:0 +msgid "Hours" +msgstr "" + +#. module: base +#: model:res.country,name:base.gp +msgid "Guadeloupe (French)" +msgstr "" + +#. module: base +#: code:addons/base/res/res_lang.py:185 +#: code:addons/base/res/res_lang.py:187 +#: code:addons/base/res/res_lang.py:189 +#, python-format +msgid "User Error" +msgstr "" + +#. module: base +#: help:workflow.transition,signal:0 +msgid "" +"When the operation of transition comes from a button pressed in the client " +"form, signal tests the name of the pressed button. If signal is NULL, no " +"button is necessary to validate this transition." +msgstr "" + +#. module: base +#: field:ir.ui.view.custom,ref_id:0 +msgid "Original View" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_kanban +msgid "" +"\n" +"OpenERP Web kanban view.\n" +"========================\n" +"\n" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:182 +#, python-format +msgid "'%s' does not seem to be a number for field '%%(field)s'" +msgstr "" + +#. module: base +#: help:res.country.state,name:0 +msgid "" +"Administrative divisions of a country. E.g. Fed. State, Departement, Canton" +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +msgid "My Banks" +msgstr "" + +#. module: base +#: sql_constraint:ir.filters:0 +msgid "Filter names must be unique" +msgstr "" + +#. module: base +#: help:multi_company.default,object_id:0 +msgid "Object affected by this rule" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window,target:0 +msgid "Inline View" +msgstr "" + +#. module: base +#: field:ir.filters,is_default:0 +msgid "Default filter" +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Directory" +msgstr "" + +#. module: base +#: field:wizard.ir.model.menu.create,name:0 +msgid "Menu Name" +msgstr "" + +#. module: base +#: field:ir.values,key2:0 +msgid "Qualifier" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_be_coda +msgid "" +"\n" +"Module to import CODA bank statements.\n" +"======================================\n" +"\n" +"Supported are CODA flat files in V2 format from Belgian bank accounts.\n" +"----------------------------------------------------------------------\n" +" * CODA v1 support.\n" +" * CODA v2.2 support.\n" +" * Foreign Currency support.\n" +" * Support for all data record types (0, 1, 2, 3, 4, 8, 9).\n" +" * Parsing & logging of all Transaction Codes and Structured Format \n" +" Communications.\n" +" * Automatic Financial Journal assignment via CODA configuration " +"parameters.\n" +" * Support for multiple Journals per Bank Account Number.\n" +" * Support for multiple statements from different bank accounts in a " +"single \n" +" CODA file.\n" +" * Support for 'parsing only' CODA Bank Accounts (defined as type='info' " +"in \n" +" the CODA Bank Account configuration records).\n" +" * Multi-language CODA parsing, parsing configuration data provided for " +"EN, \n" +" NL, FR.\n" +"\n" +"The machine readable CODA Files are parsed and stored in human readable " +"format in \n" +"CODA Bank Statements. Also Bank Statements are generated containing a subset " +"of \n" +"the CODA information (only those transaction lines that are required for the " +"\n" +"creation of the Financial Accounting records). The CODA Bank Statement is a " +"\n" +"'read-only' object, hence remaining a reliable representation of the " +"original\n" +"CODA file whereas the Bank Statement will get modified as required by " +"accounting \n" +"business processes.\n" +"\n" +"CODA Bank Accounts configured as type 'Info' will only generate CODA Bank " +"Statements.\n" +"\n" +"A removal of one object in the CODA processing results in the removal of the " +"\n" +"associated objects. The removal of a CODA File containing multiple Bank \n" +"Statements will also remove those associated statements.\n" +"\n" +"The following reconciliation logic has been implemented in the CODA " +"processing:\n" +"-----------------------------------------------------------------------------" +"--\n" +" 1) The Company's Bank Account Number of the CODA statement is compared " +"against \n" +" the Bank Account Number field of the Company's CODA Bank Account \n" +" configuration records (whereby bank accounts defined in type='info' \n" +" configuration records are ignored). If this is the case an 'internal " +"transfer'\n" +" transaction is generated using the 'Internal Transfer Account' field " +"of the \n" +" CODA File Import wizard.\n" +" 2) As a second step the 'Structured Communication' field of the CODA " +"transaction\n" +" line is matched against the reference field of in- and outgoing " +"invoices \n" +" (supported : Belgian Structured Communication Type).\n" +" 3) When the previous step doesn't find a match, the transaction " +"counterparty is \n" +" located via the Bank Account Number configured on the OpenERP " +"Customer and \n" +" Supplier records.\n" +" 4) In case the previous steps are not successful, the transaction is " +"generated \n" +" by using the 'Default Account for Unrecognized Movement' field of the " +"CODA \n" +" File Import wizard in order to allow further manual processing.\n" +"\n" +"In stead of a manual adjustment of the generated Bank Statements, you can " +"also \n" +"re-import the CODA after updating the OpenERP database with the information " +"that \n" +"was missing to allow automatic reconciliation.\n" +"\n" +"Remark on CODA V1 support:\n" +"~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +"In some cases a transaction code, transaction category or structured \n" +"communication code has been given a new or clearer description in CODA " +"V2.The\n" +"description provided by the CODA configuration tables is based upon the CODA " +"\n" +"V2.2 specifications.\n" +"If required, you can manually adjust the descriptions via the CODA " +"configuration menu.\n" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Month" +msgstr "" + +#. module: base +#: model:res.country,name:base.my +msgid "Malaysia" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_sequence.py:134 +#: code:addons/base/ir/ir_sequence.py:160 +#, python-format +msgid "Increment number must not be zero." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_cancel +msgid "Cancel Journal Entries" +msgstr "" + +#. module: base +#: field:res.partner,tz_offset:0 +msgid "Timezone offset" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_marketing_campaign +msgid "" +"\n" +"This module provides leads automation through marketing campaigns (campaigns " +"can in fact be defined on any resource, not just CRM Leads).\n" +"=============================================================================" +"============================================================\n" +"\n" +"The campaigns are dynamic and multi-channels. The process is as follows:\n" +"------------------------------------------------------------------------\n" +" * Design marketing campaigns like workflows, including email templates " +"to\n" +" send, reports to print and send by email, custom actions\n" +" * Define input segments that will select the items that should enter " +"the\n" +" campaign (e.g leads from certain countries.)\n" +" * Run you campaign in simulation mode to test it real-time or " +"accelerated,\n" +" and fine-tune it\n" +" * You may also start the real campaign in manual mode, where each " +"action\n" +" requires manual validation\n" +" * Finally launch your campaign live, and watch the statistics as the\n" +" campaign does everything fully automatically.\n" +"\n" +"While the campaign runs you can of course continue to fine-tune the " +"parameters,\n" +"input segments, workflow.\n" +"\n" +"**Note:** If you need demo data, you can install the " +"marketing_campaign_crm_demo\n" +" module, but this will also install the CRM application as it depends " +"on\n" +" CRM Leads.\n" +" " +msgstr "" + +#. module: base +#: help:ir.mail_server,smtp_debug:0 +msgid "" +"If enabled, the full output of SMTP sessions will be written to the server " +"log at DEBUG level(this is very verbose and may include confidential info!)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_margin +msgid "" +"\n" +"This module adds the 'Margin' on sales order.\n" +"=============================================\n" +"\n" +"This gives the profitability by calculating the difference between the Unit\n" +"Price and Cost Price.\n" +" " +msgstr "" + +#. module: base +#: selection:ir.actions.todo,type:0 +msgid "Launch Automatically" +msgstr "" + +#. module: base +#: help:ir.model.fields,translate:0 +msgid "" +"Whether values for this field can be translated (enables the translation " +"mechanism for that field)" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Indonesian / Bahasa Indonesia" +msgstr "" + +#. module: base +#: model:res.country,name:base.cv +msgid "Cape Verde" +msgstr "" + +#. module: base +#: model:res.groups,comment:base.group_sale_salesman +msgid "the user will have access to his own data in the sales application." +msgstr "" + +#. module: base +#: model:res.groups,comment:base.group_user +msgid "" +"the user will be able to manage his own human resources stuff (leave " +"request, timesheets, ...), if he is linked to an employee in the system." +msgstr "" + +#. module: base +#: code:addons/orm.py:2247 +#, python-format +msgid "There is no view of type '%s' defined for the structure!" +msgstr "" + +#. module: base +#: help:ir.values,key:0 +msgid "" +"- Action: an action attached to one slot of the given model\n" +"- Default: a default value for a model field" +msgstr "" + +#. module: base +#: field:base.module.update,add:0 +msgid "Number of modules added" +msgstr "" + +#. module: base +#: view:res.currency:0 +msgid "Price Accuracy" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Latvian / latviešu valoda" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "French / Français" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Created Menus" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:502 +#: view:ir.module.module:0 +#, python-format +msgid "Uninstall" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_budget +msgid "Budgets Management" +msgstr "" + +#. module: base +#: field:workflow.triggers,workitem_id:0 +msgid "Workitem" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_anonymization +msgid "Database Anonymization" +msgstr "" + +#. module: base +#: selection:ir.mail_server,smtp_encryption:0 +msgid "SSL/TLS" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_hr +msgid "" +"\n" +"Croatian localisation.\n" +"======================\n" +"\n" +"Author: Goran Kliska, Slobodni programi d.o.o., Zagreb\n" +" http://www.slobodni-programi.hr\n" +"\n" +"Contributions:\n" +" Tomislav Bošnjaković, Storm Computers: tipovi konta\n" +" Ivan Vađić, Slobodni programi: tipovi konta\n" +"\n" +"Description:\n" +"\n" +"Croatian Chart of Accounts (RRIF ver.2012)\n" +"\n" +"RRIF-ov računski plan za poduzetnike za 2012.\n" +"Vrste konta\n" +"Kontni plan prema RRIF-u, dorađen u smislu kraćenja naziva i dodavanja " +"analitika\n" +"Porezne grupe prema poreznoj prijavi\n" +"Porezi PDV obrasca\n" +"Ostali porezi \n" +"Osnovne fiskalne pozicije\n" +"\n" +"Izvori podataka:\n" +" http://www.rrif.hr/dok/preuzimanje/rrif-rp2011.rar\n" +" http://www.rrif.hr/dok/preuzimanje/rrif-rp2012.rar\n" +"\n" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: field:ir.actions.act_window.view,act_window_id:0 +#: view:ir.actions.actions:0 +#: field:ir.actions.todo,action_id:0 +#: field:ir.ui.menu,action:0 +#: selection:ir.values,key:0 +msgid "Action" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Email Configuration" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_cron +msgid "ir.cron" +msgstr "" + +#. module: base +#: model:res.country,name:base.cw +msgid "Curaçao" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Current Year without Century: %(y)s" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_config_list_action +#: view:ir.config_parameter:0 +#: model:ir.ui.menu,name:base.ir_config_menu +msgid "System Parameters" +msgstr "" + +#. module: base +#: help:ir.actions.client,tag:0 +msgid "" +"An arbitrary string, interpreted by the client according to its own needs " +"and wishes. There is no central tag repository across clients." +msgstr "" + +#. module: base +#: sql_constraint:ir.rule:0 +msgid "Rule must have at least one checked access right !" +msgstr "" + +#. module: base +#: field:res.partner.bank.type,format_layout:0 +msgid "Format Layout" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_document_ftp +msgid "" +"\n" +"This is a support FTP Interface with document management system.\n" +"================================================================\n" +"\n" +"With this module you would not only be able to access documents through " +"OpenERP\n" +"but you would also be able to connect with them through the file system " +"using the\n" +"FTP client.\n" +msgstr "" + +#. module: base +#: field:ir.model.fields,size:0 +msgid "Size" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_audittrail +msgid "Audit Trail" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:264 +#, python-format +msgid "Value '%s' not found in selection field '%%(field)s'" +msgstr "" + +#. module: base +#: model:res.country,name:base.sd +msgid "Sudan" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_currency_rate_type_form +#: model:ir.model,name:base.model_res_currency_rate_type +#: field:res.currency.rate,currency_rate_type_id:0 +#: view:res.currency.rate.type:0 +msgid "Currency Rate Type" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_fr +msgid "" +"\n" +"This is the module to manage the accounting chart for France in OpenERP.\n" +"========================================================================\n" +"\n" +"This module applies to companies based in France mainland. It doesn't apply " +"to\n" +"companies based in the DOM-TOMs (Guadeloupe, Martinique, Guyane, Réunion, " +"Mayotte).\n" +"\n" +"This localisation module creates the VAT taxes of type 'tax included' for " +"purchases\n" +"(it is notably required when you use the module 'hr_expense'). Beware that " +"these\n" +"'tax included' VAT taxes are not managed by the fiscal positions provided by " +"this\n" +"module (because it is complex to manage both 'tax excluded' and 'tax " +"included'\n" +"scenarios in fiscal positions).\n" +"\n" +"This localisation module doesn't properly handle the scenario when a France-" +"mainland\n" +"company sells services to a company based in the DOMs. We could manage it in " +"the\n" +"fiscal positions, but it would require to differentiate between 'product' " +"VAT taxes\n" +"and 'service' VAT taxes. We consider that it is too 'heavy' to have this by " +"default\n" +"in l10n_fr; companies that sell services to DOM-based companies should " +"update the\n" +"configuration of their taxes and fiscal positions manually.\n" +"\n" +"**Credits:** Sistheo, Zeekom, CrysaLEAD, Akretion and Camptocamp.\n" +msgstr "" + +#. module: base +#: model:res.country,name:base.fm +msgid "Micronesia" +msgstr "" + +#. module: base +#: field:ir.module.module,menus_by_module:0 +#: view:res.groups:0 +msgid "Menus" +msgstr "" + +#. module: base +#: selection:ir.actions.todo,type:0 +msgid "Launch Manually Once" +msgstr "" + +#. module: base +#: view:workflow:0 +#: view:workflow.activity:0 +#: field:workflow.activity,wkf_id:0 +#: field:workflow.instance,wkf_id:0 +#: field:workflow.transition,wkf_id:0 +#: field:workflow.workitem,wkf_id:0 +msgid "Workflow" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Serbian (Latin) / srpski" +msgstr "" + +#. module: base +#: model:res.country,name:base.il +msgid "Israel" +msgstr "" + +#. module: base +#: code:addons/base/res/res_config.py:475 +#, python-format +msgid "Cannot duplicate configuration!" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_syscohada +msgid "OHADA - Accounting" +msgstr "" + +#. module: base +#: help:res.bank,bic:0 +msgid "Sometimes called BIC or Swift." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_in +msgid "Indian - Accounting" +msgstr "" + +#. module: base +#: field:res.lang,time_format:0 +msgid "Time Format" +msgstr "" + +#. module: base +#: field:res.company,rml_header3:0 +msgid "RML Internal Header for Landscape Reports" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_partner_manager +msgid "Contact Creation" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Defined Reports" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project_gtd +msgid "Todo Lists" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +msgid "Report xml" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_module_open_categ +#: field:ir.module.category,module_ids:0 +#: view:ir.module.module:0 +#: model:ir.ui.menu,name:base.menu_management +msgid "Modules" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +#: selection:workflow.activity,kind:0 +#: field:workflow.activity,subflow_id:0 +#: field:workflow.workitem,subflow_id:0 +msgid "Subflow" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_res_bank_form +#: model:ir.ui.menu,name:base.menu_action_res_bank_form +#: view:res.bank:0 +#: field:res.partner,bank_ids:0 +msgid "Banks" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web +msgid "" +"\n" +"OpenERP Web core module.\n" +"========================\n" +"\n" +"This module provides the core of the OpenERP Web Client.\n" +" " +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Week of the Year: %(woy)s" +msgstr "" + +#. module: base +#: field:res.users,id:0 +msgid "ID" +msgstr "" + +#. module: base +#: field:ir.cron,doall:0 +msgid "Repeat Missed" +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_module_import.py:67 +#, python-format +msgid "Can not create the module file: %s !" +msgstr "" + +#. module: base +#: field:ir.server.object.lines,server_id:0 +msgid "Object Mapping" +msgstr "" + +#. module: base +#: field:ir.module.category,xml_id:0 +#: field:ir.ui.view,xml_id:0 +msgid "External ID" +msgstr "" + +#. module: base +#: help:res.currency.rate,rate:0 +msgid "The rate of the currency to the currency of rate 1" +msgstr "" + +#. module: base +#: model:res.country,name:base.uk +msgid "United Kingdom" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_pa +msgid "Panama Localization Chart Account" +msgstr "" + +#. module: base +#: help:res.partner.category,active:0 +msgid "The active field allows you to hide the category without removing it." +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Object:" +msgstr "" + +#. module: base +#: model:res.country,name:base.bw +msgid "Botswana" +msgstr "" + +#. module: base +#: view:res.partner.title:0 +msgid "Partner Titles" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:196 +#: code:addons/base/ir/ir_fields.py:227 +#, python-format +msgid "Use the format '%s'" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,auto_refresh:0 +msgid "Add an auto-refresh on the view" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_crm_profiling +msgid "Customer Profiling" +msgstr "" + +#. module: base +#: selection:ir.cron,interval_type:0 +msgid "Work Days" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_multi_company +msgid "Multi-Company" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_workflow_workitem_form +#: model:ir.ui.menu,name:base.menu_workflow_workitem +msgid "Workitems" +msgstr "" + +#. module: base +#: code:addons/base/res/res_bank.py:195 +#, python-format +msgid "Invalid Bank Account Type Name format." +msgstr "" + +#. module: base +#: view:ir.filters:0 +msgid "Filters visible only for one user" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_attachment +msgid "ir.attachment" +msgstr "" + +#. module: base +#: code:addons/orm.py:4348 +#, python-format +msgid "" +"You cannot perform this operation. New Record Creation is not allowed for " +"this object as this object is for reporting purpose." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_import +msgid "" +"\n" +"New extensible file import for OpenERP\n" +"======================================\n" +"\n" +"Re-implement openerp's file import system:\n" +"\n" +"* Server side, the previous system forces most of the logic into the\n" +" client which duplicates the effort (between clients), makes the\n" +" import system much harder to use without a client (direct RPC or\n" +" other forms of automation) and makes knowledge about the\n" +" import/export system much harder to gather as it is spread over\n" +" 3+ different projects.\n" +"\n" +"* In a more extensible manner, so users and partners can build their\n" +" own front-end to import from other file formats (e.g. OpenDocument\n" +" files) which may be simpler to handle in their work flow or from\n" +" their data production sources.\n" +"\n" +"* In a module, so that administrators and users of OpenERP who do not\n" +" need or want an online import can avoid it being available to users.\n" +msgstr "" + +#. module: base +#: selection:res.currency,position:0 +msgid "After Amount" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Lithuanian / Lietuvių kalba" +msgstr "" + +#. module: base +#: help:ir.actions.server,record_id:0 +msgid "" +"Provide the field name where the record id is stored after the create " +"operations. If it is empty, you can not track the new record." +msgstr "" + +#. module: base +#: model:res.groups,comment:base.group_hr_user +msgid "the user will be able to approve document created by employees." +msgstr "" + +#. module: base +#: field:ir.ui.menu,needaction_enabled:0 +msgid "Target model uses the need action mechanism" +msgstr "" + +#. module: base +#: help:ir.model.fields,relation:0 +msgid "For relationship fields, the technical name of the target model" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%S - Seconds [00,61]." +msgstr "" + +#. module: base +#: help:base.language.import,overwrite:0 +msgid "" +"If you enable this option, existing translations (including custom ones) " +"will be overwritten and replaced by those in this file" +msgstr "" + +#. module: base +#: field:ir.ui.view,inherit_id:0 +msgid "Inherited View" +msgstr "" + +#. module: base +#: view:ir.translation:0 +msgid "Source Term" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_project_management +#: model:ir.ui.menu,name:base.menu_main_pm +#: model:ir.ui.menu,name:base.menu_project_config +#: model:ir.ui.menu,name:base.menu_project_report +msgid "Project" +msgstr "" + +#. module: base +#: field:ir.ui.menu,web_icon_hover_data:0 +msgid "Web Icon Image (hover)" +msgstr "" + +#. module: base +#: view:base.module.import:0 +msgid "Module file successfully imported!" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_model_constraint +#: view:ir.model.constraint:0 +#: model:ir.ui.menu,name:base.ir_model_constraint_menu +msgid "Model Constraints" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_workflow_transition_form +#: model:ir.ui.menu,name:base.menu_workflow_transition +#: view:workflow.activity:0 +msgid "Transitions" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_timesheet +#: model:ir.module.module,shortdesc:base.module_hr_timesheet_sheet +msgid "Timesheets" +msgstr "" + +#. module: base +#: help:ir.values,company_id:0 +msgid "If set, action binding only applies for this company" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_cn +msgid "" +"\n" +"添加中文省份数据\n" +"科目类型\\会计科目表模板\\增值税\\辅助核算类别\\管理会计凭证簿\\财务会计凭证簿\n" +"============================================================\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.lc +msgid "Saint Lucia" +msgstr "" + +#. module: base +#: help:res.users,new_password:0 +msgid "" +"Specify a value only when creating a user or if you're changing the user's " +"password, otherwise leave empty. After a change of password, the user has to " +"login again." +msgstr "" + +#. module: base +#: model:res.country,name:base.so +msgid "Somalia" +msgstr "" + +#. module: base +#: model:res.partner.title,shortcut:base.res_partner_title_doctor +msgid "Dr." +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_user +#: field:res.partner,employee:0 +#: model:res.partner.category,name:base.res_partner_category_3 +msgid "Employee" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project_issue +msgid "" +"\n" +"Track Issues/Bugs Management for Projects\n" +"=========================================\n" +"This application allows you to manage the issues you might face in a project " +"like bugs in a system, client complaints or material breakdowns. \n" +"\n" +"It allows the manager to quickly check the issues, assign them and decide on " +"their status quickly as they evolve.\n" +" " +msgstr "" + +#. module: base +#: field:ir.model.access,perm_create:0 +msgid "Create Access" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_timesheet +msgid "" +"\n" +"This module implements a timesheet system.\n" +"==========================================\n" +"\n" +"Each employee can encode and track their time spent on the different " +"projects.\n" +"A project is an analytic account and the time spent on a project generates " +"costs on\n" +"the analytic account.\n" +"\n" +"Lots of reporting on time and employee tracking are provided.\n" +"\n" +"It is completely integrated with the cost accounting module. It allows you " +"to set\n" +"up a management by affair.\n" +" " +msgstr "" + +#. module: base +#: field:res.bank,state:0 +#: field:res.company,state_id:0 +#: field:res.partner.bank,state_id:0 +msgid "Fed. State" +msgstr "Departamento" + +#. module: base +#: field:ir.actions.server,copy_object:0 +msgid "Copy Of" +msgstr "" + +#. module: base +#: field:ir.model.data,display_name:0 +msgid "Record Name" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_client +#: selection:ir.ui.menu,action:0 +msgid "ir.actions.client" +msgstr "" + +#. module: base +#: model:res.country,name:base.io +msgid "British Indian Ocean Territory" +msgstr "" + +#. module: base +#: model:ir.actions.server,name:base.action_server_module_immediate_install +msgid "Module Immediate Install" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Field Mapping" +msgstr "" + +#. module: base +#: field:ir.model.fields,ttype:0 +msgid "Field Type" +msgstr "" + +#. module: base +#: field:res.country.state,code:0 +msgid "State Code" +msgstr "Código Departamento" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_multilang +msgid "Multi Language Chart of Accounts" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_gt +msgid "" +"\n" +"This is the base module to manage the accounting chart for Guatemala.\n" +"=====================================================================\n" +"\n" +"Agrega una nomenclatura contable para Guatemala. También icluye impuestos y\n" +"la moneda del Quetzal. -- Adds accounting chart for Guatemala. It also " +"includes\n" +"taxes and the Quetzal currency." +msgstr "" + +#. module: base +#: selection:res.lang,direction:0 +msgid "Left-to-Right" +msgstr "" + +#. module: base +#: field:ir.model.fields,translate:0 +#: view:res.lang:0 +#: field:res.lang,translatable:0 +msgid "Translatable" +msgstr "" + +#. module: base +#: help:base.language.import,code:0 +msgid "ISO Language and Country code, e.g. en_US" +msgstr "" + +#. module: base +#: model:res.country,name:base.vn +msgid "Vietnam" +msgstr "" + +#. module: base +#: field:res.users,signature:0 +msgid "Signature" +msgstr "" + +#. module: base +#: field:res.partner.category,complete_name:0 +msgid "Full Name" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "on" +msgstr "" + +#. module: base +#: view:ir.property:0 +msgid "Parameters that are used by all resources." +msgstr "" + +#. module: base +#: model:res.country,name:base.mz +msgid "Mozambique" +msgstr "" + +#. module: base +#: help:ir.values,action_id:0 +msgid "" +"Action bound to this entry - helper field for binding an action, will " +"automatically set the correct reference" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_project_long_term +msgid "Long Term Planning" +msgstr "" + +#. module: base +#: field:ir.actions.server,message:0 +msgid "Message" +msgstr "" + +#. module: base +#: field:ir.actions.act_window.view,multi:0 +#: field:ir.actions.report.xml,multi:0 +msgid "On Multiple Doc." +msgstr "" + +#. module: base +#: view:base.language.export:0 +#: view:base.language.import:0 +#: view:base.language.install:0 +#: view:base.module.import:0 +#: view:base.module.update:0 +#: view:base.module.upgrade:0 +#: view:base.update.translations:0 +#: view:change.password.wizard:0 +#: view:ir.actions.configuration.wizard:0 +#: view:res.config:0 +#: view:res.config.installer:0 +#: view:res.users:0 +#: view:wizard.ir.model.menu.create:0 +msgid "or" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_accountant +msgid "Accounting and Finance" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Upgrade" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_action_rule +msgid "" +"\n" +"This module allows to implement action rules for any object.\n" +"============================================================\n" +"\n" +"Use automated actions to automatically trigger actions for various screens.\n" +"\n" +"**Example:** A lead created by a specific user may be automatically set to a " +"specific\n" +"sales team, or an opportunity which still has status pending after 14 days " +"might\n" +"trigger an automatic reminder email.\n" +" " +msgstr "" + +#. module: base +#: field:res.partner,function:0 +msgid "Job Position" +msgstr "" + +#. module: base +#: view:res.partner:0 +#: field:res.partner,child_ids:0 +msgid "Contacts" +msgstr "" + +#. module: base +#: model:res.country,name:base.fo +msgid "Faroe Islands" +msgstr "" + +#. module: base +#: field:ir.mail_server,smtp_encryption:0 +msgid "Connection Security" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_actions.py:606 +#, python-format +msgid "Please specify an action to launch !" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ec +msgid "Ecuador - Accounting" +msgstr "" + +#. module: base +#: field:res.partner.category,name:0 +msgid "Category Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.mp +msgid "Northern Mariana Islands" +msgstr "" + +#. module: base +#: field:change.password.user,user_login:0 +msgid "User Login" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_hn +msgid "Honduras - Accounting" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_report_intrastat +msgid "Intrastat Reporting" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:131 +#, python-format +msgid "" +"Please use the change password wizard (in User Preferences or User menu) to " +"change your own password." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_config_parameter +msgid "ir.config_parameter" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project_long_term +msgid "" +"\n" +"Long Term Project management module that tracks planning, scheduling, " +"resources allocation.\n" +"=============================================================================" +"==============\n" +"\n" +"Features:\n" +"---------\n" +" * Manage Big project\n" +" * Define various Phases of Project\n" +" * Compute Phase Scheduling: Compute start date and end date of the " +"phases\n" +" which are in draft, open and pending state of the project given. If " +"no\n" +" project given then all the draft, open and pending state phases will " +"be taken.\n" +" * Compute Task Scheduling: This works same as the scheduler button on\n" +" project.phase. It takes the project as argument and computes all the " +"open,\n" +" draft and pending tasks.\n" +" * Schedule Tasks: All the tasks which are in draft, pending and open " +"state\n" +" are scheduled with taking the phase's start date.\n" +" " +msgstr "" + +#. module: base +#: code:addons/orm.py:2021 +#, python-format +msgid "Insufficient fields for Calendar View!" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +msgid "Integer" +msgstr "" + +#. module: base +#: help:ir.actions.report.xml,report_rml:0 +msgid "" +"The path to the main report file (depending on Report Type) or NULL if the " +"content is in another data field" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_14 +msgid "Manufacturer" +msgstr "" + +#. module: base +#: help:res.users,company_id:0 +msgid "The company this user is currently working for." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_wizard_ir_model_menu_create +msgid "wizard.ir.model.menu.create" +msgstr "" + +#. module: base +#: view:workflow.transition:0 +msgid "Transition" +msgstr "" + +#. module: base +#: field:ir.cron,active:0 +#: field:ir.mail_server,active:0 +#: field:ir.model.access,active:0 +#: field:ir.rule,active:0 +#: field:ir.sequence,active:0 +#: field:res.bank,active:0 +#: field:res.currency,active:0 +#: field:res.lang,active:0 +#: field:res.partner,active:0 +#: field:res.partner.category,active:0 +#: field:res.request,active:0 +#: field:res.users,active:0 +#: view:workflow.instance:0 +#: view:workflow.workitem:0 +msgid "Active" +msgstr "" + +#. module: base +#: model:res.country,name:base.na +msgid "Namibia" +msgstr "" + +#. module: base +#: field:res.partner.category,child_ids:0 +msgid "Child Categories" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_actions.py:606 +#: code:addons/base/ir/ir_actions.py:702 +#: code:addons/base/ir/ir_actions.py:705 +#: code:addons/base/ir/ir_model.py:165 +#: code:addons/base/ir/ir_model.py:276 +#: code:addons/base/ir/ir_model.py:290 +#: code:addons/base/ir/ir_model.py:320 +#: code:addons/base/ir/ir_model.py:339 +#: code:addons/base/ir/ir_model.py:344 +#: code:addons/base/ir/ir_model.py:347 +#: code:addons/base/ir/ir_translation.py:341 +#: code:addons/base/module/module.py:320 +#: code:addons/base/module/module.py:362 +#: code:addons/base/module/module.py:366 +#: code:addons/base/module/module.py:372 +#: code:addons/base/module/module.py:499 +#: code:addons/base/module/module.py:525 +#: code:addons/base/module/module.py:539 +#: code:addons/base/module/module.py:644 +#: code:addons/base/res/res_currency.py:194 +#: code:addons/base/res/res_users.py:98 +#: code:addons/custom.py:555 +#: code:addons/orm.py:787 +#: code:addons/orm.py:3961 +#, python-format +msgid "Error" +msgstr "" + +#. module: base +#: help:res.partner,tz:0 +msgid "" +"The partner's timezone, used to output proper date and time values inside " +"printed reports. It is important to set a value for this field. You should " +"use the same timezone that is otherwise used to pick and render date and " +"time values: your computer's timezone." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_analytic_default +msgid "Account Analytic Defaults" +msgstr "" + +#. module: base +#: selection:ir.ui.view,type:0 +msgid "mdx" +msgstr "" + +#. module: base +#: view:ir.cron:0 +msgid "Scheduled Action" +msgstr "" + +#. module: base +#: model:res.country,name:base.bi +msgid "Burundi" +msgstr "" + +#. module: base +#: view:base.language.export:0 +#: view:base.language.install:0 +#: view:base.module.configuration:0 +#: view:base.module.update:0 +msgid "Close" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (MX) / Español (MX)" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Wizards to be Launched" +msgstr "" + +#. module: base +#: model:res.country,name:base.bt +msgid "Bhutan" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_event +msgid "" +"\n" +"This module adds event menu and features to your portal if event and portal " +"are installed.\n" +"=============================================================================" +"=============\n" +" " +msgstr "" + +#. module: base +#: help:ir.sequence,number_next:0 +msgid "Next number of this sequence" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "at" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Rule Definition (Domain Filter)" +msgstr "" + +#. module: base +#: selection:ir.actions.act_url,target:0 +msgid "This Window" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_anonymous +msgid "Anonymous portal" +msgstr "" + +#. module: base +#: field:base.language.export,format:0 +msgid "File Format" +msgstr "" + +#. module: base +#: field:res.lang,iso_code:0 +msgid "ISO code" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_association +msgid "Associations Management" +msgstr "" + +#. module: base +#: help:ir.model,modules:0 +msgid "List of modules in which the object is defined or inherited" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_localization_payroll +#: model:ir.module.module,shortdesc:base.module_hr_payroll +msgid "Payroll" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_country_state +msgid "" +"If you are working on the American market, you can manage the different " +"federal states you are working on from here. Each state is attached to one " +"country." +msgstr "" + +#. module: base +#: view:workflow.workitem:0 +msgid "Workflow Workitems" +msgstr "" + +#. module: base +#: model:res.country,name:base.vc +msgid "Saint Vincent & Grenadines" +msgstr "" + +#. module: base +#: field:ir.mail_server,smtp_pass:0 +#: field:res.users,password:0 +msgid "Password" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_claim +msgid "Portal Claim" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_pe +msgid "Peru Localization Chart Account" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_auth_oauth +msgid "" +"\n" +"Allow users to login through OAuth2 Provider.\n" +"=============================================\n" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_model_fields +#: view:ir.model:0 +#: field:ir.model,field_id:0 +#: model:ir.model,name:base.model_ir_model_fields +#: view:ir.model.fields:0 +#: model:ir.ui.menu,name:base.ir_model_model_fields +msgid "Fields" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_employee_form +msgid "Employees" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_shortcuts +msgid "" +"\n" +"Enable shortcuts feature in the web client.\n" +"===========================================\n" +"\n" +"Add a Shortcut icon in the systray in order to access the user's shortcuts " +"(if any).\n" +"\n" +"Add a Shortcut icon besides the views title in order to add/remove a " +"shortcut.\n" +" " +msgstr "" + +#. module: base +#: field:res.company,rml_header2:0 +msgid "RML Internal Header" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,search_view_id:0 +msgid "Search View Ref." +msgstr "" + +#. module: base +#: help:res.users,partner_id:0 +msgid "Partner-related data of the user" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_crm_todo +msgid "" +"\n" +"Todo list for CRM leads and opportunities.\n" +"==========================================\n" +" " +msgstr "" + +#. module: base +#: view:ir.mail_server:0 +msgid "Test Connection" +msgstr "" + +#. module: base +#: model:res.country,name:base.mm +msgid "Myanmar" +msgstr "" + +#. module: base +#: help:ir.model.fields,modules:0 +msgid "List of modules in which the field is defined" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Chinese (CN) / 简体中文" +msgstr "" + +#. module: base +#: field:ir.model.fields,selection:0 +msgid "Selection Options" +msgstr "" + +#. module: base +#: field:res.bank,street:0 +#: field:res.company,street:0 +#: field:res.partner,street:0 +#: view:res.partner.bank:0 +#: field:res.partner.bank,street:0 +msgid "Street" +msgstr "" + +#. module: base +#: model:res.country,name:base.yu +msgid "Yugoslavia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_gengo +msgid "" +"\n" +"Automated Translations through Gengo API\n" +"========================================\n" +"\n" +"This module will install passive scheduler job for automated translations \n" +"using the Gengo API. To activate it, you must\n" +"1) Configure your Gengo authentication parameters under `Settings > " +"Companies > Gengo Parameters`\n" +"2) Launch the wizard under `Settings > Application Terms > Gengo: Manual " +"Request of Translation` and follow the wizard.\n" +"\n" +"This wizard will activate the CRON job and the Scheduler and will start the " +"automatic translation via Gengo Services for all the terms where you " +"requested it.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_fetchmail +msgid "" +"\n" +"Retrieve incoming email on POP/IMAP servers.\n" +"============================================\n" +"\n" +"Enter the parameters of your POP/IMAP account(s), and any incoming emails " +"on\n" +"these accounts will be automatically downloaded into your OpenERP system. " +"All\n" +"POP3/IMAP-compatible servers are supported, included those that require an\n" +"encrypted SSL/TLS connection.\n" +"\n" +"This can be used to easily create email-based workflows for many email-" +"enabled OpenERP documents, such as:\n" +"-----------------------------------------------------------------------------" +"-----------------------------\n" +" * CRM Leads/Opportunities\n" +" * CRM Claims\n" +" * Project Issues\n" +" * Project Tasks\n" +" * Human Resource Recruitments (Applicants)\n" +"\n" +"Just install the relevant application, and you can assign any of these " +"document\n" +"types (Leads, Project Issues) to your incoming email accounts. New emails " +"will\n" +"automatically spawn new documents of the chosen type, so it's a snap to " +"create a\n" +"mailbox-to-OpenERP integration. Even better: these documents directly act as " +"mini\n" +"conversations synchronized by email. You can reply from within OpenERP, and " +"the\n" +"answers will automatically be collected when they come back, and attached to " +"the\n" +"same *conversation* document.\n" +"\n" +"For more specific needs, you may also assign custom-defined actions\n" +"(technically: Server Actions) to be triggered for each incoming mail.\n" +" " +msgstr "" + +#. module: base +#: field:res.currency,rounding:0 +msgid "Rounding Factor" +msgstr "" + +#. module: base +#: model:res.country,name:base.ca +msgid "Canada" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "Launchpad" +msgstr "" + +#. module: base +#: help:res.currency.rate,currency_rate_type_id:0 +msgid "" +"Allow you to define your own currency rate types, like 'Average' or 'Year to " +"Date'. Leave empty if you simply want to use the normal 'spot' rate type" +msgstr "" + +#. module: base +#: selection:ir.module.module.dependency,state:0 +msgid "Unknown" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_res_users_my +msgid "Change My Preferences" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_actions.py:171 +#, python-format +msgid "Invalid model name in the action definition." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ro +msgid "" +"\n" +"This is the module to manage the accounting chart, VAT structure and " +"Registration Number for Romania in OpenERP.\n" +"=============================================================================" +"===================================\n" +"\n" +"Romanian accounting chart and localization.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.cm +msgid "Cameroon" +msgstr "" + +#. module: base +#: model:res.country,name:base.bf +msgid "Burkina Faso" +msgstr "" + +#. module: base +#: selection:ir.model.fields,state:0 +msgid "Custom Field" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_account_accountant +msgid "Financial and Analytic Accounting" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_project +msgid "Portal Project" +msgstr "" + +#. module: base +#: model:res.country,name:base.cc +msgid "Cocos (Keeling) Islands" +msgstr "" + +#. module: base +#: selection:base.language.install,state:0 +#: selection:base.module.import,state:0 +#: selection:base.module.update,state:0 +msgid "init" +msgstr "" + +#. module: base +#: view:res.partner:0 +#: field:res.partner,user_id:0 +msgid "Salesperson" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "11. %U or %W ==> 48 (49th week)" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_partner_bank_type_field +msgid "Bank type fields" +msgstr "" + +#. module: base +#: constraint:ir.rule:0 +msgid "Rules can not be applied on Transient models." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Dutch / Nederlands" +msgstr "" + +#. module: base +#: selection:res.company,paper_format:0 +msgid "US Letter" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_partner_customer_form +msgid "" +"

\n" +" Click to add a contact in your address book.\n" +"

\n" +" OpenERP helps you easily track all activities related to\n" +" a customer: discussions, history of business opportunities,\n" +" documents, etc.\n" +"

\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.bank_account_update +msgid "Company Bank Accounts" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:473 +#, python-format +msgid "Setting empty passwords is not allowed for security reasons!" +msgstr "" + +#. module: base +#: help:ir.mail_server,smtp_pass:0 +msgid "Optional password for SMTP authentication" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:727 +#, python-format +msgid "Sorry, you are not allowed to modify this document." +msgstr "" + +#. module: base +#: code:addons/base/res/res_config.py:380 +#, python-format +msgid "" +"\n" +"\n" +"This addon is already installed on your system" +msgstr "" + +#. module: base +#: help:ir.cron,interval_number:0 +msgid "Repeat every x." +msgstr "" + +#. module: base +#: model:res.partner.bank.type,name:base.bank_normal +msgid "Normal Bank Account" +msgstr "" + +#. module: base +#: field:change.password.user,wizard_id:0 +#: view:ir.actions.wizard:0 +msgid "Wizard" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:303 +#, python-format +msgid "database id" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_import +msgid "Base import" +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "1cm 28cm 20cm 28cm" +msgstr "" + +#. module: base +#: field:ir.module.module,maintainer:0 +msgid "Maintainer" +msgstr "" + +#. module: base +#: field:ir.sequence,suffix:0 +msgid "Suffix" +msgstr "" + +#. module: base +#: model:res.country,name:base.mo +msgid "Macau" +msgstr "" + +#. module: base +#: model:ir.actions.report.xml,name:base.res_partner_address_report +msgid "Labels" +msgstr "" + +#. module: base +#: help:res.partner,use_parent_address:0 +msgid "" +"Select this if you want to set company's address information for this " +"contact" +msgstr "" + +#. module: base +#: field:ir.default,field_name:0 +msgid "Object Field" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (PE) / Español (PE)" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "French (CH) / Français (CH)" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_13 +msgid "Distributor" +msgstr "" + +#. module: base +#: help:ir.actions.server,subject:0 +msgid "" +"Email subject, may contain expressions enclosed in double brackets based on " +"the same values as those available in the condition field, e.g. `Hello [[ " +"object.partner_id.name ]]`" +msgstr "" + +#. module: base +#: help:res.partner,image:0 +msgid "" +"This field holds the image used as avatar for this contact, limited to " +"1024x1024px" +msgstr "" + +#. module: base +#: model:res.country,name:base.to +msgid "Tonga" +msgstr "" + +#. module: base +#: help:ir.model.fields,serialization_field_id:0 +msgid "" +"If set, this field will be stored in the sparse structure of the " +"serialization field, instead of having its own database column. This cannot " +"be changed after creation." +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +msgid "Bank accounts belonging to one of your companies" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_analytic_plans +msgid "" +"\n" +"This module allows to use several analytic plans according to the general " +"journal.\n" +"=============================================================================" +"=====\n" +"\n" +"Here multiple analytic lines are created when the invoice or the entries\n" +"are confirmed.\n" +"\n" +"For example, you can define the following analytic structure:\n" +"-------------------------------------------------------------\n" +" * **Projects**\n" +" * Project 1\n" +" + SubProj 1.1\n" +" \n" +" + SubProj 1.2\n" +"\n" +" * Project 2\n" +" \n" +" * **Salesman**\n" +" * Eric\n" +" \n" +" * Fabien\n" +"\n" +"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.\n" +" \n" +"The following example is for an invoice that touches the two subprojects and " +"assigned to one salesman:\n" +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" +"~~~~~~~~~~~~~~~~~~~~~~~~~\n" +"**Plan1:**\n" +"\n" +" * SubProject 1.1 : 50%\n" +" \n" +" * SubProject 1.2 : 50%\n" +" \n" +"**Plan2:**\n" +" Eric: 100%\n" +"\n" +"So when this line of invoice will be confirmed, it will generate 3 analytic " +"lines,for one account entry.\n" +"\n" +"The analytic plan validates the minimum and maximum percentage at the time " +"of creation of distribution models.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_sequence +msgid "Entries Sequence Numbering" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "POEdit" +msgstr "" + +#. module: base +#: view:ir.values:0 +msgid "Client Actions" +msgstr "" + +#. module: base +#: field:res.partner.bank.type,field_ids:0 +msgid "Type Fields" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_hr_recruitment +msgid "Jobs, Recruitment, Applications, Job Interviews" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:539 +#, python-format +msgid "" +"You try to upgrade a module that depends on the module: %s.\n" +"But this module is not available in your system." +msgstr "" + +#. module: base +#: field:workflow.transition,act_to:0 +msgid "Destination Activity" +msgstr "" + +#. module: base +#: help:res.currency,position:0 +msgid "" +"Determines where the currency symbol should be placed after or before the " +"amount." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_pad_project +msgid "Pad on tasks" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_update_translations +msgid "base.update.translations" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Full Access Right" +msgstr "" + +#. module: base +#: field:res.partner.category,parent_id:0 +msgid "Parent Category" +msgstr "" + +#. module: base +#: model:res.country,name:base.fi +msgid "Finland" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_shortcuts +msgid "Web Shortcuts" +msgstr "" + +#. module: base +#: view:res.partner:0 +#: selection:res.partner,type:0 +#: selection:res.partner.title,domain:0 +#: view:res.users:0 +msgid "Contact" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_at +msgid "Austria - Accounting" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_ui_menu +msgid "ir.ui.menu" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project +msgid "Project Management" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Cancel Uninstall" +msgstr "" + +#. module: base +#: view:res.bank:0 +msgid "Communication" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_analytic +msgid "Analytic Accounting" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_model_constraint +msgid "ir.model.constraint" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_graph +msgid "Graph Views" +msgstr "" + +#. module: base +#: help:ir.model.relation,name:0 +msgid "PostgreSQL table name implementing a many2many relation." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base +msgid "" +"\n" +"The kernel of OpenERP, needed for all installation.\n" +"===================================================\n" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_server_object_lines +msgid "ir.server.object.lines" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_be +msgid "Belgium - Accounting" +msgstr "" + +#. module: base +#: view:ir.model.access:0 +msgid "Access Control" +msgstr "" + +#. module: base +#: model:res.country,name:base.kw +msgid "Kuwait" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_followup +msgid "Payment Follow-up Management" +msgstr "" + +#. module: base +#: field:workflow.workitem,inst_id:0 +msgid "Instance" +msgstr "" + +#. module: base +#: help:ir.actions.report.xml,attachment:0 +msgid "" +"This is the filename of the attachment used to store the printing result. " +"Keep empty to not save the printed reports. You can use a python expression " +"with the object and time variables." +msgstr "" + +#. module: base +#: sql_constraint:ir.model.data:0 +msgid "" +"You cannot have multiple records with the same external ID in the same " +"module!" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +msgid "Many2One" +msgstr "" + +#. module: base +#: model:res.country,name:base.ng +msgid "Nigeria" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:339 +#, python-format +msgid "For selection fields, the Selection Options must be given!" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_iban +msgid "IBAN Bank Accounts" +msgstr "" + +#. module: base +#: field:res.company,user_ids:0 +msgid "Accepted Users" +msgstr "" + +#. module: base +#: field:ir.ui.menu,web_icon_data:0 +msgid "Web Icon Image" +msgstr "" + +#. module: base +#: field:ir.actions.server,wkf_model_id:0 +msgid "Target Object" +msgstr "" + +#. module: base +#: selection:ir.model.fields,select_level:0 +msgid "Always Searchable" +msgstr "" + +#. module: base +#: help:res.country.state,code:0 +msgid "The state code in max. three chars." +msgstr "El código de departamento en tres caracteres como máximo." + +#. module: base +#: model:res.country,name:base.hk +msgid "Hong Kong" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_sale +msgid "Portal Sale" +msgstr "" + +#. module: base +#: field:ir.default,ref_id:0 +msgid "ID Ref." +msgstr "" + +#. module: base +#: model:res.country,name:base.ph +msgid "Philippines" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_hr_timesheet_sheet +msgid "Timesheets, Attendances, Activities" +msgstr "" + +#. module: base +#: model:res.country,name:base.ma +msgid "Morocco" +msgstr "" + +#. module: base +#: help:ir.values,model_id:0 +msgid "" +"Model to which this entry applies - helper field for setting a model, will " +"automatically set the correct model name" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "2. %a ,%A ==> Fri, Friday" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_translation.py:341 +#, python-format +msgid "" +"Translation features are unavailable until you install an extra OpenERP " +"translation." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_nl +msgid "" +"\n" +"This is the module to manage the accounting chart for Netherlands in " +"OpenERP.\n" +"=============================================================================" +"\n" +"\n" +"Read changelog in file __openerp__.py for version information.\n" +"Dit is een basismodule om een uitgebreid grootboek- en BTW schema voor\n" +"Nederlandse bedrijven te installeren in OpenERP versie 7.0.\n" +"\n" +"De BTW rekeningen zijn waar nodig gekoppeld om de juiste rapportage te " +"genereren,\n" +"denk b.v. aan intracommunautaire verwervingen waarbij u 21% BTW moet " +"opvoeren,\n" +"maar tegelijkertijd ook 21% als voorheffing weer mag aftrekken.\n" +"\n" +"Na installatie van deze module word de configuratie wizard voor 'Accounting' " +"aangeroepen.\n" +" * U krijgt een lijst met grootboektemplates aangeboden waarin zich ook " +"het\n" +" Nederlandse grootboekschema bevind.\n" +"\n" +" * Als de configuratie wizard start, wordt u gevraagd om de naam van uw " +"bedrijf\n" +" in te voeren, welke grootboekschema te installeren, uit hoeveel " +"cijfers een\n" +" grootboekrekening mag bestaan, het rekeningnummer van uw bank en de " +"currency\n" +" om Journalen te creeren.\n" +"\n" +"Let op!! -> De template van het Nederlandse rekeningschema is opgebouwd uit " +"4\n" +"cijfers. Dit is het minimale aantal welk u moet invullen, u mag het aantal " +"verhogen.\n" +"De extra cijfers worden dan achter het rekeningnummer aangevult met " +"'nullen'.\n" +"\n" +" " +msgstr "" + +#. module: base +#: help:ir.rule,global:0 +msgid "If no group is specified the rule is global and applied to everyone" +msgstr "" + +#. module: base +#: model:res.country,name:base.td +msgid "Chad" +msgstr "" + +#. module: base +#: help:ir.cron,priority:0 +msgid "" +"The priority of the job, as an integer: 0 means higher priority, 10 means " +"lower priority." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_workflow_transition +msgid "workflow.transition" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%a - Abbreviated weekday name." +msgstr "" + +#. module: base +#: view:ir.ui.menu:0 +msgid "Submenus" +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Introspection report on objects" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_analytics +msgid "Google Analytics" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_note +msgid "" +"\n" +"This module allows users to create their own notes inside OpenERP\n" +"=================================================================\n" +"\n" +"Use notes to write meeting minutes, organize ideas, organize personnal todo\n" +"lists, etc. Each user manages his own personnal Notes. Notes are available " +"to\n" +"their authors only, but they can share notes to others users so that " +"several\n" +"people can work on the same note in real time. It's very efficient to share\n" +"meeting minutes.\n" +"\n" +"Notes can be found in the 'Home' menu.\n" +msgstr "" + +#. module: base +#: model:res.country,name:base.dm +msgid "Dominica" +msgstr "" + +#. module: base +#: field:ir.translation,name:0 +msgid "Translated field" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_stock_location +msgid "Advanced Routes" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_pad +msgid "Collaborative Pads" +msgstr "" + +#. module: base +#: model:res.country,name:base.np +msgid "Nepal" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_document_page +msgid "Document Page" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ar +msgid "Argentina Localization Chart Account" +msgstr "" + +#. module: base +#: field:ir.module.module,description_html:0 +msgid "Description HTML" +msgstr "" + +#. module: base +#: help:res.groups,implied_ids:0 +msgid "Users of this group automatically inherit those groups" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_note +msgid "Sticky notes, Collaborative, Memos" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_attendance +#: model:res.groups,name:base.group_hr_attendance +msgid "Attendances" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_warning +msgid "Warning Messages and Alerts" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_ui_view_custom +#: model:ir.ui.menu,name:base.menu_action_ui_view_custom +#: view:ir.ui.view.custom:0 +msgid "Customized Views" +msgstr "" + +#. module: base +#: view:base.module.import:0 +#: model:ir.actions.act_window,name:base.action_view_base_module_import +msgid "Module Import" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.act_values_form_action +#: model:ir.ui.menu,name:base.menu_values_form_action +#: view:ir.values:0 +msgid "Action Bindings" +msgstr "" + +#. module: base +#: help:res.partner,lang:0 +msgid "" +"If the selected language is loaded in the system, all documents related to " +"this contact will be printed in this language. If not, it will be English." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_evaluation +msgid "" +"\n" +"Periodical Employees evaluation and appraisals\n" +"==============================================\n" +"\n" +"By using this application you can maintain the motivational process by doing " +"periodical evaluations of your employees' performance. The regular " +"assessment of human resources can benefit your people as well your " +"organization. \n" +"\n" +"An evaluation plan can be assigned to each employee. These plans define the " +"frequency and the way you manage your periodic personal evaluations. You " +"will be able to define steps and attach interview forms to each step. \n" +"\n" +"Manages several types of evaluations: bottom-up, top-down, self-evaluations " +"and the final evaluation by the manager.\n" +"\n" +"Key Features\n" +"------------\n" +"* Ability to create employees evaluations.\n" +"* An evaluation can be created by an employee for subordinates, juniors as " +"well as his manager.\n" +"* The evaluation is done according to a plan in which various surveys can be " +"created. Each survey can be answered by a particular level in the employees " +"hierarchy. The final review and evaluation is done by the manager.\n" +"* Every evaluation filled by employees can be viewed in a PDF form.\n" +"* Interview Requests are generated automatically by OpenERP according to " +"employees evaluation plans. Each user receives automatic emails and requests " +"to perform a periodical evaluation of their colleagues.\n" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_view_base_module_update +msgid "Update Modules List" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:359 +#, python-format +msgid "" +"Unable to upgrade module \"%s\" because an external dependency is not met: %s" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account +msgid "eInvoicing" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:171 +#, python-format +msgid "" +"Please keep in mind that documents currently displayed may not be relevant " +"after switching to another company. If you have unsaved changes, please make " +"sure to save and close all forms before switching to a different company. " +"(You can click on Cancel in the User Preferences now)" +msgstr "" + +#. module: base +#: code:addons/orm.py:2818 +#, python-format +msgid "The value \"%s\" for the field \"%s.%s\" is not in the selection" +msgstr "" + +#. module: base +#: view:ir.actions.configuration.wizard:0 +msgid "Continue" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Thai / ภาษาไทย" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_bo +msgid "" +"\n" +"Bolivian accounting chart and tax localization.\n" +"\n" +"Plan contable boliviano e impuestos de acuerdo a disposiciones vigentes\n" +"\n" +" " +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%j - Day of the year [001,366]." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Slovenian / slovenščina" +msgstr "" + +#. module: base +#: field:res.currency,position:0 +msgid "Symbol Position" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_de +msgid "" +"\n" +"Dieses Modul beinhaltet einen deutschen Kontenrahmen basierend auf dem " +"SKR03.\n" +"=============================================================================" +"=\n" +"\n" +"German accounting chart and localization.\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,attachment_use:0 +msgid "Reload from Attachment" +msgstr "" + +#. module: base +#: model:res.country,name:base.mx +msgid "Mexico" +msgstr "" + +#. module: base +#: code:addons/orm.py:3903 +#, python-format +msgid "" +"For this kind of document, you may only access records you created " +"yourself.\n" +"\n" +"(Document type: %s)" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "documentation" +msgstr "" + +#. module: base +#: help:ir.model,osv_memory:0 +msgid "" +"This field specifies whether the model is transient or not (i.e. if records " +"are automatically deleted from the database or not)" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:445 +#, python-format +msgid "Missing SMTP Server" +msgstr "" + +#. module: base +#: sql_constraint:ir.translation:0 +msgid "Language code of translation item must be among known languages" +msgstr "" + +#. module: base +#: field:base.language.export,data:0 +#: field:base.language.import,data:0 +msgid "File" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_view_base_module_upgrade_install +msgid "Module Upgrade Install" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_configuration_wizard +msgid "ir.actions.configuration.wizard" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%b - Abbreviated month name." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:729 +#, python-format +msgid "Sorry, you are not allowed to delete this document." +msgstr "" + +#. module: base +#: constraint:ir.rule:0 +msgid "Rules can not be applied on the Record Rules model." +msgstr "" + +#. module: base +#: field:res.partner,supplier:0 +#: model:res.partner.category,name:base.res_partner_category_1 +msgid "Supplier" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +#: selection:ir.actions.server,state:0 +msgid "Multi Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_mail +msgid "Discussions, Mailing Lists, News" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_fleet +msgid "" +"\n" +"Vehicle, leasing, insurances, cost\n" +"==================================\n" +"With this module, OpenERP helps you managing all your vehicles, the\n" +"contracts associated to those vehicle as well as services, fuel log\n" +"entries, costs and many other features necessary to the management \n" +"of your fleet of vehicle(s)\n" +"\n" +"Main Features\n" +"-------------\n" +"* Add vehicles to your fleet\n" +"* Manage contracts for vehicles\n" +"* Reminder when a contract reach its expiration date\n" +"* Add services, fuel log entry, odometer values for all vehicles\n" +"* Show all costs associated to a vehicle or to a type of service\n" +"* Analysis graph for costs\n" +msgstr "" + +#. module: base +#: field:multi_company.default,company_dest_id:0 +msgid "Default Company" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (EC) / Español (EC)" +msgstr "" + +#. module: base +#: help:ir.ui.view,xml_id:0 +msgid "ID of the view defined in xml file" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_module_import +msgid "Import Module" +msgstr "" + +#. module: base +#: model:res.country,name:base.as +msgid "American Samoa" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "My Document(s)" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,res_model:0 +msgid "Model name of the object to open in the view window" +msgstr "" + +#. module: base +#: field:ir.model.fields,selectable:0 +msgid "Selectable" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:222 +#, python-format +msgid "Everything seems properly set up!" +msgstr "" + +#. module: base +#: view:res.request.link:0 +msgid "Request Link" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: selection:ir.attachment,type:0 +#: field:ir.module.module,url:0 +msgid "URL" +msgstr "" + +#. module: base +#: help:res.country,name:0 +msgid "The full name of the country." +msgstr "" + +#. module: base +#: selection:ir.actions.server,state:0 +msgid "Iteration" +msgstr "" + +#. module: base +#: code:addons/orm.py:4246 +#: code:addons/orm.py:4347 +#, python-format +msgid "UserError" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_project_issue +msgid "Support, Bug Tracker, Helpdesk" +msgstr "" + +#. module: base +#: model:res.country,name:base.ae +msgid "United Arab Emirates" +msgstr "" + +#. module: base +#: help:ir.ui.menu,needaction_enabled:0 +msgid "" +"If the menu entry action is an act_window action, and if this action is " +"related to a model that uses the need_action mechanism, this field is set to " +"true. Otherwise, it is false." +msgstr "" + +#. module: base +#: code:addons/orm.py:3961 +#, python-format +msgid "" +"Unable to delete this document because it is used as a default property" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_5 +msgid "Silver" +msgstr "" + +#. module: base +#: field:res.partner.title,shortcut:0 +msgid "Abbreviation" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_crm_case_job_req_main +msgid "Recruitment" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_gr +msgid "" +"\n" +"This is the base module to manage the accounting chart for Greece.\n" +"==================================================================\n" +"\n" +"Greek accounting chart and localization.\n" +" " +msgstr "" + +#. module: base +#: view:ir.values:0 +msgid "Action Reference" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_auth_ldap +msgid "" +"\n" +"Adds support for authentication by LDAP server.\n" +"===============================================\n" +"This module allows users to login with their LDAP username and password, " +"and\n" +"will automatically create OpenERP users for them on the fly.\n" +"\n" +"**Note:** This module only work on servers who have Python's ``ldap`` module " +"installed.\n" +"\n" +"Configuration:\n" +"--------------\n" +"After installing this module, you need to configure the LDAP parameters in " +"the\n" +"Configuration tab of the Company details. Different companies may have " +"different\n" +"LDAP servers, as long as they have unique usernames (usernames need to be " +"unique\n" +"in OpenERP, even across multiple companies).\n" +"\n" +"Anonymous LDAP binding is also supported (for LDAP servers that allow it), " +"by\n" +"simply keeping the LDAP user and password empty in the LDAP configuration.\n" +"This does not allow anonymous authentication for users, it is only for the " +"master\n" +"LDAP account that is used to verify if a user exists before attempting to\n" +"authenticate it.\n" +"\n" +"Securing the connection with STARTTLS is available for LDAP servers " +"supporting\n" +"it, by enabling the TLS option in the LDAP configuration.\n" +"\n" +"For further options configuring the LDAP settings, refer to the ldap.conf\n" +"manpage: manpage:`ldap.conf(5)`.\n" +"\n" +"Security Considerations:\n" +"------------------------\n" +"Users' LDAP passwords are never stored in the OpenERP database, the LDAP " +"server\n" +"is queried whenever a user needs to be authenticated. No duplication of the\n" +"password occurs, and passwords are managed in one place only.\n" +"\n" +"OpenERP does not manage password changes in the LDAP, so any change of " +"password\n" +"should be conducted by other means in the LDAP directory directly (for LDAP " +"users).\n" +"\n" +"It is also possible to have local OpenERP users in the database along with\n" +"LDAP-authenticated users (the Administrator account is one obvious " +"example).\n" +"\n" +"Here is how it works:\n" +"---------------------\n" +" * The system first attempts to authenticate users against the local " +"OpenERP\n" +" database;\n" +" * if this authentication fails (for example because the user has no " +"local\n" +" password), the system then attempts to authenticate against LDAP;\n" +"\n" +"As LDAP users have blank passwords by default in the local OpenERP database\n" +"(which means no access), the first step always fails and the LDAP server is\n" +"queried to do the authentication.\n" +"\n" +"Enabling STARTTLS ensures that the authentication query to the LDAP server " +"is\n" +"encrypted.\n" +"\n" +"User Template:\n" +"--------------\n" +"In the LDAP configuration on the Company form, it is possible to select a " +"*User\n" +"Template*. If set, this user will be used as template to create the local " +"users\n" +"whenever someone authenticates for the first time via LDAP authentication. " +"This\n" +"allows pre-setting the default groups and menus of the first-time users.\n" +"\n" +"**Warning:** if you set a password for the user template, this password will " +"be\n" +" assigned as local password for each new LDAP user, effectively " +"setting\n" +" a *master password* for these users (until manually changed). You\n" +" usually do not want this. One easy way to setup a template user is " +"to\n" +" login once with a valid LDAP user, let OpenERP create a blank " +"local\n" +" user with the same login (and a blank password), then rename this " +"new\n" +" user to a username that does not exist in LDAP, and setup its " +"groups\n" +" the way you want.\n" +"\n" +"Interaction with base_crypt:\n" +"----------------------------\n" +"The base_crypt module is not compatible with this module, and will disable " +"LDAP\n" +"authentication if installed at the same time.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.re +msgid "Reunion (French)" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:422 +#, python-format +msgid "" +"New column name must still start with x_ , because it is a custom field!" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_mrp_repair +msgid "Repairs Management" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_asset +msgid "Assets Management" +msgstr "" + +#. module: base +#: view:ir.model.access:0 +#: view:ir.rule:0 +#: field:ir.rule,global:0 +msgid "Global" +msgstr "" + +#. module: base +#: model:res.country,name:base.cz +msgid "Czech Republic" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_claim_from_delivery +msgid "Claim on Deliveries" +msgstr "" + +#. module: base +#: model:res.country,name:base.sb +msgid "Solomon Islands" +msgstr "" + +#. module: base +#: code:addons/orm.py:4152 +#: code:addons/orm.py:4685 +#, python-format +msgid "AccessError" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_gantt +msgid "" +"\n" +"OpenERP Web Gantt chart view.\n" +"=============================\n" +"\n" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_status +msgid "State/Stage Management" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_warehouse_management +msgid "Warehouse" +msgstr "" + +#. module: base +#: field:ir.exports,resource:0 +#: model:ir.module.module,shortdesc:base.module_resource +#: field:ir.property,res_id:0 +msgid "Resource" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_process +msgid "" +"\n" +"This module shows the basic processes involved in the selected modules and " +"in the sequence they occur.\n" +"=============================================================================" +"=========================\n" +"\n" +"**Note:** This applies to the modules containing modulename_process.xml.\n" +"\n" +"**e.g.** product/process/product_process.xml.\n" +"\n" +" " +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "8. %I:%M:%S %p ==> 06:25:20 PM" +msgstr "" + +#. module: base +#: view:ir.filters:0 +msgid "Filters shared with all users" +msgstr "" + +#. module: base +#: view:ir.translation:0 +#: model:ir.ui.menu,name:base.menu_translation +msgid "Translations" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +msgid "Report" +msgstr "" + +#. module: base +#: model:res.partner.title,shortcut:base.res_partner_title_prof +msgid "Prof." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:241 +#, python-format +msgid "" +"Your OpenERP Server does not support SMTP-over-SSL. You could use STARTTLS " +"instead.If SSL is needed, an upgrade to Python 2.6 on the server-side should " +"do the trick." +msgstr "" + +#. module: base +#: model:res.country,name:base.ua +msgid "Ukraine" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:164 +#: field:ir.module.module,website:0 +#: field:res.company,website:0 +#: field:res.partner,website:0 +#, python-format +msgid "Website" +msgstr "" + +#. module: base +#: selection:ir.mail_server,smtp_encryption:0 +msgid "None" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_holidays +msgid "Leave Management" +msgstr "" + +#. module: base +#: model:res.company,overdue_msg:base.main_company +msgid "" +"Dear Sir/Madam,\n" +"\n" +"Our records indicate that some payments on your account are still due. " +"Please find details below.\n" +"If the amount has already been paid, please disregard this notice. " +"Otherwise, please forward us the total amount stated below.\n" +"If you have any queries regarding your account, Please contact us.\n" +"\n" +"Thank you in advance for your cooperation.\n" +"Best Regards," +msgstr "" + +#. module: base +#: view:ir.module.category:0 +msgid "Module Category" +msgstr "" + +#. module: base +#: model:res.country,name:base.us +msgid "United States" +msgstr "" + +#. module: base +#: view:ir.ui.view:0 +msgid "Architecture" +msgstr "" + +#. module: base +#: model:res.country,name:base.ml +msgid "Mali" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_project_config_project +msgid "Stages" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Flemish (BE) / Vlaams (BE)" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Vietnamese / Tiếng Việt" +msgstr "" + +#. module: base +#: field:ir.cron,interval_number:0 +msgid "Interval Number" +msgstr "" + +#. module: base +#: model:res.country,name:base.dz +msgid "Algeria" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_hr_employees +msgid "" +"\n" +"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.\n" +"=============================================================================" +"==========================================================\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.bn +msgid "Brunei Darussalam" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: field:ir.actions.act_window,view_type:0 +#: field:ir.actions.act_window.view,view_mode:0 +#: field:ir.ui.view,type:0 +msgid "View Type" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.next_id_2 +msgid "User Interface" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_mrp_byproduct +msgid "MRP Byproducts" +msgstr "" + +#. module: base +#: field:res.request,ref_partner_id:0 +msgid "Partner Ref." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_expense +msgid "Expense Management" +msgstr "" + +#. module: base +#: field:ir.attachment,create_date:0 +msgid "Date Created" +msgstr "" + +#. module: base +#: help:ir.actions.server,trigger_name:0 +msgid "The workflow signal to trigger" +msgstr "" + +#. module: base +#: selection:base.language.install,state:0 +#: selection:base.module.import,state:0 +#: selection:base.module.update,state:0 +msgid "done" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +msgid "General Settings" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_in +msgid "" +"\n" +"Indian Accounting: Chart of Account.\n" +"====================================\n" +"\n" +"Indian accounting chart and localization.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_uy +msgid "Uruguay - Chart of Accounts" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_administration_shortcut +msgid "Custom Shortcuts" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_si +msgid "Slovenian - Accounting" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_cancel +msgid "" +"\n" +"Allows canceling accounting entries.\n" +"====================================\n" +"\n" +"This module adds 'Allow Canceling Entries' field on form view of account " +"journal.\n" +"If set to true it allows user to cancel entries & invoices.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_plugin +msgid "CRM Plugins" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_model_model +#: model:ir.model,name:base.model_ir_model +#: model:ir.ui.menu,name:base.ir_model_model_menu +msgid "Models" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:499 +#, python-format +msgid "The `base` module cannot be uninstalled" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_cron.py:262 +#, python-format +msgid "Record cannot be modified right now" +msgstr "" + +#. module: base +#: selection:ir.actions.todo,type:0 +msgid "Launch Manually" +msgstr "" + +#. module: base +#: model:res.country,name:base.be +msgid "Belgium" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_osv_memory_autovacuum +msgid "osv_memory.autovacuum" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:728 +#, python-format +msgid "Sorry, you are not allowed to create this kind of document." +msgstr "" + +#. module: base +#: field:base.language.export,lang:0 +#: field:base.language.install,lang:0 +#: field:base.update.translations,lang:0 +#: field:ir.translation,lang:0 +#: view:res.lang:0 +#: field:res.partner,lang:0 +msgid "Language" +msgstr "" + +#. module: base +#: model:res.country,name:base.gm +msgid "Gambia" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_res_company_form +#: model:ir.actions.act_window,name:base.company_normal_action_tree +#: model:ir.model,name:base.model_res_company +#: model:ir.ui.menu,name:base.menu_action_res_company_form +#: model:ir.ui.menu,name:base.menu_res_company_global +#: view:res.company:0 +#: view:res.partner:0 +#: field:res.users,company_ids:0 +msgid "Companies" +msgstr "" + +#. module: base +#: help:res.currency,symbol:0 +msgid "Currency sign, to be used when printing amounts." +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%H - Hour (24-hour clock) [00,23]." +msgstr "" + +#. module: base +#: field:ir.model.fields,on_delete:0 +msgid "On Delete" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:347 +#, python-format +msgid "Model %s does not exist!" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_mrp_jit +msgid "Just In Time Scheduling" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +#: field:ir.actions.server,code:0 +#: selection:ir.actions.server,state:0 +msgid "Python Code" +msgstr "" + +#. module: base +#: help:ir.actions.server,state:0 +msgid "Type of the Action that is to be executed" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_crm +msgid "" +"\n" +"This module adds a contact page (with a contact form creating a lead when " +"submitted) to your portal if crm and portal are installed.\n" +"=============================================================================" +"=======================================================\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_us +msgid "United States - Chart of accounts" +msgstr "" + +#. module: base +#: view:base.language.export:0 +#: view:base.language.import:0 +#: view:base.language.install:0 +#: view:base.module.import:0 +#: view:base.module.update:0 +#: view:base.module.upgrade:0 +#: view:base.update.translations:0 +#: view:change.password.wizard:0 +#: view:ir.actions.configuration.wizard:0 +#: view:res.config:0 +#: view:res.users:0 +#: view:wizard.ir.model.menu.create:0 +msgid "Cancel" +msgstr "" + +#. module: base +#: code:addons/orm.py:1507 +#, python-format +msgid "Unknown database identifier '%s'" +msgstr "" + +#. module: base +#: selection:base.language.export,format:0 +msgid "PO File" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_diagram +msgid "" +"\n" +"Openerp Web Diagram view.\n" +"=========================\n" +"\n" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ch +msgid "" +"\n" +"Swiss localization :\n" +"====================\n" +"**Multilang swiss STERCHI account chart and taxes**\n" +" **Author:** Camptocamp SA\n" +"\n" +" **Donors:** Hasa Sàrl, Open Net Sàrl and Prisme Solutions Informatique SA\n" +"\n" +" **Translators:** brain-tec AG, Agile Business Group\n" +"\n" +"**This release will introduce major changes to l10n_ch.**\n" +"\n" +"Due to important refactoring needs and the Switzerland adoption of new " +"international payment standard during 2013-2014. We have reorganised the " +"swiss localization addons this way:\n" +"\n" +"- **l10n_ch**: Multilang swiss STERCHI account chart and taxes (official " +"addon)\n" +"- **l10n_ch_base_bank**: Technical module that introduces a new and " +"simplified version of bank type management\n" +"- **l10n_ch_bank**: List of swiss banks\n" +"- **l10n_ch_zip**: List of swiss postal zip\n" +"- **l10n_ch_dta**: Support of dta payment protocol (will be deprecated end " +"2014)\n" +"- **l10n_ch_payment_slip**: Support of ESR/BVR payment slip report and " +"reconciliation. Report refactored with easy element positioning.\n" +"- **l10n_ch_sepa**: Alpha implementation of PostFinance SEPA/PAIN support " +"will be completed during 2013/2014\n" +"\n" +"The modules will be soon available on OpenERP swiss localization on " +"launchpad:\n" +"https://launchpad.net/openerp-swiss-localization\n" +msgstr "" + +#. module: base +#: model:res.country,name:base.nt +msgid "Neutral Zone" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_sale +msgid "" +"\n" +"This module adds a Sales menu to your portal as soon as sale and portal are " +"installed.\n" +"=============================================================================" +"=========\n" +"\n" +"After installing this module, portal users will be able to access their own " +"documents\n" +"via the following menus:\n" +"\n" +" - Quotations\n" +" - Sale Orders\n" +" - Delivery Orders\n" +" - Products (public ones)\n" +" - Invoices\n" +" - Payments/Refunds\n" +"\n" +"If online payment acquirers are configured, portal users will also be given " +"the opportunity to\n" +"pay online on their Sale Orders and Invoices that are not paid yet. Paypal " +"is included\n" +"by default, you simply need to configure a Paypal account in the " +"Accounting/Invoicing settings.\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:316 +#, python-format +msgid "external id" +msgstr "" + +#. module: base +#: view:ir.model:0 +msgid "Custom" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_margin +msgid "Margins in Sales Orders" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_purchase +msgid "Purchase Management" +msgstr "" + +#. module: base +#: field:ir.module.module,published_version:0 +msgid "Published Version" +msgstr "" + +#. module: base +#: model:res.country,name:base.is +msgid "Iceland" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_action_window +#: model:ir.ui.menu,name:base.menu_ir_action_window +msgid "Window Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_project_issue +msgid "" +"\n" +"This module adds issue menu and features to your portal if project_issue and " +"portal are installed.\n" +"=============================================================================" +"=====================\n" +" " +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%I - Hour (12-hour clock) [01,12]." +msgstr "" + +#. module: base +#: view:res.config:0 +msgid "res_config_contents" +msgstr "" + +#. module: base +#: model:res.country,name:base.de +msgid "Germany" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_auth_oauth +msgid "OAuth2 Authentication" +msgstr "" + +#. module: base +#: view:workflow:0 +msgid "" +"When customizing a workflow, be sure you do not modify an existing node or " +"arrow, but rather add new nodes or arrows. If you absolutly need to modify a " +"node or arrow, you can only change fields that are empty or set to the " +"default value. If you don't do that, your customization will be overwrited " +"at the next update or upgrade to a future version of OpenERP." +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Reports :" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_multi_company +msgid "" +"\n" +"This module is for managing a multicompany environment.\n" +"=======================================================\n" +"\n" +"This module is the base module for other multi-company modules.\n" +" " +msgstr "" + +#. module: base +#: sql_constraint:res.currency:0 +msgid "The currency code must be unique per company!" +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_export_language.py:39 +#, python-format +msgid "New Language (Empty translation template)" +msgstr "" + +#. module: base +#: help:ir.actions.server,email:0 +msgid "" +"Expression that returns the email address to send to. Can be based on the " +"same values as for the condition field.\n" +"Example: object.invoice_address_id.email, or 'me@example.com'" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project_issue_sheet +msgid "" +"\n" +"This module adds the Timesheet support for the Issues/Bugs Management in " +"Project.\n" +"=============================================================================" +"====\n" +"\n" +"Worklogs can be maintained to signify number of hours spent by users to " +"handle an issue.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.gy +msgid "Guyana" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_product_expiry +msgid "Products Expiry Date" +msgstr "" + +#. module: base +#: code:addons/base/res/res_config.py:419 +#, python-format +msgid "Click 'Continue' to configure the next addon..." +msgstr "" + +#. module: base +#: field:ir.actions.server,record_id:0 +msgid "Create Id" +msgstr "" + +#. module: base +#: model:res.country,name:base.hn +msgid "Honduras" +msgstr "" + +#. module: base +#: model:res.country,name:base.eg +msgid "Egypt" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Creation" +msgstr "" + +#. module: base +#: help:ir.actions.server,model_id:0 +msgid "" +"Select the object on which the action will work (read, write, create)." +msgstr "" + +#. module: base +#: field:base.language.import,name:0 +msgid "Language Name" +msgstr "" + +#. module: base +#: selection:ir.property,type:0 +msgid "Boolean" +msgstr "" + +#. module: base +#: help:ir.mail_server,smtp_encryption:0 +msgid "" +"Choose the connection encryption scheme:\n" +"- None: SMTP sessions are done in cleartext.\n" +"- TLS (STARTTLS): TLS encryption is requested at start of SMTP session " +"(Recommended)\n" +"- SSL/TLS: SMTP sessions are encrypted with SSL/TLS through a dedicated port " +"(default: 465)" +msgstr "" + +#. module: base +#: view:ir.model:0 +msgid "Fields Description" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_analytic_contract_hr_expense +msgid "Contracts Management: hr_expense link" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: view:ir.cron:0 +#: view:ir.filters:0 +#: view:ir.model.access:0 +#: view:ir.model.data:0 +#: view:ir.model.fields:0 +#: view:ir.module.module:0 +#: view:ir.ui.view:0 +#: view:ir.values:0 +#: view:res.partner:0 +#: view:workflow.activity:0 +msgid "Group By..." +msgstr "" + +#. module: base +#: view:base.module.update:0 +msgid "Module Update Result" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_analytic_contract_hr_expense +msgid "" +"\n" +"This module is for modifying account analytic view to show some data related " +"to the hr_expense module.\n" +"=============================================================================" +"=========================\n" +msgstr "" + +#. module: base +#: field:ir.attachment,store_fname:0 +msgid "Stored Filename" +msgstr "" + +#. module: base +#: field:res.partner,use_parent_address:0 +msgid "Use Company Address" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_hr_holidays +msgid "Holidays, Allocation and Leave Requests" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_hello +msgid "" +"\n" +"OpenERP Web example module.\n" +"===========================\n" +"\n" +msgstr "" + +#. module: base +#: selection:ir.module.module,state:0 +#: selection:ir.module.module.dependency,state:0 +msgid "To be installed" +msgstr "" + +#. module: base +#: view:ir.model:0 +#: model:ir.module.module,shortdesc:base.module_base +#: field:res.currency,base:0 +msgid "Base" +msgstr "" + +#. module: base +#: field:ir.model.data,model:0 +#: field:ir.values,model:0 +msgid "Model Name" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Telugu / తెలుగు" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_partner_supplier_form +msgid "" +"

\n" +" Click to add a contact in your address book.\n" +"

\n" +" OpenERP helps you easily track all activities related to\n" +" a supplier: discussions, history of purchases,\n" +" documents, etc.\n" +"

\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.lr +msgid "Liberia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_tests +msgid "" +"\n" +"OpenERP Web test suite.\n" +"=======================\n" +"\n" +msgstr "" + +#. module: base +#: view:ir.model:0 +#: model:ir.module.module,shortdesc:base.module_note +#: view:res.groups:0 +#: field:res.partner,comment:0 +msgid "Notes" +msgstr "" + +#. module: base +#: field:ir.config_parameter,value:0 +#: field:ir.property,value_binary:0 +#: field:ir.property,value_datetime:0 +#: field:ir.property,value_float:0 +#: field:ir.property,value_integer:0 +#: field:ir.property,value_reference:0 +#: field:ir.property,value_text:0 +#: selection:ir.server.object.lines,type:0 +#: field:ir.server.object.lines,value:0 +#: field:ir.values,value:0 +msgid "Value" +msgstr "" + +#. module: base +#: view:base.language.import:0 +#: field:ir.sequence,code:0 +#: field:ir.sequence.type,code:0 +#: selection:ir.translation,type:0 +#: field:res.partner.bank.type,code:0 +msgid "Code" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_config_installer +msgid "res.config.installer" +msgstr "" + +#. module: base +#: model:res.country,name:base.mc +msgid "Monaco" +msgstr "" + +#. module: base +#: selection:ir.cron,interval_type:0 +msgid "Minutes" +msgstr "" + +#. module: base +#: view:res.currency:0 +msgid "Display" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_multi_company +msgid "Multi Companies" +msgstr "" + +#. module: base +#: help:res.users,menu_id:0 +msgid "" +"If specified, the action will replace the standard menu for this user." +msgstr "" + +#. module: base +#: model:ir.actions.report.xml,name:base.preview_report +msgid "Preview Report" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_purchase_analytic_plans +msgid "Purchase Analytic Plans" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_sequence_type +#: model:ir.ui.menu,name:base.menu_ir_sequence_type +msgid "Sequence Codes" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (CO) / Español (CO)" +msgstr "" + +#. module: base +#: view:base.module.configuration:0 +msgid "" +"All pending configuration wizards have been executed. You may restart " +"individual wizards via the list of configuration wizards." +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Current Year with Century: %(year)s" +msgstr "" + +#. module: base +#: field:ir.exports,export_fields:0 +msgid "Export ID" +msgstr "" + +#. module: base +#: model:res.country,name:base.fr +msgid "France" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +#: field:workflow.activity,flow_stop:0 +msgid "Flow Stop" +msgstr "" + +#. module: base +#: selection:ir.cron,interval_type:0 +msgid "Weeks" +msgstr "" + +#. module: base +#: model:res.country,name:base.af +msgid "Afghanistan, Islamic State of" +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_module_import.py:58 +#: code:addons/base/module/wizard/base_module_import.py:66 +#, python-format +msgid "Error !" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_marketing_campaign_crm_demo +msgid "Marketing Campaign - Demo" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:360 +#, python-format +msgid "" +"Can not create Many-To-One records indirectly, import the field separately" +msgstr "" + +#. module: base +#: field:ir.cron,interval_type:0 +msgid "Interval Unit" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_stock +msgid "Portal Stock" +msgstr "" + +#. module: base +#: field:workflow.activity,kind:0 +msgid "Kind" +msgstr "" + +#. module: base +#: code:addons/orm.py:4647 +#, python-format +msgid "This method does not exist anymore" +msgstr "" + +#. module: base +#: view:base.update.translations:0 +#: model:ir.actions.act_window,name:base.action_wizard_update_translations +#: model:ir.ui.menu,name:base.menu_wizard_update_translations +msgid "Synchronize Terms" +msgstr "" + +#. module: base +#: field:res.lang,thousands_sep:0 +msgid "Thousands Separator" +msgstr "" + +#. module: base +#: field:res.request,create_date:0 +msgid "Created Date" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_cn +msgid "中国会计科目表 - Accounting" +msgstr "" + +#. module: base +#: sql_constraint:ir.model.constraint:0 +msgid "Constraints with the same name are unique per module." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_report_intrastat +msgid "" +"\n" +"A module that adds intrastat reports.\n" +"=====================================\n" +"\n" +"This module gives the details of the goods traded between the countries of\n" +"European Union." +msgstr "" + +#. module: base +#: help:ir.actions.server,loop_action:0 +msgid "" +"Select the action that will be executed. Loop action will not be avaliable " +"inside loop." +msgstr "" + +#. module: base +#: help:ir.model.data,res_id:0 +msgid "ID of the target record in the database" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_analytic_analysis +msgid "Contracts Management" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Chinese (TW) / 正體字" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_request +msgid "res.request" +msgstr "" + +#. module: base +#: field:res.partner,image_medium:0 +msgid "Medium-sized image" +msgstr "" + +#. module: base +#: view:ir.model:0 +msgid "In Memory" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Todo" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_product_visible_discount +msgid "Prices Visible Discounts" +msgstr "" + +#. module: base +#: field:ir.attachment,datas:0 +msgid "File Content" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_model_relation +#: view:ir.model.relation:0 +#: model:ir.ui.menu,name:base.ir_model_relation_menu +msgid "ManyToMany Relations" +msgstr "" + +#. module: base +#: model:res.country,name:base.pa +msgid "Panama" +msgstr "" + +#. module: base +#: help:workflow.transition,group_id:0 +msgid "" +"The group that a user must have to be authorized to validate this transition." +msgstr "" + +#. module: base +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: base +#: model:res.country,name:base.gi +msgid "Gibraltar" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_name:0 +msgid "Service Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.pn +msgid "Pitcairn Island" +msgstr "" + +#. module: base +#: field:res.partner,category_id:0 +msgid "Tags" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +msgid "" +"We suggest to reload the menu tab to see the new menus (Ctrl+T then Ctrl+R)." +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_rule +#: view:ir.rule:0 +#: model:ir.ui.menu,name:base.menu_action_rule +msgid "Record Rules" +msgstr "" + +#. module: base +#: view:multi_company.default:0 +msgid "Multi Company" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_portal +#: model:ir.module.module,shortdesc:base.module_portal +msgid "Portal" +msgstr "" + +#. module: base +#: selection:ir.translation,state:0 +msgid "To Translate" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:294 +#, python-format +msgid "See all possible values" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_claim_from_delivery +msgid "" +"\n" +"Create a claim from a delivery order.\n" +"=====================================\n" +"\n" +"Adds a Claim link to the delivery order.\n" +msgstr "" + +#. module: base +#: view:ir.model:0 +#: view:workflow.activity:0 +msgid "Properties" +msgstr "" + +#. module: base +#: help:ir.sequence,padding:0 +msgid "" +"OpenERP will automatically adds some '0' on the left of the 'Next Number' to " +"get the required padding size." +msgstr "" + +#. module: base +#: help:ir.model.constraint,name:0 +msgid "PostgreSQL constraint or foreign key name." +msgstr "" + +#. module: base +#: view:res.company:0 +msgid "Click to set your company logo." +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%A - Full weekday name." +msgstr "" + +#. module: base +#: help:ir.values,user_id:0 +msgid "If set, action binding only applies for this user." +msgstr "" + +#. module: base +#: model:res.country,name:base.gw +msgid "Guinea Bissau" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,header:0 +msgid "Add RML Header" +msgstr "" + +#. module: base +#: help:res.company,rml_footer:0 +msgid "Footer text displayed at the bottom of all reports." +msgstr "" + +#. module: base +#: field:ir.module.module,icon:0 +msgid "Icon URL" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_note_pad +msgid "Memos pad" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_pad +msgid "" +"\n" +"Adds enhanced support for (Ether)Pad attachments in the web client.\n" +"===================================================================\n" +"\n" +"Lets the company customize which Pad installation should be used to link to " +"new\n" +"pads (by default, http://ietherpad.com/).\n" +" " +msgstr "" + +#. module: base +#: sql_constraint:res.lang:0 +msgid "The code of the language must be unique !" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_attachment +#: view:ir.actions.report.xml:0 +#: view:ir.attachment:0 +#: model:ir.ui.menu,name:base.menu_action_attachment +msgid "Attachments" +msgstr "" + +#. module: base +#: help:res.company,bank_ids:0 +msgid "Bank accounts related to this company" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_sales_management +#: model:ir.ui.menu,name:base.menu_base_partner +#: model:ir.ui.menu,name:base.menu_sale_config +#: model:ir.ui.menu,name:base.menu_sale_config_sales +#: model:ir.ui.menu,name:base.menu_sales +#: model:ir.ui.menu,name:base.next_id_64 +msgid "Sales" +msgstr "" + +#. module: base +#: field:ir.actions.server,child_ids:0 +msgid "Other Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_be_coda +msgid "Belgium - Import Bank CODA Statements" +msgstr "" + +#. module: base +#: selection:ir.actions.todo,state:0 +msgid "Done" +msgstr "" + +#. module: base +#: help:ir.cron,doall:0 +msgid "" +"Specify if missed occurrences should be executed when the server restarts." +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_miss +#: model:res.partner.title,shortcut:base.res_partner_title_miss +msgid "Miss" +msgstr "" + +#. module: base +#: view:ir.model.access:0 +#: field:ir.model.access,perm_write:0 +msgid "Write Access" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%m - Month number [01,12]." +msgstr "" + +#. module: base +#: view:res.bank:0 +#: field:res.bank,city:0 +#: view:res.company:0 +#: field:res.company,city:0 +#: view:res.partner:0 +#: field:res.partner,city:0 +#: view:res.partner.bank:0 +#: field:res.partner.bank,city:0 +#: view:res.users:0 +msgid "City" +msgstr "" + +#. module: base +#: model:res.country,name:base.qa +msgid "Qatar" +msgstr "" + +#. module: base +#: model:res.country,name:base.it +msgid "Italy" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_sale_salesman +msgid "See Own Leads" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +#: selection:ir.actions.todo,state:0 +msgid "To Do" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_hr_employees +msgid "Portal HR employees" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Estonian / Eesti keel" +msgstr "" + +#. module: base +#: help:ir.actions.server,write_id:0 +msgid "" +"Provide the field name that the record id refers to for the write operation. " +"If it is empty it will refer to the active id of the object." +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "GPL-3 or later version" +msgstr "" + +#. module: base +#: code:addons/orm.py:2033 +#, python-format +msgid "" +"Insufficient fields to generate a Calendar View for %s, missing a date_stop " +"or a date_delay" +msgstr "" + +#. module: base +#: field:workflow.activity,action:0 +msgid "Python Action" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "English (US)" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_partner_title_partner +msgid "" +"Manage the partner titles you want to have available in your system. The " +"partner titles is the legal status of the company: Private Limited, SA, etc." +msgstr "" + +#. module: base +#: view:res.bank:0 +#: view:res.company:0 +#: view:res.partner:0 +#: view:res.partner.bank:0 +#: view:res.users:0 +msgid "Address" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Mongolian / монгол" +msgstr "" + +#. module: base +#: model:res.country,name:base.mr +msgid "Mauritania" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_resource +msgid "" +"\n" +"Module for resource management.\n" +"===============================\n" +"\n" +"A resource represent something that can be scheduled (a developer on a task " +"or a\n" +"work center on manufacturing orders). This module manages a resource " +"calendar\n" +"associated to every resource. It also manages the leaves of every resource.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_followup +msgid "" +"\n" +"Module to automate letters for unpaid invoices, with multi-level recalls.\n" +"=========================================================================\n" +"\n" +"You can define your multiple levels of recall through the menu:\n" +"---------------------------------------------------------------\n" +" Configuration / Follow-Up Levels\n" +" \n" +"Once it is defined, you can automatically print recalls every day through " +"simply clicking on the menu:\n" +"-----------------------------------------------------------------------------" +"-------------------------\n" +" Payment Follow-Up / Send Email and letters\n" +"\n" +"It will generate a PDF / send emails / set manual actions according to the " +"the different levels \n" +"of recall defined. You can define different policies for different " +"companies. \n" +"\n" +"Note that if you want to check the follow-up level for a given " +"partner/account entry, you can do from in the menu:\n" +"-----------------------------------------------------------------------------" +"-------------------------------------\n" +" Reporting / Accounting / **Follow-ups Analysis\n" +"\n" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:735 +#, python-format +msgid "" +"Please contact your system administrator if you think this is an error." +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:545 +#: view:base.module.upgrade:0 +#: model:ir.actions.act_window,name:base.action_view_base_module_upgrade +#, python-format +msgid "Apply Schedule Upgrade" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +#: field:workflow.workitem,act_id:0 +msgid "Activity" +msgstr "" + +#. module: base +#: view:change.password.user:0 +#: field:change.password.wizard,user_ids:0 +#: model:ir.actions.act_window,name:base.action_res_users +#: field:ir.default,uid:0 +#: model:ir.model,name:base.model_res_users +#: model:ir.ui.menu,name:base.menu_action_res_users +#: model:ir.ui.menu,name:base.menu_users +#: view:res.groups:0 +#: field:res.groups,users:0 +#: field:res.partner,user_ids:0 +#: view:res.users:0 +msgid "Users" +msgstr "" + +#. module: base +#: field:res.company,parent_id:0 +msgid "Parent Company" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_auth_openid +msgid "OpenID Authentification" +msgstr "" + +#. module: base +#: code:addons/orm.py:3872 +#, python-format +msgid "" +"One of the documents you are trying to access has been deleted, please try " +"again after refreshing." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_mail_server +msgid "ir.mail_server" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (CR) / Español (CR)" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "" +"Global rules (non group-specific) are restrictions, and cannot be bypassed. " +"Group-local rules grant additional permissions, but are constrained within " +"the bounds of global ones. The first group rules restrict further than " +"global rules, but any additional group rule will add more permissions" +msgstr "" + +#. module: base +#: field:res.currency.rate,rate:0 +msgid "Rate" +msgstr "" + +#. module: base +#: model:res.country,name:base.cg +msgid "Congo" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "Examples" +msgstr "" + +#. module: base +#: field:ir.default,value:0 +msgid "Default Value" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_country_state +msgid "Country state" +msgstr "Departamento" + +#. module: base +#: model:ir.ui.menu,name:base.next_id_5 +msgid "Sequences & Identifiers" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_th +msgid "" +"\n" +"Chart of Accounts for Thailand.\n" +"===============================\n" +"\n" +"Thai accounting chart and localization.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.kn +msgid "Saint Kitts & Nevis Anguilla" +msgstr "" + +#. module: base +#: code:addons/base/res/res_currency.py:194 +#, python-format +msgid "" +"No rate found \n" +"for the currency: %s \n" +"at the date: %s" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_ui_view_custom +msgid "" +"Customized views are used when users reorganize the content of their " +"dashboard views (via web client)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_stock +msgid "Sales and Warehouse Management" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_recruitment +msgid "" +"\n" +"Manage job positions and the recruitment process\n" +"================================================\n" +"\n" +"This application allows you to easily keep track of jobs, vacancies, " +"applications, interviews...\n" +"\n" +"It is integrated with the mail gateway to automatically fetch email sent to " +" in the list of applications. It's also integrated " +"with the document management system to store and search in the CV base and " +"find the candidate that you are looking for. Similarly, it is integrated " +"with the survey module to allow you to define interviews for different " +"jobs.\n" +"You can define the different phases of interviews and easily rate the " +"applicant from the kanban view.\n" +msgstr "" + +#. module: base +#: field:ir.model.fields,model:0 +msgid "Object Name" +msgstr "" + +#. module: base +#: help:ir.actions.server,srcmodel_id:0 +msgid "" +"Object in which you want to create / write the object. If it is empty then " +"refer to the Object field." +msgstr "" + +#. module: base +#: view:ir.module.module:0 +#: selection:ir.module.module,state:0 +#: selection:ir.module.module.dependency,state:0 +msgid "Not Installed" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +#: field:workflow.activity,out_transitions:0 +msgid "Outgoing Transitions" +msgstr "" + +#. module: base +#: field:ir.module.module,icon_image:0 +#: field:ir.ui.menu,icon:0 +msgid "Icon" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_human_resources +msgid "" +"Helps you manage your human resources by encoding your employees structure, " +"generating work sheets, tracking attendance and more." +msgstr "" + +#. module: base +#: help:res.partner,ean13:0 +msgid "BarCode" +msgstr "" + +#. module: base +#: help:ir.model.fields,model_id:0 +msgid "The model this field belongs to" +msgstr "" + +#. module: base +#: field:ir.actions.server,sms:0 +#: selection:ir.actions.server,state:0 +msgid "SMS" +msgstr "" + +#. module: base +#: model:res.country,name:base.mq +msgid "Martinique (French)" +msgstr "" + +#. module: base +#: help:res.partner,is_company:0 +msgid "Check if the contact is a company, otherwise it is a person" +msgstr "" + +#. module: base +#: view:ir.sequence.type:0 +msgid "Sequences Type" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Mobile:" +msgstr "" + +#. module: base +#: code:addons/base/res/res_bank.py:195 +#, python-format +msgid "Formating Error" +msgstr "" + +#. module: base +#: model:res.country,name:base.ye +msgid "Yemen" +msgstr "" + +#. module: base +#: selection:workflow.activity,split_mode:0 +msgid "Or" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_br +msgid "Brazilian - Accounting" +msgstr "" + +#. module: base +#: model:res.country,name:base.pk +msgid "Pakistan" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_product_margin +msgid "" +"\n" +"Adds a reporting menu in products that computes sales, purchases, margins " +"and other interesting indicators based on invoices.\n" +"=============================================================================" +"================================================\n" +"\n" +"The wizard to launch the report has several options to help you get the data " +"you need.\n" +msgstr "" + +#. module: base +#: model:res.country,name:base.al +msgid "Albania" +msgstr "" + +#. module: base +#: model:res.country,name:base.ws +msgid "Samoa" +msgstr "" + +#. module: base +#: code:addons/base/res/res_lang.py:189 +#, python-format +msgid "" +"You cannot delete the language which is Active !\n" +"Please de-activate the language first." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:509 +#: code:addons/base/ir/ir_model.py:570 +#: code:addons/base/ir/ir_model.py:1031 +#, python-format +msgid "Permission Denied" +msgstr "" + +#. module: base +#: field:ir.ui.menu,child_id:0 +msgid "Child IDs" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_actions.py:702 +#: code:addons/base/ir/ir_actions.py:705 +#, python-format +msgid "Problem in configuration `Record Id` in Server Action!" +msgstr "" + +#. module: base +#: code:addons/orm.py:2807 +#: code:addons/orm.py:2817 +#, python-format +msgid "ValidateError" +msgstr "" + +#. module: base +#: view:base.module.import:0 +#: view:base.module.update:0 +msgid "Open Modules" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_res_bank_form +msgid "Manage bank records you want to be used in the system." +msgstr "" + +#. module: base +#: view:base.module.import:0 +msgid "Import module" +msgstr "" + +#. module: base +#: field:ir.actions.server,loop_action:0 +msgid "Loop Action" +msgstr "" + +#. module: base +#: help:ir.actions.report.xml,report_file:0 +msgid "" +"The path to the main report file (depending on Report Type) or NULL if the " +"content is in another field" +msgstr "" + +#. module: base +#: model:res.country,name:base.la +msgid "Laos" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:163 +#: selection:ir.actions.server,state:0 +#: model:ir.ui.menu,name:base.menu_email +#: field:res.bank,email:0 +#: field:res.company,email:0 +#: field:res.partner,email:0 +#, python-format +msgid "Email" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_12 +msgid "Office Supplies" +msgstr "" + +#. module: base +#: field:ir.attachment,res_model:0 +msgid "Resource Model" +msgstr "" + +#. module: base +#: code:addons/custom.py:555 +#, python-format +msgid "" +"The sum of the data (2nd field) is null.\n" +"We can't draw a pie chart !" +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +msgid "Information About the Bank" +msgstr "" + +#. module: base +#: help:ir.actions.server,condition:0 +msgid "" +"Condition that is tested before the action is executed, and prevent " +"execution if it is not verified.\n" +"Example: object.list_price > 5000\n" +"It is a Python expression that can use the following values:\n" +" - self: ORM model of the record on which the action is triggered\n" +" - object or obj: browse_record of the record on which the action is " +"triggered\n" +" - pool: ORM model pool (i.e. self.pool)\n" +" - time: Python time module\n" +" - cr: database cursor\n" +" - uid: current user id\n" +" - context: current context" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "" +"2. Group-specific rules are combined together with a logical OR operator" +msgstr "" + +#. module: base +#: model:res.country,name:base.bl +msgid "Saint Barthélémy" +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "Other Proprietary" +msgstr "" + +#. module: base +#: model:res.country,name:base.ec +msgid "Ecuador" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_workflow +msgid "workflow" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Read Access Right" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_analytic_user_function +msgid "Jobs on Contracts" +msgstr "" + +#. module: base +#: code:addons/base/res/res_lang.py:187 +#, python-format +msgid "You cannot delete the language which is User's Preferred Language !" +msgstr "" + +#. module: base +#: view:ir.model.data:0 +msgid "Updatable" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "3. %x ,%X ==> 12/05/08, 18:25:20" +msgstr "" + +#. module: base +#: selection:ir.model.fields,on_delete:0 +msgid "Cascade" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_crm +msgid "Leads, Opportunities, Phone Calls" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_knowledge_management +msgid "" +"Lets you install addons geared towards sharing knowledge with and between " +"your employees." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Arabic / الْعَرَبيّة" +msgstr "" + +#. module: base +#: selection:ir.translation,state:0 +msgid "Translated" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_inventory_form +#: model:ir.ui.menu,name:base.menu_action_inventory_form +msgid "Default Company per Object" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_hello +msgid "Hello" +msgstr "" + +#. module: base +#: view:ir.actions.configuration.wizard:0 +msgid "Next Configuration Step" +msgstr "" + +#. module: base +#: field:res.groups,comment:0 +msgid "Comment" +msgstr "" + +#. module: base +#: field:ir.filters,domain:0 +#: field:ir.model.fields,domain:0 +#: field:ir.rule,domain:0 +#: field:ir.rule,domain_force:0 +#: field:res.partner.title,domain:0 +msgid "Domain" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:166 +#, python-format +msgid "Use '1' for yes and '0' for no" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_marketing_campaign +msgid "Marketing Campaigns" +msgstr "" + +#. module: base +#: field:res.country.state,name:0 +msgid "State Name" +msgstr "Nombre Departamento" + +#. module: base +#: help:ir.attachment,type:0 +msgid "Binary File or URL" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:313 +#, python-format +msgid "Invalid database id '%s' for the field '%%(field)s'" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "Update Languague Terms" +msgstr "" + +#. module: base +#: field:workflow.activity,join_mode:0 +msgid "Join Mode" +msgstr "" + +#. module: base +#: field:res.partner,tz:0 +msgid "Timezone" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_report_xml +#: selection:ir.ui.menu,action:0 +msgid "ir.actions.report.xml" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_sequence_form +#: view:ir.sequence:0 +#: model:ir.ui.menu,name:base.menu_ir_sequence_form +msgid "Sequences" +msgstr "" + +#. module: base +#: help:res.lang,code:0 +msgid "This field is used to set/get locales for user" +msgstr "" + +#. module: base +#: view:ir.filters:0 +msgid "Shared" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:357 +#, python-format +msgid "" +"Unable to install module \"%s\" because an external dependency is not met: %s" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Search modules" +msgstr "" + +#. module: base +#: model:res.country,name:base.by +msgid "Belarus" +msgstr "" + +#. module: base +#: field:ir.actions.act_url,name:0 +#: field:ir.actions.act_window,name:0 +#: field:ir.actions.client,name:0 +#: field:ir.actions.server,name:0 +msgid "Action Name" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_res_users +msgid "" +"Create and manage users that will connect to the system. Users can be " +"deactivated should there be a period of time during which they will/should " +"not connect to the system. You can assign them groups in order to give them " +"specific access to the applications they need to use in the system." +msgstr "" + +#. module: base +#: selection:res.request,priority:0 +msgid "Normal" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_purchase_double_validation +msgid "Double Validation on Purchases" +msgstr "" + +#. module: base +#: field:res.bank,street2:0 +#: field:res.company,street2:0 +#: field:res.partner,street2:0 +msgid "Street2" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_view_base_module_update +msgid "Module Update" +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_module_upgrade.py:85 +#, python-format +msgid "Following modules are not installed or unknown: %s" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_auth_oauth_signup +msgid "" +"\n" +"Allow users to sign up through OAuth2 Provider.\n" +"===============================================\n" +msgstr "" + +#. module: base +#: field:change.password.user,user_id:0 +#: view:ir.cron:0 +#: field:ir.cron,user_id:0 +#: view:ir.filters:0 +#: field:ir.filters,user_id:0 +#: field:ir.ui.view.custom,user_id:0 +#: field:ir.values,user_id:0 +#: model:res.groups,name:base.group_document_user +#: model:res.groups,name:base.group_tool_user +#: view:res.users:0 +msgid "User" +msgstr "" + +#. module: base +#: model:res.country,name:base.pr +msgid "Puerto Rico" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_tests_demo +msgid "Demonstration of web/javascript tests" +msgstr "" + +#. module: base +#: field:workflow.transition,signal:0 +msgid "Signal (Button Name)" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +msgid "Open Window" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,auto_search:0 +msgid "Auto Search" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,filter:0 +msgid "Filter" +msgstr "" + +#. module: base +#: model:res.country,name:base.ch +msgid "Switzerland" +msgstr "" + +#. module: base +#: model:res.country,name:base.gd +msgid "Grenada" +msgstr "" + +#. module: base +#: help:res.partner,customer:0 +msgid "Check this box if this contact is a customer." +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Trigger Configuration" +msgstr "" + +#. module: base +#: view:base.language.install:0 +msgid "Load" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_warning +msgid "" +"\n" +"Module to trigger warnings in OpenERP objects.\n" +"==============================================\n" +"\n" +"Warning messages can be displayed for objects like sale order, purchase " +"order,\n" +"picking and invoice. The message is triggered by the form's onchange event.\n" +" " +msgstr "" + +#. module: base +#: field:res.users,partner_id:0 +msgid "Related Partner" +msgstr "" + +#. module: base +#: code:addons/osv.py:172 +#: code:addons/osv.py:174 +#, python-format +msgid "Integrity Error" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_pa +msgid "" +"\n" +"Panamenian accounting chart and tax localization.\n" +"\n" +"Plan contable panameño e impuestos de acuerdo a disposiciones vigentes\n" +"\n" +"Con la Colaboración de \n" +"- AHMNET CORP http://www.ahmnet.com\n" +"\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:296 +#, python-format +msgid "Size of the field can never be less than 1 !" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_mrp_operations +msgid "Manufacturing Operations" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "Here is the exported translation file:" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_rml_content:0 +#: field:ir.actions.report.xml,report_rml_content_data:0 +msgid "RML Content" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "Update Terms" +msgstr "" + +#. module: base +#: field:res.request,act_to:0 +#: field:res.request.history,act_to:0 +msgid "To" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr +msgid "Employee Directory" +msgstr "" + +#. module: base +#: field:ir.cron,args:0 +msgid "Arguments" +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "GPL Version 2" +msgstr "" + +#. module: base +#: selection:ir.module.module,license:0 +msgid "GPL Version 3" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_stock_location +msgid "" +"\n" +"This module supplements the Warehouse application by effectively " +"implementing Push and Pull inventory flows.\n" +"=============================================================================" +"===============================\n" +"\n" +"Typically this could be used to:\n" +"--------------------------------\n" +" * Manage product manufacturing chains\n" +" * Manage default locations per product\n" +" * Define routes within your warehouse according to business needs, such " +"as:\n" +" - Quality Control\n" +" - After Sales Services\n" +" - Supplier Returns\n" +"\n" +" * Help rental management, by generating automated return moves for " +"rented products\n" +"\n" +"Once this module is installed, an additional tab appear on the product " +"form,\n" +"where you can add Push and Pull flow specifications. The demo data of CPU1\n" +"product for that push/pull :\n" +"\n" +"Push flows:\n" +"-----------\n" +"Push flows are useful when the arrival of certain products in a given " +"location\n" +"should always be followed by a corresponding move to another location, " +"optionally\n" +"after a certain delay. The original Warehouse application already supports " +"such\n" +"Push flow specifications on the Locations themselves, but these cannot be\n" +"refined per-product.\n" +"\n" +"A push flow specification indicates which location is chained with which " +"location,\n" +"and with what parameters. As soon as a given quantity of products is moved " +"in the\n" +"source location, a chained move is automatically foreseen according to the\n" +"parameters set on the flow specification (destination location, delay, type " +"of\n" +"move, journal). The new move can be automatically processed, or require a " +"manual\n" +"confirmation, depending on the parameters.\n" +"\n" +"Pull flows:\n" +"-----------\n" +"Pull flows are a bit different from Push flows, in the sense that they are " +"not\n" +"related to the processing of product moves, but rather to the processing of\n" +"procurement orders. What is being pulled is a need, not directly products. " +"A\n" +"classical example of Pull flow is when you have an Outlet company, with a " +"parent\n" +"Company that is responsible for the supplies of the Outlet.\n" +"\n" +" [ Customer ] <- A - [ Outlet ] <- B - [ Holding ] <~ C ~ [ Supplier ]\n" +"\n" +"When a new procurement order (A, coming from the confirmation of a Sale " +"Order\n" +"for example) arrives in the Outlet, it is converted into another " +"procurement\n" +"(B, via a Pull flow of type 'move') requested from the Holding. When " +"procurement\n" +"order B is processed by the Holding company, and if the product is out of " +"stock,\n" +"it can be converted into a Purchase Order (C) from the Supplier (Pull flow " +"of\n" +"type Purchase). The result is that the procurement order, the need, is " +"pushed\n" +"all the way between the Customer and Supplier.\n" +"\n" +"Technically, Pull flows allow to process procurement orders differently, " +"not\n" +"only depending on the product being considered, but also depending on which\n" +"location holds the 'need' for that product (i.e. the destination location " +"of\n" +"that procurement order).\n" +"\n" +"Use-Case:\n" +"---------\n" +"\n" +"You can use the demo data as follow:\n" +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +" **CPU1:** Sell some CPU1 from Chicago Shop and run the scheduler\n" +" - Warehouse: delivery order, Chicago Shop: reception\n" +" **CPU3:**\n" +" - When receiving the product, it goes to Quality Control location then\n" +" stored to shelf 2.\n" +" - When delivering the customer: Pick List -> Packing -> Delivery Order " +"from Gate A\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_decimal_precision +msgid "" +"\n" +"Configure the price accuracy you need for different kinds of usage: " +"accounting, sales, purchases.\n" +"=============================================================================" +"====================\n" +"\n" +"The decimal precision is configured per company.\n" +msgstr "" + +#. module: base +#: selection:res.company,paper_format:0 +msgid "A4" +msgstr "" + +#. module: base +#: view:res.config.installer:0 +msgid "Configuration Installer" +msgstr "" + +#. module: base +#: field:res.partner,customer:0 +msgid "Customer" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (NI) / Español (NI)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_pad_project +msgid "" +"\n" +"This module adds a PAD in all project kanban views.\n" +"===================================================\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.act_window,context:0 +#: field:ir.actions.client,context:0 +msgid "Context Value" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Hour 00->24: %(h24)s" +msgstr "" + +#. module: base +#: field:ir.cron,nextcall:0 +msgid "Next Execution Date" +msgstr "" + +#. module: base +#: field:ir.sequence,padding:0 +msgid "Number Padding" +msgstr "" + +#. module: base +#: help:multi_company.default,field_id:0 +msgid "Select field property" +msgstr "" + +#. module: base +#: field:res.request.history,date_sent:0 +msgid "Date sent" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Month: %(month)s" +msgstr "" + +#. module: base +#: field:ir.actions.act_window.view,sequence:0 +#: field:ir.actions.server,sequence:0 +#: field:ir.actions.todo,sequence:0 +#: view:ir.cron:0 +#: field:ir.module.category,sequence:0 +#: field:ir.module.module,sequence:0 +#: view:ir.sequence:0 +#: field:ir.ui.menu,sequence:0 +#: view:ir.ui.view:0 +#: field:ir.ui.view,priority:0 +#: field:ir.ui.view_sc,sequence:0 +#: field:multi_company.default,sequence:0 +#: field:res.partner.bank,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: base +#: model:res.country,name:base.tn +msgid "Tunisia" +msgstr "" + +#. module: base +#: help:ir.model.access,active:0 +msgid "" +"If you uncheck the active field, it will disable the ACL without deleting it " +"(if you delete a native ACL, it will be re-created when you reload the " +"module." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_fields_converter +msgid "ir.fields.converter" +msgstr "" + +#. module: base +#: code:addons/base/res/res_partner.py:439 +#, python-format +msgid "Couldn't create contact without email address !" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_manufacturing +#: model:ir.ui.menu,name:base.menu_mrp_config +#: model:ir.ui.menu,name:base.menu_mrp_root +msgid "Manufacturing" +msgstr "" + +#. module: base +#: model:res.country,name:base.km +msgid "Comoros" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "Cancel Install" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_model_relation +msgid "ir.model.relation" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_check_writing +msgid "Check Writing" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_plugin_outlook +msgid "" +"\n" +"This module provides the Outlook Plug-in.\n" +"=========================================\n" +"\n" +"Outlook plug-in allows you to select an object that you would like to add " +"to\n" +"your email and its attachments from MS Outlook. You can select a partner, a " +"task,\n" +"a project, an analytical account, or any other object and archive selected " +"mail\n" +"into mail.message with attachments.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_bo +msgid "Bolivia Localization Chart Account" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_plugin_thunderbird +msgid "" +"\n" +"This module is required for the Thuderbird Plug-in to work properly.\n" +"====================================================================\n" +"\n" +"The plugin allows you archive email and its attachments to the selected\n" +"OpenERP objects. You can select a partner, a task, a project, an analytical\n" +"account, or any other object and attach the selected mail as a .eml file in\n" +"the attachment of a selected record. You can create documents for CRM Lead,\n" +"HR Applicant and Project Issue from selected mails.\n" +" " +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "Legends for Date and Time Formats" +msgstr "" + +#. module: base +#: selection:ir.actions.server,state:0 +msgid "Copy Object" +msgstr "" + +#. module: base +#: field:ir.actions.server,trigger_name:0 +msgid "Trigger Signal" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_country_state +#: model:ir.ui.menu,name:base.menu_country_state_partner +msgid "Fed. States" +msgstr "Departamentos" + +#. module: base +#: view:ir.model:0 +#: view:res.groups:0 +msgid "Access Rules" +msgstr "" + +#. module: base +#: field:res.groups,trans_implied_ids:0 +msgid "Transitively inherits" +msgstr "" + +#. module: base +#: field:ir.default,ref_table:0 +msgid "Table Ref." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_journal +msgid "" +"\n" +"The sales journal modules allows you to categorise your sales and deliveries " +"(picking lists) between different journals.\n" +"=============================================================================" +"===========================================\n" +"\n" +"This module is very helpful for bigger companies that works by departments.\n" +"\n" +"You can use journal for different purposes, some examples:\n" +"----------------------------------------------------------\n" +" * isolate sales of different departments\n" +" * journals for deliveries by truck or by UPS\n" +"\n" +"Journals have a responsible and evolves between different status:\n" +"-----------------------------------------------------------------\n" +" * draft, open, cancel, done.\n" +"\n" +"Batch operations can be processed on the different journals to confirm all " +"sales\n" +"at once, to validate or invoice packing.\n" +"\n" +"It also supports batch invoicing methods that can be configured by partners " +"and sales orders, examples:\n" +"-----------------------------------------------------------------------------" +"--------------------------\n" +" * daily invoicing\n" +" * monthly invoicing\n" +"\n" +"Some statistics by journals are provided.\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:474 +#, python-format +msgid "Mail delivery failed" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: field:ir.actions.report.xml,model:0 +#: field:ir.actions.server,model_id:0 +#: field:ir.actions.wizard,model:0 +#: field:ir.cron,model:0 +#: field:ir.default,field_tbl:0 +#: view:ir.model.access:0 +#: field:ir.model.access,model_id:0 +#: view:ir.model.data:0 +#: view:ir.model.fields:0 +#: field:ir.rule,model_id:0 +#: selection:ir.translation,type:0 +#: view:ir.ui.view:0 +#: field:ir.ui.view,model:0 +#: field:multi_company.default,object_id:0 +#: field:res.request.link,object:0 +#: field:workflow.triggers,model:0 +msgid "Object" +msgstr "" + +#. module: base +#: code:addons/osv.py:169 +#, python-format +msgid "" +"\n" +"\n" +"[object with reference: %s - %s]" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_analytic_plans +msgid "Multiple Analytic Plans" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_default +msgid "ir.default" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Minute: %(min)s" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_ir_cron +msgid "Scheduler" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_event_moodle +msgid "" +"\n" +"Configure your moodle server.\n" +"============================= \n" +"\n" +"With this module you are able to connect your OpenERP with a moodle " +"platform.\n" +"This module will create courses and students automatically in your moodle " +"platform \n" +"to avoid wasting time.\n" +"Now you have a simple way to create training or courses with OpenERP and " +"moodle.\n" +"\n" +"STEPS TO CONFIGURE:\n" +"-------------------\n" +"\n" +"1. Activate web service in moodle.\n" +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +">site administration >plugins >web services >manage protocols activate the " +"xmlrpc web service \n" +"\n" +"\n" +">site administration >plugins >web services >manage tokens create a token \n" +"\n" +"\n" +">site administration >plugins >web services >overview activate webservice\n" +"\n" +"\n" +"2. Create confirmation email with login and password.\n" +"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" +"We strongly suggest you to add those following lines at the bottom of your " +"event\n" +"confirmation email to communicate the login/password of moodle to your " +"subscribers.\n" +"\n" +"\n" +"........your configuration text.......\n" +"\n" +"**URL:** your moodle link for exemple: http://openerp.moodle.com\n" +"\n" +"**LOGIN:** ${object.moodle_username}\n" +"\n" +"**PASSWORD:** ${object.moodle_user_password}\n" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_uk +msgid "UK - Accounting" +msgstr "" + +#. module: base +#: model:res.partner.title,shortcut:base.res_partner_title_madam +msgid "Mrs." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:432 +#, python-format +msgid "" +"Changing the type of a column is not yet supported. Please drop it and " +"create it again!" +msgstr "" + +#. module: base +#: field:ir.ui.view_sc,user_id:0 +msgid "User Ref." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:226 +#, python-format +msgid "'%s' does not seem to be a valid datetime for field '%%(field)s'" +msgstr "" + +#. module: base +#: model:res.partner.bank.type.field,name:base.bank_normal_field_bic +msgid "bank_bic" +msgstr "" + +#. module: base +#: field:ir.actions.server,expression:0 +msgid "Loop Expression" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_16 +msgid "Retailer" +msgstr "" + +#. module: base +#: view:ir.model.fields:0 +#: field:ir.model.fields,readonly:0 +#: field:res.partner.bank.type.field,readonly:0 +msgid "Readonly" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_gt +msgid "Guatemala - Accounting" +msgstr "" + +#. module: base +#: help:ir.cron,args:0 +msgid "Arguments to be passed to the method, e.g. (uid,)." +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Reference Guide" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_partner +#: field:res.company,partner_id:0 +#: model:res.partner.category,name:base.res_partner_category_0 +#: selection:res.partner.title,domain:0 +#: model:res.request.link,name:base.req_link_partner +msgid "Partner" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:482 +#, python-format +msgid "" +"Your server does not seem to support SSL, you may want to try STARTTLS " +"instead" +msgstr "" + +#. module: base +#: code:addons/base/ir/workflow/workflow.py:100 +#, python-format +msgid "" +"Please make sure no workitems refer to an activity before deleting it!" +msgstr "" + +#. module: base +#: model:res.country,name:base.tr +msgid "Turkey" +msgstr "" + +#. module: base +#: model:res.country,name:base.fk +msgid "Falkland Islands" +msgstr "" + +#. module: base +#: model:res.country,name:base.lb +msgid "Lebanon" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +#: field:ir.actions.report.xml,report_type:0 +msgid "Report Type" +msgstr "" + +#. module: base +#: view:res.bank:0 +#: view:res.company:0 +#: view:res.country.state:0 +#: view:res.partner:0 +#: field:res.partner,state_id:0 +#: view:res.partner.bank:0 +#: view:res.users:0 +msgid "State" +msgstr "Departamento" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Galician / Galego" +msgstr "" + +#. module: base +#: model:res.country,name:base.no +msgid "Norway" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "4. %b, %B ==> Dec, December" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_cl +msgid "Chile Localization Chart Account" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Sinhalese / සිංහල" +msgstr "" + +#. module: base +#: selection:res.request,state:0 +msgid "waiting" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_workflow_triggers +msgid "workflow.triggers" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "XSL" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:85 +#, python-format +msgid "Invalid search criterions" +msgstr "" + +#. module: base +#: view:ir.mail_server:0 +msgid "Connection Information" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_prof +msgid "Professor" +msgstr "" + +#. module: base +#: model:res.country,name:base.hm +msgid "Heard and McDonald Islands" +msgstr "" + +#. module: base +#: help:ir.model.data,name:0 +msgid "" +"External Key/Identifier that can be used for data integration with third-" +"party systems" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,view_id:0 +msgid "View Ref." +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_sales_management +msgid "Helps you handle your quotations, sale orders and invoicing." +msgstr "" + +#. module: base +#: field:res.users,login_date:0 +msgid "Latest connection" +msgstr "" + +#. module: base +#: field:res.groups,implied_ids:0 +msgid "Inherits" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "Selection" +msgstr "" + +#. module: base +#: view:change.password.wizard:0 +#: model:ir.actions.act_window,name:base.change_password_wizard_action +#: view:res.users:0 +msgid "Change Password" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_es +msgid "" +"\n" +"Spanish Charts of Accounts (PGCE 2008).\n" +"=======================================\n" +"\n" +" * Defines the following chart of account templates:\n" +" * Spanish General Chart of Accounts 2008\n" +" * Spanish General Chart of Accounts 2008 for small and medium " +"companies\n" +" * Defines templates for sale and purchase VAT\n" +" * Defines tax code templates\n" +"\n" +"**Note:** You should install the l10n_ES_account_balance_report module for " +"yearly\n" +" account reporting (balance, profit & losses).\n" +msgstr "" + +#. module: base +#: field:ir.actions.act_url,type:0 +#: field:ir.actions.act_window,type:0 +#: field:ir.actions.act_window_close,type:0 +#: field:ir.actions.actions,type:0 +#: field:ir.actions.client,type:0 +#: field:ir.actions.report.xml,type:0 +#: view:ir.actions.server:0 +#: field:ir.actions.server,state:0 +#: field:ir.actions.server,type:0 +#: field:ir.actions.wizard,type:0 +msgid "Action Type" +msgstr "" + +#. module: base +#: code:addons/base/module/module.py:372 +#, python-format +msgid "" +"You try to install module '%s' that depends on module '%s'.\n" +"But the latter module is not available in your system." +msgstr "" + +#. module: base +#: view:base.language.import:0 +#: model:ir.actions.act_window,name:base.action_view_base_import_language +#: model:ir.ui.menu,name:base.menu_view_base_import_language +msgid "Import Translation" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +#: field:ir.module.module,category_id:0 +msgid "Category" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: selection:ir.attachment,type:0 +#: selection:ir.property,type:0 +msgid "Binary" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_doctor +msgid "Doctor" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_mrp_repair +msgid "" +"\n" +"The aim is to have a complete module to manage all products repairs.\n" +"====================================================================\n" +"\n" +"The following topics should be covered by this module:\n" +"------------------------------------------------------\n" +" * Add/remove products in the reparation\n" +" * Impact for stocks\n" +" * Invoicing (products and/or services)\n" +" * Warranty concept\n" +" * Repair quotation report\n" +" * Notes for the technician and for the final customer\n" +msgstr "" + +#. module: base +#: model:res.country,name:base.cd +msgid "Congo, Democratic Republic of the" +msgstr "" + +#. module: base +#: model:res.country,name:base.cr +msgid "Costa Rica" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_auth_ldap +msgid "Authentication via LDAP" +msgstr "" + +#. module: base +#: view:workflow.activity:0 +msgid "Conditions" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_other_form +msgid "Other Partners" +msgstr "" + +#. module: base +#: field:base.language.install,state:0 +#: field:base.module.import,state:0 +#: field:base.module.update,state:0 +#: field:ir.actions.todo,state:0 +#: field:ir.module.module,state:0 +#: field:ir.module.module.dependency,state:0 +#: field:ir.translation,state:0 +#: field:res.request,state:0 +#: field:workflow.instance,state:0 +#: view:workflow.workitem:0 +#: field:workflow.workitem,state:0 +msgid "Status" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_currency_form +#: model:ir.ui.menu,name:base.menu_action_currency_form +#: view:res.currency:0 +msgid "Currencies" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_8 +msgid "Consultancy Services" +msgstr "" + +#. module: base +#: help:ir.values,value:0 +msgid "Default value (pickled) or reference to an action" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,auto:0 +msgid "Custom Python Parser" +msgstr "" + +#. module: base +#: sql_constraint:res.groups:0 +msgid "The name of the group must be unique !" +msgstr "" + +#. module: base +#: help:ir.translation,module:0 +msgid "Module this term belongs to" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_view_editor +msgid "" +"\n" +"OpenERP Web to edit views.\n" +"==========================\n" +"\n" +" " +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Hour 00->12: %(h12)s" +msgstr "" + +#. module: base +#: model:res.country,name:base.dk +msgid "Denmark" +msgstr "" + +#. module: base +#: field:res.country,code:0 +msgid "Country Code" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_workflow_instance +msgid "workflow.instance" +msgstr "" + +#. module: base +#: code:addons/orm.py:479 +#, python-format +msgid "Unknown attribute %s in %s " +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "10. %S ==> 20" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ar +msgid "" +"\n" +"Argentinian accounting chart and tax localization.\n" +"==================================================\n" +"\n" +"Plan contable argentino e impuestos de acuerdo a disposiciones vigentes\n" +"\n" +" " +msgstr "" + +#. module: base +#: code:addons/fields.py:130 +#, python-format +msgid "undefined get method !" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Norwegian Bokmål / Norsk bokmål" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_madam +msgid "Madam" +msgstr "" + +#. module: base +#: model:res.country,name:base.ee +msgid "Estonia" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_board +#: model:ir.ui.menu,name:base.menu_reporting_dashboard +msgid "Dashboards" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_procurement +msgid "Procurements" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_6 +msgid "Bronze" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_hr_payroll_account +msgid "Payroll Accounting" +msgstr "" + +#. module: base +#: view:res.users:0 +msgid "Change password" +msgstr "" + +#. module: base +#: model:res.country,name:base.sr +msgid "Suriname" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_order_dates +msgid "Dates on Sales Order" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Creation Month" +msgstr "" + +#. module: base +#: field:ir.module.module,demo:0 +msgid "Demo Data" +msgstr "" + +#. module: base +#: model:res.partner.title,shortcut:base.res_partner_title_mister +msgid "Mr." +msgstr "" + +#. module: base +#: model:res.country,name:base.mv +msgid "Maldives" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_portal_crm +msgid "Portal CRM" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.next_id_4 +msgid "Low Level Objects" +msgstr "" + +#. module: base +#: help:ir.values,model:0 +msgid "Model to which this entry applies" +msgstr "" + +#. module: base +#: field:res.country,address_format:0 +msgid "Address Format" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_change_password_user +msgid "Change Password Wizard User" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_no_one +msgid "Technical Features" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_ve +msgid "" +"\n" +"Chart of Account for Venezuela.\n" +"===============================\n" +"\n" +"Venezuela doesn't have any chart of account by law, but the default\n" +"proposed in OpenERP should comply with some Accepted best practices in " +"Venezuela, \n" +"this plan comply with this practices.\n" +"\n" +"This module has been tested as base for more of 1000 companies, because \n" +"it is based in a mixtures of most common softwares in the Venezuelan \n" +"market what will allow for sure to accountants feel them first steps with \n" +"OpenERP more confortable.\n" +"\n" +"This module doesn't pretend be the total localization for Venezuela, \n" +"but it will help you to start really quickly with OpenERP in this country.\n" +"\n" +"This module give you.\n" +"---------------------\n" +"\n" +"- Basic taxes for Venezuela.\n" +"- Have basic data to run tests with community localization.\n" +"- Start a company from 0 if your needs are basic from an accounting PoV.\n" +"\n" +"We recomend install account_anglo_saxon if you want valued your \n" +"stocks as Venezuela does with out invoices.\n" +"\n" +"If you install this module, and select Custom chart a basic chart will be " +"proposed, \n" +"but you will need set manually account defaults for taxes.\n" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Occitan (FR, post 1500) / Occitan" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:215 +#, python-format +msgid "" +"Here is what we got instead:\n" +" %s" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_model_data +#: view:ir.model.data:0 +#: model:ir.ui.menu,name:base.ir_model_data_menu +msgid "External Identifiers" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Malayalam / മലയാളം" +msgstr "" + +#. module: base +#: field:res.request,body:0 +#: field:res.request.history,req_id:0 +msgid "Request" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.act_ir_actions_todo_form +msgid "" +"The configuration wizards are used to help you configure a new instance of " +"OpenERP. They are launched during the installation of new modules, but you " +"can choose to restart some wizards manually from this menu." +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_sxw:0 +msgid "SXW Path" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_asset +msgid "" +"\n" +"Financial and accounting asset management.\n" +"==========================================\n" +"\n" +"This Module manages the assets owned by a company or an individual. It will " +"keep \n" +"track of depreciation's occurred on those assets. And it allows to create " +"Move's \n" +"of the depreciation lines.\n" +"\n" +" " +msgstr "" + +#. module: base +#: field:ir.cron,numbercall:0 +msgid "Number of Calls" +msgstr "" + +#. module: base +#: code:addons/base/res/res_bank.py:192 +#, python-format +msgid "BANK" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_point_of_sale +#: model:ir.module.module,shortdesc:base.module_point_of_sale +msgid "Point of Sale" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_mail +msgid "" +"\n" +"Business oriented Social Networking\n" +"===================================\n" +"The Social Networking module provides a unified social network abstraction " +"layer allowing applications to display a complete\n" +"communication history on documents with a fully-integrated email and message " +"management system.\n" +"\n" +"It enables the users to read and send messages as well as emails. It also " +"provides a feeds page combined to a subscription mechanism that allows to " +"follow documents and to be constantly updated about recent news.\n" +"\n" +"Main Features\n" +"-------------\n" +"* Clean and renewed communication history for any OpenERP document that can " +"act as a discussion topic\n" +"* Subscription mechanism to be updated about new messages on interesting " +"documents\n" +"* Unified feeds page to see recent messages and activity on followed " +"documents\n" +"* User communication through the feeds page\n" +"* Threaded discussion design on documents\n" +"* Relies on the global outgoing mail server - an integrated email management " +"system - allowing to send emails with a configurable scheduler-based " +"processing engine\n" +"* Includes an extensible generic email composition assistant, that can turn " +"into a mass-mailing assistant and is capable of interpreting simple " +"*placeholder expressions* that will be replaced with dynamic data when each " +"email is actually sent.\n" +" " +msgstr "" + +#. module: base +#: help:ir.actions.server,sequence:0 +msgid "" +"Important when you deal with multiple actions, the execution order will be " +"decided based on this, low number is higher priority." +msgstr "" + +#. module: base +#: model:res.country,name:base.gr +msgid "Greece" +msgstr "" + +#. module: base +#: view:res.config:0 +msgid "Apply" +msgstr "" + +#. module: base +#: field:res.request,trigger_date:0 +msgid "Trigger Date" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Croatian / hrvatski jezik" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_uy +msgid "" +"\n" +"General Chart of Accounts.\n" +"==========================\n" +"\n" +"Provide Templates for Chart of Accounts, Taxes for Uruguay.\n" +"\n" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_gr +msgid "Greece - Accounting" +msgstr "" + +#. module: base +#: sql_constraint:res.country:0 +msgid "The code of the country must be unique !" +msgstr "" + +#. module: base +#: selection:ir.module.module.dependency,state:0 +msgid "Uninstallable" +msgstr "" + +#. module: base +#: view:res.partner.category:0 +msgid "Partner Category" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +#: selection:ir.actions.server,state:0 +msgid "Trigger" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_warehouse_management +msgid "" +"Helps you manage your inventory and main stock operations: delivery orders, " +"receptions, etc." +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_values +msgid "ir.values" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_module_update +msgid "Update Module" +msgstr "" + +#. module: base +#: view:ir.model.fields:0 +msgid "Translate" +msgstr "" + +#. module: base +#: field:res.request.history,body:0 +msgid "Body" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:221 +#, python-format +msgid "Connection test succeeded!" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project_gtd +msgid "" +"\n" +"Implement concepts of the \"Getting Things Done\" methodology \n" +"===========================================================\n" +"\n" +"This module implements a simple personal to-do list based on tasks. It adds " +"an editable list of tasks simplified to the minimum required fields in the " +"project application.\n" +"\n" +"The to-do list is based on the GTD methodology. This world-wide used " +"methodology is used for personal time management improvement.\n" +"\n" +"Getting Things Done (commonly abbreviated as GTD) is an action management " +"method created by David Allen, and described in a book of the same name.\n" +"\n" +"GTD rests on the principle that a person needs to move tasks out of the mind " +"by recording them externally. That way, the mind is freed from the job of " +"remembering everything that needs to be done, and can concentrate on " +"actually performing those tasks.\n" +" " +msgstr "" + +#. module: base +#: field:res.users,menu_id:0 +msgid "Menu Action" +msgstr "" + +#. module: base +#: help:ir.model.fields,selection:0 +msgid "" +"List of options for a selection field, specified as a Python expression " +"defining a list of (key, label) pairs. For example: " +"[('blue','Blue'),('yellow','Yellow')]" +msgstr "" + +#. module: base +#: selection:base.language.export,state:0 +msgid "choose" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:446 +#, python-format +msgid "" +"Please define at least one SMTP server, or provide the SMTP parameters " +"explicitly." +msgstr "" + +#. module: base +#: view:ir.attachment:0 +msgid "Filter on my documents" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_project_gtd +msgid "Personal Tasks, Contexts, Timeboxes" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_cr +msgid "" +"\n" +"Chart of accounts for Costa Rica.\n" +"=================================\n" +"\n" +"Includes:\n" +"---------\n" +" * account.type\n" +" * account.account.template\n" +" * account.tax.template\n" +" * account.tax.code.template\n" +" * account.chart.template\n" +"\n" +"Everything is in English with Spanish translation. Further translations are " +"welcome,\n" +"please go to http://translations.launchpad.net/openerp-costa-rica.\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_supplier_form +#: model:ir.ui.menu,name:base.menu_procurement_management_supplier_name +#: view:res.partner:0 +msgid "Suppliers" +msgstr "" + +#. module: base +#: field:res.request,ref_doc2:0 +msgid "Document Ref 2" +msgstr "" + +#. module: base +#: field:res.request,ref_doc1:0 +msgid "Document Ref 1" +msgstr "" + +#. module: base +#: model:res.country,name:base.ga +msgid "Gabon" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_stock +msgid "Inventory, Logistic, Storage" +msgstr "" + +#. module: base +#: view:ir.actions.act_window:0 +#: selection:ir.translation,type:0 +msgid "Help" +msgstr "" + +#. module: base +#: view:ir.model:0 +#: view:ir.rule:0 +#: view:res.groups:0 +#: model:res.groups,name:base.group_erp_manager +#: view:res.users:0 +msgid "Access Rights" +msgstr "" + +#. module: base +#: model:res.country,name:base.gl +msgid "Greenland" +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +#: field:res.partner.bank,acc_number:0 +msgid "Account Number" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "" +"Example: GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND ( (GROUP_A_RULE_1 OR " +"GROUP_A_RULE_2) OR (GROUP_B_RULE_1 OR GROUP_B_RULE_2) )" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_th +msgid "Thailand - Accounting" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "1. %c ==> Fri Dec 5 18:25:20 2008" +msgstr "" + +#. module: base +#: model:res.country,name:base.nc +msgid "New Caledonia (French)" +msgstr "" + +#. module: base +#: field:ir.model,osv_memory:0 +msgid "Transient Model" +msgstr "" + +#. module: base +#: model:res.country,name:base.cy +msgid "Cyprus" +msgstr "" + +#. module: base +#: field:res.users,new_password:0 +msgid "Set Password" +msgstr "" + +#. module: base +#: field:ir.actions.server,subject:0 +#: field:res.request,name:0 +#: view:res.request.link:0 +msgid "Subject" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_membership +msgid "" +"\n" +"This module allows you to manage all operations for managing memberships.\n" +"=========================================================================\n" +"\n" +"It supports different kind of members:\n" +"--------------------------------------\n" +" * Free member\n" +" * Associated member (e.g.: a group subscribes to a membership for all " +"subsidiaries)\n" +" * Paid members\n" +" * Special member prices\n" +"\n" +"It is integrated with sales and accounting to allow you to automatically\n" +"invoice and send propositions for membership renewal.\n" +" " +msgstr "" + +#. module: base +#: selection:res.currency,position:0 +msgid "Before Amount" +msgstr "" + +#. module: base +#: field:res.request,act_from:0 +#: field:res.request.history,act_from:0 +msgid "From" +msgstr "" + +#. module: base +#: view:res.users:0 +msgid "Preferences" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_9 +msgid "Components Buyer" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_web_tests_demo +msgid "" +"\n" +"OpenERP Web demo of a test suite\n" +"================================\n" +"\n" +"Test suite example, same code as that used in the testing documentation.\n" +" " +msgstr "" + +#. module: base +#: help:ir.cron,function:0 +msgid "Name of the method to be called when this job is processed." +msgstr "" + +#. module: base +#: field:ir.actions.client,tag:0 +msgid "Client action tag" +msgstr "" + +#. module: base +#: field:ir.values,model_id:0 +msgid "Model (change only)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_marketing_campaign_crm_demo +msgid "" +"\n" +"Demo data for the module marketing_campaign.\n" +"============================================\n" +"\n" +"Creates demo data like leads, campaigns and segments for the module " +"marketing_campaign.\n" +" " +msgstr "" + +#. module: base +#: selection:ir.actions.act_window.view,view_mode:0 +#: view:ir.ui.view:0 +#: selection:ir.ui.view,type:0 +msgid "Kanban" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:291 +#, python-format +msgid "" +"The Selection Options expression is must be in the [('key','Label'), ...] " +"format!" +msgstr "" + +#. module: base +#: field:res.company,company_registry:0 +msgid "Company Registry" +msgstr "" + +#. module: base +#: view:ir.actions.report.xml:0 +#: view:res.currency:0 +msgid "Miscellaneous" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_ir_mail_server_list +#: view:ir.mail_server:0 +#: model:ir.ui.menu,name:base.menu_mail_servers +msgid "Outgoing Mail Servers" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_custom +msgid "Technical" +msgstr "" + +#. module: base +#: model:res.country,name:base.cn +msgid "China" +msgstr "" + +#. module: base +#: help:ir.actions.server,wkf_model_id:0 +msgid "" +"The object that should receive the workflow signal (must have an associated " +"workflow)" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_account_voucher +msgid "" +"Allows you to create your invoices and track the payments. It is an easier " +"version of the accounting module for managers who are not accountants." +msgstr "" + +#. module: base +#: model:res.country,name:base.eh +msgid "Western Sahara" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_account_voucher +msgid "Invoicing & Payments" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_res_company_form +msgid "" +"Create and manage the companies that will be managed by OpenERP from here. " +"Shops or subsidiaries can be created and maintained from here." +msgstr "" + +#. module: base +#: model:res.country,name:base.id +msgid "Indonesia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_stock_no_autopicking +msgid "" +"\n" +"This module allows an intermediate picking process to provide raw materials " +"to production orders.\n" +"=============================================================================" +"====================\n" +"\n" +"One example of usage of this module is to manage production made by your\n" +"suppliers (sub-contracting). To achieve this, set the assembled product " +"which is\n" +"sub-contracted to 'No Auto-Picking' and put the location of the supplier in " +"the\n" +"routing of the assembly operation.\n" +" " +msgstr "" + +#. module: base +#: help:multi_company.default,expression:0 +msgid "" +"Expression, must be True to match\n" +"use context.get or user (browse)" +msgstr "" + +#. module: base +#: model:res.country,name:base.bg +msgid "Bulgaria" +msgstr "" + +#. module: base +#: model:res.country,name:base.ao +msgid "Angola" +msgstr "" + +#. module: base +#: model:res.country,name:base.tf +msgid "French Southern Territories" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_currency +#: field:res.company,currency_id:0 +#: field:res.company,currency_ids:0 +#: field:res.country,currency_id:0 +#: view:res.currency:0 +#: field:res.currency,name:0 +#: field:res.currency.rate,currency_id:0 +msgid "Currency" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "5. %y, %Y ==> 08, 2008" +msgstr "" + +#. module: base +#: model:res.partner.title,shortcut:base.res_partner_title_ltd +msgid "ltd" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_crm_claim +msgid "" +"\n" +"\n" +"Manage Customer Claims.\n" +"=======================\n" +"This application allows you to track your customers/suppliers claims and " +"grievances.\n" +"\n" +"It is fully integrated with the email gateway so that you can create\n" +"automatically new claims based on incoming emails.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_test +msgid "Accounting Consistency Tests" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_purchase_double_validation +msgid "" +"\n" +"Double-validation for purchases exceeding minimum amount.\n" +"=========================================================\n" +"\n" +"This module modifies the purchase workflow in order to validate purchases " +"that\n" +"exceeds minimum amount set by configuration wizard.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_administration +msgid "Administration" +msgstr "" + +#. module: base +#: view:base.module.update:0 +msgid "Click on Update below to start the process..." +msgstr "" + +#. module: base +#: model:res.country,name:base.ir +msgid "Iran" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Slovak / Slovenský jazyk" +msgstr "" + +#. module: base +#: field:base.language.export,state:0 +#: field:ir.ui.menu,icon_pict:0 +#: field:res.partner,has_image:0 +#: field:res.users,user_email:0 +msgid "unknown" +msgstr "" + +#. module: base +#: field:res.currency,symbol:0 +msgid "Symbol" +msgstr "" + +#. module: base +#: help:res.partner,image_medium:0 +msgid "" +"Medium-sized image of this contact. It is automatically resized as a " +"128x128px image, with aspect ratio preserved. Use this field in form views " +"or some kanban views." +msgstr "" + +#. module: base +#: view:base.update.translations:0 +msgid "Synchronize Translation" +msgstr "" + +#. module: base +#: view:res.partner.bank:0 +#: field:res.partner.bank,bank_name:0 +msgid "Bank Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.ki +msgid "Kiribati" +msgstr "" + +#. module: base +#: model:res.country,name:base.iq +msgid "Iraq" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_association +#: model:ir.ui.menu,name:base.menu_association +#: model:ir.ui.menu,name:base.menu_report_association +msgid "Association" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "Action to Launch" +msgstr "" + +#. module: base +#: field:ir.model,modules:0 +#: field:ir.model.fields,modules:0 +msgid "In Modules" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_contacts +#: model:ir.ui.menu,name:base.menu_config_address_book +msgid "Address Book" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_sequence_type +msgid "ir.sequence.type" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account +msgid "Belgium - Payroll with Accounting" +msgstr "" + +#. module: base +#: selection:base.language.export,format:0 +msgid "CSV File" +msgstr "" + +#. module: base +#: field:res.company,account_no:0 +msgid "Account No." +msgstr "" + +#. module: base +#: code:addons/base/res/res_lang.py:185 +#, python-format +msgid "Base Language 'en_US' can not be deleted !" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_uk +msgid "" +"\n" +"This is the latest UK OpenERP localisation necessary to run OpenERP " +"accounting for UK SME's with:\n" +"=============================================================================" +"====================\n" +" - a CT600-ready chart of accounts\n" +" - VAT100-ready tax structure\n" +" - InfoLogic UK counties listing\n" +" - a few other adaptations" +msgstr "" + +#. module: base +#: selection:ir.model,state:0 +msgid "Base Object" +msgstr "" + +#. module: base +#: field:ir.cron,priority:0 +#: field:ir.mail_server,sequence:0 +#: field:res.request,priority:0 +#: field:res.request.link,priority:0 +msgid "Priority" +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "Dependencies :" +msgstr "" + +#. module: base +#: field:res.company,vat:0 +msgid "Tax ID" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_bank_statement_extensions +msgid "Bank Statement Extensions to Support e-banking" +msgstr "" + +#. module: base +#: field:ir.model.fields,field_description:0 +msgid "Field Label" +msgstr "" + +#. module: base +#: model:res.country,name:base.dj +msgid "Djibouti" +msgstr "" + +#. module: base +#: field:ir.translation,value:0 +msgid "Translation Value" +msgstr "" + +#. module: base +#: model:res.country,name:base.ag +msgid "Antigua and Barbuda" +msgstr "" + +#. module: base +#: model:res.country,name:base.zr +msgid "Zaire" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_project +msgid "Projects, Tasks" +msgstr "" + +#. module: base +#: field:ir.attachment,res_id:0 +#: field:workflow.instance,res_id:0 +#: field:workflow.triggers,res_id:0 +msgid "Resource ID" +msgstr "" + +#. module: base +#: view:ir.cron:0 +#: field:ir.model,info:0 +msgid "Information" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:146 +#, python-format +msgid "false" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_analytic_analysis +msgid "" +"\n" +"This module is for modifying account analytic view to show important data to " +"project manager of services companies.\n" +"=============================================================================" +"======================================\n" +"\n" +"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.\n" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_payroll_account +msgid "" +"\n" +"Generic Payroll system Integrated with Accounting.\n" +"==================================================\n" +"\n" +" * Expense Encoding\n" +" * Payment Encoding\n" +" * Company Contribution Management\n" +" " +msgstr "" + +#. module: base +#: field:res.partner.category,parent_right:0 +msgid "Right parent" +msgstr "" + +#. module: base +#: view:base.module.update:0 +msgid "Update Module List" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:685 +#: code:addons/base/res/res_users.py:825 +#: selection:res.partner,type:0 +#: view:res.users:0 +#, python-format +msgid "Other" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Turkish / Türkçe" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_workflow_activity_form +#: model:ir.ui.menu,name:base.menu_workflow_activity +#: field:workflow,activities:0 +msgid "Activities" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_product +msgid "Products & Pricelists" +msgstr "" + +#. module: base +#: help:ir.filters,user_id:0 +msgid "" +"The user this filter is private to. When left empty the filter is public and " +"available to all users." +msgstr "" + +#. module: base +#: field:ir.actions.act_window,auto_refresh:0 +msgid "Auto-Refresh" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_product_expiry +msgid "" +"\n" +"Track different dates on products and production lots.\n" +"======================================================\n" +"\n" +"Following dates can be tracked:\n" +"-------------------------------\n" +" - end of life\n" +" - best before date\n" +" - removal date\n" +" - alert date\n" +"\n" +"Used, for example, in food industries." +msgstr "" + +#. module: base +#: help:ir.translation,state:0 +msgid "" +"Automatically set to let administators find new terms that might need to be " +"translated" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:85 +#, python-format +msgid "The osv_memory field can only be compared with = and != operator." +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Fax:" +msgstr "" + +#. module: base +#: selection:ir.ui.view,type:0 +msgid "Diagram" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_es +msgid "Spanish - Accounting (PGCE 2008)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_stock_no_autopicking +msgid "Picking Before Manufacturing" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_note_pad +msgid "Sticky memos, Collaborative" +msgstr "" + +#. module: base +#: model:res.country,name:base.wf +msgid "Wallis and Futuna Islands" +msgstr "" + +#. module: base +#: help:multi_company.default,name:0 +msgid "Name it to easily find a record" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr +msgid "" +"\n" +"Human Resources Management\n" +"==========================\n" +"\n" +"This application enables you to manage important aspects of your company's " +"staff and other details such as their skills, contacts, working time...\n" +"\n" +"\n" +"You can manage:\n" +"---------------\n" +"* Employees and hierarchies : You can define your employee with User and " +"display hierarchies\n" +"* HR Departments\n" +"* HR Jobs\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_contract +msgid "" +"\n" +"Add all information on the employee form to manage contracts.\n" +"=============================================================\n" +"\n" +" * Contract\n" +" * Place of Birth,\n" +" * Medical Examination Date\n" +" * Company Vehicle\n" +"\n" +"You can assign several contracts per employee.\n" +" " +msgstr "" + +#. module: base +#: view:ir.model.data:0 +#: field:ir.model.data,name:0 +msgid "External Identifier" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_audittrail +msgid "" +"\n" +"This module lets administrator track every user operation on all the objects " +"of the system.\n" +"=============================================================================" +"==============\n" +"\n" +"The administrator can subscribe to rules for read, write and delete on " +"objects \n" +"and can check logs.\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.grant_menu_access +#: model:ir.ui.menu,name:base.menu_grant_menu_access +msgid "Menu Items" +msgstr "" + +#. module: base +#: model:res.groups,comment:base.group_sale_salesman_all_leads +msgid "" +"the user will have access to all records of everyone in the sales " +"application." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_event +msgid "Events Organisation" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.ir_sequence_actions +#: model:ir.ui.menu,name:base.menu_ir_sequence_actions +#: model:ir.ui.menu,name:base.next_id_6 +#: view:workflow.activity:0 +msgid "Actions" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_delivery +msgid "Delivery Costs" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_cron.py:263 +#, python-format +msgid "" +"This cron task is currently being executed and may not be modified, please " +"try again in a few minutes" +msgstr "" + +#. module: base +#: view:base.language.export:0 +#: field:ir.exports.line,export_id:0 +msgid "Export" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ma +msgid "Maroc - Accounting" +msgstr "" + +#. module: base +#: field:res.bank,bic:0 +#: field:res.partner.bank,bank_bic:0 +msgid "Bank Identifier Code" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "" +"CSV format: you may edit it directly with your favorite spreadsheet " +"software,\n" +" the rightmost column (value) contains the " +"translations" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_chart +msgid "" +"\n" +"Remove minimal account chart.\n" +"=============================\n" +"\n" +"Deactivates minimal chart of accounts.\n" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Record rules" +msgstr "" + +#. module: base +#: help:workflow.transition,act_to:0 +msgid "The destination activity." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_project_issue +msgid "Issue Tracker" +msgstr "" + +#. module: base +#: view:base.module.update:0 +#: view:base.module.upgrade:0 +#: view:base.update.translations:0 +msgid "Update" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_plugin +msgid "" +"\n" +"The common interface for plug-in.\n" +"=================================\n" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_crm +msgid "" +"\n" +"This module adds a shortcut on one or several opportunity cases in the CRM.\n" +"===========================================================================\n" +"\n" +"This shortcut allows you to generate a sales order based on the selected " +"case.\n" +"If different cases are open (a list), it generates one sale order by case.\n" +"The case is then closed and linked to the generated sales order.\n" +"\n" +"We suggest you to install this module, if you installed both the sale and " +"the crm\n" +"modules.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.bq +msgid "Bonaire, Sint Eustatius and Saba" +msgstr "" + +#. module: base +#: model:ir.actions.report.xml,name:base.ir_module_reference_print +msgid "Technical guide" +msgstr "" + +#. module: base +#: model:res.country,name:base.tz +msgid "Tanzania" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Danish / Dansk" +msgstr "" + +#. module: base +#: selection:ir.model.fields,select_level:0 +msgid "Advanced Search (deprecated)" +msgstr "" + +#. module: base +#: model:res.country,name:base.cx +msgid "Christmas Island" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_contacts +msgid "" +"\n" +"This module gives you a quick view of your address book, accessible from " +"your home page.\n" +"You can track your suppliers, customers and other contacts.\n" +msgstr "" + +#. module: base +#: help:res.company,custom_footer:0 +msgid "" +"Check this to define the report footer manually. Otherwise it will be " +"filled in automatically." +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Supplier Partners" +msgstr "" + +#. module: base +#: view:res.config.installer:0 +msgid "Install Modules" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_import_crm +msgid "Import & Synchronize" +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Customer Partners" +msgstr "" + +#. module: base +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_request_history +msgid "res.request.history" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_multi_company_default +msgid "Default multi company" +msgstr "" + +#. module: base +#: field:ir.translation,src:0 +msgid "Source" +msgstr "" + +#. module: base +#: field:ir.model.constraint,date_init:0 +#: field:ir.model.relation,date_init:0 +msgid "Initialization Date" +msgstr "" + +#. module: base +#: model:res.country,name:base.vu +msgid "Vanuatu" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_product_visible_discount +msgid "" +"\n" +"This module lets you calculate discounts on Sale Order lines and Invoice " +"lines base on the partner's pricelist.\n" +"=============================================================================" +"==================================\n" +"\n" +"To this end, a new check box named 'Visible Discount' is added to the " +"pricelist form.\n" +"\n" +"**Example:**\n" +" For the product PC1 and the partner \"Asustek\": if listprice=450, and " +"the price\n" +" calculated using Asustek's pricelist is 225. If the check box is " +"checked, we\n" +" will have on the sale order line: Unit price=450, Discount=50,00, Net " +"price=225.\n" +" If the check box is unchecked, we will have on Sale Order and Invoice " +"lines:\n" +" Unit price=225, Discount=0,00, Net price=225.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_crm +msgid "CRM" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_base_report_designer +msgid "" +"\n" +"This module is used along with OpenERP OpenOffice Plugin.\n" +"=========================================================\n" +"\n" +"This module adds wizards to Import/Export .sxw report that you can modify in " +"OpenOffice. \n" +"Once you have modified it you can upload the report using the same wizard.\n" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +msgid "Start configuration" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Catalan / Català" +msgstr "" + +#. module: base +#: model:res.country,name:base.do +msgid "Dominican Republic" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Serbian (Cyrillic) / српски" +msgstr "" + +#. module: base +#: code:addons/orm.py:2650 +#, python-format +msgid "" +"Invalid group_by specification: \"%s\".\n" +"A group_by specification must be a list of valid fields." +msgstr "" + +#. module: base +#: selection:ir.mail_server,smtp_encryption:0 +msgid "TLS (STARTTLS)" +msgstr "" + +#. module: base +#: help:ir.actions.act_window,usage:0 +msgid "Used to filter menu and home actions from the user form." +msgstr "" + +#. module: base +#: model:res.country,name:base.sa +msgid "Saudi Arabia" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_sale_mrp +msgid "" +"\n" +"This module provides facility to the user to install mrp and sales modulesat " +"a time.\n" +"=============================================================================" +"=======\n" +"\n" +"It is basically used when we want to keep track of production orders " +"generated\n" +"from sales order. It adds sales name and sales Reference on production " +"order.\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_stock +msgid "" +"\n" +"This module adds access rules to your portal if stock and portal are " +"installed.\n" +"=============================================================================" +"=============\n" +" " +msgstr "" + +#. module: base +#: field:ir.actions.server,trigger_obj_id:0 +#: field:ir.model.fields,relation_field:0 +msgid "Relation Field" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_portal_project +msgid "" +"\n" +"This module adds project menu and features (tasks) to your portal if project " +"and portal are installed.\n" +"=============================================================================" +"=========================\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_module_configuration.py:38 +#, python-format +msgid "System Configuration done" +msgstr "" + +#. module: base +#: field:ir.attachment,db_datas:0 +msgid "Database Data" +msgstr "" + +#. module: base +#: model:res.country,name:base.tc +msgid "Turks and Caicos Islands" +msgstr "" + +#. module: base +#: field:workflow.triggers,instance_id:0 +msgid "Destination Instance" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,multi:0 +#: field:ir.actions.wizard,multi:0 +msgid "Action on Multiple Doc." +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_title_partner +#: model:ir.ui.menu,name:base.menu_partner_title_partner +msgid "Titles" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_anonymization +msgid "" +"\n" +"This module allows you to anonymize a database.\n" +"===============================================\n" +"\n" +"This module allows you to keep your data confidential for a given database.\n" +"This process is useful, if you want to use the migration process and " +"protect\n" +"your own or your customer’s confidential data. The principle is that you " +"run\n" +"an anonymization tool which will hide your confidential data(they are " +"replaced\n" +"by ‘XXX’ characters). Then you can send the anonymized database to the " +"migration\n" +"team. Once you get back your migrated database, you restore it and reverse " +"the\n" +"anonymization process to recover your previous data.\n" +" " +msgstr "" + +#. module: base +#: help:ir.sequence,implementation:0 +msgid "" +"Two sequence object implementations are offered: Standard and 'No gap'. The " +"later is slower than the former but forbids any gap in the sequence (while " +"they are possible in the former)." +msgstr "" + +#. module: base +#: model:res.country,name:base.gn +msgid "Guinea" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_diagram +msgid "OpenERP Web Diagram" +msgstr "" + +#. module: base +#: model:res.country,name:base.lu +msgid "Luxembourg" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_base_calendar +msgid "Personal & Shared Calendar" +msgstr "" + +#. module: base +#: selection:res.request,priority:0 +msgid "Low" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_ui_menu.py:379 +#, python-format +msgid "Error ! You can not create recursive Menu." +msgstr "" + +#. module: base +#: view:ir.translation:0 +msgid "Web-only translations" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "" +"3. If user belongs to several groups, the results from step 2 are combined " +"with logical OR operator" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_be +msgid "" +"\n" +"This is the base module to manage the accounting chart for Belgium in " +"OpenERP.\n" +"=============================================================================" +"=\n" +"\n" +"After installing this module, the Configuration wizard for accounting is " +"launched.\n" +" * We have the account templates which can be helpful to generate Charts " +"of Accounts.\n" +" * On that particular wizard, you will be asked to pass the name of the " +"company,\n" +" the chart template to follow, the no. of digits to generate, the code " +"for your\n" +" account and bank account, currency to create journals.\n" +"\n" +"Thus, the pure copy of Chart Template is generated.\n" +"\n" +"Wizards provided by this module:\n" +"--------------------------------\n" +" * Partner VAT Intra: Enlist the partners with their related VAT and " +"invoiced\n" +" amounts. Prepares an XML file format.\n" +" \n" +" **Path to access :** Invoicing/Reporting/Legal Reports/Belgium " +"Statements/Partner VAT Intra\n" +" * Periodical VAT Declaration: Prepares an XML file for Vat Declaration " +"of\n" +" the Main company of the User currently Logged in.\n" +" \n" +" **Path to access :** Invoicing/Reporting/Legal Reports/Belgium " +"Statements/Periodical VAT Declaration\n" +" * Annual Listing Of VAT-Subjected Customers: Prepares an XML file for " +"Vat\n" +" Declaration of the Main company of the User currently Logged in Based " +"on\n" +" Fiscal year.\n" +" \n" +" **Path to access :** Invoicing/Reporting/Legal Reports/Belgium " +"Statements/Annual Listing Of VAT-Subjected Customers\n" +"\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_gengo +msgid "Automated Translations through Gengo API" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_payment +msgid "Suppliers Payment Management" +msgstr "" + +#. module: base +#: model:res.country,name:base.sv +msgid "El Salvador" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:161 +#: field:res.bank,phone:0 +#: field:res.company,phone:0 +#: field:res.partner,phone:0 +#, python-format +msgid "Phone" +msgstr "" + +#. module: base +#: field:res.groups,menu_access:0 +msgid "Access Menu" +msgstr "" + +#. module: base +#: model:res.country,name:base.th +msgid "Thailand" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_change_password_wizard +msgid "Change Password Wizard" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_account_voucher +msgid "Send Invoices and Track Payments" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_crm_config_lead +msgid "Leads & Opportunities" +msgstr "" + +#. module: base +#: model:res.country,name:base.gg +msgid "Guernsey" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Romanian / română" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_mx +msgid "" +"\n" +"Minimal accounting configuration for Mexico.\n" +"============================================\n" +"\n" +"This Chart of account is a minimal proposal to be able to use OoB the \n" +"accounting feature of Openerp.\n" +"\n" +"This doesn't pretend be all the localization for MX it is just the minimal \n" +"data required to start from 0 in mexican localization.\n" +"\n" +"This modules and its content is updated frequently by openerp-mexico team.\n" +"\n" +"With this module you will have:\n" +"\n" +" - Minimal chart of account tested in production eviroments.\n" +" - Minimal chart of taxes, to comply with SAT_ requirements.\n" +"\n" +".. SAT: http://www.sat.gob.mx/\n" +" " +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_tr +msgid "" +"\n" +"Türkiye için Tek düzen hesap planı şablonu OpenERP Modülü.\n" +"==========================================================\n" +"\n" +"Bu modül kurulduktan sonra, Muhasebe yapılandırma sihirbazı çalışır\n" +" * Sihirbaz sizden hesap planı şablonu, planın kurulacağı şirket, banka " +"hesap\n" +" bilgileriniz, ilgili para birimi gibi bilgiler isteyecek.\n" +" " +msgstr "" + +#. module: base +#: selection:workflow.activity,join_mode:0 +#: selection:workflow.activity,split_mode:0 +msgid "And" +msgstr "" + +#. module: base +#: help:ir.values,res_id:0 +msgid "" +"Database identifier of the record to which this applies. 0 = for all records" +msgstr "" + +#. module: base +#: field:ir.model.fields,relation:0 +msgid "Object Relation" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_voucher +msgid "eInvoicing & Payments" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "General" +msgstr "" + +#. module: base +#: model:res.country,name:base.uz +msgid "Uzbekistan" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_act_window +#: selection:ir.ui.menu,action:0 +msgid "ir.actions.act_window" +msgstr "" + +#. module: base +#: model:res.country,name:base.vi +msgid "Virgin Islands (USA)" +msgstr "" + +#. module: base +#: model:res.country,name:base.tw +msgid "Taiwan" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_currency_rate +msgid "Currency Rate" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +#: field:base.module.upgrade,module_info:0 +msgid "Modules to Update" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_custom_multicompany +msgid "Multi-Companies" +msgstr "" + +#. module: base +#: field:workflow,osv:0 +#: view:workflow.instance:0 +#: field:workflow.instance,res_type:0 +msgid "Resource Object" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_crm_helpdesk +msgid "Helpdesk" +msgstr "" + +#. module: base +#: field:ir.rule,perm_write:0 +msgid "Apply for Write" +msgstr "" + +#. module: base +#: field:ir.ui.menu,parent_left:0 +msgid "Parent Left" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_document_page +msgid "" +"\n" +"Pages\n" +"=====\n" +"Web pages\n" +" " +msgstr "" + +#. module: base +#: help:ir.actions.server,code:0 +msgid "" +"Python code to be executed if condition is met.\n" +"It is a Python block that can use the same values as for the condition field" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.grant_menu_access +msgid "" +"Manage and customize the items available and displayed in your OpenERP " +"system menu. You can delete an item by clicking on the box at the beginning " +"of each line and then delete it through the button that appeared. Items can " +"be assigned to specific groups in order to make them accessible to some " +"users within the system." +msgstr "" + +#. module: base +#: field:ir.ui.view,field_parent:0 +msgid "Child Field" +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "Detailed algorithm:" +msgstr "" + +#. module: base +#: field:ir.actions.act_url,usage:0 +#: field:ir.actions.act_window,usage:0 +#: field:ir.actions.act_window_close,usage:0 +#: field:ir.actions.actions,usage:0 +#: field:ir.actions.client,usage:0 +#: field:ir.actions.report.xml,usage:0 +#: field:ir.actions.server,usage:0 +#: field:ir.actions.wizard,usage:0 +msgid "Action Usage" +msgstr "" + +#. module: base +#: field:ir.module.module,name:0 +msgid "Technical Name" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_workflow_workitem +msgid "workflow.workitem" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_tools +msgid "" +"Lets you install various interesting but non-essential tools like Survey, " +"Lunch and Ideas box." +msgstr "" + +#. module: base +#: selection:ir.module.module,state:0 +msgid "Not Installable" +msgstr "" + +#. module: base +#: help:res.lang,iso_code:0 +msgid "This ISO code is the name of po files to use for translations" +msgstr "" + +#. module: base +#: report:ir.module.reference:0 +msgid "View :" +msgstr "" + +#. module: base +#: field:ir.model.fields,view_load:0 +msgid "View Auto-Load" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_et +msgid "" +"\n" +"Base Module for Ethiopian Localization\n" +"======================================\n" +"\n" +"This is the latest Ethiopian OpenERP localization and consists of:\n" +" - Chart of Accounts\n" +" - VAT tax structure\n" +" - Withholding tax structure\n" +" - Regional State listings\n" +" " +msgstr "" + +#. module: base +#: view:res.users:0 +msgid "Allowed Companies" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_de +msgid "Deutschland - Accounting" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Day of the Year: %(doy)s" +msgstr "" + +#. module: base +#: field:ir.ui.menu,web_icon:0 +msgid "Web Icon File" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_view_base_module_upgrade +msgid "Apply Scheduled Upgrades" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_journal +msgid "Invoicing Journals" +msgstr "" + +#. module: base +#: help:ir.ui.view,groups_id:0 +msgid "" +"If this field is empty, the view applies to all users. Otherwise, the view " +"applies to the users of those groups only." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Persian / فارس" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "Export Settings" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,src_model:0 +msgid "Source Model" +msgstr "" + +#. module: base +#: view:ir.sequence:0 +msgid "Day of the Week (0:Monday): %(weekday)s" +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_module_upgrade.py:84 +#, python-format +msgid "Unmet dependency !" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:509 +#: code:addons/base/ir/ir_model.py:570 +#: code:addons/base/ir/ir_model.py:1031 +#, python-format +msgid "Administrator access is required to uninstall a module" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_base_module_configuration +msgid "base.module.configuration" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_point_of_sale +msgid "" +"\n" +"Quick and Easy sale process\n" +"===========================\n" +"\n" +"This module allows you to manage your shop sales very easily with a fully " +"web based touchscreen interface.\n" +"It is compatible with all PC tablets and the iPad, offering multiple payment " +"methods. \n" +"\n" +"Product selection can be done in several ways: \n" +"\n" +"* Using a barcode reader\n" +"* Browsing through categories of products or via a text search.\n" +"\n" +"Main Features\n" +"-------------\n" +"* Fast encoding of the sale\n" +"* Choose one payment method (the quick way) or split the payment between " +"several payment methods\n" +"* Computation of the amount of money to return\n" +"* Create and confirm the picking list automatically\n" +"* Allows the user to create an invoice automatically\n" +"* Refund previous sales\n" +" " +msgstr "" + +#. module: base +#: code:addons/orm.py:3568 +#: code:addons/orm.py:3861 +#, python-format +msgid "" +"The requested operation cannot be completed due to security restrictions. " +"Please contact your system administrator.\n" +"\n" +"(Document type: %s, Operation: %s)" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_idea +msgid "" +"\n" +"This module allows user to easily and efficiently participate in enterprise " +"innovation.\n" +"=============================================================================" +"==========\n" +"\n" +"It allows everybody to express ideas about different subjects.\n" +"Then, other users can comment on these ideas and vote for particular ideas.\n" +"Each idea has a score based on the different votes.\n" +"The managers can obtain an easy view of best ideas from all the users.\n" +"Once installed, check the menu 'Ideas' in the 'Tools' main menu." +msgstr "" + +#. module: base +#: code:addons/orm.py:5322 +#: code:addons/orm.py:5337 +#, python-format +msgid "" +"%s This might be '%s' in the current model, or a field of the same name in " +"an o2m." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_payment +msgid "" +"\n" +"Module to manage the payment of your supplier invoices.\n" +"=======================================================\n" +"\n" +"This module allows you to create and manage your payment orders, with " +"purposes to\n" +"-----------------------------------------------------------------------------" +"---- \n" +" * serve as base for an easy plug-in of various automated payment " +"mechanisms.\n" +" * provide a more efficient way to manage invoice payment.\n" +"\n" +"Warning:\n" +"~~~~~~~~\n" +"The confirmation of a payment order does _not_ create accounting entries, it " +"just \n" +"records the fact that you gave your payment order to your bank. The booking " +"of \n" +"your order must be encoded as usual through a bank statement. Indeed, it's " +"only \n" +"when you get the confirmation from your bank that your order has been " +"accepted \n" +"that you can book it in your accounting. To help you with that operation, " +"you \n" +"have a new option to import payment orders as bank statement lines.\n" +" " +msgstr "" + +#. module: base +#: field:ir.model,access_ids:0 +#: view:ir.model.access:0 +msgid "Access" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:165 +#: field:res.partner,vat:0 +#, python-format +msgid "TIN" +msgstr "" + +#. module: base +#: model:res.country,name:base.aw +msgid "Aruba" +msgstr "" + +#. module: base +#: code:addons/base/module/wizard/base_module_import.py:58 +#, python-format +msgid "File is not a zip file!" +msgstr "" + +#. module: base +#: model:res.country,name:base.ar +msgid "Argentina" +msgstr "" + +#. module: base +#: field:res.groups,full_name:0 +msgid "Group Name" +msgstr "" + +#. module: base +#: model:res.country,name:base.bh +msgid "Bahrain" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:162 +#: field:res.bank,fax:0 +#: field:res.company,fax:0 +#: field:res.partner,fax:0 +#, python-format +msgid "Fax" +msgstr "" + +#. module: base +#: view:ir.attachment:0 +#: field:ir.attachment,company_id:0 +#: field:ir.default,company_id:0 +#: field:ir.property,company_id:0 +#: field:ir.sequence,company_id:0 +#: field:ir.values,company_id:0 +#: view:res.company:0 +#: field:res.currency,company_id:0 +#: view:res.partner:0 +#: field:res.partner,company_id:0 +#: field:res.partner.bank,company_id:0 +#: view:res.users:0 +#: field:res.users,company_id:0 +msgid "Company" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_report_designer +msgid "Advanced Reporting" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_purchase +msgid "Purchase Orders, Receptions, Supplier Invoices" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_hr_payroll +msgid "" +"\n" +"Generic Payroll system.\n" +"=======================\n" +"\n" +" * Employee Details\n" +" * Employee Contracts\n" +" * Passport based Contract\n" +" * Allowances/Deductions\n" +" * Allow to configure Basic/Gross/Net Salary\n" +" * Employee Payslip\n" +" * Monthly Payroll Register\n" +" * Integrated with Holiday Management\n" +" " +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_model_data +msgid "ir.model.data" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Bulgarian / български език" +msgstr "" + +#. module: base +#: model:ir.ui.menu,name:base.menu_aftersale +msgid "After-Sale Services" +msgstr "" + +#. module: base +#: field:base.language.import,code:0 +msgid "ISO Code" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_fr +msgid "France - Accounting" +msgstr "" + +#. module: base +#: view:ir.actions.todo:0 +msgid "Launch" +msgstr "" + +#. module: base +#: selection:res.partner,type:0 +msgid "Shipping" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project_mrp +msgid "" +"\n" +"Automatically creates project tasks from procurement lines.\n" +"===========================================================\n" +"\n" +"This module will automatically create a new task for each procurement order " +"line\n" +"(e.g. for sale order lines), if the corresponding product meets the " +"following\n" +"characteristics:\n" +"\n" +" * Product Type = Service\n" +" * Procurement Method (Order fulfillment) = MTO (Make to Order)\n" +" * Supply/Procurement Method = Manufacture\n" +"\n" +"If on top of that a projet is specified on the product form (in the " +"Procurement\n" +"tab), then the new task will be created in that specific project. Otherwise, " +"the\n" +"new task will not belong to any project, and may be added to a project " +"manually\n" +"later.\n" +"\n" +"When the project task is completed or cancelled, the workflow of the " +"corresponding\n" +"procurement line is updated accordingly. For example, if this procurement " +"corresponds\n" +"to a sale order line, the sale order line will be considered delivered when " +"the\n" +"task is completed.\n" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,limit:0 +msgid "Limit" +msgstr "" + +#. module: base +#: model:res.groups,name:base.group_hr_user +msgid "Officer" +msgstr "" + +#. module: base +#: code:addons/orm.py:787 +#, python-format +msgid "Serialization field `%s` not found for sparse field `%s`!" +msgstr "" + +#. module: base +#: model:res.country,name:base.jm +msgid "Jamaica" +msgstr "" + +#. module: base +#: field:res.partner,color:0 +msgid "Color Index" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_partner_category_form +msgid "" +"Manage the partner categories in order to better classify them for tracking " +"and analysis purposes. A partner may belong to several categories and " +"categories have a hierarchy structure: a partner belonging to a category " +"also belong to his parent category." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_survey +msgid "" +"\n" +"This module is used for surveying.\n" +"==================================\n" +"\n" +"It depends on the answers or reviews of some questions by different users. " +"A\n" +"survey may have multiple pages. Each page may contain multiple questions and " +"each\n" +"question may have multiple answers. Different users may give different " +"answers of\n" +"question and according to that survey is done. Partners are also sent mails " +"with\n" +"user name and password for the invitation of the survey.\n" +" " +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:165 +#, python-format +msgid "Model '%s' contains module data and cannot be removed!" +msgstr "" + +#. module: base +#: model:res.country,name:base.az +msgid "Azerbaijan" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_mail_server.py:481 +#: code:addons/base/ir/ir_sequence.py:259 +#: code:addons/base/res/res_partner.py:360 +#: code:addons/base/res/res_partner.py:566 +#, python-format +msgid "Warning" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_edi +msgid "Electronic Data Interchange (EDI)" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_account_anglo_saxon +msgid "Anglo-Saxon Accounting" +msgstr "" + +#. module: base +#: model:res.country,name:base.vg +msgid "Virgin Islands (British)" +msgstr "" + +#. module: base +#: view:ir.property:0 +#: model:ir.ui.menu,name:base.menu_ir_property +msgid "Parameters" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Czech / Čeština" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_generic_modules +msgid "Generic Modules" +msgstr "" + +#. module: base +#: model:res.country,name:base.mk +msgid "Macedonia, the former Yugoslav Republic of" +msgstr "" + +#. module: base +#: model:res.country,name:base.rw +msgid "Rwanda" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_auth_openid +msgid "" +"\n" +"Allow users to login through OpenID.\n" +"====================================\n" +msgstr "" + +#. module: base +#: help:ir.mail_server,smtp_port:0 +msgid "SMTP Port. Usually 465 for SSL, and 25 or 587 for other cases." +msgstr "" + +#. module: base +#: model:res.country,name:base.ck +msgid "Cook Islands" +msgstr "" + +#. module: base +#: field:ir.model.data,noupdate:0 +msgid "Non Updatable" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Klingon" +msgstr "" + +#. module: base +#: model:res.country,name:base.sg +msgid "Singapore" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window,target:0 +msgid "Current Window" +msgstr "" + +#. module: base +#: model:ir.module.category,name:base.module_category_hidden +#: view:res.users:0 +msgid "Technical Settings" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_accounting_and_finance +msgid "" +"Helps you handle your accounting needs, if you are not an accountant, we " +"suggest you to install only the Invoicing." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_plugin_thunderbird +msgid "Thunderbird Plug-In" +msgstr "" + +#. module: base +#: model:ir.module.module,summary:base.module_event +msgid "Trainings, Conferences, Meetings, Exhibitions, Registrations" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_country +#: view:res.bank:0 +#: field:res.bank,country:0 +#: view:res.company:0 +#: field:res.company,country_id:0 +#: view:res.country:0 +#: field:res.country.state,country_id:0 +#: view:res.partner:0 +#: field:res.partner,country:0 +#: field:res.partner,country_id:0 +#: view:res.partner.bank:0 +#: field:res.partner.bank,country_id:0 +#: view:res.users:0 +msgid "Country" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_15 +msgid "Wholesaler" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_base_vat +msgid "VAT Number Validation" +msgstr "" + +#. module: base +#: field:ir.model.fields,complete_name:0 +msgid "Complete Name" +msgstr "" + +#. module: base +#: help:ir.actions.wizard,multi:0 +msgid "" +"If set to true, the wizard will not be displayed on the right toolbar of a " +"form view." +msgstr "" + +#. module: base +#: view:ir.values:0 +msgid "Action Bindings/Defaults" +msgstr "" + +#. module: base +#: view:base.language.export:0 +msgid "" +"file encoding, please be sure to view and edit\n" +" using the same encoding." +msgstr "" + +#. module: base +#: view:ir.rule:0 +msgid "" +"1. Global rules are combined together with a logical AND operator, and with " +"the result of the following steps" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_nl +msgid "Netherlands - Accounting" +msgstr "" + +#. module: base +#: model:res.country,name:base.gs +msgid "South Georgia and the South Sandwich Islands" +msgstr "" + +#. module: base +#: view:res.lang:0 +msgid "%X - Appropriate time representation." +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Spanish (SV) / Español (SV)" +msgstr "" + +#. module: base +#: help:res.lang,grouping:0 +msgid "" +"The Separator Format should be like [,n] where 0 < n :starting from Unit " +"digit.-1 will end the separation. e.g. [3,2,-1] will represent 106500 to be " +"1,06,500;[1,2,-1] will represent it to be 106,50,0;[3] will represent it as " +"106,500. Provided ',' as the thousand separator in each case." +msgstr "" + +#. module: base +#: field:ir.module.module,auto_install:0 +msgid "Automatic Installation" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_l10n_hn +msgid "" +"\n" +"This is the base module to manage the accounting chart for Honduras.\n" +"====================================================================\n" +" \n" +"Agrega una nomenclatura contable para Honduras. También incluye impuestos y " +"la\n" +"moneda Lempira. -- Adds accounting chart for Honduras. It also includes " +"taxes\n" +"and the Lempira currency." +msgstr "" + +#. module: base +#: model:res.country,name:base.jp +msgid "Japan" +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_model.py:418 +#, python-format +msgid "Can only rename one column at a time!" +msgstr "" + +#. module: base +#: selection:ir.translation,type:0 +msgid "Report/Template" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_budget +msgid "" +"\n" +"This module allows accountants to manage analytic and crossovered budgets.\n" +"==========================================================================\n" +"\n" +"Once the Budgets are defined (in Invoicing/Budgets/Budgets), the Project " +"Managers \n" +"can set the planned amount on each Analytic Account.\n" +"\n" +"The accountant has the possibility to see the total of amount planned for " +"each\n" +"Budget in order to ensure the total planned is not greater/lower than what " +"he \n" +"planned for this Budget. Each list of record can also be switched to a " +"graphical \n" +"view of it.\n" +"\n" +"Three reports are available:\n" +"----------------------------\n" +" 1. The first is available from a list of Budgets. It gives the " +"spreading, for \n" +" these Budgets, of the Analytic Accounts.\n" +"\n" +" 2. The second is a summary of the previous one, it only gives the " +"spreading, \n" +" for the selected Budgets, of the Analytic Accounts.\n" +"\n" +" 3. The last one is available from the Analytic Chart of Accounts. It " +"gives \n" +" the spreading, for the selected Analytic Accounts of Budgets.\n" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window.view,view_mode:0 +#: selection:ir.ui.view,type:0 +msgid "Graph" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_ir_actions_server +#: selection:ir.ui.menu,action:0 +msgid "ir.actions.server" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ca +msgid "Canada - Accounting" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_co +msgid "Colombian - Accounting" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_account_voucher +msgid "" +"\n" +"Invoicing & Payments by Accounting Voucher & Receipts\n" +"=====================================================\n" +"The specific and easy-to-use Invoicing system in OpenERP allows you to keep " +"track of your accounting, even when you are not an accountant. It provides " +"an easy way to follow up on your suppliers and customers. \n" +"\n" +"You could use this simplified accounting in case you work with an (external) " +"account to keep your books, and you still want to keep track of payments. \n" +"\n" +"The Invoicing system includes receipts and vouchers (an easy way to keep " +"track of sales and purchases). It also offers you an easy method of " +"registering payments, without having to encode complete abstracts of " +"account.\n" +"\n" +"This module manages:\n" +"\n" +"* Voucher Entry\n" +"* Voucher Receipt [Sales & Purchase]\n" +"* Voucher Payment [Customer & Supplier]\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.act_ir_actions_todo_form +#: model:ir.model,name:base.model_ir_actions_todo +#: model:ir.ui.menu,name:base.menu_ir_actions_todo +#: model:ir.ui.menu,name:base.menu_ir_actions_todo_form +msgid "Configuration Wizards" +msgstr "" + +#. module: base +#: field:res.lang,code:0 +msgid "Locale Code" +msgstr "" + +#. module: base +#: field:workflow.activity,split_mode:0 +msgid "Split Mode" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +msgid "Note that this operation might take a few minutes." +msgstr "" + +#. module: base +#: code:addons/base/ir/ir_fields.py:363 +#, python-format +msgid "" +"Ambiguous specification for field '%(field)s', only provide one of name, " +"external id or database id" +msgstr "" + +#. module: base +#: field:ir.sequence,implementation:0 +msgid "Implementation" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_ve +msgid "Venezuela - Accounting" +msgstr "" + +#. module: base +#: model:res.country,name:base.cl +msgid "Chile" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_web_view_editor +msgid "View Editor" +msgstr "" + +#. module: base +#: view:ir.cron:0 +msgid "Execution" +msgstr "" + +#. module: base +#: field:ir.actions.server,condition:0 +#: view:ir.values:0 +#: field:workflow.transition,condition:0 +msgid "Condition" +msgstr "" + +#. module: base +#: model:ir.actions.client,name:base.modules_updates_act_cl +#: model:ir.ui.menu,name:base.menu_module_updates +msgid "Updates" +msgstr "" + +#. module: base +#: help:res.currency,rate:0 +msgid "The rate of the currency to the currency of rate 1." +msgstr "" + +#. module: base +#: field:ir.ui.view,name:0 +msgid "View Name" +msgstr "" + +#. module: base +#: model:ir.model,name:base.model_res_groups +msgid "Access Groups" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Italian / Italiano" +msgstr "" + +#. module: base +#: view:ir.actions.server:0 +msgid "" +"Only one client action will be executed, last client action will be " +"considered in case of multiple client actions." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_mrp_jit +msgid "" +"\n" +"This module allows Just In Time computation of procurement orders.\n" +"==================================================================\n" +"\n" +"If you install this module, you will not have to run the regular " +"procurement\n" +"scheduler anymore (but you still need to run the minimum order point rule\n" +"scheduler, or for example let it run daily).\n" +"All procurement orders will be processed immediately, which could in some\n" +"cases entail a small performance impact.\n" +"\n" +"It may also increase your stock size because products are reserved as soon\n" +"as possible and the scheduler time range is not taken into account anymore.\n" +"In that case, you can not use priorities any more on the different picking.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.hr +msgid "Croatia" +msgstr "" + +#. module: base +#: view:ir.module.module:0 +msgid "" +"Do you confirm the uninstallation of this module? This will permanently " +"erase all data currently stored by the module!" +msgstr "" + +#. module: base +#: field:ir.actions.server,mobile:0 +msgid "Mobile No" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.action_partner_by_category +#: model:ir.actions.act_window,name:base.action_partner_category_form +#: model:ir.model,name:base.model_res_partner_category +#: view:res.partner.category:0 +msgid "Partner Categories" +msgstr "" + +#. module: base +#: view:base.module.upgrade:0 +msgid "System Update" +msgstr "" + +#. module: base +#: field:ir.actions.report.xml,report_sxw_content:0 +#: field:ir.actions.report.xml,report_sxw_content_data:0 +msgid "SXW Content" +msgstr "" + +#. module: base +#: field:ir.attachment,file_size:0 +msgid "File Size" +msgstr "" + +#. module: base +#: help:ir.sequence,prefix:0 +msgid "Prefix value of the record for the sequence" +msgstr "" + +#. module: base +#: model:res.country,name:base.sc +msgid "Seychelles" +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_4 +msgid "Gold" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:173 +#: model:ir.actions.act_window,name:base.action_res_partner_bank_account_form +#: model:ir.model,name:base.model_res_partner_bank +#: model:ir.ui.menu,name:base.menu_action_res_partner_bank_form +#: view:res.company:0 +#: field:res.company,bank_ids:0 +#: view:res.partner.bank:0 +#, python-format +msgid "Bank Accounts" +msgstr "" + +#. module: base +#: model:res.country,name:base.sl +msgid "Sierra Leone" +msgstr "" + +#. module: base +#: view:res.company:0 +msgid "General Information" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_l10n_pt +msgid "Portugal - Chart of Accounts" +msgstr "" + +#. module: base +#: field:ir.model.data,complete_name:0 +msgid "Complete ID" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_stock +msgid "" +"\n" +"Manage multi-warehouses, multi- and structured stock locations\n" +"==============================================================\n" +"\n" +"The warehouse and inventory management is based on a hierarchical location " +"structure, from warehouses to storage bins. \n" +"The double entry inventory system allows you to manage customers, suppliers " +"as well as manufacturing inventories. \n" +"\n" +"OpenERP has the capacity to manage lots and serial numbers ensuring " +"compliance with the traceability requirements imposed by the majority of " +"industries.\n" +"\n" +"Key Features\n" +"------------\n" +"* Moves history and planning,\n" +"* Stock valuation (standard or average price, ...)\n" +"* Robustness faced with Inventory differences\n" +"* Automatic reordering rules\n" +"* Support for barcodes\n" +"* Rapid detection of mistakes through double entry system\n" +"* Traceability (Upstream / Downstream, Serial numbers, ...)\n" +"\n" +"Dashboard / Reports for Warehouse Management will include:\n" +"----------------------------------------------------------\n" +"* Incoming Products (Graph)\n" +"* Outgoing Products (Graph)\n" +"* Procurement in Exception\n" +"* Inventory Analysis\n" +"* Last Product Inventories\n" +"* Moves Analysis\n" +" " +msgstr "" + +#. module: base +#: help:res.partner,vat:0 +msgid "" +"Tax Identification Number. Check the box if this contact is subjected to " +"taxes. Used by the some of the legal statements." +msgstr "" +"Número de identificación Tributaria. Marque la casilla si el contacto está " +"sujeto a impuestos. Usado por algunos documentos legales." + +#. module: base +#: field:res.partner.bank,partner_id:0 +msgid "Account Owner" +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_procurement +msgid "" +"\n" +"This is the module for computing Procurements.\n" +"==============================================\n" +"\n" +"In the MRP process, procurements orders are created to launch manufacturing\n" +"orders, purchase orders, stock allocations. Procurement orders are\n" +"generated automatically by the system and unless there is a problem, the\n" +"user will not be notified. In case of problems, the system will raise some\n" +"procurement exceptions to inform the user about blocking problems that need\n" +"to be resolved manually (like, missing BoM structure or missing supplier).\n" +"\n" +"The procurement order will schedule a proposal for automatic procurement\n" +"for the product which needs replenishment. This procurement will start a\n" +"task, either a purchase order form for the supplier, or a production order\n" +"depending on the product's configuration.\n" +" " +msgstr "" + +#. module: base +#: model:ir.actions.act_window,name:base.open_module_tree +#: model:ir.ui.menu,name:base.menu_module_tree +msgid "Installed Modules" +msgstr "" + +#. module: base +#: code:addons/base/res/res_users.py:170 +#, python-format +msgid "Company Switch Warning" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_manufacturing +msgid "" +"Helps you manage your manufacturing processes and generate reports on those " +"processes." +msgstr "" + +#. module: base +#: help:ir.sequence,number_increment:0 +msgid "The next number of the sequence will be incremented by this number" +msgstr "" + +#. module: base +#: selection:workflow.activity,kind:0 +msgid "Function" +msgstr "" + +#. module: base +#: field:ir.ui.menu,parent_right:0 +msgid "Parent Right" +msgstr "" + +#. module: base +#: model:ir.module.category,description:base.module_category_customer_relationship_management +msgid "" +"Manage relations with prospects and customers using leads, opportunities, " +"requests or issues." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_project +msgid "" +"\n" +"Track multi-level projects, tasks, work done on tasks\n" +"=====================================================\n" +"\n" +"This application allows an operational project management system to organize " +"your activities into tasks and plan the work you need to get the tasks " +"completed.\n" +"\n" +"Gantt diagrams will give you a graphical representation of your project " +"plans, as well as resources availability and workload.\n" +"\n" +"Dashboard / Reports for Project Management will include:\n" +"--------------------------------------------------------\n" +"* My Tasks\n" +"* Open Tasks\n" +"* Tasks Analysis\n" +"* Cumulative Flow\n" +" " +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Internal Notes" +msgstr "" + +#. module: base +#: model:res.partner.title,name:base.res_partner_title_pvt_ltd +#: model:res.partner.title,shortcut:base.res_partner_title_pvt_ltd +msgid "Corp." +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_purchase_requisition +msgid "Purchase Requisitions" +msgstr "" + +#. module: base +#: selection:ir.actions.act_window,target:0 +msgid "Inline Edit" +msgstr "" + +#. module: base +#: selection:ir.cron,interval_type:0 +msgid "Months" +msgstr "" + +#. module: base +#: view:workflow.instance:0 +msgid "Workflow Instances" +msgstr "" + +#. module: base +#: code:addons/base/res/res_partner.py:684 +#, python-format +msgid "Partners: " +msgstr "" + +#. module: base +#: view:res.partner:0 +msgid "Is a Company?" +msgstr "" + +#. module: base +#: code:addons/base/res/res_company.py:173 +#: field:res.partner.bank,name:0 +#, python-format +msgid "Bank Account" +msgstr "" + +#. module: base +#: model:res.country,name:base.kp +msgid "North Korea" +msgstr "" + +#. module: base +#: selection:ir.actions.server,state:0 +msgid "Create Object" +msgstr "" + +#. module: base +#: model:res.country,name:base.ss +msgid "South Sudan" +msgstr "" + +#. module: base +#: field:ir.filters,context:0 +msgid "Context" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_sale_mrp +msgid "Sales and MRP Management" +msgstr "" + +#. module: base +#: model:ir.actions.act_window,help:base.action_partner_form +msgid "" +"

\n" +" Click to add a contact in your address book.\n" +"

\n" +" OpenERP helps you easily track all activities related to\n" +" a customer; discussions, history of business opportunities,\n" +" documents, etc.\n" +"

\n" +" " +msgstr "" + +#. module: base +#: model:res.partner.category,name:base.res_partner_category_2 +msgid "Prospect" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_stock_invoice_directly +msgid "Invoice Picking Directly" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Polish / Język polski" +msgstr "" + +#. module: base +#: field:ir.exports,name:0 +msgid "Export Name" +msgstr "" + +#. module: base +#: help:res.partner,type:0 +msgid "" +"Used to select automatically the right address according to the context in " +"sales and purchases documents." +msgstr "" + +#. module: base +#: model:ir.module.module,description:base.module_purchase_analytic_plans +msgid "" +"\n" +"The base module to manage analytic distribution and purchase orders.\n" +"====================================================================\n" +"\n" +"Allows the user to maintain several analysis plans. These let you split a " +"line\n" +"on a supplier purchase order into several accounts and analytic plans.\n" +" " +msgstr "" + +#. module: base +#: model:res.country,name:base.lk +msgid "Sri Lanka" +msgstr "" + +#. module: base +#: field:ir.actions.act_window,search_view:0 +msgid "Search View" +msgstr "" + +#. module: base +#: selection:base.language.install,lang:0 +msgid "Russian / русский язык" +msgstr "" + +#. module: base +#: model:ir.module.module,shortdesc:base.module_auth_signup +msgid "Signup" +msgstr "" From 0d7ea5d74e27da850221e778c23fd4a097a681cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 13 Sep 2013 09:59:15 +0200 Subject: [PATCH 110/110] [REF] crm, sale_crm: updated modules due to move of gauge and sparkline modules into web modules bzr revid: tde@openerp.com-20130913075915-bagnbdw6qsexcul0 --- addons/crm/__openerp__.py | 4 +- addons/crm/crm_case_section_view.xml | 4 +- .../static/lib/sparkline/jquery.sparkline.js | 3047 ----------------- addons/crm/static/src/js/crm_case_section.js | 22 - addons/sale_crm/__openerp__.py | 3 +- addons/sale_crm/sale_crm_view.xml | 4 +- addons/sale_crm/static/lib/justgage.js | 883 ----- addons/sale_crm/static/src/js/sale_crm.js | 108 - 8 files changed, 7 insertions(+), 4068 deletions(-) delete mode 100644 addons/crm/static/lib/sparkline/jquery.sparkline.js delete mode 100644 addons/sale_crm/static/lib/justgage.js delete mode 100644 addons/sale_crm/static/src/js/sale_crm.js diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py index b677e7ee10f..e3443d5200f 100644 --- a/addons/crm/__openerp__.py +++ b/addons/crm/__openerp__.py @@ -57,7 +57,8 @@ Dashboard for CRM will include: 'base_calendar', 'resource', 'board', - 'fetchmail' + 'fetchmail', + 'web_kanban_sparkline', ], 'data': [ 'crm_data.xml', @@ -122,7 +123,6 @@ Dashboard for CRM will include: 'static/src/css/crm.css' ], 'js': [ - 'static/lib/sparkline/jquery.sparkline.js', 'static/src/js/crm_case_section.js', ], 'installable': True, diff --git a/addons/crm/crm_case_section_view.xml b/addons/crm/crm_case_section_view.xml index 24862a39e89..99b3296c3c1 100644 --- a/addons/crm/crm_case_section_view.xml +++ b/addons/crm/crm_case_section_view.xml @@ -99,11 +99,11 @@
diff --git a/addons/crm/static/lib/sparkline/jquery.sparkline.js b/addons/crm/static/lib/sparkline/jquery.sparkline.js deleted file mode 100644 index c003923e03b..00000000000 --- a/addons/crm/static/lib/sparkline/jquery.sparkline.js +++ /dev/null @@ -1,3047 +0,0 @@ -/** -* -* jquery.sparkline.js -* -* v2.1.1 -* (c) Splunk, Inc -* Contact: Gareth Watts (gareth@splunk.com) -* http://omnipotent.net/jquery.sparkline/ -* -* Generates inline sparkline charts from data supplied either to the method -* or inline in HTML -* -* Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag -* (Firefox 2.0+, Safari, Opera, etc) -* -* License: New BSD License -* -* Copyright (c) 2012, Splunk Inc. -* All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, -* are permitted provided that the following conditions are met: -* -* * Redistributions of source code must retain the above copyright notice, -* this list of conditions and the following disclaimer. -* * Redistributions in binary form must reproduce the above copyright notice, -* this list of conditions and the following disclaimer in the documentation -* and/or other materials provided with the distribution. -* * Neither the name of Splunk Inc nor the names of its contributors may -* be used to endorse or promote products derived from this software without -* specific prior written permission. -* -* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT -* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT -* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* -* Usage: -* $(selector).sparkline(values, options) -* -* If values is undefined or set to 'html' then the data values are read from the specified tag: -*

Sparkline: 1,4,6,6,8,5,3,5

-* $('.sparkline').sparkline(); -* There must be no spaces in the enclosed data set -* -* Otherwise values must be an array of numbers or null values -*

Sparkline: This text replaced if the browser is compatible

-* $('#sparkline1').sparkline([1,4,6,6,8,5,3,5]) -* $('#sparkline2').sparkline([1,4,6,null,null,5,3,5]) -* -* Values can also be specified in an HTML comment, or as a values attribute: -*

Sparkline:

-*

Sparkline:

-* $('.sparkline').sparkline(); -* -* For line charts, x values can also be specified: -*

Sparkline: 1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5

-* $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ]) -* -* By default, options should be passed in as teh second argument to the sparkline function: -* $('.sparkline').sparkline([1,2,3,4], {type: 'bar'}) -* -* Options can also be set by passing them on the tag itself. This feature is disabled by default though -* as there's a slight performance overhead: -* $('.sparkline').sparkline([1,2,3,4], {enableTagOptions: true}) -*

Sparkline: loading

-* Prefix all options supplied as tag attribute with "spark" (configurable by setting tagOptionPrefix) -* -* Supported options: -* lineColor - Color of the line used for the chart -* fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart -* width - Width of the chart - Defaults to 3 times the number of values in pixels -* height - Height of the chart - Defaults to the height of the containing element -* chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied -* chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied -* chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax -* chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied -* chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied -* composite - If true then don't erase any existing chart attached to the tag, but draw -* another chart over the top - Note that width and height are ignored if an -* existing chart is detected. -* tagValuesAttribute - Name of tag attribute to check for data values - Defaults to 'values' -* enableTagOptions - Whether to check tags for sparkline options -* tagOptionPrefix - Prefix used for options supplied as tag attributes - Defaults to 'spark' -* disableHiddenCheck - If set to true, then the plugin will assume that charts will never be drawn into a -* hidden dom element, avoding a browser reflow -* disableInteraction - If set to true then all mouseover/click interaction behaviour will be disabled, -* making the plugin perform much like it did in 1.x -* disableTooltips - If set to true then tooltips will be disabled - Defaults to false (tooltips enabled) -* disableHighlight - If set to true then highlighting of selected chart elements on mouseover will be disabled -* defaults to false (highlights enabled) -* highlightLighten - Factor to lighten/darken highlighted chart values by - Defaults to 1.4 for a 40% increase -* tooltipContainer - Specify which DOM element the tooltip should be rendered into - defaults to document.body -* tooltipClassname - Optional CSS classname to apply to tooltips - If not specified then a default style will be applied -* tooltipOffsetX - How many pixels away from the mouse pointer to render the tooltip on the X axis -* tooltipOffsetY - How many pixels away from the mouse pointer to render the tooltip on the r axis -* tooltipFormatter - Optional callback that allows you to override the HTML displayed in the tooltip -* callback is given arguments of (sparkline, options, fields) -* tooltipChartTitle - If specified then the tooltip uses the string specified by this setting as a title -* tooltipFormat - A format string or SPFormat object (or an array thereof for multiple entries) -* to control the format of the tooltip -* tooltipPrefix - A string to prepend to each field displayed in a tooltip -* tooltipSuffix - A string to append to each field displayed in a tooltip -* tooltipSkipNull - If true then null values will not have a tooltip displayed (defaults to true) -* tooltipValueLookups - An object or range map to map field values to tooltip strings -* (eg. to map -1 to "Lost", 0 to "Draw", and 1 to "Win") -* numberFormatter - Optional callback for formatting numbers in tooltips -* numberDigitGroupSep - Character to use for group separator in numbers "1,234" - Defaults to "," -* numberDecimalMark - Character to use for the decimal point when formatting numbers - Defaults to "." -* numberDigitGroupCount - Number of digits between group separator - Defaults to 3 -* -* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default), -* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box' -* line - Line chart. Options: -* spotColor - Set to '' to not end each line in a circular spot -* minSpotColor - If set, color of spot at minimum value -* maxSpotColor - If set, color of spot at maximum value -* spotRadius - Radius in pixels -* lineWidth - Width of line in pixels -* normalRangeMin -* normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal" -* or expected range of values -* normalRangeColor - Color to use for the above bar -* drawNormalOnTop - Draw the normal range above the chart fill color if true -* defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart -* highlightSpotColor - The color to use for drawing a highlight spot on mouseover - Set to null to disable -* highlightLineColor - The color to use for drawing a highlight line on mouseover - Set to null to disable -* valueSpots - Specify which points to draw spots on, and in which color. Accepts a range map -* -* bar - Bar chart. Options: -* barColor - Color of bars for postive values -* negBarColor - Color of bars for negative values -* zeroColor - Color of bars with zero values -* nullColor - Color of bars with null values - Defaults to omitting the bar entirely -* barWidth - Width of bars in pixels -* colorMap - Optional mappnig of values to colors to override the *BarColor values above -* can be an Array of values to control the color of individual bars or a range map -* to specify colors for individual ranges of values -* barSpacing - Gap between bars in pixels -* zeroAxis - Centers the y-axis around zero if true -* -* tristate - Charts values of win (>0), lose (<0) or draw (=0) -* posBarColor - Color of win values -* negBarColor - Color of lose values -* zeroBarColor - Color of draw values -* barWidth - Width of bars in pixels -* barSpacing - Gap between bars in pixels -* colorMap - Optional mappnig of values to colors to override the *BarColor values above -* can be an Array of values to control the color of individual bars or a range map -* to specify colors for individual ranges of values -* -* discrete - Options: -* lineHeight - Height of each line in pixels - Defaults to 30% of the graph height -* thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor -* thresholdColor -* -* bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ... -* options: -* targetColor - The color of the vertical target marker -* targetWidth - The width of the target marker in pixels -* performanceColor - The color of the performance measure horizontal bar -* rangeColors - Colors to use for each qualitative range background color -* -* pie - Pie chart. Options: -* sliceColors - An array of colors to use for pie slices -* offset - Angle in degrees to offset the first slice - Try -90 or +90 -* borderWidth - Width of border to draw around the pie chart, in pixels - Defaults to 0 (no border) -* borderColor - Color to use for the pie chart border - Defaults to #000 -* -* box - Box plot. Options: -* raw - Set to true to supply pre-computed plot points as values -* values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier -* When set to false you can supply any number of values and the box plot will -* be computed for you. Default is false. -* showOutliers - Set to true (default) to display outliers as circles -* outlierIQR - Interquartile range used to determine outliers. Default 1.5 -* boxLineColor - Outline color of the box -* boxFillColor - Fill color for the box -* whiskerColor - Line color used for whiskers -* outlierLineColor - Outline color of outlier circles -* outlierFillColor - Fill color of the outlier circles -* spotRadius - Radius of outlier circles -* medianColor - Line color of the median line -* target - Draw a target cross hair at the supplied value (default undefined) -* -* -* -* Examples: -* $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false }); -* $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 }); -* $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }): -* $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' }); -* $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' }); -* $('#pie').sparkline([1,1,2], { type:'pie' }); -*/ - -/*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */ - -(function(factory) { - if(typeof define === 'function' && define.amd) { - define(['jquery'], factory); - } - else { - factory(jQuery); - } -} -(function($) { - 'use strict'; - - var UNSET_OPTION = {}, - getDefaults, createClass, SPFormat, clipval, quartile, normalizeValue, normalizeValues, - remove, isNumber, all, sum, addCSS, ensureArray, formatNumber, RangeMap, - MouseHandler, Tooltip, barHighlightMixin, - line, bar, tristate, discrete, bullet, pie, box, defaultStyles, initStyles, - VShape, VCanvas_base, VCanvas_canvas, VCanvas_vml, pending, shapeCount = 0; - - /** - * Default configuration settings - */ - getDefaults = function () { - return { - // Settings common to most/all chart types - common: { - type: 'line', - lineColor: '#00f', - fillColor: '#cdf', - defaultPixelsPerValue: 3, - width: 'auto', - height: 'auto', - composite: false, - tagValuesAttribute: 'values', - tagOptionsPrefix: 'spark', - enableTagOptions: false, - enableHighlight: true, - highlightLighten: 1.4, - tooltipSkipNull: true, - tooltipPrefix: '', - tooltipSuffix: '', - disableHiddenCheck: false, - numberFormatter: false, - numberDigitGroupCount: 3, - numberDigitGroupSep: ',', - numberDecimalMark: '.', - disableTooltips: false, - disableInteraction: false - }, - // Defaults for line charts - line: { - spotColor: '#f80', - highlightSpotColor: '#5f5', - highlightLineColor: '#f22', - spotRadius: 1.5, - minSpotColor: '#f80', - maxSpotColor: '#f80', - lineWidth: 1, - normalRangeMin: undefined, - normalRangeMax: undefined, - normalRangeColor: '#ccc', - drawNormalOnTop: false, - chartRangeMin: undefined, - chartRangeMax: undefined, - chartRangeMinX: undefined, - chartRangeMaxX: undefined, - tooltipFormat: new SPFormat(' {{prefix}}{{y}}{{suffix}}') - }, - // Defaults for bar charts - bar: { - barColor: '#3366cc', - negBarColor: '#f44', - stackedBarColor: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', - '#dd4477', '#0099c6', '#990099'], - zeroColor: undefined, - nullColor: undefined, - zeroAxis: true, - barWidth: 4, - barSpacing: 1, - chartRangeMax: undefined, - chartRangeMin: undefined, - chartRangeClip: false, - colorMap: undefined, - tooltipFormat: new SPFormat(' {{prefix}}{{value}}{{suffix}}') - }, - // Defaults for tristate charts - tristate: { - barWidth: 4, - barSpacing: 1, - posBarColor: '#6f6', - negBarColor: '#f44', - zeroBarColor: '#999', - colorMap: {}, - tooltipFormat: new SPFormat(' {{value:map}}'), - tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } } - }, - // Defaults for discrete charts - discrete: { - lineHeight: 'auto', - thresholdColor: undefined, - thresholdValue: 0, - chartRangeMax: undefined, - chartRangeMin: undefined, - chartRangeClip: false, - tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}') - }, - // Defaults for bullet charts - bullet: { - targetColor: '#f33', - targetWidth: 3, // width of the target bar in pixels - performanceColor: '#33f', - rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'], - base: undefined, // set this to a number to change the base start number - tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'), - tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} } - }, - // Defaults for pie charts - pie: { - offset: 0, - sliceColors: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', - '#dd4477', '#0099c6', '#990099'], - borderWidth: 0, - borderColor: '#000', - tooltipFormat: new SPFormat(' {{value}} ({{percent.1}}%)') - }, - // Defaults for box plots - box: { - raw: false, - boxLineColor: '#000', - boxFillColor: '#cdf', - whiskerColor: '#000', - outlierLineColor: '#333', - outlierFillColor: '#fff', - medianColor: '#f00', - showOutliers: true, - outlierIQR: 1.5, - spotRadius: 1.5, - target: undefined, - targetColor: '#4a2', - chartRangeMax: undefined, - chartRangeMin: undefined, - tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'), - tooltipFormatFieldlistKey: 'field', - tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median', - uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier', - lw: 'Left Whisker', rw: 'Right Whisker'} } - } - }; - }; - - // You can have tooltips use a css class other than jqstooltip by specifying tooltipClassname - defaultStyles = '.jqstooltip { ' + - 'position: absolute;' + - 'left: 0px;' + - 'top: 0px;' + - 'visibility: hidden;' + - 'background: rgb(0, 0, 0) transparent;' + - 'background-color: rgba(0,0,0,0.6);' + - 'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);' + - '-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";' + - 'color: white;' + - 'font: 10px arial, san serif;' + - 'text-align: left;' + - 'white-space: nowrap;' + - 'padding: 5px;' + - 'border: 1px solid white;' + - 'z-index: 10000;' + - '}' + - '.jqsfield { ' + - 'color: white;' + - 'font: 10px arial, san serif;' + - 'text-align: left;' + - '}'; - - /** - * Utilities - */ - - createClass = function (/* [baseclass, [mixin, ...]], definition */) { - var Class, args; - Class = function () { - this.init.apply(this, arguments); - }; - if (arguments.length > 1) { - if (arguments[0]) { - Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]); - Class._super = arguments[0].prototype; - } else { - Class.prototype = arguments[arguments.length - 1]; - } - if (arguments.length > 2) { - args = Array.prototype.slice.call(arguments, 1, -1); - args.unshift(Class.prototype); - $.extend.apply($, args); - } - } else { - Class.prototype = arguments[0]; - } - Class.prototype.cls = Class; - return Class; - }; - - /** - * Wraps a format string for tooltips - * {{x}} - * {{x.2} - * {{x:months}} - */ - $.SPFormatClass = SPFormat = createClass({ - fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g, - precre: /(\w+)\.(\d+)/, - - init: function (format, fclass) { - this.format = format; - this.fclass = fclass; - }, - - render: function (fieldset, lookups, options) { - var self = this, - fields = fieldset, - match, token, lookupkey, fieldvalue, prec; - return this.format.replace(this.fre, function () { - var lookup; - token = arguments[1]; - lookupkey = arguments[3]; - match = self.precre.exec(token); - if (match) { - prec = match[2]; - token = match[1]; - } else { - prec = false; - } - fieldvalue = fields[token]; - if (fieldvalue === undefined) { - return ''; - } - if (lookupkey && lookups && lookups[lookupkey]) { - lookup = lookups[lookupkey]; - if (lookup.get) { // RangeMap - return lookups[lookupkey].get(fieldvalue) || fieldvalue; - } else { - return lookups[lookupkey][fieldvalue] || fieldvalue; - } - } - if (isNumber(fieldvalue)) { - if (options.get('numberFormatter')) { - fieldvalue = options.get('numberFormatter')(fieldvalue); - } else { - fieldvalue = formatNumber(fieldvalue, prec, - options.get('numberDigitGroupCount'), - options.get('numberDigitGroupSep'), - options.get('numberDecimalMark')); - } - } - return fieldvalue; - }); - } - }); - - // convience method to avoid needing the new operator - $.spformat = function(format, fclass) { - return new SPFormat(format, fclass); - }; - - clipval = function (val, min, max) { - if (val < min) { - return min; - } - if (val > max) { - return max; - } - return val; - }; - - quartile = function (values, q) { - var vl; - if (q === 2) { - vl = Math.floor(values.length / 2); - return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2; - } else { - if (values.length % 2 ) { // odd - vl = (values.length * q + q) / 4; - return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; - } else { //even - vl = (values.length * q + 2) / 4; - return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; - - } - } - }; - - normalizeValue = function (val) { - var nf; - switch (val) { - case 'undefined': - val = undefined; - break; - case 'null': - val = null; - break; - case 'true': - val = true; - break; - case 'false': - val = false; - break; - default: - nf = parseFloat(val); - if (val == nf) { - val = nf; - } - } - return val; - }; - - normalizeValues = function (vals) { - var i, result = []; - for (i = vals.length; i--;) { - result[i] = normalizeValue(vals[i]); - } - return result; - }; - - remove = function (vals, filter) { - var i, vl, result = []; - for (i = 0, vl = vals.length; i < vl; i++) { - if (vals[i] !== filter) { - result.push(vals[i]); - } - } - return result; - }; - - isNumber = function (num) { - return !isNaN(parseFloat(num)) && isFinite(num); - }; - - formatNumber = function (num, prec, groupsize, groupsep, decsep) { - var p, i; - num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split(''); - p = (p = $.inArray('.', num)) < 0 ? num.length : p; - if (p < num.length) { - num[p] = decsep; - } - for (i = p - groupsize; i > 0; i -= groupsize) { - num.splice(i, 0, groupsep); - } - return num.join(''); - }; - - // determine if all values of an array match a value - // returns true if the array is empty - all = function (val, arr, ignoreNull) { - var i; - for (i = arr.length; i--; ) { - if (ignoreNull && arr[i] === null) continue; - if (arr[i] !== val) { - return false; - } - } - return true; - }; - - // sums the numeric values in an array, ignoring other values - sum = function (vals) { - var total = 0, i; - for (i = vals.length; i--;) { - total += typeof vals[i] === 'number' ? vals[i] : 0; - } - return total; - }; - - ensureArray = function (val) { - return $.isArray(val) ? val : [val]; - }; - - // http://paulirish.com/2008/bookmarklet-inject-new-css-rules/ - addCSS = function(css) { - var tag; - //if ('\v' == 'v') /* ie only */ { - if (document.createStyleSheet) { - document.createStyleSheet().cssText = css; - } else { - tag = document.createElement('style'); - tag.type = 'text/css'; - document.getElementsByTagName('head')[0].appendChild(tag); - tag[(typeof document.body.style.WebkitAppearance == 'string') /* webkit only */ ? 'innerText' : 'innerHTML'] = css; - } - }; - - // Provide a cross-browser interface to a few simple drawing primitives - $.fn.simpledraw = function (width, height, useExisting, interact) { - var target, mhandler; - if (useExisting && (target = this.data('_jqs_vcanvas'))) { - return target; - } - if (width === undefined) { - width = $(this).innerWidth(); - } - if (height === undefined) { - height = $(this).innerHeight(); - } - if ($.fn.sparkline.hasCanvas) { - target = new VCanvas_canvas(width, height, this, interact); - } else if ($.fn.sparkline.hasVML) { - target = new VCanvas_vml(width, height, this); - } else { - return false; - } - mhandler = $(this).data('_jqs_mhandler'); - if (mhandler) { - mhandler.registerCanvas(target); - } - return target; - }; - - $.fn.cleardraw = function () { - var target = this.data('_jqs_vcanvas'); - if (target) { - target.reset(); - } - }; - - $.RangeMapClass = RangeMap = createClass({ - init: function (map) { - var key, range, rangelist = []; - for (key in map) { - if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) { - range = key.split(':'); - range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]); - range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]); - range[2] = map[key]; - rangelist.push(range); - } - } - this.map = map; - this.rangelist = rangelist || false; - }, - - get: function (value) { - var rangelist = this.rangelist, - i, range, result; - if ((result = this.map[value]) !== undefined) { - return result; - } - if (rangelist) { - for (i = rangelist.length; i--;) { - range = rangelist[i]; - if (range[0] <= value && range[1] >= value) { - return range[2]; - } - } - } - return undefined; - } - }); - - // Convenience function - $.range_map = function(map) { - return new RangeMap(map); - }; - - MouseHandler = createClass({ - init: function (el, options) { - var $el = $(el); - this.$el = $el; - this.options = options; - this.currentPageX = 0; - this.currentPageY = 0; - this.el = el; - this.splist = []; - this.tooltip = null; - this.over = false; - this.displayTooltips = !options.get('disableTooltips'); - this.highlightEnabled = !options.get('disableHighlight'); - }, - - registerSparkline: function (sp) { - this.splist.push(sp); - if (this.over) { - this.updateDisplay(); - } - }, - - registerCanvas: function (canvas) { - var $canvas = $(canvas.canvas); - this.canvas = canvas; - this.$canvas = $canvas; - $canvas.mouseenter($.proxy(this.mouseenter, this)); - $canvas.mouseleave($.proxy(this.mouseleave, this)); - $canvas.click($.proxy(this.mouseclick, this)); - }, - - reset: function (removeTooltip) { - this.splist = []; - if (this.tooltip && removeTooltip) { - this.tooltip.remove(); - this.tooltip = undefined; - } - }, - - mouseclick: function (e) { - var clickEvent = $.Event('sparklineClick'); - clickEvent.originalEvent = e; - clickEvent.sparklines = this.splist; - this.$el.trigger(clickEvent); - }, - - mouseenter: function (e) { - $(document.body).unbind('mousemove.jqs'); - $(document.body).bind('mousemove.jqs', $.proxy(this.mousemove, this)); - this.over = true; - this.currentPageX = e.pageX; - this.currentPageY = e.pageY; - this.currentEl = e.target; - if (!this.tooltip && this.displayTooltips) { - this.tooltip = new Tooltip(this.options); - this.tooltip.updatePosition(e.pageX, e.pageY); - } - this.updateDisplay(); - }, - - mouseleave: function () { - $(document.body).unbind('mousemove.jqs'); - var splist = this.splist, - spcount = splist.length, - needsRefresh = false, - sp, i; - this.over = false; - this.currentEl = null; - - if (this.tooltip) { - this.tooltip.remove(); - this.tooltip = null; - } - - for (i = 0; i < spcount; i++) { - sp = splist[i]; - if (sp.clearRegionHighlight()) { - needsRefresh = true; - } - } - - if (needsRefresh) { - this.canvas.render(); - } - }, - - mousemove: function (e) { - this.currentPageX = e.pageX; - this.currentPageY = e.pageY; - this.currentEl = e.target; - if (this.tooltip) { - this.tooltip.updatePosition(e.pageX, e.pageY); - } - this.updateDisplay(); - }, - - updateDisplay: function () { - var splist = this.splist, - spcount = splist.length, - needsRefresh = false, - offset = this.$canvas.offset(), - localX = this.currentPageX - offset.left, - localY = this.currentPageY - offset.top, - tooltiphtml, sp, i, result, changeEvent; - if (!this.over) { - return; - } - for (i = 0; i < spcount; i++) { - sp = splist[i]; - result = sp.setRegionHighlight(this.currentEl, localX, localY); - if (result) { - needsRefresh = true; - } - } - if (needsRefresh) { - changeEvent = $.Event('sparklineRegionChange'); - changeEvent.sparklines = this.splist; - this.$el.trigger(changeEvent); - if (this.tooltip) { - tooltiphtml = ''; - for (i = 0; i < spcount; i++) { - sp = splist[i]; - tooltiphtml += sp.getCurrentRegionTooltip(); - } - this.tooltip.setContent(tooltiphtml); - } - if (!this.disableHighlight) { - this.canvas.render(); - } - } - if (result === null) { - this.mouseleave(); - } - } - }); - - - Tooltip = createClass({ - sizeStyle: 'position: static !important;' + - 'display: block !important;' + - 'visibility: hidden !important;' + - 'float: left !important;', - - init: function (options) { - var tooltipClassname = options.get('tooltipClassname', 'jqstooltip'), - sizetipStyle = this.sizeStyle, - offset; - this.container = options.get('tooltipContainer') || document.body; - this.tooltipOffsetX = options.get('tooltipOffsetX', 10); - this.tooltipOffsetY = options.get('tooltipOffsetY', 12); - // remove any previous lingering tooltip - $('#jqssizetip').remove(); - $('#jqstooltip').remove(); - this.sizetip = $('
', { - id: 'jqssizetip', - style: sizetipStyle, - 'class': tooltipClassname - }); - this.tooltip = $('
', { - id: 'jqstooltip', - 'class': tooltipClassname - }).appendTo(this.container); - // account for the container's location - offset = this.tooltip.offset(); - this.offsetLeft = offset.left; - this.offsetTop = offset.top; - this.hidden = true; - $(window).unbind('resize.jqs scroll.jqs'); - $(window).bind('resize.jqs scroll.jqs', $.proxy(this.updateWindowDims, this)); - this.updateWindowDims(); - }, - - updateWindowDims: function () { - this.scrollTop = $(window).scrollTop(); - this.scrollLeft = $(window).scrollLeft(); - this.scrollRight = this.scrollLeft + $(window).width(); - this.updatePosition(); - }, - - getSize: function (content) { - this.sizetip.html(content).appendTo(this.container); - this.width = this.sizetip.width() + 1; - this.height = this.sizetip.height(); - this.sizetip.remove(); - }, - - setContent: function (content) { - if (!content) { - this.tooltip.css('visibility', 'hidden'); - this.hidden = true; - return; - } - this.getSize(content); - this.tooltip.html(content) - .css({ - 'width': this.width, - 'height': this.height, - 'visibility': 'visible' - }); - if (this.hidden) { - this.hidden = false; - this.updatePosition(); - } - }, - - updatePosition: function (x, y) { - if (x === undefined) { - if (this.mousex === undefined) { - return; - } - x = this.mousex - this.offsetLeft; - y = this.mousey - this.offsetTop; - - } else { - this.mousex = x = x - this.offsetLeft; - this.mousey = y = y - this.offsetTop; - } - if (!this.height || !this.width || this.hidden) { - return; - } - - y -= this.height + this.tooltipOffsetY; - x += this.tooltipOffsetX; - - if (y < this.scrollTop) { - y = this.scrollTop; - } - if (x < this.scrollLeft) { - x = this.scrollLeft; - } else if (x + this.width > this.scrollRight) { - x = this.scrollRight - this.width; - } - - this.tooltip.css({ - 'left': x, - 'top': y - }); - }, - - remove: function () { - this.tooltip.remove(); - this.sizetip.remove(); - this.sizetip = this.tooltip = undefined; - $(window).unbind('resize.jqs scroll.jqs'); - } - }); - - initStyles = function() { - addCSS(defaultStyles); - }; - - $(initStyles); - - pending = []; - $.fn.sparkline = function (userValues, userOptions) { - return this.each(function () { - var options = new $.fn.sparkline.options(this, userOptions), - $this = $(this), - render, i; - render = function () { - var values, width, height, tmp, mhandler, sp, vals; - if (userValues === 'html' || userValues === undefined) { - vals = this.getAttribute(options.get('tagValuesAttribute')); - if (vals === undefined || vals === null) { - vals = $this.html(); - } - values = vals.replace(/(^\s*\s*$)|\s+/g, '').split(','); - } else { - values = userValues; - } - - width = options.get('width') === 'auto' ? values.length * options.get('defaultPixelsPerValue') : options.get('width'); - if (options.get('height') === 'auto') { - if (!options.get('composite') || !$.data(this, '_jqs_vcanvas')) { - // must be a better way to get the line height - tmp = document.createElement('span'); - tmp.innerHTML = 'a'; - $this.html(tmp); - height = $(tmp).innerHeight() || $(tmp).height(); - $(tmp).remove(); - tmp = null; - } - } else { - height = options.get('height'); - } - - if (!options.get('disableInteraction')) { - mhandler = $.data(this, '_jqs_mhandler'); - if (!mhandler) { - mhandler = new MouseHandler(this, options); - $.data(this, '_jqs_mhandler', mhandler); - } else if (!options.get('composite')) { - mhandler.reset(); - } - } else { - mhandler = false; - } - - if (options.get('composite') && !$.data(this, '_jqs_vcanvas')) { - if (!$.data(this, '_jqs_errnotify')) { - alert('Attempted to attach a composite sparkline to an element with no existing sparkline'); - $.data(this, '_jqs_errnotify', true); - } - return; - } - - sp = new $.fn.sparkline[options.get('type')](this, values, options, width, height); - - sp.render(); - - if (mhandler) { - mhandler.registerSparkline(sp); - } - }; - // jQuery 1.3.0 completely changed the meaning of :hidden :-/ - if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || ($.fn.jquery < '1.3.0' && $(this).parents().is(':hidden')) || !$(this).parents('body').length) { - if (!options.get('composite') && $.data(this, '_jqs_pending')) { - // remove any existing references to the element - for (i = pending.length; i; i--) { - if (pending[i - 1][0] == this) { - pending.splice(i - 1, 1); - } - } - } - pending.push([this, render]); - $.data(this, '_jqs_pending', true); - } else { - render.call(this); - } - }); - }; - - $.fn.sparkline.defaults = getDefaults(); - - - $.sparkline_display_visible = function () { - var el, i, pl; - var done = []; - for (i = 0, pl = pending.length; i < pl; i++) { - el = pending[i][0]; - if ($(el).is(':visible') && !$(el).parents().is(':hidden')) { - pending[i][1].call(el); - $.data(pending[i][0], '_jqs_pending', false); - done.push(i); - } else if (!$(el).closest('html').length && !$.data(el, '_jqs_pending')) { - // element has been inserted and removed from the DOM - // If it was not yet inserted into the dom then the .data request - // will return true. - // removing from the dom causes the data to be removed. - $.data(pending[i][0], '_jqs_pending', false); - done.push(i); - } - } - for (i = done.length; i; i--) { - pending.splice(done[i - 1], 1); - } - }; - - - /** - * User option handler - */ - $.fn.sparkline.options = createClass({ - init: function (tag, userOptions) { - var extendedOptions, defaults, base, tagOptionType; - this.userOptions = userOptions = userOptions || {}; - this.tag = tag; - this.tagValCache = {}; - defaults = $.fn.sparkline.defaults; - base = defaults.common; - this.tagOptionsPrefix = userOptions.enableTagOptions && (userOptions.tagOptionsPrefix || base.tagOptionsPrefix); - - tagOptionType = this.getTagSetting('type'); - if (tagOptionType === UNSET_OPTION) { - extendedOptions = defaults[userOptions.type || base.type]; - } else { - extendedOptions = defaults[tagOptionType]; - } - this.mergedOptions = $.extend({}, base, extendedOptions, userOptions); - }, - - - getTagSetting: function (key) { - var prefix = this.tagOptionsPrefix, - val, i, pairs, keyval; - if (prefix === false || prefix === undefined) { - return UNSET_OPTION; - } - if (this.tagValCache.hasOwnProperty(key)) { - val = this.tagValCache.key; - } else { - val = this.tag.getAttribute(prefix + key); - if (val === undefined || val === null) { - val = UNSET_OPTION; - } else if (val.substr(0, 1) === '[') { - val = val.substr(1, val.length - 2).split(','); - for (i = val.length; i--;) { - val[i] = normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g, '')); - } - } else if (val.substr(0, 1) === '{') { - pairs = val.substr(1, val.length - 2).split(','); - val = {}; - for (i = pairs.length; i--;) { - keyval = pairs[i].split(':', 2); - val[keyval[0].replace(/(^\s*)|(\s*$)/g, '')] = normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g, '')); - } - } else { - val = normalizeValue(val); - } - this.tagValCache.key = val; - } - return val; - }, - - get: function (key, defaultval) { - var tagOption = this.getTagSetting(key), - result; - if (tagOption !== UNSET_OPTION) { - return tagOption; - } - return (result = this.mergedOptions[key]) === undefined ? defaultval : result; - } - }); - - - $.fn.sparkline._base = createClass({ - disabled: false, - - init: function (el, values, options, width, height) { - this.el = el; - this.$el = $(el); - this.values = values; - this.options = options; - this.width = width; - this.height = height; - this.currentRegion = undefined; - }, - - /** - * Setup the canvas - */ - initTarget: function () { - var interactive = !this.options.get('disableInteraction'); - if (!(this.target = this.$el.simpledraw(this.width, this.height, this.options.get('composite'), interactive))) { - this.disabled = true; - } else { - this.canvasWidth = this.target.pixelWidth; - this.canvasHeight = this.target.pixelHeight; - } - }, - - /** - * Actually render the chart to the canvas - */ - render: function () { - if (this.disabled) { - this.el.innerHTML = ''; - return false; - } - return true; - }, - - /** - * Return a region id for a given x/y co-ordinate - */ - getRegion: function (x, y) { - }, - - /** - * Highlight an item based on the moused-over x,y co-ordinate - */ - setRegionHighlight: function (el, x, y) { - var currentRegion = this.currentRegion, - highlightEnabled = !this.options.get('disableHighlight'), - newRegion; - if (x > this.canvasWidth || y > this.canvasHeight || x < 0 || y < 0) { - return null; - } - newRegion = this.getRegion(el, x, y); - if (currentRegion !== newRegion) { - if (currentRegion !== undefined && highlightEnabled) { - this.removeHighlight(); - } - this.currentRegion = newRegion; - if (newRegion !== undefined && highlightEnabled) { - this.renderHighlight(); - } - return true; - } - return false; - }, - - /** - * Reset any currently highlighted item - */ - clearRegionHighlight: function () { - if (this.currentRegion !== undefined) { - this.removeHighlight(); - this.currentRegion = undefined; - return true; - } - return false; - }, - - renderHighlight: function () { - this.changeHighlight(true); - }, - - removeHighlight: function () { - this.changeHighlight(false); - }, - - changeHighlight: function (highlight) {}, - - /** - * Fetch the HTML to display as a tooltip - */ - getCurrentRegionTooltip: function () { - var options = this.options, - header = '', - entries = [], - fields, formats, formatlen, fclass, text, i, - showFields, showFieldsKey, newFields, fv, - formatter, format, fieldlen, j; - if (this.currentRegion === undefined) { - return ''; - } - fields = this.getCurrentRegionFields(); - formatter = options.get('tooltipFormatter'); - if (formatter) { - return formatter(this, options, fields); - } - if (options.get('tooltipChartTitle')) { - header += '
' + options.get('tooltipChartTitle') + '
\n'; - } - formats = this.options.get('tooltipFormat'); - if (!formats) { - return ''; - } - if (!$.isArray(formats)) { - formats = [formats]; - } - if (!$.isArray(fields)) { - fields = [fields]; - } - showFields = this.options.get('tooltipFormatFieldlist'); - showFieldsKey = this.options.get('tooltipFormatFieldlistKey'); - if (showFields && showFieldsKey) { - // user-selected ordering of fields - newFields = []; - for (i = fields.length; i--;) { - fv = fields[i][showFieldsKey]; - if ((j = $.inArray(fv, showFields)) != -1) { - newFields[j] = fields[i]; - } - } - fields = newFields; - } - formatlen = formats.length; - fieldlen = fields.length; - for (i = 0; i < formatlen; i++) { - format = formats[i]; - if (typeof format === 'string') { - format = new SPFormat(format); - } - fclass = format.fclass || 'jqsfield'; - for (j = 0; j < fieldlen; j++) { - if (!fields[j].isNull || !options.get('tooltipSkipNull')) { - $.extend(fields[j], { - prefix: options.get('tooltipPrefix'), - suffix: options.get('tooltipSuffix') - }); - text = format.render(fields[j], options.get('tooltipValueLookups'), options); - entries.push('
' + text + '
'); - } - } - } - if (entries.length) { - return header + entries.join('\n'); - } - return ''; - }, - - getCurrentRegionFields: function () {}, - - calcHighlightColor: function (color, options) { - var highlightColor = options.get('highlightColor'), - lighten = options.get('highlightLighten'), - parse, mult, rgbnew, i; - if (highlightColor) { - return highlightColor; - } - if (lighten) { - // extract RGB values - parse = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color) || /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color); - if (parse) { - rgbnew = []; - mult = color.length === 4 ? 16 : 1; - for (i = 0; i < 3; i++) { - rgbnew[i] = clipval(Math.round(parseInt(parse[i + 1], 16) * mult * lighten), 0, 255); - } - return 'rgb(' + rgbnew.join(',') + ')'; - } - - } - return color; - } - - }); - - barHighlightMixin = { - changeHighlight: function (highlight) { - var currentRegion = this.currentRegion, - target = this.target, - shapeids = this.regionShapes[currentRegion], - newShapes; - // will be null if the region value was null - if (shapeids) { - newShapes = this.renderRegion(currentRegion, highlight); - if ($.isArray(newShapes) || $.isArray(shapeids)) { - target.replaceWithShapes(shapeids, newShapes); - this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) { - return newShape.id; - }); - } else { - target.replaceWithShape(shapeids, newShapes); - this.regionShapes[currentRegion] = newShapes.id; - } - } - }, - - render: function () { - var values = this.values, - target = this.target, - regionShapes = this.regionShapes, - shapes, ids, i, j; - - if (!this.cls._super.render.call(this)) { - return; - } - for (i = values.length; i--;) { - shapes = this.renderRegion(i); - if (shapes) { - if ($.isArray(shapes)) { - ids = []; - for (j = shapes.length; j--;) { - shapes[j].append(); - ids.push(shapes[j].id); - } - regionShapes[i] = ids; - } else { - shapes.append(); - regionShapes[i] = shapes.id; // store just the shapeid - } - } else { - // null value - regionShapes[i] = null; - } - } - target.render(); - } - }; - - /** - * Line charts - */ - $.fn.sparkline.line = line = createClass($.fn.sparkline._base, { - type: 'line', - - init: function (el, values, options, width, height) { - line._super.init.call(this, el, values, options, width, height); - this.vertices = []; - this.regionMap = []; - this.xvalues = []; - this.yvalues = []; - this.yminmax = []; - this.hightlightSpotId = null; - this.lastShapeId = null; - this.initTarget(); - }, - - getRegion: function (el, x, y) { - var i, - regionMap = this.regionMap; // maps regions to value positions - for (i = regionMap.length; i--;) { - if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) { - return regionMap[i][2]; - } - } - return undefined; - }, - - getCurrentRegionFields: function () { - var currentRegion = this.currentRegion; - return { - isNull: this.yvalues[currentRegion] === null, - x: this.xvalues[currentRegion], - y: this.yvalues[currentRegion], - color: this.options.get('lineColor'), - fillColor: this.options.get('fillColor'), - offset: currentRegion - }; - }, - - renderHighlight: function () { - var currentRegion = this.currentRegion, - target = this.target, - vertex = this.vertices[currentRegion], - options = this.options, - spotRadius = options.get('spotRadius'), - highlightSpotColor = options.get('highlightSpotColor'), - highlightLineColor = options.get('highlightLineColor'), - highlightSpot, highlightLine; - - if (!vertex) { - return; - } - if (spotRadius && highlightSpotColor) { - highlightSpot = target.drawCircle(vertex[0], vertex[1], - spotRadius, undefined, highlightSpotColor); - this.highlightSpotId = highlightSpot.id; - target.insertAfterShape(this.lastShapeId, highlightSpot); - } - if (highlightLineColor) { - highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0], - this.canvasTop + this.canvasHeight, highlightLineColor); - this.highlightLineId = highlightLine.id; - target.insertAfterShape(this.lastShapeId, highlightLine); - } - }, - - removeHighlight: function () { - var target = this.target; - if (this.highlightSpotId) { - target.removeShapeId(this.highlightSpotId); - this.highlightSpotId = null; - } - if (this.highlightLineId) { - target.removeShapeId(this.highlightLineId); - this.highlightLineId = null; - } - }, - - scanValues: function () { - var values = this.values, - valcount = values.length, - xvalues = this.xvalues, - yvalues = this.yvalues, - yminmax = this.yminmax, - i, val, isStr, isArray, sp; - for (i = 0; i < valcount; i++) { - val = values[i]; - isStr = typeof(values[i]) === 'string'; - isArray = typeof(values[i]) === 'object' && values[i] instanceof Array; - sp = isStr && values[i].split(':'); - if (isStr && sp.length === 2) { // x:y - xvalues.push(Number(sp[0])); - yvalues.push(Number(sp[1])); - yminmax.push(Number(sp[1])); - } else if (isArray) { - xvalues.push(val[0]); - yvalues.push(val[1]); - yminmax.push(val[1]); - } else { - xvalues.push(i); - if (values[i] === null || values[i] === 'null') { - yvalues.push(null); - } else { - yvalues.push(Number(val)); - yminmax.push(Number(val)); - } - } - } - if (this.options.get('xvalues')) { - xvalues = this.options.get('xvalues'); - } - - this.maxy = this.maxyorg = Math.max.apply(Math, yminmax); - this.miny = this.minyorg = Math.min.apply(Math, yminmax); - - this.maxx = Math.max.apply(Math, xvalues); - this.minx = Math.min.apply(Math, xvalues); - - this.xvalues = xvalues; - this.yvalues = yvalues; - this.yminmax = yminmax; - - }, - - processRangeOptions: function () { - var options = this.options, - normalRangeMin = options.get('normalRangeMin'), - normalRangeMax = options.get('normalRangeMax'); - - if (normalRangeMin !== undefined) { - if (normalRangeMin < this.miny) { - this.miny = normalRangeMin; - } - if (normalRangeMax > this.maxy) { - this.maxy = normalRangeMax; - } - } - if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) { - this.miny = options.get('chartRangeMin'); - } - if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) { - this.maxy = options.get('chartRangeMax'); - } - if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) { - this.minx = options.get('chartRangeMinX'); - } - if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) { - this.maxx = options.get('chartRangeMaxX'); - } - - }, - - drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) { - var normalRangeMin = this.options.get('normalRangeMin'), - normalRangeMax = this.options.get('normalRangeMax'), - ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))), - height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey); - this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append(); - }, - - render: function () { - var options = this.options, - target = this.target, - canvasWidth = this.canvasWidth, - canvasHeight = this.canvasHeight, - vertices = this.vertices, - spotRadius = options.get('spotRadius'), - regionMap = this.regionMap, - rangex, rangey, yvallast, - canvasTop, canvasLeft, - vertex, path, paths, x, y, xnext, xpos, xposnext, - last, next, yvalcount, lineShapes, fillShapes, plen, - valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i; - - if (!line._super.render.call(this)) { - return; - } - - this.scanValues(); - this.processRangeOptions(); - - xvalues = this.xvalues; - yvalues = this.yvalues; - - if (!this.yminmax.length || this.yvalues.length < 2) { - // empty or all null valuess - return; - } - - canvasTop = canvasLeft = 0; - - rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx; - rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny; - yvallast = this.yvalues.length - 1; - - if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) { - spotRadius = 0; - } - if (spotRadius) { - // adjust the canvas size as required so that spots will fit - hlSpotsEnabled = options.get('highlightSpotColor') && !options.get('disableInteraction'); - if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) { - canvasHeight -= Math.ceil(spotRadius); - } - if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) { - canvasHeight -= Math.ceil(spotRadius); - canvasTop += Math.ceil(spotRadius); - } - if (hlSpotsEnabled || - ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) { - canvasLeft += Math.ceil(spotRadius); - canvasWidth -= Math.ceil(spotRadius); - } - if (hlSpotsEnabled || options.get('spotColor') || - (options.get('minSpotColor') || options.get('maxSpotColor') && - (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) { - canvasWidth -= Math.ceil(spotRadius); - } - } - - - canvasHeight--; - - if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) { - this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); - } - - path = []; - paths = [path]; - last = next = null; - yvalcount = yvalues.length; - for (i = 0; i < yvalcount; i++) { - x = xvalues[i]; - xnext = xvalues[i + 1]; - y = yvalues[i]; - xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)); - xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth; - next = xpos + ((xposnext - xpos) / 2); - regionMap[i] = [last || 0, next, i]; - last = next; - if (y === null) { - if (i) { - if (yvalues[i - 1] !== null) { - path = []; - paths.push(path); - } - vertices.push(null); - } - } else { - if (y < this.miny) { - y = this.miny; - } - if (y > this.maxy) { - y = this.maxy; - } - if (!path.length) { - // previous value was null - path.push([xpos, canvasTop + canvasHeight]); - } - vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))]; - path.push(vertex); - vertices.push(vertex); - } - } - - lineShapes = []; - fillShapes = []; - plen = paths.length; - for (i = 0; i < plen; i++) { - path = paths[i]; - if (path.length) { - if (options.get('fillColor')) { - path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]); - fillShapes.push(path.slice(0)); - path.pop(); - } - // if there's only a single point in this path, then we want to display it - // as a vertical line which means we keep path[0] as is - if (path.length > 2) { - // else we want the first value - path[0] = [path[0][0], path[1][1]]; - } - lineShapes.push(path); - } - } - - // draw the fill first, then optionally the normal range, then the line on top of that - plen = fillShapes.length; - for (i = 0; i < plen; i++) { - target.drawShape(fillShapes[i], - options.get('fillColor'), options.get('fillColor')).append(); - } - - if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) { - this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); - } - - plen = lineShapes.length; - for (i = 0; i < plen; i++) { - target.drawShape(lineShapes[i], options.get('lineColor'), undefined, - options.get('lineWidth')).append(); - } - - if (spotRadius && options.get('valueSpots')) { - valueSpots = options.get('valueSpots'); - if (valueSpots.get === undefined) { - valueSpots = new RangeMap(valueSpots); - } - for (i = 0; i < yvalcount; i++) { - color = valueSpots.get(yvalues[i]); - if (color) { - target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)), - canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))), - spotRadius, undefined, - color).append(); - } - } - - } - if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) { - target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)), - canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))), - spotRadius, undefined, - options.get('spotColor')).append(); - } - if (this.maxy !== this.minyorg) { - if (spotRadius && options.get('minSpotColor')) { - x = xvalues[$.inArray(this.minyorg, yvalues)]; - target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), - canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))), - spotRadius, undefined, - options.get('minSpotColor')).append(); - } - if (spotRadius && options.get('maxSpotColor')) { - x = xvalues[$.inArray(this.maxyorg, yvalues)]; - target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), - canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))), - spotRadius, undefined, - options.get('maxSpotColor')).append(); - } - } - - this.lastShapeId = target.getLastShapeId(); - this.canvasTop = canvasTop; - target.render(); - } - }); - - /** - * Bar charts - */ - $.fn.sparkline.bar = bar = createClass($.fn.sparkline._base, barHighlightMixin, { - type: 'bar', - - init: function (el, values, options, width, height) { - var barWidth = parseInt(options.get('barWidth'), 10), - barSpacing = parseInt(options.get('barSpacing'), 10), - chartRangeMin = options.get('chartRangeMin'), - chartRangeMax = options.get('chartRangeMax'), - chartRangeClip = options.get('chartRangeClip'), - stackMin = Infinity, - stackMax = -Infinity, - isStackString, groupMin, groupMax, stackRanges, - numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax, - stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf; - bar._super.init.call(this, el, values, options, width, height); - - // scan values to determine whether to stack bars - for (i = 0, vlen = values.length; i < vlen; i++) { - val = values[i]; - isStackString = typeof(val) === 'string' && val.indexOf(':') > -1; - if (isStackString || $.isArray(val)) { - stacked = true; - if (isStackString) { - val = values[i] = normalizeValues(val.split(':')); - } - val = remove(val, null); // min/max will treat null as zero - groupMin = Math.min.apply(Math, val); - groupMax = Math.max.apply(Math, val); - if (groupMin < stackMin) { - stackMin = groupMin; - } - if (groupMax > stackMax) { - stackMax = groupMax; - } - } - } - - this.stacked = stacked; - this.regionShapes = {}; - this.barWidth = barWidth; - this.barSpacing = barSpacing; - this.totalBarWidth = barWidth + barSpacing; - this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); - - this.initTarget(); - - if (chartRangeClip) { - clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin; - clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax; - } - - numValues = []; - stackRanges = stacked ? [] : numValues; - var stackTotals = []; - var stackRangesNeg = []; - for (i = 0, vlen = values.length; i < vlen; i++) { - if (stacked) { - vlist = values[i]; - values[i] = svals = []; - stackTotals[i] = 0; - stackRanges[i] = stackRangesNeg[i] = 0; - for (j = 0, slen = vlist.length; j < slen; j++) { - val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j]; - if (val !== null) { - if (val > 0) { - stackTotals[i] += val; - } - if (stackMin < 0 && stackMax > 0) { - if (val < 0) { - stackRangesNeg[i] += Math.abs(val); - } else { - stackRanges[i] += val; - } - } else { - stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin)); - } - numValues.push(val); - } - } - } else { - val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i]; - val = values[i] = normalizeValue(val); - if (val !== null) { - numValues.push(val); - } - } - } - this.max = max = Math.max.apply(Math, numValues); - this.min = min = Math.min.apply(Math, numValues); - this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max; - this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min; - - if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) { - min = options.get('chartRangeMin'); - } - if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) { - max = options.get('chartRangeMax'); - } - - this.zeroAxis = zeroAxis = options.get('zeroAxis', true); - if (min <= 0 && max >= 0 && zeroAxis) { - xaxisOffset = 0; - } else if (zeroAxis == false) { - xaxisOffset = min; - } else if (min > 0) { - xaxisOffset = min; - } else { - xaxisOffset = max; - } - this.xaxisOffset = xaxisOffset; - - range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - min; - - // as we plot zero/min values a single pixel line, we add a pixel to all other - // values - Reduce the effective canvas size to suit - this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1; - - if (min < xaxisOffset) { - yMaxCalc = (stacked && max >= 0) ? stackMax : max; - yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight; - if (yoffset !== Math.ceil(yoffset)) { - this.canvasHeightEf -= 2; - yoffset = Math.ceil(yoffset); - } - } else { - yoffset = this.canvasHeight; - } - this.yoffset = yoffset; - - if ($.isArray(options.get('colorMap'))) { - this.colorMapByIndex = options.get('colorMap'); - this.colorMapByValue = null; - } else { - this.colorMapByIndex = null; - this.colorMapByValue = options.get('colorMap'); - if (this.colorMapByValue && this.colorMapByValue.get === undefined) { - this.colorMapByValue = new RangeMap(this.colorMapByValue); - } - } - - this.range = range; - }, - - getRegion: function (el, x, y) { - var result = Math.floor(x / this.totalBarWidth); - return (result < 0 || result >= this.values.length) ? undefined : result; - }, - - getCurrentRegionFields: function () { - var currentRegion = this.currentRegion, - values = ensureArray(this.values[currentRegion]), - result = [], - value, i; - for (i = values.length; i--;) { - value = values[i]; - result.push({ - isNull: value === null, - value: value, - color: this.calcColor(i, value, currentRegion), - offset: currentRegion - }); - } - return result; - }, - - calcColor: function (stacknum, value, valuenum) { - var colorMapByIndex = this.colorMapByIndex, - colorMapByValue = this.colorMapByValue, - options = this.options, - color, newColor; - if (this.stacked) { - color = options.get('stackedBarColor'); - } else { - color = (value < 0) ? options.get('negBarColor') : options.get('barColor'); - } - if (value === 0 && options.get('zeroColor') !== undefined) { - color = options.get('zeroColor'); - } - if (colorMapByValue && (newColor = colorMapByValue.get(value))) { - color = newColor; - } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { - color = colorMapByIndex[valuenum]; - } - return $.isArray(color) ? color[stacknum % color.length] : color; - }, - - /** - * Render bar(s) for a region - */ - renderRegion: function (valuenum, highlight) { - var vals = this.values[valuenum], - options = this.options, - xaxisOffset = this.xaxisOffset, - result = [], - range = this.range, - stacked = this.stacked, - target = this.target, - x = valuenum * this.totalBarWidth, - canvasHeightEf = this.canvasHeightEf, - yoffset = this.yoffset, - y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin; - - vals = $.isArray(vals) ? vals : [vals]; - valcount = vals.length; - val = vals[0]; - isNull = all(null, vals); - allMin = all(xaxisOffset, vals, true); - - if (isNull) { - if (options.get('nullColor')) { - color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options); - y = (yoffset > 0) ? yoffset - 1 : yoffset; - return target.drawRect(x, y, this.barWidth - 1, 0, color, color); - } else { - return undefined; - } - } - yoffsetNeg = yoffset; - for (i = 0; i < valcount; i++) { - val = vals[i]; - - if (stacked && val === xaxisOffset) { - if (!allMin || minPlotted) { - continue; - } - minPlotted = true; - } - - if (range > 0) { - height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range))) + 1; - } else { - height = 1; - } - if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) { - y = yoffsetNeg; - yoffsetNeg += height; - } else { - y = yoffset - height; - yoffset -= height; - } - color = this.calcColor(i, val, valuenum); - if (highlight) { - color = this.calcHighlightColor(color, options); - } - result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color)); - } - if (result.length === 1) { - return result[0]; - } - return result; - } - }); - - /** - * Tristate charts - */ - $.fn.sparkline.tristate = tristate = createClass($.fn.sparkline._base, barHighlightMixin, { - type: 'tristate', - - init: function (el, values, options, width, height) { - var barWidth = parseInt(options.get('barWidth'), 10), - barSpacing = parseInt(options.get('barSpacing'), 10); - tristate._super.init.call(this, el, values, options, width, height); - - this.regionShapes = {}; - this.barWidth = barWidth; - this.barSpacing = barSpacing; - this.totalBarWidth = barWidth + barSpacing; - this.values = $.map(values, Number); - this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); - - if ($.isArray(options.get('colorMap'))) { - this.colorMapByIndex = options.get('colorMap'); - this.colorMapByValue = null; - } else { - this.colorMapByIndex = null; - this.colorMapByValue = options.get('colorMap'); - if (this.colorMapByValue && this.colorMapByValue.get === undefined) { - this.colorMapByValue = new RangeMap(this.colorMapByValue); - } - } - this.initTarget(); - }, - - getRegion: function (el, x, y) { - return Math.floor(x / this.totalBarWidth); - }, - - getCurrentRegionFields: function () { - var currentRegion = this.currentRegion; - return { - isNull: this.values[currentRegion] === undefined, - value: this.values[currentRegion], - color: this.calcColor(this.values[currentRegion], currentRegion), - offset: currentRegion - }; - }, - - calcColor: function (value, valuenum) { - var values = this.values, - options = this.options, - colorMapByIndex = this.colorMapByIndex, - colorMapByValue = this.colorMapByValue, - color, newColor; - - if (colorMapByValue && (newColor = colorMapByValue.get(value))) { - color = newColor; - } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { - color = colorMapByIndex[valuenum]; - } else if (values[valuenum] < 0) { - color = options.get('negBarColor'); - } else if (values[valuenum] > 0) { - color = options.get('posBarColor'); - } else { - color = options.get('zeroBarColor'); - } - return color; - }, - - renderRegion: function (valuenum, highlight) { - var values = this.values, - options = this.options, - target = this.target, - canvasHeight, height, halfHeight, - x, y, color; - - canvasHeight = target.pixelHeight; - halfHeight = Math.round(canvasHeight / 2); - - x = valuenum * this.totalBarWidth; - if (values[valuenum] < 0) { - y = halfHeight; - height = halfHeight - 1; - } else if (values[valuenum] > 0) { - y = 0; - height = halfHeight - 1; - } else { - y = halfHeight - 1; - height = 2; - } - color = this.calcColor(values[valuenum], valuenum); - if (color === null) { - return; - } - if (highlight) { - color = this.calcHighlightColor(color, options); - } - return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color); - } - }); - - /** - * Discrete charts - */ - $.fn.sparkline.discrete = discrete = createClass($.fn.sparkline._base, barHighlightMixin, { - type: 'discrete', - - init: function (el, values, options, width, height) { - discrete._super.init.call(this, el, values, options, width, height); - - this.regionShapes = {}; - this.values = values = $.map(values, Number); - this.min = Math.min.apply(Math, values); - this.max = Math.max.apply(Math, values); - this.range = this.max - this.min; - this.width = width = options.get('width') === 'auto' ? values.length * 2 : this.width; - this.interval = Math.floor(width / values.length); - this.itemWidth = width / values.length; - if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) { - this.min = options.get('chartRangeMin'); - } - if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) { - this.max = options.get('chartRangeMax'); - } - this.initTarget(); - if (this.target) { - this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight'); - } - }, - - getRegion: function (el, x, y) { - return Math.floor(x / this.itemWidth); - }, - - getCurrentRegionFields: function () { - var currentRegion = this.currentRegion; - return { - isNull: this.values[currentRegion] === undefined, - value: this.values[currentRegion], - offset: currentRegion - }; - }, - - renderRegion: function (valuenum, highlight) { - var values = this.values, - options = this.options, - min = this.min, - max = this.max, - range = this.range, - interval = this.interval, - target = this.target, - canvasHeight = this.canvasHeight, - lineHeight = this.lineHeight, - pheight = canvasHeight - lineHeight, - ytop, val, color, x; - - val = clipval(values[valuenum], min, max); - x = valuenum * interval; - ytop = Math.round(pheight - pheight * ((val - min) / range)); - color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor'); - if (highlight) { - color = this.calcHighlightColor(color, options); - } - return target.drawLine(x, ytop, x, ytop + lineHeight, color); - } - }); - - /** - * Bullet charts - */ - $.fn.sparkline.bullet = bullet = createClass($.fn.sparkline._base, { - type: 'bullet', - - init: function (el, values, options, width, height) { - var min, max, vals; - bullet._super.init.call(this, el, values, options, width, height); - - // values: target, performance, range1, range2, range3 - this.values = values = normalizeValues(values); - // target or performance could be null - vals = values.slice(); - vals[0] = vals[0] === null ? vals[2] : vals[0]; - vals[1] = values[1] === null ? vals[2] : vals[1]; - min = Math.min.apply(Math, values); - max = Math.max.apply(Math, values); - if (options.get('base') === undefined) { - min = min < 0 ? min : 0; - } else { - min = options.get('base'); - } - this.min = min; - this.max = max; - this.range = max - min; - this.shapes = {}; - this.valueShapes = {}; - this.regiondata = {}; - this.width = width = options.get('width') === 'auto' ? '4.0em' : width; - this.target = this.$el.simpledraw(width, height, options.get('composite')); - if (!values.length) { - this.disabled = true; - } - this.initTarget(); - }, - - getRegion: function (el, x, y) { - var shapeid = this.target.getShapeAt(el, x, y); - return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; - }, - - getCurrentRegionFields: function () { - var currentRegion = this.currentRegion; - return { - fieldkey: currentRegion.substr(0, 1), - value: this.values[currentRegion.substr(1)], - region: currentRegion - }; - }, - - changeHighlight: function (highlight) { - var currentRegion = this.currentRegion, - shapeid = this.valueShapes[currentRegion], - shape; - delete this.shapes[shapeid]; - switch (currentRegion.substr(0, 1)) { - case 'r': - shape = this.renderRange(currentRegion.substr(1), highlight); - break; - case 'p': - shape = this.renderPerformance(highlight); - break; - case 't': - shape = this.renderTarget(highlight); - break; - } - this.valueShapes[currentRegion] = shape.id; - this.shapes[shape.id] = currentRegion; - this.target.replaceWithShape(shapeid, shape); - }, - - renderRange: function (rn, highlight) { - var rangeval = this.values[rn], - rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)), - color = this.options.get('rangeColors')[rn - 2]; - if (highlight) { - color = this.calcHighlightColor(color, this.options); - } - return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color); - }, - - renderPerformance: function (highlight) { - var perfval = this.values[1], - perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)), - color = this.options.get('performanceColor'); - if (highlight) { - color = this.calcHighlightColor(color, this.options); - } - return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1, - Math.round(this.canvasHeight * 0.4) - 1, color, color); - }, - - renderTarget: function (highlight) { - var targetval = this.values[0], - x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)), - targettop = Math.round(this.canvasHeight * 0.10), - targetheight = this.canvasHeight - (targettop * 2), - color = this.options.get('targetColor'); - if (highlight) { - color = this.calcHighlightColor(color, this.options); - } - return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color); - }, - - render: function () { - var vlen = this.values.length, - target = this.target, - i, shape; - if (!bullet._super.render.call(this)) { - return; - } - for (i = 2; i < vlen; i++) { - shape = this.renderRange(i).append(); - this.shapes[shape.id] = 'r' + i; - this.valueShapes['r' + i] = shape.id; - } - if (this.values[1] !== null) { - shape = this.renderPerformance().append(); - this.shapes[shape.id] = 'p1'; - this.valueShapes.p1 = shape.id; - } - if (this.values[0] !== null) { - shape = this.renderTarget().append(); - this.shapes[shape.id] = 't0'; - this.valueShapes.t0 = shape.id; - } - target.render(); - } - }); - - /** - * Pie charts - */ - $.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, { - type: 'pie', - - init: function (el, values, options, width, height) { - var total = 0, i; - - pie._super.init.call(this, el, values, options, width, height); - - this.shapes = {}; // map shape ids to value offsets - this.valueShapes = {}; // maps value offsets to shape ids - this.values = values = $.map(values, Number); - - if (options.get('width') === 'auto') { - this.width = this.height; - } - - if (values.length > 0) { - for (i = values.length; i--;) { - total += values[i]; - } - } - this.total = total; - this.initTarget(); - this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2); - }, - - getRegion: function (el, x, y) { - var shapeid = this.target.getShapeAt(el, x, y); - return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; - }, - - getCurrentRegionFields: function () { - var currentRegion = this.currentRegion; - return { - isNull: this.values[currentRegion] === undefined, - value: this.values[currentRegion], - percent: this.values[currentRegion] / this.total * 100, - color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length], - offset: currentRegion - }; - }, - - changeHighlight: function (highlight) { - var currentRegion = this.currentRegion, - newslice = this.renderSlice(currentRegion, highlight), - shapeid = this.valueShapes[currentRegion]; - delete this.shapes[shapeid]; - this.target.replaceWithShape(shapeid, newslice); - this.valueShapes[currentRegion] = newslice.id; - this.shapes[newslice.id] = currentRegion; - }, - - renderSlice: function (valuenum, highlight) { - var target = this.target, - options = this.options, - radius = this.radius, - borderWidth = options.get('borderWidth'), - offset = options.get('offset'), - circle = 2 * Math.PI, - values = this.values, - total = this.total, - next = offset ? (2*Math.PI)*(offset/360) : 0, - start, end, i, vlen, color; - - vlen = values.length; - for (i = 0; i < vlen; i++) { - start = next; - end = next; - if (total > 0) { // avoid divide by zero - end = next + (circle * (values[i] / total)); - } - if (valuenum === i) { - color = options.get('sliceColors')[i % options.get('sliceColors').length]; - if (highlight) { - color = this.calcHighlightColor(color, options); - } - - return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color); - } - next = end; - } - }, - - render: function () { - var target = this.target, - values = this.values, - options = this.options, - radius = this.radius, - borderWidth = options.get('borderWidth'), - shape, i; - - if (!pie._super.render.call(this)) { - return; - } - if (borderWidth) { - target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)), - options.get('borderColor'), undefined, borderWidth).append(); - } - for (i = values.length; i--;) { - if (values[i]) { // don't render zero values - shape = this.renderSlice(i).append(); - this.valueShapes[i] = shape.id; // store just the shapeid - this.shapes[shape.id] = i; - } - } - target.render(); - } - }); - - /** - * Box plots - */ - $.fn.sparkline.box = box = createClass($.fn.sparkline._base, { - type: 'box', - - init: function (el, values, options, width, height) { - box._super.init.call(this, el, values, options, width, height); - this.values = $.map(values, Number); - this.width = options.get('width') === 'auto' ? '4.0em' : width; - this.initTarget(); - if (!this.values.length) { - this.disabled = 1; - } - }, - - /** - * Simulate a single region - */ - getRegion: function () { - return 1; - }, - - getCurrentRegionFields: function () { - var result = [ - { field: 'lq', value: this.quartiles[0] }, - { field: 'med', value: this.quartiles[1] }, - { field: 'uq', value: this.quartiles[2] } - ]; - if (this.loutlier !== undefined) { - result.push({ field: 'lo', value: this.loutlier}); - } - if (this.routlier !== undefined) { - result.push({ field: 'ro', value: this.routlier}); - } - if (this.lwhisker !== undefined) { - result.push({ field: 'lw', value: this.lwhisker}); - } - if (this.rwhisker !== undefined) { - result.push({ field: 'rw', value: this.rwhisker}); - } - return result; - }, - - render: function () { - var target = this.target, - values = this.values, - vlen = values.length, - options = this.options, - canvasWidth = this.canvasWidth, - canvasHeight = this.canvasHeight, - minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'), - maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'), - canvasLeft = 0, - lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i, - size, unitSize; - - if (!box._super.render.call(this)) { - return; - } - - if (options.get('raw')) { - if (options.get('showOutliers') && values.length > 5) { - loutlier = values[0]; - lwhisker = values[1]; - q1 = values[2]; - q2 = values[3]; - q3 = values[4]; - rwhisker = values[5]; - routlier = values[6]; - } else { - lwhisker = values[0]; - q1 = values[1]; - q2 = values[2]; - q3 = values[3]; - rwhisker = values[4]; - } - } else { - values.sort(function (a, b) { return a - b; }); - q1 = quartile(values, 1); - q2 = quartile(values, 2); - q3 = quartile(values, 3); - iqr = q3 - q1; - if (options.get('showOutliers')) { - lwhisker = rwhisker = undefined; - for (i = 0; i < vlen; i++) { - if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) { - lwhisker = values[i]; - } - if (values[i] < q3 + (iqr * options.get('outlierIQR'))) { - rwhisker = values[i]; - } - } - loutlier = values[0]; - routlier = values[vlen - 1]; - } else { - lwhisker = values[0]; - rwhisker = values[vlen - 1]; - } - } - this.quartiles = [q1, q2, q3]; - this.lwhisker = lwhisker; - this.rwhisker = rwhisker; - this.loutlier = loutlier; - this.routlier = routlier; - - unitSize = canvasWidth / (maxValue - minValue + 1); - if (options.get('showOutliers')) { - canvasLeft = Math.ceil(options.get('spotRadius')); - canvasWidth -= 2 * Math.ceil(options.get('spotRadius')); - unitSize = canvasWidth / (maxValue - minValue + 1); - if (loutlier < lwhisker) { - target.drawCircle((loutlier - minValue) * unitSize + canvasLeft, - canvasHeight / 2, - options.get('spotRadius'), - options.get('outlierLineColor'), - options.get('outlierFillColor')).append(); - } - if (routlier > rwhisker) { - target.drawCircle((routlier - minValue) * unitSize + canvasLeft, - canvasHeight / 2, - options.get('spotRadius'), - options.get('outlierLineColor'), - options.get('outlierFillColor')).append(); - } - } - - // box - target.drawRect( - Math.round((q1 - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight * 0.1), - Math.round((q3 - q1) * unitSize), - Math.round(canvasHeight * 0.8), - options.get('boxLineColor'), - options.get('boxFillColor')).append(); - // left whisker - target.drawLine( - Math.round((lwhisker - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight / 2), - Math.round((q1 - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight / 2), - options.get('lineColor')).append(); - target.drawLine( - Math.round((lwhisker - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight / 4), - Math.round((lwhisker - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight - canvasHeight / 4), - options.get('whiskerColor')).append(); - // right whisker - target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight / 2), - Math.round((q3 - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight / 2), - options.get('lineColor')).append(); - target.drawLine( - Math.round((rwhisker - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight / 4), - Math.round((rwhisker - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight - canvasHeight / 4), - options.get('whiskerColor')).append(); - // median line - target.drawLine( - Math.round((q2 - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight * 0.1), - Math.round((q2 - minValue) * unitSize + canvasLeft), - Math.round(canvasHeight * 0.9), - options.get('medianColor')).append(); - if (options.get('target')) { - size = Math.ceil(options.get('spotRadius')); - target.drawLine( - Math.round((options.get('target') - minValue) * unitSize + canvasLeft), - Math.round((canvasHeight / 2) - size), - Math.round((options.get('target') - minValue) * unitSize + canvasLeft), - Math.round((canvasHeight / 2) + size), - options.get('targetColor')).append(); - target.drawLine( - Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size), - Math.round(canvasHeight / 2), - Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size), - Math.round(canvasHeight / 2), - options.get('targetColor')).append(); - } - target.render(); - } - }); - - // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier - // This is accessible as $(foo).simpledraw() - - // Detect browser renderer support - (function() { - if (document.namespaces && !document.namespaces.v) { - $.fn.sparkline.hasVML = true; - document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); - } else { - $.fn.sparkline.hasVML = false; - } - - var el = document.createElement('canvas'); - $.fn.sparkline.hasCanvas = !!(el.getContext && el.getContext('2d')); - - })() - - VShape = createClass({ - init: function (target, id, type, args) { - this.target = target; - this.id = id; - this.type = type; - this.args = args; - }, - append: function () { - this.target.appendShape(this); - return this; - } - }); - - VCanvas_base = createClass({ - _pxregex: /(\d+)(px)?\s*$/i, - - init: function (width, height, target) { - if (!width) { - return; - } - this.width = width; - this.height = height; - this.target = target; - this.lastShapeId = null; - if (target[0]) { - target = target[0]; - } - $.data(target, '_jqs_vcanvas', this); - }, - - drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) { - return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth); - }, - - drawShape: function (path, lineColor, fillColor, lineWidth) { - return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]); - }, - - drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) { - return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]); - }, - - drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) { - return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]); - }, - - drawRect: function (x, y, width, height, lineColor, fillColor) { - return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]); - }, - - getElement: function () { - return this.canvas; - }, - - /** - * Return the most recently inserted shape id - */ - getLastShapeId: function () { - return this.lastShapeId; - }, - - /** - * Clear and reset the canvas - */ - reset: function () { - alert('reset not implemented'); - }, - - _insert: function (el, target) { - $(target).html(el); - }, - - /** - * Calculate the pixel dimensions of the canvas - */ - _calculatePixelDims: function (width, height, canvas) { - // XXX This should probably be a configurable option - var match; - match = this._pxregex.exec(height); - if (match) { - this.pixelHeight = match[1]; - } else { - this.pixelHeight = $(canvas).height(); - } - match = this._pxregex.exec(width); - if (match) { - this.pixelWidth = match[1]; - } else { - this.pixelWidth = $(canvas).width(); - } - }, - - /** - * Generate a shape object and id for later rendering - */ - _genShape: function (shapetype, shapeargs) { - var id = shapeCount++; - shapeargs.unshift(id); - return new VShape(this, id, shapetype, shapeargs); - }, - - /** - * Add a shape to the end of the render queue - */ - appendShape: function (shape) { - alert('appendShape not implemented'); - }, - - /** - * Replace one shape with another - */ - replaceWithShape: function (shapeid, shape) { - alert('replaceWithShape not implemented'); - }, - - /** - * Insert one shape after another in the render queue - */ - insertAfterShape: function (shapeid, shape) { - alert('insertAfterShape not implemented'); - }, - - /** - * Remove a shape from the queue - */ - removeShapeId: function (shapeid) { - alert('removeShapeId not implemented'); - }, - - /** - * Find a shape at the specified x/y co-ordinates - */ - getShapeAt: function (el, x, y) { - alert('getShapeAt not implemented'); - }, - - /** - * Render all queued shapes onto the canvas - */ - render: function () { - alert('render not implemented'); - } - }); - - VCanvas_canvas = createClass(VCanvas_base, { - init: function (width, height, target, interact) { - VCanvas_canvas._super.init.call(this, width, height, target); - this.canvas = document.createElement('canvas'); - if (target[0]) { - target = target[0]; - } - $.data(target, '_jqs_vcanvas', this); - $(this.canvas).css({ display: 'inline-block', width: width, height: height, verticalAlign: 'top' }); - this._insert(this.canvas, target); - this._calculatePixelDims(width, height, this.canvas); - this.canvas.width = this.pixelWidth; - this.canvas.height = this.pixelHeight; - this.interact = interact; - this.shapes = {}; - this.shapeseq = []; - this.currentTargetShapeId = undefined; - $(this.canvas).css({width: this.pixelWidth, height: this.pixelHeight}); - }, - - _getContext: function (lineColor, fillColor, lineWidth) { - var context = this.canvas.getContext('2d'); - if (lineColor !== undefined) { - context.strokeStyle = lineColor; - } - context.lineWidth = lineWidth === undefined ? 1 : lineWidth; - if (fillColor !== undefined) { - context.fillStyle = fillColor; - } - return context; - }, - - reset: function () { - var context = this._getContext(); - context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); - this.shapes = {}; - this.shapeseq = []; - this.currentTargetShapeId = undefined; - }, - - _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { - var context = this._getContext(lineColor, fillColor, lineWidth), - i, plen; - context.beginPath(); - context.moveTo(path[0][0] + 0.5, path[0][1] + 0.5); - for (i = 1, plen = path.length; i < plen; i++) { - context.lineTo(path[i][0] + 0.5, path[i][1] + 0.5); // the 0.5 offset gives us crisp pixel-width lines - } - if (lineColor !== undefined) { - context.stroke(); - } - if (fillColor !== undefined) { - context.fill(); - } - if (this.targetX !== undefined && this.targetY !== undefined && - context.isPointInPath(this.targetX, this.targetY)) { - this.currentTargetShapeId = shapeid; - } - }, - - _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { - var context = this._getContext(lineColor, fillColor, lineWidth); - context.beginPath(); - context.arc(x, y, radius, 0, 2 * Math.PI, false); - if (this.targetX !== undefined && this.targetY !== undefined && - context.isPointInPath(this.targetX, this.targetY)) { - this.currentTargetShapeId = shapeid; - } - if (lineColor !== undefined) { - context.stroke(); - } - if (fillColor !== undefined) { - context.fill(); - } - }, - - _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { - var context = this._getContext(lineColor, fillColor); - context.beginPath(); - context.moveTo(x, y); - context.arc(x, y, radius, startAngle, endAngle, false); - context.lineTo(x, y); - context.closePath(); - if (lineColor !== undefined) { - context.stroke(); - } - if (fillColor) { - context.fill(); - } - if (this.targetX !== undefined && this.targetY !== undefined && - context.isPointInPath(this.targetX, this.targetY)) { - this.currentTargetShapeId = shapeid; - } - }, - - _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { - return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor); - }, - - appendShape: function (shape) { - this.shapes[shape.id] = shape; - this.shapeseq.push(shape.id); - this.lastShapeId = shape.id; - return shape.id; - }, - - replaceWithShape: function (shapeid, shape) { - var shapeseq = this.shapeseq, - i; - this.shapes[shape.id] = shape; - for (i = shapeseq.length; i--;) { - if (shapeseq[i] == shapeid) { - shapeseq[i] = shape.id; - } - } - delete this.shapes[shapeid]; - }, - - replaceWithShapes: function (shapeids, shapes) { - var shapeseq = this.shapeseq, - shapemap = {}, - sid, i, first; - - for (i = shapeids.length; i--;) { - shapemap[shapeids[i]] = true; - } - for (i = shapeseq.length; i--;) { - sid = shapeseq[i]; - if (shapemap[sid]) { - shapeseq.splice(i, 1); - delete this.shapes[sid]; - first = i; - } - } - for (i = shapes.length; i--;) { - shapeseq.splice(first, 0, shapes[i].id); - this.shapes[shapes[i].id] = shapes[i]; - } - - }, - - insertAfterShape: function (shapeid, shape) { - var shapeseq = this.shapeseq, - i; - for (i = shapeseq.length; i--;) { - if (shapeseq[i] === shapeid) { - shapeseq.splice(i + 1, 0, shape.id); - this.shapes[shape.id] = shape; - return; - } - } - }, - - removeShapeId: function (shapeid) { - var shapeseq = this.shapeseq, - i; - for (i = shapeseq.length; i--;) { - if (shapeseq[i] === shapeid) { - shapeseq.splice(i, 1); - break; - } - } - delete this.shapes[shapeid]; - }, - - getShapeAt: function (el, x, y) { - this.targetX = x; - this.targetY = y; - this.render(); - return this.currentTargetShapeId; - }, - - render: function () { - var shapeseq = this.shapeseq, - shapes = this.shapes, - shapeCount = shapeseq.length, - context = this._getContext(), - shapeid, shape, i; - context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); - for (i = 0; i < shapeCount; i++) { - shapeid = shapeseq[i]; - shape = shapes[shapeid]; - this['_draw' + shape.type].apply(this, shape.args); - } - if (!this.interact) { - // not interactive so no need to keep the shapes array - this.shapes = {}; - this.shapeseq = []; - } - } - - }); - - VCanvas_vml = createClass(VCanvas_base, { - init: function (width, height, target) { - var groupel; - VCanvas_vml._super.init.call(this, width, height, target); - if (target[0]) { - target = target[0]; - } - $.data(target, '_jqs_vcanvas', this); - this.canvas = document.createElement('span'); - $(this.canvas).css({ display: 'inline-block', position: 'relative', overflow: 'hidden', width: width, height: height, margin: '0px', padding: '0px', verticalAlign: 'top'}); - this._insert(this.canvas, target); - this._calculatePixelDims(width, height, this.canvas); - this.canvas.width = this.pixelWidth; - this.canvas.height = this.pixelHeight; - groupel = ''; - this.canvas.insertAdjacentHTML('beforeEnd', groupel); - this.group = $(this.canvas).children()[0]; - this.rendered = false; - this.prerender = ''; - }, - - _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { - var vpath = [], - initial, stroke, fill, closed, vel, plen, i; - for (i = 0, plen = path.length; i < plen; i++) { - vpath[i] = '' + (path[i][0]) + ',' + (path[i][1]); - } - initial = vpath.splice(0, 1); - lineWidth = lineWidth === undefined ? 1 : lineWidth; - stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; - fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; - closed = vpath[0] === vpath[vpath.length - 1] ? 'x ' : ''; - vel = '' + - ' '; - return vel; - }, - - _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { - var stroke, fill, vel; - x -= radius; - y -= radius; - stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; - fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; - vel = ''; - return vel; - - }, - - _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { - var vpath, startx, starty, endx, endy, stroke, fill, vel; - if (startAngle === endAngle) { - return ''; // VML seems to have problem when start angle equals end angle. - } - if ((endAngle - startAngle) === (2 * Math.PI)) { - startAngle = 0.0; // VML seems to have a problem when drawing a full circle that doesn't start 0 - endAngle = (2 * Math.PI); - } - - startx = x + Math.round(Math.cos(startAngle) * radius); - starty = y + Math.round(Math.sin(startAngle) * radius); - endx = x + Math.round(Math.cos(endAngle) * radius); - endy = y + Math.round(Math.sin(endAngle) * radius); - - if (startx === endx && starty === endy) { - if ((endAngle - startAngle) < Math.PI) { - // Prevent very small slices from being mistaken as a whole pie - return ''; - } - // essentially going to be the entire circle, so ignore startAngle - startx = endx = x + radius; - starty = endy = y; - } - - if (startx === endx && starty === endy && (endAngle - startAngle) < Math.PI) { - return ''; - } - - vpath = [x - radius, y - radius, x + radius, y + radius, startx, starty, endx, endy]; - stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="1px" strokeColor="' + lineColor + '" '; - fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; - vel = '' + - ' '; - return vel; - }, - - _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { - return this._drawShape(shapeid, [[x, y], [x, y + height], [x + width, y + height], [x + width, y], [x, y]], lineColor, fillColor); - }, - - reset: function () { - this.group.innerHTML = ''; - }, - - appendShape: function (shape) { - var vel = this['_draw' + shape.type].apply(this, shape.args); - if (this.rendered) { - this.group.insertAdjacentHTML('beforeEnd', vel); - } else { - this.prerender += vel; - } - this.lastShapeId = shape.id; - return shape.id; - }, - - replaceWithShape: function (shapeid, shape) { - var existing = $('#jqsshape' + shapeid), - vel = this['_draw' + shape.type].apply(this, shape.args); - existing[0].outerHTML = vel; - }, - - replaceWithShapes: function (shapeids, shapes) { - // replace the first shapeid with all the new shapes then toast the remaining old shapes - var existing = $('#jqsshape' + shapeids[0]), - replace = '', - slen = shapes.length, - i; - for (i = 0; i < slen; i++) { - replace += this['_draw' + shapes[i].type].apply(this, shapes[i].args); - } - existing[0].outerHTML = replace; - for (i = 1; i < shapeids.length; i++) { - $('#jqsshape' + shapeids[i]).remove(); - } - }, - - insertAfterShape: function (shapeid, shape) { - var existing = $('#jqsshape' + shapeid), - vel = this['_draw' + shape.type].apply(this, shape.args); - existing[0].insertAdjacentHTML('afterEnd', vel); - }, - - removeShapeId: function (shapeid) { - var existing = $('#jqsshape' + shapeid); - this.group.removeChild(existing[0]); - }, - - getShapeAt: function (el, x, y) { - var shapeid = el.id.substr(8); - return shapeid; - }, - - render: function () { - if (!this.rendered) { - // batch the intial render into a single repaint - this.group.innerHTML = this.prerender; - this.rendered = true; - } - } - }); - -})); diff --git a/addons/crm/static/src/js/crm_case_section.js b/addons/crm/static/src/js/crm_case_section.js index 2b4ca741d75..deb21d38de2 100644 --- a/addons/crm/static/src/js/crm_case_section.js +++ b/addons/crm/static/src/js/crm_case_section.js @@ -9,26 +9,4 @@ openerp.crm = function(openerp) { }, }); - openerp.crm.SparklineBarWidget = openerp.web_kanban.AbstractField.extend({ - className: "oe_sparkline_bar", - start: function() { - var self = this; - var title = this.$node.html(); - setTimeout(function () { - var value = _.pluck(self.field.value, 'value'); - var tooltips = _.pluck(self.field.value, 'tooltip'); - self.$el.sparkline(value, { - type: 'bar', - barWidth: 5, - tooltipFormat: '{{offset:offset}} {{value}}', - tooltipValueLookups: { - 'offset': tooltips - }, - }); - self.$el.tipsy({'delayIn': 0, 'html': true, 'title': function(){return title}, 'gravity': 'n'}); - }, 0); - }, - }); - openerp.web_kanban.fields_registry.add("sparkline_bar", "openerp.crm.SparklineBarWidget"); - }; diff --git a/addons/sale_crm/__openerp__.py b/addons/sale_crm/__openerp__.py index 7db1aa1eff0..7a57484eab8 100644 --- a/addons/sale_crm/__openerp__.py +++ b/addons/sale_crm/__openerp__.py @@ -37,7 +37,7 @@ modules. 'author': 'OpenERP SA', 'website': 'http://www.openerp.com', 'images': ['images/crm_statistics_dashboard.jpeg', 'images/opportunity_to_quote.jpeg'], - 'depends': ['sale', 'crm'], + 'depends': ['sale', 'crm', 'web_kanban_gauge'], 'data': [ 'wizard/crm_make_sale_view.xml', 'sale_crm_view.xml', @@ -48,7 +48,6 @@ modules. 'report/sale_crm_account_invoice_report_view.xml', ], 'js': [ - 'static/lib/justgage.js', 'static/src/js/sale_crm.js', ], 'demo': ['sale_crm_demo.xml'], diff --git a/addons/sale_crm/sale_crm_view.xml b/addons/sale_crm/sale_crm_view.xml index 7812b8d2687..a1e201d9b7f 100644 --- a/addons/sale_crm/sale_crm_view.xml +++ b/addons/sale_crm/sale_crm_view.xml @@ -268,8 +268,8 @@
- Invoiced - Forecast + Invoiced + Forecast

Define an invoicing target in the sales team settings to see the period's achievement and forecast at a glance. diff --git a/addons/sale_crm/static/lib/justgage.js b/addons/sale_crm/static/lib/justgage.js deleted file mode 100644 index 52b5c6ea0c3..00000000000 --- a/addons/sale_crm/static/lib/justgage.js +++ /dev/null @@ -1,883 +0,0 @@ -/** - * JustGage - this is work-in-progress, unreleased, unofficial code, so it might not work top-notch :) - * Check http://www.justgage.com for official releases - * Licensed under MIT. - * @author Bojan Djuricic (@Toorshia) - * - * LATEST UPDATES - - * ----------------------------- - * April 01, 2013. - * ----------------------------- - * fix - https://github.com/toorshia/justgage/issues/46 - - * ----------------------------- - * March 26, 2013. - * ----------------------------- - * customSectors - define specific color for value range (0-10 : red, 10-30 : blue etc.) - - * ----------------------------- - * March 23, 2013. - * ----------------------------- - * counter - option to animate value in counting fashion - * fix - https://github.com/toorshia/justgage/issues/45 - - * ----------------------------- - * March 13, 2013. - * ----------------------------- - * refresh method - added optional 'max' parameter to use when you need to update max value - - * ----------------------------- - * February 26, 2013. - * ----------------------------- - * decimals - option to define/limit number of decimals when not using humanFriendly or customRenderer to display value - * fixed a missing parameters bug when calling generateShadow() for IE < 9 - - * ----------------------------- - * December 31, 2012. - * ----------------------------- - * fixed text y-position for hidden divs - workaround for Raphael 'dy' bug - https://github.com/DmitryBaranovskiy/raphael/issues/491 - * 'show' parameters, like showMinMax are now 'hide' because I am lame developer - please update these in your setups - * Min and Max labels are now auto-off when in donut mode - * Start angle in donut mode is now 90 - * donutStartAngle - option to define start angle for donut - - * ----------------------------- - * November 25, 2012. - * ----------------------------- - * Option to define custom rendering function for displayed value - - * ----------------------------- - * November 19, 2012. - * ----------------------------- - * Config.value is now updated after gauge refresh - - * ----------------------------- - * November 13, 2012. - * ----------------------------- - * Donut display mode added - * Option to hide value label - * Option to enable responsive gauge size - * Removed default title attribute - * Option to accept min and max defined as string values - * Option to configure value symbol - * Fixed bad aspect ratio calculations - * Option to configure minimum font size for all texts - * Option to show shorthand big numbers (human friendly) - */ - - JustGage = function(config) { - - if (!config.id) {alert("Missing id parameter for gauge!"); return false;} - if (!config.node) { - if (!document.getElementById(config.id)) {alert("No element with id: \""+config.id+"\" found!"); return false;} - config.node = document.getElementById(config.id); - } - - var obj = this; - - // configurable parameters - obj.config = - { - // id : string - // this is container element id - id : config.id, - - // node : string - // the node to use instead of DOM - node : config.node, - - // title : string - // gauge title - title : (config.title) ? config.title : "", - - // titleFontColor : string - // color of gauge title - titleFontColor : (config.titleFontColor) ? config.titleFontColor : "#999999", - - // value : int - // value gauge is showing - value : (config.value) ? config.value : 0, - - - // valueFontColor : string - // color of label showing current value - valueFontColor : (config.valueFontColor) ? config.valueFontColor : "#010101", - - // symbol : string - // special symbol to show next to value - symbol : (config.symbol) ? config.symbol : "", - - // min : int - // min value - min : (config.min) ? parseFloat(config.min) : 0, - - // max : int - // max value - max : (config.max) ? parseFloat(config.max) : 100, - - // humanFriendlyDecimal : int - // number of decimal places for our human friendly number to contain - humanFriendlyDecimal : (config.humanFriendlyDecimal) ? config.humanFriendlyDecimal : 0, - - // textRenderer: func - // function applied before rendering text - textRenderer : (config.textRenderer) ? config.textRenderer : null, - - // gaugeWidthScale : float - // width of the gauge element - gaugeWidthScale : (config.gaugeWidthScale) ? config.gaugeWidthScale : 1.0, - - // gaugeColor : string - // background color of gauge element - gaugeColor : (config.gaugeColor) ? config.gaugeColor : "#edebeb", - - // label : string - // text to show below value - label : (config.label) ? config.label : "", - - // labelFontColor : string - // color of label showing label under value - labelFontColor : (config.labelFontColor) ? config.labelFontColor : "#b3b3b3", - - // shadowOpacity : int - // 0 ~ 1 - shadowOpacity : (config.shadowOpacity) ? config.shadowOpacity : 0.2, - - // shadowSize: int - // inner shadow size - shadowSize : (config.shadowSize) ? config.shadowSize : 5, - - // shadowVerticalOffset : int - // how much shadow is offset from top - shadowVerticalOffset : (config.shadowVerticalOffset) ? config.shadowVerticalOffset : 3, - - // levelColors : string[] - // colors of indicator, from lower to upper, in RGB format - levelColors : (config.levelColors) ? config.levelColors : [ - "#a9d70b", - "#f9c802", - "#ff0000" - ], - - // startAnimationTime : int - // length of initial animation - startAnimationTime : (config.startAnimationTime) ? config.startAnimationTime : 700, - - // startAnimationType : string - // type of initial animation (linear, >, <, <>, bounce) - startAnimationType : (config.startAnimationType) ? config.startAnimationType : ">", - - // refreshAnimationTime : int - // length of refresh animation - refreshAnimationTime : (config.refreshAnimationTime) ? config.refreshAnimationTime : 700, - - // refreshAnimationType : string - // type of refresh animation (linear, >, <, <>, bounce) - refreshAnimationType : (config.refreshAnimationType) ? config.refreshAnimationType : ">", - - // donutStartAngle : int - // angle to start from when in donut mode - donutStartAngle : (config.donutStartAngle) ? config.donutStartAngle : 90, - - // valueMinFontSize : int - // absolute minimum font size for the value - valueMinFontSize : config.valueMinFontSize || 16, - - // titleMinFontSize - // absolute minimum font size for the title - titleMinFontSize : config.titleMinFontSize || 10, - - // labelMinFontSize - // absolute minimum font size for the label - labelMinFontSize : config.labelMinFontSize || 10, - - // minLabelMinFontSize - // absolute minimum font size for the minimum label - minLabelMinFontSize : config.minLabelMinFontSize || 10, - - // maxLabelMinFontSize - // absolute minimum font size for the maximum label - maxLabelMinFontSize : config.maxLabelMinFontSize || 10, - - // hideValue : bool - // hide value text - hideValue : (config.hideValue) ? config.hideValue : false, - - // hideMinMax : bool - // hide min and max values - hideMinMax : (config.hideMinMax) ? config.hideMinMax : false, - - // hideInnerShadow : bool - // hide inner shadow - hideInnerShadow : (config.hideInnerShadow) ? config.hideInnerShadow : false, - - // humanFriendly : bool - // convert large numbers for min, max, value to human friendly (e.g. 1234567 -> 1.23M) - humanFriendly : (config.humanFriendly) ? config.humanFriendly : false, - - // noGradient : bool - // whether to use gradual color change for value, or sector-based - noGradient : (config.noGradient) ? config.noGradient : false, - - // donut : bool - // show full donut gauge - donut : (config.donut) ? config.donut : false, - - // relativeGaugeSize : bool - // whether gauge size should follow changes in container element size - relativeGaugeSize : (config.relativeGaugeSize) ? config.relativeGaugeSize : false, - - // counter : bool - // animate level number change - counter : (config.counter) ? config.counter : false, - - // decimals : int - // number of digits after floating point - decimals : (config.decimals) ? config.decimals : 0, - - // customSectors : [] of objects - // number of digits after floating point - customSectors : (config.customSectors) ? config.customSectors : [] - }; - - // variables - var - canvasW, - canvasH, - widgetW, - widgetH, - aspect, - dx, - dy, - titleFontSize, - titleX, - titleY, - valueFontSize, - valueX, - valueY, - labelFontSize, - labelX, - labelY, - minFontSize, - minX, - minY, - maxFontSize, - maxX, - maxY; - - // overflow values - if (this.config.value > this.config.max) this.config.value = this.config.max; - if (this.config.value < this.config.min) this.config.value = this.config.min; - this.originalValue = config.value; - - // canvas - this.canvas = Raphael(this.config.node, "100%", "100%"); - if (this.config.relativeGaugeSize === true) { - this.canvas.setViewBox(0, 0, 200, 150, true); - } - - // canvas dimensions - if (this.config.relativeGaugeSize === true) { - canvasW = 200; - canvasH = 150; - } else { - canvasW = getStyle(this.config.node, "width").slice(0, -2) * 1; - canvasH = getStyle(this.config.node, "height").slice(0, -2) * 1; - } - - // widget dimensions - if (this.config.donut === true) { - - // DONUT ******************************* - - // width more than height - if(canvasW > canvasH) { - widgetH = canvasH; - widgetW = widgetH; - // width less than height - } else if (canvasW < canvasH) { - widgetW = canvasW; - widgetH = widgetW; - // if height don't fit, rescale both - if(widgetH > canvasH) { - aspect = widgetH / canvasH; - widgetH = widgetH / aspect; - widgetW = widgetH / aspect; - } - // equal - } else { - widgetW = canvasW; - widgetH = widgetW; - } - - // delta - dx = (canvasW - widgetW)/2; - dy = (canvasH - widgetH)/2; - - // title - titleFontSize = ((widgetH / 8) > 10) ? (widgetH / 10) : 10; - titleX = dx + widgetW / 2; - titleY = dy + widgetH / 11; - - // value - valueFontSize = ((widgetH / 6.4) > 16) ? (widgetH / 5.4) : 18; - valueX = dx + widgetW / 2; - if(this.config.label !== '') { - valueY = dy + widgetH / 1.85; - } else { - valueY = dy + widgetH / 1.7; - } - - // label - labelFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; - labelX = dx + widgetW / 2; - labelY = valueY + labelFontSize; - - // min - minFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; - minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; - minY = labelY; - - // max - maxFontSize = ((widgetH / 16) > 10) ? (widgetH / 16) : 10; - maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; - maxY = labelY; - - } else { - // HALF ******************************* - - // width more than height - if(canvasW > canvasH) { - widgetH = canvasH; - widgetW = widgetH * 1.25; - //if width doesn't fit, rescale both - if(widgetW > canvasW) { - aspect = widgetW / canvasW; - widgetW = widgetW / aspect; - widgetH = widgetH / aspect; - } - // width less than height - } else if (canvasW < canvasH) { - widgetW = canvasW; - widgetH = widgetW / 1.25; - // if height don't fit, rescale both - if(widgetH > canvasH) { - aspect = widgetH / canvasH; - widgetH = widgetH / aspect; - widgetW = widgetH / aspect; - } - // equal - } else { - widgetW = canvasW; - widgetH = widgetW * 0.75; - } - - // delta - dx = (canvasW - widgetW)/2; - dy = (canvasH - widgetH)/2; - - // title - titleFontSize = ((widgetH / 8) > this.config.titleMinFontSize) ? (widgetH / 10) : this.config.titleMinFontSize; - titleX = dx + widgetW / 2; - titleY = dy + widgetH / 6.4; - - // value - valueFontSize = ((widgetH / 6.5) > this.config.valueMinFontSize) ? (widgetH / 6.5) : this.config.valueMinFontSize; - valueX = dx + widgetW / 2; - valueY = dy + widgetH / 1.275; - - // label - labelFontSize = ((widgetH / 16) > this.config.labelMinFontSize) ? (widgetH / 16) : this.config.labelMinFontSize; - labelX = dx + widgetW / 2; - labelY = valueY + valueFontSize / 2 + 5; - - // min - minFontSize = ((widgetH / 16) > this.config.minLabelMinFontSize) ? (widgetH / 16) : this.config.minLabelMinFontSize; - minX = dx + (widgetW / 10) + (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; - minY = labelY; - - // max - maxFontSize = ((widgetH / 16) > this.config.maxLabelMinFontSize) ? (widgetH / 16) : this.config.maxLabelMinFontSize; - maxX = dx + widgetW - (widgetW / 10) - (widgetW / 6.666666666666667 * this.config.gaugeWidthScale) / 2 ; - maxY = labelY; - } - - // parameters - this.params = { - canvasW : canvasW, - canvasH : canvasH, - widgetW : widgetW, - widgetH : widgetH, - dx : dx, - dy : dy, - titleFontSize : titleFontSize, - titleX : titleX, - titleY : titleY, - valueFontSize : valueFontSize, - valueX : valueX, - valueY : valueY, - labelFontSize : labelFontSize, - labelX : labelX, - labelY : labelY, - minFontSize : minFontSize, - minX : minX, - minY : minY, - maxFontSize : maxFontSize, - maxX : maxX, - maxY : maxY - }; - - // var clear - canvasW, canvasH, widgetW, widgetH, aspect, dx, dy, titleFontSize, titleX, titleY, valueFontSize, valueX, valueY, labelFontSize, labelX, labelY, minFontSize, minX, minY, maxFontSize, maxX, maxY = null - - // pki - custom attribute for generating gauge paths - this.canvas.customAttributes.pki = function (value, min, max, w, h, dx, dy, gws, donut) { - - var alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path; - - if (donut) { - alpha = (1 - 2 * (value - min) / (max - min)) * Math.PI; - Ro = w / 2 - w / 7; - Ri = Ro - w / 6.666666666666667 * gws; - - Cx = w / 2 + dx; - Cy = h / 1.95 + dy; - - Xo = w / 2 + dx + Ro * Math.cos(alpha); - Yo = h - (h - Cy) + 0 - Ro * Math.sin(alpha); - Xi = w / 2 + dx + Ri * Math.cos(alpha); - Yi = h - (h - Cy) + 0 - Ri * Math.sin(alpha); - - path += "M" + (Cx - Ri) + "," + Cy + " "; - path += "L" + (Cx - Ro) + "," + Cy + " "; - if (value > ((max - min) / 2)) { - path += "A" + Ro + "," + Ro + " 0 0 1 " + (Cx + Ro) + "," + Cy + " "; - } - path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; - path += "L" + Xi + "," + Yi + " "; - if (value > ((max - min) / 2)) { - path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx + Ri) + "," + Cy + " "; - } - path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; - path += "Z "; - - return { path: path }; - - } else { - alpha = (1 - (value - min) / (max - min)) * Math.PI; - Ro = w / 2 - w / 10; - Ri = Ro - w / 6.666666666666667 * gws; - - Cx = w / 2 + dx; - Cy = h / 1.25 + dy; - - Xo = w / 2 + dx + Ro * Math.cos(alpha); - Yo = h - (h - Cy) + 0 - Ro * Math.sin(alpha); - Xi = w / 2 + dx + Ri * Math.cos(alpha); - Yi = h - (h - Cy) + 0 - Ri * Math.sin(alpha); - - path += "M" + (Cx - Ri) + "," + Cy + " "; - path += "L" + (Cx - Ro) + "," + Cy + " "; - path += "A" + Ro + "," + Ro + " 0 0 1 " + Xo + "," + Yo + " "; - path += "L" + Xi + "," + Yi + " "; - path += "A" + Ri + "," + Ri + " 0 0 0 " + (Cx - Ri) + "," + Cy + " "; - path += "Z "; - - return { path: path }; - } - - // var clear - alpha, Ro, Ri, Cx, Cy, Xo, Yo, Xi, Yi, path = null; - }; - - // gauge - this.gauge = this.canvas.path().attr({ - "stroke": "none", - "fill": this.config.gaugeColor, - pki: [this.config.max, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut] - }); - this.gauge.id = this.config.id+"-gauge"; - - // level - this.level = this.canvas.path().attr({ - "stroke": "none", - "fill": getColor(this.config.value, (this.config.value - this.config.min) / (this.config.max - this.config.min), this.config.levelColors, this.config.noGradient, this.config.customSectors), - pki: [this.config.min, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut] - }); - if(this.config.donut) { - this.level.transform("r" + this.config.donutStartAngle + ", " + (this.params.widgetW/2 + this.params.dx) + ", " + (this.params.widgetH/1.95 + this.params.dy)); - } - this.level.id = this.config.id+"-level"; - - // title - this.txtTitle = this.canvas.text(this.params.titleX, this.params.titleY, this.config.title); - this.txtTitle.attr({ - "font-size":this.params.titleFontSize, - "font-weight":"bold", - "font-family":"Arial", - "fill":this.config.titleFontColor, - "fill-opacity":"1" - }); - setDy(this.txtTitle, this.params.titleFontSize, this.params.titleY); - this.txtTitle.id = this.config.id+"-txttitle"; - - // value - this.txtValue = this.canvas.text(this.params.valueX, this.params.valueY, 0); - this.txtValue.attr({ - "font-size":this.params.valueFontSize, - "font-weight":"bold", - "font-family":"Arial", - "fill":this.config.valueFontColor, - "fill-opacity":"0" - }); - setDy(this.txtValue, this.params.valueFontSize, this.params.valueY); - this.txtValue.id = this.config.id+"-txtvalue"; - - // label - this.txtLabel = this.canvas.text(this.params.labelX, this.params.labelY, this.config.label); - this.txtLabel.attr({ - "font-size":this.params.labelFontSize, - "font-weight":"normal", - "font-family":"Arial", - "fill":this.config.labelFontColor, - "fill-opacity":"0" - }); - setDy(this.txtLabel, this.params.labelFontSize, this.params.labelY); - this.txtLabel.id = this.config.id+"-txtlabel"; - - // min - this.txtMinimum = this.config.min; - if( this.config.humanFriendly ) this.txtMinimum = humanFriendlyNumber( this.config.min, this.config.humanFriendlyDecimal ); - this.txtMin = this.canvas.text(this.params.minX, this.params.minY, this.txtMinimum); - this.txtMin.attr({ - "font-size":this.params.minFontSize, - "font-weight":"normal", - "font-family":"Arial", - "fill":this.config.labelFontColor, - "fill-opacity": (this.config.hideMinMax || this.config.donut)? "0" : "1" - }); - setDy(this.txtMin, this.params.minFontSize, this.params.minY); - this.txtMin.id = this.config.id+"-txtmin"; - - // max - this.txtMaximum = this.config.max; - if( this.config.humanFriendly ) this.txtMaximum = humanFriendlyNumber( this.config.max, this.config.humanFriendlyDecimal ); - this.txtMax = this.canvas.text(this.params.maxX, this.params.maxY, this.txtMaximum); - this.txtMax.attr({ - "font-size":this.params.maxFontSize, - "font-weight":"normal", - "font-family":"Arial", - "fill":this.config.labelFontColor, - "fill-opacity": (this.config.hideMinMax || this.config.donut)? "0" : "1" - }); - setDy(this.txtMax, this.params.maxFontSize, this.params.maxY); - this.txtMax.id = this.config.id+"-txtmax"; - - var defs = this.canvas.canvas.childNodes[1]; - var svg = "http://www.w3.org/2000/svg"; - - if (ie < 9) { - onCreateElementNsReady(function() { - this.generateShadow(svg, defs); - }); - } else { - this.generateShadow(svg, defs); - } - - // var clear - defs, svg = null; - - // execute on each animation frame - function onAnimate() { - if (obj.config.counter) { - var currentValue = obj.level.attr("pki"); - - if(obj.config.textRenderer) { - // this.originalValue = this.config.textRenderer(this.originalValue); - obj.txtValue.attr("text", obj.config.textRenderer(Math.floor(currentValue[0]))); - } else if(obj.config.humanFriendly) { - // this.originalValue = humanFriendlyNumber( this.originalValue, this.config.humanFriendlyDecimal ) + this.config.symbol; - obj.txtValue.attr("text", humanFriendlyNumber( Math.floor(currentValue[0]), obj.config.humanFriendlyDecimal ) + obj.config.symbol); - } else { - // this.originalValue += this.config.symbol; - obj.txtValue.attr("text", (currentValue[0] * 1).toFixed(obj.config.decimals) + obj.config.symbol); - } - - setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); - currentValue = null; - } - } - - if(!obj.config.counter) { - if(obj.config.textRenderer) { - obj.originalValue = obj.config.textRenderer(obj.originalValue); - } else if(obj.config.humanFriendly) { - obj.originalValue = humanFriendlyNumber( obj.originalValue, obj.config.humanFriendlyDecimal ) + obj.config.symbol; - } else { - obj.originalValue = (obj.originalValue * 1).toFixed(obj.config.decimals) + obj.config.symbol; - } - - obj.txtValue.attr("text", obj.originalValue); - setDy(obj.txtValue, obj.params.valueFontSize, obj.params.valueY); - } - - //event fired on each animation frame - eve.on("raphael.anim.frame.*", onAnimate); - - // animate gauge level - this.level.animate({pki: [this.config.value, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut]}, this.config.startAnimationTime, this.config.startAnimationType); - - // animate value - this.txtValue.animate({"fill-opacity":"1"}, this.config.startAnimationTime, this.config.startAnimationType); - - // animate label - this.txtLabel.animate({"fill-opacity":"1"}, this.config.startAnimationTime, this.config.startAnimationType); -}; - -/** Refresh gauge level */ -JustGage.prototype.refresh = function(val, max) { - - var originalVal, displayVal, color, max = max || null; - - // set new max - if(max !== null) { - this.config.max = max; - - this.txtMaximum = this.config.max; - if( this.config.humanFriendly ) this.txtMaximum = humanFriendlyNumber( this.config.max, this.config.humanFriendlyDecimal ); - this.txtMax.attr({"text" : this.config.max}); - setDy(this.txtMax, this.params.maxFontSize, this.params.maxY); - } - - // overflow values - originalVal = val; - displayVal = val; - if ((val * 1) > (this.config.max * 1)) {val = (this.config.max * 1);} - if ((val * 1) < (this.config.min * 1)) {val = (this.config.min * 1);} - - color = getColor(val, (val - this.config.min) / (this.config.max - this.config.min), this.config.levelColors, this.config.noGradient, this.config.customSectors); - - if(this.config.textRenderer) { - displayVal = this.config.textRenderer(displayVal); - } else if( this.config.humanFriendly ) { - displayVal = humanFriendlyNumber( displayVal, this.config.humanFriendlyDecimal ) + this.config.symbol; - } else { - displayVal = (displayVal * 1).toFixed(this.config.decimals) + this.config.symbol; - } - - if(!this.config.counter) { - this.canvas.getById(this.config.id+"-txtvalue").attr({"text":displayVal}); - setDy(this.canvas.getById(this.config.id+"-txtvalue"), this.params.valueFontSize, this.params.valueY); - } - - this.canvas.getById(this.config.id+"-level").animate({pki: [val, this.config.min, this.config.max, this.params.widgetW, this.params.widgetH, this.params.dx, this.params.dy, this.config.gaugeWidthScale, this.config.donut], "fill":color}, this.config.refreshAnimationTime, this.config.refreshAnimationType); - this.config.value = val * 1; - - // var clear - originalVal, displayVal, color, max = null; -}; - -/** Generate shadow */ -JustGage.prototype.generateShadow = function(svg, defs) { - - var gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3; - - // FILTER - gaussFilter=document.createElementNS(svg,"filter"); - gaussFilter.setAttribute("id", this.config.id + "-inner-shadow"); - defs.appendChild(gaussFilter); - - // offset - feOffset = document.createElementNS(svg,"feOffset"); - feOffset.setAttribute("dx", 0); - feOffset.setAttribute("dy", this.config.shadowVerticalOffset); - gaussFilter.appendChild(feOffset); - - // blur - feGaussianBlur = document.createElementNS(svg,"feGaussianBlur"); - feGaussianBlur.setAttribute("result","offset-blur"); - feGaussianBlur.setAttribute("stdDeviation", this.config.shadowSize); - gaussFilter.appendChild(feGaussianBlur); - - // composite 1 - feComposite1 = document.createElementNS(svg,"feComposite"); - feComposite1.setAttribute("operator","out"); - feComposite1.setAttribute("in", "SourceGraphic"); - feComposite1.setAttribute("in2","offset-blur"); - feComposite1.setAttribute("result","inverse"); - gaussFilter.appendChild(feComposite1); - - // flood - feFlood = document.createElementNS(svg,"feFlood"); - feFlood.setAttribute("flood-color","black"); - feFlood.setAttribute("flood-opacity", this.config.shadowOpacity); - feFlood.setAttribute("result","color"); - gaussFilter.appendChild(feFlood); - - // composite 2 - feComposite2 = document.createElementNS(svg,"feComposite"); - feComposite2.setAttribute("operator","in"); - feComposite2.setAttribute("in", "color"); - feComposite2.setAttribute("in2","inverse"); - feComposite2.setAttribute("result","shadow"); - gaussFilter.appendChild(feComposite2); - - // composite 3 - feComposite3 = document.createElementNS(svg,"feComposite"); - feComposite3.setAttribute("operator","over"); - feComposite3.setAttribute("in", "shadow"); - feComposite3.setAttribute("in2","SourceGraphic"); - gaussFilter.appendChild(feComposite3); - - // set shadow - if (!this.config.hideInnerShadow) { - this.canvas.canvas.childNodes[2].setAttribute("filter", "url(#" + this.config.id + "-inner-shadow)"); - this.canvas.canvas.childNodes[3].setAttribute("filter", "url(#" + this.config.id + "-inner-shadow)"); - } - - // var clear - gaussFilter, feOffset, feGaussianBlur, feComposite1, feFlood, feComposite2, feComposite3 = null; - -}; - -/** Get color for value */ -function getColor(val, pct, col, noGradient, custSec) { - - var no, inc, colors, percentage, rval, gval, bval, lower, upper, range, rangePct, pctLower, pctUpper, color; - var noGradient = noGradient || custSec.length > 0; - - if(custSec.length > 0) { - for(var i = 0; i < custSec.length; i++) { - if(val > custSec[i].lo && val <= custSec[i].hi) { - return custSec[i].color; - } - } - } - - no = col.length; - if (no === 1) return col[0]; - inc = (noGradient) ? (1 / no) : (1 / (no - 1)); - colors = []; - for (var i = 0; i < col.length; i++) { - percentage = (noGradient) ? (inc * (i + 1)) : (inc * i); - rval = parseInt((cutHex(col[i])).substring(0,2),16); - gval = parseInt((cutHex(col[i])).substring(2,4),16); - bval = parseInt((cutHex(col[i])).substring(4,6),16); - colors[i] = { pct: percentage, color: { r: rval, g: gval, b: bval } }; - } - - if(pct === 0) { - return 'rgb(' + [colors[0].color.r, colors[0].color.g, colors[0].color.b].join(',') + ')'; - } - - for (var j = 0; j < colors.length; j++) { - if (pct <= colors[j].pct) { - if (noGradient) { - return 'rgb(' + [colors[j].color.r, colors[j].color.g, colors[j].color.b].join(',') + ')'; - } else { - lower = colors[j - 1]; - upper = colors[j]; - range = upper.pct - lower.pct; - rangePct = (pct - lower.pct) / range; - pctLower = 1 - rangePct; - pctUpper = rangePct; - color = { - r: Math.floor(lower.color.r * pctLower + upper.color.r * pctUpper), - g: Math.floor(lower.color.g * pctLower + upper.color.g * pctUpper), - b: Math.floor(lower.color.b * pctLower + upper.color.b * pctUpper) - }; - return 'rgb(' + [color.r, color.g, color.b].join(',') + ')'; - } - } - } - -} - -/** Fix Raphael display:none tspan dy attribute bug */ -function setDy(elem, fontSize, txtYpos) { - if ((!ie || ie > 9) && (elem.node.firstChild.attributes.dy)) { - elem.node.firstChild.attributes.dy.value = 0; - } -} - -/** Random integer */ -function getRandomInt (min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; -} - -/** Cut hex */ -function cutHex(str) { - return (str.charAt(0)=="#") ? str.substring(1,7):str; -} - -/** Human friendly number suffix - From: http://stackoverflow.com/questions/2692323/code-golf-friendly-number-abbreviator */ -function humanFriendlyNumber( n, d ) { - var p, d2, i, s; - - p = Math.pow; - d2 = p(10, d); - i = 7; - while( i ) { - s = p(10,i--*3); - if( s <= n ) { - n = Math.round(n*d2/s)/d2+"KMGTPE"[i]; - } - } - return n; -} - -/** Get style */ -function getStyle(oElm, strCssRule){ - var strValue = ""; - if(document.defaultView && document.defaultView.getComputedStyle){ - strValue = document.defaultView.getComputedStyle(oElm).getPropertyValue(strCssRule); - } - else if(oElm.currentStyle){ - strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ - return p1.toUpperCase(); - }); - strValue = oElm.currentStyle[strCssRule]; - } - return strValue; -} - -/** Create Element NS Ready */ -function onCreateElementNsReady(func) { - if (document.createElementNS !== undefined) { - func(); - } else { - setTimeout(function() { onCreateElementNsReady(func); }, 100); - } -} - -/** Get IE version */ -// ---------------------------------------------------------- -// A short snippet for detecting versions of IE in JavaScript -// without resorting to user-agent sniffing -// ---------------------------------------------------------- -// If you're not in IE (or IE version is less than 5) then: -// ie === undefined -// If you're in IE (>=5) then you can determine which version: -// ie === 7; // IE7 -// Thus, to detect IE: -// if (ie) {} -// And to detect the version: -// ie === 6 // IE6 -// ie > 7 // IE8, IE9 ... -// ie < 9 // Anything less than IE9 -// ---------------------------------------------------------- -// UPDATE: Now using Live NodeList idea from @jdalton -var ie = (function(){ - - var undef, - v = 3, - div = document.createElement('div'), - all = div.getElementsByTagName('i'); - - while ( - div.innerHTML = '', - all[0] - ); - return v > 4 ? v : undef; -}()); \ No newline at end of file diff --git a/addons/sale_crm/static/src/js/sale_crm.js b/addons/sale_crm/static/src/js/sale_crm.js deleted file mode 100644 index 207ac959af3..00000000000 --- a/addons/sale_crm/static/src/js/sale_crm.js +++ /dev/null @@ -1,108 +0,0 @@ -openerp.sale_crm = function(openerp) { -var _t = openerp.web._t; - -openerp.sale_crm.GaugeWidget = openerp.web_kanban.AbstractField.extend({ - className: "oe_gage", - start: function() { - var self = this; - - var parent = this.getParent(); - var max = this.options.max_field ? parent.record[this.options.max_field].raw_value : 100; - var label = this.options.label_field ? parent.record[this.options.label_field].raw_value : ""; - var title = this.$node.html(); - var val = this.field.value; - var value = _.isArray(val) && val.length ? val[val.length-1]['value'] : val; - var unique_id = _.uniqueId("JustGage"); - - this.$el.empty() - .attr('style', this.$node.attr('style') + ';position:relative; display:inline-block;') - .attr('id', unique_id); - this.gage = new JustGage({ - id: unique_id, - node: this.$el[0], - title: title, - value: value, - min: 0, - max: max, - relativeGaugeSize: true, - humanFriendly: true, - titleFontColor: '#333333', - valueFontColor: '#333333', - labelFontColor: '#000', - label: label, - levelColors: [ - "#ff0000", - "#f9c802", - "#a9d70b" - ], - }); - - var flag_open = false; - if (self.options.action_change) { - var $svg = self.$el.find('svg'); - var css = { - 'text-align': 'center', - 'position': 'absolute', - 'width': self.$el.outerWidth() + 'px', - 'top': (self.$el.outerHeight()/2-5) + 'px' - }; - - self.$el.click(function (event) { - event.stopPropagation(); - flag_open = false; - if (!parent.view.is_action_enabled('edit')) { - return; - } - if (!self.$el.find(".oe_justgage_edit").size()) { - $div = $('
'); - $div.css(css); - $input = $('').val(value); - $input.css({ - 'text-align': 'center', - 'margin': 'auto', - 'width': ($svg.outerWidth()-40) + 'px' - }); - $div.append($input); - self.$el.prepend($div) - $input.focus() - .keydown(function (event) { - event.stopPropagation(); - if (event.keyCode == 13 || event.keyCode == 9) { - if ($input.val() != value) { - parent.view.dataset.call(self.options.action_change, [parent.id, $input.val()]).then(function () { - parent.do_reload(); - }); - } else { - $div.remove(); - } - } - }) - .click(function (event) { - event.stopPropagation(); - flag_open = false; - }) - .blur(function (event) { - if(!flag_open) { - self.$el.find(".oe_justgage_edit").remove(); - } else { - flag_open = false; - setTimeout(function () {$input.focus();}, 0); - } - }); - } - }).mousedown(function () { - flag_open = true; - }); - - if (!+value) { - $svg.fadeTo(0, 0.3); - $div = $('
').text(_t("Click to change value")); - $div.css(css); - self.$el.append($div); - } - } - }, -}); -openerp.web_kanban.fields_registry.add("gage", "openerp.sale_crm.GaugeWidget"); - -};