From 80657b1c29ec9dea947426fccc1ffc7b20a6d97a Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Mon, 24 Oct 2011 11:07:27 +0200 Subject: [PATCH 001/192] [IMP] support for jsonp bzr revid: chs@openerp.com-20111024090727-f8w5wv08ugxnrpt8 --- addons/web/__openerp__.py | 1 + addons/web/common/http.py | 137 ++++++++++++++++++++++++++----- addons/web/common/session.py | 4 +- addons/web/static/src/js/core.js | 29 +++---- 4 files changed, 132 insertions(+), 39 deletions(-) diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index 0afd43190d6..1cff3c7956b 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -28,6 +28,7 @@ "static/lib/underscore/underscore.string.js", "static/lib/labjs/LAB.src.js", "static/lib/py.parse/lib/py.js", + "static/src/js/jq_ajax.js", "static/src/js/boot.js", "static/src/js/core.js", "static/src/js/dates.js", diff --git a/addons/web/common/http.py b/addons/web/common/http.py index e23a0431a7c..ed7a5344192 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -85,13 +85,23 @@ class WebRequest(object): self.httpresponse = None self.httpsession = request.session self.config = config + self.session = None + + def init_session(self, session_id): + if self.session: + assert self.session.id == session_id + return + + self.session_id = session_id or uuid.uuid4().hex + self.session = self.httpsession.setdefault(self.session_id, session.OpenERPSession(self.session_id)) + self.session.config = self.config def init(self, params): self.params = dict(params) + # OpenERP session setup - self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex - self.session = self.httpsession.setdefault(self.session_id, session.OpenERPSession()) - self.session.config = self.config + session_id = self.params.pop("session_id", None) + self.init_session(session_id) self.context = self.params.pop('context', None) self.debug = self.params.pop('debug', False) != False @@ -129,25 +139,88 @@ class JsonRequest(WebRequest): """ - def dispatch(self, controller, method, requestf=None, request=None): - """ Calls the method asked for by the JSON-RPC2 request + + def _init_jsonrpc2(self): + assert self.jsonrequest.get('jsonrpc') == '2.0' + self.init(self.jsonrequest.get("params", {})) + response = {"jsonrpc": "2.0" } + return response + + def _init_jsonp(self): + self.init(self.jsonrequest) + return {} + + + def dispatch(self, controller, method): + """ Calls the method asked for by the JSON-RPC2 or JSONP request :param controller: the instance of the controller which received the request :param method: the method which received the request - :param requestf: a file-like object containing an encoded JSON-RPC2 request - :param request: a JSON-RPC2 request - :returns: an utf8 encoded JSON-RPC2 reply + :returns: an utf8 encoded JSON-RPC2 or JSONP reply """ - response = {"jsonrpc": "2.0" } + + requestf = self.httprequest.stream + direct_json_request = None + jsonp_callback = None + if requestf: + direct_json_request = requestf.read() + + if not direct_json_request: + params = self.httprequest.args + direct_json_request = params.get('r') + jsonp_callback = params.get('callback') + + if direct_json_request: + try: + self.jsonrequest = simplejson.loads(direct_json_request, object_hook=nonliterals.non_literal_decoder) + except Exception, e: + _logger.error(e) + return werkzeug.exceptions.BadRequest(e) + else: + # no direct json request, try to get it from jsonp POST request + params = self.httprequest.args + rid = params.get('rid') + session_id = params.get('sid') + if session_id: + self.init_session(session_id) + stored_request = self.session.jsonp_requests.get(rid, {}) + else: + stored_request = {} + + jsonp_callback = stored_request.get('jsonp') + self.jsonrequest = stored_request.get('params', {}) + + + if self.jsonrequest.get('jsonrpc') == '2.0': + response = self._init_jsonrpc2() + + def build_response(response): + content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder) + return werkzeug.wrappers.Response( + content, headers=[('Content-Type', 'application/json'), + ('Content-Length', len(content))]) + + + elif jsonp_callback: + + response = self._init_jsonp() + + def build_response(response): + content = "%s(%s);" % (\ + jsonp_callback, + simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder), + ) + + return werkzeug.wrappers.Response( + content, headers=[('Content-Type', 'application/javascript'), + ('Content-Length', len(content))]) + + else: + return werkzeug.exceptions.BadRequest() + error = None try: - # Read POST content or POST Form Data named "request" - if requestf: - self.jsonrequest = simplejson.load(requestf, object_hook=nonliterals.non_literal_decoder) - else: - self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) - self.init(self.jsonrequest.get("params", {})) if _logger.isEnabledFor(logging.DEBUG): _logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest)) response['id'] = self.jsonrequest.get('id') @@ -188,10 +261,8 @@ class JsonRequest(WebRequest): if _logger.isEnabledFor(logging.DEBUG): _logger.debug("<--\n%s", pprint.pformat(response)) - content = simplejson.dumps(response, cls=nonliterals.NonLiteralEncoder) - return werkzeug.wrappers.Response( - content, headers=[('Content-Type', 'application/json'), - ('Content-Length', len(content))]) + + return build_response(response) def jsonrequest(f): """ Decorator marking the decorated method as being a handler for a @@ -205,8 +276,7 @@ def jsonrequest(f): """ @functools.wraps(f) def json_handler(controller, request, config): - return JsonRequest(request, config).dispatch( - controller, f, requestf=request.stream) + return JsonRequest(request, config).dispatch(controller, f) json_handler.exposed = True return json_handler @@ -300,7 +370,8 @@ def session_context(request, storage_path, session_cookie='sessionid'): # either by login process or by HTTP requests without an OpenERP # session id, and are generally noise for key, value in request.session.items(): - if isinstance(value, session.OpenERPSession) and not value._uid: + if isinstance(value, session.OpenERPSession) and not value._uid and not value.jsonp_requests: + _logger.info('remove session %s: %r', key, value.jsonp_requests) del request.session[key] # FIXME: remove this when non-literals disappear @@ -344,6 +415,28 @@ class ControllerType(type): class Controller(object): __metaclass__ = ControllerType + +class JSONP(Controller): + _cp_path = '/web/jsonp' + + @httprequest + def post(self, req, request_id, params, callback): + params = simplejson.loads(params, object_hook=nonliterals.non_literal_decoder) + params.update( + session_id=req.session.id, + ) + params['session_id'] = req.session.id + req.session.jsonp_requests[request_id] = { + 'jsonp': callback, + 'params': params, + 'id': request_id, + } + + headers=[('Content-Type', 'text/plain; charset=utf-8')] + response = werkzeug.wrappers.Response(request_id, headers=headers) + return response + + class Root(object): """Root WSGI application for the OpenERP Web Client. diff --git a/addons/web/common/session.py b/addons/web/common/session.py index e8027db8ea4..06f46faa9d0 100644 --- a/addons/web/common/session.py +++ b/addons/web/common/session.py @@ -28,7 +28,8 @@ class OpenERPSession(object): Used to store references to non-literal domains which need to be round-tripped to the client browser. """ - def __init__(self): + def __init__(self, sid): + self.id = sid self.config = None self._db = False self._uid = False @@ -37,6 +38,7 @@ class OpenERPSession(object): self.context = {} self.contexts_store = {} self.domains_store = {} + self.jsonp_requests = {} # FIXME use a LRU def __getstate__(self): state = dict(self.__dict__) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 4ed33341ea6..1b6a6302f72 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -346,12 +346,12 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web * @param {String} [server] JSON-RPC endpoint hostname * @param {String} [port] JSON-RPC endpoint port */ - init: function(server, port) { + init: function(server) { this._super(); - this.server = (server == undefined) ? location.hostname : server; - this.port = (port == undefined) ? location.port : port; - this.rpc_mode = (server == location.hostname) ? "ajax" : "jsonp"; - this.debug = (window.location.search.indexOf('?debug') !== -1); + var hostname = _('%s//%s').sprintf(location.protocol, location.host); + this.server = (server == undefined) ? hostname : server; + this.rpc_mode = (this.server == hostname) ? "oe-json" : "oe-jsonp"; + this.debug = ($.deparam($.param.querystring()).debug != undefined); this.session_id = false; this.uid = false; this.user_context= {}; @@ -390,13 +390,9 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web // Call using the rpc_mode var deferred = $.Deferred(); - this.rpc_ajax(url, { - jsonrpc: "2.0", - method: "call", - params: params, - id: _.uniqueId('browser-client-') - }).then(function () {deferred.resolve.apply(deferred, arguments);}, - function(error) {deferred.reject(error, $.Event());}); + this.rpc_ajax(url, params) + .then(function () {deferred.resolve.apply(deferred, arguments);}, + function(error) {deferred.reject(error, $.Event());}); return deferred.fail(function() { deferred.fail(function(error, event) { if (!event.isDefaultPrevented()) { @@ -422,10 +418,11 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web var ajax = _.extend({ type: "POST", url: url, - dataType: 'json', + dataType: this.rpc_mode, contentType: 'application/json', - data: JSON.stringify(payload), - processData: false + data: payload, + processData: false, + openerp: _.extend({}, this), // need a plainObject }, url); var deferred = $.Deferred(); $.ajax(ajax).done(function(response, textStatus, jqXHR) { @@ -440,7 +437,7 @@ openerp.web.Session = openerp.web.CallbackEnabled.extend( /** @lends openerp.web } self.uid = false; self.on_session_invalid(function() { - self.rpc(url, payload.params, + self.rpc(url, payload, function() { deferred.resolve.apply(deferred, arguments); }, From 66a99fd118a5309f801d48c2cbc75ac08cc76805 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 25 Oct 2011 11:50:16 +0200 Subject: [PATCH 002/192] [FIX] web: add missing file bzr revid: chs@openerp.com-20111025095016-4ebswa44be2h4cmd --- addons/web/static/src/js/jq_ajax.js | 192 ++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 addons/web/static/src/js/jq_ajax.js diff --git a/addons/web/static/src/js/jq_ajax.js b/addons/web/static/src/js/jq_ajax.js new file mode 100644 index 00000000000..cf90016ba4c --- /dev/null +++ b/addons/web/static/src/js/jq_ajax.js @@ -0,0 +1,192 @@ + + $.ajaxSetup({ + converters: { + "json oe-jsonp": true, + "json oe-json": true, + } + }); + + + // common preconditions checks + $.ajaxPrefilter("oe-json oe-jsonp", function(options, originalOptions, jqXHR) { + console.log('use', options.dataType); + if (!$.isPlainObject(options.openerp)) { + console.error(options.openerp); + $.error('"openerp" option is required.'); + } + + if (_(options.openerp.server).endsWith('/')) { + options.openerp.server = options.openerp.server.substr(0, options.openerp.server.length-1); + } + + if (!$.isPlainObject(options.data)) { + $.error('data must not be serialized'); + } + options.processData = false; + }); + + + + $.ajaxPrefilter("oe-json", function(options, originalOptions, jqXHR) { + options.data = JSON.stringify({ + jsonrpc: '2.0', + method: 'call', + params: options.data, + id: _.uniqueId('browser-client-') + }); + + return 'json'; + }); + + + $.ajaxPrefilter("oe-jsonp", function(options, originalOptions, jqXHR) { + + var data = null; + if (options.data) { + data = $.param({r:JSON.stringify(options.data)}); + } + + + var max_url_length = options.max_url_length || 1000, + absolute_url, full_url; + + var r_has_protocol = /^https?:\/\//, + r_absolute_internal = /^\/[^\/]/; // starts with / (but not //) + + + if (r_has_protocol.test(options.url)) { + if (!_(options.url).startsWith(options.openerp.server + '/')) { + $.error('can only contact openerp.server'); + } + absolute_url = options.url; + } else if (r_absolute_internal.test(options.url)) { + absolute_url = options.openerp.server + options.url; + } else { // relative url + var parts = document.location.pathname.split('/'); + parts.pop(); + parts.push(options.url); + absolute_url = options.openerp.server + parts.join('/'); + } + + + /// now, made the same url changes that jQuery will do... + var rquery = /\?/, + rts = /([?&])_=[^&]*/; + + full_url = absolute_url; + if (data) { + full_url += (rquery.test(full_url) ? "&" : "?") + data; + } + + // Add anti-cache in url if needed + if (!options.cache) { + var ts = $.now(), + // try replacing _= if it is there + ret = full_url.replace(rts, "$1_=" + ts); + + // if nothing was replaced, add timestamp to the end + full_url = ret + ((ret === full_url) ? (rquery.test(full_url) ? "&" : "?") + "_=" + ts : ""); + } + + console.log('absolute_url', absolute_url); + console.log('full_url', full_url); + + options.url = absolute_url; + + if (full_url.length < max_url_length) { + options.type = "GET"; + options.data = data; + return "jsonp"; // classic jsonp query... + } + }); + + + $.ajaxTransport("oe-jsonp", function(options, originalOptions, jqXHR) { + + console.log('real oe-jsonp', options); + var $iframe = null; + var $form = $('
') + .attr('method', 'POST') + .attr('enctype', "multipart/form-data") + .attr('action', options.openerp.server + "/web/jsonp/post") + .hide() + .appendTo($('body')) + ; + + console.log($form); + + function cleanUp() { + if ($iframe) { + $iframe.unbind("load").attr("src", "javascript:false;").remove(); + } + $form.remove(); + } + + return { + + send: function(headers, completeCallback) { + + var ifid = _.uniqueId('oe_jsonp_iframe_'); + var request_id = _.uniqueId('browser-client-'); + var oe_callback = _.uniqueId('oe_callback_'); + + window[oe_callback] = function(result) { + completeCallback(200, 'success', {json: result}); + }; + + + $iframe = $(_("").sprintf(ifid, ifid)); + + + // the first bind is fired up when the iframe is added to the DOM + $iframe.bind('load', function() { + //console.log('bind1', this); + // the second bind is fired up when the result of the form submission is received + $iframe.unbind('load').bind('load', function() { + //console.log('bind2', this); + + // we cannot access the content of remote iframe. + // but we don't care, we try to get the result in any cases + + $.ajax({ + type: "GET", + url: options.url, + dataType: 'jsonp', + jsonp: false, // do not append callback=? argument on query string + jsonpCallback: oe_callback, + data: { + sid: options.openerp.session_id, + rid: request_id, + }, + }).always(function() { + cleanUp(); + }); + + }); + + + // now that the iframe can receive data, we fill and submit the form + var params = JSON.stringify(options.data); + + $form + .append($('').attr('value', options.openerp.session_id)) + .append($('').attr('value', request_id)) + .append($('').attr('value', params)) + .append($('').attr('value', oe_callback)) + .submit() + ; + + }); + + $form.attr('target', ifid) // set the iframe as target of the form + .after($iframe); // append the iframe to the DOM (will trigger the first load) + + }, + abort: function() { + cleanUp(); + }, + }; + + }); + + From 1b7125432843d0db93628b04e56065e77d7d14ee Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 26 Oct 2011 15:27:14 +0200 Subject: [PATCH 003/192] [FIX] jsonp: force crossdomain request bzr revid: chs@openerp.com-20111026132714-6uko5u7f35y2yaj4 --- addons/web/static/src/js/jq_ajax.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/web/static/src/js/jq_ajax.js b/addons/web/static/src/js/jq_ajax.js index cf90016ba4c..8d347c398d7 100644 --- a/addons/web/static/src/js/jq_ajax.js +++ b/addons/web/static/src/js/jq_ajax.js @@ -41,6 +41,8 @@ $.ajaxPrefilter("oe-jsonp", function(options, originalOptions, jqXHR) { + options.crossDomain = true; + var data = null; if (options.data) { data = $.param({r:JSON.stringify(options.data)}); From fd9ec559cbe39c6dd38a81be46c51c1e7bb0e220 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Tue, 8 Nov 2011 16:50:23 +0530 Subject: [PATCH 004/192] [IMP] marketing_campaign, marketing_campaign_crm_demo: Traceback generate when processing workitem, and Improved demo data of Email template bzr revid: ron@tinyerp.com-20111108112023-1fwd5vdez50lmiiw --- .../marketing_campaign/marketing_campaign.py | 2 +- .../marketing_campaign_demo.xml | 64 +++++++++---------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index 547281911c4..9dc48c99873 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -707,7 +707,7 @@ class marketing_campaign_workitem(osv.osv): if result: # process _chain - workitem = workitem.browse(context)[0] # reload + workitem = workitem.browse(context=context)[0] # reload date = datetime.strptime(workitem.date, DT_FMT) for transition in activity.to_ids: diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml index ee11fbcdb75..b89daa50438 100644 --- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml +++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml @@ -34,27 +34,27 @@ - Thanks for showing interest in OpenERP - info@tinyerp.com + Thanks for showing interest in OpenERP + info@tinyerp.com - + - Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team, + Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team, mako For OpenERP OnDemand Free Trial 2010 crm.lead - Propose to subscribe to the OpenERP Discovery Day on May 2010 - info@tinyerp.com + Propose to subscribe to the OpenERP Discovery Day on May 2010 + info@tinyerp.com - + - Hello,We have very good offer that might suit you. + Hello,We have very good offer that might suit you. We propose you to subscribe to the OpenERP Discovery Day on May 2010. If any further information required kindly revert back. We really appreciate your co-operation on this. @@ -65,14 +65,14 @@ - Thanks for subscribing to the OpenERP Discovery Day - info@tinyerp.com + Thanks for subscribing to the OpenERP Discovery Day + info@tinyerp.com - + - Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day. + Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, @@ -82,14 +82,14 @@ - Thanks for buying the OpenERP book - info@tinyerp.com + Thanks for buying the OpenERP book + info@tinyerp.com - + - Hello,Thanks for showing intrest and buying the OpenERP book. + Hello,Thanks for showing intrest and buying the OpenERP book. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, @@ -99,14 +99,14 @@ - Propose a free technical training to Gold partners - info@tinyerp.com + Propose a free technical training to Gold partners + info@tinyerp.com - + - Hello, We have very good offer that might suit you. + Hello, We have very good offer that might suit you. For our gold partners,We are arranging free technical training on june,2010. If any further information required kindly revert back. I really appreciate your co-operation on this. @@ -117,14 +117,14 @@ - Propose paid training to Silver partners - info@tinyerp.com + Propose paid training to Silver partners + info@tinyerp.com - + - Hello, We have very good offer that might suit you. + Hello, We have very good offer that might suit you. For our silver partners,We are paid technical training on june,2010. If any further information required kindly revert back. I really appreciate your co-operation on this. @@ -135,14 +135,14 @@ - Propose gold partnership to silver partners - info@tinyerp.com + Propose gold partnership to silver partners + info@tinyerp.com - + - Hello, We have very good offer that might suit you. + Hello, We have very good offer that might suit you. For our silver partners,We are offering Gold partnership. If any further information required kindly revert back. I really appreciate your co-operation on this. @@ -153,14 +153,14 @@ - Thanks for subscribing to technical training - info@tinyerp.com + Thanks for subscribing to technical training + info@tinyerp.com - + - Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this. + Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this. Regards,OpenERP Team, mako For subscribing to technical training From cf3c4d24cc07567dd5b5c70dced59e11961d0e1e Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Tue, 8 Nov 2011 17:38:26 +0530 Subject: [PATCH 005/192] [IMP] marketing_campaign_crm_demo: Improved demo data of Campaing on active mode bzr revid: ron@tinyerp.com-20111108120826-niki9oul07sdnl8q --- addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml index b89daa50438..90db37f2176 100644 --- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml +++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml @@ -181,6 +181,7 @@ OpenERP OnDemand Free Trial 2010 + active From 10bbbad52f76a7fc40eaf6de94bf9b3d14f8ff02 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 9 Nov 2011 09:14:59 +0100 Subject: [PATCH 006/192] [FIX] base.xml: use full absolute url for all images bzr revid: chs@openerp.com-20111109081459-b031iutztocpxo9w --- addons/web/static/src/xml/base.xml | 72 +++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 1fc98ba34ee..01da70335b6 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -264,7 +264,7 @@
- +
@@ -304,7 +304,7 @@ @@ -813,7 +813,7 @@ @@ -826,12 +826,12 @@ t-attf-class="field_#{widget.type}" t-attf-style="width: #{widget.field.translate ? '99' : '100'}%" > - +
-
- + Full featured
@@ -313,7 +313,7 @@
- + Open Source
@@ -322,7 +322,7 @@
- + User Friendly
@@ -350,13 +350,13 @@
  • - +
  • - +
  • - +
@@ -694,7 +694,7 @@ @@ -779,7 +779,7 @@ t-attf-class="field_#{widget.type}" t-attf-style="width: #{widget.field.translate ? '99' : '100'}%" /> - +
- @@ -938,14 +938,14 @@
@@ -973,7 +973,7 @@ @@ -982,13 +982,13 @@ @@ -996,7 +996,7 @@ - + Uploading ... @@ -1007,7 +1007,7 @@ @@ -1057,7 +1057,7 @@ t-att-title="attrs.help" t-att-class="classes.join(' ')" t-att-autofocus="attrs.default_focus === '1' ? 'autofocus' : undefined"> - +
@@ -1204,7 +1204,7 @@ - +

@@ -1292,7 +1292,7 @@

+ t-att-src='widget.session.server + "/web/static/src/img/collapse.gif"' width="16" height="16" border="0"/> @@ -1305,22 +1305,22 @@
+ id="side-add" t-att-src='widget.session.server + "/web/static/src/img/icons/gtk-add.png"' style="cursor: pointer;"/> - + + id="side-edit" t-att-src='widget.session.server + "/web/static/src/img/icons/gtk-edit.png"' style="cursor: pointer;"/> + id="side-up" t-att-src='widget.session.server + "/web/static/src/img/icons/gtk-go-up.png"' style="cursor: pointer;"/> + id="side-down" t-att-src='widget.session.server + "/web/static/src/img/icons/gtk-go-down.png"' style="cursor: pointer;"/>
@@ -1402,7 +1402,7 @@ - + @@ -1518,7 +1518,7 @@ - + From bccc64ac7c2a6671a15f74d13465c27b8f13e9d8 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 9 Nov 2011 09:16:26 +0100 Subject: [PATCH 007/192] [FIX] use absolute url when getting css/js/qweb files + use a static proxy for getting qweb files bzr revid: chs@openerp.com-20111109081626-l868h7w8glinbxdl --- addons/web/common/http.py | 14 +++++++++ addons/web/static/src/js/core.js | 49 ++++++++++++++++++++++++++--- addons/web/static/src/js/jq_ajax.js | 21 +++---------- 3 files changed, 63 insertions(+), 21 deletions(-) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index ed7a5344192..ab3c3c4129b 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -9,6 +9,7 @@ import logging import urllib import os import pprint +import re import sys import traceback import uuid @@ -436,6 +437,19 @@ class JSONP(Controller): response = werkzeug.wrappers.Response(request_id, headers=headers) return response + @jsonrequest + def static_proxy(self, req, path): + #req.config.socket_port + + + #if not re.match('^/[^/]+/static/.*', path): + # return werkzeug.exceptions.BadRequest() + + env = req.httprequest.environ + port = env['SERVER_PORT'] + + o = urllib.urlopen('http://127.0.0.1:%s%s' % (port, path)) + return o.read() class Root(object): """Root WSGI application for the OpenERP Web Client. diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 951e6e2b01f..fac18f18734 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -349,7 +349,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. init: function(server) { this._super(); var hostname = _('%s//%s').sprintf(location.protocol, location.host); - this.server = (server == undefined) ? hostname : server; + this.server = _.rtrim((server == undefined) ? hostname : server, '/'); this.rpc_mode = (this.server == hostname) ? "oe-json" : "oe-jsonp"; this.debug = ($.deparam($.param.querystring()).debug != undefined); this.session_id = false; @@ -370,6 +370,29 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. start: function() { this.session_restore(); }, + + get_absolute_url: function(path) { + var r_has_protocol = /^https?:\/\//, + r_absolute_internal = /^\/[^\/]/; // starts with / (but not //) + + + if (r_has_protocol.test(path)) { + if (!_(path).startsWith(this.server + '/')) { + $.error('can only contact openerp.server'); + } + absolute_url = path; + } else if (r_absolute_internal.test(path)) { + absolute_url = this.server + path; + } else { // relative url + // XXX is it correct to mix document.location and this.server ?? + var parts = document.location.pathname.split('/'); + parts.pop(); + parts.push(path); + absolute_url = this.server + parts.join('/'); + } + return absolute_url + }, + /** * Executes an RPC call, registering the provided callbacks. * @@ -574,11 +597,11 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. self.user_context.lang.replace("_", "-") + ".js" ]; + self.rpc('/web/webclient/qweblist', {"mods": modules}, self.do_load_qweb); self.rpc('/web/webclient/csslist', {"mods": modules}, self.do_load_css); self.rpc('/web/webclient/jslist', {"mods": modules}, function(files) { self.do_load_js(file_list.concat(files)); }); - self.rpc('/web/webclient/qweblist', {"mods": modules}, self.do_load_qweb); openerp._modules_loaded = true; }); }); @@ -587,7 +610,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. var self = this; _.each(files, function (file) { $('head').append($('', { - 'href': file, + 'href': self.get_absolute_url(file), 'rel': 'stylesheet', 'type': 'text/css' })); @@ -599,7 +622,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. var file = files.shift(); var tag = document.createElement('script'); tag.type = 'text/javascript'; - tag.src = file; + tag.src = self.get_absolute_url(file); tag.onload = tag.onreadystatechange = function() { if ( (tag.readyState && tag.readyState != "loaded" && tag.readyState != "complete") || tag.onload_done ) return; @@ -615,7 +638,23 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. do_load_qweb: function(files) { var self = this; _.each(files, function(file) { - openerp.web.qweb.add_template(file); + self.rpc({ + //url: self.get_absolute_url(file), + url: '/web/jsonp/static_proxy', + async: false, + //dataType: 'text', + + }, + { + path: file, + }, + function(xml) { + //function(result) { + // console.log('do_load_qweb', result); + // var xml = result.result; + //}).then(function(xml) { + openerp.web.qweb.add_template(_(xml).trim()); + }); }); }, on_modules_loaded: function() { diff --git a/addons/web/static/src/js/jq_ajax.js b/addons/web/static/src/js/jq_ajax.js index 8d347c398d7..19c3bb31295 100644 --- a/addons/web/static/src/js/jq_ajax.js +++ b/addons/web/static/src/js/jq_ajax.js @@ -9,16 +9,11 @@ // common preconditions checks $.ajaxPrefilter("oe-json oe-jsonp", function(options, originalOptions, jqXHR) { - console.log('use', options.dataType); if (!$.isPlainObject(options.openerp)) { console.error(options.openerp); $.error('"openerp" option is required.'); } - if (_(options.openerp.server).endsWith('/')) { - options.openerp.server = options.openerp.server.substr(0, options.openerp.server.length-1); - } - if (!$.isPlainObject(options.data)) { $.error('data must not be serialized'); } @@ -49,9 +44,10 @@ } + var max_url_length = options.max_url_length || 1000, absolute_url, full_url; - + /* var r_has_protocol = /^https?:\/\//, r_absolute_internal = /^\/[^\/]/; // starts with / (but not //) @@ -69,7 +65,9 @@ parts.push(options.url); absolute_url = options.openerp.server + parts.join('/'); } - + // */ + + var absolute_url = options.openerp.get_absolute_url(options.url); /// now, made the same url changes that jQuery will do... var rquery = /\?/, @@ -89,9 +87,6 @@ // if nothing was replaced, add timestamp to the end full_url = ret + ((ret === full_url) ? (rquery.test(full_url) ? "&" : "?") + "_=" + ts : ""); } - - console.log('absolute_url', absolute_url); - console.log('full_url', full_url); options.url = absolute_url; @@ -105,7 +100,6 @@ $.ajaxTransport("oe-jsonp", function(options, originalOptions, jqXHR) { - console.log('real oe-jsonp', options); var $iframe = null; var $form = $('
') .attr('method', 'POST') @@ -115,8 +109,6 @@ .appendTo($('body')) ; - console.log($form); - function cleanUp() { if ($iframe) { $iframe.unbind("load").attr("src", "javascript:false;").remove(); @@ -142,11 +134,8 @@ // the first bind is fired up when the iframe is added to the DOM $iframe.bind('load', function() { - //console.log('bind1', this); // the second bind is fired up when the result of the form submission is received $iframe.unbind('load').bind('load', function() { - //console.log('bind2', this); - // we cannot access the content of remote iframe. // but we don't care, we try to get the result in any cases From a9893f1aa6abaf96b94b70b9d4ce16fd5136eeda Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Thu, 10 Nov 2011 17:47:10 +0530 Subject: [PATCH 008/192] [ADD] marketing_campaign_crm_demo: Added test/process/marketing_campaign.yml bzr revid: ron@tinyerp.com-20111110121710-zcm22g2y4uyzhtzl --- .../__openerp__.py | 3 +++ .../test/process/marketing_campaign.yml | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml diff --git a/addons/marketing_campaign_crm_demo/__openerp__.py b/addons/marketing_campaign_crm_demo/__openerp__.py index 4841cc1a2e8..6c28e9226a0 100644 --- a/addons/marketing_campaign_crm_demo/__openerp__.py +++ b/addons/marketing_campaign_crm_demo/__openerp__.py @@ -40,6 +40,9 @@ Creates demo data like leads, campaigns and segments for the module marketing_ca 'demo_xml': [ 'marketing_campaign_demo.xml', ], + 'test': [ + 'test/process/marketing_campaign.yml', + ], 'installable': True, 'active': False, 'certificate' : '001005497972871352957', diff --git a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml new file mode 100644 index 00000000000..8026db2a2be --- /dev/null +++ b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml @@ -0,0 +1,27 @@ +- + I created marketing campaing "OpenERP OnDemand Free Trial" to reach our partners leads + with specific activity(offers) and communication via email and take action according + to campaing activity. + Now I start this compaign. +- + !workflow {model: marketing.campaign, action: state_running_set, ref: marketing_campaign_openerpondemandfreetrial0} +- + I check the campaign on Running mode. +- + !assert {model: marketing.campaign, id: marketing_campaign_openerpondemandfreetrial0}: + - state == 'running' +- + This campaign is only for Belgium partner of leads, so I assinged this Campaign + to right segment(Only for Belgium Leads), after that I start this segment. +- + !workflow {model: marketing.campaign.segment, action: state_running_set, ref: marketing_campaign_segment_bosslistusassociationslist0} +- + I check the Segment on Running mode. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: + - state == 'running' +- + I synchronized this segment manually to see all step of activity covered on this campaign. +- + !python {model: marketing.campaign.segment}: | + self.synchroniz(cr, uid, [ref("marketing_campaign_segment_bosslistusassociationslist0")]) From 338424996898839b76bf76707779c6ed9230d004 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Thu, 10 Nov 2011 18:55:03 +0530 Subject: [PATCH 009/192] [ADD] marketing_campaign_crm_demo: Improved string on yml bzr revid: ron@tinyerp.com-20111110132503-eqaadbxvyjep4mt7 --- .../test/process/marketing_campaign.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml index 8026db2a2be..85068a9586d 100644 --- a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml +++ b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml @@ -1,7 +1,6 @@ - - I created marketing campaing "OpenERP OnDemand Free Trial" to reach our partners leads - with specific activity(offers) and communication via email and take action according - to campaing activity. + I created marketing campaing with specific activity(offers) to reach our partners + and communication via email according to campaing activity. Now I start this compaign. - !workflow {model: marketing.campaign, action: state_running_set, ref: marketing_campaign_openerpondemandfreetrial0} From 8406dd639dcbc9fc6b36b4aaebf7e3084720c6fa Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Fri, 11 Nov 2011 14:24:15 +0530 Subject: [PATCH 010/192] [ADD] marketing_campaign_crm_demo: Add-Process on activity to campaing done bzr revid: ron@tinyerp.com-20111111085415-pb2rt9wl5ibmmydl --- .../test/process/marketing_campaign.yml | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml index 85068a9586d..5d21d8c901a 100644 --- a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml +++ b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml @@ -15,12 +15,43 @@ - !workflow {model: marketing.campaign.segment, action: state_running_set, ref: marketing_campaign_segment_bosslistusassociationslist0} - - I check the Segment on Running mode. + I check the segment on Running mode. - !assert {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: - state == 'running' - - I synchronized this segment manually to see all step of activity covered on this campaign. + I synchronized this segment manually to see all step of activity and process covered on this campaign. - !python {model: marketing.campaign.segment}: | self.synchroniz(cr, uid, [ref("marketing_campaign_segment_bosslistusassociationslist0")]) +- + I process the event of belgium partner which is particiapated with our campaing activity, + after processing the event, automatic email send to that partner with specific message and check + the status of event. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('res_id', '=', ref('crm.crm_case_ericdubois4')), ('segment_id', '=', ref('marketing_campaign_segment_bosslistusassociationslist0')), + ('campaign_id', '=', ref('marketing_campaign_openerpondemandfreetrial0')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + assert ids, 'Activity items not created' + self.process(cr, uid, ids) + record = self.browse(cr, uid, ids)[0] + assert record.state == "done", "Activity item not in done state" +- + After completion of all activity i close segmentation first. +- + !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_segment_bosslistusassociationslist0} +- + I check the segmentation is done. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: + - state == 'done' +- + I close this campaing. +- + !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_openerpondemandfreetrial0} +- + I check the campaing is done. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_openerpondemandfreetrial0}: + - state == 'done' + \ No newline at end of file From 02cfa857f53d80573dc21d1281c840daff58a32f Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Fri, 11 Nov 2011 15:11:42 +0530 Subject: [PATCH 011/192] [REF] marketing_campaign: Used get_object_reference instead of _get_id from data got from ir.model bzr revid: ron@tinyerp.com-20111111094142-r50oajp8fhe3nzjl --- addons/marketing_campaign/marketing_campaign.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index 9dc48c99873..47c9498dd8d 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -784,11 +784,7 @@ class marketing_campaign_workitem(osv.osv): res = {} wi_obj = self.browse(cr, uid, ids[0], context=context) if wi_obj.activity_id.type == 'email': - data_obj = self.pool.get('ir.model.data') - data_id = data_obj._get_id(cr, uid, 'email_template', 'email_template_preview_form') - view_id = 0 - if data_id: - view_id = data_obj.browse(cr, uid, data_id, context=context).res_id + view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'email_template', 'email_template_preview_form') res = { 'name': _('Email Preview'), 'view_type': 'form', @@ -796,7 +792,7 @@ class marketing_campaign_workitem(osv.osv): 'res_model': 'email_template.preview', 'view_id': False, 'context': context, - 'views': [(view_id, 'form')], + 'views': [(view_id and view_id[1] or 0, 'form')], 'type': 'ir.actions.act_window', 'target': 'new', 'nodestroy':True, From 7a34cf55a3607c0d164d8eb08b78c698de0df452 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Fri, 11 Nov 2011 16:20:42 +0530 Subject: [PATCH 012/192] [ADD] marketing_campaign_crm_demo: Add new onchange_events.yml for onchange events and preview reports bzr revid: ron@tinyerp.com-20111111105042-6o37aru6f6kkxgzd --- addons/marketing_campaign_crm_demo/__openerp__.py | 1 + .../test/ui/onchange_events.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml diff --git a/addons/marketing_campaign_crm_demo/__openerp__.py b/addons/marketing_campaign_crm_demo/__openerp__.py index 6c28e9226a0..c56d1dc4d16 100644 --- a/addons/marketing_campaign_crm_demo/__openerp__.py +++ b/addons/marketing_campaign_crm_demo/__openerp__.py @@ -42,6 +42,7 @@ Creates demo data like leads, campaigns and segments for the module marketing_ca ], 'test': [ 'test/process/marketing_campaign.yml', + 'test/ui/onchange_events.yml' ], 'installable': True, 'active': False, diff --git a/addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml b/addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml new file mode 100644 index 00000000000..43fb716943e --- /dev/null +++ b/addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml @@ -0,0 +1,12 @@ +- + I call onchange event to change campaing for segment. +- + !python {model: marketing.campaign.segment}: | + self.onchange_campaign_id(cr, uid, [ref("marketing_campaign_segment_bosslistusassociationslist0")], ref("marketing_campaign_openerpondemandfreetrial0")) +- + I can see preview report of workitem. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('res_id', '=', ref('crm.crm_case_ericdubois4')), ('segment_id', '=', ref('marketing_campaign_segment_bosslistusassociationslist0')), + ('campaign_id', '=', ref('marketing_campaign_openerpondemandfreetrial0')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) + self.preview(cr, uid, ids) From e99921e8533853b9e30c13287acc1c838a149e31 Mon Sep 17 00:00:00 2001 From: "Naresh (OpenERP)" Date: Mon, 14 Nov 2011 16:34:47 +0530 Subject: [PATCH 013/192] [FIX]:sequence might use a child company's sequence by error under certain circumstances, use force_company in the context if you want specific companies seq to used else use users current company seq lp bug: https://launchpad.net/bugs/863221 fixed bzr revid: nch@tinyerp.com-20111114110447-jn71htdyx5q4gqiu --- openerp/addons/base/ir/ir_sequence.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/ir/ir_sequence.py b/openerp/addons/base/ir/ir_sequence.py index c2f71910231..a0bcb5a2734 100644 --- a/openerp/addons/base/ir/ir_sequence.py +++ b/openerp/addons/base/ir/ir_sequence.py @@ -189,7 +189,14 @@ class ir_sequence(openerp.osv.osv.osv): def _next(self, cr, uid, seq_ids, context=None): if not seq_ids: return False - seq = self.read(cr, uid, seq_ids[:1], ['implementation','number_next','prefix','suffix','padding'])[0] + if context is None: + context = {} + force_company = context.get('force_company') + if force_company is None: + force_company = self.pool.get('res.users').browse(cr, uid, uid).company_id.id + sequences = self.read(cr, uid, seq_ids, ['company_id', 'implementation','number_next','prefix','suffix','padding']) + preferred_sequences = [s for s in sequences if s['company_id'] and s['company_id'][0] == force_company ] + seq = preferred_sequences[0] if preferred_sequences else sequences[0] if seq['implementation'] == 'standard': cr.execute("SELECT nextval('ir_sequence_%03d')" % seq['id']) seq['number_next'] = cr.fetchone() From fafa6b2d910735bd7d193a2471ec4797552456c2 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 15 Nov 2011 17:10:16 +0100 Subject: [PATCH 014/192] [FIX] jq_ajax: addapt code to new version of underscore.string [IMP] jq_ajax: only show transport iframe in debug mode bzr revid: chs@openerp.com-20111115161016-q1p2ne4zp1geui92 --- addons/web/static/src/js/jq_ajax.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/jq_ajax.js b/addons/web/static/src/js/jq_ajax.js index 19c3bb31295..611ab1e1e22 100644 --- a/addons/web/static/src/js/jq_ajax.js +++ b/addons/web/static/src/js/jq_ajax.js @@ -129,7 +129,8 @@ }; - $iframe = $(_("").sprintf(ifid, ifid)); + var display = options.openerp.debug ? 'block' : 'none'; + $iframe = $(_.str.sprintf("", ifid, ifid, display)); // the first bind is fired up when the iframe is added to the DOM From bc9149f5b682e3969e913cf437d8719d01dff6e1 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 15 Nov 2011 17:12:51 +0100 Subject: [PATCH 015/192] [FIX] lock accesses to session file bzr revid: chs@openerp.com-20111115161251-wntoqdx42jbh7k0e --- addons/web/common/http.py | 65 +++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index ab3c3c4129b..e5af2621c89 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -9,8 +9,9 @@ import logging import urllib import os import pprint -import re +#import re import sys +import threading import traceback import uuid import xmlrpclib @@ -176,7 +177,7 @@ class JsonRequest(WebRequest): try: self.jsonrequest = simplejson.loads(direct_json_request, object_hook=nonliterals.non_literal_decoder) except Exception, e: - _logger.error(e) + _logger.exception(e) return werkzeug.exceptions.BadRequest(e) else: # no direct json request, try to get it from jsonp POST request @@ -352,17 +353,19 @@ STORES = {} @contextlib.contextmanager def session_context(request, storage_path, session_cookie='sessionid'): - session_store = STORES.get(storage_path) + session_store, session_lock = STORES.get(storage_path, (None, None)) if not session_store: session_store = werkzeug.contrib.sessions.FilesystemSessionStore( storage_path) - STORES[storage_path] = session_store + session_lock = threading.Lock() + STORES[storage_path] = session_store, session_lock sid = request.cookies.get(session_cookie) - if sid: - request.session = session_store.get(sid) - else: - request.session = session_store.new() + with session_lock: + if sid: + request.session = session_store.get(sid) + else: + request.session = session_store.new() try: yield request.session @@ -375,29 +378,31 @@ def session_context(request, storage_path, session_cookie='sessionid'): _logger.info('remove session %s: %r', key, value.jsonp_requests) del request.session[key] - # FIXME: remove this when non-literals disappear - if sid: - # Re-load sessions from storage and merge non-literal - # contexts and domains (they're indexed by hash of the - # content so conflicts should auto-resolve), otherwise if - # two requests alter those concurrently the last to finish - # will overwrite the previous one, leading to loss of data - # (a non-literal is lost even though it was sent to the - # client and client errors) - # - # note that domains_store and contexts_store are append-only (we - # only ever add items to them), so we can just update one with the - # other to get the right result, if we want to merge the - # ``context`` dict we'll need something smarter - in_store = session_store.get(sid) - for k, v in request.session.iteritems(): - stored = in_store.get(k) - if stored and isinstance(v, session.OpenERPSession)\ - and v != stored: - v.contexts_store.update(stored.contexts_store) - v.domains_store.update(stored.domains_store) + with session_lock: + # FIXME: remove this when non-literals disappear + if sid: + # Re-load sessions from storage and merge non-literal + # contexts and domains (they're indexed by hash of the + # content so conflicts should auto-resolve), otherwise if + # two requests alter those concurrently the last to finish + # will overwrite the previous one, leading to loss of data + # (a non-literal is lost even though it was sent to the + # client and client errors) + # + # note that domains_store and contexts_store are append-only (we + # only ever add items to them), so we can just update one with the + # other to get the right result, if we want to merge the + # ``context`` dict we'll need something smarter + in_store = session_store.get(sid) + for k, v in request.session.iteritems(): + stored = in_store.get(k) + if stored and isinstance(v, session.OpenERPSession)\ + and v != stored: + v.contexts_store.update(stored.contexts_store) + v.domains_store.update(stored.domains_store) + v.jsonp_requests.update(stored.jsonp_requests) - session_store.save(request.session) + session_store.save(request.session) #---------------------------------------------------------- # OpenERP Web Module/Controller Loading and URL Routing From 7e9d606238ed1fa00d2bf8b852987889566c49e0 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 15 Nov 2011 18:04:08 +0100 Subject: [PATCH 016/192] [IMP] Connection: new method to bind to a server. Must be called before login [IMP] loading of qweb/css/js files are now sequencial bzr revid: chs@openerp.com-20111115170408-u1i805s1854igyja --- addons/web/static/src/js/chrome.js | 36 +++++--- addons/web/static/src/js/core.js | 134 ++++++++++++++++++----------- 2 files changed, 107 insertions(+), 63 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 2b838ee3743..31ea05b572b 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -977,12 +977,6 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie this._super(null, element_id); openerp.webclient = this; - var params = {}; - if(jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) { - this.$element.addClass("kitten-mode-activated"); - } - this.$element.html(QWeb.render("Interface", params)); - this.notification = new openerp.web.Notification(this); this.loading = new openerp.web.Loading(this); this.crashmanager = new openerp.web.CrashManager(); @@ -997,8 +991,6 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie this.session.on_session_invalid.add_last(this.header.do_update); this.session.on_session_valid.add_last(this.on_logged); - this.menu = new openerp.web.Menu(this, "oe_menu", "oe_secondary_menu"); - this.menu.on_action.add(this.on_menu_action); this.url_internal_hashchange = false; this.url_external_hashchange = false; @@ -1007,12 +999,28 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie }, start: function() { this._super.apply(this, arguments); - this.notification.prependTo(this.$element); - this.loading.appendTo($('#oe_loading')); - this.header.appendTo($("#oe_header")); - this.session.start(); - this.login.appendTo($('#oe_login')); - this.menu.start(); + var self = this; + openerp.connection.bind(function() { + + var params = {}; + if(jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) { + self.$element.addClass("kitten-mode-activated"); + } + self.$element.html(QWeb.render("Interface", params)); + openerp.connection.session_restore(); + + + // TODO nivification of menu Widget !!! + self.menu = new openerp.web.Menu(self, "oe_menu", "oe_secondary_menu"); + self.menu.on_action.add(self.on_menu_action); + + + self.notification.prependTo(self.$element); + self.loading.appendTo($('#oe_loading')); + self.header.appendTo($("#oe_header")); + self.login.appendTo($('#oe_login')); + self.menu.start(); + }); }, do_reload: function() { this.session.session_restore(); diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 7cd81d2a7c1..590438c09dc 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -346,29 +346,43 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. * @param {String} [server] JSON-RPC endpoint hostname * @param {String} [port] JSON-RPC endpoint port */ - init: function(server) { + init: function() { + + // FIXME need to be a real singleton. + // create more than one Connection on the same instance will not works + this._super(); - var hostname = _('%s//%s').sprintf(location.protocol, location.host); - this.server = _.rtrim((server == undefined) ? hostname : server, '/'); - this.rpc_mode = (this.server == hostname) ? "oe-json" : "oe-jsonp"; + this.server = null; this.debug = ($.deparam($.param.querystring()).debug != undefined); + // TODO: session should have an optional name indicating that they'll + // be saved to (and revived from) cookies + this.name = 'session'; + }, + + bind: function(server, continuation) { + + if(_.isFunction(server)) { + continuation = server; + server = null; + } + + if (this.server) { + throw new Error("Connection already bind to " + this.server); + } + var hostname = _.str.sprintf('%s//%s', location.protocol, location.host); + this.server = _.str.rtrim((!server) ? hostname : server, '/'); + this.rpc_mode = (this.server == hostname) ? "oe-json" : "oe-jsonp"; this.session_id = false; this.uid = false; this.user_context= {}; this.db = false; + this.module_loading = $.Deferred(); this.module_list = []; this.module_loaded = {"web": true}; this.context = {}; this.shortcuts = []; this.active_id = null; - // TODO: session should have an optional name indicating that they'll - // be saved to (and revived from) cookies - this.name = 'session'; - this.do_load_qweb(['/web/webclient/qweb']); - }, - - start: function() { - this.session_restore(); + this.do_load_qweb(['/web/webclient/qweb'], continuation); }, get_absolute_url: function(path) { @@ -377,7 +391,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. if (r_has_protocol.test(path)) { - if (!_(path).startsWith(this.server + '/')) { + if (!_.str.startsWith(path, this.server + '/')) { $.error('can only contact openerp.server'); } absolute_url = path; @@ -426,6 +440,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }); }).then(success_callback, error_callback).promise(); }, + /** * Raw JSON-RPC call * @@ -491,9 +506,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. /** * The session is validated either by login or by restoration of a previous session */ - on_session_valid: function() { - if(!openerp._modules_loaded) - this.load_modules(); + on_session_valid: function(continuation) { + this.load_modules(continuation); }, on_session_invalid: function(contination) { }, @@ -509,15 +523,17 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. self.user_context = result.context; self.db = result.db; self.session_save(); - self.on_session_valid(); + + self.on_session_valid(success_callback); return true; - }).then(success_callback); + //}).done(success_callback); + }); }, login: function() { this.session_login.apply(this, arguments); }, /** * Reloads uid and session_id from local storage, if they exist */ - session_restore: function () { + session_restore: function (continuation) { var self = this; this.session_id = this.get_cookie('session_id'); return this.rpc("/web/session/get_session_info", {}).then(function(result) { @@ -525,11 +541,11 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. self.user_context = result.context; self.db = result.db; if (self.uid) - self.on_session_valid(); + self.on_session_valid(continuation); else - self.on_session_invalid(); + self.on_session_invalid(continuation); }, function() { - self.on_session_invalid(); + self.on_session_invalid(continuation); }); }, /** @@ -583,9 +599,17 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }, /** * Load additional web addons of that instance and init them + * FIXME do all actions in sync... */ - load_modules: function() { + load_modules: function(continuation) { var self = this; + + this.module_loading.done(continuation); + //if (this.module_loading.state() !== "pending") { + if (this.module_loading.isResolved() || this.module_loading.isRejected()) { + return; + } + this.rpc('/web/session/modules', {}, function(result) { self.module_list = result; var lang = self.user_context.lang; @@ -597,16 +621,36 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. self.user_context.lang.replace("_", "-") + ".js" ]; - self.rpc('/web/webclient/qweblist', {"mods": modules}, self.do_load_qweb); - self.rpc('/web/webclient/csslist', {"mods": modules}, self.do_load_css); - self.rpc('/web/webclient/jslist', {"mods": modules}, function(files) { + /* + self.rpc('/web/webclient/qweblist', {mods: modules}, self.do_load_qweb); + self.rpc('/web/webclient/csslist', {mods: modules}, self.do_load_css); + self.rpc('/web/webclient/jslist', {mods: modules}, function(files) { self.do_load_js(file_list.concat(files)); }); openerp._modules_loaded = true; + // */ + + self.rpc('/web/webclient/qweblist', {mods: modules}, function(files) { + self.do_load_qweb(files, function() { + // once qweb files are loaded... + self.rpc('/web/webclient/csslist', {mods: modules}, function(files) { + self.do_load_css(files, function() { + // once css files are loaded + self.rpc('/web/webclient/jslist', {mods: modules}, function(files) { + self.do_load_js(file_list.concat(files), function() { + self.on_modules_loaded(); + self.module_loading.resolve(); + }); + }); + }); + }); + }); + }); + }); }); }, - do_load_css: function (files) { + do_load_css: function (files, callback) { var self = this; _.each(files, function (file) { $('head').append($('', { @@ -615,8 +659,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. 'type': 'text/css' })); }); + if (callback) { callback(); } }, - do_load_js: function(files) { + do_load_js: function(files, callback) { var self = this; if(files.length != 0) { var file = files.shift(); @@ -627,35 +672,26 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. if ( (tag.readyState && tag.readyState != "loaded" && tag.readyState != "complete") || tag.onload_done ) return; tag.onload_done = true; - self.do_load_js(files); + self.do_load_js(files, callback); }; var head = document.head || document.getElementsByTagName('head')[0]; head.appendChild(tag); } else { - this.on_modules_loaded(); + if (callback) { callback(); } } }, - do_load_qweb: function(files) { + do_load_qweb: function(files, callback) { var self = this; - _.each(files, function(file) { - self.rpc({ - //url: self.get_absolute_url(file), - url: '/web/jsonp/static_proxy', - async: false, - //dataType: 'text', - - }, - { - path: file, - }, - function(xml) { - //function(result) { - // console.log('do_load_qweb', result); - // var xml = result.result; - //}).then(function(xml) { - openerp.web.qweb.add_template(_(xml).trim()); + + if (files.length != 0) { + var file = files.shift(); + self.rpc('/web/jsonp/static_proxy', {path: file}, function(xml) { + openerp.web.qweb.add_template(_.str.trim(xml)); + self.do_load_qweb(files, callback); }); - }); + } else { + if (callback) { callback(); } + } }, on_modules_loaded: function() { for(var j=0; j Date: Thu, 17 Nov 2011 13:48:19 +0100 Subject: [PATCH 017/192] [FIX] typo bzr revid: chs@openerp.com-20111117124819-qmxoit9i2ryo8szo --- addons/web/static/src/js/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 590438c09dc..8d7bed56b5b 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -367,7 +367,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. } if (this.server) { - throw new Error("Connection already bind to " + this.server); + throw new Error("Connection already bound to " + this.server); } var hostname = _.str.sprintf('%s//%s', location.protocol, location.host); this.server = _.str.rtrim((!server) ? hostname : server, '/'); From 4e85f0762cc69af8efdb88ec857329ac955afe0b Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 17 Nov 2011 13:49:26 +0100 Subject: [PATCH 018/192] [IMP] Connection: add utility method that bind() then login() bzr revid: chs@openerp.com-20111117124926-y3z3osoq76va0kjy --- addons/web/static/src/js/core.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 8d7bed56b5b..113b83f57dc 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -385,6 +385,13 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.do_load_qweb(['/web/webclient/qweb'], continuation); }, + connect: function(server, db, login, password, continuation) { + var self = this; + this.bind(server, function() { + self.login(db, login, password, continuation); + }); + }, + get_absolute_url: function(path) { var r_has_protocol = /^https?:\/\//, r_absolute_internal = /^\/[^\/]/; // starts with / (but not //) From 8769c57e941652aafc910c9deb69bbe5c544f6fa Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 22 Nov 2011 13:08:06 +0100 Subject: [PATCH 019/192] [FIX] session merging bzr revid: chs@openerp.com-20111122120806-mlg170fohfnx8gk8 --- addons/web/common/http.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index 7352a6f5cb9..aadae03832e 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -374,12 +374,14 @@ def session_context(request, storage_path, session_cookie='sessionid'): # either by login process or by HTTP requests without an OpenERP # session id, and are generally noise for key, value in request.session.items(): - if isinstance(value, session.OpenERPSession) and not value._uid and not value.jsonp_requests: + if (isinstance(value, session.OpenERPSession) + and not value._uid + and not value.jsonp_requests + ): _logger.info('remove session %s: %r', key, value.jsonp_requests) del request.session[key] with session_lock: - # FIXME: remove this when non-literals disappear if sid: # Re-load sessions from storage and merge non-literal # contexts and domains (they're indexed by hash of the @@ -402,6 +404,11 @@ def session_context(request, storage_path, session_cookie='sessionid'): v.domains_store.update(stored.domains_store) v.jsonp_requests.update(stored.jsonp_requests) + # add missing keys + for k, v in in_store.iteritems(): + if k not in request.session: + request.session[k] = v + session_store.save(request.session) #---------------------------------------------------------- From 2834e0f7bd2ec92430a3bd1f705f6e5dd33ab2ce Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 22 Nov 2011 13:16:55 +0100 Subject: [PATCH 020/192] [IMP] pop jsonp_requests to avoid memory overload bzr revid: chs@openerp.com-20111122121655-7nqn1rvcd2iwy4mg --- addons/web/common/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index aadae03832e..afad089f1d8 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -186,7 +186,7 @@ class JsonRequest(WebRequest): session_id = params.get('sid') if session_id: self.init_session(session_id) - stored_request = self.session.jsonp_requests.get(rid, {}) + stored_request = self.session.jsonp_requests.pop(rid, {}) else: stored_request = {} From 050d369f4aec38f7c876bbd5f307f3085a647b71 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 22 Nov 2011 13:18:33 +0100 Subject: [PATCH 021/192] [IMP] better debugging output bzr revid: chs@openerp.com-20111122121833-okbmche6lhw78d4d --- addons/web/common/http.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/addons/web/common/http.py b/addons/web/common/http.py index afad089f1d8..4d44f3175f8 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -165,6 +165,7 @@ class JsonRequest(WebRequest): requestf = self.httprequest.stream direct_json_request = None jsonp_callback = None + rid = None if requestf: direct_json_request = requestf.read() @@ -222,10 +223,12 @@ class JsonRequest(WebRequest): return werkzeug.exceptions.BadRequest() error = None + if not rid: + rid = self.jsonrequest.get('id') try: if _logger.isEnabledFor(logging.DEBUG): - _logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest)) - response['id'] = self.jsonrequest.get('id') + _logger.debug("[%s] --> %s.%s\n%s", rid, controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest)) + response['id'] = rid response["result"] = method(controller, self, **self.params) except openerplib.AuthenticationError: error = { @@ -260,9 +263,10 @@ class JsonRequest(WebRequest): } if error: response["error"] = error + _logger.error("[%s] <--\n%s", rid, pprint.pformat(response)) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug("<--\n%s", pprint.pformat(response)) + elif _logger.isEnabledFor(logging.DEBUG): + _logger.debug("[%s] <--\n%s", rid, pprint.pformat(response)) return build_response(response) From c5bcea713d360a71ca1d94d385d6e5110d1ff142 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 22 Nov 2011 13:20:16 +0100 Subject: [PATCH 022/192] [FIX] set correct session name bzr revid: chs@openerp.com-20111122122016-ykckmih2q7dfb4yb --- addons/web/static/src/js/core.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index e3f85a92503..0c3eaff56ed 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -360,7 +360,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.debug = ($.deparam($.param.querystring()).debug != undefined); // TODO: session should have an optional name indicating that they'll // be saved to (and revived from) cookies - this.name = 'session'; + this.name = openerp._session_id; }, bind: function(server, continuation) { From f7893968428df6cb518db4615e96b1d0e627d294 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 22 Nov 2011 13:20:46 +0100 Subject: [PATCH 023/192] [IMP] correct var name bzr revid: chs@openerp.com-20111122122046-kl6f4o4ej1mdcd1o --- addons/web/static/src/js/core.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 0c3eaff56ed..19607bc11a2 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -398,7 +398,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }, get_absolute_url: function(path) { - var r_has_protocol = /^https?:\/\//, + var absolute_url, + r_has_protocol = /^https?:\/\//, r_absolute_internal = /^\/[^\/]/; // starts with / (but not //) @@ -416,7 +417,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. parts.push(path); absolute_url = this.server + parts.join('/'); } - return absolute_url + return absolute_url; }, /** @@ -488,7 +489,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. return; } self.uid = false; - self.on_session_invalid(function() { + self.on_session_invalid(function() { // retry self.rpc(url, payload, function() { deferred.resolve.apply(deferred, arguments); @@ -521,7 +522,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. on_session_valid: function(continuation) { this.load_modules(continuation); }, - on_session_invalid: function(contination) { + on_session_invalid: function(continuation) { }, session_is_valid: function() { return this.uid; From 64d223d4271a431457992a399e5cb65795ac4c11 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 22 Nov 2011 13:22:50 +0100 Subject: [PATCH 024/192] [ADD] EmbedClient widget for ease the use of embed code bzr revid: chs@openerp.com-20111122122250-v0cys6fdv42222l0 --- addons/web/__openerp__.py | 3 +- addons/web/static/src/js/boot.js | 2 +- addons/web/static/src/js/embed.js | 49 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 addons/web/static/src/js/embed.js diff --git a/addons/web/__openerp__.py b/addons/web/__openerp__.py index a9aeea1af31..43700b017a7 100644 --- a/addons/web/__openerp__.py +++ b/addons/web/__openerp__.py @@ -46,7 +46,8 @@ "static/src/js/view_list.js", "static/src/js/view_list_editable.js", "static/src/js/view_tree.js", - "static/src/js/view_editor.js" + "static/src/js/view_editor.js", + "static/src/js/embed.js", ], 'css' : [ "static/lib/jquery.superfish/css/superfish.css", diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js index 58dcd922ea9..7440ae42dbc 100644 --- a/addons/web/static/src/js/boot.js +++ b/addons/web/static/src/js/boot.js @@ -59,7 +59,7 @@ openerp.web = function(instance) { openerp.web.formats(instance); openerp.web.chrome(instance); openerp.web.data(instance); - var files = ["views","search","list","form","list_editable","web_mobile","view_tree","data_export","data_import","view_editor"]; + var files = ["views","search","list","form","list_editable","web_mobile","view_tree","data_export","data_import","view_editor", 'embed']; for(var i=0; i Date: Wed, 23 Nov 2011 10:20:55 +0100 Subject: [PATCH 025/192] [FIX] generate absolute urls for images bzr revid: chs@openerp.com-20111123092055-iqwm3uy1sxw4iq5o --- addons/web/static/src/js/formats.js | 2 +- addons/web_kanban/static/src/js/kanban.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index 3151b34636b..18b679bed3c 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -253,7 +253,7 @@ openerp.web.format_cell = function (row_data, column, value_if_empty, process_mo if (column.tag === 'button') { return [ '' ].join('') diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index a3755541548..f8a649e2064 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -109,7 +109,7 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({ node.children = [{ tag: 'img', attrs: { - src: '/web/static/src/img/icons/' + node.attrs['data-icon'] + '.png', + src: openerp.connection.server + '/web/static/src/img/icons/' + node.attrs['data-icon'] + '.png', width: '16', height: '16' } @@ -509,7 +509,7 @@ openerp.web_kanban.KanbanRecord = openerp.web.Widget.extend({ }, kanban_image: function(model, field, id) { id = id || ''; - return '/web/binary/image?session_id=' + this.session.session_id + '&model=' + model + '&field=' + field + '&id=' + id; + return openerp.connection.server + '/web/binary/image?session_id=' + this.session.session_id + '&model=' + model + '&field=' + field + '&id=' + id; }, kanban_text_ellipsis: function(s, size) { size = size || 160; From da37a3bb877929ee2422c6fcba8d1eacda8f800e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Najla=C3=A2?= Date: Thu, 24 Nov 2011 14:29:01 +0100 Subject: [PATCH 026/192] [FIX] invoice duplication for the field period_id bzr revid: nel@tinyerp.com-20111124132901-fe5bt1al31i5iolj --- addons/account/account_invoice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py index 27881bf1280..a59e52c3ce5 100644 --- a/addons/account/account_invoice.py +++ b/addons/account/account_invoice.py @@ -619,6 +619,7 @@ class account_invoice(osv.osv): 'move_id':False, 'move_name':False, 'internal_number': False, + 'period_id': False, }) if 'date_invoice' not in default: default.update({ From 7fb3c1ba7e3d07709ef20d3c7cc82278b6729583 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 25 Nov 2011 14:23:25 +0530 Subject: [PATCH 027/192] [IMP] project: attachments also copy when delegate task bzr revid: hmo@tinyerp.com-20111125085325-lmf9qttl9jwqe2be --- addons/project/project.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index abebd2d35ff..e13b92032fe 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -879,14 +879,24 @@ class task(osv.osv): self.write(cr, uid, ids, {'state': 'draft'}, context=context) return True + + def _delegate_task_attachments(self, cr, uid, task_id, delegated_task_id, context=None): + attachment = self.pool.get('ir.attachment') + attachment_ids = attachment.search(cr, uid, [('res_model', '=', self._name), ('res_id', '=', task_id)], context=context) + new_attachment_ids = [] + for attachment_id in attachment_ids: + new_attachment_ids.append(attachment.copy(cr, uid, attachment_id, default={'res_id': delegated_task_id}, context=context)) + return new_attachment_ids + + def do_delegate(self, cr, uid, ids, delegate_data={}, context=None): """ Delegate Task to another users. """ assert delegate_data['user_id'], _("Delegated User should be specified") - delegrated_tasks = {} + delegated_tasks = {} for task in self.browse(cr, uid, ids, context=context): - delegrated_task_id = self.copy(cr, uid, task.id, { + delegated_task_id = self.copy(cr, uid, task.id, { 'name': delegate_data['name'], 'project_id': delegate_data['project_id'] and delegate_data['project_id'][0] or False, 'user_id': delegate_data['user_id'] and delegate_data['user_id'][0] or False, @@ -897,6 +907,7 @@ class task(osv.osv): 'child_ids': [], 'work_ids': [] }, context=context) + self._delegate_task_attachments(cr, uid, task.id, delegated_task_id, context=context) newname = delegate_data['prefix'] or '' task.write({ 'remaining_hours': delegate_data['planned_hours_me'], @@ -910,8 +921,8 @@ class task(osv.osv): message = _("The task '%s' has been delegated to %s.") % (delegate_data['name'], delegate_data['user_id'][1]) self.log(cr, uid, task.id, message) - delegrated_tasks[task.id] = delegrated_task_id - return delegrated_tasks + delegated_tasks[task.id] = delegated_task_id + return delegated_tasks def do_pending(self, cr, uid, ids, context={}): self.write(cr, uid, ids, {'state': 'pending'}, context=context) From 64a08f7165c1dfab695a2f74f296f46afb8c6821 Mon Sep 17 00:00:00 2001 From: "Yogesh (OpenERP)" Date: Tue, 29 Nov 2011 14:23:26 +0530 Subject: [PATCH 028/192] [FIX] mrp :- add view_mode in mrp.bom tree view. bzr revid: ysa@tinyerp.com-20111129085326-05iks6b7lv7bkhgg --- addons/mrp/mrp_view.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml index dafe399b583..60f1414b635 100644 --- a/addons/mrp/mrp_view.xml +++ b/addons/mrp/mrp_view.xml @@ -521,6 +521,7 @@ ir.actions.act_window mrp.bom [('id','=',active_id)] + tree tree @@ -776,7 +777,7 @@ - + @@ -972,7 +973,7 @@ - + - + Date: Tue, 29 Nov 2011 11:15:23 +0100 Subject: [PATCH 029/192] [FIX] account:account.financial.report : fixed bug in form view: attribute based on non-existent 'state' field bzr revid: tde@openerp.com-20111129101523-d77llagm6hc3pi1k --- addons/account/account_view.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 16cd957a61e..1822f0d7a3b 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -2769,7 +2769,7 @@ action = pool.get('res.config').next(cr, uid, [], context) - + @@ -2779,7 +2779,7 @@ action = pool.get('res.config').next(cr, uid, [], context) - + From 8a0a6fab0c9dca21cfd5d5124a423d0c896cdc69 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Wed, 30 Nov 2011 10:39:47 +0530 Subject: [PATCH 030/192] [ADD, IMP, REN]: * Added file marketing_campaign_crm_demo/test/ui/workitem_report.yml [To see preview report of activity] * Created record of campaign.segment for call campaign_onchange event * Renamed file marketing_campaign_crm_demo/test/ui/onchange_events.yml => marketing_campaign_crm_demo/test/ui/demo_data.yml * changed _openerp__.py bzr revid: ron@tinyerp.com-20111130050947-1skwhf46h7t0dy9c --- addons/marketing_campaign_crm_demo/__openerp__.py | 3 ++- addons/marketing_campaign_crm_demo/test/ui/demo_data.yml | 5 +++++ .../test/ui/{onchange_events.yml => workitem_report.yml} | 5 ----- 3 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 addons/marketing_campaign_crm_demo/test/ui/demo_data.yml rename addons/marketing_campaign_crm_demo/test/ui/{onchange_events.yml => workitem_report.yml} (61%) diff --git a/addons/marketing_campaign_crm_demo/__openerp__.py b/addons/marketing_campaign_crm_demo/__openerp__.py index c56d1dc4d16..444758c8ccb 100644 --- a/addons/marketing_campaign_crm_demo/__openerp__.py +++ b/addons/marketing_campaign_crm_demo/__openerp__.py @@ -42,7 +42,8 @@ Creates demo data like leads, campaigns and segments for the module marketing_ca ], 'test': [ 'test/process/marketing_campaign.yml', - 'test/ui/onchange_events.yml' + 'test/ui/demo_data.yml', + 'test/ui/workitem_report.yml' ], 'installable': True, 'active': False, diff --git a/addons/marketing_campaign_crm_demo/test/ui/demo_data.yml b/addons/marketing_campaign_crm_demo/test/ui/demo_data.yml new file mode 100644 index 00000000000..98ba4081300 --- /dev/null +++ b/addons/marketing_campaign_crm_demo/test/ui/demo_data.yml @@ -0,0 +1,5 @@ +- + I create segment record to call onchange event. +- + !record {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: + campaign_id: marketing_campaign_openerpondemandfreetrial0 diff --git a/addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml b/addons/marketing_campaign_crm_demo/test/ui/workitem_report.yml similarity index 61% rename from addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml rename to addons/marketing_campaign_crm_demo/test/ui/workitem_report.yml index 43fb716943e..4d3faad2b96 100644 --- a/addons/marketing_campaign_crm_demo/test/ui/onchange_events.yml +++ b/addons/marketing_campaign_crm_demo/test/ui/workitem_report.yml @@ -1,8 +1,3 @@ -- - I call onchange event to change campaing for segment. -- - !python {model: marketing.campaign.segment}: | - self.onchange_campaign_id(cr, uid, [ref("marketing_campaign_segment_bosslistusassociationslist0")], ref("marketing_campaign_openerpondemandfreetrial0")) - I can see preview report of workitem. - From 26b7d5353abe0c97f805339c674bee6c8103904d Mon Sep 17 00:00:00 2001 From: "Amit (OpenERP)" Date: Wed, 30 Nov 2011 11:50:02 +0530 Subject: [PATCH 031/192] [IMP]:product:in search view set a default search, not a domain, on public pricelist in Sales and on Purchase pricelist in Purchase so removed the domain from actions bzr revid: apa@tinyerp.com-20111130062002-tffwbtvvhlfrzhgb --- addons/product/pricelist_view.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/product/pricelist_view.xml b/addons/product/pricelist_view.xml index 73151e8853f..3ddfe1e6900 100644 --- a/addons/product/pricelist_view.xml +++ b/addons/product/pricelist_view.xml @@ -166,7 +166,6 @@ tree,form {"default_type":"sale", "search_default_type":"sale"} - [('type','=','sale')] A price list contains rules to be evaluated in order to compute the purchase or sales price for all the partners assigned to a price list. Price lists have several versions (2010, 2011, Promotion of February 2010, etc.) and each version has several rules. Example: the customer price of a product category will be based on the supplier price multiplied by 1.80. @@ -177,7 +176,6 @@ tree,form {"default_type":"purchase", "search_default_type":"purchase"} - [('type','=','purchase')] A price list contains rules to be evaluated in order to compute the purchase or sales price for all the partners assigned to a price list. Price lists have several versions (2010, 2011, Promotion of February 2010, etc.) and each version has several rules. Example: the customer price of a product category will be based on the supplier price multiplied by 1.80. Date: Wed, 30 Nov 2011 15:16:48 +0530 Subject: [PATCH 032/192] [IMP] account: * Removed 'note' field from financial report object. * Coverted Display detail field to selection type from boolean. bzr revid: uco@tinyerp.com-20111130094648-7tu9vr3md42z2rjl --- addons/account/account.py | 8 +++-- addons/account/account_view.xml | 10 +++--- .../report/account_financial_report.py | 10 ++++-- .../report/account_financial_report.rml | 32 +++++++++---------- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index e41a5f2f280..8586105c991 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2754,7 +2754,6 @@ class account_financial_report(osv.osv): 'parent_id': fields.many2one('account.financial.report', 'Parent'), 'children_ids': fields.one2many('account.financial.report', 'parent_id', 'Account Report'), 'sequence': fields.integer('Sequence'), - 'note': fields.text('Notes'), 'balance': fields.function(_get_balance, 'Balance'), 'level': fields.function(_get_level, string='Level', store=True, type='integer'), 'type': fields.selection([ @@ -2764,13 +2763,18 @@ class account_financial_report(osv.osv): ('account_report','Report Value'), ],'Type'), 'account_ids': fields.many2many('account.account', 'account_account_financial_report', 'report_line_id', 'account_id', 'Accounts'), - 'display_detail': fields.boolean('Display details', help='Display every account with its balance instead of the sum.'), + 'display_detail': fields.selection([ + ('no_detail','No detail'), + ('only_detail','Display children flat'), + ('detail_with_hierarchy','Display children with hierarchy') + ], 'Display details'), 'account_report_id': fields.many2one('account.financial.report', 'Report Value'), 'account_type_ids': fields.many2many('account.account.type', 'account_account_financial_report_type', 'report_id', 'account_type_id', 'Account Types'), } _defaults = { 'type': 'sum', + 'display_detail': 'only_detail', } account_financial_report() diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 1822f0d7a3b..28aacdbcec1 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -2768,9 +2768,12 @@ action = pool.get('res.config').next(cr, uid, [], context) - + - + + + @@ -2779,9 +2782,6 @@ action = pool.get('res.config').next(cr, uid, [], context) - - - diff --git a/addons/account/report/account_financial_report.py b/addons/account/report/account_financial_report.py index e9da0a1cd7b..43fc2efb378 100644 --- a/addons/account/report/account_financial_report.py +++ b/addons/account/report/account_financial_report.py @@ -64,13 +64,17 @@ class report_account_common(report_sxw.rml_parse, common_report_header): vals['balance_cmp'] = self.pool.get('account.financial.report').browse(self.cr, self.uid, report.id, context=data['form']['comparison_context']).balance lines.append(vals) account_ids = [] - if report.type == 'accounts' and report.display_detail and report.account_ids: - account_ids = account_obj._get_children_and_consol(self.cr, self.uid, [x.id for x in report.account_ids]) + if report.type == 'accounts' and report.account_ids: + if report.display_detail == 'only_detail': + account_ids = account_obj._get_children_and_consol(self.cr, self.uid, [x.id for x in report.account_ids]) + elif report.display_detail == 'detail_with_hierarchy': + account_ids = [x.id for x in report.account_ids] elif report.type == 'account_type' and report.account_type_ids: account_ids = account_obj.search(self.cr, self.uid, [('user_type','in', [x.id for x in report.account_type_ids])]) + account_ids.sort() if account_ids: for account in account_obj.browse(self.cr, self.uid, account_ids, context=data['form']['used_context']): - if account.type != 'view': + if report.display_detail == 'detail_with_hierarchy' or account.type != 'view': flag = False vals = { 'name': account.code + ' ' + account.name, diff --git a/addons/account/report/account_financial_report.rml b/addons/account/report/account_financial_report.rml index 6a94f02c719..e3b5f3663f9 100644 --- a/addons/account/report/account_financial_report.rml +++ b/addons/account/report/account_financial_report.rml @@ -130,15 +130,13 @@ - - - + + + + + - - - - - + @@ -229,13 +227,13 @@ Balance - + [[ repeatIn(get_lines(data), 'a') ]] [[ (a.get('level') <> 0) or removeParentNode('tr') ]] [[ setTag('tr','tr',{'style': 'Table'+str(min(3,'level' in a and a.get('level') or 1))}) ]] - [[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_name'}) ]] [[ a.get('name') ]] - [[ a.get('level') == 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] - [[ a.get('level') <> 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] + [[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a.get('level')))+'_name'}) ]][[ a.get('name') ]] + [[ (a.get('level') <>2) or removeParentNode('td') ]][[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_balance'}) ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] + [[ a.get('level') == 2 or removeParentNode('td') ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] @@ -258,11 +256,11 @@ [[ repeatIn(get_lines(data), 'a') ]] [[ (a.get('level') <> 0) or removeParentNode('tr') ]] [[ setTag('tr','tr',{'style': 'Table'+str(min(3,'level' in a and a.get('level') or 1))}) ]] - [[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_name'}) ]] [[ a.get('name') ]] - [[ a.get('level') == 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] - [[ a.get('level') <> 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance'))]] [[company.currency_id.symbol]] - [[ a.get('level') == 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance_cmp'))]] [[company.currency_id.symbol]] - [[ a.get('level') <> 4 or removeParentNode('td') ]][[ setTag('para','para',{'style': 'terp_level_'+str(min(6,a['level']))+'_balance'}) ]][[ formatLang(a.get('balance_cmp'))]] [[company.currency_id.symbol]] + [[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_name_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(4,a.get('level')))+'_name'}) ]][[ a.get('name') ]] + [[ (a.get('level') <>2) or removeParentNode('td') ]][[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_balance'}) ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] + [[ a.get('level') == 2 or removeParentNode('td') ]][[ formatLang(a.get('balance'), currency_obj = company.currency_id) ]] + [[ (a.get('level') <>2) or removeParentNode('td') ]][[ (a.get('account_type') =='view' and a.get('level') >= 3) and setTag('para','para',{'style': 'terp_level_3_balance_bold'}) or setTag('para','para',{'style': 'terp_level_'+str(min(3,a.get('level')))+'_balance'}) ]][[ formatLang(a.get('balance_cmp'), currency_obj = company.currency_id) ]] + [[ a.get('level') == 2 or removeParentNode('td') ]][[ formatLang(a.get('balance_cmp'), currency_obj = company.currency_id) ]] From bf578591fe8c61555cb0ed6fe771088fc8c80dd7 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Wed, 30 Nov 2011 15:55:54 +0530 Subject: [PATCH 033/192] [ADD] account: Added demo data for financial report object. bzr revid: uco@tinyerp.com-20111130102554-9eujlahybnh2n8rm --- addons/account/demo/account_minimal.xml | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/addons/account/demo/account_minimal.xml b/addons/account/demo/account_minimal.xml index 50b597c8e49..d6cc53a1542 100644 --- a/addons/account/demo/account_minimal.xml +++ b/addons/account/demo/account_minimal.xml @@ -471,5 +471,47 @@ + + + + Balance Sheet + sum + + + Assets + + + detail_with_hierarchy + account_type + + + Liability + + + detail_with_hierarchy + account_type + + + + Profit and Loss + sum + + + Income + + + detail_with_hierarchy + account_type + + + Expense + + + detail_with_hierarchy + account_type + + From 0a288529794a5f14fd0ed01e549140d3385e5a5b Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Wed, 30 Nov 2011 17:06:52 +0530 Subject: [PATCH 034/192] [IMP] marketing_campaign: improve yml to test process of campaign segmentation, add new demo data for partner channel in marketing_campaign module bzr revid: hmo@tinyerp.com-20111130113652-uqxjdy7icybq2h4g --- addons/marketing_campaign/__openerp__.py | 5 + .../marketing_campaign_demo.xml | 91 +++++++++++++++++++ .../test/marketing_campaign.yml | 60 ++++++++++++ .../test/marketing_campaign_demo.yml | 5 + .../test/ui/workitem_report.yml | 0 .../__openerp__.py | 5 - .../marketing_campaign_demo.xml | 36 +------- .../test/process/marketing_campaign.yml | 57 ------------ .../test/ui/demo_data.yml | 5 - 9 files changed, 163 insertions(+), 101 deletions(-) create mode 100644 addons/marketing_campaign/marketing_campaign_demo.xml create mode 100644 addons/marketing_campaign/test/marketing_campaign.yml create mode 100644 addons/marketing_campaign/test/marketing_campaign_demo.yml rename addons/{marketing_campaign_crm_demo => marketing_campaign}/test/ui/workitem_report.yml (100%) delete mode 100644 addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml delete mode 100644 addons/marketing_campaign_crm_demo/test/ui/demo_data.yml diff --git a/addons/marketing_campaign/__openerp__.py b/addons/marketing_campaign/__openerp__.py index 44a2f1e30bd..d9052239038 100644 --- a/addons/marketing_campaign/__openerp__.py +++ b/addons/marketing_campaign/__openerp__.py @@ -58,7 +58,12 @@ Note: If you need demo data, you can install the marketing_campaign_crm_demo mod "security/ir.model.access.csv" ], 'demo_xml': [ + 'marketing_campaign_demo.xml', ], + 'test': [ + 'test/marketing_campaign_demo.yml', + 'test/marketing_campaign.yml', + ], 'installable': True, 'active': False, 'certificate' : '00421723279617928365', diff --git a/addons/marketing_campaign/marketing_campaign_demo.xml b/addons/marketing_campaign/marketing_campaign_demo.xml new file mode 100644 index 00000000000..f49b918aa2c --- /dev/null +++ b/addons/marketing_campaign/marketing_campaign_demo.xml @@ -0,0 +1,91 @@ + + + + + Dummy Action + + dummy + + + + + + + + + Welcome in OpenERP Family! + info@tinyerp.com + + Hello, We are very happy to send Welcome message. + + + Cogretulation! You become now our Silver Partner. + info@tinyerp.com + + Hello,We are happy to announce that you now become our Silver Partner. + Regards,OpenERP Team, + + + + Congratulation! You become our Gold Partner. + info@tinyerp.com + + Hello, We are happy to announce that you become our Gold Partner. + Regards,OpenERP Team, + + + + + + + OpenERP Partner Channel + + active + + + + + + New Partner + + + + + + + Silver Partner + + + + + + + Gold Partner + + + + + + + + + + + + + + + + + + + + + OpenERP Partner + create_date + + draft + + + + diff --git a/addons/marketing_campaign/test/marketing_campaign.yml b/addons/marketing_campaign/test/marketing_campaign.yml new file mode 100644 index 00000000000..502f9e892ec --- /dev/null +++ b/addons/marketing_campaign/test/marketing_campaign.yml @@ -0,0 +1,60 @@ +- + I start compaign. +- + !workflow {model: marketing.campaign, action: state_running_set, ref: marketing_campaign_openerppartnerchannel} +- + I check the campaign on Running mode. +- + !assert {model: marketing.campaign, id: marketing_campaign_openerppartnerchannel}: + - state == 'running' +- + This campaign is only for OpenERP partner, so I assinged this Campaign + to right segment, after that I start this segment. +- + !workflow {model: marketing.campaign.segment, action: state_running_set, ref: marketing_campaign_segment0} +- + I check the segment on Running mode. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_segment0}: + - state == 'running' +- + I synchronized this segment manually to see all step of activity and process covered on this campaign. +- + !python {model: marketing.campaign.segment}: | + self.synchroniz(cr, uid, [ref("marketing_campaign_segment0")]) +- + I process work item. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + #assert ids, 'Activity items not created' + #self.process(cr, uid, ids) + #record = self.browse(cr, uid, ids)[0] + #assert record.state == "done", "Activity item not in done state" +- + I print workitem report. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + #self.preview(cr, uid, ids) +- + I close segmentation After completion of all activity. +- + !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_segment0} +- + I check the segmentation is done. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_segment0}: + - state == 'done' +- + I close this campaing. +- + !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_openerppartnerchannel} +- + I check the campaing is done. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_openerppartnerchannel}: + - state == 'done' + diff --git a/addons/marketing_campaign/test/marketing_campaign_demo.yml b/addons/marketing_campaign/test/marketing_campaign_demo.yml new file mode 100644 index 00000000000..c727132bd47 --- /dev/null +++ b/addons/marketing_campaign/test/marketing_campaign_demo.yml @@ -0,0 +1,5 @@ +- + In order to test process of marketing campaign, I create segment. +- + !record {model: marketing.campaign.segment, id: marketing_campaign_segment0}: + campaign_id: marketing_campaign_openerppartnerchannel diff --git a/addons/marketing_campaign_crm_demo/test/ui/workitem_report.yml b/addons/marketing_campaign/test/ui/workitem_report.yml similarity index 100% rename from addons/marketing_campaign_crm_demo/test/ui/workitem_report.yml rename to addons/marketing_campaign/test/ui/workitem_report.yml diff --git a/addons/marketing_campaign_crm_demo/__openerp__.py b/addons/marketing_campaign_crm_demo/__openerp__.py index 444758c8ccb..4841cc1a2e8 100644 --- a/addons/marketing_campaign_crm_demo/__openerp__.py +++ b/addons/marketing_campaign_crm_demo/__openerp__.py @@ -40,11 +40,6 @@ Creates demo data like leads, campaigns and segments for the module marketing_ca 'demo_xml': [ 'marketing_campaign_demo.xml', ], - 'test': [ - 'test/process/marketing_campaign.yml', - 'test/ui/demo_data.yml', - 'test/ui/workitem_report.yml' - ], 'installable': True, 'active': False, 'certificate' : '001005497972871352957', diff --git a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml index 90db37f2176..7b45c959035 100644 --- a/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml +++ b/addons/marketing_campaign_crm_demo/marketing_campaign_demo.xml @@ -36,135 +36,103 @@ Thanks for showing interest in OpenERP info@tinyerp.com - - Hello,Thanks for generous interest you have shown in the openERP.Regards,OpenERP Team, - mako For OpenERP OnDemand Free Trial 2010 - crm.lead Propose to subscribe to the OpenERP Discovery Day on May 2010 info@tinyerp.com - - Hello,We have very good offer that might suit you. We propose you to subscribe to the OpenERP Discovery Day on May 2010. If any further information required kindly revert back. We really appreciate your co-operation on this. Regards,OpenERP Team, - mako For OpenERP Discovery Day on May 2010 - crm.lead - + Thanks for subscribing to the OpenERP Discovery Day info@tinyerp.com - - Hello,Thanks for showing intrest and for subscribing to the OpenERP Discovery Day. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, - mako For OpenERP Discovery Day - crm.lead - + Thanks for buying the OpenERP book info@tinyerp.com - - Hello,Thanks for showing intrest and buying the OpenERP book. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, - mako For OpenERP book - crm.lead Propose a free technical training to Gold partners info@tinyerp.com - - Hello, We have very good offer that might suit you. For our gold partners,We are arranging free technical training on june,2010. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, - mako For technical training to Gold partners - crm.lead Propose paid training to Silver partners info@tinyerp.com - - Hello, We have very good offer that might suit you. For our silver partners,We are paid technical training on june,2010. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, - mako For training to Silver partners - crm.lead Propose gold partnership to silver partners info@tinyerp.com - - Hello, We have very good offer that might suit you. For our silver partners,We are offering Gold partnership. If any further information required kindly revert back. I really appreciate your co-operation on this. Regards,OpenERP Team, - mako For gold partnership to silver partners - crm.lead Thanks for subscribing to technical training info@tinyerp.com - - Hello, Thanks for showing intrest and for subscribing to technical training.If any further information required kindly revert back.I really appreciate your co-operation on this. Regards,OpenERP Team, - mako For subscribing to technical training - crm.lead diff --git a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml b/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml deleted file mode 100644 index 5d21d8c901a..00000000000 --- a/addons/marketing_campaign_crm_demo/test/process/marketing_campaign.yml +++ /dev/null @@ -1,57 +0,0 @@ -- - I created marketing campaing with specific activity(offers) to reach our partners - and communication via email according to campaing activity. - Now I start this compaign. -- - !workflow {model: marketing.campaign, action: state_running_set, ref: marketing_campaign_openerpondemandfreetrial0} -- - I check the campaign on Running mode. -- - !assert {model: marketing.campaign, id: marketing_campaign_openerpondemandfreetrial0}: - - state == 'running' -- - This campaign is only for Belgium partner of leads, so I assinged this Campaign - to right segment(Only for Belgium Leads), after that I start this segment. -- - !workflow {model: marketing.campaign.segment, action: state_running_set, ref: marketing_campaign_segment_bosslistusassociationslist0} -- - I check the segment on Running mode. -- - !assert {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: - - state == 'running' -- - I synchronized this segment manually to see all step of activity and process covered on this campaign. -- - !python {model: marketing.campaign.segment}: | - self.synchroniz(cr, uid, [ref("marketing_campaign_segment_bosslistusassociationslist0")]) -- - I process the event of belgium partner which is particiapated with our campaing activity, - after processing the event, automatic email send to that partner with specific message and check - the status of event. -- - !python {model: marketing.campaign.workitem}: | - ids = self.search(cr, uid, [('res_id', '=', ref('crm.crm_case_ericdubois4')), ('segment_id', '=', ref('marketing_campaign_segment_bosslistusassociationslist0')), - ('campaign_id', '=', ref('marketing_campaign_openerpondemandfreetrial0')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) - assert ids, 'Activity items not created' - self.process(cr, uid, ids) - record = self.browse(cr, uid, ids)[0] - assert record.state == "done", "Activity item not in done state" -- - After completion of all activity i close segmentation first. -- - !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_segment_bosslistusassociationslist0} -- - I check the segmentation is done. -- - !assert {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: - - state == 'done' -- - I close this campaing. -- - !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_openerpondemandfreetrial0} -- - I check the campaing is done. -- - !assert {model: marketing.campaign.segment, id: marketing_campaign_openerpondemandfreetrial0}: - - state == 'done' - \ No newline at end of file diff --git a/addons/marketing_campaign_crm_demo/test/ui/demo_data.yml b/addons/marketing_campaign_crm_demo/test/ui/demo_data.yml deleted file mode 100644 index 98ba4081300..00000000000 --- a/addons/marketing_campaign_crm_demo/test/ui/demo_data.yml +++ /dev/null @@ -1,5 +0,0 @@ -- - I create segment record to call onchange event. -- - !record {model: marketing.campaign.segment, id: marketing_campaign_segment_bosslistusassociationslist0}: - campaign_id: marketing_campaign_openerpondemandfreetrial0 From 0920c044fd6cac886349225876fc180eaee2d00f Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Thu, 1 Dec 2011 15:34:20 +0530 Subject: [PATCH 035/192] [IMP] account: * Replaced the current selection field (P&L/BS Category on account type) by a functional field that will simulate the old behavior (for the user it will be the same) but that will read and write into the m2m field between financial reports and account types bzr revid: uco@tinyerp.com-20111201100420-jsw584v4lemuzhca --- addons/account/account.py | 33 +++++++++++++++++----- addons/account/demo/account_minimal.xml | 37 +++++++++++++++++++------ 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 8586105c991..3a3277eecb1 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -130,6 +130,21 @@ account_payment_term_line() class account_account_type(osv.osv): _name = "account.account.type" _description = "Account Type" + + def _get_report_type(self, cr, uid, context=None): + report_obj = self.pool.get('account.financial.report') + report_ids = report_obj.search(cr, uid, [], context=context) + report_type = [('none','/')] + for report in report_obj.browse(cr, uid, report_ids, context=context): + type = report.account_type_ids and report.account_type_ids[0] or False + if type: + if type.code in ('income', 'expense'): + report_name = 'Profit & Loss ('+type.code+' accounts)' + elif type.code in ('asset','liability'): + report_name = 'Balance Sheet ('+type.code+' accounts)' + report_type.append((type.code, report_name)) + return report_type + _columns = { 'name': fields.char('Account Type', size=64, required=True), 'code': fields.char('Code', size=32, required=True), @@ -140,13 +155,7 @@ class account_account_type(osv.osv): 'Detail' will copy each existing journal item of the previous year, even the reconciled ones. 'Unreconciled' will copy only the journal items that were unreconciled on the first day of the new fiscal year."""), 'sign': fields.selection([(-1, 'Reverse balance sign'), (1, 'Preserve balance sign')], 'Sign on Reports', required=True, help='For accounts that are typically more debited than credited and that you would like to print as negative amounts in your reports, you should reverse the sign of the balance; e.g.: Expense account. The same applies for accounts that are typically more credited than debited and that you would like to print as positive amounts in your reports; e.g.: Income account.'), - 'report_type':fields.selection([ - ('none','/'), - ('income','Profit & Loss (Income Accounts)'), - ('expense','Profit & Loss (Expense Accounts)'), - ('asset','Balance Sheet (Asset Accounts)'), - ('liability','Balance Sheet (Liability Accounts)') - ],'P&L / BS Category', select=True, readonly=False, help="This field is used to generate legal reports: profit and loss, balance sheet.", required=True), + 'report_type': fields.selection(_get_report_type, 'P&L / BS Category', help="This field is used to generate legal reports: profit and loss, balance sheet.", required=True), 'note': fields.text('Description'), } _defaults = { @@ -156,6 +165,16 @@ class account_account_type(osv.osv): } _order = "code" + def write(self, cr, uid, ids, vals, context=None): + report_obj = self.pool.get('account.financial.report') + if vals.get('report_type'): + type_ids = self.search(cr, uid, [('code','=',vals['report_type'])], context=context) + report_ids = report_obj.search(cr, uid, [('account_type_ids','in',ids)]) + for report in report_obj.browse(cr, uid, report_ids, context=context): + type_ids += [x.id for x in report.account_type_ids if x.id not in type_ids] + report_obj.write(cr, uid, [report.id], {'account_type_ids': [(6,0,type_ids)]}, context=context) + return super(account_account_type, self).write(cr, uid, ids, vals, context) + account_account_type() def _code_get(self, cr, uid, context=None): diff --git a/addons/account/demo/account_minimal.xml b/addons/account/demo/account_minimal.xml index d6cc53a1542..f11a72ce7b4 100644 --- a/addons/account/demo/account_minimal.xml +++ b/addons/account/demo/account_minimal.xml @@ -13,49 +13,41 @@ Asset asset - asset balance Receivable receivable - asset unreconciled Liability liability - liability balance Payable payable - liability unreconciled Income income - income none Expense expense - expense none Equity equity - liability balance Cash cash - asset balance @@ -513,5 +505,34 @@ account_type + + + + asset + + + liability + + + income + + + expense + + + asset + + + liability + + + liability + + + asset + + From be08728a439efcb14da1ae1354bcd7d1c0651173 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Thu, 1 Dec 2011 17:25:21 +0530 Subject: [PATCH 036/192] [IMP] account: * Moved 'sign' field from account type to financial report object. * Changed and added demo data as per the new requirements. * Replaced the 'Balance Sheet' and 'Profit and Loss' reports with Financial report. bzr revid: uco@tinyerp.com-20111201115521-g8npi3igpq8dvthu --- addons/account/__openerp__.py | 4 +- addons/account/account.py | 4 +- addons/account/account_view.xml | 2 +- addons/account/configurable_account_chart.xml | 105 +++++++++++++++--- addons/account/report/__init__.py | 6 +- .../report/account_financial_report.py | 2 +- addons/account/test/account_report.yml | 26 +---- addons/account/wizard/__init__.py | 4 +- .../wizard/account_financial_report.py | 10 ++ .../wizard/account_financial_report_view.xml | 18 +++ 10 files changed, 131 insertions(+), 50 deletions(-) diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py index c8d17c2cf9e..c4aa24cacb9 100644 --- a/addons/account/__openerp__.py +++ b/addons/account/__openerp__.py @@ -121,8 +121,8 @@ module named account_voucher. 'ir_sequence_view.xml', 'company_view.xml', 'board_account_view.xml', - "wizard/account_report_profit_loss_view.xml", - "wizard/account_report_balance_sheet_view.xml", + #"wizard/account_report_profit_loss_view.xml", + #"wizard/account_report_balance_sheet_view.xml", "edi/invoice_action_data.xml", "account_bank_view.xml", "account_pre_install.yml" diff --git a/addons/account/account.py b/addons/account/account.py index 3a3277eecb1..1455c86aa33 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -154,13 +154,11 @@ class account_account_type(osv.osv): 'Balance' will generally be used for cash accounts. 'Detail' will copy each existing journal item of the previous year, even the reconciled ones. 'Unreconciled' will copy only the journal items that were unreconciled on the first day of the new fiscal year."""), - 'sign': fields.selection([(-1, 'Reverse balance sign'), (1, 'Preserve balance sign')], 'Sign on Reports', required=True, help='For accounts that are typically more debited than credited and that you would like to print as negative amounts in your reports, you should reverse the sign of the balance; e.g.: Expense account. The same applies for accounts that are typically more credited than debited and that you would like to print as positive amounts in your reports; e.g.: Income account.'), 'report_type': fields.selection(_get_report_type, 'P&L / BS Category', help="This field is used to generate legal reports: profit and loss, balance sheet.", required=True), 'note': fields.text('Description'), } _defaults = { 'close_method': 'none', - 'sign': 1, 'report_type': 'none', } _order = "code" @@ -2789,11 +2787,13 @@ class account_financial_report(osv.osv): ], 'Display details'), 'account_report_id': fields.many2one('account.financial.report', 'Report Value'), 'account_type_ids': fields.many2many('account.account.type', 'account_account_financial_report_type', 'report_id', 'account_type_id', 'Account Types'), + 'sign': fields.selection([(-1, 'Reverse balance sign'), (1, 'Preserve balance sign')], 'Sign on Reports', required=True, help='For accounts that are typically more debited than credited and that you would like to print as negative amounts in your reports, you should reverse the sign of the balance; e.g.: Expense account. The same applies for accounts that are typically more credited than debited and that you would like to print as positive amounts in your reports; e.g.: Income account.'), } _defaults = { 'type': 'sum', 'display_detail': 'only_detail', + 'sign': 1, } account_financial_report() diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 28aacdbcec1..c3daf8d9c06 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -786,7 +786,6 @@ - @@ -2767,6 +2766,7 @@ action = pool.get('res.config').next(cr, uid, [], context) + diff --git a/addons/account/configurable_account_chart.xml b/addons/account/configurable_account_chart.xml index 0ac7a51405d..8486e2fb008 100644 --- a/addons/account/configurable_account_chart.xml +++ b/addons/account/configurable_account_chart.xml @@ -4,14 +4,12 @@ Receivable receivable - income unreconciled Payable payable - expense unreconciled @@ -24,86 +22,159 @@ Income View view - income Expense View expense - expense Asset View asset - asset Liability View liability - liability Income income - income none Expense expense - expense none Tax tax - expense unreconciled Cash cash - asset balance Liability liability - liability balance Asset asset - asset balance Equity equity - liability balance - + Bank bank - asset balance - + Check check - asset balance + + + Balance Sheet + sum + + + Assets + + + detail_with_hierarchy + account_type + + + Liability + + + detail_with_hierarchy + account_type + + + + Profit and Loss + sum + + + Income + + + detail_with_hierarchy + account_type + + + Expense + + + detail_with_hierarchy + account_type + + + + + + asset + + + liability + + + income + + + expense + + + asset + + + liability + + + liability + + + asset + + + income + + + expense + + + asset + + + liability + + + expense + + + asset + + + asset + diff --git a/addons/account/report/__init__.py b/addons/account/report/__init__.py index 90254c53bda..f7d82ffebce 100644 --- a/addons/account/report/__init__.py +++ b/addons/account/report/__init__.py @@ -33,13 +33,13 @@ import account_print_overdue import account_aged_partner_balance #import tax_report import account_tax_report -import account_balance_landscape +#import account_balance_landscape import account_invoice_report import account_report import account_entries_report import account_analytic_entries_report -import account_balance_sheet -import account_profit_loss +#import account_balance_sheet +#import account_profit_loss import account_treasury_report import account_financial_report diff --git a/addons/account/report/account_financial_report.py b/addons/account/report/account_financial_report.py index 43fc2efb378..ab8f3f7cb6f 100644 --- a/addons/account/report/account_financial_report.py +++ b/addons/account/report/account_financial_report.py @@ -78,7 +78,7 @@ class report_account_common(report_sxw.rml_parse, common_report_header): flag = False vals = { 'name': account.code + ' ' + account.name, - 'balance': account.balance != 0 and account.balance * account.user_type.sign or account.balance, + 'balance': account.balance != 0 and account.balance * report.sign or account.balance, 'type': 'account', 'level': 6, 'account_type': account.type, diff --git a/addons/account/test/account_report.yml b/addons/account/test/account_report.yml index 40ba7ea7127..c2797f274e7 100644 --- a/addons/account/test/account_report.yml +++ b/addons/account/test/account_report.yml @@ -37,24 +37,15 @@ data_dict = {'chart_account_id':ref('account.chart0')} from tools import test_reports test_reports.try_report_action(cr, uid, 'action_account_aged_balance_view',wiz_data=data_dict, context=ctx, our_module='account') -- - Print the Account Balance Sheet in Horizontal mode -- - !python {model: account.account}: | - ctx={} - ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True} - from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_bs_report',wiz_data=data_dict, context=ctx, our_module='account') - Print the Account Balance Sheet in Normal mode - !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False, 'account_report_id': ref('account_financial_report_balancesheet0')} from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_bs_report',wiz_data=data_dict, context=ctx, our_module='account') + test_reports.try_report_action(cr, uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account') - Print the Account Balance Report in Normal mode through the wizard - From Account Chart - @@ -147,18 +138,9 @@ !python {model: account.account}: | ctx={} ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all'} + data_dict = {'chart_account_id':ref('account.chart0'),'display_type': False,'target_move': 'all', 'account_report_id': ref('account_financial_report_balancesheet0')} from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') -- - Print the Profit-Loss Report in Horizontal Mode -- - !python {model: account.account}: | - ctx={} - ctx.update({'model': 'account.account','active_ids':[ref('account.chart0')]}) - data_dict = {'chart_account_id':ref('account.chart0'),'display_type': True,'target_move': 'all'} - from tools import test_reports - test_reports.try_report_action(cr, uid, 'action_account_pl_report',wiz_data=data_dict, context=ctx, our_module='account') + test_reports.try_report_action(cr, uid, 'action_account_report',wiz_data=data_dict, context=ctx, our_module='account') - Print the Analytic Balance Report through the wizard - diff --git a/addons/account/wizard/__init__.py b/addons/account/wizard/__init__.py index 88ae17f3c7b..bef2c78ac01 100644 --- a/addons/account/wizard/__init__.py +++ b/addons/account/wizard/__init__.py @@ -64,8 +64,8 @@ import account_report_account_balance import account_change_currency -import account_report_balance_sheet -import account_report_profit_loss +#import account_report_balance_sheet +#import account_report_profit_loss # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account/wizard/account_financial_report.py b/addons/account/wizard/account_financial_report.py index de9cae3a00c..92c623a9524 100644 --- a/addons/account/wizard/account_financial_report.py +++ b/addons/account/wizard/account_financial_report.py @@ -38,9 +38,19 @@ class accounting_report(osv.osv_memory): 'date_to_cmp': fields.date("End Date"), } + def _get_account_report(self, cr, uid, context=None): + menu_obj = self.pool.get('ir.ui.menu') + report_obj = self.pool.get('account.financial.report') + report_ids = [] + if context.get('active_id'): + menu = menu_obj.browse(cr, uid, context.get('active_id')).name + report_ids = report_obj.search(cr, uid, [('name','ilike',menu)]) + return report_ids and report_ids[0] or False + _defaults = { 'filter_cmp': 'filter_no', 'target_move': 'posted', + 'account_report_id': _get_account_report, } def _build_comparison_context(self, cr, uid, ids, data, context=None): diff --git a/addons/account/wizard/account_financial_report_view.xml b/addons/account/wizard/account_financial_report_view.xml index 1472da4ba87..4be6fb5e95c 100644 --- a/addons/account/wizard/account_financial_report_view.xml +++ b/addons/account/wizard/account_financial_report_view.xml @@ -40,6 +40,24 @@ new + + + + + + Date: Thu, 1 Dec 2011 18:28:04 +0530 Subject: [PATCH 037/192] [FIX] project: fixed exception raised on task by done button while sending a mail lp bug: https://launchpad.net/bugs/898561 fixed bzr revid: mtr@tinyerp.com-20111201125804-z3d24qzpleb4xn41 --- addons/project/project_data.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/addons/project/project_data.xml b/addons/project/project_data.xml index a3bfe9be673..b7b59911fa4 100644 --- a/addons/project/project_data.xml +++ b/addons/project/project_data.xml @@ -1,6 +1,18 @@ + + + + Project + project.project + + + + Project task + project.task + + Projects From 593f5f571bbc49673975afc405e9345ef3457b92 Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Fri, 2 Dec 2011 12:34:58 +0530 Subject: [PATCH 038/192] [IMP] project_issue: clean the test cases bzr revid: jap@tinyerp.com-20111202070458-0k5erfurcx46r243 --- addons/project_issue/__openerp__.py | 8 ++- addons/project_issue/project_issue.py | 7 +-- addons/project_issue/test/cancel_issue.yml | 60 +++++++++++++++++++ .../project_issue/test/draft2open2close.yml | 57 ++++++++++++++++++ addons/project_issue/test/issue.eml | 45 ++++++++++++++ addons/project_issue/test/issue_demo.yml | 8 +++ addons/project_issue/test/subscribe_issue.yml | 17 ++++++ 7 files changed, 196 insertions(+), 6 deletions(-) create mode 100644 addons/project_issue/test/cancel_issue.yml create mode 100644 addons/project_issue/test/draft2open2close.yml create mode 100644 addons/project_issue/test/issue.eml create mode 100644 addons/project_issue/test/issue_demo.yml create mode 100644 addons/project_issue/test/subscribe_issue.yml diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py index e77499df3d0..f57b8233878 100644 --- a/addons/project_issue/__openerp__.py +++ b/addons/project_issue/__openerp__.py @@ -54,8 +54,12 @@ and decide on their status as they evolve. ], 'demo_xml': ['project_issue_demo.xml'], 'test': [ - 'test/convert_issue_to_task.yml', - 'test/test_project_issue_states.yml' + #'test/convert_issue_to_task.yml', + #'test/test_project_issue_states.yml' + 'test/subscribe_issue.yml', + 'test/draft2open2close.yml', + 'test/cancel_issue.yml', + 'test/issue_demo.yml' ], 'installable': True, 'active': False, diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index b83efbc4996..88319e486ef 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -294,7 +294,7 @@ class project_issue(crm.crm_case, osv.osv): data_obj = self.pool.get('ir.model.data') task_obj = self.pool.get('project.task') - + if context is None: context = {} @@ -306,7 +306,7 @@ class project_issue(crm.crm_case, osv.osv): id2 = data_obj.browse(cr, uid, id2, context=context).res_id if id3: id3 = data_obj.browse(cr, uid, id3, context=context).res_id - + for bug in case_obj.browse(cr, uid, ids, context=context): new_task_id = task_obj.create(cr, uid, { 'name': bug.name, @@ -314,7 +314,7 @@ class project_issue(crm.crm_case, osv.osv): 'description':bug.description, 'date': bug.date, 'project_id': bug.project_id.id, - 'priority': bug.priority, + 'priority': tools.ustr(int(bug.priority) - 1), 'user_id': bug.user_id.id, 'planned_hours': 0.0, }) @@ -324,7 +324,6 @@ class project_issue(crm.crm_case, osv.osv): 'state':'pending' } case_obj.write(cr, uid, [bug.id], vals) - return { 'name': _('Tasks'), 'view_type': 'form', diff --git a/addons/project_issue/test/cancel_issue.yml b/addons/project_issue/test/cancel_issue.yml new file mode 100644 index 00000000000..ff05d923ed0 --- /dev/null +++ b/addons/project_issue/test/cancel_issue.yml @@ -0,0 +1,60 @@ +- + In order to test process of issue tracking in OpenERP, I cancel the unqualified Issue. +- + !python {model: project.issue}: | + self.case_cancel(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check the issue is in cancel state. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue is in cancel state}: + - state == 'cancel' +- + I re-open the Issue. +- + !python {model: project.issue}: | + self.case_open(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check the state of issue after open it. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue is in open state}: + - state == 'open' +- + I put the issue in pending state. +- + !python {model: project.issue}: | + self.case_pending(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check the state of issue after put it in pending state. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue should be in pending state}: + - state == 'pending' +- + I cancel the issue is in pending state. +- + !python {model: project.issue}: | + self.case_cancel(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check the issue is in cancel state. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue is in cancel state}: + - state == 'cancel' +- + I close Issue. +- + !python {model: project.issue}: | + self.case_close(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check state of Issue after close. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue is in done state}: + - state == 'done' +- + I cancel the issue is in done state. +- + !python {model: project.issue}: | + self.case_cancel(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check the issue is in cancel state. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue is in cancel state}: + - state == 'cancel' \ No newline at end of file diff --git a/addons/project_issue/test/draft2open2close.yml b/addons/project_issue/test/draft2open2close.yml new file mode 100644 index 00000000000..4614bed3997 --- /dev/null +++ b/addons/project_issue/test/draft2open2close.yml @@ -0,0 +1,57 @@ +- + 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' +- + I send mail to get more details. +- + !python {model: mail.compose.message }: | + ctx = context.copy() + ctx.update({'active_model': 'project.issue', 'active_id': ref("crm_case_buginaccountsmodule0"), 'active_ids': [ref("crm_case_buginaccountsmodule0")]}) + vals = self.default_get(cr, uid , [], context=ctx) + try: + new_id = self.create(cr, uid, {'email_to': 'Robert_Adersen@yahoo.com', 'subject': 'Regarding error in account module we nees more details'}) + self.send_mail(cr, uid, [new_id], context=ctx) + except Exception, e: + pass +- + After getting sufficient details, I re-open Issue from pending state. +- + !python {model: project.issue}: | + self.case_open(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + I check state of Issue after re-opened. +- + !assert {model: project.issue, id: crm_case_buginaccountsmodule0, severity: error, string: Issue should be in open state}: + - state == 'open' +- + I create Task for Issue. +- + !python {model: project.issue}: | + self.convert_issue_task(cr, uid, [ref("crm_case_buginaccountsmodule0")]) +- + 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' \ No newline at end of file diff --git a/addons/project_issue/test/issue.eml b/addons/project_issue/test/issue.eml new file mode 100644 index 00000000000..32659bbd7da --- /dev/null +++ b/addons/project_issue/test/issue.eml @@ -0,0 +1,45 @@ +Return-Path: +X-Original-To: abc@mycompany.com +Delivered-To: abc@mycompany.com +Received: by mail1.mycompany.com (Postfix, from userid 10002) + id 3955EBFACA; Tue, 29 Nov 2011 08:14:47 +0100 (CET) +X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail1.mycompany.com +X-Spam-Level: +X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, + RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 +Received: from nm39-vm6.bullet.mail.ne1.yahoo.com (nm39-vm6.bullet.mail.ne1.yahoo.com [98.138.229.166]) + by mail1.mycompany.com (Postfix) with SMTP id 0D074BF53A + for ; Tue, 29 Nov 2011 08:14:44 +0100 (CET) +Received: from [98.138.90.54] by nm39.bullet.mail.ne1.yahoo.com with NNFMP; 29 Nov 2011 07:13:26 -0000 +Received: from [98.138.84.39] by tm7.bullet.mail.ne1.yahoo.com with NNFMP; 29 Nov 2011 07:13:26 -0000 +Received: from [127.0.0.1] by smtp107.mail.ne1.yahoo.com with NNFMP; 29 Nov 2011 07:13:26 -0000 +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.in; s=s1024; t=1322550806; bh=LFefFqrky41IufKZHP8a86obZoBPxyX1aafgWNcrw7U=; h=X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:Content-Transfer-Encoding; b=NB8bd6b4Uk3/3fKhdzbcqFEZGPpKyotLeE0xh8H08rcFEahMFfY5uXgsYZsUFvTLCKfTyQWh/oPTVxHeUTGY/Y5MzAnndghX6S0mzlFtmW2dwLMqdWxQLZwU7EhbyYF9PCHicsmtlUVyo7Ou5ePSviqC0SOyCJJVWwzWlv5W9Zg= +X-Yahoo-Newman-Id: 152218.10448.bm@smtp107.mail.ne1.yahoo.com +X-Yahoo-Newman-Property: ymail-3 +X-YMail-OSG: i4zQqJUVM1mab8kxoCTmgMwxw9th.MdiJzmc4Ffbno7QGkl + acotmc0pGoiw_GrhwReSA6uNIveeAUi9WA6NniWAElxbUzGIQplTBHjRhdqF + d_rLG1Yn71DYxllLCZC8xoRzumVHw.kue0ymrl4D0VO.lEeyXbbYoz.TpAvu + ZASBwSV_mESEUu96bb1esfOjI_2MhibMNmt.2egkOG6LS3AcDkVWXJb.VpQe + yZieJ5djjUx9uu4HModjROSUWHKm3Qd5ZwvG.3s1JvHNNvPC3Mo6x.DXi_rj + d70J2pruXhJ9ZnbNooZiSHkrhaugWV.kquq6475ZxKP6Tu7G8iUgZUkHWCf. + aEdBFl2.4RanSkMohEfbNtwpXUQ0eDDOOPatHFB27JSP0jw-- +X-Yahoo-SMTP: oNtzSBqswBAqJIGYOgyGesyleENrhUEtEgBkQ053 +Received: from [192.168.1.30] (Robert_Adersen@180.211.100.2 with plain) + by smtp107.mail.ne1.yahoo.com with SMTP; 28 Nov 2011 23:13:25 -0800 PST +Message-ID: <4ED48611.6070605@yahoo.in> +Date: Tue, 29 Nov 2011 12:43:21 +0530 +From: Robert Adersen +User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110424 Thunderbird/3.1.10 +MIME-Version: 1.0 +To: abc@mycompany.com +Subject: Error in the account module +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit + +Hello Sir, + +I am using the openerp v6.1 and i have problem in hr module, so try to +check it and solve my problem. + +thanks +Robert Adersen diff --git a/addons/project_issue/test/issue_demo.yml b/addons/project_issue/test/issue_demo.yml new file mode 100644 index 00000000000..1ad26e6db73 --- /dev/null +++ b/addons/project_issue/test/issue_demo.yml @@ -0,0 +1,8 @@ +- + !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_9' + name: 'OpenERP Integration' diff --git a/addons/project_issue/test/subscribe_issue.yml b/addons/project_issue/test/subscribe_issue.yml new file mode 100644 index 00000000000..4ba472b41ed --- /dev/null +++ b/addons/project_issue/test/subscribe_issue.yml @@ -0,0 +1,17 @@ +- + In Order to test process of Issue in OpenERP, Custmer send the issue by email. +- + !python {model: mail.thread}: | + import addons + request_file = open(addons.get_module_resource('project_issue','test', 'issue.eml'),'rb') + request_message = request_file.read() + self.message_process(cr, uid, 'project.issue', request_message) +- + After getting the mail, I check details of new issue of that customer. +- + !python {model: project.issue}: | + issue_ids = self.search(cr, uid, [('email_from', '=', 'Robert Adersen ')]) + assert issue_ids and len(issue_ids), "issue is not created after getting request" + issue = self.browse(cr, uid, issue_ids[0], context=context) + assert not issue.partner_id, "Customer should be a new" + assert issue.name == "Error in the account module", "Subject does not match" \ No newline at end of file From 370e0c6510ece36865b61a325e8bb3b508993105 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 2 Dec 2011 16:31:18 +0530 Subject: [PATCH 039/192] [IMP] marketing_campaign: cleanup demo and yml to test process of compaign bzr revid: hmo@tinyerp.com-20111202110118-3w1h2z38d844f04i --- addons/marketing_campaign/__openerp__.py | 1 - .../marketing_campaign/marketing_campaign.py | 2 +- .../marketing_campaign_demo.xml | 48 ++++++------- .../test/marketing_campaign.yml | 67 +++++++++++++++---- .../test/marketing_campaign_demo.yml | 5 -- 5 files changed, 80 insertions(+), 43 deletions(-) delete mode 100644 addons/marketing_campaign/test/marketing_campaign_demo.yml diff --git a/addons/marketing_campaign/__openerp__.py b/addons/marketing_campaign/__openerp__.py index d9052239038..44646a07ead 100644 --- a/addons/marketing_campaign/__openerp__.py +++ b/addons/marketing_campaign/__openerp__.py @@ -61,7 +61,6 @@ Note: If you need demo data, you can install the marketing_campaign_crm_demo mod 'marketing_campaign_demo.xml', ], 'test': [ - 'test/marketing_campaign_demo.yml', 'test/marketing_campaign.yml', ], 'installable': True, diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index e79b893d40c..2ec05d17d9b 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -670,7 +670,7 @@ class marketing_campaign_workitem(osv.osv): def _process_one(self, cr, uid, workitem, context=None): if workitem.state != 'todo': - return + return False activity = workitem.activity_id proxy = self.pool.get(workitem.object_id.model) diff --git a/addons/marketing_campaign/marketing_campaign_demo.xml b/addons/marketing_campaign/marketing_campaign_demo.xml index f49b918aa2c..df01161182e 100644 --- a/addons/marketing_campaign/marketing_campaign_demo.xml +++ b/addons/marketing_campaign/marketing_campaign_demo.xml @@ -1,37 +1,31 @@ - - Dummy Action - - dummy - - - - - - - Welcome in OpenERP Family! - info@tinyerp.com + Template for New Partner + info@tinyerp.com + Welcome in OpenERP Partner Channel! + ${object.email or ''} Hello, We are very happy to send Welcome message. - Cogretulation! You become now our Silver Partner. - info@tinyerp.com + Template for Silver Partner + info@tinyerp.com + Congratulation! You become now our Silver Partner. + ${object.email or ''} - Hello,We are happy to announce that you now become our Silver Partner. - Regards,OpenERP Team, + Hello, We are happy to announce that you now become our Silver Partner. + Template for Gold Partner + info@tinyerp.com Congratulation! You become our Gold Partner. - info@tinyerp.com + ${object.email or ''} - Hello, We are happy to announce that you become our Gold Partner. - Regards,OpenERP Team, + Hello, We are happy to announce that you become our Gold Partner. @@ -47,22 +41,25 @@ New Partner - + object.credit_limit < 10000 + True Silver Partner - + object.credit_limit >= 10000 and object.credit_limit < 50000 + True Gold Partner - + object.credit_limit >= 100000 + True @@ -79,12 +76,17 @@ + + Partners + [('name','like','agrolait')] + res.partner + OpenERP Partner create_date + - draft diff --git a/addons/marketing_campaign/test/marketing_campaign.yml b/addons/marketing_campaign/test/marketing_campaign.yml index 502f9e892ec..c4a48dcf704 100644 --- a/addons/marketing_campaign/test/marketing_campaign.yml +++ b/addons/marketing_campaign/test/marketing_campaign.yml @@ -1,44 +1,85 @@ - - I start compaign. + In order to test process of compaign, I start compaign. - !workflow {model: marketing.campaign, action: state_running_set, ref: marketing_campaign_openerppartnerchannel} - - I check the campaign on Running mode. + I check the campaign on Running mode after started. - !assert {model: marketing.campaign, id: marketing_campaign_openerppartnerchannel}: - state == 'running' - - This campaign is only for OpenERP partner, so I assinged this Campaign - to right segment, after that I start this segment. + I assign segment to campaign. +- + !record {model: marketing.campaign.segment, id: marketing_campaign_segment0}: + campaign_id: marketing_campaign_openerppartnerchannel +- + I start this segment after assinged campaign. - !workflow {model: marketing.campaign.segment, action: state_running_set, ref: marketing_campaign_segment0} - - I check the segment on Running mode. + I check the segment on Running mode after started. - !assert {model: marketing.campaign.segment, id: marketing_campaign_segment0}: - state == 'running' - - I synchronized this segment manually to see all step of activity and process covered on this campaign. + I set credit limit for customer. +- + !python {model: res.partner}: | + self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':1000}, context=context) +- + I synchronized segment manually to see all step of activity and process covered on this campaign. - !python {model: marketing.campaign.segment}: | self.synchroniz(cr, uid, [ref("marketing_campaign_segment0")]) - - I process work item. + I check followup detail of first activity. - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) - #assert ids, 'Activity items not created' - #self.process(cr, uid, ids) - #record = self.browse(cr, uid, ids)[0] - #assert record.state == "done", "Activity item not in done state" + assert ids, 'Followup item is not created for first activity.' +- + Now I increase credit limit of customer +- + !python {model: res.partner}: | + self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':41000}, context=context) +- + I process followup of first activity. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + self.process(cr, uid, ids) + record = self.browse(cr, uid, ids)[0] + assert record.state == "done", "Followup item should be closed after process." +- + I check followup detail of second activity after process of first activity. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) + assert ids, 'Followup item is not created for second activity.' +- + Now I increase credit limit of customer +- + !python {model: res.partner}: | + self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':151000}, context=context) +- + I process followup of second activity. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) + self.process(cr, uid, ids) + record = self.browse(cr, uid, ids)[0] + assert record.state == "done", "Followup item should be closed after process." - I print workitem report. - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), - ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) - #self.preview(cr, uid, ids) + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) + self.preview(cr, uid, ids) - I close segmentation After completion of all activity. - diff --git a/addons/marketing_campaign/test/marketing_campaign_demo.yml b/addons/marketing_campaign/test/marketing_campaign_demo.yml deleted file mode 100644 index c727132bd47..00000000000 --- a/addons/marketing_campaign/test/marketing_campaign_demo.yml +++ /dev/null @@ -1,5 +0,0 @@ -- - In order to test process of marketing campaign, I create segment. -- - !record {model: marketing.campaign.segment, id: marketing_campaign_segment0}: - campaign_id: marketing_campaign_openerppartnerchannel From 82753bfc6a544125b3f5503e80335a1f2b2606c9 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 2 Dec 2011 16:45:24 +0530 Subject: [PATCH 040/192] [IMP] marketing_campaign: clenup yml again bzr revid: hmo@tinyerp.com-20111202111524-wk0wnrki1b0bm3po --- .../test/marketing_campaign.yml | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/addons/marketing_campaign/test/marketing_campaign.yml b/addons/marketing_campaign/test/marketing_campaign.yml index c4a48dcf704..18b3d95a911 100644 --- a/addons/marketing_campaign/test/marketing_campaign.yml +++ b/addons/marketing_campaign/test/marketing_campaign.yml @@ -21,11 +21,6 @@ - !assert {model: marketing.campaign.segment, id: marketing_campaign_segment0}: - state == 'running' -- - I set credit limit for customer. -- - !python {model: res.partner}: | - self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':1000}, context=context) - I synchronized segment manually to see all step of activity and process covered on this campaign. - @@ -36,19 +31,14 @@ - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), - ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_0'))]) assert ids, 'Followup item is not created for first activity.' -- - Now I increase credit limit of customer -- - !python {model: res.partner}: | - self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':41000}, context=context) - I process followup of first activity. - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), - ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_0'))]) self.process(cr, uid, ids) record = self.browse(cr, uid, ids)[0] assert record.state == "done", "Followup item should be closed after process." @@ -57,21 +47,44 @@ - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), - ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) assert ids, 'Followup item is not created for second activity.' - Now I increase credit limit of customer +- + !python {model: res.partner}: | + self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':41000}, context=context) +- + I process followup of second activity after set draft. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_1'))]) + self.button_draft(cr, uid, ids, context=context) + self.process(cr, uid, ids, context=context) + record = self.browse(cr, uid, ids[0], context=context) + assert record.state == "done", "Followup item should be closed after process." +- + I check followup detail of third activity after process of second activity. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) + assert ids, 'Followup item is not created for third activity.' +- + Now I increase credit limit of customer - !python {model: res.partner}: | self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':151000}, context=context) - - I process followup of second activity. + I process followup of third activity after set draft. - !python {model: marketing.campaign.workitem}: | ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) - self.process(cr, uid, ids) - record = self.browse(cr, uid, ids)[0] + self.button_draft(cr, uid, ids, context=context) + self.process(cr, uid, ids, context=context) + record = self.browse(cr, uid, ids[0], context=context) assert record.state == "done", "Followup item should be closed after process." - I print workitem report. From f34e66ab32c5235ad2d1e208fc1f01f8f64840a9 Mon Sep 17 00:00:00 2001 From: sebastien beau Date: Sat, 3 Dec 2011 12:53:20 +0100 Subject: [PATCH 041/192] [IMP] stock refactor _create_chained_picking bzr revid: sebastien.beau@akretion.com.br-20111203115320-35jtptnnoyegqjcd --- addons/stock/stock.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/addons/stock/stock.py b/addons/stock/stock.py index 461c863aaed..08ee5dc631e 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -1852,23 +1852,28 @@ class stock_move(osv.osv): result[m.picking_id].append( (m, dest) ) return result - def _create_chained_picking(self, cr, uid, pick_name, picking, ptype, move, context=None): + def _prepare_chained_picking(self, cr, uid, pick_name, picking, ptype, move, context=None): res_obj = self.pool.get('res.company') + return { + 'name': pick_name, + 'origin': tools.ustr(picking.origin or ''), + 'type': ptype, + 'note': picking.note, + 'move_type': picking.move_type, + 'auto_picking': move[0][1][1] == 'auto', + 'stock_journal_id': move[0][1][3], + 'company_id': move[0][1][4] or res_obj._company_default_get(cr, uid, 'stock.company', context=context), + 'address_id': picking.address_id.id, + 'invoice_state': 'none', + 'date': picking.date, + } + + + def _create_chained_picking(self, cr, uid, pick_name, picking, ptype, move, context=None): picking_obj = self.pool.get('stock.picking') - pick_id= picking_obj.create(cr, uid, { - 'name': pick_name, - 'origin': tools.ustr(picking.origin or ''), - 'type': ptype, - 'note': picking.note, - 'move_type': picking.move_type, - 'auto_picking': move[0][1][1] == 'auto', - 'stock_journal_id': move[0][1][3], - 'company_id': move[0][1][4] or res_obj._company_default_get(cr, uid, 'stock.company', context=context), - 'address_id': picking.address_id.id, - 'invoice_state': 'none', - 'date': picking.date, - }) + pick_id= picking_obj.create(cr, uid, self._prepare_chained_picking(cr, uid, pick_name, picking, ptype, move, context=context)) return pick_id + def create_chained_picking(self, cr, uid, moves, context=None): res_obj = self.pool.get('res.company') location_obj = self.pool.get('stock.location') From 01f54a04b9c13ffc77f80649e1d80cd8cd90a692 Mon Sep 17 00:00:00 2001 From: "Meera Trambadia (OpenERP)" Date: Mon, 5 Dec 2011 11:56:38 +0530 Subject: [PATCH 042/192] [FIX] crm: improved ids of crm security rights in csv lp bug: https://launchpad.net/bugs/899916 fixed bzr revid: mtr@tinyerp.com-20111205062638-vsg1n2zwyak399rd --- addons/crm/security/ir.model.access.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/crm/security/ir.model.access.csv b/addons/crm/security/ir.model.access.csv index 4ea07252276..5adf4f04473 100644 --- a/addons/crm/security/ir.model.access.csv +++ b/addons/crm/security/ir.model.access.csv @@ -14,9 +14,9 @@ "access_crm_meeting","crm.meeting","model_crm_meeting","base.group_sale_salesman",1,1,1,0 "access_crm_meeting_all","crm.meeting_allll","model_crm_meeting","base.group_user",1,0,0,0 "access_crm_lead","crm.lead","model_crm_lead","base.group_sale_salesman",1,1,1,0 -"access_crm_lead.all","crm.lead.all","model_crm_lead","base.group_user",1,0,0,0 +"access_crm_lead_all","crm.lead.all","model_crm_lead","base.group_user",1,0,0,0 "access_crm_phonecall","crm.phonecall","model_crm_phonecall","base.group_sale_salesman",1,1,1,0 -"access_crm_phonecall.all","crm.phonecall.all","model_crm_phonecall","base.group_user",1,0,0,0 +"access_crm_phonecall_all","crm.phonecall.all","model_crm_phonecall","base.group_user",1,0,0,0 "access_crm_case_section_user","crm.case.section.user","model_crm_case_section","base.group_sale_salesman",1,1,1,0 "access_crm_case_section_manager","crm.case.section.manager","model_crm_case_section","base.group_sale_manager",1,1,1,1 "access_crm_case_stage","crm.case.stage","model_crm_case_stage","base.group_user",1,0,0,0 From edce20b032775ab565874feee409783a9317a43c Mon Sep 17 00:00:00 2001 From: vishmita Date: Tue, 6 Dec 2011 16:11:28 +0530 Subject: [PATCH 043/192] [FIX]Readonly char fields should be grey. lp bug: https://launchpad.net/bugs/899076 fixed bzr revid: vja@vja-desktop-20111206104128-pepiy3f7wy2xipmp --- addons/web/static/src/css/base.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 067ea09cd38..4b8675beebb 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1121,7 +1121,9 @@ label.error { .openerp .oe_forms select{ padding-top: 2px; } - +.openerp .oe_forms input[disabled] { + background: #EBEBE4; +} .openerp .oe_forms textarea { resize:vertical; } From 12296a03e496cde652a4c75f90153e5f7ff3c8f9 Mon Sep 17 00:00:00 2001 From: vishmita Date: Tue, 6 Dec 2011 16:11:28 +0530 Subject: [PATCH 044/192] [FIX]Readonly char fields should be grey. lp bug: https://launchpad.net/bugs/899076 fixed bzr revid: vja@vja-desktop-20111206104128-1xrurdtr6qyoybq4 --- addons/web/static/src/css/base.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css index 00e8e1f5e55..c4beab3badc 100644 --- a/addons/web/static/src/css/base.css +++ b/addons/web/static/src/css/base.css @@ -1151,7 +1151,9 @@ label.error { .openerp .oe_forms select{ padding-top: 2px; } - +.openerp .oe_forms input[disabled] { + background: #EBEBE4; +} .openerp .oe_forms textarea { resize:vertical; } From b66a616bf6ca932cf6c651f0b03c928f118fdbef Mon Sep 17 00:00:00 2001 From: "Amit (OpenERP)" Date: Tue, 6 Dec 2011 18:10:28 +0530 Subject: [PATCH 045/192] [IMP]:point_of_sale:set default customer in partner_id field bzr revid: apa@tinyerp.com-20111206124028-tffnm10c8dj6wk9f --- addons/point_of_sale/point_of_sale_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 165c6c83e3a..a0f91861733 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -16,7 +16,7 @@ - + +
From b9224210c3d509e69120315e2354c314721bfa26 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 12 Dec 2011 17:42:12 +0100 Subject: [PATCH 083/192] [imp] added startup code for synchronisation icon bzr revid: nicolas.vanhoren@openerp.com-20111212164212-3jsfl1fltk6blq93 --- addons/point_of_sale/static/src/js/pos.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/addons/point_of_sale/static/src/js/pos.js b/addons/point_of_sale/static/src/js/pos.js index 5022601063e..79cba643647 100644 --- a/addons/point_of_sale/static/src/js/pos.js +++ b/addons/point_of_sale/static/src/js/pos.js @@ -1167,14 +1167,18 @@ openerp.point_of_sale = function(db) { template: "PointOfSale", start: function() { var self = this; - this.$element.find("#loggedas button").click(function() { - self.stop(); - }); if (pos) throw "It is not possible to instantiate multiple instances "+ "of the point of sale at the same time."; pos = new Pos(this.session); + + pos.bind('change:pending_operations', this.changed_pending_operations, this); + this.changed_pending_operations(); + + this.$element.find("#loggedas button").click(function() { + self.try_close(); + }); this.$element.find('#steps').buttonset(); @@ -1185,6 +1189,17 @@ openerp.point_of_sale = function(db) { pos.app = new App(self.$element); }); }, + changed_pending_operations: function () { + var operations = pos.get('pending_operations'); + var number = operations.length; + + }, + try_close: function() { + this.close(); + }, + close: function() { + this.stop(); + }, stop: function() { $('.oe_footer').show(); $('.oe_toggle_secondary_menu').show(); From f9524f5dba526a802a050844df939f0967f5e806 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Tue, 13 Dec 2011 10:52:38 +0530 Subject: [PATCH 084/192] [IMP] improvement in YML test cases in marketing_campaign module bzr revid: tpa@tinyerp.com-20111213052238-kuk13vidnoa3fwhq --- .../marketing_campaign/marketing_campaign.py | 5 +- .../test/marketing_campaign.yml | 50 +++++++++++++++++-- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index 2ec05d17d9b..4e6f6a5227e 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -164,11 +164,12 @@ Normal - the campaign runs normally and automatically sends all emails and repor self.write(cr, uid, ids, {'state': 'cancelled'}) return True - + # dead code def signal(self, cr, uid, model, res_id, signal, run_existing=True, context=None): record = self.pool.get(model).browse(cr, uid, res_id, context) return self._signal(cr, uid, record, signal, run_existing, context) + #dead code def _signal(self, cr, uid, record, signal, run_existing=True, context=None): if not signal: raise ValueError('signal cannot be False') @@ -461,6 +462,7 @@ class marketing_campaign_activity(osv.osv): return super(marketing_campaign_activity, self).search(cr, uid, args, offset, limit, order, context, count) + #dead code def _process_wi_report(self, cr, uid, activity, workitem, context=None): service = netsvc.LocalService('report.%s'%activity.report_id.report_name) (report_data, format) = service.create(cr, uid, [], {}, {}) @@ -481,6 +483,7 @@ class marketing_campaign_activity(osv.osv): activity.email_template_id.id, workitem.res_id, context=context) + #dead code def _process_wi_action(self, cr, uid, activity, workitem, context=None): if context is None: context = {} diff --git a/addons/marketing_campaign/test/marketing_campaign.yml b/addons/marketing_campaign/test/marketing_campaign.yml index 562e2f981e0..1b7a7fa2ae3 100644 --- a/addons/marketing_campaign/test/marketing_campaign.yml +++ b/addons/marketing_campaign/test/marketing_campaign.yml @@ -20,7 +20,27 @@ I synchronized segment manually to see all step of activity and process covered on this campaign. - !python {model: marketing.campaign.segment}: | + segment_id = self.browse(cr ,uid ,ref("marketing_campaign_segment0") ,context) + assert segment_id.date_next_sync, 'Next Synchronization date is not calculated.' self.synchroniz(cr, uid, [ref("marketing_campaign_segment0")]) +- + I cancel Marketing Workitems. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel'))]) + self.button_cancel(cr, uid, ids) + record = self.browse(cr, uid, ids[0]) + assert record.state == 'cancelled' or record.state == 'done' , 'Marketing Workitem shoud be in cancel state.' +- + I set Marketing Workitems in draft state. +- + !python {model: marketing.campaign.workitem}: | + ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), + ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel'))]) + self.button_draft(cr, uid, ids) + record = self.browse(cr, uid, ids[0]) + assert record.state == 'todo' or record.state == 'done' , 'Marketing Workitem shoud be in draft state.' - I check followup detail of first activity. - @@ -28,7 +48,9 @@ ids = self.search(cr, uid, [('segment_id', '=', ref('marketing_campaign_segment0')), ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_0'))]) assert ids, 'Followup item is not created for first activity.' -- + work_item_id = self.browse(cr ,uid ,ids[0] ,context) + assert work_item_id.res_name, 'Resource Name is not defined.' +- I process followup of first activity. - !python {model: marketing.campaign.workitem}: | @@ -49,7 +71,7 @@ - !python {model: res.partner}: | self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':41000}, context=context) -- +- I process followup of second activity after set draft. - !python {model: marketing.campaign.workitem}: | @@ -71,7 +93,7 @@ - !python {model: res.partner}: | self.write(cr, uid, [ref("base.res_partner_agrolait")], {'credit_limit':151000}, context=context) -- +- I process followup of third activity after set draft. - !python {model: marketing.campaign.workitem}: | @@ -89,7 +111,27 @@ ('campaign_id', '=', ref('marketing_campaign_openerppartnerchannel')), ('activity_id', '=', ref('marketing_campaign_activity_2'))]) self.preview(cr, uid, ids) - - I close segmentation After completion of all activity. + I cancel segmentation because of some activity. +- + !workflow {model: marketing.campaign.segment, action: state_cancel_set, ref: marketing_campaign_segment0} +- + I check the segmentation is canceled. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_segment0}: + - state == 'cancelled' +- + I reopen the segmentation. +- + !workflow {model: marketing.campaign.segment, action: state_draft_set, ref: marketing_campaign_segment0} +- + !workflow {model: marketing.campaign.segment, action: state_running_set, ref: marketing_campaign_segment0} +- + I check the segment on Running mode after started. +- + !assert {model: marketing.campaign.segment, id: marketing_campaign_segment0}: + - state == 'running' +- + I close segmentation After completion of all activity. - !workflow {model: marketing.campaign.segment, action: state_done_set, ref: marketing_campaign_segment0} - From 1dedc1d259ded376963a650cb6059d60058f7e70 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 13 Dec 2011 17:15:07 +0530 Subject: [PATCH 085/192] [IMP] account: Changed value of selection field 'only_detail' by 'detail_flat'. auction,hr_payroll_account,l10n_de: Changed demo data according to change in xml ids of account types. bzr revid: uco@tinyerp.com-20111213114507-733esietgnh04z5l --- addons/account/account.py | 4 +- .../report/account_financial_report.py | 2 +- addons/auction/auction_demo.xml | 8 +- .../hr_payroll_account_demo.xml | 6 +- addons/l10n_de/account_chart_skr03.xml | 2080 ++++++------- addons/l10n_de/account_chart_skr04.xml | 2660 ++++++++--------- addons/l10n_de/account_types_skr03.xml | 4 +- addons/l10n_de/account_types_skr04.xml | 4 +- 8 files changed, 2384 insertions(+), 2384 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index e1f1385c882..6e9ed9f1331 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -3006,7 +3006,7 @@ class account_financial_report(osv.osv): 'account_ids': fields.many2many('account.account', 'account_account_financial_report', 'report_line_id', 'account_id', 'Accounts'), 'display_detail': fields.selection([ ('no_detail','No detail'), - ('only_detail','Display children flat'), + ('detail_flat','Display children flat'), ('detail_with_hierarchy','Display children with hierarchy') ], 'Display details'), 'account_report_id': fields.many2one('account.financial.report', 'Report Value'), @@ -3016,7 +3016,7 @@ class account_financial_report(osv.osv): _defaults = { 'type': 'sum', - 'display_detail': 'only_detail', + 'display_detail': 'detail_flat', 'sign': 1, } diff --git a/addons/account/report/account_financial_report.py b/addons/account/report/account_financial_report.py index d4d33426eb1..c3b1f5e2e1a 100644 --- a/addons/account/report/account_financial_report.py +++ b/addons/account/report/account_financial_report.py @@ -70,7 +70,7 @@ class report_account_common(report_sxw.rml_parse, common_report_header): account_ids = account_obj.search(self.cr, self.uid, [('user_type','in', [x.id for x in report.account_type_ids])]) if account_ids: for account in account_obj.browse(self.cr, self.uid, account_ids, context=data['form']['used_context']): - if report.display_detail == 'only_detail' and account.type == 'view': + if report.display_detail == 'detail_flat' and account.type == 'view': continue flag = False vals = { diff --git a/addons/auction/auction_demo.xml b/addons/auction/auction_demo.xml index e93cc3ea04d..5566719a56d 100644 --- a/addons/auction/auction_demo.xml +++ b/addons/auction/auction_demo.xml @@ -21,7 +21,7 @@ - + @@ -32,13 +32,13 @@ - + Auction Adjudications A7x* - + other @@ -47,7 +47,7 @@ Auction Adjudication Expenses A6x* - + other diff --git a/addons/hr_payroll_account/hr_payroll_account_demo.xml b/addons/hr_payroll_account/hr_payroll_account_demo.xml index 6372dabc723..ed6371a6f4d 100644 --- a/addons/hr_payroll_account/hr_payroll_account_demo.xml +++ b/addons/hr_payroll_account/hr_payroll_account_demo.xml @@ -81,7 +81,7 @@ Bank Current Account liquidity - + @@ -89,7 +89,7 @@ Salary Expenses other - + @@ -98,7 +98,7 @@ payable - + diff --git a/addons/l10n_de/account_chart_skr03.xml b/addons/l10n_de/account_chart_skr03.xml index 7a7e1fb8ee0..74af8bb976d 100644 --- a/addons/l10n_de/account_chart_skr03.xml +++ b/addons/l10n_de/account_chart_skr03.xml @@ -964,7 +964,7 @@ 8339 other - + @@ -972,7 +972,7 @@ 3724 other - + @@ -980,7 +980,7 @@ 4300 other - + @@ -988,7 +988,7 @@ 0280 other - + @@ -996,7 +996,7 @@ 8300 other - + @@ -1004,7 +1004,7 @@ 4370 other - + @@ -1012,7 +1012,7 @@ 4520 other - + @@ -1020,7 +1020,7 @@ 3710 other - + @@ -1028,7 +1028,7 @@ 4149 other - + @@ -1036,7 +1036,7 @@ 0939 other - + @@ -1044,7 +1044,7 @@ 3551 other - + @@ -1052,7 +1052,7 @@ 3550 other - + @@ -1060,7 +1060,7 @@ 4145 other - + @@ -1068,7 +1068,7 @@ 1940 other - + @@ -1076,7 +1076,7 @@ 0930 other - + @@ -1084,7 +1084,7 @@ 0931 other - + @@ -1092,7 +1092,7 @@ 0932 other - + @@ -1100,7 +1100,7 @@ 3558 other - + @@ -1108,7 +1108,7 @@ 2171 other - + @@ -1116,7 +1116,7 @@ 3850 other - + @@ -1124,7 +1124,7 @@ 8905 other - + @@ -1132,7 +1132,7 @@ 8800 other - + @@ -1140,7 +1140,7 @@ 8906 other - + @@ -1148,7 +1148,7 @@ 4306 other - + @@ -1156,7 +1156,7 @@ 8900 other - + @@ -1164,7 +1164,7 @@ 8726 other - + @@ -1172,7 +1172,7 @@ 4969 other - + @@ -1180,7 +1180,7 @@ 4175 other - + @@ -1188,7 +1188,7 @@ 1793 other - + @@ -1196,7 +1196,7 @@ 1792 other - + @@ -1204,7 +1204,7 @@ 1791 other - + @@ -1212,7 +1212,7 @@ 1790 other - + @@ -1220,7 +1220,7 @@ 1795 other - + @@ -1228,7 +1228,7 @@ 1490 receivable - + @@ -1236,7 +1236,7 @@ 1491 other - + @@ -1244,7 +1244,7 @@ 7095 other - + @@ -1252,7 +1252,7 @@ 1495 other - + @@ -1260,7 +1260,7 @@ 1498 other - + @@ -1268,7 +1268,7 @@ 1499 other - + @@ -1276,7 +1276,7 @@ 0998 other - + @@ -1284,7 +1284,7 @@ 1700 other - + @@ -1292,7 +1292,7 @@ 0720 other - + @@ -1300,7 +1300,7 @@ 1702 other - + @@ -1308,7 +1308,7 @@ 1703 other - + @@ -1316,7 +1316,7 @@ 0725 other - + @@ -1324,7 +1324,7 @@ 1705 other - + @@ -1332,7 +1332,7 @@ 1706 other - + @@ -1340,7 +1340,7 @@ 1707 other - + @@ -1348,7 +1348,7 @@ 1708 other - + @@ -1356,7 +1356,7 @@ 1709 other - + @@ -1364,7 +1364,7 @@ 0680 other - + @@ -1372,7 +1372,7 @@ 2315 other - + @@ -1380,7 +1380,7 @@ 2312 other - + @@ -1388,7 +1388,7 @@ 2313 other - + @@ -1396,7 +1396,7 @@ 2310 other - + @@ -1404,7 +1404,7 @@ 2311 other - + @@ -1412,7 +1412,7 @@ 4831 other - + @@ -1420,7 +1420,7 @@ 4830 other - + @@ -1428,7 +1428,7 @@ 4960 other - + @@ -1436,7 +1436,7 @@ 1661 other - + @@ -1444,7 +1444,7 @@ 1660 other - + @@ -1452,7 +1452,7 @@ 0112 other - + @@ -1460,7 +1460,7 @@ 0113 other - + @@ -1468,7 +1468,7 @@ 0059 other - + @@ -1476,7 +1476,7 @@ 0111 other - + @@ -1484,7 +1484,7 @@ 0115 other - + @@ -1492,7 +1492,7 @@ 1120 liquidity - + @@ -1500,7 +1500,7 @@ 4320 other - + @@ -1508,7 +1508,7 @@ 8600 other - + @@ -1516,7 +1516,7 @@ 0050 other - + @@ -1524,7 +1524,7 @@ 8605 other - + @@ -1532,7 +1532,7 @@ 3140 other - + @@ -1540,7 +1540,7 @@ 4654 other - + @@ -1548,7 +1548,7 @@ 4964 other - + @@ -1556,7 +1556,7 @@ 4651 other - + @@ -1564,7 +1564,7 @@ 3145 other - + @@ -1572,7 +1572,7 @@ 4653 other - + @@ -1580,7 +1580,7 @@ 4652 other - + @@ -1588,7 +1588,7 @@ 4137 other - + @@ -1596,7 +1596,7 @@ 4550 other - + @@ -1604,7 +1604,7 @@ 8660 other - + @@ -1612,7 +1612,7 @@ 8749 other - + @@ -1620,7 +1620,7 @@ 0750 other - + @@ -1628,7 +1628,7 @@ 1455 other - + @@ -1636,7 +1636,7 @@ 3749 other - + @@ -1644,7 +1644,7 @@ 3610 other - + @@ -1652,7 +1652,7 @@ 2381 other - + @@ -1660,7 +1660,7 @@ 2380 other - + @@ -1668,7 +1668,7 @@ 2383 other - + @@ -1676,7 +1676,7 @@ 2382 other - + @@ -1684,7 +1684,7 @@ 2385 other - + @@ -1692,7 +1692,7 @@ 2384 other - + @@ -1700,7 +1700,7 @@ 0200 other - + @@ -1708,7 +1708,7 @@ 2386 other - + @@ -1716,7 +1716,7 @@ 0615 other - + @@ -1724,7 +1724,7 @@ 2388 other - + @@ -1732,7 +1732,7 @@ 1401 receivable - + @@ -1740,7 +1740,7 @@ 1400 receivable - + @@ -1748,7 +1748,7 @@ 1010 liquidity - + @@ -1756,7 +1756,7 @@ 0610 other - + @@ -1764,7 +1764,7 @@ 8730 other - + @@ -1772,7 +1772,7 @@ 1518 other - + @@ -1780,7 +1780,7 @@ 4215 other - + @@ -1788,7 +1788,7 @@ 8514 other - + @@ -1796,7 +1796,7 @@ 1130 liquidity - + @@ -1804,7 +1804,7 @@ 1230 liquidity - + @@ -1812,7 +1812,7 @@ 4210 other - + @@ -1820,7 +1820,7 @@ 4198 other - + @@ -1828,7 +1828,7 @@ 1449 other - + @@ -1836,7 +1836,7 @@ 8750 other - + @@ -1844,7 +1844,7 @@ 8828 other - + @@ -1852,7 +1852,7 @@ 4219 other - + @@ -1860,7 +1860,7 @@ 1330 liquidity - + @@ -1868,7 +1868,7 @@ 4190 other - + @@ -1876,7 +1876,7 @@ 0100 other - + @@ -1884,7 +1884,7 @@ 0079 other - + @@ -1892,7 +1892,7 @@ 0730 other - + @@ -1900,7 +1900,7 @@ 4355 other - + @@ -1908,7 +1908,7 @@ 8125 other - + @@ -1916,7 +1916,7 @@ 4350 other - + @@ -1924,7 +1924,7 @@ 4260 other - + @@ -1932,7 +1932,7 @@ 2387 other - + @@ -1940,7 +1940,7 @@ 1516 other - + @@ -1948,7 +1948,7 @@ 1448 other - + @@ -1956,7 +1956,7 @@ 4815 other - + @@ -1964,7 +1964,7 @@ 1511 other - + @@ -1972,7 +1972,7 @@ 1840 other - + @@ -1980,7 +1980,7 @@ 1510 other - + @@ -1988,7 +1988,7 @@ 1537 other - + @@ -1996,7 +1996,7 @@ 1240 liquidity - + @@ -2004,7 +2004,7 @@ 3090 other - + @@ -2012,7 +2012,7 @@ 1531 other - + @@ -2020,7 +2020,7 @@ 1530 other - + @@ -2028,7 +2028,7 @@ 4950 other - + @@ -2036,7 +2036,7 @@ 2166 other - + @@ -2044,7 +2044,7 @@ 4957 other - + @@ -2052,7 +2052,7 @@ 1539 other - + @@ -2060,7 +2060,7 @@ 1538 other - + @@ -2068,7 +2068,7 @@ 2617 other - + @@ -2076,7 +2076,7 @@ 2616 other - + @@ -2084,7 +2084,7 @@ 2615 other - + @@ -2092,7 +2092,7 @@ 4905 other - + @@ -2100,7 +2100,7 @@ 3800 other - + @@ -2108,7 +2108,7 @@ 2619 other - + @@ -2116,7 +2116,7 @@ 2618 other - + @@ -2124,7 +2124,7 @@ 0970 other - + @@ -2132,7 +2132,7 @@ 0971 other - + @@ -2140,7 +2140,7 @@ 0972 other - + @@ -2148,7 +2148,7 @@ 0973 other - + @@ -2156,7 +2156,7 @@ 0974 other - + @@ -2164,7 +2164,7 @@ 3559 other - + @@ -2172,7 +2172,7 @@ 0976 other - + @@ -2180,7 +2180,7 @@ 0977 other - + @@ -2188,7 +2188,7 @@ 0978 other - + @@ -2196,7 +2196,7 @@ 0979 other - + @@ -2204,7 +2204,7 @@ 3125 other - + @@ -2212,7 +2212,7 @@ 1900 other - + @@ -2220,7 +2220,7 @@ 8940 other - + @@ -2228,7 +2228,7 @@ 8190 other - + @@ -2236,7 +2236,7 @@ 8196 other - + @@ -2244,7 +2244,7 @@ 8400 other - + @@ -2252,7 +2252,7 @@ 8300 other - + @@ -2260,7 +2260,7 @@ 8947 other - + @@ -2268,7 +2268,7 @@ 8195 other - + @@ -2276,7 +2276,7 @@ 8949 other - + @@ -2284,7 +2284,7 @@ 0500 other - + @@ -2292,7 +2292,7 @@ 8741 other - + @@ -2300,7 +2300,7 @@ 0505 other - + @@ -2308,7 +2308,7 @@ 0504 other - + @@ -2316,7 +2316,7 @@ 1731 other - + @@ -2324,7 +2324,7 @@ 2688 other - + @@ -2332,7 +2332,7 @@ 2689 other - + @@ -2340,7 +2340,7 @@ 2680 other - + @@ -2348,7 +2348,7 @@ 1000 liquidity - + @@ -2356,7 +2356,7 @@ 8922 other - + @@ -2364,7 +2364,7 @@ 8120 other - + @@ -2372,7 +2372,7 @@ 0147 other - + @@ -2380,7 +2380,7 @@ 0480 other - + @@ -2388,7 +2388,7 @@ 0630 other - + @@ -2396,7 +2396,7 @@ 0485 other - + @@ -2404,7 +2404,7 @@ 1465 other - + @@ -2412,7 +2412,7 @@ 8955 other - + @@ -2420,7 +2420,7 @@ 8650 other - + @@ -2428,7 +2428,7 @@ 7000 other - + @@ -2436,7 +2436,7 @@ 1990 other - + @@ -2444,7 +2444,7 @@ 4170 other - + @@ -2452,7 +2452,7 @@ 1626 other - + @@ -2460,7 +2460,7 @@ 1625 other - + @@ -2468,7 +2468,7 @@ 1624 other - + @@ -2476,7 +2476,7 @@ 4946 other - + @@ -2484,7 +2484,7 @@ 1628 other - + @@ -2492,7 +2492,7 @@ 8935 other - + @@ -2500,7 +2500,7 @@ 8839 other - + @@ -2508,7 +2508,7 @@ 8838 other - + @@ -2516,7 +2516,7 @@ 3960 other - + @@ -2524,7 +2524,7 @@ 8933 other - + @@ -2532,7 +2532,7 @@ 8837 other - + @@ -2540,7 +2540,7 @@ 4340 other - + @@ -2548,7 +2548,7 @@ 0570 other - + @@ -2556,7 +2556,7 @@ 8939 other - + @@ -2564,7 +2564,7 @@ 8851 other - + @@ -2572,7 +2572,7 @@ 7140 other - + @@ -2580,7 +2580,7 @@ 8917 other - + @@ -2588,7 +2588,7 @@ 0513 other - + @@ -2596,7 +2596,7 @@ 8400 other - + @@ -2604,7 +2604,7 @@ 8850 other - + @@ -2612,7 +2612,7 @@ 2345 other - + @@ -2620,7 +2620,7 @@ 0650 other - + @@ -2628,7 +2628,7 @@ 2341 other - + @@ -2636,7 +2636,7 @@ 2340 other - + @@ -2644,7 +2644,7 @@ 2670 other - + @@ -2652,7 +2652,7 @@ 1190 liquidity - + @@ -2660,7 +2660,7 @@ 2349 other - + @@ -2668,7 +2668,7 @@ 2348 other - + @@ -2676,7 +2676,7 @@ 4880 other - + @@ -2684,7 +2684,7 @@ 1690 other - + @@ -2692,7 +2692,7 @@ 0890 other - + @@ -2700,7 +2700,7 @@ 0710 other - + @@ -2708,7 +2708,7 @@ 1756 other - + @@ -2716,7 +2716,7 @@ 1755 other - + @@ -2724,7 +2724,7 @@ 1754 other - + @@ -2732,7 +2732,7 @@ 1753 other - + @@ -2740,7 +2740,7 @@ 0715 other - + @@ -2748,7 +2748,7 @@ 0716 other - + @@ -2756,7 +2756,7 @@ 1750 other - + @@ -2764,7 +2764,7 @@ 0020 other - + @@ -2772,7 +2772,7 @@ 8160 other - + @@ -2780,7 +2780,7 @@ 0027 other - + @@ -2788,7 +2788,7 @@ 0025 other - + @@ -2796,7 +2796,7 @@ 4250 other - + @@ -2804,7 +2804,7 @@ 4885 other - + @@ -2812,7 +2812,7 @@ 0660 other - + @@ -2820,7 +2820,7 @@ 4500 other - + @@ -2828,7 +2828,7 @@ 0193 other - + @@ -2836,7 +2836,7 @@ 8790 other - + @@ -2844,7 +2844,7 @@ 3700 other - + @@ -2852,7 +2852,7 @@ 8736 other - + @@ -2860,7 +2860,7 @@ 8794 other - + @@ -2868,7 +2868,7 @@ 8723 other - + @@ -2876,7 +2876,7 @@ 1880 other - + @@ -2884,7 +2884,7 @@ 2120 other - + @@ -2892,7 +2892,7 @@ 2125 other - + @@ -2900,7 +2900,7 @@ 2127 other - + @@ -2908,7 +2908,7 @@ 2126 other - + @@ -2916,7 +2916,7 @@ 2129 other - + @@ -2924,7 +2924,7 @@ 2128 other - + @@ -2932,7 +2932,7 @@ 3115 other - + @@ -2940,7 +2940,7 @@ 3565 other - + @@ -2948,7 +2948,7 @@ 4660 other - + @@ -2956,7 +2956,7 @@ 4662 other - + @@ -2964,7 +2964,7 @@ 3110 other - + @@ -2972,7 +2972,7 @@ 0625 other - + @@ -2980,7 +2980,7 @@ 1579 other - + @@ -2988,7 +2988,7 @@ 1578 other - + @@ -2996,7 +2996,7 @@ 0620 other - + @@ -3004,7 +3004,7 @@ 8727 other - + @@ -3012,7 +3012,7 @@ 0150 other - + @@ -3020,7 +3020,7 @@ 1475 other - + @@ -3028,7 +3028,7 @@ 1573 other - + @@ -3036,7 +3036,7 @@ 1572 other - + @@ -3044,7 +3044,7 @@ 1571 other - + @@ -3052,7 +3052,7 @@ 1479 other - + @@ -3060,7 +3060,7 @@ 1577 other - + @@ -3068,7 +3068,7 @@ 1576 other - + @@ -3076,7 +3076,7 @@ 1575 other - + @@ -3084,7 +3084,7 @@ 0090 other - + @@ -3092,7 +3092,7 @@ 2712 other - + @@ -3100,7 +3100,7 @@ 1305 other - + @@ -3108,7 +3108,7 @@ 2659 other - + @@ -3116,7 +3116,7 @@ 2658 other - + @@ -3124,7 +3124,7 @@ 2716 other - + @@ -3132,7 +3132,7 @@ 1301 other - + @@ -3140,7 +3140,7 @@ 1302 other - + @@ -3148,7 +3148,7 @@ 2715 other - + @@ -3156,7 +3156,7 @@ 2653 other - + @@ -3164,7 +3164,7 @@ 1450 receivable - + @@ -3172,7 +3172,7 @@ 2650 other - + @@ -3180,7 +3180,7 @@ 2657 other - + @@ -3188,7 +3188,7 @@ 2656 other - + @@ -3196,7 +3196,7 @@ 2655 other - + @@ -3204,7 +3204,7 @@ 2654 other - + @@ -3212,7 +3212,7 @@ 4228 other - + @@ -3220,7 +3220,7 @@ 4229 other - + @@ -3228,7 +3228,7 @@ 4220 other - + @@ -3236,7 +3236,7 @@ 8540 other - + @@ -3244,7 +3244,7 @@ 8919 other - + @@ -3252,7 +3252,7 @@ 1830 other - + @@ -3260,7 +3260,7 @@ 8610 other - + @@ -3268,7 +3268,7 @@ 3794 other - + @@ -3276,7 +3276,7 @@ 4380 other - + @@ -3284,7 +3284,7 @@ 3790 other - + @@ -3292,7 +3292,7 @@ 2406 other - + @@ -3300,7 +3300,7 @@ 2407 other - + @@ -3308,7 +3308,7 @@ 2404 other - + @@ -3316,7 +3316,7 @@ 1372 other - + @@ -3324,7 +3324,7 @@ 2402 other - + @@ -3332,7 +3332,7 @@ 2403 other - + @@ -3340,7 +3340,7 @@ 2400 other - + @@ -3348,7 +3348,7 @@ 2401 other - + @@ -3356,7 +3356,7 @@ 4862 other - + @@ -3364,7 +3364,7 @@ 4860 other - + @@ -3372,7 +3372,7 @@ 4230 other - + @@ -3380,7 +3380,7 @@ 2010 other - + @@ -3388,7 +3388,7 @@ 2408 other - + @@ -3396,7 +3396,7 @@ 2409 other - + @@ -3404,7 +3404,7 @@ 3830 other - + @@ -3412,7 +3412,7 @@ 1759 other - + @@ -3420,7 +3420,7 @@ 1701 other - + @@ -3428,7 +3428,7 @@ 8807 other - + @@ -3436,7 +3436,7 @@ 1344 other - + @@ -3444,7 +3444,7 @@ 4595 other - + @@ -3452,7 +3452,7 @@ 4730 other - + @@ -3460,7 +3460,7 @@ 1345 other - + @@ -3468,7 +3468,7 @@ 8330 other - + @@ -3476,7 +3476,7 @@ 1630 payable - + @@ -3484,7 +3484,7 @@ 1950 other - + @@ -3492,7 +3492,7 @@ 1704 other - + @@ -3500,7 +3500,7 @@ 8338 other - + @@ -3508,7 +3508,7 @@ 4679 other - + @@ -3516,7 +3516,7 @@ 0540 other - + @@ -3524,7 +3524,7 @@ 4870 other - + @@ -3532,7 +3532,7 @@ 0530 other - + @@ -3540,7 +3540,7 @@ 4139 other - + @@ -3548,7 +3548,7 @@ 3560 other - + @@ -3556,7 +3556,7 @@ 8520 other - + @@ -3564,7 +3564,7 @@ 2318 other - + @@ -3572,7 +3572,7 @@ 0760 other - + @@ -3580,7 +3580,7 @@ 4130 other - + @@ -3588,7 +3588,7 @@ 0430 other - + @@ -3596,7 +3596,7 @@ 1752 other - + @@ -3604,7 +3604,7 @@ 2316 other - + @@ -3612,7 +3612,7 @@ 1751 other - + @@ -3620,7 +3620,7 @@ 2317 other - + @@ -3628,7 +3628,7 @@ 8970 other - + @@ -3636,7 +3636,7 @@ 4678 other - + @@ -3644,7 +3644,7 @@ 8975 other - + @@ -3652,7 +3652,7 @@ 8977 other - + @@ -3660,7 +3660,7 @@ 4900 other - + @@ -3668,7 +3668,7 @@ 8764 other - + @@ -3676,7 +3676,7 @@ 1481 other - + @@ -3684,7 +3684,7 @@ 1480 receivable - + @@ -3692,7 +3692,7 @@ 1485 other - + @@ -3700,7 +3700,7 @@ 1489 other - + @@ -3708,7 +3708,7 @@ 1488 other - + @@ -3716,7 +3716,7 @@ 0699 other - + @@ -3724,7 +3724,7 @@ 3300 other - + @@ -3732,7 +3732,7 @@ 2309 other - + @@ -3740,7 +3740,7 @@ 1711 other - + @@ -3748,7 +3748,7 @@ 1710 other - + @@ -3756,7 +3756,7 @@ 1717 other - + @@ -3764,7 +3764,7 @@ 0320 other - + @@ -3772,7 +3772,7 @@ 2300 other - + @@ -3780,7 +3780,7 @@ 1719 other - + @@ -3788,7 +3788,7 @@ 1718 other - + @@ -3796,7 +3796,7 @@ 2307 other - + @@ -3804,7 +3804,7 @@ 0990 other - + @@ -3812,7 +3812,7 @@ 1659 other - + @@ -3820,7 +3820,7 @@ 0996 other - + @@ -3828,7 +3828,7 @@ 0997 other - + @@ -3836,7 +3836,7 @@ 1650 payable - + @@ -3844,7 +3844,7 @@ 1651 other - + @@ -3852,7 +3852,7 @@ 0440 other - + @@ -3860,7 +3860,7 @@ 2520 other - + @@ -3868,7 +3868,7 @@ 1655 other - + @@ -3876,7 +3876,7 @@ 2289 other - + @@ -3884,7 +3884,7 @@ 0260 other - + @@ -3892,7 +3892,7 @@ 3660 other - + @@ -3900,7 +3900,7 @@ 3748 other - + @@ -3908,7 +3908,7 @@ 1631 other - + @@ -3916,7 +3916,7 @@ 2280 other - + @@ -3924,7 +3924,7 @@ 2281 other - + @@ -3932,7 +3932,7 @@ 2282 other - + @@ -3940,7 +3940,7 @@ 2283 other - + @@ -3948,7 +3948,7 @@ 2284 other - + @@ -3956,7 +3956,7 @@ 2285 other - + @@ -3964,7 +3964,7 @@ 8200 other - + @@ -3972,7 +3972,7 @@ 2287 other - + @@ -3980,7 +3980,7 @@ 3153 other - + @@ -3988,7 +3988,7 @@ 3152 other - + @@ -3996,7 +3996,7 @@ 3151 other - + @@ -4004,7 +4004,7 @@ 3150 other - + @@ -4012,7 +4012,7 @@ 3155 other - + @@ -4020,7 +4020,7 @@ 3154 other - + @@ -4028,7 +4028,7 @@ 4540 other - + @@ -4036,7 +4036,7 @@ 4976 other - + @@ -4044,7 +4044,7 @@ 2510 other - + @@ -4052,7 +4052,7 @@ 2652 other - + @@ -4060,7 +4060,7 @@ 4970 other - + @@ -4068,7 +4068,7 @@ 0420 other - + @@ -4076,7 +4076,7 @@ 4822 other - + @@ -4084,7 +4084,7 @@ 8729 other - + @@ -4092,7 +4092,7 @@ 0210 other - + @@ -4100,7 +4100,7 @@ 0199 other - + @@ -4108,7 +4108,7 @@ 2149 other - + @@ -4116,7 +4116,7 @@ 0740 other - + @@ -4124,7 +4124,7 @@ 0192 other - + @@ -4132,7 +4132,7 @@ 0661 other - + @@ -4140,7 +4140,7 @@ 0190 other - + @@ -4148,7 +4148,7 @@ 0191 other - + @@ -4156,7 +4156,7 @@ 8725 other - + @@ -4164,7 +4164,7 @@ 8724 other - + @@ -4172,7 +4172,7 @@ 0194 other - + @@ -4180,7 +4180,7 @@ 0195 other - + @@ -4188,7 +4188,7 @@ 1348 other - + @@ -4196,7 +4196,7 @@ 1349 other - + @@ -4204,7 +4204,7 @@ 1220 liquidity - + @@ -4212,7 +4212,7 @@ 1340 other - + @@ -4220,7 +4220,7 @@ 4180 other - + @@ -4228,7 +4228,7 @@ 2714 other - + @@ -4236,7 +4236,7 @@ 2451 other - + @@ -4244,7 +4244,7 @@ 2450 other - + @@ -4252,7 +4252,7 @@ 4948 other - + @@ -4260,7 +4260,7 @@ 8700 other - + @@ -4268,7 +4268,7 @@ 3770 other - + @@ -4276,7 +4276,7 @@ 4980 other - + @@ -4284,7 +4284,7 @@ 1870 other - + @@ -4292,7 +4292,7 @@ 8110 other - + @@ -4300,7 +4300,7 @@ 1879 other - + @@ -4308,7 +4308,7 @@ 4945 other - + @@ -4316,7 +4316,7 @@ 1502 other - + @@ -4324,7 +4324,7 @@ 3200 other - + @@ -4332,7 +4332,7 @@ 4940 other - + @@ -4340,7 +4340,7 @@ 1503 other - + @@ -4348,7 +4348,7 @@ 4826 other - + @@ -4356,7 +4356,7 @@ 4824 other - + @@ -4364,7 +4364,7 @@ 4530 other - + @@ -4372,7 +4372,7 @@ 1645 other - + @@ -4380,7 +4380,7 @@ 4820 other - + @@ -4388,7 +4388,7 @@ 2118 other - + @@ -4396,7 +4396,7 @@ 2119 other - + @@ -4404,7 +4404,7 @@ 1500 other - + @@ -4412,7 +4412,7 @@ 0065 other - + @@ -4420,7 +4420,7 @@ 1506 other - + @@ -4428,7 +4428,7 @@ 1507 other - + @@ -4436,7 +4436,7 @@ 1504 other - + @@ -4444,7 +4444,7 @@ 1505 other - + @@ -4452,7 +4452,7 @@ 2110 other - + @@ -4460,7 +4460,7 @@ 8611 other - + @@ -4468,7 +4468,7 @@ 1508 other - + @@ -4476,7 +4476,7 @@ 2113 other - + @@ -4484,7 +4484,7 @@ 2115 other - + @@ -4492,7 +4492,7 @@ 2116 other - + @@ -4500,7 +4500,7 @@ 8591 other - + @@ -4508,7 +4508,7 @@ 1110 liquidity - + @@ -4516,7 +4516,7 @@ 2620 other - + @@ -4524,7 +4524,7 @@ 2626 other - + @@ -4532,7 +4532,7 @@ 0060 other - + @@ -4540,7 +4540,7 @@ 2625 other - + @@ -4548,7 +4548,7 @@ 8310 other - + @@ -4556,7 +4556,7 @@ 0963 other - + @@ -4564,7 +4564,7 @@ 8575 other - + @@ -4572,7 +4572,7 @@ 8576 other - + @@ -4580,7 +4580,7 @@ 8570 other - + @@ -4588,7 +4588,7 @@ 0966 other - + @@ -4596,7 +4596,7 @@ 0965 other - + @@ -4604,7 +4604,7 @@ 1910 other - + @@ -4612,7 +4612,7 @@ 0969 other - + @@ -4620,7 +4620,7 @@ 8579 other - + @@ -4628,7 +4628,7 @@ 4655 other - + @@ -4636,7 +4636,7 @@ 8595 other - + @@ -4644,7 +4644,7 @@ 1773 other - + @@ -4652,7 +4652,7 @@ 3440 other - + @@ -4660,7 +4660,7 @@ 4985 other - + @@ -4668,7 +4668,7 @@ 4664 other - + @@ -4676,7 +4676,7 @@ 2020 other - + @@ -4684,7 +4684,7 @@ 8590 other - + @@ -4692,7 +4692,7 @@ 2750 other - + @@ -4700,7 +4700,7 @@ 4666 other - + @@ -4708,7 +4708,7 @@ 4650 other - + @@ -4716,7 +4716,7 @@ 2405 other - + @@ -4724,7 +4724,7 @@ 0499 other - + @@ -4732,7 +4732,7 @@ 0498 other - + @@ -4740,7 +4740,7 @@ 0490 other - + @@ -4748,7 +4748,7 @@ 3746 other - + @@ -4756,7 +4756,7 @@ 4590 other - + @@ -4764,7 +4764,7 @@ 4760 other - + @@ -4772,7 +4772,7 @@ 4910 other - + @@ -4780,7 +4780,7 @@ 0799 other - + @@ -4788,7 +4788,7 @@ 1970 other - + @@ -4796,7 +4796,7 @@ 4199 other - + @@ -4804,7 +4804,7 @@ 0400 other - + @@ -4812,7 +4812,7 @@ 4165 other - + @@ -4820,7 +4820,7 @@ 4160 other - + @@ -4828,7 +4828,7 @@ 1960 other - + @@ -4836,7 +4836,7 @@ 1470 receivable - + @@ -4844,7 +4844,7 @@ 1610 payable - + @@ -4852,7 +4852,7 @@ 4168 other - + @@ -4860,7 +4860,7 @@ 3970 other - + @@ -4868,7 +4868,7 @@ 8925 other - + @@ -4876,7 +4876,7 @@ 1471 other - + @@ -4884,7 +4884,7 @@ 4152 other - + @@ -4892,7 +4892,7 @@ 8921 other - + @@ -4900,7 +4900,7 @@ 8920 other - + @@ -4908,7 +4908,7 @@ 8929 other - + @@ -4916,7 +4916,7 @@ 8760 other - + @@ -4924,7 +4924,7 @@ 8648 other - + @@ -4932,7 +4932,7 @@ 8140 other - + @@ -4940,7 +4940,7 @@ 0380 other - + @@ -4948,7 +4948,7 @@ 0220 other - + @@ -4956,7 +4956,7 @@ 8915 other - + @@ -4964,7 +4964,7 @@ 8818 other - + @@ -4972,7 +4972,7 @@ 7100 other - + @@ -4980,7 +4980,7 @@ 4128 other - + @@ -4988,7 +4988,7 @@ 1558 other - + @@ -4996,7 +4996,7 @@ 1501 other - + @@ -5004,7 +5004,7 @@ 1478 other - + @@ -5012,7 +5012,7 @@ 8574 other - + @@ -5020,7 +5020,7 @@ 1570 other - + @@ -5028,7 +5028,7 @@ 4710 other - + @@ -5036,7 +5036,7 @@ 3745 other - + @@ -5044,7 +5044,7 @@ 8769 other - + @@ -5052,7 +5052,7 @@ 1680 other - + @@ -5060,7 +5060,7 @@ 1768 other - + @@ -5068,7 +5068,7 @@ 1769 other - + @@ -5076,7 +5076,7 @@ 8640 other - + @@ -5084,7 +5084,7 @@ 1762 other - + @@ -5092,7 +5092,7 @@ 1763 other - + @@ -5100,7 +5100,7 @@ 1760 other - + @@ -5108,7 +5108,7 @@ 0700 other - + @@ -5116,7 +5116,7 @@ 1766 other - + @@ -5124,7 +5124,7 @@ 1767 other - + @@ -5132,7 +5132,7 @@ 1764 other - + @@ -5140,7 +5140,7 @@ 1765 other - + @@ -5148,7 +5148,7 @@ 4301 other - + @@ -5156,7 +5156,7 @@ 4289 other - + @@ -5164,7 +5164,7 @@ 0039 other - + @@ -5172,7 +5172,7 @@ 0038 other - + @@ -5180,7 +5180,7 @@ 2713 other - + @@ -5188,7 +5188,7 @@ 0035 other - + @@ -5196,7 +5196,7 @@ 8625 other - + @@ -5204,7 +5204,7 @@ 0030 other - + @@ -5212,7 +5212,7 @@ 8150 other - + @@ -5220,7 +5220,7 @@ 4570 other - + @@ -5228,7 +5228,7 @@ 2711 other - + @@ -5236,7 +5236,7 @@ 8808 other - + @@ -5244,7 +5244,7 @@ 1300 other - + @@ -5252,7 +5252,7 @@ 8780 other - + @@ -5260,7 +5260,7 @@ 3552 other - + @@ -5268,7 +5268,7 @@ 4909 other - + @@ -5276,7 +5276,7 @@ 1547 other - + @@ -5284,7 +5284,7 @@ 1545 other - + @@ -5292,7 +5292,7 @@ 1542 other - + @@ -5300,7 +5300,7 @@ 1543 other - + @@ -5308,7 +5308,7 @@ 1540 other - + @@ -5316,7 +5316,7 @@ 0755 other - + @@ -5324,7 +5324,7 @@ 4676 other - + @@ -5332,7 +5332,7 @@ 3120 other - + @@ -5340,7 +5340,7 @@ 4674 other - + @@ -5348,7 +5348,7 @@ 4673 other - + @@ -5356,7 +5356,7 @@ 4672 other - + @@ -5364,7 +5364,7 @@ 1548 other - + @@ -5372,7 +5372,7 @@ 1549 other - + @@ -5380,7 +5380,7 @@ 8710 other - + @@ -5388,7 +5388,7 @@ 0140 other - + @@ -5396,7 +5396,7 @@ 0145 other - + @@ -5404,7 +5404,7 @@ 0631 other - + @@ -5412,7 +5412,7 @@ 0146 other - + @@ -5420,7 +5420,7 @@ 0149 other - + @@ -5428,7 +5428,7 @@ 0148 other - + @@ -5436,7 +5436,7 @@ 1461 other - + @@ -5444,7 +5444,7 @@ 1460 other - + @@ -5452,7 +5452,7 @@ 1315 other - + @@ -5460,7 +5460,7 @@ 2709 other - + @@ -5468,7 +5468,7 @@ 1312 other - + @@ -5476,7 +5476,7 @@ 1311 other - + @@ -5484,7 +5484,7 @@ 1310 other - + @@ -5492,7 +5492,7 @@ 2705 other - + @@ -5500,7 +5500,7 @@ 2707 other - + @@ -5508,7 +5508,7 @@ 2700 other - + @@ -5516,7 +5516,7 @@ 4886 other - + @@ -5524,7 +5524,7 @@ 4887 other - + @@ -5532,7 +5532,7 @@ 2389 other - + @@ -5540,7 +5540,7 @@ 1020 liquidity - + @@ -5548,7 +5548,7 @@ 4875 other - + @@ -5556,7 +5556,7 @@ 4874 other - + @@ -5564,7 +5564,7 @@ 2649 other - + @@ -5572,7 +5572,7 @@ 0616 other - + @@ -5580,7 +5580,7 @@ 4871 other - + @@ -5588,7 +5588,7 @@ 0640 other - + @@ -5596,7 +5596,7 @@ 3400 other - + @@ -5604,7 +5604,7 @@ 4872 other - + @@ -5612,7 +5612,7 @@ 4879 other - + @@ -5620,7 +5620,7 @@ 1820 other - + @@ -5628,7 +5628,7 @@ 2140 other - + @@ -5636,7 +5636,7 @@ 2792 other - + @@ -5644,7 +5644,7 @@ 4975 other - + @@ -5652,7 +5652,7 @@ 2790 other - + @@ -5660,7 +5660,7 @@ 8731 other - + @@ -5668,7 +5668,7 @@ 1380 other - + @@ -5676,7 +5676,7 @@ 2794 other - + @@ -5684,7 +5684,7 @@ 8980 other - + @@ -5692,7 +5692,7 @@ 8516 other - + @@ -5700,7 +5700,7 @@ 4700 other - + @@ -5708,7 +5708,7 @@ 4668 other - + @@ -5716,7 +5716,7 @@ 1920 other - + @@ -5724,7 +5724,7 @@ 8515 other - + @@ -5732,7 +5732,7 @@ 8320 other - + @@ -5740,7 +5740,7 @@ 4280 other - + @@ -5748,7 +5748,7 @@ 0520 other - + @@ -5756,7 +5756,7 @@ 8609 other - + @@ -5764,7 +5764,7 @@ 8510 other - + @@ -5772,7 +5772,7 @@ 0525 other - + @@ -5780,7 +5780,7 @@ 0910 other - + @@ -5788,7 +5788,7 @@ 4120 other - + @@ -5796,7 +5796,7 @@ 4127 other - + @@ -5804,7 +5804,7 @@ 4126 other - + @@ -5812,7 +5812,7 @@ 4125 other - + @@ -5820,7 +5820,7 @@ 4124 other - + @@ -5828,7 +5828,7 @@ 2666 other - + @@ -5836,7 +5836,7 @@ 2660 other - + @@ -5844,7 +5844,7 @@ 0159 other - + @@ -5852,7 +5852,7 @@ 0880 other - + @@ -5860,7 +5860,7 @@ 8960 other - + @@ -5868,7 +5868,7 @@ 1775 other - + @@ -5876,7 +5876,7 @@ 4882 other - + @@ -5884,7 +5884,7 @@ 1776 other - + @@ -5892,7 +5892,7 @@ 8518 other - + @@ -5900,7 +5900,7 @@ 0764 other - + @@ -5908,7 +5908,7 @@ 1771 other - + @@ -5916,7 +5916,7 @@ 1567 other - + @@ -5924,7 +5924,7 @@ 1746 other - + @@ -5932,7 +5932,7 @@ 1770 other - + @@ -5940,7 +5940,7 @@ 0299 other - + @@ -5948,7 +5948,7 @@ 1641 other - + @@ -5956,7 +5956,7 @@ 1640 payable - + @@ -5964,7 +5964,7 @@ 4750 other - + @@ -5972,7 +5972,7 @@ 0290 other - + @@ -5980,7 +5980,7 @@ 0731 other - + @@ -5988,7 +5988,7 @@ 1722 other - + @@ -5996,7 +5996,7 @@ 1648 other - + @@ -6004,7 +6004,7 @@ 1720 other - + @@ -6012,7 +6012,7 @@ 1721 other - + @@ -6020,7 +6020,7 @@ 8817 other - + @@ -6028,7 +6028,7 @@ 0595 other - + @@ -6036,7 +6036,7 @@ 0590 other - + @@ -6044,7 +6044,7 @@ 0985 other - + @@ -6052,7 +6052,7 @@ 0984 other - + @@ -6060,7 +6060,7 @@ 0986 other - + @@ -6068,7 +6068,7 @@ 0980 other - + @@ -6076,7 +6076,7 @@ 0983 other - + @@ -6084,7 +6084,7 @@ 0450 other - + @@ -6092,7 +6092,7 @@ 0178 other - + @@ -6100,7 +6100,7 @@ 0179 other - + @@ -6108,7 +6108,7 @@ 8100 other - + @@ -6116,7 +6116,7 @@ 8748 other - + @@ -6124,7 +6124,7 @@ 0170 other - + @@ -6132,7 +6132,7 @@ 3750 other - + @@ -6140,7 +6140,7 @@ 8745 other - + @@ -6148,7 +6148,7 @@ 8743 other - + @@ -6156,7 +6156,7 @@ 0175 other - + @@ -6164,7 +6164,7 @@ 0176 other - + @@ -6172,7 +6172,7 @@ 0177 other - + @@ -6180,7 +6180,7 @@ 4632 other - + @@ -6188,7 +6188,7 @@ 4631 other - + @@ -6196,7 +6196,7 @@ 4630 other - + @@ -6204,7 +6204,7 @@ 4637 other - + @@ -6212,7 +6212,7 @@ 3000 other - + @@ -6220,7 +6220,7 @@ 4635 other - + @@ -6228,7 +6228,7 @@ 4638 other - + @@ -6236,7 +6236,7 @@ 2200 other - + @@ -6244,7 +6244,7 @@ 1371 other - + @@ -6252,7 +6252,7 @@ 1588 other - + @@ -6260,7 +6260,7 @@ 2203 other - + @@ -6268,7 +6268,7 @@ 2204 other - + @@ -6276,7 +6276,7 @@ 0180 other - + @@ -6284,7 +6284,7 @@ 2206 other - + @@ -6292,7 +6292,7 @@ 1370 other - + @@ -6300,7 +6300,7 @@ 2208 other - + @@ -6308,7 +6308,7 @@ 2209 other - + @@ -6316,7 +6316,7 @@ 1580 other - + @@ -6324,7 +6324,7 @@ 1581 other - + @@ -6332,7 +6332,7 @@ 0189 other - + @@ -6340,7 +6340,7 @@ 1587 other - + @@ -6348,7 +6348,7 @@ 1584 other - + @@ -6356,7 +6356,7 @@ 1585 other - + @@ -6364,7 +6364,7 @@ 0770 other - + @@ -6372,7 +6372,7 @@ 0771 other - + @@ -6380,7 +6380,7 @@ 0777 other - + @@ -6388,7 +6388,7 @@ 0774 other - + @@ -6396,7 +6396,7 @@ 2150 other - + @@ -6404,7 +6404,7 @@ 0670 other - + @@ -6412,7 +6412,7 @@ 8105 other - + @@ -6420,7 +6420,7 @@ 0350 other - + @@ -6428,7 +6428,7 @@ 1210 liquidity - + @@ -6436,7 +6436,7 @@ 4270 other - + @@ -6444,7 +6444,7 @@ 0001 other - + @@ -6452,7 +6452,7 @@ 1352 other - + @@ -6460,7 +6460,7 @@ 1350 other - + @@ -6468,7 +6468,7 @@ 1355 other - + @@ -6476,7 +6476,7 @@ 4780 other - + @@ -6484,7 +6484,7 @@ 1860 other - + @@ -6492,7 +6492,7 @@ 4810 other - + @@ -6500,7 +6500,7 @@ 1869 other - + @@ -6508,7 +6508,7 @@ 3725 other - + @@ -6516,7 +6516,7 @@ 3726 other - + @@ -6524,7 +6524,7 @@ 3727 other - + @@ -6532,7 +6532,7 @@ 3720 other - + @@ -6540,7 +6540,7 @@ 3722 other - + @@ -6548,7 +6548,7 @@ 3723 other - + @@ -6556,7 +6556,7 @@ 4930 other - + @@ -6564,7 +6564,7 @@ 4680 other - + @@ -6572,7 +6572,7 @@ 2895 other - + @@ -6580,7 +6580,7 @@ 2894 other - + @@ -6588,7 +6588,7 @@ 4833 other - + @@ -6596,7 +6596,7 @@ 4832 other - + @@ -6604,7 +6604,7 @@ 2891 other - + @@ -6612,7 +6612,7 @@ 2890 other - + @@ -6620,7 +6620,7 @@ 2893 other - + @@ -6628,7 +6628,7 @@ 2892 other - + @@ -6636,7 +6636,7 @@ 8589 other - + @@ -6644,7 +6644,7 @@ 0070 other - + @@ -6652,7 +6652,7 @@ 2109 other - + @@ -6660,7 +6660,7 @@ 2108 other - + @@ -6668,7 +6668,7 @@ 0075 other - + @@ -6676,7 +6676,7 @@ 1451 other - + @@ -6684,7 +6684,7 @@ 1100 liquidity - + @@ -6692,7 +6692,7 @@ 2103 other - + @@ -6700,7 +6700,7 @@ 1517 other - + @@ -6708,7 +6708,7 @@ 2100 other - + @@ -6716,7 +6716,7 @@ 2107 other - + @@ -6724,7 +6724,7 @@ 2106 other - + @@ -6732,7 +6732,7 @@ 2105 other - + @@ -6740,7 +6740,7 @@ 2104 other - + @@ -6748,7 +6748,7 @@ 2734 other - + @@ -6756,7 +6756,7 @@ 2735 other - + @@ -6764,7 +6764,7 @@ 2736 other - + @@ -6772,7 +6772,7 @@ 2730 other - + @@ -6780,7 +6780,7 @@ 2731 other - + @@ -6788,7 +6788,7 @@ 2732 other - + @@ -6796,7 +6796,7 @@ 2733 other - + @@ -6804,7 +6804,7 @@ 2738 other - + @@ -6812,7 +6812,7 @@ 2739 other - + @@ -6820,7 +6820,7 @@ 0767 other - + @@ -6828,7 +6828,7 @@ 0956 other - + @@ -6836,7 +6836,7 @@ 0957 other - + @@ -6844,7 +6844,7 @@ 0955 other - + @@ -6852,7 +6852,7 @@ 0950 other - + @@ -6860,7 +6860,7 @@ 4993 other - + @@ -6868,7 +6868,7 @@ 1810 other - + @@ -6876,7 +6876,7 @@ 3430 other - + @@ -6884,7 +6884,7 @@ 3435 other - + @@ -6892,7 +6892,7 @@ 2740 other - + @@ -6900,7 +6900,7 @@ 2743 other - + @@ -6908,7 +6908,7 @@ 2742 other - + @@ -6916,7 +6916,7 @@ 2744 other - + @@ -6924,7 +6924,7 @@ 2747 other - + @@ -6932,7 +6932,7 @@ 2746 other - + @@ -6940,7 +6940,7 @@ 4840 other - + @@ -6948,7 +6948,7 @@ 4841 other - + @@ -6956,7 +6956,7 @@ 4842 other - + @@ -6964,7 +6964,7 @@ 4843 other - + @@ -6972,7 +6972,7 @@ 4167 other - + @@ -6980,7 +6980,7 @@ 4100 other - + @@ -6988,7 +6988,7 @@ 8315 other - + @@ -6996,7 +6996,7 @@ 0781 other - + @@ -7004,7 +7004,7 @@ 0780 other - + @@ -7012,7 +7012,7 @@ 0787 other - + @@ -7020,7 +7020,7 @@ 0784 other - + @@ -7028,7 +7028,7 @@ 4790 other - + @@ -7036,7 +7036,7 @@ 1609 other - + @@ -7044,7 +7044,7 @@ 4150 other - + @@ -7052,7 +7052,7 @@ 0410 other - + @@ -7060,7 +7060,7 @@ 3540 other - + @@ -7068,7 +7068,7 @@ 4925 other - + @@ -7076,7 +7076,7 @@ 4155 other - + @@ -7084,7 +7084,7 @@ 1601 payable - + @@ -7092,7 +7092,7 @@ 1600 payable - + @@ -7100,7 +7100,7 @@ 8720 other - + @@ -7108,7 +7108,7 @@ 1605 payable - + @@ -7116,7 +7116,7 @@ 1607 payable - + @@ -7124,7 +7124,7 @@ 1606 payable - + @@ -7132,7 +7132,7 @@ 8950 other - + @@ -7140,7 +7140,7 @@ 8910 other - + @@ -7148,7 +7148,7 @@ 8819 other - + @@ -7156,7 +7156,7 @@ 1574 other - + @@ -7164,7 +7164,7 @@ 8853 other - + @@ -7172,7 +7172,7 @@ 8852 other - + @@ -7180,7 +7180,7 @@ 0550 other - + @@ -7188,7 +7188,7 @@ 4955 other - + @@ -7196,7 +7196,7 @@ 3980 other - + @@ -7204,7 +7204,7 @@ 8337 other - + @@ -7212,7 +7212,7 @@ 1788 other - + @@ -7220,7 +7220,7 @@ 1789 other - + @@ -7228,7 +7228,7 @@ 1780 other - + @@ -7236,7 +7236,7 @@ 1781 other - + @@ -7244,7 +7244,7 @@ 1782 other - + @@ -7252,7 +7252,7 @@ 1783 other - + @@ -7260,7 +7260,7 @@ 1784 other - + @@ -7268,7 +7268,7 @@ 1785 other - + @@ -7276,7 +7276,7 @@ 1786 other - + @@ -7284,7 +7284,7 @@ 1787 other - + @@ -7292,7 +7292,7 @@ 7110 other - + @@ -7300,7 +7300,7 @@ 4169 other - + @@ -7308,7 +7308,7 @@ 4288 other - + @@ -7316,7 +7316,7 @@ 4290 other - + @@ -7324,7 +7324,7 @@ 2323 other - + @@ -7332,7 +7332,7 @@ 1774 other - + @@ -7340,7 +7340,7 @@ 1777 other - + @@ -7348,7 +7348,7 @@ 2320 other - + @@ -7356,7 +7356,7 @@ 2327 other - + @@ -7364,7 +7364,7 @@ 2326 other - + @@ -7372,7 +7372,7 @@ 2325 other - + @@ -7380,7 +7380,7 @@ 1772 other - + @@ -7388,7 +7388,7 @@ 8930 other - + @@ -7396,7 +7396,7 @@ 7050 other - + @@ -7404,7 +7404,7 @@ 2328 other - + @@ -7412,7 +7412,7 @@ 1779 other - + @@ -7420,7 +7420,7 @@ 1778 other - + @@ -7428,7 +7428,7 @@ 4140 other - + @@ -7436,7 +7436,7 @@ 8924 other - + @@ -7444,7 +7444,7 @@ 8746 other - + @@ -7452,7 +7452,7 @@ 8931 other - + @@ -7460,7 +7460,7 @@ 0300 other - + @@ -7468,7 +7468,7 @@ 3760 other - + @@ -7476,7 +7476,7 @@ 4138 other - + @@ -7484,7 +7484,7 @@ 3764 other - + @@ -7492,7 +7492,7 @@ 0120 other - + @@ -7500,7 +7500,7 @@ 0040 other - + @@ -7508,7 +7508,7 @@ 3769 other - + @@ -7516,7 +7516,7 @@ 8829 other - + @@ -7524,7 +7524,7 @@ 0129 other - + @@ -7532,7 +7532,7 @@ 8630 other - + @@ -7540,7 +7540,7 @@ 3135 other - + @@ -7548,7 +7548,7 @@ 4560 other - + @@ -7556,7 +7556,7 @@ 3130 other - + @@ -7564,7 +7564,7 @@ 1561 other - + @@ -7572,7 +7572,7 @@ 8801 other - + @@ -7580,7 +7580,7 @@ 1290 other - + @@ -7588,7 +7588,7 @@ 0535 other - + @@ -7596,7 +7596,7 @@ 1551 other - + @@ -7604,7 +7604,7 @@ 1550 other - + @@ -7612,7 +7612,7 @@ 1555 other - + @@ -7620,7 +7620,7 @@ 8932 other - + @@ -7628,7 +7628,7 @@ 1557 other - + @@ -7636,7 +7636,7 @@ 1556 other - + @@ -7644,7 +7644,7 @@ 1559 other - + @@ -7652,7 +7652,7 @@ 2490 other - + @@ -7660,7 +7660,7 @@ 2493 other - + @@ -7668,7 +7668,7 @@ 2492 other - + @@ -7676,7 +7676,7 @@ 2494 other - + @@ -7684,7 +7684,7 @@ 2990 other - + @@ -7692,7 +7692,7 @@ 0600 other - + @@ -7700,7 +7700,7 @@ 0601 other - + @@ -7708,7 +7708,7 @@ 2501 other - + @@ -7716,7 +7716,7 @@ 2390 other - + @@ -7724,7 +7724,7 @@ 0605 other - + @@ -7732,7 +7732,7 @@ 1410 receivable - + @@ -7740,7 +7740,7 @@ 2255 other - + @@ -7748,7 +7748,7 @@ 1295 other - + @@ -7756,7 +7756,7 @@ 4640 other - + @@ -7764,7 +7764,7 @@ 2250 other - + @@ -7772,7 +7772,7 @@ 1322 other - + @@ -7780,7 +7780,7 @@ 1320 other - + @@ -7788,7 +7788,7 @@ 1321 other - + @@ -7796,7 +7796,7 @@ 1327 other - + @@ -7804,7 +7804,7 @@ 1325 other - + @@ -7812,7 +7812,7 @@ 1329 other - + @@ -7820,7 +7820,7 @@ 4852 other - + @@ -7828,7 +7828,7 @@ 8519 other - + @@ -7836,7 +7836,7 @@ 4670 other - + @@ -7844,7 +7844,7 @@ 0870 other - + @@ -7852,7 +7852,7 @@ 8135 other - + @@ -7860,7 +7860,7 @@ 4200 other - + @@ -7868,7 +7868,7 @@ 0920 other - + @@ -7876,7 +7876,7 @@ 8130 other - + @@ -7884,7 +7884,7 @@ 4800 other - + @@ -7892,7 +7892,7 @@ 1568 other - + @@ -7900,7 +7900,7 @@ 4636 other - + @@ -7908,7 +7908,7 @@ 4805 other - + @@ -7916,7 +7916,7 @@ 4806 other - + @@ -7924,7 +7924,7 @@ 4876 other - + @@ -7932,7 +7932,7 @@ 1850 other - + @@ -7940,7 +7940,7 @@ 4809 other - + @@ -7948,7 +7948,7 @@ 4949 other - + @@ -7956,7 +7956,7 @@ 1525 other - + @@ -7964,7 +7964,7 @@ 1526 other - + @@ -7972,7 +7972,7 @@ 1527 other - + @@ -7980,7 +7980,7 @@ 2176 other - + @@ -7988,7 +7988,7 @@ 1521 other - + @@ -7996,7 +7996,7 @@ 1250 liquidity - + @@ -8004,7 +8004,7 @@ 4965 other - + @@ -8012,7 +8012,7 @@ 0761 other - + @@ -8020,7 +8020,7 @@ 1528 other - + @@ -8028,7 +8028,7 @@ 1529 other - + @@ -8036,7 +8036,7 @@ 4961 other - + @@ -8044,7 +8044,7 @@ 1390 other - + @@ -8052,7 +8052,7 @@ 2600 other - + @@ -8060,7 +8060,7 @@ 8705 other - + @@ -8068,7 +8068,7 @@ 2375 other - + @@ -8076,7 +8076,7 @@ 1930 other - + @@ -8084,7 +8084,7 @@ 0900 other - + @@ -8092,7 +8092,7 @@ 4110 other - + @@ -8100,7 +8100,7 @@ 8945 other - + @@ -8108,7 +8108,7 @@ 4873 other - + @@ -8116,7 +8116,7 @@ 2205 other - + @@ -8124,7 +8124,7 @@ 4890 other - + @@ -8132,7 +8132,7 @@ 7080 other - + @@ -8140,7 +8140,7 @@ 7090 other - + @@ -8148,7 +8148,7 @@ 0518 other - + @@ -8156,7 +8156,7 @@ 0519 other - + @@ -8164,7 +8164,7 @@ 0516 other - + @@ -8172,7 +8172,7 @@ 0517 other - + @@ -8180,7 +8180,7 @@ 3505 other - + @@ -8188,7 +8188,7 @@ 0510 other - + @@ -8196,7 +8196,7 @@ 1582 other - + @@ -8204,7 +8204,7 @@ 1583 other - + @@ -8212,7 +8212,7 @@ 2679 other - + @@ -8220,7 +8220,7 @@ 0999 other - + @@ -8228,7 +8228,7 @@ 4998 other - + @@ -8236,7 +8236,7 @@ 8918 other - + @@ -8244,7 +8244,7 @@ 4663 other - + @@ -8252,7 +8252,7 @@ 8614 other - + @@ -8260,7 +8260,7 @@ 1739 other - + @@ -8268,7 +8268,7 @@ 1738 other - + @@ -8276,7 +8276,7 @@ 1635 other - + @@ -8284,7 +8284,7 @@ 1980 other - + @@ -8292,7 +8292,7 @@ 4999 other - + @@ -8300,7 +8300,7 @@ 1638 other - + @@ -8308,7 +8308,7 @@ 1730 other - + @@ -8316,7 +8316,7 @@ 1733 other - + @@ -8324,7 +8324,7 @@ 1732 other - + @@ -8332,7 +8332,7 @@ 1735 other - + @@ -8340,7 +8340,7 @@ 1734 other - + @@ -8348,7 +8348,7 @@ 1737 other - + @@ -8356,7 +8356,7 @@ 1736 other - + @@ -8364,7 +8364,7 @@ 0580 other - + @@ -8372,7 +8372,7 @@ 8820 other - + @@ -8380,7 +8380,7 @@ 8827 other - + @@ -8388,7 +8388,7 @@ 0460 other - + @@ -8396,7 +8396,7 @@ 1195 liquidity - + @@ -8404,7 +8404,7 @@ 1446 receivable - + @@ -8412,7 +8412,7 @@ 0240 other - + @@ -8420,7 +8420,7 @@ 3600 other - + @@ -8428,7 +8428,7 @@ 8770 other - + @@ -8436,7 +8436,7 @@ 0160 other - + @@ -8444,7 +8444,7 @@ 0165 other - + @@ -8452,7 +8452,7 @@ 1595 other - + @@ -8460,7 +8460,7 @@ 1594 other - + @@ -8468,7 +8468,7 @@ 1597 other - + @@ -8476,7 +8476,7 @@ 1596 other - + @@ -8484,7 +8484,7 @@ 1590 other - + @@ -8492,7 +8492,7 @@ 1593 other - + @@ -8500,7 +8500,7 @@ 1592 other - + @@ -8508,7 +8508,7 @@ 1599 other - + @@ -8516,7 +8516,7 @@ 1598 other - + @@ -8524,7 +8524,7 @@ 4600 other - + @@ -8532,7 +8532,7 @@ 2213 other - + @@ -8540,7 +8540,7 @@ 2212 other - + @@ -8548,7 +8548,7 @@ 2210 other - + @@ -8556,7 +8556,7 @@ 4865 other - + @@ -8564,7 +8564,7 @@ 2216 other - + @@ -8572,7 +8572,7 @@ 2215 other - + @@ -8580,7 +8580,7 @@ 2214 other - + @@ -8588,7 +8588,7 @@ 2219 other - + @@ -8596,7 +8596,7 @@ 2218 other - + @@ -8604,7 +8604,7 @@ 8735 other - + @@ -8612,7 +8612,7 @@ 1748 other - + @@ -8620,7 +8620,7 @@ 1749 other - + @@ -8628,7 +8628,7 @@ 1744 other - + @@ -8636,7 +8636,7 @@ 1745 other - + @@ -8644,7 +8644,7 @@ 2350 other - + @@ -8652,7 +8652,7 @@ 1747 other - + @@ -8660,7 +8660,7 @@ 1740 other - + @@ -8668,7 +8668,7 @@ 1741 other - + @@ -8676,7 +8676,7 @@ 1742 other - + @@ -8684,7 +8684,7 @@ 1743 other - + @@ -8692,7 +8692,7 @@ 0015 other - + @@ -8700,7 +8700,7 @@ 4366 other - + @@ -8708,7 +8708,7 @@ 4360 other - + @@ -8716,7 +8716,7 @@ 0010 other - + @@ -8724,7 +8724,7 @@ 2430 other - + @@ -8732,7 +8732,7 @@ 1200 liquidity - + @@ -8740,7 +8740,7 @@ 4240 other - + @@ -8748,7 +8748,7 @@ 4396 other - + @@ -8756,7 +8756,7 @@ 3736 other - + @@ -8764,7 +8764,7 @@ 3735 other - + @@ -8772,7 +8772,7 @@ 1890 other - + @@ -8780,7 +8780,7 @@ 3731 other - + @@ -8788,7 +8788,7 @@ 3730 other - + @@ -8796,7 +8796,7 @@ 4920 other - + @@ -8804,7 +8804,7 @@ 2130 other - + @@ -8812,7 +8812,7 @@ 4510 other - + @@ -8820,7 +8820,7 @@ 3100 other - + @@ -8828,7 +8828,7 @@ 4994 other - + @@ -8836,7 +8836,7 @@ 2139 other - + @@ -8844,7 +8844,7 @@ 1447 receivable - + @@ -8852,7 +8852,7 @@ 1569 other - + @@ -8860,7 +8860,7 @@ 1445 other - + @@ -8868,7 +8868,7 @@ 4995 other - + @@ -8876,7 +8876,7 @@ 1658 other - + @@ -8884,7 +8884,7 @@ 1560 other - + @@ -8892,7 +8892,7 @@ 0085 other - + @@ -8900,7 +8900,7 @@ 2505 other - + @@ -8908,7 +8908,7 @@ 1563 other - + @@ -8916,7 +8916,7 @@ 0080 other - + @@ -8924,7 +8924,7 @@ 1565 other - + @@ -8932,7 +8932,7 @@ 1566 other - + @@ -8940,7 +8940,7 @@ 2500 other - + @@ -8948,7 +8948,7 @@ 2726 other - + @@ -8956,7 +8956,7 @@ 2725 other - + @@ -8964,7 +8964,7 @@ 2723 other - + @@ -8972,7 +8972,7 @@ 4990 other - + @@ -8980,7 +8980,7 @@ 0110 other - + @@ -8988,7 +8988,7 @@ 2720 other - + @@ -8996,7 +8996,7 @@ 4991 other - + @@ -9004,7 +9004,7 @@ 2710 other - + @@ -9012,7 +9012,7 @@ 1562 other - + @@ -9020,7 +9020,7 @@ 0949 other - + @@ -9028,7 +9028,7 @@ 0948 other - + @@ -9036,7 +9036,7 @@ 0940 other - + @@ -9044,7 +9044,7 @@ 0943 other - + @@ -9052,7 +9052,7 @@ 8410 other - + @@ -9060,7 +9060,7 @@ 0701 other - + @@ -9068,7 +9068,7 @@ 0947 other - + @@ -9076,7 +9076,7 @@ 1716 other - + @@ -9084,7 +9084,7 @@ 3780 other - + @@ -9092,7 +9092,7 @@ 1761 other - + @@ -9100,7 +9100,7 @@ 1800 other - + @@ -9108,7 +9108,7 @@ 4390 other - + @@ -9116,7 +9116,7 @@ 0310 other - + @@ -9124,7 +9124,7 @@ 8990 other - + @@ -9132,7 +9132,7 @@ 3420 other - + @@ -9140,7 +9140,7 @@ 2170 other - + @@ -9148,7 +9148,7 @@ 3425 other - + @@ -9156,7 +9156,7 @@ 4397 other - + @@ -9164,7 +9164,7 @@ 4996 other - + @@ -9172,7 +9172,7 @@ 4997 other - + @@ -9180,7 +9180,7 @@ 2000 other - + @@ -9188,7 +9188,7 @@ 2001 other - + @@ -9196,7 +9196,7 @@ 4992 other - + @@ -9204,7 +9204,7 @@ 0705 other - + @@ -9212,7 +9212,7 @@ 1360 liquidity - + @@ -9220,7 +9220,7 @@ 2005 other - + @@ -9228,7 +9228,7 @@ 8340 other - + @@ -9236,7 +9236,7 @@ 4855 other - + @@ -9244,7 +9244,7 @@ 4854 other - + @@ -9252,7 +9252,7 @@ 4853 other - + @@ -9260,7 +9260,7 @@ 4580 other - + @@ -9268,7 +9268,7 @@ 4851 other - + @@ -9276,7 +9276,7 @@ 4850 other - + diff --git a/addons/l10n_de/account_chart_skr04.xml b/addons/l10n_de/account_chart_skr04.xml index 09af6c20e28..b3315ce3b50 100644 --- a/addons/l10n_de/account_chart_skr04.xml +++ b/addons/l10n_de/account_chart_skr04.xml @@ -160,7 +160,7 @@ other - + @@ -169,7 +169,7 @@ other - + @@ -186,7 +186,7 @@ other - + @@ -195,7 +195,7 @@ other - + @@ -204,7 +204,7 @@ other - + @@ -213,7 +213,7 @@ other - + @@ -222,7 +222,7 @@ other - + @@ -231,7 +231,7 @@ other - + @@ -240,7 +240,7 @@ other - + @@ -249,7 +249,7 @@ other - + @@ -258,7 +258,7 @@ other - + @@ -267,7 +267,7 @@ other - + @@ -276,7 +276,7 @@ other - + @@ -285,7 +285,7 @@ other - + @@ -294,7 +294,7 @@ other - + @@ -303,7 +303,7 @@ other - + @@ -312,7 +312,7 @@ other - + @@ -321,7 +321,7 @@ other - + @@ -330,7 +330,7 @@ other - + @@ -339,7 +339,7 @@ other - + @@ -348,7 +348,7 @@ other - + @@ -357,7 +357,7 @@ other - + @@ -366,7 +366,7 @@ other - + @@ -375,7 +375,7 @@ other - + @@ -384,7 +384,7 @@ other - + @@ -393,7 +393,7 @@ other - + @@ -402,7 +402,7 @@ other - + @@ -411,7 +411,7 @@ other - + @@ -420,7 +420,7 @@ other - + @@ -429,7 +429,7 @@ other - + @@ -438,7 +438,7 @@ other - + @@ -447,7 +447,7 @@ other - + @@ -456,7 +456,7 @@ other - + @@ -465,7 +465,7 @@ other - + @@ -474,7 +474,7 @@ other - + @@ -483,7 +483,7 @@ other - + @@ -492,7 +492,7 @@ other - + @@ -501,7 +501,7 @@ other - + @@ -510,7 +510,7 @@ other - + @@ -519,7 +519,7 @@ other - + @@ -528,7 +528,7 @@ other - + @@ -537,7 +537,7 @@ other - + @@ -562,7 +562,7 @@ other - + @@ -579,7 +579,7 @@ other - + @@ -604,7 +604,7 @@ view - + @@ -613,7 +613,7 @@ other - + @@ -622,7 +622,7 @@ other - + @@ -631,7 +631,7 @@ other - + @@ -640,7 +640,7 @@ other - + @@ -649,7 +649,7 @@ other - + @@ -666,7 +666,7 @@ other - + @@ -683,7 +683,7 @@ other - + @@ -700,7 +700,7 @@ other - + @@ -709,7 +709,7 @@ other - + @@ -734,7 +734,7 @@ view - + @@ -743,7 +743,7 @@ other - + @@ -752,7 +752,7 @@ other - + @@ -761,7 +761,7 @@ other - + @@ -770,7 +770,7 @@ other - + @@ -779,7 +779,7 @@ other - + @@ -788,7 +788,7 @@ other - + @@ -797,7 +797,7 @@ other - + @@ -806,7 +806,7 @@ other - + @@ -815,7 +815,7 @@ other - + @@ -824,7 +824,7 @@ other - + @@ -833,7 +833,7 @@ other - + @@ -842,7 +842,7 @@ other - + @@ -851,7 +851,7 @@ other - + @@ -860,7 +860,7 @@ other - + @@ -869,7 +869,7 @@ other - + @@ -878,7 +878,7 @@ other - + @@ -887,7 +887,7 @@ other - + @@ -896,7 +896,7 @@ other - + @@ -905,7 +905,7 @@ other - + @@ -914,7 +914,7 @@ other - + @@ -923,7 +923,7 @@ other - + @@ -932,7 +932,7 @@ other - + @@ -941,7 +941,7 @@ other - + @@ -950,7 +950,7 @@ other - + @@ -959,7 +959,7 @@ other - + @@ -968,7 +968,7 @@ other - + @@ -977,7 +977,7 @@ other - + @@ -986,7 +986,7 @@ other - + @@ -995,7 +995,7 @@ other - + @@ -1012,7 +1012,7 @@ view - + @@ -1021,7 +1021,7 @@ other - + @@ -1030,7 +1030,7 @@ other - + @@ -1039,7 +1039,7 @@ other - + @@ -1048,7 +1048,7 @@ other - + @@ -1065,7 +1065,7 @@ view - + @@ -1074,7 +1074,7 @@ other - + @@ -1083,7 +1083,7 @@ other - + @@ -1092,7 +1092,7 @@ other - + @@ -1101,7 +1101,7 @@ other - + @@ -1110,7 +1110,7 @@ other - + @@ -1119,7 +1119,7 @@ other - + @@ -1128,7 +1128,7 @@ other - + @@ -1137,7 +1137,7 @@ other - + @@ -1146,7 +1146,7 @@ other - + @@ -1155,7 +1155,7 @@ other - + @@ -1164,7 +1164,7 @@ other - + @@ -1181,7 +1181,7 @@ view - + @@ -1190,7 +1190,7 @@ other - + @@ -1199,7 +1199,7 @@ other - + @@ -1208,7 +1208,7 @@ other - + @@ -1217,7 +1217,7 @@ other - + @@ -1226,7 +1226,7 @@ other - + @@ -1235,7 +1235,7 @@ other - + @@ -1244,7 +1244,7 @@ other - + @@ -1253,7 +1253,7 @@ other - + @@ -1262,7 +1262,7 @@ other - + @@ -1271,7 +1271,7 @@ other - + @@ -1280,7 +1280,7 @@ other - + @@ -1289,7 +1289,7 @@ other - + @@ -1298,7 +1298,7 @@ other - + @@ -1323,7 +1323,7 @@ other - + @@ -1332,7 +1332,7 @@ other - + @@ -1349,7 +1349,7 @@ other - + @@ -1366,7 +1366,7 @@ view - + @@ -1375,7 +1375,7 @@ other - + @@ -1384,7 +1384,7 @@ other - + @@ -1393,7 +1393,7 @@ other - + @@ -1402,7 +1402,7 @@ other - + @@ -1411,7 +1411,7 @@ other - + @@ -1428,7 +1428,7 @@ other - + @@ -1445,7 +1445,7 @@ view - + @@ -1454,7 +1454,7 @@ other - + @@ -1463,7 +1463,7 @@ other - + @@ -1480,7 +1480,7 @@ view - + @@ -1489,7 +1489,7 @@ other - + @@ -1498,7 +1498,7 @@ other - + @@ -1507,7 +1507,7 @@ other - + @@ -1524,7 +1524,7 @@ other - + @@ -1541,7 +1541,7 @@ other - + @@ -1566,7 +1566,7 @@ other - + @@ -1575,7 +1575,7 @@ other - + @@ -1584,7 +1584,7 @@ other - + @@ -1593,7 +1593,7 @@ other - + @@ -1602,7 +1602,7 @@ other - + @@ -1611,7 +1611,7 @@ other - + @@ -1620,7 +1620,7 @@ other - + @@ -1629,7 +1629,7 @@ other - + @@ -1638,7 +1638,7 @@ other - + @@ -1647,7 +1647,7 @@ other - + @@ -1656,7 +1656,7 @@ other - + @@ -1665,7 +1665,7 @@ other - + @@ -1674,7 +1674,7 @@ other - + @@ -1683,7 +1683,7 @@ other - + @@ -1692,7 +1692,7 @@ other - + @@ -1701,7 +1701,7 @@ other - + @@ -1710,7 +1710,7 @@ other - + @@ -1719,7 +1719,7 @@ other - + @@ -1728,7 +1728,7 @@ other - + @@ -1737,7 +1737,7 @@ other - + @@ -1746,7 +1746,7 @@ other - + @@ -1755,7 +1755,7 @@ other - + @@ -1764,7 +1764,7 @@ other - + @@ -1773,7 +1773,7 @@ other - + @@ -1782,7 +1782,7 @@ other - + @@ -1791,7 +1791,7 @@ other - + @@ -1800,7 +1800,7 @@ other - + @@ -1809,7 +1809,7 @@ other - + @@ -1818,7 +1818,7 @@ other - + @@ -1827,7 +1827,7 @@ other - + @@ -1836,7 +1836,7 @@ other - + @@ -1845,7 +1845,7 @@ other - + @@ -1854,7 +1854,7 @@ other - + @@ -1863,7 +1863,7 @@ other - + @@ -1872,7 +1872,7 @@ other - + @@ -1881,7 +1881,7 @@ other - + @@ -1890,7 +1890,7 @@ other - + @@ -1899,7 +1899,7 @@ other - + @@ -1908,7 +1908,7 @@ other - + @@ -1917,7 +1917,7 @@ other - + @@ -1934,7 +1934,7 @@ other - + @@ -1943,7 +1943,7 @@ other - + @@ -1952,7 +1952,7 @@ other - + @@ -1961,7 +1961,7 @@ other - + @@ -1970,7 +1970,7 @@ other - + @@ -1979,7 +1979,7 @@ other - + @@ -1988,7 +1988,7 @@ other - + @@ -1997,7 +1997,7 @@ other - + @@ -2006,7 +2006,7 @@ other - + @@ -2015,7 +2015,7 @@ other - + @@ -2024,7 +2024,7 @@ other - + @@ -2033,7 +2033,7 @@ other - + @@ -2042,7 +2042,7 @@ other - + @@ -2051,7 +2051,7 @@ other - + @@ -2060,7 +2060,7 @@ other - + @@ -2069,7 +2069,7 @@ other - + @@ -2078,7 +2078,7 @@ other - + @@ -2087,7 +2087,7 @@ other - + @@ -2096,7 +2096,7 @@ other - + @@ -2105,7 +2105,7 @@ other - + @@ -2114,7 +2114,7 @@ other - + @@ -2123,7 +2123,7 @@ other - + @@ -2132,7 +2132,7 @@ other - + @@ -2141,7 +2141,7 @@ other - + @@ -2150,7 +2150,7 @@ other - + @@ -2159,7 +2159,7 @@ other - + @@ -2168,7 +2168,7 @@ other - + @@ -2177,7 +2177,7 @@ other - + @@ -2186,7 +2186,7 @@ other - + @@ -2195,7 +2195,7 @@ other - + @@ -2204,7 +2204,7 @@ other - + @@ -2213,7 +2213,7 @@ other - + @@ -2222,7 +2222,7 @@ other - + @@ -2231,7 +2231,7 @@ other - + @@ -2240,7 +2240,7 @@ other - + @@ -2249,7 +2249,7 @@ other - + @@ -2258,7 +2258,7 @@ other - + @@ -2267,7 +2267,7 @@ other - + @@ -2276,7 +2276,7 @@ other - + @@ -2285,7 +2285,7 @@ other - + @@ -2294,7 +2294,7 @@ other - + @@ -2303,7 +2303,7 @@ other - + @@ -2312,7 +2312,7 @@ other - + @@ -2321,7 +2321,7 @@ other - + @@ -2330,7 +2330,7 @@ other - + @@ -2339,7 +2339,7 @@ other - + @@ -2348,7 +2348,7 @@ other - + @@ -2357,7 +2357,7 @@ other - + @@ -2366,7 +2366,7 @@ other - + @@ -2375,7 +2375,7 @@ other - + @@ -2392,7 +2392,7 @@ other - + @@ -2401,7 +2401,7 @@ other - + @@ -2410,7 +2410,7 @@ other - + @@ -2419,7 +2419,7 @@ other - + @@ -2428,7 +2428,7 @@ other - + @@ -2445,7 +2445,7 @@ other - + @@ -2454,7 +2454,7 @@ other - + @@ -2463,7 +2463,7 @@ other - + @@ -2472,7 +2472,7 @@ other - + @@ -2481,7 +2481,7 @@ other - + @@ -2498,7 +2498,7 @@ other - + @@ -2507,7 +2507,7 @@ other - + @@ -2516,7 +2516,7 @@ other - + @@ -2525,7 +2525,7 @@ other - + @@ -2534,7 +2534,7 @@ other - + @@ -2543,7 +2543,7 @@ other - + @@ -2552,7 +2552,7 @@ other - + @@ -2561,7 +2561,7 @@ other - + @@ -2570,7 +2570,7 @@ other - + @@ -2579,7 +2579,7 @@ other - + @@ -2588,7 +2588,7 @@ other - + @@ -2597,7 +2597,7 @@ other - + @@ -2606,7 +2606,7 @@ other - + @@ -2615,7 +2615,7 @@ other - + @@ -2624,7 +2624,7 @@ other - + @@ -2633,7 +2633,7 @@ other - + @@ -2642,7 +2642,7 @@ other - + @@ -2651,7 +2651,7 @@ other - + @@ -2660,7 +2660,7 @@ other - + @@ -2669,7 +2669,7 @@ other - + @@ -2678,7 +2678,7 @@ other - + @@ -2687,7 +2687,7 @@ other - + @@ -2696,7 +2696,7 @@ other - + @@ -2705,7 +2705,7 @@ other - + @@ -2714,7 +2714,7 @@ other - + @@ -2723,7 +2723,7 @@ other - + @@ -2732,7 +2732,7 @@ other - + @@ -2741,7 +2741,7 @@ other - + @@ -2750,7 +2750,7 @@ other - + @@ -2759,7 +2759,7 @@ other - + @@ -2768,7 +2768,7 @@ other - + @@ -2777,7 +2777,7 @@ other - + @@ -2786,7 +2786,7 @@ other - + @@ -2795,7 +2795,7 @@ other - + @@ -2804,7 +2804,7 @@ other - + @@ -2813,7 +2813,7 @@ other - + @@ -2822,7 +2822,7 @@ other - + @@ -2831,7 +2831,7 @@ other - + @@ -2840,7 +2840,7 @@ other - + @@ -2849,7 +2849,7 @@ other - + @@ -2858,7 +2858,7 @@ other - + @@ -2867,7 +2867,7 @@ other - + @@ -2876,7 +2876,7 @@ other - + @@ -2885,7 +2885,7 @@ other - + @@ -2894,7 +2894,7 @@ other - + @@ -2903,7 +2903,7 @@ other - + @@ -2912,7 +2912,7 @@ other - + @@ -2921,7 +2921,7 @@ other - + @@ -2930,7 +2930,7 @@ other - + @@ -2939,7 +2939,7 @@ other - + @@ -2948,7 +2948,7 @@ other - + @@ -2957,7 +2957,7 @@ other - + @@ -2966,7 +2966,7 @@ other - + @@ -2975,7 +2975,7 @@ other - + @@ -2984,7 +2984,7 @@ other - + @@ -2993,7 +2993,7 @@ other - + @@ -3002,7 +3002,7 @@ other - + @@ -3011,7 +3011,7 @@ other - + @@ -3020,7 +3020,7 @@ other - + @@ -3029,7 +3029,7 @@ other - + @@ -3038,7 +3038,7 @@ other - + @@ -3047,7 +3047,7 @@ other - + @@ -3056,7 +3056,7 @@ other - + @@ -3065,7 +3065,7 @@ other - + @@ -3074,7 +3074,7 @@ other - + @@ -3083,7 +3083,7 @@ other - + @@ -3092,7 +3092,7 @@ other - + @@ -3101,7 +3101,7 @@ other - + @@ -3110,7 +3110,7 @@ other - + @@ -3119,7 +3119,7 @@ other - + @@ -3128,7 +3128,7 @@ other - + @@ -3137,7 +3137,7 @@ other - + @@ -3146,7 +3146,7 @@ other - + @@ -3155,7 +3155,7 @@ other - + @@ -3164,7 +3164,7 @@ other - + @@ -3173,7 +3173,7 @@ other - + @@ -3182,7 +3182,7 @@ other - + @@ -3191,7 +3191,7 @@ other - + @@ -3200,7 +3200,7 @@ other - + @@ -3209,7 +3209,7 @@ other - + @@ -3226,7 +3226,7 @@ view - + @@ -3235,7 +3235,7 @@ other - + @@ -3244,7 +3244,7 @@ other - + @@ -3253,7 +3253,7 @@ other - + @@ -3262,7 +3262,7 @@ other - + @@ -3279,7 +3279,7 @@ other - + @@ -3304,7 +3304,7 @@ view - + @@ -3313,7 +3313,7 @@ receivable - + @@ -3322,7 +3322,7 @@ view - + @@ -3331,7 +3331,7 @@ other - + @@ -3340,7 +3340,7 @@ other - + @@ -3349,7 +3349,7 @@ other - + @@ -3358,7 +3358,7 @@ other - + @@ -3367,7 +3367,7 @@ receivable - + @@ -3376,7 +3376,7 @@ receivable - + @@ -3385,7 +3385,7 @@ receivable - + @@ -3394,7 +3394,7 @@ receivable - + @@ -3403,7 +3403,7 @@ receivable - + @@ -3412,7 +3412,7 @@ receivable - + @@ -3421,7 +3421,7 @@ other - + @@ -3430,7 +3430,7 @@ other - + @@ -3439,7 +3439,7 @@ other - + @@ -3448,7 +3448,7 @@ other - + @@ -3457,7 +3457,7 @@ other - + @@ -3466,7 +3466,7 @@ other - + @@ -3475,7 +3475,7 @@ other - + @@ -3484,7 +3484,7 @@ other - + @@ -3493,7 +3493,7 @@ other - + @@ -3510,7 +3510,7 @@ other - + @@ -3519,7 +3519,7 @@ other - + @@ -3528,7 +3528,7 @@ other - + @@ -3537,7 +3537,7 @@ other - + @@ -3546,7 +3546,7 @@ receivable - + @@ -3555,7 +3555,7 @@ other - + @@ -3564,7 +3564,7 @@ other - + @@ -3573,7 +3573,7 @@ other - + @@ -3590,7 +3590,7 @@ other - + @@ -3607,7 +3607,7 @@ view - + @@ -3616,7 +3616,7 @@ other - + @@ -3625,7 +3625,7 @@ other - + @@ -3634,7 +3634,7 @@ other - + @@ -3643,7 +3643,7 @@ other - + @@ -3652,7 +3652,7 @@ other - + @@ -3661,7 +3661,7 @@ other - + @@ -3670,7 +3670,7 @@ receivable - + @@ -3679,7 +3679,7 @@ other - + @@ -3688,7 +3688,7 @@ other - + @@ -3705,7 +3705,7 @@ other - + @@ -3714,7 +3714,7 @@ other - + @@ -3731,7 +3731,7 @@ view - + @@ -3740,7 +3740,7 @@ other - + @@ -3749,7 +3749,7 @@ other - + @@ -3758,7 +3758,7 @@ other - + @@ -3767,7 +3767,7 @@ other - + @@ -3776,7 +3776,7 @@ other - + @@ -3785,7 +3785,7 @@ other - + @@ -3794,7 +3794,7 @@ receivable - + @@ -3803,7 +3803,7 @@ other - + @@ -3812,7 +3812,7 @@ other - + @@ -3829,7 +3829,7 @@ other - + @@ -3838,7 +3838,7 @@ other - + @@ -3855,7 +3855,7 @@ other - + @@ -3872,7 +3872,7 @@ other - + @@ -3889,7 +3889,7 @@ view - + @@ -3898,7 +3898,7 @@ other - + @@ -3907,7 +3907,7 @@ other - + @@ -3916,7 +3916,7 @@ other - + @@ -3925,7 +3925,7 @@ other - + @@ -3934,7 +3934,7 @@ other - + @@ -3943,7 +3943,7 @@ other - + @@ -3952,7 +3952,7 @@ other - + @@ -3961,7 +3961,7 @@ other - + @@ -3970,7 +3970,7 @@ other - + @@ -3979,7 +3979,7 @@ other - + @@ -3988,7 +3988,7 @@ other - + @@ -3997,7 +3997,7 @@ other - + @@ -4006,7 +4006,7 @@ other - + @@ -4015,7 +4015,7 @@ other - + @@ -4024,7 +4024,7 @@ other - + @@ -4033,7 +4033,7 @@ other - + @@ -4042,7 +4042,7 @@ other - + @@ -4051,7 +4051,7 @@ other - + @@ -4060,7 +4060,7 @@ other - + @@ -4069,7 +4069,7 @@ other - + @@ -4086,7 +4086,7 @@ other - + @@ -4095,7 +4095,7 @@ other - + @@ -4104,7 +4104,7 @@ other - + @@ -4113,7 +4113,7 @@ other - + @@ -4122,7 +4122,7 @@ other - + @@ -4131,7 +4131,7 @@ other - + @@ -4140,7 +4140,7 @@ other - + @@ -4149,7 +4149,7 @@ other - + @@ -4158,7 +4158,7 @@ other - + @@ -4167,7 +4167,7 @@ other - + @@ -4176,7 +4176,7 @@ other - + @@ -4185,7 +4185,7 @@ other - + @@ -4194,7 +4194,7 @@ other - + @@ -4203,7 +4203,7 @@ other - + @@ -4212,7 +4212,7 @@ other - + @@ -4221,7 +4221,7 @@ other - + @@ -4230,7 +4230,7 @@ other - + @@ -4239,7 +4239,7 @@ other - + @@ -4248,7 +4248,7 @@ other - + @@ -4257,7 +4257,7 @@ other - + @@ -4266,7 +4266,7 @@ other - + @@ -4275,7 +4275,7 @@ other - + @@ -4284,7 +4284,7 @@ other - + @@ -4293,7 +4293,7 @@ other - + @@ -4302,7 +4302,7 @@ other - + @@ -4311,7 +4311,7 @@ other - + @@ -4320,7 +4320,7 @@ other - + @@ -4329,7 +4329,7 @@ other - + @@ -4338,7 +4338,7 @@ other - + @@ -4347,7 +4347,7 @@ other - + @@ -4356,7 +4356,7 @@ other - + @@ -4365,7 +4365,7 @@ other - + @@ -4374,7 +4374,7 @@ other - + @@ -4383,7 +4383,7 @@ other - + @@ -4392,7 +4392,7 @@ other - + @@ -4401,7 +4401,7 @@ other - + @@ -4410,7 +4410,7 @@ other - + @@ -4419,7 +4419,7 @@ other - + @@ -4428,7 +4428,7 @@ other - + @@ -4437,7 +4437,7 @@ other - + @@ -4446,7 +4446,7 @@ other - + @@ -4455,7 +4455,7 @@ other - + @@ -4464,7 +4464,7 @@ other - + @@ -4473,7 +4473,7 @@ other - + @@ -4482,7 +4482,7 @@ other - + @@ -4491,7 +4491,7 @@ other - + @@ -4500,7 +4500,7 @@ liquidity - + @@ -4509,7 +4509,7 @@ other - + @@ -4518,7 +4518,7 @@ other - + @@ -4527,7 +4527,7 @@ other - + @@ -4536,7 +4536,7 @@ other - + @@ -4545,7 +4545,7 @@ other - + @@ -4554,7 +4554,7 @@ other - + @@ -4563,7 +4563,7 @@ other - + @@ -4572,7 +4572,7 @@ other - + @@ -4581,7 +4581,7 @@ other - + @@ -4598,7 +4598,7 @@ other - + @@ -4607,7 +4607,7 @@ other - + @@ -4632,7 +4632,7 @@ other - + @@ -4641,7 +4641,7 @@ other - + @@ -4658,7 +4658,7 @@ other - + @@ -4675,7 +4675,7 @@ view - + @@ -4684,7 +4684,7 @@ other - + @@ -4693,7 +4693,7 @@ other - + @@ -4702,7 +4702,7 @@ other - + @@ -4727,7 +4727,7 @@ other - + @@ -4736,7 +4736,7 @@ view - + @@ -4745,7 +4745,7 @@ liquidity - + @@ -4754,7 +4754,7 @@ liquidity - + @@ -4771,7 +4771,7 @@ liquidity - + @@ -4780,7 +4780,7 @@ liquidity - + @@ -4789,7 +4789,7 @@ liquidity - + @@ -4798,7 +4798,7 @@ liquidity - + @@ -4807,7 +4807,7 @@ liquidity - + @@ -4816,7 +4816,7 @@ liquidity - + @@ -4825,7 +4825,7 @@ liquidity - + @@ -4835,7 +4835,7 @@ liquidity - + @@ -4844,7 +4844,7 @@ liquidity - + @@ -4853,7 +4853,7 @@ liquidity - + @@ -4862,7 +4862,7 @@ liquidity - + @@ -4871,7 +4871,7 @@ liquidity - + @@ -4880,7 +4880,7 @@ other - + @@ -4889,7 +4889,7 @@ other - + @@ -4914,7 +4914,7 @@ view - + @@ -4923,7 +4923,7 @@ other - + @@ -4932,7 +4932,7 @@ other - + @@ -4941,7 +4941,7 @@ other - + @@ -4958,7 +4958,7 @@ other - + @@ -4975,7 +4975,7 @@ other - + @@ -4984,7 +4984,7 @@ other - + @@ -4993,7 +4993,7 @@ other - + @@ -5002,7 +5002,7 @@ other - + @@ -5019,7 +5019,7 @@ other - + @@ -5028,7 +5028,7 @@ other - + @@ -5037,7 +5037,7 @@ other - + @@ -5046,7 +5046,7 @@ other - + @@ -5063,7 +5063,7 @@ other - + @@ -5072,7 +5072,7 @@ other - + @@ -5081,7 +5081,7 @@ other - + @@ -5090,7 +5090,7 @@ other - + @@ -5099,7 +5099,7 @@ other - + @@ -5108,7 +5108,7 @@ other - + @@ -5117,7 +5117,7 @@ other - + @@ -5126,7 +5126,7 @@ other - + @@ -5135,7 +5135,7 @@ other - + @@ -5144,7 +5144,7 @@ other - + @@ -5153,7 +5153,7 @@ other - + @@ -5162,7 +5162,7 @@ other - + @@ -5179,7 +5179,7 @@ other - + @@ -5188,7 +5188,7 @@ other - + @@ -5197,7 +5197,7 @@ other - + @@ -5206,7 +5206,7 @@ other - + @@ -5215,7 +5215,7 @@ other - + @@ -5224,7 +5224,7 @@ other - + @@ -5233,7 +5233,7 @@ other - + @@ -5242,7 +5242,7 @@ other - + @@ -5251,7 +5251,7 @@ other - + @@ -5260,7 +5260,7 @@ other - + @@ -5285,7 +5285,7 @@ other - + @@ -5302,7 +5302,7 @@ other - + @@ -5327,7 +5327,7 @@ view - + @@ -5336,7 +5336,7 @@ other - + @@ -5345,7 +5345,7 @@ other - + @@ -5354,7 +5354,7 @@ other - + @@ -5363,7 +5363,7 @@ other - + @@ -5372,7 +5372,7 @@ other - + @@ -5397,7 +5397,7 @@ other - + @@ -5414,7 +5414,7 @@ other - + @@ -5431,7 +5431,7 @@ other - + @@ -5448,7 +5448,7 @@ view - + @@ -5457,7 +5457,7 @@ other - + @@ -5482,7 +5482,7 @@ other - + @@ -5491,7 +5491,7 @@ other - + @@ -5508,7 +5508,7 @@ other - + @@ -5533,7 +5533,7 @@ other - + @@ -5542,7 +5542,7 @@ other - + @@ -5551,7 +5551,7 @@ other - + @@ -5560,7 +5560,7 @@ other - + @@ -5569,7 +5569,7 @@ other - + @@ -5586,7 +5586,7 @@ other - + @@ -5595,7 +5595,7 @@ other - + @@ -5604,7 +5604,7 @@ other - + @@ -5613,7 +5613,7 @@ other - + @@ -5622,7 +5622,7 @@ other - + @@ -5631,7 +5631,7 @@ other - + @@ -5640,7 +5640,7 @@ other - + @@ -5649,7 +5649,7 @@ other - + @@ -5658,7 +5658,7 @@ other - + @@ -5667,7 +5667,7 @@ other - + @@ -5676,7 +5676,7 @@ other - + @@ -5685,7 +5685,7 @@ other - + @@ -5694,7 +5694,7 @@ other - + @@ -5703,7 +5703,7 @@ other - + @@ -5720,7 +5720,7 @@ other - + @@ -5745,7 +5745,7 @@ view - + @@ -5754,7 +5754,7 @@ other - + @@ -5763,7 +5763,7 @@ other - + @@ -5780,7 +5780,7 @@ view - + @@ -5789,7 +5789,7 @@ other - + @@ -5798,7 +5798,7 @@ other - + @@ -5807,7 +5807,7 @@ other - + @@ -5824,7 +5824,7 @@ view - + @@ -5833,7 +5833,7 @@ other - + @@ -5842,7 +5842,7 @@ other - + @@ -5851,7 +5851,7 @@ other - + @@ -5860,7 +5860,7 @@ other - + @@ -5869,7 +5869,7 @@ other - + @@ -5878,7 +5878,7 @@ other - + @@ -5887,7 +5887,7 @@ other - + @@ -5896,7 +5896,7 @@ other - + @@ -5905,7 +5905,7 @@ other - + @@ -5914,7 +5914,7 @@ other - + @@ -5939,7 +5939,7 @@ view - + @@ -5948,7 +5948,7 @@ other - + @@ -5957,7 +5957,7 @@ other - + @@ -5966,7 +5966,7 @@ other - + @@ -5975,7 +5975,7 @@ other - + @@ -5984,7 +5984,7 @@ other - + @@ -5993,7 +5993,7 @@ other - + @@ -6002,7 +6002,7 @@ other - + @@ -6019,7 +6019,7 @@ view - + @@ -6028,7 +6028,7 @@ other - + @@ -6037,7 +6037,7 @@ other - + @@ -6046,7 +6046,7 @@ other - + @@ -6055,7 +6055,7 @@ other - + @@ -6064,7 +6064,7 @@ other - + @@ -6073,7 +6073,7 @@ other - + @@ -6082,7 +6082,7 @@ other - + @@ -6091,7 +6091,7 @@ other - + @@ -6108,7 +6108,7 @@ other - + @@ -6125,7 +6125,7 @@ view - + @@ -6134,7 +6134,7 @@ other - + @@ -6143,7 +6143,7 @@ other - + @@ -6152,7 +6152,7 @@ other - + @@ -6161,7 +6161,7 @@ other - + @@ -6170,7 +6170,7 @@ other - + @@ -6179,7 +6179,7 @@ other - + @@ -6188,7 +6188,7 @@ other - + @@ -6205,7 +6205,7 @@ view - + @@ -6214,7 +6214,7 @@ payable - + @@ -6223,7 +6223,7 @@ payable - + @@ -6232,7 +6232,7 @@ payable - + @@ -6241,7 +6241,7 @@ payable - + @@ -6250,7 +6250,7 @@ other - + @@ -6259,7 +6259,7 @@ other - + @@ -6268,7 +6268,7 @@ payable - + @@ -6277,7 +6277,7 @@ other - + @@ -6286,7 +6286,7 @@ other - + @@ -6295,7 +6295,7 @@ other - + @@ -6304,7 +6304,7 @@ payable - + @@ -6313,7 +6313,7 @@ other - + @@ -6322,7 +6322,7 @@ other - + @@ -6331,7 +6331,7 @@ other - + @@ -6348,7 +6348,7 @@ other - + @@ -6365,7 +6365,7 @@ view - + @@ -6374,7 +6374,7 @@ other - + @@ -6383,7 +6383,7 @@ other - + @@ -6392,7 +6392,7 @@ other - + @@ -6409,7 +6409,7 @@ view - + @@ -6418,7 +6418,7 @@ other - + @@ -6427,7 +6427,7 @@ other - + @@ -6436,7 +6436,7 @@ other - + @@ -6445,7 +6445,7 @@ payable - + @@ -6454,7 +6454,7 @@ other - + @@ -6463,7 +6463,7 @@ other - + @@ -6472,7 +6472,7 @@ other - + @@ -6489,7 +6489,7 @@ view - + @@ -6498,7 +6498,7 @@ other - + @@ -6507,7 +6507,7 @@ other - + @@ -6516,7 +6516,7 @@ other - + @@ -6525,7 +6525,7 @@ payable - + @@ -6534,7 +6534,7 @@ other - + @@ -6543,7 +6543,7 @@ other - + @@ -6552,7 +6552,7 @@ other - + @@ -6569,7 +6569,7 @@ view - + @@ -6578,7 +6578,7 @@ other - + @@ -6587,7 +6587,7 @@ other - + @@ -6596,7 +6596,7 @@ other - + @@ -6605,7 +6605,7 @@ other - + @@ -6614,7 +6614,7 @@ other - + @@ -6623,7 +6623,7 @@ other - + @@ -6632,7 +6632,7 @@ other - + @@ -6641,7 +6641,7 @@ other - + @@ -6650,7 +6650,7 @@ other - + @@ -6659,7 +6659,7 @@ other - + @@ -6668,7 +6668,7 @@ other - + @@ -6677,7 +6677,7 @@ other - + @@ -6686,7 +6686,7 @@ other - + @@ -6695,7 +6695,7 @@ other - + @@ -6704,7 +6704,7 @@ other - + @@ -6713,7 +6713,7 @@ other - + @@ -6722,7 +6722,7 @@ other - + @@ -6731,7 +6731,7 @@ other - + @@ -6740,7 +6740,7 @@ other - + @@ -6749,7 +6749,7 @@ other - + @@ -6758,7 +6758,7 @@ other - + @@ -6767,7 +6767,7 @@ other - + @@ -6776,7 +6776,7 @@ other - + @@ -6785,7 +6785,7 @@ other - + @@ -6794,7 +6794,7 @@ other - + @@ -6803,7 +6803,7 @@ other - + @@ -6812,7 +6812,7 @@ other - + @@ -6821,7 +6821,7 @@ other - + @@ -6830,7 +6830,7 @@ other - + @@ -6839,7 +6839,7 @@ other - + @@ -6848,7 +6848,7 @@ other - + @@ -6857,7 +6857,7 @@ other - + @@ -6866,7 +6866,7 @@ other - + @@ -6883,7 +6883,7 @@ other - + @@ -6892,7 +6892,7 @@ other - + @@ -6909,7 +6909,7 @@ other - + @@ -6918,7 +6918,7 @@ other - + @@ -6927,7 +6927,7 @@ other - + @@ -6936,7 +6936,7 @@ other - + @@ -6945,7 +6945,7 @@ other - + @@ -6954,7 +6954,7 @@ other - + @@ -6963,7 +6963,7 @@ other - + @@ -6972,7 +6972,7 @@ other - + @@ -6981,7 +6981,7 @@ other - + @@ -6990,7 +6990,7 @@ other - + @@ -6999,7 +6999,7 @@ other - + @@ -7008,7 +7008,7 @@ other - + @@ -7017,7 +7017,7 @@ other - + @@ -7026,7 +7026,7 @@ other - + @@ -7035,7 +7035,7 @@ other - + @@ -7044,7 +7044,7 @@ other - + @@ -7053,7 +7053,7 @@ other - + @@ -7062,7 +7062,7 @@ other - + @@ -7071,7 +7071,7 @@ other - + @@ -7080,7 +7080,7 @@ other - + @@ -7089,7 +7089,7 @@ view - + @@ -7098,7 +7098,7 @@ other - + @@ -7107,7 +7107,7 @@ other - + @@ -7116,7 +7116,7 @@ other - + @@ -7125,7 +7125,7 @@ other - + @@ -7134,7 +7134,7 @@ other - + @@ -7143,7 +7143,7 @@ other - + @@ -7152,7 +7152,7 @@ other - + @@ -7161,7 +7161,7 @@ other - + @@ -7170,7 +7170,7 @@ other - + @@ -7179,7 +7179,7 @@ other - + @@ -7188,7 +7188,7 @@ other - + @@ -7197,7 +7197,7 @@ other - + @@ -7214,7 +7214,7 @@ other - + @@ -7223,7 +7223,7 @@ other - + @@ -7232,7 +7232,7 @@ other - + @@ -7241,7 +7241,7 @@ other - + @@ -7250,7 +7250,7 @@ other - + @@ -7259,7 +7259,7 @@ other - + @@ -7268,7 +7268,7 @@ other - + @@ -7277,7 +7277,7 @@ other - + @@ -7286,7 +7286,7 @@ other - + @@ -7295,7 +7295,7 @@ other - + @@ -7304,7 +7304,7 @@ other - + @@ -7313,7 +7313,7 @@ other - + @@ -7322,7 +7322,7 @@ other - + @@ -7331,7 +7331,7 @@ other - + @@ -7340,7 +7340,7 @@ other - + @@ -7349,7 +7349,7 @@ other - + @@ -7358,7 +7358,7 @@ other - + @@ -7367,7 +7367,7 @@ other - + @@ -7376,7 +7376,7 @@ other - + @@ -7385,7 +7385,7 @@ other - + @@ -7394,7 +7394,7 @@ other - + @@ -7403,7 +7403,7 @@ other - + @@ -7412,7 +7412,7 @@ other - + @@ -7437,7 +7437,7 @@ other - + @@ -7454,7 +7454,7 @@ other - + @@ -7479,7 +7479,7 @@ other - + @@ -7488,7 +7488,7 @@ other - + @@ -7497,7 +7497,7 @@ other - + @@ -7506,7 +7506,7 @@ other - + @@ -7515,7 +7515,7 @@ other - + @@ -7524,7 +7524,7 @@ other - + @@ -7533,7 +7533,7 @@ other - + @@ -7542,7 +7542,7 @@ other - + @@ -7551,7 +7551,7 @@ other - + @@ -7560,7 +7560,7 @@ other - + @@ -7569,7 +7569,7 @@ other - + @@ -7578,7 +7578,7 @@ other - + @@ -7587,7 +7587,7 @@ other - + @@ -7596,7 +7596,7 @@ other - + @@ -7605,7 +7605,7 @@ other - + @@ -7614,7 +7614,7 @@ other - + @@ -7623,7 +7623,7 @@ other - + @@ -7632,7 +7632,7 @@ other - + @@ -7641,7 +7641,7 @@ other - + @@ -7650,7 +7650,7 @@ other - + @@ -7659,7 +7659,7 @@ other - + @@ -7668,7 +7668,7 @@ other - + @@ -7677,7 +7677,7 @@ other - + @@ -7686,7 +7686,7 @@ other - + @@ -7695,7 +7695,7 @@ other - + @@ -7704,7 +7704,7 @@ other - + @@ -7713,7 +7713,7 @@ other - + @@ -7722,7 +7722,7 @@ other - + @@ -7731,7 +7731,7 @@ other - + @@ -7740,7 +7740,7 @@ other - + @@ -7749,7 +7749,7 @@ other - + @@ -7758,7 +7758,7 @@ other - + @@ -7767,7 +7767,7 @@ other - + @@ -7776,7 +7776,7 @@ other - + @@ -7785,7 +7785,7 @@ other - + @@ -7794,7 +7794,7 @@ other - + @@ -7803,7 +7803,7 @@ other - + @@ -7812,7 +7812,7 @@ other - + @@ -7821,7 +7821,7 @@ other - + @@ -7838,7 +7838,7 @@ other - + @@ -7847,7 +7847,7 @@ other - + @@ -7856,7 +7856,7 @@ other - + @@ -7865,7 +7865,7 @@ other - + @@ -7874,7 +7874,7 @@ other - + @@ -7883,7 +7883,7 @@ other - + @@ -7908,7 +7908,7 @@ other - + @@ -7917,7 +7917,7 @@ other - + @@ -7926,7 +7926,7 @@ other - + @@ -7935,7 +7935,7 @@ other - + @@ -7944,7 +7944,7 @@ other - + @@ -7953,7 +7953,7 @@ other - + @@ -7962,7 +7962,7 @@ other - + @@ -7971,7 +7971,7 @@ other - + @@ -7980,7 +7980,7 @@ other - + @@ -7989,7 +7989,7 @@ other - + @@ -8006,7 +8006,7 @@ other - + @@ -8015,7 +8015,7 @@ other - + @@ -8024,7 +8024,7 @@ other - + @@ -8033,7 +8033,7 @@ other - + @@ -8042,7 +8042,7 @@ other - + @@ -8051,7 +8051,7 @@ other - + @@ -8060,7 +8060,7 @@ other - + @@ -8069,7 +8069,7 @@ other - + @@ -8078,7 +8078,7 @@ other - + @@ -8087,7 +8087,7 @@ other - + @@ -8096,7 +8096,7 @@ other - + @@ -8105,7 +8105,7 @@ other - + @@ -8114,7 +8114,7 @@ other - + @@ -8123,7 +8123,7 @@ other - + @@ -8132,7 +8132,7 @@ other - + @@ -8141,7 +8141,7 @@ other - + @@ -8150,7 +8150,7 @@ other - + @@ -8159,7 +8159,7 @@ other - + @@ -8168,7 +8168,7 @@ other - + @@ -8177,7 +8177,7 @@ other - + @@ -8186,7 +8186,7 @@ other - + @@ -8195,7 +8195,7 @@ other - + @@ -8204,7 +8204,7 @@ other - + @@ -8213,7 +8213,7 @@ other - + @@ -8222,7 +8222,7 @@ other - + @@ -8231,7 +8231,7 @@ other - + @@ -8240,7 +8240,7 @@ other - + @@ -8249,7 +8249,7 @@ other - + @@ -8258,7 +8258,7 @@ other - + @@ -8267,7 +8267,7 @@ other - + @@ -8276,7 +8276,7 @@ other - + @@ -8285,7 +8285,7 @@ other - + @@ -8294,7 +8294,7 @@ other - + @@ -8303,7 +8303,7 @@ other - + @@ -8312,7 +8312,7 @@ other - + @@ -8321,7 +8321,7 @@ other - + @@ -8330,7 +8330,7 @@ other - + @@ -8339,7 +8339,7 @@ other - + @@ -8348,7 +8348,7 @@ other - + @@ -8357,7 +8357,7 @@ other - + @@ -8366,7 +8366,7 @@ other - + @@ -8375,7 +8375,7 @@ other - + @@ -8384,7 +8384,7 @@ other - + @@ -8393,7 +8393,7 @@ other - + @@ -8402,7 +8402,7 @@ other - + @@ -8411,7 +8411,7 @@ other - + @@ -8420,7 +8420,7 @@ other - + @@ -8429,7 +8429,7 @@ other - + @@ -8438,7 +8438,7 @@ other - + @@ -8447,7 +8447,7 @@ other - + @@ -8456,7 +8456,7 @@ other - + @@ -8481,7 +8481,7 @@ other - + @@ -8490,7 +8490,7 @@ other - + @@ -8499,7 +8499,7 @@ other - + @@ -8516,7 +8516,7 @@ other - + @@ -8533,7 +8533,7 @@ other - + @@ -8558,7 +8558,7 @@ other - + @@ -8583,7 +8583,7 @@ other - + @@ -8592,7 +8592,7 @@ other - + @@ -8601,7 +8601,7 @@ other - + @@ -8610,7 +8610,7 @@ other - + @@ -8619,7 +8619,7 @@ other - + @@ -8628,7 +8628,7 @@ other - + @@ -8637,7 +8637,7 @@ other - + @@ -8646,7 +8646,7 @@ other - + @@ -8655,7 +8655,7 @@ other - + @@ -8664,7 +8664,7 @@ other - + @@ -8673,7 +8673,7 @@ other - + @@ -8682,7 +8682,7 @@ other - + @@ -8691,7 +8691,7 @@ other - + @@ -8700,7 +8700,7 @@ other - + @@ -8709,7 +8709,7 @@ other - + @@ -8718,7 +8718,7 @@ other - + @@ -8727,7 +8727,7 @@ other - + @@ -8736,7 +8736,7 @@ other - + @@ -8745,7 +8745,7 @@ other - + @@ -8754,7 +8754,7 @@ other - + @@ -8763,7 +8763,7 @@ other - + @@ -8772,7 +8772,7 @@ other - + @@ -8781,7 +8781,7 @@ other - + @@ -8790,7 +8790,7 @@ other - + @@ -8799,7 +8799,7 @@ other - + @@ -8808,7 +8808,7 @@ other - + @@ -8817,7 +8817,7 @@ other - + @@ -8826,7 +8826,7 @@ other - + @@ -8835,7 +8835,7 @@ other - + @@ -8844,7 +8844,7 @@ other - + @@ -8853,7 +8853,7 @@ other - + @@ -8862,7 +8862,7 @@ other - + @@ -8871,7 +8871,7 @@ other - + @@ -8880,7 +8880,7 @@ other - + @@ -8889,7 +8889,7 @@ other - + @@ -8898,7 +8898,7 @@ other - + @@ -8907,7 +8907,7 @@ other - + @@ -8916,7 +8916,7 @@ other - + @@ -8925,7 +8925,7 @@ other - + @@ -8934,7 +8934,7 @@ other - + @@ -8943,7 +8943,7 @@ other - + @@ -8952,7 +8952,7 @@ other - + @@ -8961,7 +8961,7 @@ other - + @@ -8970,7 +8970,7 @@ other - + @@ -8979,7 +8979,7 @@ other - + @@ -8988,7 +8988,7 @@ other - + @@ -8997,7 +8997,7 @@ other - + @@ -9006,7 +9006,7 @@ other - + @@ -9015,7 +9015,7 @@ other - + @@ -9024,7 +9024,7 @@ other - + @@ -9033,7 +9033,7 @@ other - + @@ -9042,7 +9042,7 @@ other - + @@ -9051,7 +9051,7 @@ other - + @@ -9060,7 +9060,7 @@ other - + @@ -9069,7 +9069,7 @@ other - + @@ -9078,7 +9078,7 @@ other - + @@ -9087,7 +9087,7 @@ other - + @@ -9096,7 +9096,7 @@ other - + @@ -9105,7 +9105,7 @@ other - + @@ -9114,7 +9114,7 @@ other - + @@ -9123,7 +9123,7 @@ other - + @@ -9132,7 +9132,7 @@ other - + @@ -9141,7 +9141,7 @@ other - + @@ -9150,7 +9150,7 @@ other - + @@ -9159,7 +9159,7 @@ other - + @@ -9168,7 +9168,7 @@ other - + @@ -9177,7 +9177,7 @@ other - + @@ -9186,7 +9186,7 @@ other - + @@ -9195,7 +9195,7 @@ other - + @@ -9204,7 +9204,7 @@ other - + @@ -9213,7 +9213,7 @@ other - + @@ -9222,7 +9222,7 @@ other - + @@ -9231,7 +9231,7 @@ other - + @@ -9256,7 +9256,7 @@ other - + @@ -9281,7 +9281,7 @@ other - + @@ -9290,7 +9290,7 @@ other - + @@ -9299,7 +9299,7 @@ other - + @@ -9308,7 +9308,7 @@ other - + @@ -9317,7 +9317,7 @@ other - + @@ -9326,7 +9326,7 @@ other - + @@ -9335,7 +9335,7 @@ other - + @@ -9344,7 +9344,7 @@ other - + @@ -9353,7 +9353,7 @@ other - + @@ -9362,7 +9362,7 @@ other - + @@ -9371,7 +9371,7 @@ other - + @@ -9380,7 +9380,7 @@ other - + @@ -9389,7 +9389,7 @@ other - + @@ -9398,7 +9398,7 @@ other - + @@ -9407,7 +9407,7 @@ other - + @@ -9416,7 +9416,7 @@ other - + @@ -9425,7 +9425,7 @@ other - + @@ -9434,7 +9434,7 @@ other - + @@ -9443,7 +9443,7 @@ other - + @@ -9452,7 +9452,7 @@ other - + @@ -9461,7 +9461,7 @@ other - + @@ -9470,7 +9470,7 @@ other - + @@ -9479,7 +9479,7 @@ other - + @@ -9488,7 +9488,7 @@ other - + @@ -9497,7 +9497,7 @@ other - + @@ -9506,7 +9506,7 @@ other - + @@ -9515,7 +9515,7 @@ other - + @@ -9524,7 +9524,7 @@ other - + @@ -9533,7 +9533,7 @@ other - + @@ -9542,7 +9542,7 @@ other - + @@ -9551,7 +9551,7 @@ other - + @@ -9560,7 +9560,7 @@ other - + @@ -9569,7 +9569,7 @@ other - + @@ -9578,7 +9578,7 @@ other - + @@ -9587,7 +9587,7 @@ other - + @@ -9596,7 +9596,7 @@ other - + @@ -9605,7 +9605,7 @@ other - + @@ -9614,7 +9614,7 @@ other - + @@ -9623,7 +9623,7 @@ other - + @@ -9632,7 +9632,7 @@ other - + @@ -9641,7 +9641,7 @@ other - + @@ -9650,7 +9650,7 @@ other - + @@ -9659,7 +9659,7 @@ other - + @@ -9668,7 +9668,7 @@ other - + @@ -9677,7 +9677,7 @@ other - + @@ -9686,7 +9686,7 @@ other - + @@ -9695,7 +9695,7 @@ other - + @@ -9704,7 +9704,7 @@ other - + @@ -9713,7 +9713,7 @@ other - + @@ -9722,7 +9722,7 @@ other - + @@ -9731,7 +9731,7 @@ other - + @@ -9740,7 +9740,7 @@ other - + @@ -9749,7 +9749,7 @@ other - + @@ -9758,7 +9758,7 @@ other - + @@ -9767,7 +9767,7 @@ other - + @@ -9776,7 +9776,7 @@ other - + @@ -9785,7 +9785,7 @@ other - + @@ -9794,7 +9794,7 @@ other - + @@ -9803,7 +9803,7 @@ other - + @@ -9812,7 +9812,7 @@ other - + @@ -9837,7 +9837,7 @@ other - + @@ -9862,7 +9862,7 @@ other - + @@ -9871,7 +9871,7 @@ other - + @@ -9880,7 +9880,7 @@ other - + @@ -9889,7 +9889,7 @@ other - + @@ -9898,7 +9898,7 @@ other - + @@ -9907,7 +9907,7 @@ other - + @@ -9916,7 +9916,7 @@ other - + @@ -9925,7 +9925,7 @@ other - + @@ -9934,7 +9934,7 @@ other - + @@ -9943,7 +9943,7 @@ other - + @@ -9952,7 +9952,7 @@ other - + @@ -9961,7 +9961,7 @@ other - + @@ -9970,7 +9970,7 @@ other - + @@ -9979,7 +9979,7 @@ other - + @@ -9988,7 +9988,7 @@ other - + @@ -9997,7 +9997,7 @@ other - + @@ -10022,7 +10022,7 @@ other - + @@ -10031,7 +10031,7 @@ other - + @@ -10040,7 +10040,7 @@ other - + @@ -10049,7 +10049,7 @@ other - + @@ -10058,7 +10058,7 @@ other - + @@ -10067,7 +10067,7 @@ other - + @@ -10076,7 +10076,7 @@ other - + @@ -10085,7 +10085,7 @@ other - + @@ -10094,7 +10094,7 @@ other - + @@ -10103,7 +10103,7 @@ other - + @@ -10112,7 +10112,7 @@ other - + @@ -10121,7 +10121,7 @@ other - + @@ -10130,7 +10130,7 @@ other - + @@ -10139,7 +10139,7 @@ other - + @@ -10148,7 +10148,7 @@ other - + @@ -10157,7 +10157,7 @@ other - + @@ -10166,7 +10166,7 @@ other - + @@ -10183,7 +10183,7 @@ view - + @@ -10192,7 +10192,7 @@ other - + @@ -10201,7 +10201,7 @@ other - + @@ -10210,7 +10210,7 @@ other - + @@ -10219,7 +10219,7 @@ other - + @@ -10228,7 +10228,7 @@ other - + @@ -10237,7 +10237,7 @@ other - + @@ -10246,7 +10246,7 @@ other - + @@ -10255,7 +10255,7 @@ other - + @@ -10264,7 +10264,7 @@ other - + @@ -10273,7 +10273,7 @@ other - + @@ -10298,7 +10298,7 @@ other - + @@ -10307,7 +10307,7 @@ other - + @@ -10316,7 +10316,7 @@ other - + @@ -10325,7 +10325,7 @@ other - + @@ -10334,7 +10334,7 @@ other - + @@ -10343,7 +10343,7 @@ other - + @@ -10352,7 +10352,7 @@ other - + @@ -10361,7 +10361,7 @@ other - + @@ -10370,7 +10370,7 @@ other - + @@ -10379,7 +10379,7 @@ other - + @@ -10388,7 +10388,7 @@ other - + @@ -10397,7 +10397,7 @@ other - + @@ -10406,7 +10406,7 @@ other - + @@ -10415,7 +10415,7 @@ other - + @@ -10424,7 +10424,7 @@ other - + @@ -10433,7 +10433,7 @@ other - + @@ -10442,7 +10442,7 @@ other - + @@ -10451,7 +10451,7 @@ other - + @@ -10460,7 +10460,7 @@ other - + @@ -10469,7 +10469,7 @@ other - + @@ -10494,7 +10494,7 @@ other - + @@ -10503,7 +10503,7 @@ other - + @@ -10512,7 +10512,7 @@ other - + @@ -10521,7 +10521,7 @@ other - + @@ -10530,7 +10530,7 @@ other - + @@ -10539,7 +10539,7 @@ other - + @@ -10548,7 +10548,7 @@ other - + @@ -10557,7 +10557,7 @@ other - + @@ -10582,7 +10582,7 @@ other - + @@ -10591,7 +10591,7 @@ other - + @@ -10600,7 +10600,7 @@ other - + @@ -10609,7 +10609,7 @@ other - + @@ -10618,7 +10618,7 @@ other - + @@ -10627,7 +10627,7 @@ other - + @@ -10636,7 +10636,7 @@ other - + @@ -10645,7 +10645,7 @@ other - + @@ -10654,7 +10654,7 @@ other - + @@ -10663,7 +10663,7 @@ other - + @@ -10672,7 +10672,7 @@ other - + @@ -10681,7 +10681,7 @@ other - + @@ -10690,7 +10690,7 @@ other - + @@ -10699,7 +10699,7 @@ other - + @@ -10708,7 +10708,7 @@ other - + @@ -10717,7 +10717,7 @@ other - + @@ -10726,7 +10726,7 @@ other - + @@ -10735,7 +10735,7 @@ other - + @@ -10744,7 +10744,7 @@ other - + @@ -10753,7 +10753,7 @@ other - + @@ -10762,7 +10762,7 @@ other - + @@ -10771,7 +10771,7 @@ other - + @@ -10780,7 +10780,7 @@ other - + @@ -10789,7 +10789,7 @@ other - + @@ -10798,7 +10798,7 @@ other - + @@ -10807,7 +10807,7 @@ other - + @@ -10816,7 +10816,7 @@ other - + @@ -10825,7 +10825,7 @@ other - + @@ -10834,7 +10834,7 @@ other - + @@ -10843,7 +10843,7 @@ other - + @@ -10852,7 +10852,7 @@ other - + @@ -10861,7 +10861,7 @@ other - + @@ -10870,7 +10870,7 @@ other - + @@ -10879,7 +10879,7 @@ other - + @@ -10888,7 +10888,7 @@ other - + @@ -10897,7 +10897,7 @@ other - + @@ -10906,7 +10906,7 @@ other - + @@ -10915,7 +10915,7 @@ other - + @@ -10924,7 +10924,7 @@ other - + @@ -10933,7 +10933,7 @@ other - + @@ -10942,7 +10942,7 @@ other - + @@ -10951,7 +10951,7 @@ other - + @@ -10960,7 +10960,7 @@ other - + @@ -10969,7 +10969,7 @@ other - + @@ -10978,7 +10978,7 @@ other - + @@ -10987,7 +10987,7 @@ other - + @@ -10996,7 +10996,7 @@ other - + @@ -11005,7 +11005,7 @@ other - + @@ -11014,7 +11014,7 @@ other - + @@ -11023,7 +11023,7 @@ other - + @@ -11032,7 +11032,7 @@ other - + @@ -11041,7 +11041,7 @@ other - + @@ -11050,7 +11050,7 @@ other - + @@ -11059,7 +11059,7 @@ other - + @@ -11068,7 +11068,7 @@ other - + @@ -11077,7 +11077,7 @@ other - + @@ -11086,7 +11086,7 @@ other - + @@ -11095,7 +11095,7 @@ other - + @@ -11104,7 +11104,7 @@ other - + @@ -11113,7 +11113,7 @@ other - + @@ -11122,7 +11122,7 @@ other - + @@ -11131,7 +11131,7 @@ other - + @@ -11140,7 +11140,7 @@ other - + @@ -11149,7 +11149,7 @@ other - + @@ -11158,7 +11158,7 @@ other - + @@ -11167,7 +11167,7 @@ other - + @@ -11176,7 +11176,7 @@ other - + @@ -11185,7 +11185,7 @@ other - + @@ -11194,7 +11194,7 @@ other - + @@ -11203,7 +11203,7 @@ other - + @@ -11212,7 +11212,7 @@ other - + @@ -11221,7 +11221,7 @@ other - + @@ -11230,7 +11230,7 @@ other - + @@ -11239,7 +11239,7 @@ other - + @@ -11248,7 +11248,7 @@ other - + @@ -11257,7 +11257,7 @@ other - + @@ -11266,7 +11266,7 @@ other - + @@ -11275,7 +11275,7 @@ other - + @@ -11284,7 +11284,7 @@ other - + @@ -11293,7 +11293,7 @@ other - + @@ -11302,7 +11302,7 @@ other - + @@ -11311,7 +11311,7 @@ other - + @@ -11320,7 +11320,7 @@ other - + @@ -11329,7 +11329,7 @@ other - + @@ -11338,7 +11338,7 @@ other - + @@ -11347,7 +11347,7 @@ other - + @@ -11356,7 +11356,7 @@ other - + @@ -11365,7 +11365,7 @@ other - + @@ -11374,7 +11374,7 @@ other - + @@ -11383,7 +11383,7 @@ other - + @@ -11392,7 +11392,7 @@ other - + @@ -11401,7 +11401,7 @@ other - + @@ -11410,7 +11410,7 @@ other - + @@ -11419,7 +11419,7 @@ other - + @@ -11428,7 +11428,7 @@ other - + @@ -11437,7 +11437,7 @@ other - + @@ -11446,7 +11446,7 @@ other - + @@ -11455,7 +11455,7 @@ other - + @@ -11464,7 +11464,7 @@ other - + @@ -11473,7 +11473,7 @@ other - + @@ -11482,7 +11482,7 @@ other - + @@ -11491,7 +11491,7 @@ other - + @@ -11500,7 +11500,7 @@ other - + @@ -11509,7 +11509,7 @@ other - + @@ -11518,7 +11518,7 @@ other - + @@ -11527,7 +11527,7 @@ other - + @@ -11536,7 +11536,7 @@ other - + @@ -11545,7 +11545,7 @@ other - + @@ -11554,7 +11554,7 @@ other - + @@ -11563,7 +11563,7 @@ other - + @@ -11572,7 +11572,7 @@ other - + @@ -11581,7 +11581,7 @@ other - + @@ -11590,7 +11590,7 @@ other - + @@ -11599,7 +11599,7 @@ other - + @@ -11608,7 +11608,7 @@ other - + @@ -11617,7 +11617,7 @@ other - + @@ -11626,7 +11626,7 @@ other - + @@ -11635,7 +11635,7 @@ other - + @@ -11644,7 +11644,7 @@ other - + @@ -11653,7 +11653,7 @@ other - + @@ -11662,7 +11662,7 @@ other - + @@ -11671,7 +11671,7 @@ other - + @@ -11680,7 +11680,7 @@ other - + @@ -11689,7 +11689,7 @@ other - + @@ -11698,7 +11698,7 @@ other - + @@ -11707,7 +11707,7 @@ other - + @@ -11716,7 +11716,7 @@ other - + @@ -11725,7 +11725,7 @@ other - + @@ -11734,7 +11734,7 @@ other - + @@ -11743,7 +11743,7 @@ other - + @@ -11752,7 +11752,7 @@ other - + @@ -11761,7 +11761,7 @@ other - + @@ -11770,7 +11770,7 @@ other - + @@ -11779,7 +11779,7 @@ other - + @@ -11788,7 +11788,7 @@ other - + @@ -11797,7 +11797,7 @@ other - + @@ -11806,7 +11806,7 @@ other - + @@ -11815,7 +11815,7 @@ other - + @@ -11824,7 +11824,7 @@ other - + @@ -11833,7 +11833,7 @@ other - + @@ -11842,7 +11842,7 @@ other - + @@ -11851,7 +11851,7 @@ other - + @@ -11860,7 +11860,7 @@ other - + @@ -11869,7 +11869,7 @@ other - + @@ -11878,7 +11878,7 @@ other - + @@ -11887,7 +11887,7 @@ other - + @@ -11896,7 +11896,7 @@ other - + @@ -11905,7 +11905,7 @@ other - + @@ -11914,7 +11914,7 @@ other - + @@ -11923,7 +11923,7 @@ other - + @@ -11932,7 +11932,7 @@ other - + @@ -11941,7 +11941,7 @@ other - + @@ -11950,7 +11950,7 @@ other - + @@ -11959,7 +11959,7 @@ other - + @@ -11968,7 +11968,7 @@ other - + @@ -11977,7 +11977,7 @@ other - + @@ -11986,7 +11986,7 @@ other - + @@ -11995,7 +11995,7 @@ other - + @@ -12004,7 +12004,7 @@ other - + @@ -12013,7 +12013,7 @@ other - + @@ -12038,7 +12038,7 @@ other - + @@ -12047,7 +12047,7 @@ other - + @@ -12056,7 +12056,7 @@ other - + @@ -12065,7 +12065,7 @@ other - + @@ -12074,7 +12074,7 @@ other - + @@ -12083,7 +12083,7 @@ other - + @@ -12092,7 +12092,7 @@ other - + @@ -12101,7 +12101,7 @@ other - + @@ -12110,7 +12110,7 @@ other - + @@ -12119,7 +12119,7 @@ other - + @@ -12128,7 +12128,7 @@ other - + @@ -12137,7 +12137,7 @@ other - + @@ -12162,7 +12162,7 @@ other - + @@ -12171,7 +12171,7 @@ other - + @@ -12180,7 +12180,7 @@ other - + @@ -12189,7 +12189,7 @@ other - + @@ -12214,7 +12214,7 @@ other - + @@ -12223,7 +12223,7 @@ other - + @@ -12232,7 +12232,7 @@ other - + @@ -12241,7 +12241,7 @@ other - + @@ -12250,7 +12250,7 @@ other - + @@ -12259,7 +12259,7 @@ other - + @@ -12284,7 +12284,7 @@ other - + @@ -12293,7 +12293,7 @@ other - + @@ -12302,7 +12302,7 @@ other - + @@ -12311,7 +12311,7 @@ other - + @@ -12336,7 +12336,7 @@ other - + @@ -12345,7 +12345,7 @@ other - + @@ -12354,7 +12354,7 @@ other - + @@ -12363,7 +12363,7 @@ other - + @@ -12372,7 +12372,7 @@ other - + @@ -12381,7 +12381,7 @@ other - + @@ -12390,7 +12390,7 @@ other - + @@ -12399,7 +12399,7 @@ other - + @@ -12408,7 +12408,7 @@ other - + @@ -12417,7 +12417,7 @@ other - + @@ -12426,7 +12426,7 @@ other - + @@ -12435,7 +12435,7 @@ other - + @@ -12444,7 +12444,7 @@ other - + @@ -12469,7 +12469,7 @@ other - + @@ -12486,7 +12486,7 @@ other - + @@ -12495,7 +12495,7 @@ other - + @@ -12520,7 +12520,7 @@ other - + @@ -12529,7 +12529,7 @@ other - + @@ -12538,7 +12538,7 @@ other - + @@ -12547,7 +12547,7 @@ other - + @@ -12556,7 +12556,7 @@ other - + @@ -12565,7 +12565,7 @@ other - + @@ -12574,7 +12574,7 @@ other - + @@ -12583,7 +12583,7 @@ other - + @@ -12608,7 +12608,7 @@ other - + @@ -12617,7 +12617,7 @@ other - + @@ -12626,7 +12626,7 @@ other - + @@ -12635,7 +12635,7 @@ other - + @@ -12644,7 +12644,7 @@ other - + @@ -12653,7 +12653,7 @@ other - + @@ -12662,7 +12662,7 @@ other - + @@ -12671,7 +12671,7 @@ other - + @@ -12680,7 +12680,7 @@ other - + @@ -12689,7 +12689,7 @@ other - + @@ -12698,7 +12698,7 @@ other - + @@ -12707,7 +12707,7 @@ other - + @@ -12716,7 +12716,7 @@ other - + @@ -12725,7 +12725,7 @@ other - + @@ -12734,7 +12734,7 @@ other - + @@ -12743,7 +12743,7 @@ other - + @@ -12752,7 +12752,7 @@ other - + @@ -12761,7 +12761,7 @@ other - + @@ -12770,7 +12770,7 @@ other - + @@ -12779,7 +12779,7 @@ other - + @@ -12788,7 +12788,7 @@ other - + @@ -12797,7 +12797,7 @@ other - + @@ -12822,7 +12822,7 @@ other - + @@ -12839,7 +12839,7 @@ other - + @@ -12848,7 +12848,7 @@ other - + @@ -12857,7 +12857,7 @@ other - + @@ -12882,7 +12882,7 @@ other - + @@ -12891,7 +12891,7 @@ other - + @@ -12900,7 +12900,7 @@ other - + @@ -12925,7 +12925,7 @@ other - + @@ -12934,7 +12934,7 @@ other - + @@ -12943,7 +12943,7 @@ other - + @@ -12968,7 +12968,7 @@ other - + @@ -12977,7 +12977,7 @@ other - + @@ -12986,7 +12986,7 @@ other - + @@ -12995,7 +12995,7 @@ other - + @@ -13004,7 +13004,7 @@ other - + @@ -13013,7 +13013,7 @@ other - + @@ -13022,7 +13022,7 @@ other - + @@ -13031,7 +13031,7 @@ other - + @@ -13040,7 +13040,7 @@ other - + @@ -13049,7 +13049,7 @@ other - + @@ -13058,7 +13058,7 @@ other - + @@ -13067,7 +13067,7 @@ other - + @@ -13076,7 +13076,7 @@ other - + @@ -13085,7 +13085,7 @@ other - + @@ -13094,7 +13094,7 @@ other - + @@ -13103,7 +13103,7 @@ other - + @@ -13112,7 +13112,7 @@ other - + @@ -13121,7 +13121,7 @@ other - + @@ -13146,7 +13146,7 @@ other - + @@ -13155,7 +13155,7 @@ other - + @@ -13164,7 +13164,7 @@ other - + @@ -13173,7 +13173,7 @@ other - + @@ -13182,7 +13182,7 @@ other - + @@ -13191,7 +13191,7 @@ other - + @@ -13200,7 +13200,7 @@ other - + @@ -13209,7 +13209,7 @@ other - + @@ -13226,7 +13226,7 @@ other - + @@ -13243,7 +13243,7 @@ other - + @@ -13260,7 +13260,7 @@ other - + @@ -13285,7 +13285,7 @@ other - + @@ -13302,7 +13302,7 @@ other - + @@ -13319,7 +13319,7 @@ other - + @@ -13336,7 +13336,7 @@ other - + @@ -13353,7 +13353,7 @@ other - + @@ -13370,7 +13370,7 @@ other - + @@ -13395,7 +13395,7 @@ other - + @@ -13412,7 +13412,7 @@ other - + @@ -13429,7 +13429,7 @@ other - + @@ -13446,7 +13446,7 @@ other - + @@ -13463,7 +13463,7 @@ other - + @@ -13480,7 +13480,7 @@ other - + @@ -13497,7 +13497,7 @@ other - + @@ -13514,7 +13514,7 @@ other - + diff --git a/addons/l10n_de/account_types_skr03.xml b/addons/l10n_de/account_types_skr03.xml index 5967999b601..c65cba38333 100644 --- a/addons/l10n_de/account_types_skr03.xml +++ b/addons/l10n_de/account_types_skr03.xml @@ -15,14 +15,14 @@ none - + Erfolgskonten - Aufwendungen expense expense none - + Bilanzkonten - Aktiva - Vermögenskonten balance asset asset diff --git a/addons/l10n_de/account_types_skr04.xml b/addons/l10n_de/account_types_skr04.xml index 5967999b601..c65cba38333 100644 --- a/addons/l10n_de/account_types_skr04.xml +++ b/addons/l10n_de/account_types_skr04.xml @@ -15,14 +15,14 @@ none - + Erfolgskonten - Aufwendungen expense expense none - + Bilanzkonten - Aktiva - Vermögenskonten balance asset asset From 7d81001ae4b9758d8e875ef1a3d847549c17d5b4 Mon Sep 17 00:00:00 2001 From: "Ujjvala Collins (OpenERP)" Date: Tue, 13 Dec 2011 18:52:47 +0530 Subject: [PATCH 086/192] [REM] account: Removed usused files. bzr revid: uco@tinyerp.com-20111213132247-2w2wld4l1scio50i --- addons/account/report/__init__.py | 1 - .../report/account_balance_landscape.py | 393 ------------------ .../report/account_balance_landscape.rml | 317 -------------- .../account_balance_landscape_old_backup.rml | 182 -------- .../report/account_balance_old_backup.rml | 179 -------- 5 files changed, 1072 deletions(-) delete mode 100644 addons/account/report/account_balance_landscape.py delete mode 100644 addons/account/report/account_balance_landscape.rml delete mode 100644 addons/account/report/account_balance_landscape_old_backup.rml delete mode 100644 addons/account/report/account_balance_old_backup.rml diff --git a/addons/account/report/__init__.py b/addons/account/report/__init__.py index 78d369f79a8..70ceb4b8f83 100644 --- a/addons/account/report/__init__.py +++ b/addons/account/report/__init__.py @@ -33,7 +33,6 @@ import account_print_overdue import account_aged_partner_balance #import tax_report import account_tax_report -#import account_balance_landscape import account_invoice_report import account_report import account_entries_report diff --git a/addons/account/report/account_balance_landscape.py b/addons/account/report/account_balance_landscape.py deleted file mode 100644 index 4e62a9777c9..00000000000 --- a/addons/account/report/account_balance_landscape.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2010 Tiny SPRL (). -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - -import time -import locale -from report import report_sxw - -parents = { - 'tr':1, - 'li':1, - 'story': 0, - 'section': 0 -} - -class account_balance_landscape(report_sxw.rml_parse): - def __init__(self, cr, uid, name, context): - super(account_balance_landscape, self).__init__(cr, uid, name, context=context) - self.flag=1 - self.dr_total= 0.00 - self.cr_total= 0.00 - self.parent_bal=0 - self.status=0 - self.done_total=0 - self.baldiv={} - self.empty_parent=0 - self.result_total = {} - self.total_for_perc=[] - self.localcontext.update({ - 'time': time, - 'lines': self.lines, - 'get_lines':self.get_lines, - 'linesForTotal': self.linesForTotal, - 'linesForYear': self.linesForYear, - 'get_years':self.get_years, - 'cal_total':self.cal_total, - 'total_dr':self.total_dr, - 'total_cr':self.total_cr - }) - self.context = context - - def linesForYear(self,form): - temp=0 - years={} - - global pattern - global show - global perc - global bal_zero - global ref_bal - - pattern=form['compare_pattern'] - - if form['show_columns']!=1: - show=0 - else: - show=form['show_columns'] - - if form['format_perc']!=1: - perc=0 - else: - perc=form['format_perc'] - - if form['account_choice']=='bal_zero': - bal_zero=0 - else: - bal_zero=1 - - ctx = self.context.copy() - - if perc==1: - if form['select_account']!=False: - ref_ac=self.pool.get('account.account').browse(self.cr, self.uid, form['select_account'], ctx.copy()) - if ref_ac.balance<>0.00: - ref_bal=ref_ac.balance - else: - ref_bal=1.00 - else: - ref_bal='nothing' - else: - ref_bal='nothing' - - - self.done_total=1 - self.total_for_perc=self.linesForTotal(form, ids={}, doneAccount={}, level=1) - self.done_total=0 - - for t1 in range(0,len(form['fiscalyear'])): - locale.setlocale(locale.LC_ALL, '') - self.result_total["sum_credit" + str(t1)]=locale.format("%.2f", self.result_total["sum_credit" + str(t1)], grouping=True) - self.result_total["sum_debit" + str(t1)]=locale.format("%.2f", self.result_total["sum_debit" + str(t1)], grouping=True) - - for temp in range(0,len(form['fiscalyear'])): - fy=self.pool.get('account.fiscalyear').name_get(self.cr, self.uid, form['fiscalyear'][temp]) - years["year"+str(temp)]=fy[0][1][12:16] - - return [years] - - - def linesForTotal(self, form, ids={}, doneAccount={}, level=1): - if not self.done_total==1: - return [self.result_total] - accounts=[] - if not ids: - ids = self.ids - if not ids: - return [] - - ctx = self.context.copy() - - for id in form['fiscalyear']: - tmp=[] - - ctx['fiscalyear'] = id - ctx['periods'] = form['periods'] - ctx['period_manner'] = form['period_manner'] - ctx['state'] = form['context'].get('state','all') - tmp = self.pool.get('account.account').browse(self.cr, self.uid, ids, ctx.copy()) - - if tmp: - accounts.append(tmp) - - merged_accounts=zip(*accounts) - # used to check for the frst record so all sum_credit and sum_debit r set to 0.00 - if level==1: - doneAccount={} - for entry in merged_accounts: - - if entry[0].id in doneAccount: - continue - doneAccount[entry[0].id] = 1 - - for k in range(0,len(entry)): - temp_credit=0.00 - temp_debit=0.00 - if entry[0].type <> 'view': - temp_credit+=entry[k].credit - temp_debit+=entry[k].debit - - if self.flag==1: - self.result_total["sum_credit" + str(k)]=0.00 - self.result_total["sum_debit" + str(k)]=0.00 - - if form['account_choice']=='bal_zero': - if temp_credit<>temp_debit: - self.result_total["sum_credit" + str(k)]+=temp_credit - self.result_total["sum_debit" + str(k)]+=temp_debit - else: - self.result_total["sum_credit" + str(k)]+=temp_credit - self.result_total["sum_debit" + str(k)]+=temp_debit - - self.flag=2 - - if entry[0].child_id: - ids2 = [(x.code,x.id) for x in entry[0].child_id] - ids2.sort() - - result_total_parent = self.linesForTotal(form, [x[1] for x in ids2], doneAccount, level+1) - - return [self.result_total] - - def lines(self, form, ids={}, done={}, level=1): - accounts=[] - if not ids: - ids = self.ids - if not ids: - return [] - result = [] - ctx = self.context.copy() - tmp1=[] - for id in form['fiscalyear']: - - ctx['fiscalyear'] = id - ctx['periods'] = form['periods'] - ctx['period_manner']=form['period_manner'] - ctx['state'] = form['context'].get('state','all') - tmp1 = self.pool.get('account.account').browse(self.cr, self.uid, ids, ctx.copy()) - - if tmp1: - accounts.append(tmp1) - - if level==1: #if parent is called,done is not empty when called again. - done={} - - def cmp_code(x, y): - return cmp(x.code, y.code) - for n in range(0,len(accounts)): - accounts[n].sort(cmp_code) - merged_accounts=zip(*accounts) - - for entry in merged_accounts: - j=0 - checked=1 - - if form['account_choice']!='all': # if checked,include empty a/c;not otherwise - checked=0 - - if entry[0].id in done: - continue - done[entry[0].id] = 1 - - if entry[0].child_id: # this is for parent account,dont check 0 for it - checked=4 - self.status=1 # for displaying it Bold - else: - self.status=0 - if checked==0: - i=0 - for i in range(0,len(entry)): - if bal_zero==0: - if entry[i].balance<>0.0: - checked=4 - break - else: - checked=3 - i=i+1 - else: - if entry[i].credit <> 0.0 or entry[i].debit <> 0.0: - checked=4 - break - else: - checked=3 - i=i+1 - - if checked==3: - # this is the point where we skip those accounts which are encountered as empty ones - continue - self.empty_parent=0 - else: - self.empty_parent=1 - res = { - 'code': entry[0].code, - 'name': entry[0].name, - 'level': level, - 'status': self.status, - } - - for j in range(0,len(entry)): - - locale.setlocale(locale.LC_ALL, '') - res["debit"+str(j)]=locale.format("%.2f", entry[j].debit, grouping=True) - res["credit"+str(j)]=locale.format("%.2f", entry[j].credit, grouping=True) - res["balance"+str(j)]=locale.format("%.2f", entry[j].balance, grouping=True) - - - if j==0: - res["bal_cash"+str(j)]="0.00" - res["bal_perc"+str(j)]="0.00%" - else: - temp_cash=entry[j].balance - entry[j-1].balance - res["bal_cash"+str(j)]=locale.format("%.2f", temp_cash, grouping=True) - if entry[j-1].balance<>0.00: - temp_perc=(entry[j].balance - entry[j-1].balance )*100/entry[j-1].balance - else: - temp_perc=(entry[j].balance) *100 - - res["bal_perc"+str(j)]=locale.format("%.2f", temp_perc) + "%" - - - if ref_bal=='nothing': - if level==1: - self.parent_bal=1 - else: - self.parent_bal=0 - - if self.parent_bal==1: - res["balance_perc"+str(j)]="/" - else: - if entry[j].balance==0.00: - if self.baldiv["baldiv"+str(level-1)+str(j)]<>0.00: - res["balance_perc"+str(j)]="0.00%" - else: - res["balance_perc"+str(j)]="/" - else: - if self.baldiv["baldiv"+str(level-1)+str(j)]<>0.00: - temp=self.baldiv["baldiv"+str(level-1)+str(j)] - temp1=(entry[j].balance * 100 )/ float(temp) - temp1=round(temp1,2) - res["balance_perc" + str(j)]=str(temp1)+"%" - else: - res["balance_perc"+str(j)]="/" - else: - res["balance_perc"+str(j)]=str( (entry[j].balance * 100 )/ float(ref_bal)) + "%" - - result.append(res) - - if entry[0].child_id: - - for q in range(0,len(form['fiscalyear'])): - self.baldiv["baldiv"+str(level)+str(q)]=entry[q].balance - - ids2 = [(x.code,x.id) for x in entry[0].child_id] - ids2.sort() - dir=[] - dir += self.lines(form, [x[1] for x in ids2], done, level+1) - if dir==[]: - for w in range(0,len(form['fiscalyear'])): - if entry[w].credit <> 0.0 or entry[w].debit <> 0.0 or entry[w].balance<>0.00: - dont_pop=1 - break - else: - dont_pop=0 - if dont_pop==1: - result +=dir - else: - result.pop(-1) # here we pop up the parent having its children as emprty accounts - else: - result +=dir - - return result - - def get_years(self, form): - result =[] - res={} - for temp in range(0, len(form['fiscalyear'])): - res={} - fy=self.pool.get('account.fiscalyear').name_get(self.cr, self.uid, form['fiscalyear'][temp]) - res['year']=fy[0][1] - res['last_str']=temp - - result.append(res) - self.linesForYear(form) - return result - - def get_lines(self, year_dict, form): - final_result = [] - res = {} - line_l = self.lines(form) - self.cal_total(year_dict) - if line_l: - for l in line_l: - res = {} - res['code'] = l['code'] - res['name'] = l['name'] - res['level'] = l['level'] - for k,v in l.items(): - if k.startswith('debit'+str(year_dict['last_str'])): - res['debit'] = v - if k.startswith('credit'+str(year_dict['last_str'])): - res['credit'] = v - if k.startswith('balance'+str(year_dict['last_str'])) and not k.startswith('balance_perc'+str(year_dict['last_str'])): - res['balance'] =v - if k.startswith('balance_perc'+str(year_dict['last_str'])) and not k.startswith('balance'+str(year_dict['last_str'])): - res['balance_perc'] = v - if form['compare_pattern'] == 'bal_perc': - if k.startswith('bal_perc'+str(year_dict['last_str'])): - res['pattern'] = v - elif form['compare_pattern'] == 'bal_cash': - if k.startswith('bal_cash'+str(year_dict['last_str'])): - res['pattern'] = v - else: - res['pattern'] = '' - final_result.append(res) - return final_result - - def cal_total(self, year_dict): - total_l = self.result_total - if total_l: - for k,v in total_l.items(): - if k.startswith('sum_debit'+str(year_dict['last_str'])): - self.dr_total = v - elif k.startswith('sum_credit'+str(year_dict['last_str'])): - self.cr_total = v - else: - continue - return True - - def total_dr(self): - return self.dr_total - - def total_cr(self): - return self.cr_total - -report_sxw.report_sxw('report.account.account.balance.landscape', 'account.account', 'addons/account/report/account_balance_landscape.rml', parser=account_balance_landscape, header="internal landscape") -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - diff --git a/addons/account/report/account_balance_landscape.rml b/addons/account/report/account_balance_landscape.rml deleted file mode 100644 index d8e4881bbbe..00000000000 --- a/addons/account/report/account_balance_landscape.rml +++ /dev/null @@ -1,317 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [[ repeatIn(get_years(data['form']), 'y') ]] - - - - Account Balance - [[ company.currency_id.name ]] - - - - - - - Year : [[ y['year'] ]] - - - - [[ data['form']['show_columns'] and 'Code' or removeParentNode('blockTable') ]] - - - Account Name - - - [[ data['form']['compare_pattern']!='none' and 'C.S.Y.T.(C./P)' or removeParentNode('font') ]] - - - Debit - - - Credit - - - Balance - - - - - - - - - - [[ data['form']['show_columns'] and removeParentNode('blockTable') or 'Code' ]] - - - Account Name - - - [[ data['form']['compare_pattern']!='none' and 'C.S.Y.T.(C./P)' or removeParentNode('font') ]] - - - Balance - - - - - - -
- [[ repeatIn(get_lines(y,data['form']), 'a') ]] - - - - [[ (data['form']['format_perc'] or not data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]][[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['debit'] ]] - - - [[ a['credit'] ]] - - - [[ a['balance'] ]] - - - - - - - - [[ (not data['form']['format_perc'] or not data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]] [[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['debit'] ]] - - - [[ a['credit'] ]] - - - [[ a['balance'] ]] - - - [[ a['balance_perc'] ]] - - - - - - - - - - [[ (data['form']['format_perc'] or data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]] [[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['balance'] ]] - - - - - - - - - - [[ (not data['form']['format_perc'] or data['form']['show_columns']) and removeParentNode('blockTable') ]] [[ a['code'] ]] - - - [['.....'*(a['level']-1) ]] [[ a['name'] ]] - - - [[ a['pattern'] ]] - - - [[ a['balance'] ]] - - - [[ a['balance_perc'] ]] - - - - -
- - - - - - - [[ not data['form']['show_columns'] and removeParentNode('blockTable') ]] - - - Total : - - - [[ total_dr() ]] - - - [[ total_cr() ]] - - - - - - - - - - - - [[ data['form']['compare_pattern']!='none' and "C.S.Y.T.(C./P) : Compare Selected Years In Terms of Cash/Perc" or removeParentNode('font') ]] -
-
\ No newline at end of file diff --git a/addons/account/report/account_balance_landscape_old_backup.rml b/addons/account/report/account_balance_landscape_old_backup.rml deleted file mode 100644 index 6790082f8dd..00000000000 --- a/addons/account/report/account_balance_landscape_old_backup.rml +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account Balance - - - - - - - - - - [[ company.name ]] - - - - - - - - Currency: [[ company.currency_id.name ]] - - - - - - - Printing date: [[ time.strftime('%Y-%m-%d') ]] at [[ time.strftime('%H:%M:%S') ]] - - - -
- [[repeatIn(linesForYear(data['form']),'year_header',td=len(data['form']['fiscalyear'][0][2]),width=[126],value=['year'],type=['string']) ]] - - - - Account Information - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['Debit','Credit','Balance'],type=['lable','lable','lable']) ]] - - - - Code - - - Account Name - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[84,42],value=['Cash','%'],type=['lable','lable']) ]] - - - - - - - -
- - - -
- [[ repeatIn(lines(data['form']),'a',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['debit','credit','balance'],type=['string','string','string']) ]] - - - - - - - [[ a['status']==1 and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['code'] ]] - - - [['.....'*(a['level']-1) ]][[ a['status']==1 and ( setTag('font','font',{'name':'Helvetica-bold'})) ]][[ a['name'] ]] - - - -
- - - -
- [[ repeatIn(linesForTotal(data['form']),'total',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['sum_debit','sum_credit',''],type=['string','string','lable'] ) ]] - - - - Total:[[ data['form']['show_columns']==0 and removeParentNode('section')]] - - - -
- - - - -
-
diff --git a/addons/account/report/account_balance_old_backup.rml b/addons/account/report/account_balance_old_backup.rml deleted file mode 100644 index cf67cb6bc3d..00000000000 --- a/addons/account/report/account_balance_old_backup.rml +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account balance - - - - - - - - [[ company.name ]] - - - - - - Currency: [[ company.currency_id.name ]] - - - - - - - Printing date: [[ time.strftime('%Y-%m-%d') ]] at [[ time.strftime('%H:%M:%S') ]] - - - -
- [[repeatIn(linesForYear(data['form']),'year_header',td=len(data['form']['fiscalyear'][0][2]),width=[126],value=['year'],type=['string']) ]] - - - - Account Information - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['Debit','Credit','Balance'],type=['lable','lable','lable']) ]] - - - - Code - - - Account Name - - - -
-
- [[ repeatIn([],'title',td=len(data['form']['fiscalyear'][0][2]),width=[84,42],value=['Cash','%'],type=['lable','lable']) ]] - - - - - - - -
- - - -
- [[ repeatIn(lines(data['form']),'a',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['debit','credit','balance'],type=['string','string','string']) ]] - - - - - - - - - - [[ a['status']==1 and ( setTag('para','para',{'fontName':'Helvetica-bold'})) ]][[ a['code'] ]] - - - [['.....'*(a['level']-1) ]][[ a['status']==1 and ( setTag('font','font',{'name':'Helvetica-bold'})) ]][[ a['name'] ]] - - - -
- - - -
- [[ repeatIn(linesForTotal(data['form']),'total',td=len(data['form']['fiscalyear'][0][2]),width=[42,42,42],value=['sum_debit','sum_credit',''],type=['string','string','lable'] ) ]] - - - - Total:[[ data['form']['show_columns']==0 and removeParentNode('section')]] - - - -
- - - -
-
From 0941028b447165accf5c59a1a0bf3e4d305af138 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 13 Dec 2011 14:45:34 +0100 Subject: [PATCH 087/192] [imp] added notifications when there is pending operations bzr revid: nicolas.vanhoren@openerp.com-20111213134534-xiyd0h096pei1k70 --- addons/point_of_sale/static/src/css/pos.css | 9 ++++++++ addons/point_of_sale/static/src/js/pos.js | 23 ++++++++++++++++++++- addons/point_of_sale/static/src/xml/pos.xml | 8 +++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 24eb704b7dc..2ff5fbf9dd3 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -478,3 +478,12 @@ .point-of-sale .pos-receipt-container { font-size: 0.75em; } + +.point-of-sale .oe_pos_synch-notification-button { + color: white; + border: 1px solid black; + border-radius: 3px; + padding: 2px 3px 2px 3px; + background-color: #D92A2A; +} + diff --git a/addons/point_of_sale/static/src/js/pos.js b/addons/point_of_sale/static/src/js/pos.js index 79cba643647..423399b9c07 100644 --- a/addons/point_of_sale/static/src/js/pos.js +++ b/addons/point_of_sale/static/src/js/pos.js @@ -1161,6 +1161,23 @@ openerp.point_of_sale = function(db) { }; return App; })(); + + db.point_of_sale.SynchNotification = db.web.Widget.extend({ + template: "pos-synch-notification", + init: function() { + this._super.apply(this, arguments); + this.nbr_pending = 0; + }, + render_element: function() { + this._super.apply(this, arguments); + $('.oe_pos_synch-notification-button', this.$element).click(this.on_synch); + }, + on_change_nbr_pending: function(nbr_pending) { + this.nbr_pending = nbr_pending; + this.render_element(); + }, + on_synch: function() {} + }); db.web.client_actions.add('pos.ui', 'db.point_of_sale.PointOfSale'); db.point_of_sale.PointOfSale = db.web.Widget.extend({ @@ -1173,6 +1190,10 @@ openerp.point_of_sale = function(db) { "of the point of sale at the same time."; pos = new Pos(this.session); + this.synch_notification = new db.point_of_sale.SynchNotification(this); + this.synch_notification.replace($('.oe_pos_synch-notification', this.$element)); + this.synch_notification.on_synch.add(_.bind(pos.flush, pos)); + pos.bind('change:pending_operations', this.changed_pending_operations, this); this.changed_pending_operations(); @@ -1192,7 +1213,7 @@ openerp.point_of_sale = function(db) { changed_pending_operations: function () { var operations = pos.get('pending_operations'); var number = operations.length; - + this.synch_notification.on_change_nbr_pending(number); }, try_close: function() { this.close(); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index d8647aaccc9..61a5af2a17b 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -25,6 +25,7 @@
+
@@ -122,6 +123,13 @@
+ + + + pending orders + + +