From c1e2afebe8f3eea7f08dd39dfb1840f0bb867cef Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Fri, 8 Jul 2011 14:06:28 +0200 Subject: [PATCH 01/96] [FIX] cannot open from of task when project caldav is installed bzr revid: tfr@openerp.com-20110708120628-i6eyl0kdpkgt2ara --- addons/project_caldav/project_caldav.py | 2 +- addons/project_caldav/project_caldav_view.xml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/project_caldav/project_caldav.py b/addons/project_caldav/project_caldav.py index ada89d35e69..c0f780dfc57 100644 --- a/addons/project_caldav/project_caldav.py +++ b/addons/project_caldav/project_caldav.py @@ -42,11 +42,11 @@ class project_task(osv.osv): help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\ \n If the task is over, the states is set to \'Done\'.'), } + _defaults = { 'state': 'draft', } - def open_task(self, cr, uid, ids, context=None): """ Open Task Form for Project Task. diff --git a/addons/project_caldav/project_caldav_view.xml b/addons/project_caldav/project_caldav_view.xml index d27a4474fc9..f361dc9580b 100644 --- a/addons/project_caldav/project_caldav_view.xml +++ b/addons/project_caldav/project_caldav_view.xml @@ -66,8 +66,7 @@ - + From 461e41910255a1366270cd8e54d263b267c299de Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Fri, 8 Jul 2011 15:12:03 +0200 Subject: [PATCH 02/96] [FIX] event.todo don't erase project.task column anymore bzr revid: tfr@openerp.com-20110708131203-o9cduv00he161ahl --- addons/project_caldav/project_caldav.py | 2 +- addons/project_caldav/project_caldav_view.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/project_caldav/project_caldav.py b/addons/project_caldav/project_caldav.py index c0f780dfc57..f17ef3050d4 100644 --- a/addons/project_caldav/project_caldav.py +++ b/addons/project_caldav/project_caldav.py @@ -28,7 +28,7 @@ from project.project import task as base_project_task class project_task(osv.osv): _name = "project.task" - _inherit = ["calendar.todo", "project.task"] + _inherit = ["project.task", "calendar.todo"] _columns = { # force inherit from project.project_task so that # calendar.todo.active is masked oute diff --git a/addons/project_caldav/project_caldav_view.xml b/addons/project_caldav/project_caldav_view.xml index f361dc9580b..57e9e75a53b 100644 --- a/addons/project_caldav/project_caldav_view.xml +++ b/addons/project_caldav/project_caldav_view.xml @@ -66,7 +66,7 @@ - + From a2dcc919cea8e2bce788ab656c4d6674f2a67490 Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Fri, 8 Jul 2011 15:35:02 +0200 Subject: [PATCH 03/96] [CLEAN] clean recurrent option view in task, but deactivate reccurency for task in openerp since it's not well implemented bzr revid: tfr@openerp.com-20110708133502-gqdovbyhm717xdgx --- addons/project_caldav/project_caldav_view.xml | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/addons/project_caldav/project_caldav_view.xml b/addons/project_caldav/project_caldav_view.xml index 57e9e75a53b..0d566be4619 100644 --- a/addons/project_caldav/project_caldav_view.xml +++ b/addons/project_caldav/project_caldav_view.xml @@ -65,7 +65,8 @@ form - + + @@ -78,46 +79,57 @@ form - - - - - - - - - - - + + + + + + + + + + - + + - - + + - + + - + - - + + - - - - - - + + + + From 7c75f19da5e025fd7971d10c233c1c5a45037158 Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Fri, 8 Jul 2011 17:35:07 +0200 Subject: [PATCH 04/96] [FIX] creation of todo bzr revid: tfr@openerp.com-20110708153507-0old9j33jus9grmc --- addons/base_calendar/base_calendar.py | 3 +-- addons/caldav/caldav_node.py | 2 +- addons/project_caldav/project_caldav.py | 2 ++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index 5f24b08884a..e50bb52abd9 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -1208,7 +1208,7 @@ rule or repeating pattern of time to exclude from the recurring rule."), def remove_virtual_id(self, ids): - if isinstance(ids, (str, int)): + if isinstance(ids, (str, int, long)): return base_calendar_id2real_id(ids) if isinstance(ids, (list, tuple)): @@ -1239,7 +1239,6 @@ rule or repeating pattern of time to exclude from the recurring rule."), if until_date: continue until_date = arg[2] - res = super(calendar_event, self).search(cr, uid, args_without_date, \ 0, 0, order, context, count=False) res = self.get_recurrent_ids(cr, uid, res, start_date, until_date, limit, context=context) diff --git a/addons/caldav/caldav_node.py b/addons/caldav/caldav_node.py index 5272d0fc1fd..71e9bdc2468 100644 --- a/addons/caldav/caldav_node.py +++ b/addons/caldav/caldav_node.py @@ -324,7 +324,6 @@ class node_calendar(nodes.node_class): uid = self.context.uid res = self.set_data(cr, data) - if res and len(res): # We arbitrarily construct only the first node of the data # that have been imported. ICS may have had more elements, @@ -332,6 +331,7 @@ class node_calendar(nodes.node_class): assert isinstance(res[0], (int, long)) fnodes = fil_obj.get_calendar_objects(cr, uid, [self.calendar_id], self, domain=[('id','=',res[0])], context=ctx) + if self.context.get('DAV-client','') in ('iPhone', 'iCalendar',): # For those buggy clients, register the alias bca_obj = fil_obj.pool.get('basic.calendar.alias') diff --git a/addons/project_caldav/project_caldav.py b/addons/project_caldav/project_caldav.py index f17ef3050d4..782f167d69b 100644 --- a/addons/project_caldav/project_caldav.py +++ b/addons/project_caldav/project_caldav.py @@ -109,6 +109,8 @@ class project_task(osv.osv): self.write(cr, uid, [exists], val) ids.append(exists) else: + #set user_id with id, needed later + val.update({'user_id' : uid}) task_id = self.create(cr, uid, val) ids.append(task_id) return ids From aedeaadb4663a57e0ee9c45b7b372d5bae000946 Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Mon, 11 Jul 2011 14:20:55 +0200 Subject: [PATCH 05/96] [FIX] caldav write_date problem + attendees synchronization bzr revid: tfr@openerp.com-20110711122055-63syh4xflmko9ajb --- addons/caldav/calendar.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/addons/caldav/calendar.py b/addons/caldav/calendar.py index a70a31bc017..94d28e4ad37 100644 --- a/addons/caldav/calendar.py +++ b/addons/caldav/calendar.py @@ -121,10 +121,10 @@ def str2mailto(emailstr, multi=False): for mas in mailz: m = mege.match(mas.strip()) if not m: - # one of the rare non-matching strings is "sad" :( - # retz.append({ 'name': mas.strip() }) - # continue - raise ValueError("Invalid email address %r" % mas) + #one of the rare non-matching strings is "sad" :( + retz.append({ 'name': mas.strip() }) + continue + # raise ValueError("Invalid email address %r" % mas) rd = { 'name': m.group(1).strip(), 'email': m.group(5), } if m.group(2): @@ -189,6 +189,9 @@ def map_data(cr, uid, obj, context=None): field = obj.ical_get(map_dict, 'field') field_type = obj.ical_get(map_dict, 'type') if field: + #ignore write date, this field is resered for the orm + if field == 'write_date': + continue if field_type == 'selection': if not map_val: continue @@ -299,7 +302,6 @@ class CalDAV(object): att_data = [] exdates = [] _server_tzinfo = pytz.timezone(tools.get_server_timezone()) - for cal_data in child.getChildren(): if cal_data.name.lower() == 'organizer': dmail = { 'name': cal_data.params.get('CN', ['',])[0], @@ -552,7 +554,7 @@ class CalDAV(object): @param data_id: Get Data’s ID or False @param context: A standard dictionary for contextual values """ - + ical_data = content self.__attribute__ = get_attribute_mapping(cr, uid, self._calname, context) parsedCal = vobject.readOne(ical_data) From 0a583564912137386a36da42c5fefb651add8ee9 Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Mon, 11 Jul 2011 17:51:29 +0200 Subject: [PATCH 06/96] [IMP] in progress translate rrule into openerp data bzr revid: tfr@openerp.com-20110711155129-jjhuvaby3m5eryuu --- addons/base_calendar/base_calendar.py | 80 ++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index e50bb52abd9..dfa898c633f 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -991,14 +991,80 @@ class calendar_event(osv.osv): """ result = {} + if not isinstance(ids, list): + ids = [ids] + for datas in self.read(cr, uid, ids, ['id','byday','recurrency', 'month_list','end_date', 'rrule_type', 'select1', 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'exrule', 'day', 'week_list' ], context=context): event = datas['id'] if datas.get('interval', 0) < 0: raise osv.except_osv(_('Warning!'), _('Interval can not be Negative')) if datas.get('count', 0) < 0: raise osv.except_osv(_('Warning!'), _('Count can not be Negative')) - result[event] = self.compute_rule_string(datas) + if datas['recurrency']: + result[event] = self.compute_rule_string(datas) + else: + result[event] = "" return result + + def _parse_rrule(self, rule, data): + day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'] + r = rrule.rrulestr(rule) + data['count'] = r._count + data['interval'] = r._interval + data['end_date'] = r._until and r._until.strftime("%Y-%m-%d %H:%M:%S") + #repeat weekly + if r._byweekday: + for i in xrange(0,7): + if i in r._byweekday: + data[day_list[i]] = True + data['rrule_type'] = 'weekly' + #repeat monthly bynweekday ((weekday, weeknumber), ) + if r._bynweekday: + data['week_list'] = day_list[r._bynweekday[0][0]].upper() + data['byday'] = r._bynweekday[0][1] + data['rrule_type'] = 'monthly' + + #end of recurrence + #in case of repeat for ever that we do not support right now + if not (data.get('count') or data.get('end_date')): + data['count'] = 100 + if data.get('count'): + data['end_type'] = 'count' + else: + data['end_type'] = 'end_date' + return data + + def _write_rrule(self, cr, uid, ids, field_name, field_value, arg, context): + print field_name, field_value + data = { + 'byday' : False, + 'recurrency' : False, + 'month_list' : False, + 'end_date' : False, + 'rrule_type' : False, + 'select1' : False, + 'interval' : 0, + 'count' : False, + 'end_type' : False, + 'mo' : False, + 'tu' : False, + 'we' : False, + 'th' : False, + 'fr' : False, + 'sa' : False, + 'su' : False, + 'exrule' : False, + 'day' : False, + 'week_list' : False + } + + if field_value: + update_data = self._parse_rrule(field_value, dict(data)) + print update_data + #parse_rrule + self.write(cr, uid, ids, data, context=context) + + print "rrule", self._get_rulestring(cr, uid, ids, None, arg, context) _columns = { 'id': fields.integer('ID'), @@ -1022,7 +1088,7 @@ class calendar_event(osv.osv): defines the list of date/time exceptions for a recurring calendar component."), 'exrule': fields.char('Exception Rule', size=352, help="Defines a \ rule or repeating pattern of time to exclude from the recurring rule."), - 'rrule': fields.function(_get_rulestring, type='char', size=124, \ + 'rrule': fields.function(_get_rulestring, fnct_inv=_write_rrule, type='char', size=124, \ store=True, string='Recurrent Rule'), 'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \ ('weekly', 'Weekly'), ('monthly', 'Monthly'), \ @@ -1173,7 +1239,7 @@ rule or repeating pattern of time to exclude from the recurring rule."), @param self: the object pointer @param datas: dictionary of freq and interval value. """ - + print "compute rule string" def get_week_string(freq, datas): weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'] if freq == 'weekly': @@ -1277,6 +1343,8 @@ rule or repeating pattern of time to exclude from the recurring rule."), except Exception: return True + + def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True): if context is None: context = {} @@ -1284,6 +1352,9 @@ rule or repeating pattern of time to exclude from the recurring rule."), select = [ids] else: select = ids + + + new_ids = [] res = False for event_id in select: @@ -1335,6 +1406,9 @@ rule or repeating pattern of time to exclude from the recurring rule."), context=context) vals.update(updated_vals.get('value', {})) if new_ids: + if 'rrule' in vals.keys(): + print "write, rrule" + print "write ", vals res = super(calendar_event, self).write(cr, uid, new_ids, vals, context=context) if ('alarm_id' in vals or 'base_calendar_alarm_id' in vals)\ From 842b67f5b095a11c2185307102eba11e2e7ceeae Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Tue, 12 Jul 2011 12:03:12 +0200 Subject: [PATCH 07/96] [IMP] support caldav recurrency bzr revid: tfr@openerp.com-20110712100312-lj0uib1rnx90dbhc --- addons/base_calendar/base_calendar.py | 155 +++++++++++++++----------- 1 file changed, 92 insertions(+), 63 deletions(-) diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py index dfa898c633f..1e71ea65634 100644 --- a/addons/base_calendar/base_calendar.py +++ b/addons/base_calendar/base_calendar.py @@ -1006,66 +1006,9 @@ class calendar_event(osv.osv): result[event] = "" return result - def _parse_rrule(self, rule, data): - day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'] - r = rrule.rrulestr(rule) - data['count'] = r._count - data['interval'] = r._interval - data['end_date'] = r._until and r._until.strftime("%Y-%m-%d %H:%M:%S") - #repeat weekly - if r._byweekday: - for i in xrange(0,7): - if i in r._byweekday: - data[day_list[i]] = True - data['rrule_type'] = 'weekly' - #repeat monthly bynweekday ((weekday, weeknumber), ) - if r._bynweekday: - data['week_list'] = day_list[r._bynweekday[0][0]].upper() - data['byday'] = r._bynweekday[0][1] - data['rrule_type'] = 'monthly' - - #end of recurrence - #in case of repeat for ever that we do not support right now - if not (data.get('count') or data.get('end_date')): - data['count'] = 100 - if data.get('count'): - data['end_type'] = 'count' - else: - data['end_type'] = 'end_date' - return data + + - def _write_rrule(self, cr, uid, ids, field_name, field_value, arg, context): - print field_name, field_value - data = { - 'byday' : False, - 'recurrency' : False, - 'month_list' : False, - 'end_date' : False, - 'rrule_type' : False, - 'select1' : False, - 'interval' : 0, - 'count' : False, - 'end_type' : False, - 'mo' : False, - 'tu' : False, - 'we' : False, - 'th' : False, - 'fr' : False, - 'sa' : False, - 'su' : False, - 'exrule' : False, - 'day' : False, - 'week_list' : False - } - - if field_value: - update_data = self._parse_rrule(field_value, dict(data)) - print update_data - #parse_rrule - self.write(cr, uid, ids, data, context=context) - - print "rrule", self._get_rulestring(cr, uid, ids, None, arg, context) - _columns = { 'id': fields.integer('ID'), 'sequence': fields.integer('Sequence'), @@ -1088,7 +1031,7 @@ class calendar_event(osv.osv): defines the list of date/time exceptions for a recurring calendar component."), 'exrule': fields.char('Exception Rule', size=352, help="Defines a \ rule or repeating pattern of time to exclude from the recurring rule."), - 'rrule': fields.function(_get_rulestring, fnct_inv=_write_rrule, type='char', size=124, \ + 'rrule': fields.function(_get_rulestring, type='char', size=124, \ store=True, string='Recurrent Rule'), 'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \ ('weekly', 'Weekly'), ('monthly', 'Monthly'), \ @@ -1239,7 +1182,6 @@ rule or repeating pattern of time to exclude from the recurring rule."), @param self: the object pointer @param datas: dictionary of freq and interval value. """ - print "compute rule string" def get_week_string(freq, datas): weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'] if freq == 'weekly': @@ -1271,7 +1213,85 @@ rule or repeating pattern of time to exclude from the recurring rule."), return '' interval_srting = datas.get('interval') and (';INTERVAL=' + str(datas.get('interval'))) or '' return 'FREQ=' + freq.upper() + get_week_string(freq, datas) + interval_srting + get_end_date(datas) + get_month_string(freq, datas) + + def _get_empty_rrule_data(self): + return { + 'byday' : False, + 'recurrency' : False, + 'end_date' : False, + 'rrule_type' : False, + 'select1' : False, + 'interval' : 0, + 'count' : False, + 'end_type' : False, + 'mo' : False, + 'tu' : False, + 'we' : False, + 'th' : False, + 'fr' : False, + 'sa' : False, + 'su' : False, + 'exrule' : False, + 'day' : False, + 'week_list' : False + } + def _write_rrule(self, cr, uid, ids, field_value, rule_date=False, context=None): + data = self._get_empty_rrule_data() + + if field_value: + data['recurrency'] = True + for event in self.browse(cr, uid, ids, context=context): + rdate = rule_date or event.date + update_data = self._parse_rrule(field_value, dict(data), rdate) + data.update(update_data) + #parse_rrule + self.write(cr, uid, event.id, data, context=context) + + + def _parse_rrule(self, rule, data, date_start): + day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'] + rrule_type = ['yearly', 'monthly', 'weekly', 'daily'] + r = rrule.rrulestr(rule, dtstart=datetime.strptime(date_start, "%Y-%m-%d %H:%M:%S")) + + if r._freq > 0 and r._freq < 4: + data['rrule_type'] = rrule_type[r._freq] + + data['count'] = r._count + data['interval'] = r._interval + data['end_date'] = r._until and r._until.strftime("%Y-%m-%d %H:%M:%S") + #repeat weekly + if r._byweekday: + for i in xrange(0,7): + if i in r._byweekday: + data[day_list[i]] = True + data['rrule_type'] = 'weekly' + #repeat monthly bynweekday ((weekday, weeknumber), ) + if r._bynweekday: + data['week_list'] = day_list[r._bynweekday[0][0]].upper() + data['byday'] = r._bynweekday[0][1] + data['select1'] = 'day' + data['rrule_type'] = 'monthly' + + if r._bymonthday: + data['day'] = r._bymonthday[0] + data['select1'] = 'date' + data['rrule_type'] = 'monthly' + + #yearly but for openerp it's monthly, take same information as monthly but interval is 12 times + if r._bymonth: + data['interval'] = data['interval'] * 12 + + #FIXEME handle forever case + #end of recurrence + #in case of repeat for ever that we do not support right now + if not (data.get('count') or data.get('end_date')): + data['count'] = 100 + if data.get('count'): + data['end_type'] = 'count' + else: + data['end_type'] = 'end_date' + return data def remove_virtual_id(self, ids): if isinstance(ids, (str, int, long)): @@ -1407,8 +1427,12 @@ rule or repeating pattern of time to exclude from the recurring rule."), vals.update(updated_vals.get('value', {})) if new_ids: if 'rrule' in vals.keys(): - print "write, rrule" - print "write ", vals + if 'date' in vals.keys(): + date_to_write = vals['date'] + else: + date_to_write = False + self._write_rrule(cr, uid, new_ids, vals['rrule'], date_to_write, context) + res = super(calendar_event, self).write(cr, uid, new_ids, vals, context=context) if ('alarm_id' in vals or 'base_calendar_alarm_id' in vals)\ @@ -1535,6 +1559,11 @@ rule or repeating pattern of time to exclude from the recurring rule."), if vals.get('vtimezone', '') and vals.get('vtimezone', '').startswith('/freeassociation.sourceforge.net/tzfile/'): vals['vtimezone'] = vals['vtimezone'][40:] + + if 'date' in vals and 'rrule' in vals and vals['rrule']: + update_datas = self._parse_rrule(vals['rrule'], self._get_empty_rrule_data(), vals['date']) + update_datas['recurrency'] = True + vals.update(update_datas) updated_vals = self.onchange_dates(cr, uid, [], vals.get('date', False), From cac9fb4e0322ad041acc2cdb9e9a90322b9decba Mon Sep 17 00:00:00 2001 From: "tfr@openerp.com" <> Date: Tue, 12 Jul 2011 16:02:13 +0200 Subject: [PATCH 08/96] [FIX] get hostname using tools.get_hostname bzr revid: tfr@openerp.com-20110712140213-flf80sbimzhkmekx --- addons/caldav/wizard/caldav_browse.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/caldav/wizard/caldav_browse.py b/addons/caldav/wizard/caldav_browse.py index f6ecc5dccd5..49b313b9886 100644 --- a/addons/caldav/wizard/caldav_browse.py +++ b/addons/caldav/wizard/caldav_browse.py @@ -24,6 +24,7 @@ from tools import config import base64 import addons from tools.translate import _ +import tools class caldav_browse(osv.osv_memory): @@ -239,12 +240,8 @@ class user_preference(osv.osv_memory): return ids[0] def _get_default_host(self, cr, uid, context): - ids=self.search(cr,uid,[]) - host_name = '' - if ids: - ids = len(ids)> 1 and len(ids)-1 or ids[0] # Use len(ids)-1 for taking the value of last id - host_name = self.browse(cr, uid,[ids],context=context)[0].host_name - return host_name + + return tools.get_hostname(self, cr, uid) _defaults={ 'service': 'webdav', From 8a69cc5504369c565e8c11545b9164bcf4b905cc Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Fri, 16 Sep 2011 15:24:46 +0530 Subject: [PATCH 09/96] [FIX] After installing base_contact Contact in search view of partner not work lp bug: https://launchpad.net/bugs/849420 fixed bzr revid: dbr@tinyerp.com-20110916095446-6cwydtneyhng01by --- addons/base_contact/base_contact.py | 18 +++++++++++++++++- addons/base_contact/base_contact_view.xml | 16 +++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/addons/base_contact/base_contact.py b/addons/base_contact/base_contact.py index cf0bc610be8..8be20109591 100644 --- a/addons/base_contact/base_contact.py +++ b/addons/base_contact/base_contact.py @@ -131,7 +131,7 @@ class res_partner_address(osv.osv): if not len(ids): return [] res = [] - if context is None: + if context is None: context = {} for r in self.read(cr, user, ids, ['zip', 'city', 'partner_id', 'street']): if context.get('contact_display', 'contact')=='partner' and r['partner_id']: @@ -143,6 +143,22 @@ class res_partner_address(osv.osv): res.append((r['id'], addr.strip() or '/')) return res + def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): + if not args: + args=[] + if not context: + context={} + if name: + ids = [] + job_ids = self.pool.get('res.partner.job').search(cr, user, [('contact_id', operator, name)] + args, limit=limit, context=context) + partner_ids = self.pool.get('res.partner.job').browse(cr, user, job_ids) + partner_data = [(partner.name.name) for partner in partner_ids] + for partner in partner_data: + ids += self.search(cr, user, [('partner_id',operator,partner)] + args, limit=limit, context=context) + else: + ids = self.search(cr, user, args, limit=limit, context=context) + return self.name_get(cr, user, ids, context) + _name = 'res.partner.address' _inherit = 'res.partner.address' _description ='Partner Address' diff --git a/addons/base_contact/base_contact_view.xml b/addons/base_contact/base_contact_view.xml index 8029084b7c3..a65f107fb25 100644 --- a/addons/base_contact/base_contact_view.xml +++ b/addons/base_contact/base_contact_view.xml @@ -252,7 +252,20 @@ - + + + + + res.partner.select + search + res.partner + + + + + + + @@ -422,3 +435,4 @@ + From 0c13fea7cd069ea761824f9fba79e873c1dec895 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Fri, 16 Sep 2011 18:02:07 +0530 Subject: [PATCH 10/96] [RMV]base_contact: Remove the extra added inherited view bzr revid: dbr@tinyerp.com-20110916123207-voyla0qs0bx1j3te --- addons/base_contact/base_contact_view.xml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/addons/base_contact/base_contact_view.xml b/addons/base_contact/base_contact_view.xml index a65f107fb25..0ac009169b3 100644 --- a/addons/base_contact/base_contact_view.xml +++ b/addons/base_contact/base_contact_view.xml @@ -252,20 +252,6 @@ - - - - - res.partner.select - search - res.partner - - - - - - - From 007af7601f455ab5b21a6e977efbfe25920c8756 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Fri, 16 Sep 2011 18:10:46 +0530 Subject: [PATCH 11/96] [IMP]base_contact:Improve the code bzr revid: dbr@tinyerp.com-20110916124046-2p713bhbsi8g9zev --- addons/base_contact/base_contact.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/addons/base_contact/base_contact.py b/addons/base_contact/base_contact.py index 8be20109591..2f228bdf345 100644 --- a/addons/base_contact/base_contact.py +++ b/addons/base_contact/base_contact.py @@ -144,14 +144,13 @@ class res_partner_address(osv.osv): return res def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): + ids = [] if not args: args=[] - if not context: - context={} + jobs = self.pool.get('res.partner.job') if name: - ids = [] - job_ids = self.pool.get('res.partner.job').search(cr, user, [('contact_id', operator, name)] + args, limit=limit, context=context) - partner_ids = self.pool.get('res.partner.job').browse(cr, user, job_ids) + job_ids = jobs.search(cr, user, [('contact_id', operator, name)] + args, limit=limit, context=context) + partner_ids = jobs.browse(cr, user, job_ids) partner_data = [(partner.name.name) for partner in partner_ids] for partner in partner_data: ids += self.search(cr, user, [('partner_id',operator,partner)] + args, limit=limit, context=context) From 2b997a1fce1f48105f67a6570953a40245edc50c Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Tue, 20 Sep 2011 11:39:49 +0530 Subject: [PATCH 12/96] [FIX] : Remove the conflict bzr revid: dbr@tinyerp.com-20110920060949-j8wtqlq7huc9jvd1 --- addons/auction/auction_demo.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/auction/auction_demo.xml b/addons/auction/auction_demo.xml index 7f34eb6697c..e93cc3ea04d 100644 --- a/addons/auction/auction_demo.xml +++ b/addons/auction/auction_demo.xml @@ -39,7 +39,7 @@ Auction Adjudications A7x* - receivable + other @@ -48,7 +48,7 @@ Auction Adjudication Expenses A6x* - payable + other @@ -56,7 +56,7 @@ Auction Buyer Costs A8x* - payable + other @@ -64,7 +64,7 @@ Auction Seller Costs A9x* - receivable + other @@ -251,7 +251,7 @@ - Frais de vente + Frais de vente0 0 auction From a9eaeb39598726af1e09956f462ee09bad501e75 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Tue, 20 Sep 2011 14:24:19 +0530 Subject: [PATCH 13/96] [IMP]base_contact : Improve the code bzr revid: dbr@tinyerp.com-20110920085419-8vft3k6yu72eb54n --- addons/base_contact/base_contact.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/base_contact/base_contact.py b/addons/base_contact/base_contact.py index 2f228bdf345..25cd38d60fb 100644 --- a/addons/base_contact/base_contact.py +++ b/addons/base_contact/base_contact.py @@ -144,18 +144,14 @@ class res_partner_address(osv.osv): return res def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): - ids = [] if not args: args=[] + ids = self.search(cr, user, [('name',operator,name)] + args, limit=limit, context=context) jobs = self.pool.get('res.partner.job') if name: job_ids = jobs.search(cr, user, [('contact_id', operator, name)] + args, limit=limit, context=context) - partner_ids = jobs.browse(cr, user, job_ids) - partner_data = [(partner.name.name) for partner in partner_ids] - for partner in partner_data: + for partner in [(partner.name.name) for partner in (jobs.browse(cr, user, job_ids))]: ids += self.search(cr, user, [('partner_id',operator,partner)] + args, limit=limit, context=context) - else: - ids = self.search(cr, user, args, limit=limit, context=context) return self.name_get(cr, user, ids, context) _name = 'res.partner.address' From f3573d844e0521dcff8954fb261759ef38986c85 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 12 Oct 2011 18:12:08 +0200 Subject: [PATCH 14/96] [IMP] use login_env for login bzr revid: chs@openerp.com-20111012161208-yto1rang9znmoh4i --- addons/web/common/session.py | 4 ++-- addons/web/controllers/main.py | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/addons/web/common/session.py b/addons/web/common/session.py index e8027db8ea4..ef38fc6a154 100644 --- a/addons/web/common/session.py +++ b/addons/web/common/session.py @@ -58,8 +58,8 @@ class OpenERPSession(object): self._login = login self._password = password - def login(self, db, login, password): - uid = self.proxy('common').login(db, login, password) + def login(self, db, login, password, env): + uid = self.proxy('common').login_env(db, login, password, 'web', env) self.bind(db, uid, login, password) if uid: self.get_context() diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 7ca80fbfdec..2432edc71ea 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -5,6 +5,7 @@ import base64 import csv import glob import itertools +import logging import operator import os import re @@ -21,6 +22,8 @@ import babel.messages.pofile import web.common openerpweb = web.common.http +_logger = logging.getLogger(__name__) + #---------------------------------------------------------- # OpenERP Web web Controllers #---------------------------------------------------------- @@ -263,7 +266,13 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def login(self, req, db, login, password): - req.session.login(db, login, password) + wsgienv = req.httprequest.environ + env = dict( + host='%s://%s' % (wsgienv['wsgi.url_scheme'], wsgienv['HTTP_HOST']), + referrer=wsgienv.get('HTTP_REFERER'), + REMOTE_ADDR=wsgienv['REMOTE_ADDR'], + ) + req.session.login(db, login, password, env) ctx = req.session.get_context() if req.session._uid else {} return { From 8693b8108a5c76115654e0d719249417590da9fc Mon Sep 17 00:00:00 2001 From: "Atik Agewan (OpenERP)" Date: Thu, 13 Oct 2011 16:10:34 +0530 Subject: [PATCH 15/96] [Fix] Account :[Account]In menu Accounting/Configuration/Miscellaneous/Payment Terms Improve some usability Issue lp bug: https://launchpad.net/bugs/873234 fixed bzr revid: aag@tinyerp.com-20111013104034-znmers3jo3h6e7j0 --- addons/account/account_view.xml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index 2ae910a36b3..74157fb8f19 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -1714,19 +1714,20 @@ form
- - - - - - + + + + + + + + + + + + + - - - - - - - From abe5a3e1d05613176660cf4b596dd6e4be4c5216 Mon Sep 17 00:00:00 2001 From: "Rucha (Open ERP)" Date: Wed, 19 Oct 2011 17:50:53 +0530 Subject: [PATCH 21/96] [FIX]: account: typo + improvement in payment term line view bzr revid: rpa@tinyerp.com-20111019122053-qr4uuz9z244s389u --- addons/account/account_view.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml index ad2d616c2e5..3912f665916 100644 --- a/addons/account/account_view.xml +++ b/addons/account/account_view.xml @@ -1730,10 +1730,10 @@ -
+ + + + CLP + $ + 0.01 + 4 + + + + 710 + + + From 1945d19d150544668de7020d7c67b2f2a327a128 Mon Sep 17 00:00:00 2001 From: "RavishchanraMurari (Open ERP)" Date: Mon, 24 Oct 2011 17:44:15 +0530 Subject: [PATCH 84/96] mulit_company_in group_by bzr revid: rmu@tinyerp.com-20111024121415-wkjyjzl6ydqz3t7o --- addons/web/static/src/js/search.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 45a0d40e96e..48d58b5776c 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -63,8 +63,9 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search rows.push(row); var filters = []; _.each(items, function (item) { - if(!item.attrs.hasOwnProperty('invisible') && item.attrs.invisible!=1) - { + if (item.attrs.invisible === '1') { + return; + } if (filters.length && item.tag !== 'filter') { row.push( new openerp.web.search.FilterGroup( @@ -101,7 +102,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search item, fields[item['attrs'].name])); } } - } + }, this); if (filters.length) { row.push(new openerp.web.search.FilterGroup(filters, this)); From ce45893633ca0492dfc57a8cd180374565560357 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 15:44:13 +0200 Subject: [PATCH 85/96] [FIX] Display 'don't import' placeholder when no value selected bzr revid: xmo@openerp.com-20111024134413-kgcgemdzquwtn0ns --- addons/web/static/src/xml/base.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 2860174c30f..db3f082ed03 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1461,7 +1461,7 @@ - + From a8b81ed5754ef0f2495b28b517f2a5b7ed9ba749 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 15:55:21 +0200 Subject: [PATCH 86/96] [ADD] dropdown arrow next to import autocompletes bzr revid: xmo@openerp.com-20111024135521-aikh791r9j94moal --- addons/web/static/src/js/data_import.js | 4 ++++ addons/web/static/src/xml/base.xml | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 711e790dfaa..025ff8df1c5 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -205,6 +205,10 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ return; } + this.$element.delegate('.oe-m2o-drop-down-button', 'click', function () { + $(this).prev('input').focus(); + }); + var self = this; this.ready.then(function () { var $fields = self.$element.find('.sel_fields').bind('blur', function () { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index db3f082ed03..7d010d5867b 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1461,7 +1461,8 @@ - + + From b45b7ad22cce753a00fff13981502e2c807cee79 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 16:06:58 +0200 Subject: [PATCH 87/96] [IMP] import: only show second step once file has been uploaded bzr revid: xmo@openerp.com-20111024140658-8t9csv9i6gd30luj --- addons/web/controllers/main.py | 2 +- addons/web/static/src/js/data_import.js | 2 +- addons/web/static/src/xml/base.xml | 39 +++++++++++++------------ 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 8120141b4f6..6cc46b476a9 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1412,7 +1412,7 @@ class Import(View): return fields @openerpweb.httprequest - def detect_data(self, req, csvfile, csvsep, csvdel, csvcode, jsonp): + def detect_data(self, req, csvfile, csvsep=',', csvdel='"', csvcode='utf-8', jsonp='callback'): try: data = list(csv.reader( csvfile, quotechar=str(csvdel), delimiter=str(csvsep))) diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 025ff8df1c5..42f0cf8d680 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -80,7 +80,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.toggle_import_button(false); this.$element.find('#csvfile').change(this.on_autodetect_data); this.$element.find('fieldset').change(this.on_autodetect_data); - this.$element.find('fieldset legend').click(function() { + this.$element.delegate('fieldset legend', 'click', function() { $(this).next().toggle(); }); this.ready.push(new openerp.web.DataSet(this, this.model).call( diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 7d010d5867b..201ac964ac9 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1419,8 +1419,27 @@

-

2. Check your file format

+ + + +

2. Check your file format

+ + + + + + + + + + +
+
+ + +
+
Import Options @@ -1451,25 +1470,7 @@
-
- - - - - - - - - - -
-
- - -
-

The import failed due to:

From cd59e5e6fbf07bb1783dde48ecdafa73000d33c4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 16:17:37 +0200 Subject: [PATCH 88/96] [ADD] open/close arrow next to import options bzr revid: xmo@openerp.com-20111024141737-bk2rg08wvll1hgno --- addons/web/static/src/css/data_import.css | 12 ++++++++++++ addons/web/static/src/js/data_import.js | 2 +- addons/web/static/src/xml/base.xml | 9 +++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/addons/web/static/src/css/data_import.css b/addons/web/static/src/css/data_import.css index 1fb3b22aa45..b1c4330402f 100644 --- a/addons/web/static/src/css/data_import.css +++ b/addons/web/static/src/css/data_import.css @@ -11,6 +11,18 @@ .openerp .oe_import_grid-row .oe_import_grid-cell { border-bottom: 1px solid #E3E3E3; } +.openerp .oe-import fieldset { + cursor: pointer; +} +.openerp .oe-import fieldset legend:before { + content: '\25BC '; +} +.openerp .oe-import fieldset.oe-closed legend:before { + content: '\25B6 '; +} +.openerp .oe-import fieldset.oe-closed table { + display: none; +} .openerp .separator.horizontal { font-weight: bold; border-bottom-width: 1px; diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 42f0cf8d680..a284669732d 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -81,7 +81,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.$element.find('#csvfile').change(this.on_autodetect_data); this.$element.find('fieldset').change(this.on_autodetect_data); this.$element.delegate('fieldset legend', 'click', function() { - $(this).next().toggle(); + $(this).parent().toggleClass('oe-closed'); }); this.ready.push(new openerp.web.DataSet(this, this.model).call( 'fields_get', [], function (fields) { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 201ac964ac9..f2f77b83eb7 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1409,7 +1409,8 @@ Import -
+

1. Import a .CSV file

Select a .CSV file to import. If you need a sample of file to import, @@ -1440,9 +1441,9 @@ -

- Import Options - +
+ Import Options +
From 06344150ebf2860247929c76f3fc6d9b43ca27b9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 16:27:44 +0200 Subject: [PATCH 89/96] [FIX] automatically open options box if the file fails to parse entirely bzr revid: xmo@openerp.com-20111024142744-zeal912gqf9bvrrp --- addons/web/static/src/css/data_import.css | 4 ++ addons/web/static/src/js/data_import.js | 3 ++ addons/web/static/src/xml/base.xml | 46 +++++++++++------------ 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/addons/web/static/src/css/data_import.css b/addons/web/static/src/css/data_import.css index b1c4330402f..e5d1c9a910c 100644 --- a/addons/web/static/src/css/data_import.css +++ b/addons/web/static/src/css/data_import.css @@ -11,6 +11,10 @@ .openerp .oe_import_grid-row .oe_import_grid-cell { border-bottom: 1px solid #E3E3E3; } + +.openerp .oe-import-no-result .oe-import-result { + display: none; +} .openerp .oe-import fieldset { cursor: pointer; } diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index a284669732d..355c6c1b493 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -194,9 +194,11 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ : with_headers ? results.records.slice(1) : results.records })); + this.$element.find('fieldset').addClass('oe-closed'); } else if (results['error']) { result_node.append(QWeb.render('ImportView.error', { 'error': results['error']})); + this.$element.find('fieldset').removeClass('oe-closed'); } else if (results['success']) { if (this.widget_parent.widget_parent.active_view == "list") { this.widget_parent.reload_content(); @@ -204,6 +206,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.stop(); return; } + this.$element.find('form').removeClass('oe-import-no-result'); this.$element.delegate('.oe-m2o-drop-down-button', 'click', function () { $(this).prev('input').focus(); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index f2f77b83eb7..1054a76dcf6 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1410,7 +1410,7 @@ + class="oe-import oe-import-no-result">

1. Import a .CSV file

Select a .CSV file to import. If you need a sample of file to import, @@ -1420,28 +1420,9 @@

-
- -
- -

2. Check your file format

- - - - - - - - - - -
-
- - -
-
-
+

2. Check your file format

+
+
Import Options @@ -1471,6 +1452,25 @@
+ + + + + + + + + + + + + +
+
+ + +
+

The import failed due to:

From a617e3bacc5ea44b4aa3ec9840e3eb8a4009047f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 24 Oct 2011 17:10:39 +0200 Subject: [PATCH 90/96] [fix] small problem with the context menu of m2o when there is not item selected bzr revid: nicolas.vanhoren@openerp.com-20111024151039-k9jlntcj3n56h13d --- addons/web/static/src/xml/base.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 1054a76dcf6..349dccec867 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -859,9 +859,9 @@
    -
  • Open...
  • +
  • Open...
  • Create...
  • -
  • Search...
  • +
  • Search...
  • From 84a383d5aa7c3ef6a2fc38fb06953b447d831651 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 17:11:58 +0200 Subject: [PATCH 91/96] [IMP] make notebooks in page view identical to those of normal form view as requested by fp bzr revid: xmo@openerp.com-20111024151158-7hqox4k6xrjujxnb --- addons/web/static/src/js/view_form.js | 4 ---- addons/web/static/src/xml/base.xml | 6 ------ 2 files changed, 10 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 7d3f96925e0..aa1fbab90e1 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2813,9 +2813,6 @@ openerp.web.form.FieldStatus = openerp.web.form.Field.extend({ } }); -openerp.web.form.WidgetNotebookReadonly = openerp.web.form.WidgetNotebook.extend({ - template: 'WidgetNotebook.readonly' -}); openerp.web.form.FieldReadonly = openerp.web.form.Field.extend({ }); @@ -2934,7 +2931,6 @@ openerp.web.form.widgets = new openerp.web.Registry({ 'statusbar': 'openerp.web.form.FieldStatus' }); openerp.web.form.readonly = openerp.web.form.widgets.clone({ - 'notebook': 'openerp.web.form.WidgetNotebookReadonly', 'char': 'openerp.web.form.FieldCharReadonly', 'email': 'openerp.web.form.FieldEmailReadonly', 'url': 'openerp.web.form.FieldUrlReadonly', diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 349dccec867..95ad99726f8 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -744,12 +744,6 @@ - - -

    - - -
    From 19bb1dda1a0d59b3010f06b53e47473ee0923105 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 24 Oct 2011 17:20:13 +0200 Subject: [PATCH 92/96] [IMP] use empty box/check mark for page boolean fields, instead of cross vs check mark bzr revid: xmo@openerp.com-20111024152013-nhi8kwra46se0yva --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index aa1fbab90e1..a8ccfcb3e46 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2848,7 +2848,7 @@ openerp.web.form.FieldUrlReadonly = openerp.web.form.FieldURIReadonly.extend({ }); openerp.web.form.FieldBooleanReadonly = openerp.web.form.FieldCharReadonly.extend({ set_value: function (value) { - this._super(value ? '\u2714' : '\u2718'); + this._super(value ? '\u2611' : '\u2610'); } }); openerp.web.form.FieldSelectionReadonly = openerp.web.form.FieldReadonly.extend({ From 6cb7f2b6f9cad1bd02dda34ad283342e1565995e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 24 Oct 2011 17:20:56 +0200 Subject: [PATCH 93/96] [imp] m2o now supports readonly mode bzr revid: nicolas.vanhoren@openerp.com-20111024152056-2nfx7zk4kc9py17k --- addons/web/static/src/js/view_form.js | 11 +++++++++++ addons/web/static/src/xml/base.xml | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index a8ccfcb3e46..1f1b5b8ef6f 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1628,6 +1628,11 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ } else { $("#" + self.cm_id + " .oe_m2o_menu_item_mandatory").addClass("oe-m2o-disabled-cm"); } + if (!self.readonly) { + $("#" + self.cm_id + " .oe_m2o_menu_item_noreadonly").removeClass("oe-m2o-disabled-cm"); + } else { + $("#" + self.cm_id + " .oe_m2o_menu_item_noreadonly").addClass("oe-m2o-disabled-cm"); + } return true; }, menuStyle: {width: "200px"} }); @@ -1647,6 +1652,8 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ } }); this.$drop_down.click(function() { + if (self.readonly) + return; if (self.$input.autocomplete("widget").is(":visible")) { self.$input.autocomplete("close"); } else { @@ -1853,6 +1860,10 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ }, focus: function () { this.$input.focus(); + }, + update_dom: function() { + this._super.apply(this, arguments); + this.$input.attr('disabled', this.readonly); } }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 95ad99726f8..c0007275ffa 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -854,8 +854,8 @@
    • Open...
    • -
    • Create...
    • -
    • Search...
    • +
    • Create...
    • +
    • Search...
    • From f097e140b8b51437258ae03000b37f1677f6098b Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Tue, 25 Oct 2011 00:54:31 +0200 Subject: [PATCH 94/96] [IMP] try session instead of openerp,db and we would rename Session into Connection bzr revid: al@openerp.com-20111024225431-g9eaqophnw3k8hh4 --- addons/web/static/src/js/views.js | 86 +++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index f402a51bf7e..b7a3d185bc1 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -2,21 +2,21 @@ * OpenERP web library *---------------------------------------------------------*/ -openerp.web.views = function(db) { +openerp.web.views = function(session) { -var _t = db.web._t; +var _t = session.web._t; /** * Registry for all the client actions key: tag value: widget */ -db.web.client_actions = new db.web.Registry(); +session.web.client_actions = new session.web.Registry(); /** * Registry for all the main views */ -db.web.views = new db.web.Registry(); +session.web.views = new session.web.Registry(); -db.web.ActionManager = db.web.Widget.extend({ +session.web.ActionManager = session.web.Widget.extend({ identifier_prefix: "actionmanager", init: function(parent) { this._super(parent); @@ -93,20 +93,20 @@ db.web.ActionManager = db.web.Widget.extend({ ir_actions_act_window: function (action, on_close) { if (action.target === 'new') { if (this.dialog == null) { - this.dialog = new db.web.Dialog(this, { title: action.name, width: '80%' }); + this.dialog = new session.web.Dialog(this, { title: action.name, width: '80%' }); if(on_close) this.dialog.on_close.add(on_close); this.dialog.start(); } else { this.dialog_viewmanager.stop(); } - this.dialog_viewmanager = new db.web.ViewManagerAction(this, action); + this.dialog_viewmanager = new session.web.ViewManagerAction(this, action); this.dialog_viewmanager.appendTo(this.dialog.$element); this.dialog.open(); } else { this.dialog_stop(); this.content_stop(); - this.inner_viewmanager = new db.web.ViewManagerAction(this, action); + this.inner_viewmanager = new session.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.url_update(action); } @@ -124,7 +124,7 @@ db.web.ActionManager = db.web.Widget.extend({ if (this.dialog && action.context) { var model = action.context.active_model; if (model === 'base.module.upgrade' || model === 'base.setup.installer' || model === 'base.module.upgrade') { - db.webclient.do_reload(); + session.webclient.do_reload(); } } this.dialog_stop(); @@ -140,7 +140,7 @@ db.web.ActionManager = db.web.Widget.extend({ }, ir_actions_client: function (action) { this.content_stop(); - var ClientWidget = db.web.client_actions.get_object(action.tag); + var ClientWidget = session.web.client_actions.get_object(action.tag); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this); }, ir_actions_report_xml: function(action) { @@ -164,12 +164,12 @@ db.web.ActionManager = db.web.Widget.extend({ } }); -db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ +session.web.ViewManager = session.web.Widget.extend(/** @lends session.web.ViewManager# */{ identifier_prefix: "viewmanager", template: "ViewManager", /** - * @constructs db.web.ViewManager - * @extends db.web.Widget + * @constructs session.web.ViewManager + * @extends session.web.Widget * * @param parent * @param dataset @@ -185,10 +185,10 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ this.views_src = _.map(views, function(x) {return x instanceof Array? {view_id: x[0], view_type: x[1]} : x;}); this.views = {}; this.flags = this.flags || {}; - this.registry = db.web.views; + this.registry = session.web.views; }, render: function() { - return db.web.qweb.render(this.template, { + return session.web.qweb.render(this.template, { self: this, prefix: this.element_id, views: this.views_src}); @@ -284,7 +284,7 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ if (this.searchview) { this.searchview.stop(); } - this.searchview = new db.web.SearchView( + this.searchview = new session.web.SearchView( this, this.dataset, view_id, search_defaults, this.flags.search_view === false); @@ -334,13 +334,13 @@ db.web.ViewManager = db.web.Widget.extend(/** @lends db.web.ViewManager# */{ on_action_executed: function () {} }); -db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.ViewManagerAction# */{ +session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepnerp.web.ViewManagerAction# */{ template:"ViewManagerAction", /** - * @constructs db.web.ViewManagerAction - * @extends db.web.ViewManager + * @constructs session.web.ViewManagerAction + * @extends session.web.ViewManager * - * @param {db.web.ActionManager} parent parent object/widget + * @param {session.web.ActionManager} parent parent object/widget * @param {Object} action descriptor for the action this viewmanager needs to manage its views. */ init: function(parent, action) { @@ -350,7 +350,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View this._super(parent, null, action.views); this.session = parent.session; this.action = action; - var dataset = new db.web.DataSetSearch(this, action.res_model, action.context, action.domain); + var dataset = new session.web.DataSetSearch(this, action.res_model, action.context, action.domain); if (action.res_id) { dataset.ids.push(action.res_id); dataset.index = 0; @@ -400,12 +400,12 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View this.$element.find('.oe_get_xml_view').click(function () { // TODO: add search view? - $('
      ').text(db.web.json_node_to_xml(
      +            $('
      ').text(session.web.json_node_to_xml(
                       self.views[self.active_view].controller.fields_view.arch, true))
                           .dialog({ width: '95%'});
               });
               if (this.action.help && !this.flags.low_profile) {
      -            var Users = new db.web.DataSet(self, 'res.users'),
      +            var Users = new session.web.DataSet(self, 'res.users'),
                       header = this.$element.find('.oe-view-manager-header');
                   header.delegate('blockquote button', 'click', function() {
                       var $this = $(this);
      @@ -451,7 +451,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
               var grandparent = this.widget_parent && this.widget_parent.widget_parent;
               // display shortcuts if on the first view for the action
               var $shortcut_toggle = this.$element.find('.oe-shortcut-toggle');
      -        if (!(grandparent instanceof db.web.WebClient) ||
      +        if (!(grandparent instanceof session.web.WebClient) ||
                   !(view.view_type === this.views_src[0].view_type
                       && view.view_id === this.views_src[0].view_id)) {
                   $shortcut_toggle.hide();
      @@ -488,7 +488,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
            * Intercept do_action resolution from children views
            */
           on_action_executed: function () {
      -        return new db.web.DataSet(this, 'res.log')
      +        return new session.web.DataSet(this, 'res.log')
                       .call('get', [], this.do_display_log);
           },
           /**
      @@ -515,7 +515,7 @@ db.web.ViewManagerAction = db.web.ViewManager.extend(/** @lends oepnerp.web.View
           }
       });
       
      -db.web.Sidebar = db.web.Widget.extend({
      +session.web.Sidebar = session.web.Widget.extend({
           init: function(parent, element_id) {
               this._super(parent, element_id);
               this.items = {};
      @@ -524,7 +524,7 @@ db.web.Sidebar = db.web.Widget.extend({
           start: function() {
               this._super(this);
               var self = this;
      -        this.$element.html(db.web.qweb.render('Sidebar'));
      +        this.$element.html(session.web.qweb.render('Sidebar'));
               this.$element.find(".toggle-sidebar").click(function(e) {
                   self.do_toggle();
               });
      @@ -601,7 +601,7 @@ db.web.Sidebar = db.web.Widget.extend({
       
               if(!$section) {
                   section_id = _.uniqueId(this.element_id + '_section_' + code + '_');
      -            var $section = $(db.web.qweb.render("Sidebar.section", {
      +            var $section = $(session.web.qweb.render("Sidebar.section", {
                       section_id: section_id,
                       name: name,
                       classname: 'oe_sidebar_' + code,
      @@ -633,7 +633,7 @@ db.web.Sidebar = db.web.Widget.extend({
                       this.items[items[i].element_id] = items[i];
                   }
       
      -            var $items = $(db.web.qweb.render("Sidebar.section.items", {items: items}));
      +            var $items = $(session.web.qweb.render("Sidebar.section.items", {items: items}));
       
                   $items.find('a.oe_sidebar_action_a').click(function() {
                       var item = self.items[$(this).attr('id')];
      @@ -687,7 +687,7 @@ db.web.Sidebar = db.web.Widget.extend({
           }
       });
       
      -db.web.TranslateDialog = db.web.Dialog.extend({
      +session.web.TranslateDialog = session.web.Dialog.extend({
           dialog_title: _t("Translations"),
           init: function(view) {
               // TODO fme: should add the language to fields_view_get because between the fields view get
      @@ -707,14 +707,14 @@ db.web.TranslateDialog = db.web.Dialog.extend({
               this.translatable_fields_keys = _.map(this.view.translatable_fields || [], function(i) { return i.name });
               this.languages = null;
               this.languages_loaded = $.Deferred();
      -        (new db.web.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(),
      +        (new session.web.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(),
                   [['translatable', '=', '1']])).read_slice(['code', 'name'], { sort: 'id' }, this.on_languages_loaded);
           },
           start: function() {
               var self = this;
               this._super();
               $.when(this.languages_loaded).then(function() {
      -            self.$element.html(db.web.qweb.render('TranslateDialog', { widget: self }));
      +            self.$element.html(session.web.qweb.render('TranslateDialog', { widget: self }));
                   self.$element.tabs();
                   if (!(self.view.translatable_fields && self.view.translatable_fields.length)) {
                       self.hide_tabs('fields');
      @@ -819,7 +819,7 @@ db.web.TranslateDialog = db.web.Dialog.extend({
           }
       });
       
      -db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
      +session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
           template: "EmptyComponent",
           set_default_options: function(options) {
               this.options = options || {};
      @@ -833,7 +833,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           },
           open_translate_dialog: function(field) {
               if (!this.translate_dialog) {
      -            this.translate_dialog = new db.web.TranslateDialog(this).start();
      +            this.translate_dialog = new session.web.TranslateDialog(this).start();
               }
               this.translate_dialog.open(field);
           },
      @@ -845,7 +845,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
            * @param {String} [action_data.special=null] special action handlers (currently: only ``'cancel'``)
            * @param {String} [action_data.type='workflow'] the action type, if present, one of ``'object'``, ``'action'`` or ``'workflow'``
            * @param {Object} [action_data.context=null] additional action context, to add to the current context
      -     * @param {db.web.DataSet} dataset a dataset object used to communicate with the server
      +     * @param {session.web.DataSet} dataset a dataset object used to communicate with the server
            * @param {Object} [record_id] the identifier of the object on which the action is to be applied
            * @param {Function} on_closed callback to execute when dialog is closed or when the action does not generate any result (no new action)
            */
      @@ -857,12 +857,12 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
                       return self.widget_parent.on_action_executed.apply(null, arguments);
                   }
               };
      -        var context = new db.web.CompoundContext(dataset.get_context(), action_data.context || {});
      +        var context = new session.web.CompoundContext(dataset.get_context(), action_data.context || {});
               
               var handler = function (r) {
                   var action = r.result;
                   if (action && action.constructor == Object) {
      -                var ncontext = new db.web.CompoundContext(context);
      +                var ncontext = new session.web.CompoundContext(context);
                       if (record_id) {
                           ncontext.add({
                               active_id: record_id,
      @@ -899,7 +899,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           /**
            * Directly set a view to use instead of calling fields_view_get. This method must
            * be called before start(). When an embedded view is set, underlying implementations
      -     * of db.web.View must use the provided view instead of any other one.
      +     * of session.web.View must use the provided view instead of any other one.
            *
            * @param embedded_view A view.
            */
      @@ -917,7 +917,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           },
           on_sidebar_manage_views: function() {
               if (this.fields_view && this.fields_view.arch) {
      -            $('' + db.web.json_node_to_xml(this.fields_view.arch, true) + '').dialog({ width: '95%', height: 600});
      +            $('' + session.web.json_node_to_xml(this.fields_view.arch, true) + '').dialog({ width: '95%', height: 600});
               } else {
                   this.do_warn("Manage Views", "Could not find current view declaration");
               }
      @@ -929,11 +929,11 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
               console.log('Todo');
           },
           on_sidebar_import: function() {
      -        var import_view = new db.web.DataImport(this, this.dataset);
      +        var import_view = new session.web.DataImport(this, this.dataset);
               import_view.start();
           },
           on_sidebar_export: function() {
      -        var export_view = new db.web.DataExport(this, this.dataset);
      +        var export_view = new session.web.DataExport(this, this.dataset);
               export_view.start();
           },
           on_sidebar_translate: function() {
      @@ -943,7 +943,7 @@ db.web.View = db.web.Widget.extend(/** @lends db.web.View# */{
           }
       });
       
      -db.web.json_node_to_xml = function(node, single_quote, indent) {
      +session.web.json_node_to_xml = function(node, single_quote, indent) {
           // For debugging purpose, this function will convert a json node back to xml
           // Maybe usefull for xml view editor
       
      @@ -972,7 +972,7 @@ db.web.json_node_to_xml = function(node, single_quote, indent) {
               r += '>\n';
               var childs = [];
               for (var i = 0, ii = node.children.length; i < ii; i++) {
      -            childs.push(db.web.json_node_to_xml(node.children[i], single_quote, indent + 1));
      +            childs.push(session.web.json_node_to_xml(node.children[i], single_quote, indent + 1));
               }
               r += childs.join('\n');
               r += '\n' + sindent + '';
      
      From 564e609abe600a326ccf7715617d11988db856fe Mon Sep 17 00:00:00 2001
      From: Fabien Meghazi 
      Date: Mon, 24 Oct 2011 17:30:29 +0200
      Subject: [PATCH 95/96] [IMP] Kanban: Groups order can be shuffled due to a
       race condition
      
      bzr revid: fme@openerp.com-20111024153029-yv9ezid4zn0lu7b6
      ---
       addons/web_kanban/static/src/js/kanban.js | 11 ++++++-----
       1 file changed, 6 insertions(+), 5 deletions(-)
      
      diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js
      index 82b085d9749..72df590fbf4 100644
      --- a/addons/web_kanban/static/src/js/kanban.js
      +++ b/addons/web_kanban/static/src/js/kanban.js
      @@ -446,8 +446,9 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
           },
           do_render_group : function (datagroups) {
               this.all_display_data = [];
      -        var self = this;
      -        _.each(datagroups, function (group) {
      +        var self = this,
      +            remaining = datagroups.length - 1;
      +        _.each(datagroups, function (group, index) {
                   var group_name = group.value;
                   var group_value = group.value;
                   if (!group.value) {
      @@ -462,10 +463,10 @@ openerp.web_kanban.KanbanView = openerp.web.View.extend({
                       group_aggregates[value] = group.aggregates[key];
                   });
                   var dataset = new openerp.web.DataSetSearch(self, self.dataset.model, group.context, group.domain);
      +            self.$element.find(".oe_kanban_view").remove();
                   dataset.read_slice(_.keys(self.fields_view.fields), {'domain': group.domain, 'context': group.context}, function(records) {
      -                self.all_display_data.push({"value" : group_value, "records": records, 'header':group_name, 'ids': dataset.ids, 'aggregates': group_aggregates});
      -                if (datagroups.length == self.all_display_data.length) {
      -                    self.$element.find(".oe_kanban_view").remove();
      +                self.all_display_data[index] = {"value" : group_value, "records" : records, 'header' : group_name, 'ids' : dataset.ids, 'aggregates' : group_aggregates};
      +                if (!remaining--) {
                           self.on_show_data();
                       }
                   });
      
      From 68adb9de7e729dd5bb62ca9bc60c584d02ec3563 Mon Sep 17 00:00:00 2001
      From: Launchpad Translations on behalf of openerp <>
      Date: Tue, 25 Oct 2011 04:53:15 +0000
      Subject: [PATCH 96/96] Launchpad automatic translations update.
      
      bzr revid: launchpad_translations_on_behalf_of_openerp-20111025045315-1mgz3k00tjs6iv7x
      ---
       addons/stock_location/i18n/es_CL.po       |  594 +++++++
       addons/stock_no_autopicking/i18n/es_CL.po |   83 +
       addons/stock_planning/i18n/es_CL.po       | 1861 +++++++++++++++++++++
       3 files changed, 2538 insertions(+)
       create mode 100644 addons/stock_location/i18n/es_CL.po
       create mode 100644 addons/stock_no_autopicking/i18n/es_CL.po
       create mode 100644 addons/stock_planning/i18n/es_CL.po
      
      diff --git a/addons/stock_location/i18n/es_CL.po b/addons/stock_location/i18n/es_CL.po
      new file mode 100644
      index 00000000000..b6b2b458f1a
      --- /dev/null
      +++ b/addons/stock_location/i18n/es_CL.po
      @@ -0,0 +1,594 @@
      +# Spanish (Chile) translation for openobject-addons
      +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
      +# This file is distributed under the same license as the openobject-addons package.
      +# FIRST AUTHOR , 2011.
      +#
      +msgid ""
      +msgstr ""
      +"Project-Id-Version: openobject-addons\n"
      +"Report-Msgid-Bugs-To: FULL NAME \n"
      +"POT-Creation-Date: 2011-01-11 11:16+0000\n"
      +"PO-Revision-Date: 2011-10-24 19:30+0000\n"
      +"Last-Translator: Francisco Reyes Acuña \n"
      +"Language-Team: Spanish (Chile) \n"
      +"MIME-Version: 1.0\n"
      +"Content-Type: text/plain; charset=UTF-8\n"
      +"Content-Transfer-Encoding: 8bit\n"
      +"X-Launchpad-Export-Date: 2011-10-25 04:53+0000\n"
      +"X-Generator: Launchpad (build 14185)\n"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,picking_type:0
      +#: selection:stock.location.path,picking_type:0
      +msgid "Sending Goods"
      +msgstr "Envío de mercancías"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Pulled Paths"
      +msgstr "Rutas arrastradas"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,type_proc:0
      +msgid "Move"
      +msgstr "Movimiento"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_stock_location_path
      +msgid "Pushed Flows"
      +msgstr "Flujos empujados"
      +
      +#. module: stock_location
      +#: selection:stock.location.path,auto:0
      +msgid "Automatic No Step Added"
      +msgstr "Movimiento automático, paso no añadido"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Parameters"
      +msgstr "Parámetros"
      +
      +#. module: stock_location
      +#: field:stock.location.path,location_from_id:0
      +msgid "Source Location"
      +msgstr "Ubicación de origen"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,cancel_cascade:0
      +msgid "Allow you to cancel moves related to the product pull flow"
      +msgstr ""
      +"Le permite cancelar movimientos relacionados con el flujo de arrastre de "
      +"producto."
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_product_pulled_flow
      +#: field:product.product,flow_pull_ids:0
      +msgid "Pulled Flows"
      +msgstr "Flujos arrastrados"
      +
      +#. module: stock_location
      +#: constraint:stock.move:0
      +msgid "You must assign a production lot for this product"
      +msgstr "Debe asignar un lote de producción para este producto"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,location_src_id:0
      +msgid "Location used by Destination Location to supply"
      +msgstr "Ubicación usada como destino al abastecer."
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,picking_type:0
      +#: selection:stock.location.path,picking_type:0
      +msgid "Internal"
      +msgstr "Interno"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:98
      +#, python-format
      +msgid ""
      +"Pulled procurement coming from original location %s, pull rule %s, via "
      +"original Procurement %s (#%d)"
      +msgstr ""
      +"Abastecimiento arrastrado proveniente de la ubicación original %s, regla de "
      +"arrastre %s, vía abastecimiento original %s (#%d)"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_stock_location
      +msgid "Location"
      +msgstr "Ubicación"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,invoice_state:0
      +#: field:stock.location.path,invoice_state:0
      +msgid "Invoice Status"
      +msgstr "Estado de facturación"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,name:0
      +msgid "This field will fill the packing Origin and the name of its moves"
      +msgstr ""
      +"Este campo rellenará el origen de la guiá de despacho y el nombre de sus "
      +"movimientos."
      +
      +#. module: stock_location
      +#: help:stock.location.path,auto:0
      +msgid ""
      +"This is used to define paths the product has to follow within the location "
      +"tree.\n"
      +"The 'Automatic Move' value will create a stock move after the current one "
      +"that will be validated automatically. With 'Manual Operation', the stock "
      +"move has to be validated by a worker. With 'Automatic No Step Added', the "
      +"location is replaced in the original move."
      +msgstr ""
      +"Se utiliza para definir rutas que el producto debe seguir dentro del árbol "
      +"de ubicaciones.\n"
      +"La opción 'Movimiento automático' creará un movimiento de stock después del "
      +"actual que se validará automáticamente. Con 'Operación manual', el "
      +"movimiento de stock debe ser validado por un trabajador. Con 'Automático "
      +"paso no añadido', la ubicación se reemplaza en el movimiento original."
      +
      +#. module: stock_location
      +#: model:ir.module.module,shortdesc:stock_location.module_meta_information
      +msgid "Warehouse Locations Paths"
      +msgstr "Rutas en las ubicaciones de almacén"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Conditions"
      +msgstr "Condiciones"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_pack_zone
      +msgid "Pack Zone"
      +msgstr "Zona de empaquetado"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_gate_b
      +msgid "Gate B"
      +msgstr "Puerta B"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_gate_a
      +msgid "Gate A"
      +msgstr "Puerta A"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,type_proc:0
      +msgid "Buy"
      +msgstr "Comprar"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Pushed flows"
      +msgstr "Flujos empujados"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_dispatch_zone
      +msgid "Dispatch Zone"
      +msgstr "Zona de despacho"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_stock_move
      +msgid "Stock Move"
      +msgstr "Movimiento de stock"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Pulled flows"
      +msgstr "Flujos arrastrados"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,company_id:0
      +#: field:stock.location.path,company_id:0
      +msgid "Company"
      +msgstr "Empresa"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Logistics Flows"
      +msgstr "Flujos de logística"
      +
      +#. module: stock_location
      +#: help:stock.move,cancel_cascade:0
      +msgid "If checked, when this move is cancelled, cancel the linked move too"
      +msgstr ""
      +"Si está marcado, cuando este movimiento se cancela, también cancela el "
      +"movimiento relacionado."
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,type_proc:0
      +msgid "Produce"
      +msgstr "Producir"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,procure_method:0
      +msgid "Make to Order"
      +msgstr "Obtener bajo pedido"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,procure_method:0
      +msgid "Make to Stock"
      +msgstr "Obtener para stock"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,partner_address_id:0
      +msgid "Partner Address"
      +msgstr "Dirección de empresa"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,invoice_state:0
      +#: selection:stock.location.path,invoice_state:0
      +msgid "To Be Invoiced"
      +msgstr "Para facturar"
      +
      +#. module: stock_location
      +#: help:stock.location.path,delay:0
      +msgid "Number of days to do this transition"
      +msgstr "Número de días para realizar esta transición"
      +
      +#. module: stock_location
      +#: model:ir.module.module,description:stock_location.module_meta_information
      +msgid ""
      +"\n"
      +"This module supplements the Warehouse application by adding support for per-"
      +"product\n"
      +"location paths, effectively implementing Push and Pull inventory flows.\n"
      +"\n"
      +"Typically this could be used to:\n"
      +"* Manage product manufacturing chains\n"
      +"* Manage default locations per product\n"
      +"* Define routes within your warehouse according to business needs, such as:\n"
      +"   - Quality Control\n"
      +"   - After Sales Services\n"
      +"   - Supplier Returns\n"
      +"* Help rental management, by generating automated return moves for rented "
      +"products\n"
      +"\n"
      +"Once this module is installed, an additional tab appear on the product form, "
      +"where you can add\n"
      +"Push and Pull flow specifications. The demo data of  CPU1 product for that "
      +"push/pull :\n"
      +"\n"
      +"Push flows\n"
      +"----------\n"
      +"Push flows are useful when the arrival of certain products in a given "
      +"location should always\n"
      +"be followed by a corresponding move to another location, optionally after a "
      +"certain delay.\n"
      +"The original Warehouse application already supports such Push flow "
      +"specifications on the\n"
      +"Locations themselves, but these cannot be refined per-product.\n"
      +"\n"
      +"A push flow specification indicates which location is chained with which "
      +"location, and with\n"
      +"what parameters. As soon as a given quantity of products is moved in the "
      +"source location,\n"
      +"a chained move is automatically foreseen according to the parameters set on "
      +"the flow specification\n"
      +"(destination location, delay, type of move, journal, etc.) The new move can "
      +"be automatically\n"
      +"processed, or require a manual confirmation, depending on the parameters.\n"
      +"\n"
      +"Pull flows\n"
      +"----------\n"
      +"Pull flows are a bit different from Pull flows, in the sense that they are "
      +"not related to\n"
      +"the processing of product moves, but rather to the processing of procurement "
      +"orders.\n"
      +"What is being pulled is a need, not directly products.\n"
      +"A classical example of Push flow is when you have an Outlet company, with a "
      +"parent Company\n"
      +"that is responsible for the supplies of the Outlet.\n"
      +"\n"
      +"  [ Customer ] <- A - [ Outlet ]  <- B -  [ Holding ] <~ C ~ [ Supplier ]\n"
      +"\n"
      +"When a new procurement order (A, coming from the confirmation of a Sale "
      +"Order for example) arrives\n"
      +"in the Outlet, it is converted into another procurement (B, via a Push flow "
      +"of type 'move')\n"
      +"requested from the Holding. When procurement order B is processed by the "
      +"Holding company, and\n"
      +"if the product is out of stock, it can be converted into a Purchase Order "
      +"(C) from the Supplier\n"
      +"(Push flow of type Purchase). The result is that the procurement order, the "
      +"need, is pushed\n"
      +"all the way between the Customer and Supplier.\n"
      +"\n"
      +"Technically, Pull flows allow to process procurement orders differently, not "
      +"only depending on\n"
      +"the product being considered, but also depending on which location holds the "
      +"\"need\" for that\n"
      +"product (i.e. the destination location of that procurement order).\n"
      +"\n"
      +"Use-Case\n"
      +"--------\n"
      +"\n"
      +"You can use the demo data as follow:\n"
      +"  CPU1: Sell some CPU1 from Shop 1 and run the scheduler\n"
      +"     - Warehouse: delivery order, Shop 1: reception\n"
      +"  CPU3:\n"
      +"     - When receiving the product, it goes to Quality Control location then "
      +"stored to shelf 2.\n"
      +"     - When delivering the customer: Pick List -> Packing -> Delivery Order "
      +"from Gate A\n"
      +"    "
      +msgstr ""
      +"\n"
      +"Este módulo complementa la aplicación Almacén, añadiendo soporte para cada "
      +"producto,\n"
      +"ruta de ubicación, aplicación efectiva de flujos de inventario de Entrada y "
      +"Salida.\n"
      +"\n"
      +"Normalmente, esto se podría utilizar para:\n"
      +"* Gestión de las cadenas de fabricación de productos\n"
      +"* Gestionar ubicaciones predeterminadas por producto\n"
      +"* Definir las rutas dentro de su almacén de acuerdo a las necesidades "
      +"empresariales, tales como:\n"
      +"   - Control de Calidad\n"
      +"   - Después de Servicios de Ventas\n"
      +"   - Proveedor Devoluciones\n"
      +"* Gestión de Ayuda a la rentabilidad, mediante la generación de movimientos "
      +"automáticos para productos alquilados\n"
      +"\n"
      +"Una vez que este módulo está instalado, aparecerá una ficha adicional en la "
      +"pestaña del producto, donde se puede añadir\n"
      +"las especificaciones del flujo de Entrada y de Salida. Los datos de "
      +"demostración del producto CPU1 para esos flujos de entrada/salida:\n"
      +"\n"
      +"Flujos de Entrada\n"
      +"----------\n"
      +"Los flujos de entrada son útiles cuando la llegada de determinados productos "
      +"a un lugar determinado siempre\n"
      +"va seguida de un movimiento que corresponde a otra ubicación, opcionalmente "
      +"después de un cierto retraso.\n"
      +"La aplicación Almacén original ya soporta tales especificaciones del flujo "
      +"de entrada en sus Ubicaciones, pero estas no pueden ser refinadas por "
      +"producto.\n"
      +"\n"
      +"Una especificación de flujo de entrada indica qué ubicación está encadenada "
      +"con qué ubicación, y con\n"
      +"qué parámetros. Tan pronto como una cantidad determinada de productos se "
      +"mueve de la ubicación de origen,\n"
      +"un movimiento encadenado de forma automática configurado de acuerdo con los "
      +"parámetros establecidos en la especificación del flujo\n"
      +"(lugar de destino, demora, tipo de movimiento, diarios, etc) se dispara. El "
      +"nuevo movimiento puede ser automáticamente\n"
      +"procesado, o requerir una confirmación manual, dependiendo de los "
      +"parámetros.\n"
      +"\n"
      +"Flujos de Salida\n"
      +"----------\n"
      +"Los flujos de salida son un poco diferentes de los flujos de entrada, en el "
      +"sentido de que no están relacionados con\n"
      +"la tramitación de movimientos de productos, sino más bien con el tratamiento "
      +"de los pedidos de venta.\n"
      +"Lo que se saca es una necesidad, no directamente los productos.\n"
      +"Un ejemplo clásico de flujo de salida es cuando usted tiene una empresa de "
      +"Outlet, con una empresa padre\n"
      +"que es la responsable de los suministros del Outlet.\n"
      +"\n"
      +"  [cliente] <- A - [Outlet] <- B - [Suministrador] <~ C ~ [Proveedor]\n"
      +"\n"
      +"Cuando una nueva orden de compra (A, procedente de la confirmación de una "
      +"orden de venta por ejemplo) llega al Outlet, se convierte en otra compra (B, "
      +"a través de un flujo de entrada del tipo 'mover')\n"
      +"solicitada desde el socio. Cuando el orden de compa para B es procesado por "
      +"la empresa socia, y\n"
      +"si el producto está agotado, puede convertirse en una Orden de Compra (C) "
      +"del Proveedor\n"
      +"(flujo de Entrada de tipo Compra). El resultado es que el orden de "
      +"adquisición, la necesidad, se traslada automáticamente del Cliente al "
      +"Proveedor.\n"
      +"\n"
      +"Técnicamente, los flujos de Salida permiten procesar los pedidos de "
      +"adquisición de otra manera, no sólo en función del producto considerado, "
      +"sino también en función de qué ubicación tiene la \"necesidad\" de qué\n"
      +"producto (es decir, la ubicación de destino de esa orden de compra).\n"
      +"\n"
      +"Caso de Uso\n"
      +"---------------\n"
      +"\n"
      +"Puede utilizar los datos de demostración de la siguiente manera:\n"
      +"  CPU1: Venta de algunas CPU1 en la tienda 1 y ejecutar el planificador\n"
      +"     - Almacén: órden de entrega, Tienda 1: Recepción\n"
      +"  CPU3:\n"
      +"     - Al recibir el producto, va al Control de Calidad y se almacena en la "
      +"plataforma 2.\n"
      +"     - Cuando se entrega al cliente: Lista de Selección -> Embalaje -> Orden "
      +"de Entrega desde la puerta A\n"
      +"    "
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,type_proc:0
      +msgid "Type of Procurement"
      +msgstr "Tipo de abastecimiento"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,company_id:0
      +msgid "Is used to know to which company belong packings and moves"
      +msgstr ""
      +"Se usa para saber a que compañía pertenece las guias de despacho y "
      +"movimientos."
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,name:0
      +msgid "Name"
      +msgstr "Nombre"
      +
      +#. module: stock_location
      +#: help:product.product,path_ids:0
      +msgid ""
      +"These rules set the right path of the product in the whole location tree."
      +msgstr ""
      +"Estas reglas fijan la ruta correcta del producto en todo el árbol de "
      +"ubicaciones."
      +
      +#. module: stock_location
      +#: selection:stock.location.path,auto:0
      +msgid "Manual Operation"
      +msgstr "Operación manual"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_product_product
      +#: field:product.pulled.flow,product_id:0
      +msgid "Product"
      +msgstr "Producto"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,procure_method:0
      +msgid "Procure Method"
      +msgstr "Método abastecimiento"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,picking_type:0
      +#: field:stock.location.path,picking_type:0
      +msgid "Shipping Type"
      +msgstr "Tipo de envío"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,procure_method:0
      +msgid ""
      +"'Make to Stock': When needed, take from the stock or wait until re-"
      +"supplying. 'Make to Order': When needed, purchase or produce for the "
      +"procurement request."
      +msgstr ""
      +"'Obtener para stock': Cuando sea necesario, coger del stock o esperar hasta "
      +"que sea reabastecido. 'Obtener bajo pedido': Cuando sea necesario, comprar o "
      +"producir para la petición de abastecimiento."
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,location_id:0
      +msgid "Is the destination location that needs supplying"
      +msgstr "Es la ubicación destino que necesita suministro."
      +
      +#. module: stock_location
      +#: field:stock.location.path,product_id:0
      +msgid "Products"
      +msgstr "Productos"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:118
      +#, python-format
      +msgid "Pulled from another location via procurement %d"
      +msgstr "Arrastrado desde otra ubicación vía abastecimiento %d"
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.stock_location_qualitytest0
      +msgid "Quality Control"
      +msgstr "Control de calidad"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,invoice_state:0
      +#: selection:stock.location.path,invoice_state:0
      +msgid "Not Applicable"
      +msgstr "No Aplicable"
      +
      +#. module: stock_location
      +#: field:stock.location.path,delay:0
      +msgid "Delay (days)"
      +msgstr "Retraso (días)"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:67
      +#, python-format
      +msgid ""
      +"Picking for pulled procurement coming from original location %s, pull rule "
      +"%s, via original Procurement %s (#%d)"
      +msgstr ""
      +"Guía de despacho para abastecimiento arrastrado proveniente de la ubicación "
      +"original %s, regla de arrastre %s, vía abastecimiento original %s (#%d)"
      +
      +#. module: stock_location
      +#: field:product.product,path_ids:0
      +msgid "Pushed Flow"
      +msgstr "Flujo empujado"
      +
      +#. module: stock_location
      +#: code:addons/stock_location/procurement_pull.py:89
      +#, python-format
      +msgid ""
      +"Move for pulled procurement coming from original location %s, pull rule %s, "
      +"via original Procurement %s (#%d)"
      +msgstr ""
      +"Movimiento para abastecimiento arrastrado proveniente de la ubicación "
      +"original %s, regla de arrastre %s, vía abastecimiento original %s (#%d)"
      +
      +#. module: stock_location
      +#: constraint:stock.move:0
      +msgid "You try to assign a lot which is not from the same product"
      +msgstr "Está intentando asignar un lote que no es del mismo producto"
      +
      +#. module: stock_location
      +#: model:ir.model,name:stock_location.model_procurement_order
      +msgid "Procurement"
      +msgstr "Abastecimiento"
      +
      +#. module: stock_location
      +#: field:stock.location.path,location_dest_id:0
      +msgid "Destination Location"
      +msgstr "Ubicación de destino"
      +
      +#. module: stock_location
      +#: field:stock.location.path,auto:0
      +#: selection:stock.location.path,auto:0
      +msgid "Automatic Move"
      +msgstr "Movimiento automático"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,picking_type:0
      +#: selection:stock.location.path,picking_type:0
      +msgid "Getting Goods"
      +msgstr "Recepción mercancías"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +msgid "Action Type"
      +msgstr "Tipo de acción"
      +
      +#. module: stock_location
      +#: constraint:product.product:0
      +msgid "Error: Invalid ean code"
      +msgstr "Error: Código EAN no válido"
      +
      +#. module: stock_location
      +#: help:product.pulled.flow,picking_type:0
      +#: help:stock.location.path,picking_type:0
      +msgid ""
      +"Depending on the company, choose whatever you want to receive or send "
      +"products"
      +msgstr "Según la compañía, seleccionar si desea recibir o enviar productos."
      +
      +#. module: stock_location
      +#: model:stock.location,name:stock_location.location_order
      +msgid "Order Processing"
      +msgstr "Procesando pedido"
      +
      +#. module: stock_location
      +#: field:stock.location.path,name:0
      +msgid "Operation"
      +msgstr "Operación"
      +
      +#. module: stock_location
      +#: view:product.product:0
      +#: field:product.product,path_ids:0
      +#: view:stock.location.path:0
      +msgid "Location Paths"
      +msgstr "Rutas de ubicaciones"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,journal_id:0
      +#: field:stock.location.path,journal_id:0
      +msgid "Journal"
      +msgstr "Diario"
      +
      +#. module: stock_location
      +#: field:product.pulled.flow,cancel_cascade:0
      +#: field:stock.move,cancel_cascade:0
      +msgid "Cancel Cascade"
      +msgstr "Cancelar cascada"
      +
      +#. module: stock_location
      +#: selection:product.pulled.flow,invoice_state:0
      +#: selection:stock.location.path,invoice_state:0
      +msgid "Invoiced"
      +msgstr "Facturado"
      diff --git a/addons/stock_no_autopicking/i18n/es_CL.po b/addons/stock_no_autopicking/i18n/es_CL.po
      new file mode 100644
      index 00000000000..98a3c002c30
      --- /dev/null
      +++ b/addons/stock_no_autopicking/i18n/es_CL.po
      @@ -0,0 +1,83 @@
      +# Spanish (Chile) translation for openobject-addons
      +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
      +# This file is distributed under the same license as the openobject-addons package.
      +# FIRST AUTHOR , 2011.
      +#
      +msgid ""
      +msgstr ""
      +"Project-Id-Version: openobject-addons\n"
      +"Report-Msgid-Bugs-To: FULL NAME \n"
      +"POT-Creation-Date: 2011-01-03 16:58+0000\n"
      +"PO-Revision-Date: 2011-10-24 19:35+0000\n"
      +"Last-Translator: Francisco Reyes Acuña \n"
      +"Language-Team: Spanish (Chile) \n"
      +"MIME-Version: 1.0\n"
      +"Content-Type: text/plain; charset=UTF-8\n"
      +"Content-Transfer-Encoding: 8bit\n"
      +"X-Launchpad-Export-Date: 2011-10-25 04:53+0000\n"
      +"X-Generator: Launchpad (build 14185)\n"
      +
      +#. module: stock_no_autopicking
      +#: model:ir.model,name:stock_no_autopicking.model_product_product
      +msgid "Product"
      +msgstr "Producto"
      +
      +#. module: stock_no_autopicking
      +#: model:ir.module.module,description:stock_no_autopicking.module_meta_information
      +msgid ""
      +"\n"
      +"    This module allows an intermediate picking process to provide raw "
      +"materials\n"
      +"    to production orders.\n"
      +"\n"
      +"    One example of usage of this module is to manage production made by "
      +"your\n"
      +"    suppliers (sub-contracting). To achieve this, set the assembled product\n"
      +"    which is sub-contracted to \"No Auto-Picking\" and put the location of "
      +"the\n"
      +"    supplier in the routing of the assembly operation.\n"
      +"    "
      +msgstr ""
      +"\n"
      +"    Este módulo permite un proceso de recogida intermedio para proveer "
      +"materias\n"
      +"    primas a las órdenes de fabricación.\n"
      +"\n"
      +"    Un ejemplo de uso de este módulo es gestionar la producción realizada "
      +"por sus\n"
      +"    proveedores (subcontratación). Para conseguir esto, establezca los "
      +"productos ensamblados\n"
      +"    que serán subcontratados a \"No Auto-Recogida\" y establezca la "
      +"ubicación del nuevo\n"
      +"    proveedor en el proceso de la operación de ensamblado.\n"
      +"    "
      +
      +#. module: stock_no_autopicking
      +#: model:ir.model,name:stock_no_autopicking.model_mrp_production
      +msgid "Manufacturing Order"
      +msgstr "Orden de fabricación"
      +
      +#. module: stock_no_autopicking
      +#: field:product.product,auto_pick:0
      +msgid "Auto Picking"
      +msgstr "Auto empaquetado"
      +
      +#. module: stock_no_autopicking
      +#: help:product.product,auto_pick:0
      +msgid "Auto picking for raw materials of production orders."
      +msgstr "Auto empaquetado para materiales a granel en órdenes de producción."
      +
      +#. module: stock_no_autopicking
      +#: constraint:product.product:0
      +msgid "Error: Invalid ean code"
      +msgstr "Error: Código EAN no válido"
      +
      +#. module: stock_no_autopicking
      +#: model:ir.module.module,shortdesc:stock_no_autopicking.module_meta_information
      +msgid "Stock No Auto-Picking"
      +msgstr "Stock no auto empaquetado"
      +
      +#. module: stock_no_autopicking
      +#: constraint:mrp.production:0
      +msgid "Order quantity cannot be negative or zero !"
      +msgstr "¡La cantidad ordenada no puede ser negativa o cero!"
      diff --git a/addons/stock_planning/i18n/es_CL.po b/addons/stock_planning/i18n/es_CL.po
      new file mode 100644
      index 00000000000..9e876116a3a
      --- /dev/null
      +++ b/addons/stock_planning/i18n/es_CL.po
      @@ -0,0 +1,1861 @@
      +# Spanish (Chile) translation for openobject-addons
      +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011
      +# This file is distributed under the same license as the openobject-addons package.
      +# FIRST AUTHOR , 2011.
      +#
      +msgid ""
      +msgstr ""
      +"Project-Id-Version: openobject-addons\n"
      +"Report-Msgid-Bugs-To: FULL NAME \n"
      +"POT-Creation-Date: 2011-01-11 11:16+0000\n"
      +"PO-Revision-Date: 2011-10-24 20:18+0000\n"
      +"Last-Translator: Francisco Reyes Acuña \n"
      +"Language-Team: Spanish (Chile) \n"
      +"MIME-Version: 1.0\n"
      +"Content-Type: text/plain; charset=UTF-8\n"
      +"Content-Transfer-Encoding: 8bit\n"
      +"X-Launchpad-Export-Date: 2011-10-25 04:53+0000\n"
      +"X-Generator: Launchpad (build 14185)\n"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73
      +#, python-format
      +msgid ""
      +"No forecasts for selected period or no products in selected category !"
      +msgstr ""
      +"¡No hay previsiones para el periodo seleccionado o no hay productos en la "
      +"categoría seleccionada!"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_only:0
      +msgid ""
      +"Check to calculate stock location of selected warehouse only. If not "
      +"selected calculation is made for input, stock and output location of "
      +"warehouse."
      +msgstr ""
      +"Marque esta opción para calcular el stock sólo de la ubicación stock del "
      +"almacén seleccionado. Si no se marca, el cálculo se realiza para las "
      +"ubicaciones de entrada, stock y salida del almacén."
      +
      +#. module: stock_planning
      +#: field:stock.planning,maximum_op:0
      +msgid "Maximum Rule"
      +msgstr "Regla máximo"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_company:0
      +msgid "This Copmany Period1"
      +msgstr "Esta compañía período1"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: view:stock.sale.forecast:0
      +msgid "Group By..."
      +msgstr "Agrupar por..."
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,product_amt:0
      +msgid ""
      +"Forecast value which will be converted to Product Quantity according to "
      +"prices."
      +msgstr ""
      +"Valor de la previsión que será convertido en cantidad de producto en función "
      +"de precios."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:621
      +#: code:addons/stock_planning/stock_planning.py:663
      +#, python-format
      +msgid "Incoming Left must be greater than 0 !"
      +msgstr "¡Entradas restantes debe ser mayor que 0!"
      +
      +#. module: stock_planning
      +#: help:stock.planning,outgoing_before:0
      +msgid ""
      +"Planned Out in periods before calculated. Between start date of current "
      +"period and one day before start of calculated period."
      +msgstr ""
      +"Salidas planificadas en periodos anteriores al calculado. Entre la fecha de "
      +"inicio del periodo actual y un día antes del comienzo del periodo calculado."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60
      +#, python-format
      +msgid "No products in selected category !"
      +msgstr "¡No hay productos en la categoría seleccionada!"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,warehouse_id:0
      +msgid ""
      +"Warehouse which forecasts will concern. If during stock planning you will "
      +"need sales forecast for all warehouses choose any warehouse now."
      +msgstr ""
      +"Almacén al que conciernen las previsiones. Si durante la planificación de "
      +"stock necesita previsiones de ventas para todos los almacenes escoja ahora "
      +"un almacén cualquiera."
      +
      +#. module: stock_planning
      +#: field:stock.planning,outgoing_left:0
      +msgid "Expected Out"
      +msgstr "Salidas previstas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid " "
      +msgstr " "
      +
      +#. module: stock_planning
      +#: field:stock.planning,incoming_left:0
      +msgid "Incoming Left"
      +msgstr "Entradas restantes"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Requisition history"
      +msgstr "Historial demandas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Create Forecasts Lines"
      +msgstr "Crear líneas de previsiones"
      +
      +#. module: stock_planning
      +#: help:stock.planning,outgoing:0
      +msgid "Quantity of all confirmed outgoing moves in calculated Period."
      +msgstr "Cantidades de todas las salidas confirmadas en el periodo calculado."
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create Daily Periods"
      +msgstr "Crear periodos diarios"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: field:stock.planning,company_id:0
      +#: field:stock.planning.createlines,company_id:0
      +#: view:stock.sale.forecast:0
      +#: field:stock.sale.forecast,company_id:0
      +#: field:stock.sale.forecast.createlines,company_id:0
      +msgid "Company"
      +msgstr "Compañía"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:640
      +#: code:addons/stock_planning/stock_planning.py:682
      +#, python-format
      +msgid ""
      +"\n"
      +" Initial Stock: "
      +msgstr ""
      +"\n"
      +" Stock inicial: "
      +
      +#. module: stock_planning
      +#: help:stock.planning,warehouse_forecast:0
      +msgid ""
      +"All sales forecasts for selected Warehouse of selected Product during "
      +"selected Period."
      +msgstr ""
      +"Todas las previsiones de ventas para el almacén seleccionado del producto "
      +"seleccionado durante el periodo seleccionado."
      +
      +#. module: stock_planning
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_creatlines
      +msgid "Create Stock and Sales Periods"
      +msgstr "Crear periodos de stock y ventas"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Minimum Stock Rule Indicators"
      +msgstr "Indicadores de reglas de stock mínimo"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,period_id:0
      +msgid "Period which forecasts will concern."
      +msgstr "Periodo al que conciernen las previsiones."
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_only:0
      +msgid "Stock Location Only"
      +msgstr "Sólo ubicaciones de stock"
      +
      +#. module: stock_planning
      +#: help:stock.planning,already_out:0
      +msgid ""
      +"Quantity which is already dispatched out of this warehouse in current period."
      +msgstr ""
      +"Cantidades que ya se enviaron fuera de este almacén en el período actual."
      +
      +#. module: stock_planning
      +#: help:stock.planning,procure_to_stock:0
      +msgid ""
      +"Chect to make procurement to stock location of selected warehouse. If not "
      +"selected procurement will be made into input location of warehouse."
      +msgstr ""
      +"Marque esta opción para realizar los abastecimientos en la ubicación stock "
      +"del almacén seleccionado. Si no se marca, el abastecimiento se realizará en "
      +"la ubicación de entrada del almacén."
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Current Period Situation"
      +msgstr "Situación del periodo actual"
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create Monthly Periods"
      +msgstr "Crear períodos mensuales"
      +
      +#. module: stock_planning
      +#: help:stock.planning,supply_warehouse_id:0
      +msgid ""
      +"Warehouse used as source in supply pick move created by 'Supply from Another "
      +"Warhouse'."
      +msgstr ""
      +"Almacén usado como origen en el movimiento de suministro creado por "
      +"'Suministrar desde otro almacén'."
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_period_createlines
      +msgid "stock.period.createlines"
      +msgstr "stock.periodo.crearlíneas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,outgoing_before:0
      +msgid "Planned Out Before"
      +msgstr "Salidas planificadas antes"
      +
      +#. module: stock_planning
      +#: field:stock.planning.createlines,forecasted_products:0
      +msgid "All Products with Forecast"
      +msgstr "Todos los productos con previsión"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Periods :"
      +msgstr "Periodos :"
      +
      +#. module: stock_planning
      +#: help:stock.planning,already_in:0
      +msgid ""
      +"Quantity which is already picked up to this warehouse in current period."
      +msgstr ""
      +"Cantidades que ya han sido recogidas en este almacén en el periodo actual."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:644
      +#: code:addons/stock_planning/stock_planning.py:686
      +#, python-format
      +msgid "    Confirmed In Before: "
      +msgstr "    Entradas confirmadas antes: "
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Stock and Sales Forecast"
      +msgstr "Previsiones de stock y ventas"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_sale_forecast
      +msgid "stock.sale.forecast"
      +msgstr "stock.ventas.prevision"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_dept_id:0
      +msgid "This Department"
      +msgstr "Este departamento"
      +
      +#. module: stock_planning
      +#: field:stock.planning,to_procure:0
      +msgid "Planned In"
      +msgstr "Entradas planificadas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_simulation:0
      +msgid "Stock Simulation"
      +msgstr "Simulación de stock"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_planning_createlines
      +msgid "stock.planning.createlines"
      +msgstr "stock.planificación.crearlíneas"
      +
      +#. module: stock_planning
      +#: help:stock.planning,incoming_before:0
      +msgid ""
      +"Confirmed incoming in periods before calculated (Including Already In). "
      +"Between start date of current period and one day before start of calculated "
      +"period."
      +msgstr ""
      +"Entradas confirmadas en periodos anteriores al calculado (incluyendo las "
      +"entradas realizadas). Entre la fecha de inicio del periodo actual y un día "
      +"antes del comienzo del periodo calculado."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Search  Sales Forecast"
      +msgstr "Buscar previsiones de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_user:0
      +msgid "This User Period5"
      +msgstr "El periodo de este usuario5"
      +
      +#. module: stock_planning
      +#: help:stock.planning,history:0
      +msgid "History of procurement or internal supply of this planning line."
      +msgstr ""
      +"Historial de abastecimiento o suministro interno de esta línea de "
      +"planificación."
      +
      +#. module: stock_planning
      +#: help:stock.planning,company_forecast:0
      +msgid ""
      +"All sales forecasts for whole company (for all Warehouses) of selected "
      +"Product during selected Period."
      +msgstr ""
      +"Todas las previsiones para la compañía entera (para todos los almacenes) del "
      +"producto seleccionado durante el periodo seleccionado."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_user:0
      +msgid "This User Period1"
      +msgstr "El periodo de este usuario1"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_user:0
      +msgid "This User Period3"
      +msgstr "El periodo de este usuario3"
      +
      +#. module: stock_planning
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_main
      +#: view:stock.planning:0
      +msgid "Stock Planning"
      +msgstr "Planificación de stock"
      +
      +#. module: stock_planning
      +#: field:stock.planning,minimum_op:0
      +msgid "Minimum Rule"
      +msgstr "Regla de mínimos"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Procure Incoming Left"
      +msgstr "Entradas abastecimiento restante"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:646
      +#: code:addons/stock_planning/stock_planning.py:688
      +#, python-format
      +msgid "    Incoming Left: "
      +msgstr "    Entradas restante: "
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:719
      +#, python-format
      +msgid "%s Pick List %s (%s,  %s) %s %s \n"
      +msgstr "%s Lista de selección %s (%s, %s) %s %s \n"
      +
      +#. module: stock_planning
      +#: view:stock.planning.createlines:0
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Create"
      +msgstr "Crear"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_planning_form
      +#: model:ir.module.module,shortdesc:stock_planning.module_meta_information
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning
      +#: view:stock.planning:0
      +msgid "Master Procurement Schedule"
      +msgstr "Plan maestro de abastecimiento"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:636
      +#: code:addons/stock_planning/stock_planning.py:678
      +#, python-format
      +msgid "  Creation Date: "
      +msgstr "  Fecha de creación: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,period_id:0
      +#: field:stock.planning.createlines,period_id:0
      +#: field:stock.sale.forecast,period_id:0
      +#: field:stock.sale.forecast.createlines,period_id:0
      +msgid "Period"
      +msgstr "Período"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +#: field:stock.period,state:0
      +#: field:stock.planning,state:0
      +#: field:stock.sale.forecast,state:0
      +msgid "State"
      +msgstr "Estado"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,product_categ_id:0
      +msgid "Product Category of products which created forecasts will concern."
      +msgstr "Categoría de los productos cuyas previsiones se crearán."
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_period
      +msgid "stock period"
      +msgstr "periodo stock"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_sale_forecast_createlines
      +msgid "stock.sale.forecast.createlines"
      +msgstr "stock.venta.previsión.crearlíneas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,warehouse_id:0
      +#: field:stock.planning.createlines,warehouse_id:0
      +#: field:stock.sale.forecast,warehouse_id:0
      +#: field:stock.sale.forecast.createlines,warehouse_id:0
      +msgid "Warehouse"
      +msgstr "Almacén"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_simulation:0
      +msgid ""
      +"Stock simulation at the end of selected Period.\n"
      +" For current period it is: \n"
      +"Initial Stock - Already Out + Already In - Expected Out + Incoming Left.\n"
      +"For periods ahead it is: \n"
      +"Initial Stock - Planned Out Before + Incoming Before - Planned Out + Planned "
      +"In."
      +msgstr ""
      +"Simulación de stock al final del período seleccionado.\n"
      +" Para el periodo actual es: \n"
      +"Stock inicial – salidas + entradas – salidas previstas + entradas "
      +"esperadas.\n"
      +" Para los siguientes periodos es: \n"
      +"Stock inicial – salidas previstas anteriores + entradas anteriores – salidas "
      +"previstas + entradas previstas."
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,analyze_company:0
      +msgid "Check this box to see the sales for whole company."
      +msgstr "Seleccione esta casilla para ver las ventas de todda la compañía."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,name:0
      +msgid "Name"
      +msgstr "Nombre"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Search Stock Planning"
      +msgstr "Buscar planificación de stock"
      +
      +#. module: stock_planning
      +#: field:stock.planning,incoming_before:0
      +msgid "Incoming Before"
      +msgstr "Entradas antes"
      +
      +#. module: stock_planning
      +#: field:stock.planning.createlines,product_categ_id:0
      +#: field:stock.sale.forecast.createlines,product_categ_id:0
      +msgid "Product Category"
      +msgstr "Categoría del producto"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:621
      +#: code:addons/stock_planning/stock_planning.py:663
      +#: code:addons/stock_planning/stock_planning.py:665
      +#: code:addons/stock_planning/stock_planning.py:667
      +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73
      +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60
      +#, python-format
      +msgid "Error !"
      +msgstr "¡ Error !"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:626
      +#, python-format
      +msgid "Manual planning for %s"
      +msgstr "Manual para la planificación de %s"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_user_id:0
      +msgid "This User"
      +msgstr "Este usuario"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:643
      +#: code:addons/stock_planning/stock_planning.py:685
      +#, python-format
      +msgid ""
      +"\n"
      +" Confirmed Out: "
      +msgstr ""
      +"\n"
      +" Salidas confirmadas: "
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Forecasts"
      +msgstr "Previsiones"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Supply from Another Warehouse"
      +msgstr "Abastecer desde otro almacén"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Calculate Planning"
      +msgstr "Calcular planificación"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:636
      +#, python-format
      +msgid ""
      +" Procurement created in MPS by user: %s   Creation Date: %s                  "
      +"                       \n"
      +" For period: %s                                         \n"
      +" according to state:                                         \n"
      +" Warehouse Forecast: %s                                         \n"
      +" Initial Stock: %s                                         \n"
      +" Planned Out: %s    Planned In: %s                                         \n"
      +" Already Out: %s    Already In: %s                                         \n"
      +" Confirmed Out: %s    Confirmed In: %s                                       "
      +"  \n"
      +" Planned Out Before: %s    Confirmed In Before: %s                           "
      +"              \n"
      +" Expected Out: %s    Incoming Left: %s                                       "
      +"  \n"
      +" Stock Simulation: %s    Minimum stock: %s"
      +msgstr ""
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:140
      +#, python-format
      +msgid "Invalid action !"
      +msgstr "¡Acción no válida!"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_start:0
      +msgid "Stock quantity one day before current period."
      +msgstr "Cantidad stock un día antes del periodo actual."
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create Weekly Periods"
      +msgstr "Crear periodos semanales"
      +
      +#. module: stock_planning
      +#: help:stock.planning,maximum_op:0
      +msgid "Maximum quantity set in Minimum Stock Rules for this Warhouse"
      +msgstr ""
      +"Cantidad máxima establecida en las reglas de stock mínimo para este almacén."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:665
      +#, python-format
      +msgid "You must specify a Source Warehouse !"
      +msgstr "¡Debe especificar un almacén de origen!"
      +
      +#. module: stock_planning
      +#: view:stock.planning.createlines:0
      +msgid "Creates planning lines for selected period and warehouse."
      +msgstr ""
      +"Crea líneas de planificación para el periodo y almacén seleccionados."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_user:0
      +msgid "This User Period4"
      +msgstr "Este periodo de usuario4"
      +
      +#. module: stock_planning
      +#: view:stock.planning.createlines:0
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Note: Doesn't duplicate existing lines created by you."
      +msgstr "Nota: No duplica las líneas creadas por usted."
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +msgid "Stock and Sales Period"
      +msgstr "Periodo de stock y ventas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,company_forecast:0
      +msgid "Company Forecast"
      +msgstr "Previsión de la compañía"
      +
      +#. module: stock_planning
      +#: help:stock.planning,product_uom:0
      +#: help:stock.sale.forecast,product_uom:0
      +msgid ""
      +"Unit of Measure used to show the quanities of stock calculation.You can use "
      +"units form default category or from second category (UoS category)."
      +msgstr ""
      +"Unidad de medida utilizada para mostrar las cantidades calculadas de stock. "
      +"Puede utilizar las unidades de la categoría por defecto o las de la segunda "
      +"categoría (categoría UdV)."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Per User :"
      +msgstr "Por usuario :"
      +
      +#. module: stock_planning
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_all
      +#: view:stock.sale.forecast:0
      +msgid "Sales Forecasts"
      +msgstr "Previsiones de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.period,name:0
      +#: field:stock.period.createlines,name:0
      +msgid "Period Name"
      +msgstr "Nombre del período"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,user_id:0
      +msgid "Created/Validated by"
      +msgstr "Creado/Validado por"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Internal Supply"
      +msgstr "Suministro interno"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_company:0
      +msgid "This Company Period4"
      +msgstr "El periodo de esta compañía4"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_company:0
      +msgid "This Company Period5"
      +msgstr "El periodo de esta compañía5"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_company:0
      +msgid "This Company Period2"
      +msgstr "El periodo de esta compañía2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_company:0
      +msgid "This Company Period3"
      +msgstr "El periodo de esta compañía3"
      +
      +#. module: stock_planning
      +#: field:stock.period,date_start:0
      +#: field:stock.period.createlines,date_start:0
      +msgid "Start Date"
      +msgstr "Fecha de inicio"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:642
      +#: code:addons/stock_planning/stock_planning.py:684
      +#, python-format
      +msgid ""
      +"\n"
      +" Already Out: "
      +msgstr ""
      +"\n"
      +" Salidas realizadas: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,confirmed_forecasts_only:0
      +msgid "Validated Forecasts"
      +msgstr "Previsiones validadas"
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,product_categ_id:0
      +msgid ""
      +"Planning will be created for products from Product Category selected by this "
      +"field. This field is ignored when you check \"All Forecasted Product\" box."
      +msgstr ""
      +"Se creará la planificación para los productos de la categoría de productos "
      +"seleccionada con este campo. Este campo se ignora cuando se marca la opción "
      +"\"Todas las previsiones de productos”."
      +
      +#. module: stock_planning
      +#: field:stock.planning,planned_outgoing:0
      +msgid "Planned Out"
      +msgstr "Salidas planificadas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Per Department :"
      +msgstr "Por departamento:"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Forecast"
      +msgstr "Previsión"
      +
      +#. module: stock_planning
      +#: selection:stock.period,state:0
      +#: selection:stock.planning,state:0
      +#: selection:stock.sale.forecast,state:0
      +msgid "Draft"
      +msgstr "Borrador"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +msgid "Closed"
      +msgstr "Cerrada"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: view:stock.sale.forecast:0
      +msgid "Warehouse "
      +msgstr "Almacén "
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:646
      +#: code:addons/stock_planning/stock_planning.py:688
      +#, python-format
      +msgid ""
      +"\n"
      +" Expected Out: "
      +msgstr ""
      +"\n"
      +" Salidas previstas: "
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Create periods for Stock and Sales Planning"
      +msgstr "Crear periodos para planificación de stock y ventas"
      +
      +#. module: stock_planning
      +#: help:stock.planning,planned_outgoing:0
      +msgid ""
      +"Enter planned outgoing quantity from selected Warehouse during the selected "
      +"Period of selected Product. To plan this value look at Confirmed Out or "
      +"Sales Forecasts. This value should be equal or greater than Confirmed Out."
      +msgstr ""
      +"Introduzca la cantidad saliente planificada para el almacén seleccionado "
      +"durante el periodo seleccionado y para el producto seleccionado. Para "
      +"planificar este valor puede fijarse en las salidas confirmadas o las "
      +"previsiones de ventas. Este valor debería ser igual o superior a las salidas "
      +"confirmadas."
      +
      +#. module: stock_planning
      +#: model:ir.module.module,description:stock_planning.module_meta_information
      +msgid ""
      +"\n"
      +"This module is based on original OpenERP SA module stock_planning version "
      +"1.0 of the same name Master Procurement Schedule.\n"
      +"\n"
      +"Purpose of MPS is to allow create a manual procurement (requisition) apart "
      +"of MRP scheduler (which works automatically on minimum stock rules).\n"
      +"\n"
      +"Terms used in the module:\n"
      +"- Stock and Sales Period - is the time (between Start Date and End Date) for "
      +"which you plan Stock and Sales Forecast and make Procurement Planning. \n"
      +"- Stock and Sales Forecast - is the quantity of products you plan to sell in "
      +"the Period.\n"
      +"- Stock Planning - is the quantity of products you plan to purchase or "
      +"produce for the Period.\n"
      +"\n"
      +"Because we have another module sale_forecast which uses terms \"Sales "
      +"Forecast\" and \"Planning\" as amount values we will use terms \"Stock and "
      +"Sales Forecast\" and \"Stock Planning\" to emphasize that we use quantity "
      +"values. \n"
      +"\n"
      +"Activity with this module is divided to three steps:\n"
      +"- Creating Periods. Mandatory step.\n"
      +"- Creating Sale Forecasts and entering quantities to them. Optional step but "
      +"useful for further planning.\n"
      +"- Creating Planning lines, entering quantities to them and making "
      +"Procurement. Making procurement is the final step for the Period.\n"
      +"\n"
      +"Periods\n"
      +"=======\n"
      +"You have two menu items for Periods in \"Sales Management - Configuration\". "
      +"There are:\n"
      +"- \"Create Sales Periods\" - Which automates creating daily, weekly or "
      +"monthly periods.\n"
      +"- \"Stock and sales Periods\" - Which allows to create any type of periods, "
      +"change the dates and change the State of period.\n"
      +"\n"
      +"Creating periods is the first step you have to do to use modules features. "
      +"You can create custom periods using \"New\" button in \"Stock and Sales "
      +"Periods\" form or view but it is recommended to use automating tool.\n"
      +"\n"
      +"Remarks:\n"
      +"- These periods (officially Stock and Sales Periods) are separated of "
      +"Financial or other periods in the system.\n"
      +"- Periods are not assigned to companies (when you use multicompany feature "
      +"at all). Module suppose that you use the same periods across companies. If "
      +"you wish to use different periods for different companies define them as you "
      +"wish (they can overlap). Later on in this text will be indications how to "
      +"use such periods.\n"
      +"- When periods are created automatically their start and finish dates are "
      +"with start hour 00:00:00 and end hour 23:59:00. Fe. when you create daily "
      +"periods they will have start date 31.01.2010 00:00:00 and end date "
      +"31.01.2010 23:59:00. It works only in automatic creation of periods. When "
      +"you create periods manually you have to take care about hours because you "
      +"can have incorrect values form sales or stock. \n"
      +"- If you use overlapping periods for the same product, warehouse and company "
      +"results can be unpredictable.\n"
      +"- If current date doesn't belong to any period or you have holes between "
      +"periods results can be unpredictable.\n"
      +"\n"
      +"Sales Forecasts\n"
      +"===============\n"
      +"You have few menus for Sales forecast in \"Sales Management - Sales "
      +"Forecasts\".\n"
      +"- \"Create Sales Forecasts for Sales Periods\" - which automates creating "
      +"forecasts lines according to some parameters.\n"
      +"- \"Sales Forecasts\" - few menus for working with forecasts lists and "
      +"forms.\n"
      +"\n"
      +"Menu \"Create Sales Forecasts for Sales Periods\" creates Forecasts for "
      +"products from selected Category, for selected Period and for selected "
      +"Warehouse. It is an option \"Copy Last Forecast\" to copy forecast and other "
      +"settings of period before this one to created one.\n"
      +"\n"
      +"Remarks:\n"
      +"- This tool doesn't create lines, if relevant lines (for the same Product, "
      +"Period, Warehouse and validated or created by you) already exists. If you "
      +"wish to create another forecast, if relevant lines exists you have to do it "
      +"manually using menus described bellow.\n"
      +"- When created lines are validated by someone else you can use this tool to "
      +"create another lines for the same Period, Product and Warehouse. \n"
      +"- When you choose \"Copy Last Forecast\" created line takes quantity and "
      +"some settings from your (validated by you or created by you if not validated "
      +"yet) forecast which is for last period before period of created forecast. If "
      +"there are few your forecasts for period before this one (it is possible) "
      +"system takes one of them (no rule which of them).\n"
      +"\n"
      +"\n"
      +"Menus \"Sales Forecasts\"\n"
      +"On \"Sales Forecast\" form mainly you have to enter a forecast quantity in "
      +"\"Product Quantity\". Further calculation can work for draft forecasts. But "
      +"validation can save your data against any accidental changes. You can click "
      +"\"Validate\" button but it is not mandatory.\n"
      +"\n"
      +"Instead of forecast quantity you can enter amount of forecast sales in field "
      +"\"Product Amount\". System will count quantity from amount according to Sale "
      +"price of the Product.\n"
      +"\n"
      +"All values on the form are expressed in unit of measure selected on form. "
      +"You can select one of unit of measure from default category or from second "
      +"category. When you change unit of measure the quanities will be recalculated "
      +"according to new UoM: editable values (blue fields) immediately, non edited "
      +"fields after clicking of \"Calculate Planning\" button.\n"
      +"\n"
      +"To find proper value for Sale Forecast you can use \"Sales History\" table "
      +"for this product. You have to enter parameters to the top and left of this "
      +"table and system will count sale quantities according to these parameters. "
      +"So you can select fe. your department (at the top) then (to the left): last "
      +"period, period before last and period year ago.\n"
      +"\n"
      +"Remarks:\n"
      +"\n"
      +"\n"
      +"Procurement Planning\n"
      +"====================\n"
      +"Menu for Planning you can find in \"Warehouse - Stock Planning\".\n"
      +"- \"Create Stock Planning Lines\" - allows you to automate creating planning "
      +"lines according to some parameters.\n"
      +"- \"Master Procurement Scheduler\" - is the most important menu of the "
      +"module which allows to create procurement.\n"
      +"\n"
      +"As Sales forecast is phase of planning sales. The Procurement Planning "
      +"(Planning) is the phase of scheduling Purchasing or Producing. You can "
      +"create Procurement Planning quickly using tool from menu \"Create Stock "
      +"Planning Lines\", then you can review created planning and make procurement "
      +"using menu \"Master Procurement Schedule\".\n"
      +"\n"
      +"Menu \"Create Stock Planning Lines\" allows you to create quickly Planning "
      +"lines for products from selected Category, for selected Period, and for "
      +"selected Warehouse. When you check option \"All Products with Forecast\" "
      +"system creates lines for all products having forecast for selected Period "
      +"and Warehouse. Selected Category will be ignored in this case.\n"
      +"\n"
      +"Under menu \"Master Procurement Scheduler\" you can generally change the "
      +"values \"Planned Out\" and \"Planned In\" to observe the field \"Stock "
      +"Simulation\" and decide if this value would be accurate for end of the "
      +"Period. \n"
      +"\"Planned Out\" can be based on \"Warehouse Forecast\" which is the sum of "
      +"all forecasts for Period and Warehouse. But your planning can be based on "
      +"any other information you have. It is not necessary to have any forecast. \n"
      +"\"Planned In\" quantity is used to calculate field \"Incoming Left\" which "
      +"is the quantity to be procured to make stock as indicated in \"Stock "
      +"Simulation\" at the end of Period. You can compare \"Stock Simulation\" "
      +"quantity to minimum stock rules visible on the form. But you can plan "
      +"different quantity than in Minimum Stock Rules. Calculation is made for "
      +"whole Warehouse by default. But if you want to see values for Stock location "
      +"of calculated warehouse you can use check box \"Stock Location Only\".\n"
      +"\n"
      +"If after few tries you decide that you found correct quantities for "
      +"\"Planned Out\" and \"Planned In\" and you are satisfied with end of period "
      +"stock calculated in \"Stock Simulation\" you can click \"Procure Incoming "
      +"Left\" button to procure quantity of field \"Incoming Left\" into the "
      +"Warehouse. System creates appropriate Procurement Order. You can decide if "
      +"procurement will be made to Stock or Input location of calculated Warehouse. "
      +"\n"
      +"\n"
      +"If you don't want to Produce or Buy the product but just pick calculated "
      +"quantity from another warehouse you can click \"Supply from Another "
      +"Warehouse\" (instead of \"Procure Incoming Left\"). System creates pick list "
      +"with move from selected source Warehouse to calculated Warehouse (as "
      +"destination). You can also decide if this pick should be done from Stock or "
      +"Output location of source warehouse. Destination location (Stock or Input) "
      +"of destination warehouse will be used as set for \"Procure Incoming Left\". "
      +"\n"
      +"\n"
      +"To see proper quantities in fields \"Confirmed In\", \"Confirmed Out\", "
      +"\"Confirmed In Before\", \"Planned Out Before\" and \"Stock Simulation\" you "
      +"have to click button \"Calculate Planning\".\n"
      +"\n"
      +"All values on the form are expressed in unit of measure selected on form. "
      +"You can select one of unit of measure from default category or from second "
      +"category. When you change unit of measure the quanities will be recalculated "
      +"according to new UoM: editable values (blue fields) immediately, non edited "
      +"fields after clicking of \"Calculate Planning\" button.\n"
      +"\n"
      +"How Stock Simulation field is calculated:\n"
      +"Generally Stock Simulation shows the stock for end of the calculated period "
      +"according to some planned or confirmed stock moves. Calculation always "
      +"starts with quantity of real stock of beginning of current period. Then "
      +"calculation adds or subtracts quantities of calculated period or periods "
      +"before calculated.\n"
      +"When you are in the same period (current period is the same as calculated) "
      +"Stock Simulation is calculated as follows:\n"
      +"Stock Simulation = \n"
      +"\tStock of beginning of current Period\n"
      +"\t- Planned Out \n"
      +"\t+ Planned In\n"
      +"\n"
      +"When you calculate period next to current:\n"
      +"Stock Simulation = \n"
      +"\tStock of beginning of current Period\n"
      +"\t- Planned Out of current Period \n"
      +"\t+ Confirmed In of current Period  (incl. Already In)\n"
      +"\t- Planned Out of calculated Period \n"
      +"\t+ Planned In of calculated Period .\n"
      +"\n"
      +"As you see calculated Period is taken the same way like in case above. But "
      +"calculation of current Period are made a little bit different. First you "
      +"should note that system takes for current Period only Confirmed In moves. It "
      +"means that you have to make planning and procurement for current Period "
      +"before this calculation (for Period next to current). \n"
      +"\n"
      +"When you calculate Period ahead:\n"
      +"Stock Simulation = \n"
      +"\tStock of beginning of current Period \n"
      +"\t- Sum of Planned Out of Periods before calculated \n"
      +"\t+ Sum of Confirmed In of Periods before calculated (incl. Already In) \n"
      +"\t- Planned Out of calculated Period \n"
      +"\t+ Planned In of calculated Period.\n"
      +"\n"
      +"Periods before calculated means periods starting from current till period "
      +"before calculated.\n"
      +"\n"
      +"Remarks:\n"
      +"- Remember to make planning for all periods before calculated because "
      +"omitting these quantities and procurements can cause wrong suggestions for "
      +"procurements few periods ahead.\n"
      +"- If you made planning few periods ahead and you find that real Confirmed "
      +"Out is bigger than Planned Out in some periods before you can repeat "
      +"Planning and make another procurement. You should do it in the same planning "
      +"line. If you create another planning line the suggestions can be wrong.\n"
      +"- When you wish to work with different periods for some part of products "
      +"define two kinds of periods (fe. Weekly and Monthly) and use them for "
      +"different products. Example: If you use always Weekly periods for Products "
      +"A, and Monthly periods for Products B your all calculations will work "
      +"correctly. You can also use different kind of periods for the same products "
      +"from different warehouse or companies. But you cannot use overlapping "
      +"periods for the same product, warehouse and company because results can be "
      +"unpredictable. The same apply to Forecasts lines.\n"
      +msgstr ""
      +"\n"
      +"Este módulo se basa en la versión original de OpenERP stock_planning SA "
      +"módulo 1.0 del mismo nombre Programador de Compras Maestras.\n"
      +"\n"
      +"El propósito de la MPS es permitir crear un manual de contratación "
      +"(solicitud), aparte del programador MRP (que funciona automáticamente, "
      +"basándose en reglas de existencias mínimas).\n"
      +"\n"
      +"Los términos utilizados en el módulo:\n"
      +"- Stock y Período de ventas - es el tiempo (entre Fecha de inicio y Fecha de "
      +"finalización) para el que planifica el Stock y la Previsión de Ventas y hace "
      +"la Planificación de las Compras.\n"
      +"- Stock y pronóstico de ventas - es la cantidad de productos que planea "
      +"vender en el Período.\n"
      +"- Planificación de Stock - es la cantidad de productos que planea comprar o "
      +"producir para el Período.\n"
      +"\n"
      +"Porque tenemos otra módulo sale_forecast que utiliza los términos "
      +"\"Pronóstico de Ventas\" y \"Planificación\" como valores de cantidad, "
      +"utilizaremos términos \"Stock y Pronóstico de Ventas\" y \"Planificación del "
      +"Stock\" para hacer hincapié en que usamos los valores de cantidad.\n"
      +"\n"
      +"La actividad con este módulo se divide en tres pasos:\n"
      +"- Creación de Períodos. Paso obligatorio.\n"
      +"- Creación de Pronósticos de Venta e introducción de sus cantidades. Un paso "
      +"opcional pero útil para una mayor planificación.\n"
      +"- Creación de líneas de Planificación, introducción de sus cantidades y "
      +"hacer Adquisiciones. Hacer compras es el paso final para el Período.\n"
      +"\n"
      +"Períodos\n"
      +"=========\n"
      +"Tiene dos opciones de menú para Períodos en \"Gestión de Ventas - "
      +"Configuración\". Son las siguientes:\n"
      +"- \"Crear los Períodos de Ventas\" - Que automatiza la creación de periodos "
      +"diarios, semanales o mensuales.\n"
      +"- \"Stock y Períodos de ventas\" - Que permite crear cualquier tipo de "
      +"períodos, el cambio de las fechas y el cambio del Estado del período.\n"
      +"\n"
      +"Creación de periodos es el primer paso que tiene que hacer para utilizar las "
      +"funciones de los módulos. Puede crear períodos personalizados mediante el "
      +"botón \"Nuevo\" en el formulario o vista de \"Stock y Períodos de Ventas\", "
      +"pero se recomienda utilizar la herramienta automática.\n"
      +"\n"
      +"Observaciones:\n"
      +"- Estos períodos (Stock oficial y Períodos de Ventas) están separan de "
      +"Finanzas o de otros períodos en el sistema.\n"
      +"- Los Períodos no se asignan a las compañías (en ningún caso cuando se "
      +"utiliza la función multicompañía). El módulo supone que utiliza los mismos "
      +"períodos a través de las compañías. Si desea utilizar períodos diferentes "
      +"para diferentes compañías defínalos a su gusto (pueden solaparse). Más "
      +"adelante en este texto se indica cómo utilizar esos períodos.\n"
      +"- Cuando los períodos son creados automáticamente sus fechas de inicio y "
      +"final se inician con la hora 00:00:00 y 23:59:00 como hora final. Pe.cuando "
      +"crea períodos diarios tendrán fecha de inicio 01.31.2010 00:00:00 y fecha de "
      +"finalización 01.31.2010 23:59:00. Funciona sólo en la creación automática de "
      +"los períodos. Cuando crea períodos manualmente hay que tener cuidado con las "
      +"horas, ya que puede tener valores incorrectos en ventas y stock.\n"
      +"- Si utiliza períodos solapados para el mismo producto, almacén y compañía, "
      +"los resultados pueden ser impredecibles.\n"
      +"- Si la fecha actual no pertenece a ningún período o si tiene agujeros entre "
      +"los períodos los resultados pueden ser impredecibles.\n"
      +"\n"
      +"Previsión de ventas\n"
      +"====================\n"
      +"Tiene menús pocas ventas previsto en \"Gestión de Ventas - Pronósticos de "
      +"Ventas\".\n"
      +"- \"Creación de Pronósticos de Ventas para los Períodos de Ventas\" - que "
      +"automatiza la creación de líneas de previsiones de acuerdo con algunos "
      +"parámetros.\n"
      +"- \"Las Previsiones de Ventas\" - algunos menús para trabajar con listas de "
      +"las previsiones y las formas.\n"
      +"\n"
      +"Menú \"Crear Pronósticos de Ventas para Períodos de Ventas\" crea "
      +"Pronósticos para los productos de la Categoría seleccionada, para el Período "
      +"y Almacén seleccionado. Es una opción \"Copia del Último Pronóstico\" para "
      +"copiar previsiones y otros ajustes del período anterior a éste para crear "
      +"uno.\n"
      +"\n"
      +"Observaciones:\n"
      +"- Esta herramienta no crea líneas, si las líneas oportunas (para el mismo "
      +"Producto, Período y Almacén, y validado o creado por usted) ya existen. Si "
      +"desea crear otro pronóstico, si las líneas pertinentes existen tiene que "
      +"hacerlo manualmente usando los menús que se describen a continuación.\n"
      +"- Cuando las líneas se crean son validadas por otra persona que puede "
      +"utilizar esta herramienta para crear otras líneas para el mismo Período, "
      +"Producto y Almacén.\n"
      +"- Cuando se elige \"Copiar Último Pronóstico\" la línea creada tiene la "
      +"cantidad y algunos ajustes de su (validado o creadas por usted, si no se ha "
      +"validado aún) pronostico que para el último período anterior al período de "
      +"la previsión creada. Si hay pocos pronósticos para el período anterior a "
      +"éste (es posible) el sistema toma una de ellos (no existe regla sobre "
      +"cual).\n"
      +"\n"
      +"\n"
      +"Menús \"Previsión de Ventas\"\n"
      +"En el formulario \"Pronóstico de Ventas\" principalmente tiene que "
      +"introducir una cantidad prevista en la \"Cantidad de Producto\". Además del "
      +"cálculo puede funcionar para las previsiones borrador. Sin embargo, la "
      +"validación puede guardar sus datos contra cualquier cambio accidental. Puede "
      +"hacer clic en botón \"Validar\", pero no es obligatorio.\n"
      +"\n"
      +"En lugar de la cantidad prevista se puede introducir la cantidad de "
      +"previsión de ventas en el campo \"Cantidad de Producto\". El sistema contará "
      +"la cantidad en función del Precio de Venta del Producto.\n"
      +"\n"
      +"Todos los valores del formulario se expresan en la unidad de medida "
      +"seleccionada en el formulario. Usted puede seleccionar uno de la unidad de "
      +"medida de la categoría por defecto o de segunda categoría. Cuando se cambia "
      +"la unidad de medida las cantiades se volverán a calcular de acuerdo con la "
      +"nueva UoM: los valores editables (campos azules) inmediatamente, los campos "
      +"no editables después de hacer clic en el botón \"Calcular Planificación\".\n"
      +"\n"
      +"Para encontrar el valor adecuado para Pronóstico de Venta se puede utilizar "
      +"la tabla \"Historial de ventas\" para este producto. Tienes que introducir "
      +"los parámetros en la parte superior izquierda de esta tabla y el sistema "
      +"contará las vantidades venta de acuerdo con estos parámetros. Así que usted "
      +"puede seleccionar, pe. de su departamento (en la parte superior) y luego (a "
      +"la izquierda): el último período, el período anterior al último y el período "
      +"de hace un año.\n"
      +"\n"
      +"Observaciones:\n"
      +"\n"
      +"\n"
      +"Planificación de las compras\n"
      +"====================\n"
      +"Menú para la Planificación de lo que puedes encontrar en \"Almacén - "
      +"Planificación del Stock\".\n"
      +"- \"Crear archivo de Planificación Lines\" - le permite automatizar la "
      +"creación de líneas de planificación de acuerdo con algunos parámetros.\n"
      +"- \"Programador Maestro de Adquisiciones\" - es el menú más importante del "
      +"módulo que permite la creación de la contratación.\n"
      +"\n"
      +"Con arreglo a las previsiones de ventas, es la fase de planificación de "
      +"ventas. La Planificación de compras (planificación) es la fase de "
      +"programación de compras o de producción. Usted puede crear la planificación "
      +"de las compras rápidamente con la herramienta del menú \"Crear Líneas de "
      +"Planificación de Stock\", entonces puede revisar la planificación creada y "
      +"hacer compras usando el menú \"Lista Maestra de Adquisiciones\".\n"
      +"\n"
      +"Menú \"Crear Líneas de Planificación de Stock\" le permite crear rápidamente "
      +"las Líneas de Planificación de productos de la categoría seleccionada, en "
      +"determinados períodos, y para el almacén seleccionado. Al marcar la opción "
      +"\"Todos los productos con Pronóstico\" el sistema crea las líneas para todos "
      +"los productos que tiene previsto para el Período seleccionado y Almacén. La "
      +"Categoría seleccionada se tendrá en cuenta en este caso.\n"
      +"\n"
      +"Debajo del menú \"Programador Maestro de Adquisiciones\" por lo general, "
      +"puede cambiar los valores \"Salidas planificadas\" y \"Entradas "
      +"planificadas\" para observar el campo \"Simulación de Stock\" y decidir si "
      +"este valor es exacto para el final del período.\n"
      +"\"Planeado\" puede basarse en la \"Pronóstico de Almacén\", que es la suma "
      +"de todas las previsiones para el período y Almacén. Pero la planificación se "
      +"puede basar en cualquier otra información que usted tenga. No es necesario "
      +"tener ningún pronóstico.\n"
      +"\"Entradas planificadas\" la cantidad se utiliza para calcular el campo "
      +"\"Entradas Restantes\" que es la cantidad que falta por adquirir para "
      +"alcanzar el stock, como se indica en la \"Simulación de Stock\" al final del "
      +"período. Usted puede comparar la \"Simulación de Stock\" con las normas de "
      +"cantidad mínima de existencias visibles en el formulario. Pero puede planear "
      +"una cantidad diferente al de las Reglas Mínimas de Stock. El cálculo está "
      +"hecho para todo el almacén por defecto. Pero si usted quiere ver los valores "
      +"de la ubicación del stock del almacén calculado, puede utilizar la casilla "
      +"\"Sólo Ubicación del Stock\".\n"
      +"\n"
      +"Si después de varios intentos decide que las cantidades son correctas para "
      +"lo \"Salidas planificadas\" y lo \"Entradas planificadas\" y que está "
      +"satisfecho con el final de existencias del período calculado en la "
      +"\"Simulación del Stock\" puede hacer clic en \"Adquirir Entradas Restantes\" "
      +"para obtener la cantidad del campo \"Entradas Restantes\" en el Almacén. El "
      +"sistema crea la correspondiente Orden de Compras. Usted puede decidir si la "
      +"contratación se hará para el stock o para la ubicación de entrada del "
      +"Almacén calculado.\n"
      +"\n"
      +"Si no quieres Producir o Comprar el producto, pero sólo debes elegir la "
      +"cantidad calculada, desde otro almacén puede hacer clic en \"Suministro "
      +"desde Otro Almacén\" (en lugar de \"Adquirir Entradas Restantes\"). El "
      +"sistema crea la lista de selección desde el Almacén origen seleccionado "
      +"hasta el Almacén calculado (como destino). También puede decidir si esta "
      +"selección debe hacerse de almacén o la ubicación de salida del almacén de "
      +"origen. La ubicación de destino (almacén o entrada) del almacén de destino, "
      +"se utilizará como establecido para \"Adquirir Entradas Restantes\".\n"
      +"\n"
      +"Para ver las cantidades adecuadas en los campos \"Entrada Confirmada\", "
      +"\"Salida Confirmada\", \"Entrada Confirmada Antes\", \"Salidas planificadas "
      +"antes\" y \"Simulación de Stock\" tiene que hacer clic en el botón "
      +"\"Calcular Planificación\".\n"
      +"\n"
      +"Todos los valores en el formulario se expresan en la unidad de medida "
      +"seleccionada en el formulario. Usted puede seleccionar uno de la unidad de "
      +"medida de la categoría por defecto o de una segunda categoría. Cuando se "
      +"cambia la unidad de medida las cantidades se volverán a calcular de acuerdo "
      +"con UoM: los valores editables inmediatamente (campos azules), los campos no "
      +"editables después de hacer clic en el botón \"Calcular Planificación\".\n"
      +"\n"
      +"Cómo se calcula el campo Simulación del Stock:\n"
      +"Generalmente la Simulación del Stock muestra el stock al final período "
      +"calculado de acuerdo con algunos movimientos de stock previsto o confirmado. "
      +"El cálculo se inicia siempre con la cantidad de stock real del inicio del "
      +"período actual. Luego se calcula la suma o resta de las cantidades del "
      +"período o períodos antes calculados.\n"
      +"Cuando está en el mismo período (período actual es el mismo que el "
      +"calculado) la Simulación del Stock se calcula como sigue:\n"
      +"Simulación de Stock = \n"
      +"\t Stock inicial del período actual\n"
      +"\t - Salidas planificadas \n"
      +"\t + Entradas planificadas\n"
      +"\n"
      +"Cuando se calcula el período siguiente al actual:\n"
      +"Simulación del Stock = \n"
      +"\t Stock inicial del período actual \n"
      +"\t - Planificación de Salidas del Período actual\n"
      +"\t + Entradas Confirmadas en el Período actual (incl. las Entradas ya "
      +"existentes)\n"
      +"\t - Salidas planificadas del Período calculado \n"
      +"\t + Entradas planificadas en el Período calculado.\n"
      +"\n"
      +"Como puede ver el período calculado se toma de la misma forma que en el caso "
      +"anterior. Sin embargo, el cálculo del período actual se hace de manera un "
      +"poco diferente. En primer lugar debe tener en cuenta que el sistema tiene "
      +"para el Período actual sólo Confirmados los movimientos de entrada. Esto "
      +"significa que tiene que hacer la planificación y la compra para Período "
      +"actual antes de este cálculo (para el Próximo período al actual).\n"
      +"\n"
      +"Cuando se calcula el período siguiente:\n"
      +"Colección de simulación = \n"
      +"\t Stock inicial del Período actual \n"
      +"\t - Suma de Planificación de salida de los períodos antes calculados \n"
      +"\t + Suma de Confirmados En períodos anteriores calculados (incl. las "
      +"entradas ya existentes) \n"
      +"\t - Salidas Planificadas del Período calculado \n"
      +"\t + Entradas Planificadas del Período calculado.\n"
      +"\n"
      +"Los períodos anteriores calculados, significa que los períodos comienzados "
      +"en el actual hasta el período antes calculado.\n"
      +"\n"
      +"Observaciones:\n"
      +"- Recuerde hacer la planificación para todos los períodos antes calculados "
      +"debido a omitir estas cantidades y las adquisiciones pueden causar "
      +"sugerencias erróneas para las compras de algunos períodos posteriores.\n"
      +"- Si ha realizado la planificación de unos pocos períodos posteriores y "
      +"encuentra que las Salidas Confirmadas reales son mayores de lo previsto en "
      +"algunos períodos antes de que pueda repetirse la Planificación y realizar "
      +"otra adquisición. Debe hacerlo en la misma línea de la planificación. Si se "
      +"crea otra línea de planificación de sugerencias puede estar equivocada.\n"
      +"- Cuando desea trabajar con diferentes períodos para una parte de los "
      +"productos, defina dos tipos de períodos (pe. semanal y mensual) y los "
      +"utilícelos para diferentes productos. Ejemplo: si utiliza siempre los "
      +"períodos semanales para los productos A, y los períodos mensuales de los "
      +"productos B todos sus cálculos funcionarán correctamente. También puede "
      +"utilizar diferentes tipos de períodos para los mismos productos de "
      +"diferentes almacenes de diferentes compañías. Pero no se pueden utilizar "
      +"períodos solapados para el mismo producto de un almacén, y compañía porque "
      +"los resultados pueden ser impredecibles. Lo mismo se aplica a las líneas de "
      +"Previsiones.\n"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:140
      +#, python-format
      +msgid "Cannot delete Validated Sale Forecasts !"
      +msgstr "¡ No se pueden borrar previsiones de ventas validadas !"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:641
      +#: code:addons/stock_planning/stock_planning.py:683
      +#, python-format
      +msgid ""
      +"\n"
      +" Planned Out: "
      +msgstr ""
      +"\n"
      +" Salidas planificadas: "
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:667
      +#, python-format
      +msgid ""
      +"You must specify a Source Warehouse different than calculated (destination) "
      +"Warehouse !"
      +msgstr ""
      +"¡Debe especificar un almacén de origen diferente del almacén calculado (de "
      +"destino)!"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_sale_forecast_createlines_form
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_createlines
      +msgid "Create Sales Forecasts"
      +msgstr "Crear previsiones de ventas"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Creates forecast lines for selected warehouse and period."
      +msgstr "Crear líneas de previsión para el almacén y periodo seleccionados."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:656
      +#, python-format
      +msgid "%s Requisition (%s,  %s) %s %s \n"
      +msgstr "%s Solicitud (%s, %s) %s %s \n"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:655
      +#, python-format
      +msgid "Requisition ("
      +msgstr "Solicitud ("
      +
      +#. module: stock_planning
      +#: help:stock.planning,outgoing_left:0
      +msgid ""
      +"Quantity expected to go out in selected period. As a difference between "
      +"Planned Out and Confirmed Out. For current period Already Out is also "
      +"calculated"
      +msgstr ""
      +"Cantidad prevista para salir en el período seleccionado. Diferencia entre "
      +"las salidas previstas y las salidas confirmadas. Para el periodo actual "
      +"también se calculan las salidas realizadas."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_id:0
      +msgid "Period4"
      +msgstr "Periodo4"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:642
      +#: code:addons/stock_planning/stock_planning.py:684
      +#, python-format
      +msgid "    Already In: "
      +msgstr "    Entradas realizadas: "
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_id:0
      +msgid "Period2"
      +msgstr "Periodo2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_id:0
      +msgid "Period3"
      +msgstr "Periodo3"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_id:0
      +msgid "Period1"
      +msgstr "Periodo1"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:647
      +#: code:addons/stock_planning/stock_planning.py:689
      +#, python-format
      +msgid "    Minimum stock: "
      +msgstr "    Stock mínimo: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,active_uom:0
      +#: field:stock.sale.forecast,active_uom:0
      +msgid "Active UoM"
      +msgstr "UdM activa"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_planning_createlines_form
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_createlines
      +#: view:stock.planning.createlines:0
      +msgid "Create Stock Planning Lines"
      +msgstr "Crear líneas de planificación de stock"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "General Info"
      +msgstr "Información General"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_sale_forecast_form
      +msgid "Sales Forecast"
      +msgstr "Previsión de ventas"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Planning and Situation for Calculated Period"
      +msgstr "Planificación y situación para el periodo calculado"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_warehouse:0
      +msgid "This Warehouse Period1"
      +msgstr "Peridodo de este almacen1"
      +
      +#. module: stock_planning
      +#: field:stock.planning,warehouse_forecast:0
      +msgid "Warehouse Forecast"
      +msgstr "Previsión almacen"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:643
      +#: code:addons/stock_planning/stock_planning.py:685
      +#, python-format
      +msgid "    Confirmed In: "
      +msgstr "    Entradas confirmadas: "
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Sales history"
      +msgstr "Histórico de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,supply_warehouse_id:0
      +msgid "Source Warehouse"
      +msgstr "Almacén origen"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,product_qty:0
      +msgid "Forecasted quantity."
      +msgstr "Cantidad prevista."
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Stock"
      +msgstr "Stock"
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_supply_location:0
      +msgid "Stock Supply Location"
      +msgstr "Ubicación suministro de stock"
      +
      +#. module: stock_planning
      +#: help:stock.period.createlines,date_stop:0
      +msgid "Ending date for planning period."
      +msgstr "Fecha de fin para el periodo planificado."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_user:0
      +msgid "This User Period2"
      +msgstr "El periodo de este usuario2"
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,forecasted_products:0
      +msgid ""
      +"Check this box to create planning for all products having any forecast for "
      +"selected Warehouse and Period. Product Category field will be ignored."
      +msgstr ""
      +"Marque esta opción para crear la planificación de todos los productos que "
      +"tengan cualquier previsión en el almacén y periodo seleccionado. El campo "
      +"categoría de producto será ignorado."
      +
      +#. module: stock_planning
      +#: field:stock.planning,already_in:0
      +msgid "Already In"
      +msgstr "Entradas realizadas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,product_uom_categ:0
      +#: field:stock.planning,product_uos_categ:0
      +#: field:stock.sale.forecast,product_uom_categ:0
      +msgid "Product UoM Category"
      +msgstr "Categoría UdM producto"
      +
      +#. module: stock_planning
      +#: field:stock.planning,incoming:0
      +msgid "Confirmed In"
      +msgstr "Entradas confirmadas"
      +
      +#. module: stock_planning
      +#: field:stock.planning,line_time:0
      +msgid "Past/Future"
      +msgstr "Pasado/Futuro"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_uos_categ:0
      +msgid "Product UoS Category"
      +msgstr "Categoría UdV producto"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_qty:0
      +msgid "Product Quantity"
      +msgstr "Cantidad de producto"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast.createlines,copy_forecast:0
      +msgid "Copy Last Forecast"
      +msgstr "Copiar última previsión"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,product_id:0
      +msgid "Shows which product this forecast concerns."
      +msgstr "Muestra a qué producto concierne esta previsión"
      +
      +#. module: stock_planning
      +#: selection:stock.planning,state:0
      +msgid "Done"
      +msgstr "Listo"
      +
      +#. module: stock_planning
      +#: field:stock.period.createlines,period_ids:0
      +msgid "Periods"
      +msgstr "Periodos"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:638
      +#: code:addons/stock_planning/stock_planning.py:680
      +#, python-format
      +msgid " according to state:"
      +msgstr " según el estado:"
      +
      +#. module: stock_planning
      +#: view:stock.period.createlines:0
      +msgid "Cancel"
      +msgstr "Cancelar"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +#: selection:stock.period,state:0
      +#: view:stock.planning.createlines:0
      +#: view:stock.sale.forecast.createlines:0
      +msgid "Close"
      +msgstr "Cerrar"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +#: selection:stock.sale.forecast,state:0
      +msgid "Validated"
      +msgstr "Validado"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +#: selection:stock.period,state:0
      +msgid "Open"
      +msgstr "Abrir"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast.createlines,copy_forecast:0
      +msgid "Copy quantities from last Stock and Sale Forecast."
      +msgstr "Copiar cantidades desde el stock pasado y previsión de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period1_per_dept:0
      +msgid "This Dept Period1"
      +msgstr "El periodo de este depto.1"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_dept:0
      +msgid "This Dept Period3"
      +msgstr "El periodo de este depto.3"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_dept:0
      +msgid "This Dept Period2"
      +msgstr "El periodo de este depto.2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_dept:0
      +msgid "This Dept Period5"
      +msgstr "El periodo de este depto.5"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_dept:0
      +msgid "This Dept Period4"
      +msgstr "El periodo de este depto.4"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period2_per_warehouse:0
      +msgid "This Warehouse Period2"
      +msgstr "El periodo de este almacén2"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period3_per_warehouse:0
      +msgid "This Warehouse Period3"
      +msgstr "El periodo de este almacén3"
      +
      +#. module: stock_planning
      +#: field:stock.planning,outgoing:0
      +msgid "Confirmed Out"
      +msgstr "Salidas confirmadas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,create_uid:0
      +msgid "Responsible"
      +msgstr "Responsable"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Default UOM"
      +msgstr "UdM por defecto"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period4_per_warehouse:0
      +msgid "This Warehouse Period4"
      +msgstr "El periodo de este almacén4"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_per_warehouse:0
      +msgid "This Warehouse Period5"
      +msgstr "El periodo de este almacén5"
      +
      +#. module: stock_planning
      +#: view:stock.period:0
      +msgid "Current"
      +msgstr "Actual"
      +
      +#. module: stock_planning
      +#: model:ir.model,name:stock_planning.model_stock_planning
      +msgid "stock.planning"
      +msgstr "stock.planificación"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,warehouse_id:0
      +msgid ""
      +"Shows which warehouse this forecast concerns. If during stock planning you "
      +"will need sales forecast for all warehouses choose any warehouse now."
      +msgstr ""
      +"Muestra a qué almacén concierne esta previsión. Si durante la planificación "
      +"de stock necesita previsiones de ventas para todos los almacenes escoja "
      +"ahora un almacén cualquiera."
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,warehouse_id:0
      +msgid "Warehouse which planning will concern."
      +msgstr "Almacén que se referirá la planificación"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:647
      +#: code:addons/stock_planning/stock_planning.py:689
      +#, python-format
      +msgid ""
      +"\n"
      +" Stock Simulation: "
      +msgstr ""
      +"\n"
      +" Simulación de stock: "
      +
      +#. module: stock_planning
      +#: help:stock.planning,to_procure:0
      +msgid ""
      +"Enter quantity which (by your plan) should come in. Change this value and "
      +"observe Stock simulation. This value should be equal or greater than "
      +"Confirmed In."
      +msgstr ""
      +"Introducir la cantidad que (por su plan) debe entrar. Cambie este valor y "
      +"observe la simulación de stock. Este valor debería ser igual o superior a "
      +"las entradas confirmadas."
      +
      +#. module: stock_planning
      +#: help:stock.planning.createlines,period_id:0
      +msgid "Period which planning will concern."
      +msgstr "Periodo al cual concierne la planificación"
      +
      +#. module: stock_planning
      +#: field:stock.planning,already_out:0
      +msgid "Already Out"
      +msgstr "Salidas realizadas"
      +
      +#. module: stock_planning
      +#: help:stock.planning,product_id:0
      +msgid "Product which this planning is created for."
      +msgstr "Producto para el que ha sido creada esta planificación."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Per Warehouse :"
      +msgstr "Por almacén :"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:639
      +#: code:addons/stock_planning/stock_planning.py:681
      +#, python-format
      +msgid ""
      +"\n"
      +" Warehouse Forecast: "
      +msgstr ""
      +"\n"
      +" Previsión almacén: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,history:0
      +msgid "Procurement History"
      +msgstr "Histórico abastecimientos"
      +
      +#. module: stock_planning
      +#: help:stock.period.createlines,date_start:0
      +msgid "Starting date for planning period."
      +msgstr "Fecha inicial para el periodo planificado."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:641
      +#: code:addons/stock_planning/stock_planning.py:683
      +#, python-format
      +msgid "    Planned In: "
      +msgstr "    Entradas planificadas: "
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyze_company:0
      +msgid "Per Company"
      +msgstr "Por compañía"
      +
      +#. module: stock_planning
      +#: help:stock.planning,incoming_left:0
      +msgid ""
      +"Quantity left to Planned incoming quantity. This is calculated difference "
      +"between Planned In and Confirmed In. For current period Already In is also "
      +"calculated. This value is used to create procurement for lacking quantity."
      +msgstr ""
      +"Cantidad restante de la cantidad entrante planificada. Se calcula mediante "
      +"la diferencia entre las entradas planificadas y las entradas confirmadas. "
      +"Para el periodo actual las entradas realizadas también se calculan. Este "
      +"valor se usa para crear abastecimientos para la cantidad faltante."
      +
      +#. module: stock_planning
      +#: help:stock.planning,incoming:0
      +msgid "Quantity of all confirmed incoming moves in calculated Period."
      +msgstr ""
      +"Cantidades de todas las entradas confirmadas en el periodo calculado."
      +
      +#. module: stock_planning
      +#: field:stock.period,date_stop:0
      +#: field:stock.period.createlines,date_stop:0
      +msgid "End Date"
      +msgstr "Fecha de término"
      +
      +#. module: stock_planning
      +#: help:stock.planning,stock_supply_location:0
      +msgid ""
      +"Check to supply from Stock location of Supply Warehouse. If not checked "
      +"supply will be made from Output location of Supply Warehouse. Used in "
      +"'Supply from Another Warhouse' with Supply Warehouse."
      +msgstr ""
      +"Marque esta opción para suministrar desde la ubicación stock del almacén de "
      +"suministro. Si no se marca, el suministro se realizará desde la ubicación de "
      +"salida del almacén de suministro. Utilizado en 'Suministrar desde otro "
      +"almacén' con un almacén de suministro."
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "No Requisition"
      +msgstr "No solicitar"
      +
      +#. module: stock_planning
      +#: help:stock.planning,minimum_op:0
      +msgid "Minimum quantity set in Minimum Stock Rules for this Warhouse"
      +msgstr ""
      +"Cantidad mínima establecida en las reglas de stock mínimo para este almacén."
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,period_id:0
      +msgid "Shows which period this forecast concerns."
      +msgstr "Muestra a que periodo concierne esta previsión."
      +
      +#. module: stock_planning
      +#: field:stock.planning,product_uom:0
      +msgid "UoM"
      +msgstr "UdM"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +msgid "Calculated Period Simulation"
      +msgstr "Simulación calculada del periodo"
      +
      +#. module: stock_planning
      +#: view:stock.planning:0
      +#: field:stock.planning,product_id:0
      +#: view:stock.sale.forecast:0
      +#: field:stock.sale.forecast,product_id:0
      +msgid "Product"
      +msgstr "Producto"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:638
      +#: code:addons/stock_planning/stock_planning.py:680
      +#, python-format
      +msgid ""
      +"\n"
      +"For period: "
      +msgstr ""
      +"\n"
      +"Por periodo: "
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_uom:0
      +msgid "Product UoM"
      +msgstr "UdM del producto"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:627
      +#: code:addons/stock_planning/stock_planning.py:673
      +#: code:addons/stock_planning/stock_planning.py:697
      +#, python-format
      +msgid "MPS(%s) %s"
      +msgstr "Copy text \t MPS(%s) %s"
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:627
      +#: code:addons/stock_planning/stock_planning.py:671
      +#: code:addons/stock_planning/stock_planning.py:693
      +#, python-format
      +msgid "MPS("
      +msgstr "MPS("
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:680
      +#, python-format
      +msgid ""
      +"Pick created from MPS by user: %s   Creation Date: %s                        "
      +"             \n"
      +"For period: %s   according to state:                                     \n"
      +" Warehouse Forecast: %s                                     \n"
      +" Initial Stock: %s                                     \n"
      +" Planned Out: %s  Planned In: %s                                     \n"
      +" Already Out: %s  Already In: %s                                     \n"
      +" Confirmed Out: %s   Confirmed In: %s                                     \n"
      +" Planned Out Before: %s   Confirmed In Before: %s                            "
      +"         \n"
      +" Expected Out: %s   Incoming Left: %s                                     \n"
      +" Stock Simulation: %s   Minimum stock: %s "
      +msgstr ""
      +
      +#. module: stock_planning
      +#: field:stock.planning,procure_to_stock:0
      +msgid "Procure To Stock Location"
      +msgstr "Abastecimiento a ubicación stock"
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Approve"
      +msgstr "Aprobar"
      +
      +#. module: stock_planning
      +#: help:stock.planning,period_id:0
      +msgid ""
      +"Period for this planning. Requisition will be created for beginning of the "
      +"period."
      +msgstr ""
      +"Periodo para esta planificación. Se creará una solicitud al principio del "
      +"periodo."
      +
      +#. module: stock_planning
      +#: view:stock.sale.forecast:0
      +msgid "Calculate Sales History"
      +msgstr "Calcular historial de ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,product_amt:0
      +msgid "Product Amount"
      +msgstr "Cantidad de producto"
      +
      +#. module: stock_planning
      +#: help:stock.planning,confirmed_forecasts_only:0
      +msgid ""
      +"Check to take validated forecasts only. If not checked system takes "
      +"validated and draft forecasts."
      +msgstr ""
      +"Marcar para usar sólo las previsiones validadas. Si no se marca el sistema "
      +"usa las previsiones validadas y borrador."
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_period5_id:0
      +msgid "Period5"
      +msgstr "Periodo5"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_createlines_form
      +msgid "Stock and Sales Planning Periods"
      +msgstr "Periodos de planificación de stock y ventas"
      +
      +#. module: stock_planning
      +#: field:stock.sale.forecast,analyzed_warehouse_id:0
      +msgid "This Warehouse"
      +msgstr "Este almacén"
      +
      +#. module: stock_planning
      +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_form
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_period
      +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_main
      +#: view:stock.period:0
      +#: view:stock.period.createlines:0
      +msgid "Stock and Sales Periods"
      +msgstr "Periodos de stock y ventas"
      +
      +#. module: stock_planning
      +#: help:stock.sale.forecast,user_id:0
      +msgid "Shows who created this forecast, or who validated."
      +msgstr "Muestra quién creó esta previsión, o quién la validó."
      +
      +#. module: stock_planning
      +#: code:addons/stock_planning/stock_planning.py:644
      +#: code:addons/stock_planning/stock_planning.py:686
      +#, python-format
      +msgid ""
      +"\n"
      +" Planned Out Before: "
      +msgstr ""
      +"\n"
      +" Salidas planificadas antes: "
      +
      +#. module: stock_planning
      +#: field:stock.planning,stock_start:0
      +msgid "Initial Stock"
      +msgstr "Stock inicial"