[MERGE]: Merge with lp:openobject-addons
bzr revid: aag@tinyerp.com-20111025101503-tha733lanv0gzb52
This commit is contained in:
@@ -40,10 +40,6 @@ class share_wizard_portal(osv.osv_memory):
|
||||
_columns = {
|
||||
'user_ids': fields.many2many('res.users', 'share_wizard_res_user_rel', 'share_id', 'user_id', 'Existing users', domain=[('share', '=', True)]),
|
||||
'group_ids': fields.many2many('res.groups', 'share_wizard_res_group_rel', 'share_id', 'group_id', 'Existing groups', domain=[('share', '=', False)]),
|
||||
|
||||
# no clean way to extend selection yet, copy the field.
|
||||
'user_type': fields.selection(_user_type_selection,'Users to share with',
|
||||
help="Select the type of user(s) you would like to share data with."),
|
||||
}
|
||||
|
||||
def is_portal_manager(self, cr, uid, context=None):
|
||||
|
||||
@@ -8,11 +8,7 @@
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="share.share_step1_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="/form/group[@name='emails_group']" position="before">
|
||||
<group name="groups_group" colspan="4" col="4" groups="portal.group_portal_manager">
|
||||
<separator colspan="4" string="Who do you want to share with?"/>
|
||||
<field name="user_type" />
|
||||
</group>
|
||||
<xpath expr="/form/group[@name='emails_group']" position="after">
|
||||
<group name="user_group" colspan="4" attrs="{'invisible':[('user_type','!=','existing')]}">
|
||||
<field colspan="4" nolabel="1" name="user_ids" mode="tree">
|
||||
<tree string="Existing users">
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
# Copyright (C) 2010-2011 OpenERP SA (<http://www.openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
@@ -22,7 +23,7 @@
|
||||
|
||||
{
|
||||
"name" : "Web Share",
|
||||
"version" : "1.5",
|
||||
"version" : "2.0",
|
||||
"depends" : ["base", "mail"],
|
||||
"author" : "OpenERP SA",
|
||||
"category": 'Hidden',
|
||||
@@ -53,6 +54,8 @@ synchronization with other companies, etc.
|
||||
'installable': True,
|
||||
'web': True,
|
||||
'certificate' : '001301246528927038493',
|
||||
'js': ['static/src/js/share.js'],
|
||||
'css': ['static/src/css/share.css'],
|
||||
'images': ['images/share_wizard.jpeg','images/sharing_wizard_step1.jpeg', 'images/sharing_wizard_step2.jpeg'],
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
|
||||
.openerp li.oe-share {
|
||||
background: url(../img/share.png) no-repeat;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.openerp a.oe-share {
|
||||
background: url(../img/share.png) no-repeat;
|
||||
display: block;
|
||||
float: left;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
|
||||
openerp.share = function(instance) {
|
||||
var QWeb = instance.web.qweb;
|
||||
QWeb.add_template('/share/static/src/xml/share.xml');
|
||||
|
||||
function launch_wizard(self, view) {
|
||||
var action = view.widget_parent.action;
|
||||
var Share = new instance.web.DataSet(self, 'share.wizard', view.dataset.get_context());
|
||||
var domain = view.dataset.domain;
|
||||
|
||||
if (view.fields_view.type == 'form') {
|
||||
domain = new instance.web.CompoundDomain(domain, [['id', '=', view.datarecord.id]]);
|
||||
}
|
||||
|
||||
Share.create({
|
||||
name: action.name,
|
||||
domain: domain,
|
||||
action_id: action.id,
|
||||
}, function(result) {
|
||||
var share_id = result.result;
|
||||
var step1 = Share.call('go_step_1', [[share_id],], function(result) {
|
||||
var action = result;
|
||||
self.do_action(action);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
var _has_share = null;
|
||||
function if_has_share(yes, no) {
|
||||
if (!_has_share) {
|
||||
_has_share = $.Deferred(function() {
|
||||
var self = this;
|
||||
var session = instance.webclient.session;
|
||||
session.on_session_invalid.add_last(function() { _has_share = null; });
|
||||
var func = new instance.web.Model(session, "share.wizard").get_func("has_share");
|
||||
func(session.uid).pipe(function(res) {
|
||||
if(res) {
|
||||
self.resolve();
|
||||
} else {
|
||||
self.reject();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
_has_share.done(yes).fail(no);
|
||||
}
|
||||
|
||||
|
||||
instance.web.Sidebar = instance.web.Sidebar.extend({
|
||||
add_default_sections: function() {
|
||||
this._super();
|
||||
var self = this;
|
||||
if_has_share(function() {
|
||||
self.add_items('other', [{
|
||||
label: 'Share',
|
||||
callback: self.on_sidebar_click_share,
|
||||
classname: 'oe-share',
|
||||
}]);
|
||||
});
|
||||
},
|
||||
on_sidebar_click_share: function(item) {
|
||||
var view = this.widget_parent
|
||||
launch_wizard(this, view);
|
||||
},
|
||||
});
|
||||
|
||||
instance.web.ViewManagerAction.include({
|
||||
start: function() {
|
||||
var self = this;
|
||||
if_has_share(function() {
|
||||
self.$element.find('a.oe-share').click(self.on_click_share);
|
||||
}, function() {
|
||||
self.$element.find('a.oe-share').remove();
|
||||
});
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
on_click_share: function(e) {
|
||||
e.preventDefault();
|
||||
launch_wizard(this, this.views[this.active_view].controller);
|
||||
},
|
||||
});
|
||||
|
||||
};
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- vim:fdl=1:
|
||||
-->
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
<t t-extend="ViewManagerAction">
|
||||
<t t-jquery=".oe-shortcut-toggle" t-operation="after">
|
||||
<a class="oe-share" href="#share" title="Share this in 2 clicks...">
|
||||
<!--<img src="/share/static/src/img/share.png"/>-->
|
||||
</a>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
@@ -1,2 +0,0 @@
|
||||
import controllers
|
||||
import editors
|
||||
@@ -1,49 +0,0 @@
|
||||
import urlparse
|
||||
import cherrypy
|
||||
|
||||
from openobject import rpc
|
||||
from openobject.tools import expose, ast
|
||||
|
||||
import openerp.controllers
|
||||
|
||||
|
||||
|
||||
class ShareWizardController(openerp.controllers.SecuredController):
|
||||
_cp_path = "/share"
|
||||
|
||||
@expose()
|
||||
def index(self, domain, context, view_id, search_domain='[]', action_id=None):
|
||||
context = ast.literal_eval(context)
|
||||
|
||||
if not action_id:
|
||||
# This should not be needed anymore, but just in case users are
|
||||
# running the module with an older version of the web client...
|
||||
|
||||
# to remove soon-ish
|
||||
action_id = rpc.RPCProxy('ir.actions.act_window').search(
|
||||
[('view_id','=',int(view_id))], context=context)
|
||||
if not action_id: return ""
|
||||
|
||||
action_id = action_id[0]
|
||||
|
||||
domain = ast.literal_eval(domain)
|
||||
domain.extend(ast.literal_eval(search_domain))
|
||||
|
||||
scheme, netloc, _, _, _ = urlparse.urlsplit(cherrypy.request.base)
|
||||
share_root_url = urlparse.urlunsplit((
|
||||
scheme, netloc, '/openerp/login',
|
||||
'db=%(dbname)s&user=%(login)s&password=%(password)s', ''))
|
||||
|
||||
context.update(
|
||||
#active_ids=share_wiz_id,
|
||||
#active_id=share_wiz_id[0],
|
||||
_terp_view_name='Share Wizard',
|
||||
share_root_url=share_root_url)
|
||||
Share = rpc.RPCProxy('share.wizard')
|
||||
sharing_view_id = Share.create({
|
||||
'domain': str(domain),
|
||||
'action_id': action_id and int(action_id)
|
||||
}, context)
|
||||
return openerp.controllers.actions.execute(
|
||||
Share.go_step_1([sharing_view_id], context),
|
||||
ids=[sharing_view_id], context=context)
|
||||
@@ -1,94 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import openobject.templating
|
||||
|
||||
class FormEditor(openobject.templating.TemplateEditor):
|
||||
templates = ['/openerp/controllers/templates/form.mako']
|
||||
MAIN_FORM_BODY = u'id="main_form_body"'
|
||||
|
||||
def insert_share_button(self, output):
|
||||
# Insert the share button on the form title H1 line, at the very end,
|
||||
# but only if the user is a member of the sharing group
|
||||
share_opener_insertion = output.index('% endif', output.index(
|
||||
'/view_diagram/process',
|
||||
output.index(self.MAIN_FORM_BODY))) + len('% endif')
|
||||
return output[:share_opener_insertion] + '''
|
||||
<%
|
||||
if 'has_share' not in cp.session:
|
||||
cp.session['has_share'] = rpc.RPCProxy('share.wizard').has_share()
|
||||
%>
|
||||
% if cp.session['has_share'] and buttons.toolbar and not is_dashboard:
|
||||
<a id="share-opener" href="#share" title="${_('Share this in 2 clicks...')}">
|
||||
<img id="share-opener-img" src="/share/static/images/share.png"/>
|
||||
</a>
|
||||
<script type="text/javascript">
|
||||
jQuery(document).ready(function() {
|
||||
jQuery("#share-opener").click(function() {
|
||||
jQuery(this).attr(
|
||||
"href",
|
||||
openobject.http.getURL('/share', {
|
||||
context: jQuery("#_terp_context").val(),
|
||||
domain: jQuery("#_terp_domain").val(),
|
||||
view_id: jQuery("#_terp_view_id").val(),
|
||||
action_id: jQuery("#_terp_action_id").val(),
|
||||
search_domain: jQuery("#_terp_view_type").val() == "form" ?
|
||||
("[('id','=',"+jQuery("#_terp_id").val()+")]") :
|
||||
jQuery("#_terp_search_domain").val(),
|
||||
}));
|
||||
});
|
||||
});
|
||||
</script>
|
||||
\n
|
||||
% endif
|
||||
''' + output[share_opener_insertion:]
|
||||
|
||||
def edit(self, template, template_text):
|
||||
return self.insert_share_button(
|
||||
super(FormEditor, self).edit(template, template_text))
|
||||
|
||||
|
||||
class SidebarEditor(openobject.templating.TemplateEditor):
|
||||
templates = ['/openerp/widgets/templates/sidebar.mako']
|
||||
ADD_SHARE_SECTION = u'id="sidebar"'
|
||||
|
||||
def insert_share_link(self, output):
|
||||
# Insert the link on the line, right after the link to open the
|
||||
# attachment form, but only if the user is a member of the sharing group
|
||||
share_opener_insertion = output.index(
|
||||
'\n',
|
||||
output.index(self.ADD_SHARE_SECTION)) + 1
|
||||
return output[:share_opener_insertion] + '''
|
||||
<%
|
||||
if 'has_share' not in cp.session:
|
||||
cp.session['has_share'] = rpc.RPCProxy('share.wizard').has_share()
|
||||
%>
|
||||
% if cp.session['has_share']:
|
||||
<div id="share-wizard" class="sideheader-a"><h2>${_("Sharing")}</h2></div>
|
||||
<ul class="clean-a">
|
||||
<li>
|
||||
<a id="sharing" href="#share">${_("Share")}</a>
|
||||
</li>
|
||||
</ul>
|
||||
<script type="text/javascript">
|
||||
jQuery(document).ready(function() {
|
||||
jQuery("#sharing").click(function() {
|
||||
jQuery(this).attr(
|
||||
"href",
|
||||
openobject.http.getURL('/share', {
|
||||
context: jQuery("#_terp_context").val(),
|
||||
domain: jQuery("#_terp_domain").val(),
|
||||
view_id: jQuery("#_terp_view_id").val(),
|
||||
action_id: jQuery("#_terp_action_id").val(),
|
||||
search_domain: jQuery("#_terp_view_type").val() == "form" ?
|
||||
("[('id','=',"+jQuery("#_terp_id").val()+")]") :
|
||||
jQuery("#_terp_search_domain").val(),
|
||||
}));
|
||||
});
|
||||
});
|
||||
</script>
|
||||
\n
|
||||
% endif
|
||||
''' + output[share_opener_insertion:]
|
||||
|
||||
def edit(self, template, template_text):
|
||||
return self.insert_share_link(
|
||||
super(SidebarEditor, self).edit(template, template_text))
|
||||
@@ -119,24 +119,38 @@ class share_wizard(osv.osv_memory):
|
||||
values['name'] = action.name
|
||||
return super(share_wizard,self).create(cr, uid, values, context=context)
|
||||
|
||||
def share_url_template(self, cr, uid, _ids, context=None):
|
||||
# NOTE: take _ids in parameter to allow usage through browse_record objects
|
||||
base_url = self.pool.get('ir.config_parameter').get_param(cr, uid, 'web.base.url', default='', context=context)
|
||||
if base_url:
|
||||
base_url += '/?db=%(dbname)s&login=%(login)s'
|
||||
return base_url
|
||||
|
||||
def _share_root_url(self, cr, uid, ids, _fieldname, _args, context=None):
|
||||
result = dict.fromkeys(ids, '')
|
||||
data = dict(dbname=cr.dbname, login='')
|
||||
for this in self.browse(cr, uid, ids, context=context):
|
||||
result[this.id] = this.share_url_template() % data
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'action_id': fields.many2one('ir.actions.act_window', 'Action to share', required=True,
|
||||
help="The action that opens the screen containing the data you wish to share."),
|
||||
'domain': fields.char('Domain', size=256, help="Optional domain for further data filtering"),
|
||||
'user_type': fields.selection(_user_type_selection,'Users to share with',
|
||||
'user_type': fields.selection(lambda s, *a, **k: s._user_type_selection(*a, **k),'Users to share with', required=True,
|
||||
help="Select the type of user(s) you would like to share data with."),
|
||||
'new_users': fields.text("Emails"),
|
||||
'access_mode': fields.selection([('readonly','Can view'),('readwrite','Can edit')],'Access Mode', required=True,
|
||||
help="Access rights to be granted on the shared documents."),
|
||||
'result_line_ids': fields.one2many('share.wizard.result.line', 'share_wizard_id', 'Summary', readonly=True),
|
||||
'share_root_url': fields.char('Share Access URL', size=512, readonly=True, tooltip='Main access page for users that are granted shared access'),
|
||||
'share_root_url': fields.function(_share_root_url, string='Share Access URL', type='char', size=512, readonly=True,
|
||||
help='Main access page for users that are granted shared access'),
|
||||
'name': fields.char('Share Title', size=64, required=True, help="Title for the share (displayed to users as menu and shortcut name)"),
|
||||
'message': fields.text("Personal Message", help="An optional personal message, to be included in the e-mail notification."),
|
||||
}
|
||||
_defaults = {
|
||||
'user_type' : 'new',
|
||||
'user_type' : 'emails',
|
||||
'domain': lambda self, cr, uid, context, *a: context.get('domain', '[]'),
|
||||
'share_root_url': lambda self, cr, uid, context, *a: context.get('share_root_url') or _('Please specify "share_root_url" in context'),
|
||||
'action_id': lambda self, cr, uid, context, *a: context.get('action_id'),
|
||||
'access_mode': 'readonly',
|
||||
}
|
||||
@@ -537,12 +551,11 @@ class share_wizard(osv.osv_memory):
|
||||
try:
|
||||
domain = safe_eval(wizard_data.domain)
|
||||
if domain:
|
||||
domain_expr = expression.expression(domain)
|
||||
for rel_field, model in fields_relations:
|
||||
related_domain = []
|
||||
if not rel_field: continue
|
||||
for element in domain:
|
||||
if domain_expr._is_leaf(element):
|
||||
if expression.is_leaf(element):
|
||||
left, operator, right = element
|
||||
left = '%s.%s'%(rel_field, left)
|
||||
element = left, operator, right
|
||||
@@ -555,19 +568,6 @@ class share_wizard(osv.osv_memory):
|
||||
raise osv.except_osv(_('Sharing access could not be created'),
|
||||
_('Sorry, the current screen and filter you are trying to share are not supported at the moment.\nYou may want to try a simpler filter.'))
|
||||
|
||||
def _finish_result_lines(self, cr, uid, wizard_data, share_group_id, context=None):
|
||||
"""Perform finalization of the share, and populate the summary"""
|
||||
share_root_url = wizard_data.share_root_url
|
||||
format_url = '%(dbname)s' in share_root_url
|
||||
for result in wizard_data.result_line_ids:
|
||||
# share_root_url may contain placeholders for dbname, login and password
|
||||
share_url = (share_root_url % \
|
||||
{'login': quote_plus(result.user_id.login),
|
||||
'password': '', # kept empty for security reasons
|
||||
'dbname': quote_plus(cr.dbname)}) \
|
||||
if format_url else share_root_url
|
||||
result.write({'share_url': share_url}, context=context)
|
||||
|
||||
def _check_preconditions(self, cr, uid, wizard_data, context=None):
|
||||
self._assert(wizard_data.action_id and wizard_data.access_mode,
|
||||
_('Action and Access Mode are required to create a shared access'),
|
||||
@@ -662,15 +662,6 @@ class share_wizard(osv.osv_memory):
|
||||
# C.
|
||||
self._create_indirect_sharing_rules(cr, current_user, wizard_data, group_id, obj1, context=context)
|
||||
|
||||
# so far, so good -> check summary results and return them
|
||||
self._finish_result_lines(cr, uid, wizard_data, group_id, context=context)
|
||||
|
||||
# update share URL to make it generic
|
||||
generic_share_url = wizard_data.share_root_url % {'dbname': cr.dbname,
|
||||
'login': '',
|
||||
'password': ''}
|
||||
wizard_data.write({'share_root_url': generic_share_url}, context=context)
|
||||
|
||||
# refresh wizard_data
|
||||
wizard_data = self.browse(cr, uid, ids[0], context=context)
|
||||
|
||||
@@ -742,11 +733,20 @@ share_wizard()
|
||||
class share_result_line(osv.osv_memory):
|
||||
_name = 'share.wizard.result.line'
|
||||
_rec_name = 'user_id'
|
||||
|
||||
|
||||
def _share_url(self, cr, uid, ids, _fieldname, _args, context=None):
|
||||
result = dict.fromkeys(ids, '')
|
||||
for this in self.browse(cr, uid, ids, context=context):
|
||||
data = dict(dbname=cr.dbname, login=this.login)
|
||||
result[this.id] = this.share_wizard_id.share_url_template() % data
|
||||
return result
|
||||
|
||||
_columns = {
|
||||
'user_id': fields.many2one('res.users', required=True, readonly=True),
|
||||
'login': fields.related('user_id', 'login', string='Login', type='char', size=64, required=True, readonly=True),
|
||||
'password': fields.char('Password', size=64, readonly=True),
|
||||
'share_url': fields.char('Share URL', size=512, required=True),
|
||||
'share_url': fields.function(_share_url, string='Share URL', type='char', size=512),
|
||||
'share_wizard_id': fields.many2one('share.wizard', 'Share Wizard', required=True),
|
||||
'newly_created': fields.boolean('Newly created', readonly=True),
|
||||
}
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Grant instant access to your documents">
|
||||
<group name="groups_group" colspan="4" col="4">
|
||||
<separator colspan="4" string="Who do you want to share with?"/>
|
||||
<field name="user_type" />
|
||||
</group>
|
||||
<group colspan="4" name="emails_group" attrs="{'invisible':[('user_type','!=','emails')]}">
|
||||
<separator colspan="4" string="Share with these people (one e-mail per line)"/>
|
||||
<field colspan="4" nolabel="1" name="new_users" attrs="{'required':[('user_type','=','emails')]}"/>
|
||||
@@ -78,7 +82,6 @@
|
||||
- 'action_id' (id of action)
|
||||
- 'domain' (string expression for full domain to apply as sent to server,
|
||||
with dynamic data like 'uid' replaced by actual value (i.e. after eval)!)
|
||||
- 'share_root_url' : URL for direct access to share page (may include %(login)s and %(password)s placeholders)
|
||||
-->
|
||||
<record id="action_share_wizard" model="ir.actions.act_window">
|
||||
<field name="name">Share Wizard</field>
|
||||
@@ -94,7 +97,6 @@
|
||||
- 'action_id' (id of action)
|
||||
- 'domain' (string expression for full domain to apply as sent to server,
|
||||
with dynamic data like 'uid' replaced by actual value (i.e. after eval)!)
|
||||
- 'share_root_url' : URL for direct access to share page (may include %(login)s and %(password)s placeholders)
|
||||
-->
|
||||
<record id="action_share_wizard_step1" model="ir.actions.act_window">
|
||||
<field name="name">Share Wizard</field>
|
||||
|
||||
@@ -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 <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <Unknown>\n"
|
||||
"Language-Team: Spanish (Chile) <es_CL@li.org>\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"
|
||||
@@ -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 <EMAIL@ADDRESS>, 2011.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <Unknown>\n"
|
||||
"Language-Team: Spanish (Chile) <es_CL@li.org>\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!"
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user