summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorFabien Meghazi <fme@openerp.com>2012-10-02 09:49:31 +0200
committerFabien Meghazi <fme@openerp.com>2012-10-02 09:49:31 +0200
commit4d2299adc4e9d7db2cb52a79cf4ab8ebaad707ae (patch)
tree8a45a95b39d3b060fdef188f3da8a70fbfe20ad5 /addons
parent32d492acf9db0a57487a1c6c47e4311d842e99f7 (diff)
parenta5fac44994a5d2c0e20cdde0bf72ef152d2342dd (diff)
[MERGE] trunk
bzr revid: fme@openerp.com-20121002074931-845aiqhflw2rqrcn
Diffstat (limited to 'addons')
-rw-r--r--addons/account/account.py26
-rw-r--r--addons/account/account_bank_statement.py2
-rw-r--r--addons/account/account_invoice.py33
-rw-r--r--addons/account/account_invoice_view.xml6
-rw-r--r--addons/account/account_move_line.py7
-rw-r--r--addons/account/account_view.xml20
-rw-r--r--addons/account/partner.py20
-rw-r--r--addons/account/partner_view.xml31
-rw-r--r--addons/account/project/project_view.xml25
-rw-r--r--addons/account/project/wizard/account_analytic_journal_report.py18
-rw-r--r--addons/account/project/wizard/account_analytic_journal_report_view.xml18
-rw-r--r--addons/account/security/account_security.xml2
-rw-r--r--addons/account/wizard/account_invoice_refund.py6
-rw-r--r--addons/account/wizard/account_invoice_refund_view.xml45
-rw-r--r--addons/account/wizard/account_reconcile.py7
-rw-r--r--addons/account_analytic_analysis/account_analytic_analysis_menu.xml4
-rw-r--r--addons/account_asset/account_asset.py4
-rw-r--r--addons/account_asset/account_asset_invoice.py1
-rw-r--r--addons/account_asset/report/account_asset_report.py4
-rw-r--r--addons/account_bank_statement_extensions/account_bank_statement_view.xml4
-rw-r--r--addons/account_coda/i18n/en_AU.po4
-rw-r--r--addons/account_payment/wizard/account_payment_order.py4
-rw-r--r--addons/account_voucher/account_voucher.py17
-rw-r--r--addons/account_voucher/account_voucher_view.xml1
-rw-r--r--addons/account_voucher/invoice.py11
-rw-r--r--addons/account_voucher/voucher_payment_receipt_view.xml110
-rw-r--r--addons/account_voucher/voucher_sales_purchase_view.xml2
-rw-r--r--addons/analytic/analytic_view.xml1
-rw-r--r--addons/audittrail/audittrail.py4
-rw-r--r--addons/auth_ldap/users_ldap.py4
-rw-r--r--addons/auth_ldap/users_ldap_view.xml2
-rw-r--r--addons/base_calendar/base_calendar.py14
-rw-r--r--addons/base_calendar/crm_meeting_view.xml6
-rw-r--r--addons/base_iban/i18n/nl_BE.po23
-rw-r--r--addons/base_setup/i18n/nl_BE.po105
-rw-r--r--addons/base_vat/i18n/nl_BE.po10
-rw-r--r--addons/claim_from_delivery/i18n/nl_BE.po23
-rw-r--r--addons/crm/__openerp__.py7
-rw-r--r--addons/crm/crm.py1
-rw-r--r--addons/crm/crm_demo.xml53
-rw-r--r--addons/crm/crm_lead.py33
-rw-r--r--addons/crm/crm_lead_demo.xml43
-rw-r--r--addons/crm/crm_lead_menu.xml9
-rw-r--r--addons/crm/crm_lead_view.xml2
-rw-r--r--addons/crm/crm_phonecall_demo.xml10
-rw-r--r--addons/crm/crm_phonecall_menu.xml4
-rw-r--r--addons/crm/crm_phonecall_view.xml2
-rw-r--r--addons/crm/crm_view.xml4
-rw-r--r--addons/crm/i18n/nl_BE.po1296
-rw-r--r--addons/crm/res_partner.py16
-rw-r--r--addons/crm/res_partner_view.xml2
-rw-r--r--addons/crm/test/process/action_rule.yml6
-rw-r--r--addons/crm/test/process/cancel_lead.yml2
-rw-r--r--addons/crm/test/process/communication_with_customer.yml18
-rw-r--r--addons/crm/test/process/lead2opportunity2win.yml24
-rw-r--r--addons/crm/test/process/merge_opportunity.yml64
-rw-r--r--addons/crm/test/process/phonecalls.yml52
-rw-r--r--addons/crm/wizard/crm_lead_to_opportunity.py23
-rw-r--r--addons/crm/wizard/crm_lead_to_opportunity_view.xml58
-rw-r--r--addons/crm/wizard/crm_merge_opportunities.py4
-rw-r--r--addons/crm/wizard/crm_merge_opportunities_view.xml14
-rw-r--r--addons/crm_claim/crm_claim_view.xml3
-rw-r--r--addons/crm_helpdesk/crm_helpdesk_view.xml5
-rw-r--r--addons/crm_profiling/crm_profiling_view.xml2
-rw-r--r--addons/crm_profiling/security/ir.model.access.csv1
-rw-r--r--addons/delivery/delivery_view.xml27
-rw-r--r--addons/delivery/stock.py25
-rw-r--r--addons/document/__openerp__.py1
-rw-r--r--addons/document/static/src/js/document.js10
-rw-r--r--addons/document_ftp/wizard/ftp_browse.py2
-rw-r--r--addons/document_ftp/wizard/ftp_configuration.py2
-rw-r--r--addons/document_ftp/wizard/ftp_configuration_view.xml2
-rw-r--r--addons/event/event_view.xml39
-rw-r--r--addons/event/res_partner_view.xml4
-rw-r--r--addons/event/security/event_security.xml2
-rw-r--r--addons/fetchmail/fetchmail.py4
-rw-r--r--addons/hr/hr_demo.xml2
-rw-r--r--addons/hr/hr_view.xml41
-rw-r--r--addons/hr/res_config_view.xml2
-rw-r--r--addons/hr_attendance/__init__.py1
-rw-r--r--addons/hr_attendance/__openerp__.py4
-rw-r--r--addons/hr_attendance/hr_attendance.py9
-rw-r--r--addons/hr_attendance/hr_attendance_view.xml13
-rw-r--r--addons/hr_attendance/res_config.py33
-rw-r--r--addons/hr_attendance/res_config_view.xml20
-rw-r--r--addons/hr_attendance/security/ir_rule.xml5
-rw-r--r--addons/hr_attendance/static/src/js/attendance.js7
-rw-r--r--addons/hr_contract/hr_contract_view.xml14
-rw-r--r--addons/hr_evaluation/hr_evaluation.py11
-rw-r--r--addons/hr_evaluation/hr_evaluation_view.xml29
-rw-r--r--addons/hr_expense/hr_expense.py3
-rw-r--r--addons/hr_expense/hr_expense_view.xml7
-rw-r--r--addons/hr_holidays/hr_holidays.py2
-rw-r--r--addons/hr_holidays/hr_holidays_view.xml2
-rw-r--r--addons/hr_payroll/hr_payroll.py5
-rw-r--r--addons/hr_payroll/hr_payroll_view.xml20
-rw-r--r--addons/hr_recruitment/hr_recruitment_view.xml1
-rw-r--r--addons/hr_recruitment/security/ir.model.access.csv2
-rw-r--r--addons/hr_timesheet/hr_timesheet_view.xml8
-rw-r--r--addons/hr_timesheet/security/ir.model.access.csv4
-rw-r--r--addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py10
-rw-r--r--addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml17
-rw-r--r--addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py21
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet.py3
-rw-r--r--addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml41
-rw-r--r--addons/hr_timesheet_sheet/report/hr_timesheet_report.py2
-rw-r--r--addons/hr_timesheet_sheet/report/timesheet_report.py2
-rw-r--r--addons/idea/idea_view.xml1
-rw-r--r--addons/import_google/wizard/google_import_message_view.xml3
-rw-r--r--addons/import_google/wizard/import_google.py11
-rw-r--r--addons/import_google/wizard/import_google_data.py2
-rw-r--r--addons/import_google/wizard/import_google_data_view.xml4
-rw-r--r--addons/l10n_be/i18n/nl_BE.po179
-rw-r--r--addons/l10n_be/wizard/l10n_be_partner_vat_listing.py2
-rw-r--r--addons/l10n_ch/account_wizard.py3
-rw-r--r--addons/l10n_ch/bank.py2
-rw-r--r--addons/l10n_ch/bank_view.xml70
-rw-r--r--addons/l10n_in/l10n_in_private_chart.xml2
-rw-r--r--addons/l10n_ma/__openerp__.py1
-rw-r--r--addons/l10n_ma/security/compta_security.xml8
-rw-r--r--addons/l10n_nl/account_chart_netherlands.xml27
-rw-r--r--addons/lunch/wizard/lunch_order_cancel_view.xml2
-rw-r--r--addons/lunch/wizard/lunch_order_confirm_view.xml2
-rw-r--r--addons/mail/mail_followers.py3
-rw-r--r--addons/mail/mail_group_menu.py10
-rw-r--r--addons/mail/mail_group_view.xml1
-rw-r--r--addons/mail/mail_mail.py8
-rw-r--r--addons/mail/mail_message.py174
-rw-r--r--addons/mail/mail_message_view.xml9
-rw-r--r--addons/mail/mail_thread.py29
-rw-r--r--addons/mail/res_partner_view.xml1
-rw-r--r--addons/mail/security/ir.model.access.csv19
-rw-r--r--addons/mail/security/mail_security.xml27
-rw-r--r--addons/mail/static/src/css/mail.css34
-rw-r--r--addons/mail/static/src/js/mail.js26
-rw-r--r--addons/mail/static/src/js/mail_followers.js66
-rw-r--r--addons/mail/static/src/xml/mail.xml4
-rw-r--r--addons/mail/static/src/xml/mail_followers.xml8
-rw-r--r--addons/mail/tests/__init__.py5
-rw-r--r--addons/mail/tests/test_mail_access_rights.py154
-rw-r--r--addons/marketing_campaign/marketing_campaign_view.xml76
-rw-r--r--addons/marketing_campaign/res_partner.py8
-rw-r--r--addons/marketing_campaign/res_partner_view.xml2
-rw-r--r--addons/membership/membership.py4
-rw-r--r--addons/mrp/mrp.py13
-rw-r--r--addons/mrp/mrp_view.xml30
-rw-r--r--addons/mrp_operations/mrp_operations_view.xml1
-rw-r--r--addons/mrp_repair/mrp_repair_view.xml1
-rw-r--r--addons/mrp_repair/wizard/mrp_repair_make_invoice_view.xml3
-rw-r--r--addons/note/note_view.xml7
-rw-r--r--addons/note/security/res.groups.csv4
-rw-r--r--addons/pad/static/src/css/etherpad.css62
-rw-r--r--addons/pad/static/src/js/pad.js111
-rw-r--r--addons/pad/static/src/xml/pad.xml44
-rw-r--r--addons/point_of_sale/controllers/main.py16
-rw-r--r--addons/point_of_sale/static/src/css/pos.css184
-rw-r--r--addons/point_of_sale/static/src/img/bancontact.pngbin13380 -> 11729 bytes
-rw-r--r--addons/point_of_sale/static/src/img/grid-purple.pngbin0 -> 140385 bytes
-rw-r--r--addons/point_of_sale/static/src/img/grid.pngbin0 -> 54923 bytes
-rw-r--r--addons/point_of_sale/static/src/img/scan.pngbin14404 -> 12693 bytes
-rw-r--r--addons/point_of_sale/static/src/js/devices.js104
-rw-r--r--addons/point_of_sale/static/src/js/screens.js183
-rw-r--r--addons/point_of_sale/static/src/js/widgets.js6
-rw-r--r--addons/point_of_sale/static/src/xml/pos.xml19
-rw-r--r--addons/portal/portal_data.xml2
-rw-r--r--addons/portal/portal_demo.xml4
-rw-r--r--addons/portal/security/ir.model.access.csv12
-rw-r--r--addons/portal/tests/test_portal.py40
-rw-r--r--addons/portal_claim/security/portal_security.xml2
-rw-r--r--addons/portal_crm/__openerp__.py5
-rw-r--r--addons/portal_crm/test/contact_form.yml38
-rw-r--r--addons/portal_crm/wizard/contact.py78
-rw-r--r--addons/portal_event/security/ir.model.access.csv2
-rw-r--r--addons/portal_event/security/portal_security.xml2
-rw-r--r--addons/portal_hr_employees/security/ir.model.access.csv4
-rw-r--r--addons/portal_project/security/portal_security.xml2
-rw-r--r--addons/portal_project_issue/security/portal_security.xml2
-rw-r--r--addons/portal_sale/security/portal_security.xml22
-rw-r--r--addons/procurement/company.py4
-rw-r--r--addons/procurement/procurement.py49
-rw-r--r--addons/procurement/procurement_view.xml1
-rw-r--r--addons/product/pricelist.py2
-rw-r--r--addons/product/product_view.xml1
-rw-r--r--addons/product_visible_discount/__openerp__.py2
-rw-r--r--addons/project/i18n/nl.po8
-rw-r--r--addons/project/project.py12
-rw-r--r--addons/project/project_view.xml61
-rw-r--r--addons/project_issue/project_issue.py8
-rw-r--r--addons/project_issue/project_issue_demo.xml2
-rw-r--r--addons/project_issue/project_issue_view.xml15
-rw-r--r--addons/project_long_term/project_long_term.py2
-rw-r--r--addons/project_long_term/project_long_term_view.xml34
-rw-r--r--addons/project_mrp/project_procurement.py8
-rw-r--r--addons/project_timesheet/project_timesheet.py18
-rw-r--r--addons/project_timesheet/project_timesheet_view.xml2
-rw-r--r--addons/purchase/i18n/nl_BE.po12
-rw-r--r--addons/purchase/partner.py10
-rw-r--r--addons/purchase/partner_view.xml29
-rw-r--r--addons/purchase/purchase.py16
-rw-r--r--addons/purchase/purchase_view.xml1
-rw-r--r--addons/purchase/report/request_quotation.rml2
-rw-r--r--addons/purchase_requisition/purchase_requisition.py3
-rw-r--r--addons/purchase_requisition/purchase_requisition_view.xml5
-rw-r--r--addons/report_webkit/webkit_report.py41
-rw-r--r--addons/report_webkit_sample/report/report_webkit_html.mako2
-rw-r--r--addons/sale/i18n/nl_BE.po483
-rw-r--r--addons/sale/report/sale_order.rml6
-rw-r--r--addons/sale/report/sale_report.py1
-rw-r--r--addons/sale/res_config_view.xml4
-rw-r--r--addons/sale/res_partner.py10
-rw-r--r--addons/sale/sale_view.xml7
-rw-r--r--addons/sale/security/ir.model.access.csv2
-rw-r--r--addons/sale_crm/sale_crm.py16
-rw-r--r--addons/sale_stock/sale_stock.py6
-rw-r--r--addons/share/ir_model.py1
-rw-r--r--addons/stock/i18n/es_MX.po3983
-rw-r--r--addons/stock/report/report_stock_move.py9
-rw-r--r--addons/stock/report/report_stock_move_view.xml2
-rw-r--r--addons/stock/res_config_view.xml10
-rw-r--r--addons/stock/security/ir.model.access.csv4
-rw-r--r--addons/stock/stock.py127
-rw-r--r--addons/stock/stock_view.xml24
-rw-r--r--addons/stock/wizard/stock_fill_inventory.py15
-rw-r--r--addons/stock/wizard/stock_partial_picking.py1
-rw-r--r--addons/subscription/subscription.py2
-rw-r--r--addons/survey/survey.py8
226 files changed, 5159 insertions, 4743 deletions
diff --git a/addons/account/account.py b/addons/account/account.py
index c2e6f3d1221..fbbbfd64537 100644
--- a/addons/account/account.py
+++ b/addons/account/account.py
@@ -31,7 +31,7 @@ import decimal_precision as dp
from tools.translate import _
from tools.float_utils import float_round
from openerp import SUPERUSER_ID
-
+import tools
_logger = logging.getLogger(__name__)
@@ -227,7 +227,7 @@ class account_account(osv.osv):
while pos < len(args):
if args[pos][0] == 'code' and args[pos][1] in ('like', 'ilike') and args[pos][2]:
- args[pos] = ('code', '=like', str(args[pos][2].replace('%', ''))+'%')
+ args[pos] = ('code', '=like', tools.ustr(args[pos][2].replace('%', ''))+'%')
if args[pos][0] == 'journal_id':
if not args[pos][2]:
del args[pos]
@@ -682,7 +682,7 @@ class account_journal_view(osv.osv):
_name = "account.journal.view"
_description = "Journal View"
_columns = {
- 'name': fields.char('Journal View', size=64, required=True),
+ 'name': fields.char('Journal View', size=64, required=True, translate=True),
'columns_id': fields.one2many('account.journal.column', 'view_id', 'Columns')
}
_order = "name"
@@ -1908,7 +1908,7 @@ class account_tax(osv.osv):
'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."),
'include_base_amount': fields.boolean('Included in base amount', help="Indicates if the amount of tax must be included in the base amount for the computation of the next taxes"),
'company_id': fields.many2one('res.company', 'Company', required=True),
- 'description': fields.char('Tax Code',size=32),
+ 'description': fields.char('Tax Code'),
'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."),
'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Application', required=True)
@@ -2518,7 +2518,7 @@ class account_account_template(osv.osv):
'reconcile': fields.boolean('Allow Reconciliation', help="Check this option if you want the user to reconcile entries in this account."),
'shortcut': fields.char('Shortcut', size=12),
'note': fields.text('Note'),
- 'parent_id': fields.many2one('account.account.template', 'Parent Account Template', ondelete='cascade'),
+ 'parent_id': fields.many2one('account.account.template', 'Parent Account Template', ondelete='cascade', domain=[('type','=','view')]),
'child_parent_ids':fields.one2many('account.account.template', 'parent_id', 'Children'),
'tax_ids': fields.many2many('account.tax.template', 'account_account_template_tax_rel', 'account_id', 'tax_id', 'Default Taxes'),
'nocreate': fields.boolean('Optional create', help="If checked, the new chart of accounts will not contain this by default."),
@@ -2536,20 +2536,6 @@ class account_account_template(osv.osv):
(_check_recursion, 'Error!\nYou cannot create recursive account templates.', ['parent_id']),
]
- def create(self, cr, uid, vals, context=None):
- if 'parent_id' in vals:
- parent = self.read(cr, uid, [vals['parent_id']], ['type'])
- if parent and parent[0]['type'] != 'view':
- raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'."))
- return super(account_account_template, self).create(cr, uid, vals, context=context)
-
- def write(self, cr, uid, ids, vals, context=None):
- if 'parent_id' in vals:
- parent = self.read(cr, uid, [vals['parent_id']], ['type'])
- if parent and parent[0]['type'] != 'view':
- raise osv.except_osv(_('Warning!'), _("You may only select a parent account of type 'View'."))
- return super(account_account_template, self).write(cr, uid, ids, vals, context=context)
-
def name_get(self, cr, uid, ids, context=None):
if not ids:
return []
@@ -2828,7 +2814,7 @@ class account_tax_template(osv.osv):
'ref_base_sign': fields.float('Base Code Sign', help="Usually 1 or -1."),
'ref_tax_sign': fields.float('Tax Code Sign', help="Usually 1 or -1."),
'include_base_amount': fields.boolean('Include in Base Amount', help="Set if the amount of tax must be included in the base amount before computing the next taxes."),
- 'description': fields.char('Internal Name', size=32),
+ 'description': fields.char('Internal Name'),
'type_tax_use': fields.selection([('sale','Sale'),('purchase','Purchase'),('all','All')], 'Tax Use In', required=True,),
'price_include': fields.boolean('Tax Included in Price', help="Check this if the price you use on the product and invoices includes this tax."),
}
diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py
index 9889eadf387..b4fc2388a68 100644
--- a/addons/account/account_bank_statement.py
+++ b/addons/account/account_bank_statement.py
@@ -457,6 +457,8 @@ class account_bank_statement(osv.osv):
return res and res[0] or 0.0
def onchange_journal_id(self, cr, uid, statement_id, journal_id, context=None):
+ if not journal_id:
+ return {}
balance_start = self._compute_balance_end_real(cr, uid, journal_id, context=context)
journal_data = self.pool.get('account.journal').read(cr, uid, journal_id, ['default_debit_account_id', 'company_id'], context=context)
diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index aff38d71cfe..a1c53eff4b1 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -508,8 +508,10 @@ class account_invoice(osv.osv):
if journal_id:
journal = self.pool.get('account.journal').browse(cr, uid, journal_id, context=context)
currency_id = journal.currency and journal.currency.id or journal.company_id.currency_id.id
+ company_id = journal.company_id.id
result = {'value': {
'currency_id': currency_id,
+ 'company_id': company_id,
}
}
return result
@@ -1371,7 +1373,10 @@ class account_invoice_line(osv.osv):
'partner_id': fields.related('invoice_id','partner_id',type='many2one',relation='res.partner',string='Partner',store=True)
}
- def _default_account_id(self, cr, uid, ids, context=None):
+ def _default_account_id(self, cr, uid, context=None):
+ # XXX this gets the default account for the user's company,
+ # it should get the default account for the invoice's company
+ # however, the invoice's company does not reach this point
prop = self.pool.get('ir.property').get(cr, uid, 'property_account_income_categ', 'product.category', context=context)
return prop and prop.id or False
@@ -1401,7 +1406,7 @@ class account_invoice_line(osv.osv):
context = {}
company_id = company_id if company_id != None else context.get('company_id',False)
context = dict(context)
- context.update({'company_id': company_id})
+ context.update({'company_id': company_id, 'force_company': company_id})
if not partner_id:
raise osv.except_osv(_('No Partner Defined !'),_("You must first select a partner !") )
if not product:
@@ -1556,16 +1561,19 @@ class account_invoice_line(osv.osv):
def onchange_account_id(self, cr, uid, ids, product_id, partner_id, inv_type, fposition_id, account_id):
if not account_id:
return {}
- taxes = self.pool.get('account.account').browse(cr, uid, account_id).tax_ids
+ unique_tax_ids = []
fpos = fposition_id and self.pool.get('account.fiscal.position').browse(cr, uid, fposition_id) or False
- tax_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)
-
- product_change_result = self.product_id_change(cr, uid, ids, product_id, False, type=inv_type,
- partner_id=partner_id, fposition_id=fposition_id)
- unique_tax_ids = set(tax_ids)
- if product_change_result and 'value' in product_change_result and 'invoice_line_tax_id' in product_change_result['value']:
- unique_tax_ids |= set(product_change_result['value']['invoice_line_tax_id'])
- return {'value':{'invoice_line_tax_id': list(unique_tax_ids)}}
+ account = self.pool.get('account.account').browse(cr, uid, account_id)
+ if not product_id:
+ taxes = account.tax_ids
+ unique_tax_ids = self.pool.get('account.fiscal.position').map_tax(cr, uid, fpos, taxes)
+ else:
+ product_change_result = self.product_id_change(cr, uid, ids, product_id, False, type=inv_type,
+ partner_id=partner_id, fposition_id=fposition_id,
+ company_id=account.company_id.id)
+ if product_change_result and 'value' in product_change_result and 'invoice_line_tax_id' in product_change_result['value']:
+ unique_tax_ids = product_change_result['value']['invoice_line_tax_id']
+ return {'value':{'invoice_line_tax_id': unique_tax_ids}}
account_invoice_line()
@@ -1650,14 +1658,13 @@ class account_invoice_tax(osv.osv):
for line in inv.invoice_line:
for tax in tax_obj.compute_all(cr, uid, line.invoice_line_tax_id, (line.price_unit* (1-(line.discount or 0.0)/100.0)), line.quantity, line.product_id, inv.partner_id)['taxes']:
- tax['price_unit'] = cur_obj.round(cr, uid, cur, tax['price_unit'])
val={}
val['invoice_id'] = inv.id
val['name'] = tax['name']
val['amount'] = tax['amount']
val['manual'] = False
val['sequence'] = tax['sequence']
- val['base'] = tax['price_unit'] * line['quantity']
+ val['base'] = cur_obj.round(cr, uid, cur, tax['price_unit'] * line['quantity'])
if inv.type in ('out_invoice','in_invoice'):
val['base_code_id'] = tax['base_code_id']
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index 1c4d83106ca..4a587eee6fe 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -278,6 +278,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -299,8 +300,8 @@
<button name="invoice_open" states="draft" string="Validate" class="oe_highlight"/>
<button name="invoice_open" states="proforma2" string="Validate"/>
<button name="invoice_proforma2" states="draft" string="PRO-FORMA" groups="account.group_proforma_invoices"/>
- <button name="%(action_account_invoice_refund)d" type='action' string='Refund Invoice' states='paid'/>
- <button name="invoice_cancel" states="draft,proforma2,sale,open" string="Cancel" groups="base.group_no_one"/>
+ <button name="%(action_account_invoice_refund)d" type='action' string='Refund Invoice' states='open,proforma2,paid'/>
+ <button name="invoice_cancel" states="draft,proforma2,open" string="Cancel" groups="base.group_no_one"/>
<button name="action_cancel_draft" states="cancel" string="Reset to Draft" type="object"/>
<button name='%(action_account_state_open)d' type='action' string='Re-Open' groups="account.group_account_invoice" attrs="{'invisible':['|', ('state','&lt;&gt;','paid'), ('reconciled', '=', True)]}" help="This button only appears when the state of the invoice is 'paid' (showing that it has been fully reconciled) and auto-computed boolean 'reconciled' is False (depicting that it's not the case anymore). In other words, the invoice has been dereconciled and it does not fit anymore the 'paid' state. You should press this button to re-open it and let it continue its normal process after having resolved the eventual exceptions it may have created."/>
<!--button name="%(account_invoices)d" string="Print Invoice" type="action" states="open,paid,proforma,sale,proforma2"/-->
@@ -437,6 +438,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py
index 5ddbbee74f2..bb1ace992ca 100644
--- a/addons/account/account_move_line.py
+++ b/addons/account/account_move_line.py
@@ -562,6 +562,7 @@ class account_move_line(osv.osv):
'journal_id': lambda self, cr, uid, c: c.get('journal_id', False),
'credit': 0.0,
'debit': 0.0,
+ 'amount_currency': 0.0,
'account_id': lambda self, cr, uid, c: c.get('account_id', False),
'period_id': lambda self, cr, uid, c: c.get('period_id', False),
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.move.line', context=c)
@@ -1193,12 +1194,12 @@ class account_move_line(osv.osv):
jour_period_obj = self.pool.get('account.journal.period')
cr.execute('SELECT state FROM account_journal_period WHERE journal_id = %s AND period_id = %s', (journal_id, period_id))
result = cr.fetchall()
+ journal = journal_obj.browse(cr, uid, journal_id, context=context)
+ period = period_obj.browse(cr, uid, period_id, context=context)
for (state,) in result:
if state == 'done':
- raise osv.except_osv(_('Error!'), _('You cannot add/modify entries in a closed journal.'))
+ raise osv.except_osv(_('Error !'), _('You can not add/modify entries in a closed period %s of journal %s.' % (period.name,journal.name)))
if not result:
- journal = journal_obj.browse(cr, uid, journal_id, context=context)
- period = period_obj.browse(cr, uid, period_id, context=context)
jour_period_obj.create(cr, uid, {
'name': (journal.code or journal.name)+':'+(period.name or ''),
'journal_id': journal.id,
diff --git a/addons/account/account_view.xml b/addons/account/account_view.xml
index 2c204fdf707..1fbda80a0fe 100644
--- a/addons/account/account_view.xml
+++ b/addons/account/account_view.xml
@@ -1305,16 +1305,6 @@
Account.Entry Edition
-->
- <record id="account_move_graph" model="ir.ui.view">
- <field name="name">account.move.graph</field>
- <field name="model">account.move</field>
- <field name="arch" type="xml">
- <graph string="Account Statistics" type="bar">
- <field name="period_id"/>
- <field name="amount" operator="+"/>
- </graph>
- </field>
- </record>
<record id="view_move_tree" model="ir.ui.view">
<field name="name">account.move.tree</field>
<field name="model">account.move</field>
@@ -1338,8 +1328,8 @@
<field name="arch" type="xml">
<form string="Account Entry" version="7.0">
<header>
- <button name="button_validate" states="draft" string="Post" type="object" class="oe_highlight"/>
- <button name="button_cancel" states="posted" string="Cancel" type="object"/>
+ <button name="button_validate" states="draft" string="Post" type="object" class="oe_highlight" groups="account.group_account_invoice"/>
+ <button name="button_cancel" states="posted" string="Cancel" type="object" groups="account.group_account_invoice"/>
<field name="state" widget="statusbar"/>
</header>
<sheet string="Journal Entries" >
@@ -1488,7 +1478,7 @@
<field name="name">Journal Entries</field>
<field name="res_model">account.move</field>
<field name="view_type">form</field>
- <field name="view_mode">tree,form,graph</field>
+ <field name="view_mode">tree,form</field>
<field name="view_id" ref="view_move_tree"/>
<field name="search_view_id" ref="view_account_move_filter"/>
<field name="help" type="html">
@@ -2037,7 +2027,7 @@
src_model="account.journal"/>
<act_window
- context="{'search_default_reconcile_id':False, 'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
+ context="{'search_default_unreconciled':True, 'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
domain="[('account_id.reconcile', '=', True),('account_id.type', 'in', ['receivable', 'payable'])]"
id="act_account_partner_account_move_all"
name="Receivables &amp; Payables"
@@ -2073,7 +2063,7 @@
id="account_template_folder"
name="Templates"
parent="menu_finance_accounting"
- groups="base.group_multi_company"/>
+ groups="account.group_account_manager"/>
<menuitem
id="account_template_taxes"
name="Taxes"
diff --git a/addons/account/partner.py b/addons/account/partner.py
index f2b9f79bb8a..a9b2b99588d 100644
--- a/addons/account/partner.py
+++ b/addons/account/partner.py
@@ -44,17 +44,17 @@ class account_fiscal_position(osv.osv):
return []
if not fposition_id:
return map(lambda x: x.id, taxes)
- result = []
+ result = set()
for t in taxes:
ok = False
for tax in fposition_id.tax_ids:
if tax.tax_src_id.id == t.id:
if tax.tax_dest_id:
- result.append(tax.tax_dest_id.id)
+ result.add(tax.tax_dest_id.id)
ok=True
if not ok:
- result.append(t.id)
- return result
+ result.add(t.id)
+ return list(result)
def map_account(self, cr, uid, fposition_id, account_id, context=None):
if not fposition_id:
@@ -77,6 +77,12 @@ class account_fiscal_position_tax(osv.osv):
'tax_dest_id': fields.many2one('account.tax', 'Replacement Tax')
}
+ _sql_constraints = [
+ ('tax_src_dest_uniq',
+ 'unique (position_id,tax_src_id,tax_dest_id)',
+ 'A tax fiscal position could be defined only once time on same taxes.')
+ ]
+
account_fiscal_position_tax()
class account_fiscal_position_account(osv.osv):
@@ -89,6 +95,12 @@ class account_fiscal_position_account(osv.osv):
'account_dest_id': fields.many2one('account.account', 'Account Destination', domain=[('type','<>','view')], required=True)
}
+ _sql_constraints = [
+ ('account_src_dest_uniq',
+ 'unique (position_id,account_src_id,account_dest_id)',
+ 'An account fiscal position could be defined only once time on same accounts.')
+ ]
+
account_fiscal_position_account()
class res_partner(osv.osv):
diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml
index 7ac1efd4f9f..4bee2002ffd 100644
--- a/addons/account/partner_view.xml
+++ b/addons/account/partner_view.xml
@@ -92,34 +92,7 @@
<field name="debit"/>
</group>
</group>
- <field name="bank_ids">
- <form string="Bank account" version="7.0">
- <group col="4">
- <field name="state"/>
- <field name="acc_number"/>
- </group>
- <group>
- <group name="owner" string="Bank Account Owner">
- <field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
- <field name="owner_name"/>
- <label for="street" string="Address"/>
- <div>
- <field name="street" placeholder="Street..."/>
- <div>
- <field name="zip" class="oe_inline" placeholder="ZIP"/>
- <field name="city" class="oe_inline" placeholder="City"/>
- </div>
- <field name="state_id" placeholder="State" options='{"no_open": true}'/>
- <field name="country_id" placeholder="Country" options='{"no_open": true}'/>
- </div>
- </group>
- <group name="bank" string="Information About the Bank">
- <field name="bank" on_change="onchange_bank_id(bank)"/>
- <field name="bank_name"/>
- <field name="bank_bic" placeholder="e.g. GEBABEBB"/>
- </group>
- </group>
- </form>
+ <field name="bank_ids" context="{'default_partner_id': active_id, 'form_view_ref': 'base.view_partner_bank_form'}">
<tree string="Bank Details">
<field name="sequence" invisible="1"/>
<field name="acc_number"/>
@@ -141,7 +114,7 @@
context="{'search_default_partner_id':[active_id], 'default_partner_id': active_id}"
src_model="res.partner"
view_type="form"
- view_mode="tree,form,graph,calendar"/>
+ view_mode="tree,form,calendar"/>
</data>
</openerp>
diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml
index da1a11b9cb6..70db95425b1 100644
--- a/addons/account/project/project_view.xml
+++ b/addons/account/project/project_view.xml
@@ -73,7 +73,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.analytic.account</field>
<field name="view_type">form</field>
- <field name="view_mode">tree,graph,form</field>
+ <field name="view_mode">tree,form</field>
<field name="view_id" ref="view_account_analytic_account_tree"/>
<field name="search_view_id" ref="account.view_account_analytic_account_search"/>
</record>
@@ -114,9 +114,6 @@
</field>
</record>
- <menuitem groups="analytic.group_analytic_accounting" id="next_id_40"
- name="Analytic" parent="account.menu_finance_generic_reporting"
- sequence="4"/>
<record id="view_account_analytic_line_form" model="ir.ui.view">
<field name="name">account.analytic.line.form</field>
@@ -351,15 +348,6 @@
# Reporting
#
- <record id="action_account_analytic_journal_tree" model="ir.actions.act_window">
- <field name="name">Print Analytic Journals</field>
- <field name="res_model">account.analytic.journal</field>
- <field name="view_type">tree</field>
- <field name="help">To print an analytics (or costs) journal for a given period. The report give code, move name, account number, general amount and analytic amount.</field>
- </record>
- <menuitem groups="analytic.group_analytic_accounting"
- action="action_account_analytic_journal_tree"
- id="account_analytic_journal_print" parent="account.next_id_40"/>
<record id="view_account_journal_1" model="ir.ui.view">
<field name="name">account.journal.form.1</field>
@@ -372,16 +360,5 @@
</field>
</record>
- <record id="analytic_accounts_graph" model="ir.ui.view">
- <field name="name">analytic.accounts.graph</field>
- <field name="model">account.analytic.account</field>
- <field name="arch" type="xml">
- <graph string="Analytic Account Statistics" type="bar">
- <field name="complete_name"/>
- <field name="balance" operator="+"/>
- </graph>
- </field>
- </record>
-
</data>
</openerp>
diff --git a/addons/account/project/wizard/account_analytic_journal_report.py b/addons/account/project/wizard/account_analytic_journal_report.py
index 9a2eee020b1..8148a016927 100644
--- a/addons/account/project/wizard/account_analytic_journal_report.py
+++ b/addons/account/project/wizard/account_analytic_journal_report.py
@@ -29,6 +29,7 @@ class account_analytic_journal_report(osv.osv_memory):
_columns = {
'date1': fields.date('Start of period', required=True),
'date2': fields.date('End of period', required=True),
+ 'analytic_account_journal_id': fields.many2many('account.analytic.journal', 'account_analytic_journal_name', 'journal_line_id', 'journal_print_id', 'Analytic Journals', required=True),
}
_defaults = {
@@ -40,8 +41,15 @@ class account_analytic_journal_report(osv.osv_memory):
if context is None:
context = {}
data = self.read(cr, uid, ids)[0]
+ ids_list = []
+ if context.get('active_id',False):
+ ids_list.append(context.get('active_id',False))
+ else:
+ record = self.browse(cr,uid,ids[0],context=context)
+ for analytic_record in record.analytic_account_journal_id:
+ ids_list.append(analytic_record.id)
datas = {
- 'ids': context.get('active_ids',[]),
+ 'ids': ids_list,
'model': 'account.analytic.journal',
'form': data
}
@@ -50,6 +58,14 @@ class account_analytic_journal_report(osv.osv_memory):
'report_name': 'account.analytic.journal',
'datas': datas,
}
+
+ def default_get(self, cr, uid, fields, context=None):
+ if context is None:
+ context = {}
+ res = super(account_analytic_journal_report, self).default_get(cr, uid, fields, context=context)
+ if 'analytic_account_journal_id' in fields:
+ res.update({'analytic_account_journal_id': context.get('active_ids',[])})
+ return res
account_analytic_journal_report()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account/project/wizard/account_analytic_journal_report_view.xml b/addons/account/project/wizard/account_analytic_journal_report_view.xml
index e4c4cd314db..b0cb0293270 100644
--- a/addons/account/project/wizard/account_analytic_journal_report_view.xml
+++ b/addons/account/project/wizard/account_analytic_journal_report_view.xml
@@ -7,15 +7,16 @@
<field name="model">account.analytic.journal.report</field>
<field name="arch" type="xml">
<form string="Select Period" version="7.0">
- <header>
- <button name="check_report" string="Print" type="object" class="oe_highlight"/>
- or
- <button string="Cancel" class="oe_link" special="cancel"/>
- </header>
<group col="4">
<field name="date1"/>
<field name="date2"/>
+ <field name="analytic_account_journal_id" widget="many2many_tags" class="oe_inline" required="1"/>
</group>
+ <footer>
+ <button name="check_report" string="Print" type="object" class="oe_highlight"/>
+ or
+ <button string="Cancel" class="oe_link" special="cancel"/>
+ </footer>
</form>
</field>
</record>
@@ -38,6 +39,13 @@
<field name="key">action</field>
<field name="model">account.analytic.journal</field>
</record>
+
+ <menuitem groups="analytic.group_analytic_accounting" id="next_id_40"
+ name="Analytic" parent="account.menu_finance_generic_reporting"
+ sequence="4"/>
+ <menuitem groups="analytic.group_analytic_accounting"
+ action="account.action_account_analytic_journal"
+ id="account_analytic_journal_print" parent="account.next_id_40"/>
</data>
</openerp>
diff --git a/addons/account/security/account_security.xml b/addons/account/security/account_security.xml
index 442b51466f8..4b90e0c8ad5 100644
--- a/addons/account/security/account_security.xml
+++ b/addons/account/security/account_security.xml
@@ -16,7 +16,7 @@
</record>
<record id="group_account_manager" model="res.groups">
- <field name="name">Manager</field>
+ <field name="name">Financial Manager</field>
<field name="category_id" ref="base.module_category_accounting_and_finance"/>
<field name="implied_ids" eval="[(4, ref('group_account_user'))]"/>
</record>
diff --git a/addons/account/wizard/account_invoice_refund.py b/addons/account/wizard/account_invoice_refund.py
index b7d278b8849..38a22baa9f1 100644
--- a/addons/account/wizard/account_invoice_refund.py
+++ b/addons/account/wizard/account_invoice_refund.py
@@ -32,11 +32,11 @@ class account_invoice_refund(osv.osv_memory):
_name = "account.invoice.refund"
_description = "Invoice Refund"
_columns = {
- 'date': fields.date('Operation Date', help='This date will be used as the invoice date for credit note and period will be chosen accordingly!'),
+ 'date': fields.date('Date', help='This date will be used as the invoice date for credit note and period will be chosen accordingly!'),
'period': fields.many2one('account.period', 'Force period'),
'journal_id': fields.many2one('account.journal', 'Refund Journal', help='You can select here the journal to use for the credit note that will be created. If you leave that field empty, it will use the same journal as the current invoice.'),
- 'description': fields.char('Description', size=128, required=True),
- 'filter_refund': fields.selection([('refund', 'Create a draft refund'), ('cancel', 'Cancel: create credit note and reconcile'),('modify', 'Modify: create credit note, reconcile and create a new draft invoice')], "Refund Method", required=True, help='Credit note base on this type. You can not Modify and Cancel if the invoice is already reconciled'),
+ 'description': fields.char('Reason', size=128, required=True),
+ 'filter_refund': fields.selection([('refund', 'Create a draft credit note'), ('cancel', 'Cancel: create credit note and reconcile'),('modify', 'Modify: create credit note, reconcile and create a new draft invoice')], "Refund Method", required=True, help='Credit note base on this type. You can not Modify and Cancel if the invoice is already reconciled'),
}
def _get_journal(self, cr, uid, context=None):
diff --git a/addons/account/wizard/account_invoice_refund_view.xml b/addons/account/wizard/account_invoice_refund_view.xml
index 78a9b085bf1..3945a6f57e6 100644
--- a/addons/account/wizard/account_invoice_refund_view.xml
+++ b/addons/account/wizard/account_invoice_refund_view.xml
@@ -7,19 +7,40 @@
<field name="model">account.invoice.refund</field>
<field name="arch" type="xml">
<form string="Credit Note" version="7.0">
- <separator string="Credit Note Options"/>
- <group col="4">
- <field name="description"/>
- <field name="journal_id" widget='selection'/>
- <field name="date"/>
- <field name="period"/>
- <field name="filter_refund"/>
+ <group>
+ <group colspan="2">
+ <label for="filter_refund"/>
+ <div>
+ <field name="filter_refund" class="oe_inline"/>
+ <p attrs="{'invisible':[('filter_refund','&lt;&gt;','refund')]}" class="oe_grey">
+ You will be able to edit and validate this
+ credit note directly or keep it draft,
+ waiting for the document to be issued by
+ your supplier/customer.
+ </p>
+ <p attrs="{'invisible':[('filter_refund','&lt;&gt;','cancel')]}" class="oe_grey">
+ Use this option if you want to cancel an invoice you should not
+ have issued. The credit note will be created, validated and reconciled
+ with the invoice. You will not be able to modify the credit note.
+ </p>
+ <p attrs="{'invisible':[('filter_refund','&lt;&gt;','modify')]}" class="oe_grey">
+ Use this option if you want to cancel an invoice and create a new
+ one. The credit note will be created, validated and reconciled
+ with the current invoice. A new, draft, invoice will be created
+ so that you can edit it.
+ </p>
+ </div>
+ </group>
+ <group>
+ <field name="description"/>
+ <field name="journal_id" widget='selection'/>
+ </group><group>
+ <field name="date"/>
+ <field name="period"/>
+ </group>
</group>
- <label string="Modify Invoice: Cancels the current invoice and creates a new copy of it ready for editing."/>
- <label string="Credit Note: Creates the credit note, ready for editing."/>
- <label string="Cancel Invoice: Creates the credit note, validate and reconcile it to cancel the current invoice."/>
<footer>
- <button string='Refund' name="invoice_refund" type="object" class="oe_highlight"/>
+ <button string='Create Credit Note' name="invoice_refund" type="object" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
@@ -28,7 +49,7 @@
</record>
<record id="action_account_invoice_refund" model="ir.actions.act_window">
- <field name="name">Refund</field>
+ <field name="name">Refund Invoice</field>
<field name="res_model">account.invoice.refund</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
diff --git a/addons/account/wizard/account_reconcile.py b/addons/account/wizard/account_reconcile.py
index 9fa521c09f7..f3d25b1c8db 100644
--- a/addons/account/wizard/account_reconcile.py
+++ b/addons/account/wizard/account_reconcile.py
@@ -23,6 +23,7 @@ import time
from osv import fields, osv
from tools.translate import _
+import decimal_precision as dp
class account_move_line_reconcile(osv.osv_memory):
"""
@@ -32,9 +33,9 @@ class account_move_line_reconcile(osv.osv_memory):
_description = 'Account move line reconcile'
_columns = {
'trans_nbr': fields.integer('# of Transaction', readonly=True),
- 'credit': fields.float('Credit amount', readonly=True),
- 'debit': fields.float('Debit amount', readonly=True),
- 'writeoff': fields.float('Write-Off amount', readonly=True),
+ 'credit': fields.float('Credit amount', readonly=True, digits_compute=dp.get_precision('Account')),
+ 'debit': fields.float('Debit amount', readonly=True, digits_compute=dp.get_precision('Account')),
+ 'writeoff': fields.float('Write-Off amount', readonly=True, digits_compute=dp.get_precision('Account')),
}
def default_get(self, cr, uid, fields, context=None):
diff --git a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
index ffbe48f0b19..d56b6ee4760 100644
--- a/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
+++ b/addons/account_analytic_analysis/account_analytic_analysis_menu.xml
@@ -48,7 +48,7 @@
<field name="name">Contracts to Renew</field>
<field name="res_model">account.analytic.account</field>
<field name="view_type">form</field>
- <field name="view_mode">tree,form,graph</field>
+ <field name="view_mode">tree,form</field>
<field name="context">{'search_default_user_id':uid, 'search_default_draft':1, 'search_default_pending':1, 'search_default_open':1, 'search_default_renew':1}</field>
<field name="domain">[('type','=','contract')]</field>
<field name="search_view_id" ref="view_account_analytic_account_overdue_search"/>
@@ -72,7 +72,7 @@
<field name="name">Contracts</field>
<field name="res_model">account.analytic.account</field>
<field name="view_type">form</field>
- <field name="view_mode">tree,form,graph</field>
+ <field name="view_mode">tree,form</field>
<field name="context">{'default_type':'contract', 'search_default_open':1, 'search_default_pending':1}</field>
<field name="domain">[('type','=','contract')]</field>
<field name="search_view_id" ref="view_account_analytic_account_overdue_search"/>
diff --git a/addons/account_asset/account_asset.py b/addons/account_asset/account_asset.py
index b6828062a85..e6861d0db67 100644
--- a/addons/account_asset/account_asset.py
+++ b/addons/account_asset/account_asset.py
@@ -350,7 +350,7 @@ class account_asset_depreciation_line(osv.osv):
'amount': fields.float('Depreciation Amount', required=True),
'remaining_value': fields.float('Amount to Depreciate', required=True),
'depreciated_value': fields.float('Amount Already Depreciated', required=True),
- 'depreciation_date': fields.char('Depreciation Date', size=64, select=1),
+ 'depreciation_date': fields.date('Depreciation Date', select=1),
'move_id': fields.many2one('account.move', 'Depreciation Entry'),
'move_check': fields.function(_get_move_check, method=True, type='boolean', string='Posted', store=True)
}
@@ -368,7 +368,7 @@ class account_asset_depreciation_line(osv.osv):
for line in self.browse(cr, uid, ids, context=context):
if currency_obj.is_zero(cr, uid, line.asset_id.currency_id, line.remaining_value):
can_close = True
- depreciation_date = line.asset_id.prorata and line.asset_id.purchase_date or time.strftime('%Y-%m-%d')
+ depreciation_date = time.strftime('%Y-%m-%d')
period_ids = period_obj.find(cr, uid, depreciation_date, context=context)
company_currency = line.asset_id.company_id.currency_id.id
current_currency = line.asset_id.currency_id.id
diff --git a/addons/account_asset/account_asset_invoice.py b/addons/account_asset/account_asset_invoice.py
index 700832881c4..4b38834bdc3 100644
--- a/addons/account_asset/account_asset_invoice.py
+++ b/addons/account_asset/account_asset_invoice.py
@@ -57,6 +57,7 @@ class account_invoice_line(osv.osv):
'partner_id': line.invoice_id.partner_id.id,
'company_id': line.invoice_id.company_id.id,
'currency_id': line.invoice_id.currency_id.id,
+ 'purchase_date' : line.invoice_id.date_invoice,
}
changed_vals = asset_obj.onchange_category_id(cr, uid, [], vals['category_id'], context=context)
vals.update(changed_vals['value'])
diff --git a/addons/account_asset/report/account_asset_report.py b/addons/account_asset/report/account_asset_report.py
index 000967a555c..583e5534613 100644
--- a/addons/account_asset/report/account_asset_report.py
+++ b/addons/account_asset/report/account_asset_report.py
@@ -50,7 +50,7 @@ class asset_asset_report(osv.osv):
select
min(dl.id) as id,
dl.name as name,
- to_date(dl.depreciation_date, 'YYYY-MM-DD') as depreciation_date,
+ dl.depreciation_date as depreciation_date,
a.purchase_date as purchase_date,
(CASE WHEN (select min(d.id) from account_asset_depreciation_line as d
left join account_asset_asset as ac ON (ac.id=d.asset_id)
@@ -77,7 +77,7 @@ class asset_asset_report(osv.osv):
from account_asset_depreciation_line dl
left join account_asset_asset a on (dl.asset_id=a.id)
group by
- dl.amount,dl.asset_id,to_date(dl.depreciation_date, 'YYYY-MM-DD'),dl.name,
+ dl.amount,dl.asset_id,dl.depreciation_date,dl.name,
a.purchase_date, dl.move_check, a.state, a.category_id, a.partner_id, a.company_id,
a.purchase_value, a.id, a.salvage_value
)""")
diff --git a/addons/account_bank_statement_extensions/account_bank_statement_view.xml b/addons/account_bank_statement_extensions/account_bank_statement_view.xml
index 30b2778817c..1c076426752 100644
--- a/addons/account_bank_statement_extensions/account_bank_statement_view.xml
+++ b/addons/account_bank_statement_extensions/account_bank_statement_view.xml
@@ -76,7 +76,7 @@
<field name="ref" readonly="1"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
<field name="type" on_change="onchange_type(partner_id, type)"/>
- <field name="account_id" domain="[('journal_id','=',parent.journal_id)]"/>
+ <field name="account_id" domain="[('journal_id','=',journal_id)]"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', parent.company_id), ('type', '&lt;&gt;', 'view')]"/>
<field name="amount" readonly="1" sum="Total Amount"/>
<field name="globalisation_id" string="Glob. Id"/>
@@ -100,7 +100,7 @@
<field name="ref" readonly="0"/>
<field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
<field name="type" on_change="onchange_type(partner_id, type)"/>
- <field domain="[('journal_id', '=', parent.journal_id), ('type', '&lt;&gt;', 'view')]" name="account_id"/>
+ <field domain="[('journal_id', '=', journal_id), ('type', '&lt;&gt;', 'view')]" name="account_id"/>
<field name="analytic_account_id" groups="analytic.group_analytic_accounting" domain="[('company_id', '=', parent.company_id), ('type', '&lt;&gt;', 'view')]"/>
<field name="amount"/>
<field name="globalisation_id"/>
diff --git a/addons/account_coda/i18n/en_AU.po b/addons/account_coda/i18n/en_AU.po
index 05ee43ee631..319220741c5 100644
--- a/addons/account_coda/i18n/en_AU.po
+++ b/addons/account_coda/i18n/en_AU.po
@@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-09-27 04:36+0000\n"
-"X-Generator: Launchpad (build 16033)\n"
+"X-Launchpad-Export-Date: 2012-09-28 04:39+0000\n"
+"X-Generator: Launchpad (build 16043)\n"
#. module: account_coda
#: model:account.coda.trans.code,description:account_coda.actcc_09_21
diff --git a/addons/account_payment/wizard/account_payment_order.py b/addons/account_payment/wizard/account_payment_order.py
index 713784798fc..455475b0ae5 100644
--- a/addons/account_payment/wizard/account_payment_order.py
+++ b/addons/account_payment/wizard/account_payment_order.py
@@ -88,7 +88,7 @@ class payment_order_create(osv.osv_memory):
'partner_id': line.partner_id and line.partner_id.id or False,
'communication': line.ref or '/',
'date': date_to_pay,
- 'currency': line.invoice and line.invoice.currency_id.id or False,
+ 'currency': (line.invoice and line.invoice.currency_id.id) or line.journal_id.currency.id or line.journal_id.company_id.currency_id.id,
}, context=context)
return {'type': 'ir.actions.act_window_close'}
@@ -120,4 +120,4 @@ class payment_order_create(osv.osv_memory):
payment_order_create()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index c74ca5f833a..30358f701ef 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -32,11 +32,11 @@ class res_company(osv.osv):
_columns = {
'income_currency_exchange_account_id': fields.many2one(
'account.account',
- string="Income Currency Rate",
+ string="Gain Exchange Rate Account",
domain="[('type', '=', 'other')]",),
'expense_currency_exchange_account_id': fields.many2one(
'account.account',
- string="Expense Currency Rate",
+ string="Loss Exchange Rate Account",
domain="[('type', '=', 'other')]",),
}
@@ -782,9 +782,16 @@ class account_voucher(osv.osv):
vals[key].update(res[key])
return vals
+ def button_proforma_voucher(self, cr, uid, ids, context=None):
+ context = context or {}
+ wf_service = netsvc.LocalService("workflow")
+ for vid in ids:
+ wf_service.trg_validate(uid, 'account.voucher', vid, 'proforma_voucher', cr)
+ return {'type': 'ir.actions.act_window_close'}
+
def proforma_voucher(self, cr, uid, ids, context=None):
self.action_move_line_create(cr, uid, ids, context=context)
- return {'type': 'ir.actions.act_window_close'}
+ return True
def action_cancel_draft(self, cr, uid, ids, context=None):
wf_service = netsvc.LocalService("workflow")
@@ -950,11 +957,11 @@ class account_voucher(osv.osv):
if amount_residual > 0:
account_id = line.voucher_id.company_id.expense_currency_exchange_account_id
if not account_id:
- raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Income Currency Rate' on the company, then create accounting entry for currency rate difference."))
+ raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Expense Currency Rate' on the company, then create accounting entry for currency rate difference."))
else:
account_id = line.voucher_id.company_id.income_currency_exchange_account_id
if not account_id:
- raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Expense Currency Rate' on the company, then create accounting entry for currency rate difference."))
+ raise osv.except_osv(_('Warning!'),_("First you have to configure the 'Income Currency Rate' on the company, then create accounting entry for currency rate difference."))
# Even if the amount_currency is never filled, we need to pass the foreign currency because otherwise
# the receivable/payable account may have a secondary currency, which render this field mandatory
account_currency_id = company_currency <> current_currency and current_currency or False
diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml
index 5e26c366778..697d2affcf0 100644
--- a/addons/account_voucher/account_voucher_view.xml
+++ b/addons/account_voucher/account_voucher_view.xml
@@ -108,6 +108,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/account_voucher/invoice.py b/addons/account_voucher/invoice.py
index 14b725cbeca..91ba438756e 100644
--- a/addons/account_voucher/invoice.py
+++ b/addons/account_voucher/invoice.py
@@ -27,11 +27,12 @@ class invoice(osv.osv):
def invoice_pay_customer(self, cr, uid, ids, context=None):
if not ids: return []
+ mod,modid = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'account_voucher', 'view_vendor_receipt_dialog_form')
inv = self.browse(cr, uid, ids[0], context=context)
return {
'name':_("Pay Invoice"),
'view_mode': 'form',
- 'view_id': False,
+ 'view_id': modid,
'view_type': 'form',
'res_model': 'account.voucher',
'type': 'ir.actions.act_window',
@@ -41,13 +42,13 @@ class invoice(osv.osv):
'context': {
'default_partner_id': inv.partner_id.id,
'default_amount': inv.type in ('out_refund', 'in_refund') and -inv.residual or inv.residual,
- 'default_name':inv.name,
+ 'default_number':inv.name,
'close_after_process': True,
- 'invoice_type':inv.type,
- 'invoice_id':inv.id,
+ 'invoice_type': inv.type,
+ 'invoice_id': inv.id,
'default_type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment',
'type': inv.type in ('out_invoice','out_refund') and 'receipt' or 'payment'
- }
+ }
}
invoice()
diff --git a/addons/account_voucher/voucher_payment_receipt_view.xml b/addons/account_voucher/voucher_payment_receipt_view.xml
index 65bcdad8a9b..8e86e44942a 100644
--- a/addons/account_voucher/voucher_payment_receipt_view.xml
+++ b/addons/account_voucher/voucher_payment_receipt_view.xml
@@ -243,6 +243,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -284,6 +285,111 @@
<menuitem action="action_vendor_payment" icon="STOCK_JUSTIFY_FILL" sequence="12"
id="menu_action_vendor_payment" parent="account.menu_finance_payables"/>
+ <record model="ir.ui.view" id="view_vendor_receipt_dialog_form">
+ <field name="name">account.voucher.receipt.dialog.form</field>
+ <field name="model">account.voucher</field>
+ <field name="priority">30</field>
+ <field name="arch" type="xml">
+ <form string="Payment" version="7.0">
+ <group>
+ <group>
+ <field name="state" invisible="1"/>
+ <field name="partner_id" required="1" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer': 1}"/>
+ <label for="amount" string="Paid Amount"/>
+ <div>
+ <field name="amount" class="oe_inline"
+ invisible="context.get('line_type', False)"
+ on_change="onchange_amount(amount, payment_rate, partner_id, journal_id, currency_id, type, date, payment_rate_currency_id, company_id, context)"/>
+ <field name="currency_id" class="oe_inline"/>
+ </div>
+ <field name="journal_id"
+ domain="[('type','in',['bank', 'cash'])]"
+ invisible="context.get('line_type', False)"
+ widget="selection"
+ on_change="onchange_journal(journal_id, line_cr_ids, False, partner_id, date, amount, type, company_id, context)"
+ string="Payment Method"/>
+ </group>
+ <group>
+ <field name="date" invisible="context.get('line_type', False)" on_change="onchange_date(date, currency_id, payment_rate_currency_id, amount, company_id, context)"/>
+ <field name="reference" invisible="context.get('line_type', False)" string="Payment Ref" placeholder="e.g. 003/10"/>
+ <field name="name" colspan="2" invisible="context.get('line_type', False)" placeholder="e.g. Invoice SAJ/0042"/>
+ <field name="company_id" widget="selection" groups="base.group_multi_company"/>
+
+ <field name="account_id"
+ widget="selection"
+ invisible="True"/>
+ <field name="pre_line" invisible="1"/>
+ <field name="type" invisible="True"/>
+ </group>
+ </group>
+ <notebook invisible="1">
+ <page string="Payment Information" groups="base.group_user">
+ <label for="line_cr_ids"/>
+ <field name="line_cr_ids" context="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount, currency_id, type, context)">
+ <tree string="Invoices and outstanding transactions" editable="bottom" colors="gray:amount==0">
+ <field name="move_line_id" context="{'journal_id':parent.journal_id, 'partner_id':parent.partner_id}"
+ on_change="onchange_move_line_id(move_line_id)"
+ domain="[('account_id.type','in',('receivable','payable')), ('reconcile_id','=', False), ('partner_id','=',parent.partner_id)]"
+ required="1"
+ groups="account.group_account_user"/>
+ <field name="account_id" groups="base.group_no_one" domain="[('type','=','receivable')]"/>
+ <field name="date_original" readonly="1"/>
+ <field name="date_due" readonly="1"/>
+ <field name="amount_original" readonly="1"/>
+ <field name="amount_unreconciled" readonly="1" groups="account.group_account_user"/>
+ <field name="reconcile" on_change="onchange_reconcile(reconcile, amount, amount_unreconciled, context)" groups="account.group_account_user"/>
+ <field name="amount" sum="Total Allocation" on_change="onchange_amount(amount, amount_unreconciled, context)" string="Allocation"/>
+ </tree>
+ </field>
+ <label for="line_dr_ids" attrs="{'invisible': [('pre_line','=',False)]}"/>
+ <field name="line_dr_ids" attrs="{'invisible': [('pre_line','=',False)]}" context="{'journal_id':journal_id, 'partner_id':partner_id}" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount, currency_id, type, context)">
+ <tree string="Credits" editable="bottom" colors="gray:amount==0">
+ <field name="move_line_id" context="{'journal_id':parent.journal_id, 'partner_id':parent.partner_id}"
+ on_change="onchange_move_line_id(move_line_id)"
+ domain="[('account_id.type','in',('receivable','payable')), ('reconcile_id','=', False), ('partner_id','=',parent.partner_id)]"
+ required="1"/>
+ <field name="account_id" groups="base.group_no_one" domain="[('type','=','receivable')]"/>
+ <field name="date_original" readonly="1"/>
+ <field name="date_due" readonly="1"/>
+ <field name="amount_original" readonly="1"/>
+ <field name="amount_unreconciled" readonly="1"/>
+ <field name="reconcile" on_change="onchange_reconcile(reconcile, amount, amount_unreconciled, context)"/>
+ <field name="amount" sum="Total Allocation" on_change="onchange_amount(amount, amount_unreconciled, context)" string="Allocation"/>
+ </tree>
+ </field>
+ <group col="3">
+ <group>
+ <field name="narration" colspan="2" nolabel="1"/>
+ </group>
+ <group col="4" attrs="{'invisible':[('currency_id','=',False),('is_multi_currency','=',False)]}">
+ <field name="is_multi_currency" invisible="1"/>
+ <field name="payment_rate" required="1" on_change="onchange_rate(payment_rate, amount, currency_id, payment_rate_currency_id, company_id, context)" colspan="3"/>
+ <field name="payment_rate_currency_id" colspan="1" nolabel="1" on_change="onchange_payment_rate_currency(currency_id, payment_rate, payment_rate_currency_id, date, amount, company_id, context)" groups="base.group_multi_currency"/>
+ <field name="paid_amount_in_company_currency" colspan="4" invisible="1"/>
+ </group>
+ <group>
+ <field name="writeoff_amount"/>
+ <field name="payment_option" required="1"/>
+ <field name="writeoff_acc_id"
+ attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
+ domain="[('type','=','other')]"/>
+ <field name="comment"
+ attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
+ <field name="analytic_id"
+ groups="analytic.group_analytic_accounting"/>
+ </group>
+ </group>
+ </page>
+ </notebook>
+ <footer>
+ <button name="button_proforma_voucher" string="Pay" class="oe_highlight" type="object"/> or
+ <button string="Cancel" class="oe_link" special="cancel"/>
+ </footer>
+ </form>
+ </field>
+ </record>
+
+
<record model="ir.ui.view" id="view_vendor_receipt_form">
<field name="name">account.voucher.receipt.form</field>
<field name="model">account.voucher</field>
@@ -297,7 +403,7 @@
<field name="state" widget="statusbar" statusbar_visible="draft,posted" statusbar_colors='{"proforma":"blue"}'/>
</header>
<sheet>
- <h1><field name="number"/></h1>
+ <h1 attrs="{'invisible': [('number','=',False)]}"><field name="number"/></h1>
<group>
<group>
<field name="partner_id" domain="[('customer','=',True)]" required="1" invisible="context.get('line_type', False)" on_change="onchange_partner_id(partner_id, journal_id, amount, currency_id, type, date, context)" string="Customer" context="{'search_default_customer': 1}"/>
@@ -329,7 +435,6 @@
<field name="type" invisible="True"/>
</group>
</group>
-
<notebook>
<page string="Payment Information" groups="base.group_user">
<label for="line_cr_ids"/>
@@ -414,6 +519,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index 5bcecfa268e..d3449cf6027 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -146,6 +146,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -301,6 +302,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/analytic/analytic_view.xml b/addons/analytic/analytic_view.xml
index 51f5428002f..bed588015ad 100644
--- a/addons/analytic/analytic_view.xml
+++ b/addons/analytic/analytic_view.xml
@@ -53,6 +53,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py
index 3dff7c1cb00..332808d8a18 100644
--- a/addons/audittrail/audittrail.py
+++ b/addons/audittrail/audittrail.py
@@ -442,11 +442,13 @@ class audittrail_objects_proxy(object_proxy):
# if at least one modification has been found
for model_id, resource_id in lines:
+ name = pool.get(model.model).name_get(cr, uid, [resource_id])[0][1]
vals = {
'method': method,
'object_id': model_id,
'user_id': uid,
'res_id': resource_id,
+ 'name': name,
}
if (model_id, resource_id) not in old_values and method not in ('copy', 'read'):
# the resource was not existing so we are forcing the method to 'create'
@@ -484,7 +486,7 @@ class audittrail_objects_proxy(object_proxy):
if len(rule['user_id']) == 0 or uid in rule['user_id']:
if rule.get('log_'+method,0):
return True
- elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create'):
+ elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create', 'read_group', 'import_data'):
if rule['log_action']:
return True
diff --git a/addons/auth_ldap/users_ldap.py b/addons/auth_ldap/users_ldap.py
index 47fc41c3645..c2c0ac557bf 100644
--- a/addons/auth_ldap/users_ldap.py
+++ b/addons/auth_ldap/users_ldap.py
@@ -180,8 +180,8 @@ class CompanyLDAP(osv.osv):
"""
user_id = False
- login = tools.ustr(login)
- cr.execute("SELECT id, active FROM res_users WHERE login=%s", (login,))
+ login = tools.ustr(login.lower())
+ cr.execute("SELECT id, active FROM res_users WHERE lower(login)=%s", (login,))
res = cr.fetchone()
if res:
if res[1]:
diff --git a/addons/auth_ldap/users_ldap_view.xml b/addons/auth_ldap/users_ldap_view.xml
index c4fc7cebbbe..47c15badd7c 100644
--- a/addons/auth_ldap/users_ldap_view.xml
+++ b/addons/auth_ldap/users_ldap_view.xml
@@ -14,7 +14,7 @@
<field name="ldap_server"/>
<field name="ldap_server_port"/>
<field name="ldap_binddn"/>
- <field name="ldap_password"/>
+ <field name="ldap_password" password="True"/>
<field name="ldap_base"/>
<field name="ldap_filter"/>
<field name="create_user"/>
diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 7555621945d..5b8c41787d4 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -971,8 +971,8 @@ class calendar_event(osv.osv):
event = datas['id']
if datas.get('interval', 0) < 0:
raise osv.except_osv(_('Warning!'), _('Interval cannot be negative.'))
- if datas.get('count', 0) < 0:
- raise osv.except_osv(_('Warning!'), _('Count cannot be negative.'))
+ if datas.get('count', 0) <= 0:
+ raise osv.except_osv(_('Warning!'), _('Count cannot be negative or 0.'))
if datas['recurrency']:
result[event] = self.compute_rule_string(datas)
else:
@@ -1113,6 +1113,16 @@ rule or repeating pattern of time to exclude from the recurring rule."),
'user_id': lambda self, cr, uid, ctx: uid,
'organizer': default_organizer,
}
+
+ def _check_closing_date(self, cr, uid, ids, context=None):
+ for event in self.browse(cr, uid, ids, context=context):
+ if event.date_deadline < event.date:
+ return False
+ return True
+
+ _constraints = [
+ (_check_closing_date, 'Error ! End date cannot be set before start date.', ['date_deadline']),
+ ]
def get_recurrent_ids(self, cr, uid, select, domain, limit=100, context=None):
"""Gives virtual event ids for recurring events based on value of Recurrence Rule
diff --git a/addons/base_calendar/crm_meeting_view.xml b/addons/base_calendar/crm_meeting_view.xml
index 2da18447820..8373d32ab0d 100644
--- a/addons/base_calendar/crm_meeting_view.xml
+++ b/addons/base_calendar/crm_meeting_view.xml
@@ -182,13 +182,14 @@
<button name="do_tentative"
states="needs-action,declined,accepted"
string="Uncertain" type="object"
+ icon="terp-crm"
/>
<button name="do_accept" string="Accept"
states="needs-action,tentative,declined"
- type="object" />
+ type="object" icon="gtk-apply"/>
<button name="do_decline" string="Decline"
states="needs-action,tentative,accepted"
- type="object" />
+ type="object" icon="gtk-cancel"/>
</tree>
<form string="Invitation details" version="7.0">
<header>
@@ -222,6 +223,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/base_iban/i18n/nl_BE.po b/addons/base_iban/i18n/nl_BE.po
index 51fb108b6b8..a7b7b057e56 100644
--- a/addons/base_iban/i18n/nl_BE.po
+++ b/addons/base_iban/i18n/nl_BE.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
-"PO-Revision-Date: 2009-04-20 10:04+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2012-10-01 11:08+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 05:58+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
#. module: base_iban
#: constraint:res.partner.bank:0
@@ -23,22 +23,27 @@ msgid ""
"Please define BIC/Swift code on bank for bank type IBAN Account to make "
"valid payments"
msgstr ""
+"\n"
+"Definieer een BIC/Swift-code voor IBAN-rekeningen om geldige betalingen te "
+"maken."
#. module: base_iban
#: code:addons/base_iban/base_iban.py:139
#, python-format
msgid "This IBAN does not pass the validation check, please verify it"
msgstr ""
+"Dit IBAN-nummer voldoet niet aan de controle. Gelieve het nummer na te "
+"kijken."
#. module: base_iban
#: model:res.partner.bank.type,format_layout:base_iban.bank_iban
msgid "%(bank_name)s: IBAN %(acc_number)s - BIC %(bank_bic)s"
-msgstr ""
+msgstr "%(bank_name)s: IBAN %(acc_number)s - BIC %(bank_bic)s"
#. module: base_iban
#: model:res.partner.bank.type.field,name:base_iban.bank_swift_field
msgid "bank_bic"
-msgstr ""
+msgstr "bank_bic"
#. module: base_iban
#: model:res.partner.bank.type.field,name:base_iban.bank_zip_field
@@ -67,6 +72,8 @@ msgid ""
"The IBAN does not seem to be correct. You should have entered something like "
"this %s"
msgstr ""
+"Dit IBAN-nummer lijkt niet juist te zijn. U dient een nummer in te geven in "
+"dit formaat %s."
#. module: base_iban
#: field:res.partner.bank,iban:0
@@ -77,7 +84,7 @@ msgstr "IBAN"
#: code:addons/base_iban/base_iban.py:140
#, python-format
msgid "The IBAN is invalid, it should begin with the country code"
-msgstr ""
+msgstr "Dit IBAN-nummer is ongeldig; het moet beginnen met de landcode."
#. module: base_iban
#: model:res.partner.bank.type,name:base_iban.bank_iban
@@ -87,7 +94,7 @@ msgstr "IBAN-rekening"
#. module: base_iban
#: constraint:res.partner.bank:0
msgid "The RIB and/or IBAN is not valid"
-msgstr ""
+msgstr "RIB en/of IBAN is niet geldig."
#, python-format
#~ msgid "The IBAN is invalid, It should begin with the country code"
diff --git a/addons/base_setup/i18n/nl_BE.po b/addons/base_setup/i18n/nl_BE.po
index 1662fc1a1dc..ba30f4dd262 100644
--- a/addons/base_setup/i18n/nl_BE.po
+++ b/addons/base_setup/i18n/nl_BE.po
@@ -7,44 +7,44 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
-"PO-Revision-Date: 2009-04-24 15:11+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2012-10-01 11:22+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:08+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
#. module: base_setup
#: field:user.preferences.config,menu_tips:0
msgid "Display Tips"
-msgstr ""
+msgstr "Tips weergeven"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Guest"
-msgstr ""
+msgstr "Gast"
#. module: base_setup
#: model:ir.model,name:base_setup.model_product_installer
msgid "product.installer"
-msgstr ""
+msgstr "product.installer"
#. module: base_setup
#: selection:product.installer,customers:0
msgid "Create"
-msgstr ""
+msgstr "Maken"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Member"
-msgstr ""
+msgstr "Lid"
#. module: base_setup
#: field:migrade.application.installer.modules,sync_google_contact:0
msgid "Sync Google Contact"
-msgstr ""
+msgstr "Google-contacten synchroniseren"
#. module: base_setup
#: help:user.preferences.config,context_tz:0
@@ -52,21 +52,23 @@ msgid ""
"Set default for new user's timezone, used to perform timezone conversions "
"between the server and the client."
msgstr ""
+"Stel de standaardtijdzone in voor nieuwe gebruikers. Deze wordt gebruikt om "
+"tijdzoneconversies te doen tussen server en client."
#. module: base_setup
#: selection:product.installer,customers:0
msgid "Import"
-msgstr ""
+msgstr "Importeren"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Donor"
-msgstr ""
+msgstr "Donor"
#. module: base_setup
#: model:ir.actions.act_window,name:base_setup.action_base_setup_company
msgid "Set Company Header and Footer"
-msgstr ""
+msgstr "Stel uw kop- en voettekst in"
#. module: base_setup
#: model:ir.actions.act_window,help:base_setup.action_base_setup_company
@@ -75,21 +77,24 @@ msgid ""
"printed on your reports. You can click on the button 'Preview Header' in "
"order to check the header/footer of PDF documents."
msgstr ""
+"Vul uw bedrijfsgegevens in (adres, logo, bankrekeningen), zodat deze worden "
+"afgedrukt op uw rapporten. U kunt op de knop 'Voorbeeld koptekst' klikken om "
+"de koptekst en voettekst van pdf-documenten te controleren."
#. module: base_setup
#: field:product.installer,customers:0
msgid "Customers"
-msgstr ""
+msgstr "Klanten"
#. module: base_setup
#: selection:user.preferences.config,view:0
msgid "Extended"
-msgstr ""
+msgstr "Uitgebreid"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Patient"
-msgstr ""
+msgstr "Patiënt"
#. module: base_setup
#: model:ir.actions.act_window,help:base_setup.action_import_create_installer
@@ -98,26 +103,29 @@ msgid ""
"you can import your existing partners by CSV spreadsheet from \"Import "
"Data\" wizard"
msgstr ""
+"Maak of importeer klanten en contactpersonen manueel vanuit dit scherm. U "
+"kunt ook bestaande klanten importeren vanuit een csv-bestand met de wizard "
+"\"Gegevens importeren\"."
#. module: base_setup
#: view:user.preferences.config:0
msgid "Define Users's Preferences"
-msgstr ""
+msgstr "Stel de gebruikersvoorkeuren in"
#. module: base_setup
#: model:ir.actions.act_window,name:base_setup.action_user_preferences_config_form
msgid "Define default users preferences"
-msgstr ""
+msgstr "Stel de standaard gebruikersvoorkeuren in"
#. module: base_setup
#: help:migrade.application.installer.modules,import_saleforce:0
msgid "For Import Saleforce"
-msgstr ""
+msgstr "Voor Salesforce-import"
#. module: base_setup
#: help:migrade.application.installer.modules,quickbooks_ippids:0
msgid "For Quickbooks Ippids"
-msgstr ""
+msgstr "Voor Quickboos Ippids"
#. module: base_setup
#: help:user.preferences.config,view:0
@@ -126,6 +134,9 @@ msgid ""
"simplified interface, which has less features but is easier. You can always "
"switch later from the user preferences."
msgstr ""
+"Als u OpenERP voor de eerste keer gebruikt, raden wij u aan de eenvoudige "
+"weergave te kiezen, met minder functies en een eenvoudige werking. U kunt "
+"deze keuze altijd wijzigen via de gebruikersvoorkeuren."
#. module: base_setup
#: view:base.setup.terminology:0
@@ -136,12 +147,12 @@ msgstr "res_config_contents"
#. module: base_setup
#: field:user.preferences.config,view:0
msgid "Interface"
-msgstr ""
+msgstr "Interface"
#. module: base_setup
#: model:ir.model,name:base_setup.model_migrade_application_installer_modules
msgid "migrade.application.installer.modules"
-msgstr ""
+msgstr "migrade.application.installer.modules"
#. module: base_setup
#: view:base.setup.terminology:0
@@ -149,21 +160,23 @@ msgid ""
"You can use this wizard to change the terminologies for customers in the "
"whole application."
msgstr ""
+"Met deze wizard kunt u een andere benaming kiezen voor klanten, die in de "
+"volledige toepassing zal worden gebruikt."
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Tenant"
-msgstr ""
+msgstr "Huurder"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Customer"
-msgstr ""
+msgstr "Klant"
#. module: base_setup
#: field:user.preferences.config,context_lang:0
msgid "Language"
-msgstr ""
+msgstr "Taal"
#. module: base_setup
#: help:user.preferences.config,context_lang:0
@@ -172,6 +185,9 @@ msgid ""
"available. If you want to Add new Language, you can add it from 'Load an "
"Official Translation' wizard from 'Administration' menu."
msgstr ""
+"Kiest de standaardtaal voor de gebruik, als er vertalingen beschikbaar zijn. "
+"Een Nieuwe taal instellen kan via het menu Beheer, Laad een officiële "
+"vertaling."
#. module: base_setup
#: view:user.preferences.config:0
@@ -180,47 +196,50 @@ msgid ""
"ones. Afterwards, users are free to change those values on their own user "
"preference form."
msgstr ""
+"Hiermee wijst u de standaardinstellingen toe aan nieuwe en bestaande "
+"gebruikers. Een gebruiker kan deze waarden altijd wijzigen via zijn "
+"voorkeuren."
#. module: base_setup
#: field:base.setup.terminology,partner:0
msgid "How do you call a Customer"
-msgstr ""
+msgstr "Hoe wordt een klant bij u genoemd?"
#. module: base_setup
#: field:migrade.application.installer.modules,quickbooks_ippids:0
msgid "Quickbooks Ippids"
-msgstr ""
+msgstr "Quickbooks Ippids"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Client"
-msgstr ""
+msgstr "Cliënt"
#. module: base_setup
#: field:migrade.application.installer.modules,import_saleforce:0
msgid "Import Saleforce"
-msgstr ""
+msgstr "Salesforce-import"
#. module: base_setup
#: field:user.preferences.config,context_tz:0
msgid "Timezone"
-msgstr ""
+msgstr "Tijdzone"
#. module: base_setup
#: model:ir.actions.act_window,name:base_setup.action_partner_terminology_config_form
msgid "Use another word to say \"Customer\""
-msgstr ""
+msgstr "Gebruik een andere benaming voor Klant"
#. module: base_setup
#: model:ir.model,name:base_setup.model_base_setup_terminology
msgid "base.setup.terminology"
-msgstr ""
+msgstr "base.setup.terminology"
#. module: base_setup
#: help:user.preferences.config,menu_tips:0
msgid ""
"Check out this box if you want to always display tips on each menu action"
-msgstr ""
+msgstr "Schakel dit vakje in als u voor elke menuactie tips wilt weergaven."
#. module: base_setup
#: field:base.setup.terminology,config_logo:0
@@ -233,52 +252,52 @@ msgstr "Afbeelding"
#. module: base_setup
#: model:ir.model,name:base_setup.model_user_preferences_config
msgid "user.preferences.config"
-msgstr ""
+msgstr "user.preferences.config"
#. module: base_setup
#: model:ir.actions.act_window,name:base_setup.action_config_access_other_user
msgid "Create Additional Users"
-msgstr ""
+msgstr "Extra gebruikers maken"
#. module: base_setup
#: model:ir.actions.act_window,name:base_setup.action_import_create_installer
msgid "Create or Import Customers"
-msgstr ""
+msgstr "Klanten maken of importeren"
#. module: base_setup
#: field:migrade.application.installer.modules,import_sugarcrm:0
msgid "Import Sugarcrm"
-msgstr ""
+msgstr "SugarCRM-import"
#. module: base_setup
#: help:product.installer,customers:0
msgid "Import or create customers"
-msgstr ""
+msgstr "Klanten maken of importeren"
#. module: base_setup
#: selection:user.preferences.config,view:0
msgid "Simplified"
-msgstr ""
+msgstr "Eenvoudig"
#. module: base_setup
#: help:migrade.application.installer.modules,import_sugarcrm:0
msgid "For Import Sugarcrm"
-msgstr ""
+msgstr "Voor SugarCRM-import"
#. module: base_setup
#: selection:base.setup.terminology,partner:0
msgid "Partner"
-msgstr ""
+msgstr "Relatie"
#. module: base_setup
#: view:base.setup.terminology:0
msgid "Specify Your Terminology"
-msgstr ""
+msgstr "Kies uw terminologie"
#. module: base_setup
#: help:migrade.application.installer.modules,sync_google_contact:0
msgid "For Sync Google Contact"
-msgstr ""
+msgstr "Voor synchronisatie met Google-contacten"
#~ msgid "Logo"
#~ msgstr "Logo"
diff --git a/addons/base_vat/i18n/nl_BE.po b/addons/base_vat/i18n/nl_BE.po
index f468f96cd38..9d68fcb0f78 100644
--- a/addons/base_vat/i18n/nl_BE.po
+++ b/addons/base_vat/i18n/nl_BE.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 00:36+0000\n"
-"PO-Revision-Date: 2009-04-24 15:11+0000\n"
-"Last-Translator: <>\n"
+"PO-Revision-Date: 2012-10-01 11:23+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:07+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
#. module: base_vat
#: code:addons/base_vat/base_vat.py:141
@@ -34,7 +34,7 @@ msgstr "De naam van de firma moet uniek zijn"
#. module: base_vat
#: constraint:res.partner:0
msgid "Error ! You cannot create recursive associated members."
-msgstr ""
+msgstr "U kunt niet dezelfde verenigingsleden maken."
#. module: base_vat
#: field:res.company,vat_check_vies:0
diff --git a/addons/claim_from_delivery/i18n/nl_BE.po b/addons/claim_from_delivery/i18n/nl_BE.po
new file mode 100644
index 00000000000..51f4f9c276c
--- /dev/null
+++ b/addons/claim_from_delivery/i18n/nl_BE.po
@@ -0,0 +1,23 @@
+# Dutch (Belgium) translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-02-08 00:36+0000\n"
+"PO-Revision-Date: 2012-10-01 11:24+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Dutch (Belgium) <nl_BE@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: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
+
+#. module: claim_from_delivery
+#: model:ir.actions.act_window,name:claim_from_delivery.action_claim_from_delivery
+msgid "Claim"
+msgstr "Klacht"
diff --git a/addons/crm/__openerp__.py b/addons/crm/__openerp__.py
index 2a7996655a2..dd36aa19041 100644
--- a/addons/crm/__openerp__.py
+++ b/addons/crm/__openerp__.py
@@ -36,7 +36,7 @@ It manages key tasks such as communication, identification, prioritization, assi
OpenERP ensures that all cases are successfully tracked by users, customers and suppliers. It can automatically send reminders, escalate the request, trigger specific methods and many other actions based on your own enterprise rules.
-The greatest thing about this system is that users don't need to do anything special. The CRM module has an email gateway for the synchronization interface between mails and OpenERP. That way, users can just send emails to the request tracker.
+The greatest thing about this system is that users don't need to do anything special. The CRM module has an email gateway for the synchronization interface between mails and OpenERP. That way, users can just send emails to the request tracker.
OpenERP will take care of thanking them for their message, automatically routing it to the appropriate staff and make sure all future correspondence gets to the right place.
@@ -99,7 +99,7 @@ Dashboard for CRM will include:
'res_partner_view.xml',
'board_crm_view.xml',
-
+
'res_config_view.xml',
],
@@ -115,9 +115,10 @@ Dashboard for CRM will include:
'test/process/cancel_lead.yml',
'test/process/action_rule.yml',
'test/process/segmentation.yml',
+ 'test/process/phonecalls.yml',
'test/ui/crm_demo.yml',
'test/ui/duplicate_lead.yml',
- 'test/ui/delete_lead.yml'
+ 'test/ui/delete_lead.yml',
],
'installable': True,
'application': True,
diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 330bbb1fc9b..cca195a1539 100644
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -102,6 +102,7 @@ class crm_case_section(osv.osv):
""" Model for sales teams. """
_name = "crm.case.section"
_inherits = {'mail.alias': 'alias_id'}
+ _inherit = "mail.thread"
_description = "Sales Teams"
_order = "complete_name"
diff --git a/addons/crm/crm_demo.xml b/addons/crm/crm_demo.xml
index 551e4e93fb8..dde3e63cc4a 100644
--- a/addons/crm/crm_demo.xml
+++ b/addons/crm/crm_demo.xml
@@ -1,46 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
- <data>
+ <data noupdate="1">
+
<record id="base.user_demo" model="res.users">
- <field name="groups_id" eval="[(4,ref('base.group_sale_salesman'))]"/>
+ <field name="groups_id" eval="[(4,ref('base.group_sale_salesman'))]"/>
</record>
- <record id="ir_ui_view_sc_calendar_demo" model="ir.ui.view_sc">
- <field name="name">Meetings</field>
- <field name="resource">ir.ui.menu</field>
- <field name="user_id" ref="base.user_demo"/>
- <field name="res_id" ref="base_calendar.menu_crm_meeting"/>
- </record>
+ <record id="ir_ui_view_sc_calendar_demo" model="ir.ui.view_sc">
+ <field name="name">Meetings</field>
+ <field name="resource">ir.ui.menu</field>
+ <field name="user_id" ref="base.user_demo"/>
+ <field name="res_id" ref="base_calendar.menu_crm_meeting"/>
+ </record>
- <record model="crm.case.section" id="crm_case_section_1">
+ <record model="crm.case.section" id="crm_case_section_1">
<field name="name">Sales Marketing Department</field>
<field name="code">SMD</field>
- <field name="parent_id" ref="crm.section_sales_department"></field>
- </record>
+ <field name="parent_id" ref="crm.section_sales_department"/>
+ </record>
- <record model="crm.case.section" id="crm_case_section_2">
+ <record model="crm.case.section" id="crm_case_section_2">
<field name="name">Support Department</field>
<field name="code">SPD</field>
- <field name="parent_id" ref="crm.section_sales_department"></field>
- </record>
+ <field name="parent_id" ref="crm.section_sales_department"/>
+ </record>
- <record model="crm.case.section" id="crm_case_section_3">
+ <record model="crm.case.section" id="crm_case_section_3">
<field name="name">Direct Marketing</field>
<field name="code">DM</field>
- <field name="parent_id" ref="crm.section_sales_department"></field>
- </record>
+ <field name="parent_id" ref="crm.section_sales_department"/>
+ </record>
- <record model="crm.case.section" id="crm_case_section_4">
+ <record model="crm.case.section" id="crm_case_section_4">
<field name="name">Online Support</field>
<field name="code">OS</field>
- <field name="parent_id" ref="crm.crm_case_section_2"></field>
- </record>
-
- <record model="crm.segmentation" id="crm_segmentation0">
- <field name="name">OpenERP partners</field>
- <field name="exclusif">True</field>
- <field name="categ_id" ref="base.res_partner_category_2"/>
- </record>
+ <field name="parent_id" ref="crm.crm_case_section_2"/>
+ </record>
+
+ <record model="crm.segmentation" id="crm_segmentation0">
+ <field name="name">OpenERP partners</field>
+ <field name="exclusif">True</field>
+ <field name="categ_id" ref="base.res_partner_category_2"/>
+ </record>
</data>
</openerp>
diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py
index d8b7fb58e49..d668ea710c1 100644
--- a/addons/crm/crm_lead.py
+++ b/addons/crm/crm_lead.py
@@ -277,6 +277,10 @@ class crm_lead(base_stage, format_address, osv.osv):
def create(self, cr, uid, vals, context=None):
obj_id = super(crm_lead, self).create(cr, uid, vals, context)
+ section_id = self.browse(cr, uid, obj_id, context=context).section_id
+ if section_id:
+ followers = [follow.id for follow in section_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [obj_id], followers, context=context)
self.create_send_note(cr, uid, [obj_id], context=context)
return obj_id
@@ -294,7 +298,7 @@ class crm_lead(base_stage, format_address, osv.osv):
if partner_id:
partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
values = {
- 'partner_name' : partner.name,
+ 'partner_name' : partner.name,
'street' : partner.street,
'street2' : partner.street2,
'city' : partner.city,
@@ -491,7 +495,8 @@ class crm_lead(base_stage, format_address, osv.osv):
title = "%s : %s" % (merge_message, opportunity.name)
details.append(self._mail_body(cr, uid, opportunity, fields, title=title, context=context))
- subject = subject[0] + ", ".join(subject[1:])
+ # Chatter message's subject
+ subject = subject[0] + ": " + ", ".join(subject[1:])
details = "\n\n".join(details)
return self.message_post(cr, uid, [opportunity_id], body=details, subject=subject, context=context)
@@ -560,19 +565,18 @@ class crm_lead(base_stage, format_address, osv.osv):
data = self._merge_data(cr, uid, ids, oldest, fields, context=context)
- # merge data into first opportunity
- self.write(cr, uid, [first_opportunity.id], data, context=context)
-
- #copy message and attachements into the first opportunity
+ # Merge messages and attachements into the first opportunity
self._merge_opportunity_history(cr, uid, first_opportunity.id, tail_opportunities, context=context)
self._merge_opportunity_attachments(cr, uid, first_opportunity.id, tail_opportunities, context=context)
- #Notification about loss of information
+ # Merge notifications about loss of information
self._merge_notification(cr, uid, first_opportunity, opportunities, context=context)
- #delete tail opportunities
+ # Write merged data into first opportunity
+ self.write(cr, uid, [first_opportunity.id], data, context=context)
+ # Delete tail opportunities
self.unlink(cr, uid, [x.id for x in tail_opportunities], context=context)
- #open first opportunity
+ # Open first opportunity
self.case_open(cr, uid, [first_opportunity.id])
return first_opportunity.id
@@ -581,13 +585,16 @@ class crm_lead(base_stage, format_address, osv.osv):
contact_id = False
if customer:
contact_id = self.pool.get('res.partner').address_get(cr, uid, [customer.id])['default']
+
if not section_id:
section_id = lead.section_id and lead.section_id.id or False
+
if section_id:
stage_ids = crm_stage.search(cr, uid, [('sequence','>=',1), ('section_ids','=', section_id)])
else:
stage_ids = crm_stage.search(cr, uid, [('sequence','>=',1)])
stage_id = stage_ids and stage_ids[0] or False
+
return {
'planned_revenue': lead.planned_revenue,
'probability': lead.probability,
@@ -604,7 +611,6 @@ class crm_lead(base_stage, format_address, osv.osv):
def convert_opportunity(self, cr, uid, ids, partner_id, user_ids=False, section_id=False, context=None):
partner = self.pool.get('res.partner')
- mail_message = self.pool.get('mail.message')
customer = False
if partner_id:
customer = partner.browse(cr, uid, partner_id, context=context)
@@ -790,7 +796,12 @@ class crm_lead(base_stage, format_address, osv.osv):
stage = self.pool.get('crm.case.stage').browse(cr, uid, vals['stage_id'], context=context)
if stage.on_change:
vals['probability'] = stage.probability
- return super(crm_lead,self).write(cr, uid, ids, vals, context)
+ if vals.get('section_id'):
+ section_id = self.pool.get('crm.case.section').browse(cr, uid, vals.get('section_id'), context=context)
+ if section_id:
+ vals.setdefault('message_follower_ids', [])
+ vals['message_follower_ids'] += [(4, follower.id) for follower in section_id.message_follower_ids]
+ return super(crm_lead,self).write(cr, uid, ids, vals, context)
# ----------------------------------------
# Mail Gateway
diff --git a/addons/crm/crm_lead_demo.xml b/addons/crm/crm_lead_demo.xml
index b3c00256b06..7849125282e 100644
--- a/addons/crm/crm_lead_demo.xml
+++ b/addons/crm/crm_lead_demo.xml
@@ -1,10 +1,8 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
- <!--
- Demo Leads
- -->
+ <!-- Demo Leads -->
<record id="crm_case_1" model="crm.lead">
<field name="type">lead</field>
<field name="name">Plan to Attend a Training</field>
@@ -26,9 +24,9 @@
<field name="user_id" ref="base.user_root"/>
<field name="stage_id" ref="stage_lead1"/>
<field name="description">Hello,
-I am Jason from Le Club SARL,
-I am intertested to attend Training organized in your company,
-Can you send details,</field>
+I am Jason from Le Club SARL.
+I am intertested to attend a training organized in your company.
+Can you send me the details ?</field>
<field eval="1" name="active"/>
</record>
@@ -110,7 +108,8 @@ Can you send details,</field>
<field name="section_id" ref="section_sales_department"/>
<field name="user_id" ref="base.user_root"/>
<field name="stage_id" ref="stage_lead1"/>
- <field name="description">Hi, Can you send a quotation for 20 Computers with speakers?
+ <field name="description">Hi,
+Can you send me a quotation for 20 computers with speakers?
Regards,
Carrie Helle,
Purchase Manager
@@ -215,8 +214,9 @@ Contact: +1 813 494 5005</field>
<field name="section_id" ref="crm_case_section_3"/>
<field name="user_id" ref=""/>
<field name="stage_id" ref="stage_lead1"/>
- <field name="description">hi,
-I want to know specification and cost of laptops of your company.
+ <field name="description">Hi,
+I would like to know more about specification and cost of laptops of your company.
+
Thanks,
Andrew</field>
<field eval="1" name="active"/>
@@ -260,25 +260,20 @@ Andrew</field>
<field eval="1" name="active"/>
</record>
-
- <!-- Call Function to Cancel the leads (set as Dead) -->
+ <!-- Call Function to Cancel the leads (set as Dead) -->
<function model="crm.lead" name="case_cancel"
eval="[ ref('crm_case_12'), ref('crm_case_7'),
ref('crm_case_3'), ref('crm_case_8')],
{'install_mode': True}"
/>
- <!-- Call Function to set the leads as Unread -->
+
+ <!-- Call Function to set the leads as Unread -->
<function model="crm.lead" name="message_mark_as_unread"
eval="[ ref('crm_case_1'), ref('crm_case_2'),
ref('crm_case_5'), ref('crm_case_11')], {}"
/>
-
- <!--
- Demo Opportunities
- -->
-
-
+ <!-- Demo Opportunities -->
<record id="crm_case_13" model="crm.lead">
<field name="type">opportunity</field>
<field name="name">Plan to buy 60 keyboards and mouses</field>
@@ -563,9 +558,9 @@ Andrew</field>
<field name="body">Dear Customer,
Thanks for showing interest in our products.
We have attached the catalogue,
-We would like to know your interests, Let us know if we can call you for more details.
+We would like to know your interests, so let us know when we can call you for more details.
-Thanks</field>
+Regards</field>
<field name="parent_id" ref="message_email0"/>
<field name="author_id" ref="base.partner_root"/>
</record>
@@ -600,9 +595,9 @@ Thanks</field>
<field name="model">crm.lead</field>
<field name="res_id" ref="crm_case_1"/>
<field name="body">Hello,
-I am Jason from Le Club SARL,
-I am intertested to attend Training organized in your company,
-Can you send details,</field>
+I am Jason from Le Club SARL.
+I am intertested to attend a training organized in your company.
+Can you send me the details ?</field>
<field name="type">email</field>
</record>
<record id="message_email_13" model="mail.message">
@@ -613,7 +608,7 @@ Can you send details,</field>
<field name="type">comment</field>
</record>
- <!-- Call Function to set the opportunities as Unread -->
+ <!-- Call Function to set the opportunities as Unread -->
<function model="crm.lead" name="message_mark_as_unread"
eval="[ ref('crm_case_15'), ref('crm_case_16'),
ref('crm_case_23'), ref('crm_case_19')], {}"
diff --git a/addons/crm/crm_lead_menu.xml b/addons/crm/crm_lead_menu.xml
index 04758f4ffe0..208d92a6684 100644
--- a/addons/crm/crm_lead_menu.xml
+++ b/addons/crm/crm_lead_menu.xml
@@ -14,12 +14,13 @@
<p class="oe_view_nocontent_create">
Click to create an unqualified lead.
</p><p>
- A lead is usually the first step in your sales cycle. It can be
- a contact with a new prospect, a company you target, a contact form
- filled in your website, etc.
+ Use leads if you need a qualification step before creating an
+ opportunity or a customer. It can be a business card you received,
+ a contact form filled in your website, or a file of unqualified
+ prospects you import, etc.
</p><p>
Once qualified, the lead can be converted into a business
- opportunity and a new customer in your address book.
+ opportunity and/or a new customer in your address book.
</p>
</field>
</record>
diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml
index f91a8756598..f0311f8fce5 100644
--- a/addons/crm/crm_lead_view.xml
+++ b/addons/crm/crm_lead_view.xml
@@ -223,6 +223,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -525,6 +526,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/crm/crm_phonecall_demo.xml b/addons/crm/crm_phonecall_demo.xml
index cbfb74a8e04..f441c29a7e6 100644
--- a/addons/crm/crm_phonecall_demo.xml
+++ b/addons/crm/crm_phonecall_demo.xml
@@ -1,9 +1,8 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
- <!--
- ((((((((((( Demo Cases )))))))))))
- -->
+
+ <!-- Demo Cases -->
<record id="crm_phonecall_1" model="crm.phonecall">
<field eval="time.strftime('%Y-%m-04 10:45:36')" name="date"/>
<field name="partner_id" ref="base.res_partner_11"/>
@@ -47,7 +46,7 @@
<field eval="time.strftime('%Y-%m-21 14:10:23')" name="date"/>
<field eval="'3'" name="priority"/>
<field name="user_id" ref="base.user_root"/>
- <field name="name">Wanted information about pricing of Laptops</field>
+ <field name="name">Wanted information about pricing of laptops</field>
<field name="state">done</field>
<field name="partner_phone">(077) 582-4035</field>
<field name="partner_mobile">(077) 341-3591</field>
@@ -79,6 +78,7 @@
<field eval="time.strftime('%Y-%m-28 14:15:30')" name="date"/>
<field name="categ_id" ref="crm.categ_phone2"/>
<field eval="8.56" name="duration"/>
- </record>
+ </record>
+
</data>
</openerp>
diff --git a/addons/crm/crm_phonecall_menu.xml b/addons/crm/crm_phonecall_menu.xml
index ba8c4768c09..c359aa461e7 100644
--- a/addons/crm/crm_phonecall_menu.xml
+++ b/addons/crm/crm_phonecall_menu.xml
@@ -6,8 +6,8 @@
id="crm_case_categ_phone_create_partner"
name="Schedule a Call"
res_model="crm.phonecall"
- view_mode="calendar,tree,form"
- context="{'search_default_partner_id': [active_id], 'default_duration': 1.0, 'default_partner_id': active_id}"
+ view_mode="tree,form,calendar"
+ context="{'search_default_partner_id': active_id, 'default_duration': 1.0, 'default_partner_id': active_id}"
groups="base.group_sale_salesman"
/>
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index 8c1e1c9ec76..b8bc6b3a13e 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -146,10 +146,10 @@
<field name="priority"/>
<field name="opportunity_id"/>
</group>
-
<field name="description" placeholder="Description..."/>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml
index df2177a51fe..1da78e50843 100644
--- a/addons/crm/crm_view.xml
+++ b/addons/crm/crm_view.xml
@@ -115,6 +115,10 @@
<field name="note"/>
</page>
</notebook>
+ <div class="oe_chatter">
+ <field name="message_ids" widget="mail_thread"/>
+ <field name="message_follower_ids" widget="mail_followers" help="Followers of this salesteam follow automatically all opportunities related to this salesteam."/>
+ </div>
</form>
</field>
</record>
diff --git a/addons/crm/i18n/nl_BE.po b/addons/crm/i18n/nl_BE.po
index 1c2847856a0..3be96ce5a7d 100644
--- a/addons/crm/i18n/nl_BE.po
+++ b/addons/crm/i18n/nl_BE.po
@@ -1,178 +1,179 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
-# * crm
-#
+# * crm
+# Els Van Vossel <evv@agaplan.eu>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2009-04-10 09:40+0000\n"
-"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
-"Language-Team: \n"
+"PO-Revision-Date: 2012-10-01 17:09+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:06+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
+"Language: nl\n"
#. module: crm
#: view:crm.lead.report:0
msgid "# Leads"
-msgstr ""
+msgstr "# Leads"
#. module: crm
#: view:crm.lead:0 selection:crm.lead,type:0 view:crm.lead.report:0
#: selection:crm.lead.report,type:0
msgid "Lead"
-msgstr ""
+msgstr "Lead"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor3
msgid "Need Services"
-msgstr ""
+msgstr "Heeft diensten nodig"
#. module: crm
#: selection:crm.meeting,rrule_type:0
msgid "Monthly"
-msgstr ""
+msgstr "Maandelijks"
#. module: crm
#: model:ir.model,name:crm.model_crm_case_stage
msgid "Stage of case"
-msgstr ""
+msgstr "Fase van zaak"
#. module: crm
#: view:crm.meeting:0
msgid "Visibility"
-msgstr ""
+msgstr "Zichtbaarheid"
#. module: crm
#: field:crm.lead,title:0
msgid "Title"
-msgstr ""
+msgstr "Titel"
#. module: crm
#: field:crm.meeting,show_as:0
msgid "Show as"
-msgstr ""
+msgstr "Weergeven als"
#. module: crm
#: field:crm.meeting,day:0 selection:crm.meeting,select1:0
msgid "Date of month"
-msgstr ""
+msgstr "Dag van de maand"
#. module: crm
#: view:crm.lead:0 view:crm.phonecall:0
msgid "Today"
-msgstr ""
+msgstr "Vandaag"
#. module: crm
#: view:crm.lead2opportunity.partner:0 view:crm.merge.opportunity:0
msgid "Select Opportunities"
-msgstr ""
+msgstr "Opportuniteiten kiezen"
#. module: crm
#: view:crm.meeting:0 view:crm.phonecall2opportunity:0
#: view:crm.phonecall2phonecall:0
msgid " "
-msgstr ""
+msgstr " "
#. module: crm
#: view:crm.lead.report:0 field:crm.phonecall.report,delay_close:0
msgid "Delay to close"
-msgstr ""
+msgstr "Dagen tot afsluiten"
#. module: crm
#: view:crm.lead:0
msgid "Previous Stage"
-msgstr ""
+msgstr "Vorige fase"
#. module: crm
#: code:addons/crm/wizard/crm_add_note.py:28
#, python-format
msgid "Can not add note!"
-msgstr ""
+msgstr "Kan geen notitie toevoegen"
#. module: crm
#: field:crm.case.stage,name:0
msgid "Stage Name"
-msgstr ""
+msgstr "Fasenaam"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead_report
msgid "CRM Lead Analysis"
-msgstr ""
+msgstr "Analyse CRM Leads"
#. module: crm
#: view:crm.lead.report:0 view:crm.phonecall.report:0
#: field:crm.phonecall.report,day:0
msgid "Day"
-msgstr ""
+msgstr "Dag"
#. module: crm
#: sql_constraint:crm.case.section:0
msgid "The code of the sales team must be unique !"
-msgstr ""
+msgstr "De code van het verkoopteam moet uniek zijn"
#. module: crm
#: code:addons/crm/crm_lead.py:553
#, python-format
msgid "Lead '%s' has been converted to an opportunity."
-msgstr ""
+msgstr "Lead '%s' is omgezet naar een opportuniteit."
#. module: crm
#: code:addons/crm/crm_lead.py:294
#, python-format
msgid "The lead '%s' has been closed."
-msgstr ""
+msgstr "Lead '%s' is gesloten."
#. module: crm
#: view:crm.lead.report:0
msgid "Exp. Closing"
-msgstr ""
+msgstr "Verw. sluiting"
#. module: crm
#: selection:crm.meeting,rrule_type:0
msgid "Yearly"
-msgstr ""
+msgstr "Jaarlijks"
#. module: crm
#: help:crm.lead.report,creation_day:0
msgid "Creation day"
-msgstr ""
+msgstr "Creatiedatum"
#. module: crm
#: field:crm.segmentation.line,name:0
msgid "Rule Name"
-msgstr ""
+msgstr "Regelnaam"
#. module: crm
#: view:crm.case.section:0
msgid "Configuration"
-msgstr ""
+msgstr "Instellingen"
#. module: crm
#: view:crm.case.resource.type:0 view:crm.lead:0 field:crm.lead,type_id:0
#: view:crm.lead.report:0 field:crm.lead.report,type_id:0
#: model:ir.model,name:crm.model_crm_case_resource_type
msgid "Campaign"
-msgstr ""
+msgstr "Campagne"
#. module: crm
#: view:crm.lead:0
msgid "Search Opportunities"
-msgstr ""
+msgstr "Opportuniteiten zoeken"
#. module: crm
#: help:crm.lead.report,deadline_month:0
msgid "Expected closing month"
-msgstr ""
+msgstr "Verwachte afsluitmaand"
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
msgid "Assigned Opportunities to"
-msgstr ""
+msgstr "Opportuniteiten toegewezen aan"
#. module: crm
#: view:crm.lead:0 field:crm.lead,partner_id:0 view:crm.lead.report:0
@@ -190,41 +191,41 @@ msgstr ""
#: model:ir.model,name:crm.model_res_partner
#: model:process.node,name:crm.process_node_partner0
msgid "Partner"
-msgstr ""
+msgstr "Relatie"
#. module: crm
#: field:crm.meeting,organizer:0 field:crm.meeting,organizer_id:0
msgid "Organizer"
-msgstr ""
+msgstr "Organisator"
#. module: crm
#: view:crm.phonecall:0
#: model:ir.actions.act_window,name:crm.phonecall_to_phonecall_act
msgid "Schedule Other Call"
-msgstr ""
+msgstr "Nog een gesprek plannen"
#. module: crm
#: code:addons/crm/crm_phonecall.py:216
#: model:crm.case.categ,name:crm.categ_meet3 view:crm.phonecall:0
#, python-format
msgid "Phone Call"
-msgstr ""
+msgstr "Telefoongesprek"
#. module: crm
#: field:crm.lead,optout:0
msgid "Opt-Out"
-msgstr ""
+msgstr "Uitschrijven"
#. module: crm
#: field:crm.meeting,end_type:0
msgid "Recurrence termination"
-msgstr ""
+msgstr "Einde recurrentie"
#. module: crm
#: code:addons/crm/crm_lead.py:323
#, python-format
msgid "The opportunity '%s' has been marked as lost."
-msgstr ""
+msgstr "Opportuniteit '%s' is als verloren ingesteld."
#. module: crm
#: model:ir.actions.act_window,help:crm.action_report_crm_lead
@@ -234,49 +235,52 @@ msgid ""
"sort out your leads analysis by different groups to get accurate grained "
"analysis."
msgstr ""
+"Met de leadsanalyse kunt u CRM-informatie opvolgen, zoals de "
+"behandelingstermijn, het aantal antwoorden en de verzonden e-mails. U kunt "
+"uw leadsanalyse sorteren volgens diverse groepen voor een accurate analyse."
#. module: crm
#: view:crm.lead:0
msgid "Send New Email"
-msgstr ""
+msgstr "Nieuwe mail versturen"
#. module: crm
#: field:crm.segmentation,segmentation_line:0
msgid "Criteria"
-msgstr ""
+msgstr "Criteria"
#. module: crm
#: view:crm.segmentation:0
msgid "Excluded Answers :"
-msgstr ""
+msgstr "Uitgesloten antwoorden:"
#. module: crm
#: field:crm.case.stage,section_ids:0
msgid "Sections"
-msgstr ""
+msgstr "Secties"
#. module: crm
#: view:crm.merge.opportunity:0
msgid "_Merge"
-msgstr ""
+msgstr "_Samenvoegen"
#. module: crm
#: view:crm.lead.report:0
#: model:ir.actions.act_window,name:crm.action_report_crm_lead
#: model:ir.ui.menu,name:crm.menu_report_crm_leads_tree
msgid "Leads Analysis"
-msgstr ""
+msgstr "Leadanalyse"
#. module: crm
#: selection:crm.meeting,class:0
msgid "Public"
-msgstr ""
+msgstr "Openbaar"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_resource_type_act
#: model:ir.ui.menu,name:crm.menu_crm_case_resource_type_act
msgid "Campaigns"
-msgstr ""
+msgstr "Campagnes"
#. module: crm
#: view:crm.lead:0 field:crm.lead,state:0 view:crm.lead.report:0
@@ -284,19 +288,19 @@ msgstr ""
#: field:crm.phonecall,state:0 view:crm.phonecall.report:0
#: field:crm.phonecall.report,state:0
msgid "State"
-msgstr ""
+msgstr "Status"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_lead_categ_action
#: model:ir.ui.menu,name:crm.menu_crm_case_phonecall-act
#: model:ir.ui.menu,name:crm.menu_crm_lead_categ
msgid "Categories"
-msgstr ""
+msgstr "Categorieën"
#. module: crm
#: view:crm.lead:0
msgid "Dates"
-msgstr ""
+msgstr "Datums"
#. module: crm
#: help:crm.lead,optout:0
@@ -304,22 +308,24 @@ msgid ""
"If opt-out is checked, this contact has refused to receive emails or "
"unsubscribed to a campaign."
msgstr ""
+"Als uitschrijven is aangevinkt, wil deze contactpersoon niet langer mails "
+"krijgen, of hij heeft zich uitgeschreven van een campagne."
#. module: crm
#: model:process.transition,name:crm.process_transition_leadpartner0
msgid "Prospect Partner"
-msgstr ""
+msgstr "Prospectrelatie"
#. module: crm
#: code:addons/crm/crm_lead.py:735
#, python-format
msgid "No Subject"
-msgstr ""
+msgstr "Geen onderwerp"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead6
msgid "Google Adwords 2"
-msgstr ""
+msgstr "Google Adwords 2"
#. module: crm
#: selection:crm.lead2opportunity.partner,action:0
@@ -327,7 +333,7 @@ msgstr ""
#: selection:crm.lead2partner,action:0
#: selection:crm.phonecall2partner,action:0
msgid "Link to an existing partner"
-msgstr ""
+msgstr "Koppelen aan een bestaande relatie"
#. module: crm
#: view:crm.lead:0 field:crm.lead,contact_id:0 view:crm.meeting:0
@@ -335,74 +341,74 @@ msgstr ""
#: field:crm.phonecall,partner_contact:0
#: field:crm.phonecall2phonecall,contact_name:0
msgid "Contact"
-msgstr ""
+msgstr "Contactpersoon"
#. module: crm
#: view:crm.meeting:0
msgid "Delegate"
-msgstr ""
+msgstr "Delegeren"
#. module: crm
#: selection:crm.segmentation.line,expr_operator:0
msgid "="
-msgstr ""
+msgstr "="
#. module: crm
#: field:base.action.rule,regex_history:0
msgid "Regular Expression on Case History"
-msgstr ""
+msgstr "Expressie op historiek van zaak"
#. module: crm
#: code:addons/crm/crm_lead.py:274
#, python-format
msgid "The lead '%s' has been opened."
-msgstr ""
+msgstr "Lead '%s' is geopend."
#. module: crm
#: model:process.transition,name:crm.process_transition_opportunitymeeting0
msgid "Opportunity Meeting"
-msgstr ""
+msgstr "Vergadering voor opportuniteit"
#. module: crm
#: help:crm.lead.report,delay_close:0 help:crm.phonecall.report,delay_close:0
msgid "Number of Days to close the case"
-msgstr ""
+msgstr "Aantal dagen tot afsluiten van zaak"
#. module: crm
#: model:process.node,note:crm.process_node_opportunities0
msgid "When a real project/opportunity is detected"
-msgstr ""
+msgstr "Als een project/opportuniteit reëel wordt"
#. module: crm
#: view:res.partner:0 field:res.partner,opportunity_ids:0
msgid "Leads and Opportunities"
-msgstr ""
+msgstr "Leads en opportuniteiten"
#. module: crm
#: view:crm.lead:0
msgid "Communication"
-msgstr ""
+msgstr "Communicatie"
#. module: crm
#: selection:crm.meeting,week_list:0
msgid "Tuesday"
-msgstr ""
+msgstr "Dinsdag"
#. module: crm
#: field:crm.lead,write_date:0
msgid "Update Date"
-msgstr ""
+msgstr "Bijwerkingsdatum"
#. module: crm
#: field:crm.case.section,user_id:0
msgid "Team Leader"
-msgstr ""
+msgstr "Teamleider"
#. module: crm
#: field:crm.lead2opportunity.partner,name:0
#: field:crm.lead2opportunity.partner.mass,name:0
msgid "Select Action"
-msgstr ""
+msgstr "Actie selecteren"
#. module: crm
#: help:crm.case.stage,probability:0
@@ -410,6 +416,8 @@ msgid ""
"This percentage depicts the default/average probability of the Case for this "
"stage to be a success"
msgstr ""
+"Dit percentage drukt de standaard/gemiddelde slaagkans uit voor de zaak in "
+"deze fase."
#. module: crm
#: field:base.action.rule,trg_categ_id:0 view:crm.lead:0
@@ -419,22 +427,22 @@ msgstr ""
#: field:crm.phonecall.report,categ_id:0
#: field:crm.phonecall2phonecall,categ_id:0
msgid "Category"
-msgstr ""
+msgstr "Categorie"
#. module: crm
#: view:crm.lead:0
msgid "Opportunity / Customer"
-msgstr ""
+msgstr "Opportuniteit / klant"
#. module: crm
#: view:crm.lead.report:0
msgid "#Opportunities"
-msgstr ""
+msgstr "#Opportuniteiten"
#. module: crm
#: view:crm.meeting:0
msgid "Privacy"
-msgstr ""
+msgstr "Privacy"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_stage_form_installer
@@ -446,120 +454,126 @@ msgid ""
"Revenue\" and the \"Expected Closing Date.\" You should also have a look at "
"the tooltip of the field \"Change Probability Automatically\"."
msgstr ""
+"Met fasen kunnen verkopers vlot opvolgen waar een specifieke opportuniteit "
+"zich bevindt in de verkoopcyclus. Om uw verkooppijplijn efficiënt te kunnen "
+"opvolgen, moet u de voorwaarden voor het doorgaan naar de volgende fase "
+"eenduidig vastleggen. Voorbeeld: een opportuniteit komt op 'Gekwalificeerd' "
+"wanneer \"Verwachte opbrengst\" en \"Verwachte afsluitdatum\" zijn ingevuld. "
+"Lees ook eens de tip bij het veld \"Kans automatisch bijwerken\"."
#. module: crm
#: view:crm.lead.report:0
msgid "Opportunity Analysis"
-msgstr ""
+msgstr "Opportuniteitenanalyse"
#. module: crm
#: help:crm.meeting,location:0
msgid "Location of Event"
-msgstr ""
+msgstr "Plaats van de gebeurtenis"
#. module: crm
#: field:crm.meeting,rrule:0
msgid "Recurrent Rule"
-msgstr ""
+msgstr "Recurrente regel"
#. module: crm
#: model:process.transition,note:crm.process_transition_opportunitymeeting0
msgid "Normal or phone meeting for opportunity"
-msgstr ""
+msgstr "Gewone of telefonische vergadering over opportuniteit"
#. module: crm
#: view:crm.case.section:0
msgid "Mail Gateway"
-msgstr ""
+msgstr "Mailgateway"
#. module: crm
#: model:process.node,note:crm.process_node_leads0
msgid "Very first contact with new prospect"
-msgstr ""
+msgstr "Allereerste contact met een nieuwe prospect"
#. module: crm
#: view:crm.lead2opportunity.partner:0 view:crm.partner2opportunity:0
#: model:ir.actions.act_window,name:crm.action_view_crm_partner2opportunity
#: model:ir.actions.act_window,name:crm.crm_partner2opportunity
msgid "Create Opportunity"
-msgstr ""
+msgstr "Opportuniteit maken"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "August"
-msgstr ""
+msgstr "Augustus"
#. module: crm
#: code:addons/crm/crm.py:433 view:crm.lead:0 view:res.partner:0
#, python-format
msgid "Escalate"
-msgstr ""
+msgstr "Escaleren"
#. module: crm
#: view:crm.lead:0
msgid "Mailings"
-msgstr ""
+msgstr "Mailings"
#. module: crm
#: view:crm.phonecall:0
msgid "To Do"
-msgstr ""
+msgstr "Nog te doen"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "June"
-msgstr ""
+msgstr "Juni"
#. module: crm
#: selection:crm.segmentation,state:0
msgid "Not Running"
-msgstr ""
+msgstr "Niet actief"
#. module: crm
#: field:crm.lead,email:0
msgid "E-Mail"
-msgstr ""
+msgstr "E-mail"
#. module: crm
#: view:crm.phonecall:0
msgid "Phonecalls during last 7 days"
-msgstr ""
+msgstr "Telefoongesprekken van de afgelopen 7 dagen"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "October"
-msgstr ""
+msgstr "Oktober"
#. module: crm
#: view:crm.segmentation:0
msgid "Included Answers :"
-msgstr ""
+msgstr "Inbegrepen antwoorden:"
#. module: crm
#: help:crm.meeting,email_from:0 help:crm.phonecall,email_from:0
msgid "These people will receive email."
-msgstr ""
+msgstr "Deze mensen zullen een e-mail krijgen."
#. module: crm
#: view:crm.meeting:0 field:crm.meeting,name:0
msgid "Summary"
-msgstr ""
+msgstr "Samenvatting"
#. module: crm
#: view:crm.segmentation:0
msgid "State of Mind Computation"
-msgstr ""
+msgstr "Berekening humeur"
#. module: crm
#: view:crm.case.categ:0
msgid "Case Category"
-msgstr ""
+msgstr "Zaakcategorie"
#. module: crm
#: help:crm.segmentation,som_interval_default:0
@@ -567,36 +581,38 @@ msgid ""
"Default state of mind for period preceeding the 'Max Interval' computation. "
"This is the starting state of mind by default if the partner has no event."
msgstr ""
+"Standaardhumeur voor de periode vóór de berekening van 'Max. interval'. Dit "
+"is het beginhumeur als er voor de relatie geen gebeurtenis is."
#. module: crm
#: field:crm.lead,partner_address_name:0
msgid "Partner Contact Name"
-msgstr ""
+msgstr "Contactpersoon relatie"
#. module: crm
#: selection:crm.meeting,end_type:0
msgid "End date"
-msgstr ""
+msgstr "Einddatum"
#. module: crm
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2phonecall:0
msgid "Schedule/Log a Call"
-msgstr ""
+msgstr "Een gesprek plannen/noteren"
#. module: crm
#: constraint:base.action.rule:0
msgid "Error: The mail is not well formated"
-msgstr ""
+msgstr "Fout: de mail heeft het verkeerde formaat."
#. module: crm
#: view:crm.segmentation:0
msgid "Profiling Options"
-msgstr ""
+msgstr "Profileringsopties"
#. module: crm
#: view:crm.phonecall.report:0
msgid "#Phone calls"
-msgstr ""
+msgstr "#Telefoongesprekken"
#. module: crm
#: help:crm.segmentation,categ_id:0
@@ -604,17 +620,19 @@ msgid ""
"The partner category that will be added to partners that match the "
"segmentation criterions after computation."
msgstr ""
+"De relatiecategorie die wordt toegewezen aan relaties die voldoen aan de "
+"segmenteringscriteria."
#. module: crm
#: code:addons/crm/crm_meeting.py:93
#, python-format
msgid "The meeting '%s' has been confirmed."
-msgstr ""
+msgstr "Vergadering '%s' is bevestigd."
#. module: crm
#: selection:crm.add.note,state:0 selection:crm.lead,state:0
msgid "In Progress"
-msgstr ""
+msgstr "Lopende"
#. module: crm
#: help:crm.case.section,reply_to:0
@@ -622,27 +640,29 @@ msgid ""
"The email address put in the 'Reply-To' of all emails sent by OpenERP about "
"cases in this sales team"
msgstr ""
+"Het e-mailadres in 'Antwoord naar' voor alle e-mails die door OpenERP voor "
+"zaken van dit verkoopteam worden verstuurd."
#. module: crm
#: field:crm.lead.report,creation_month:0
msgid "Creation Month"
-msgstr ""
+msgstr "Creatiemaand"
#. module: crm
#: field:crm.case.section,resource_calendar_id:0
#: model:ir.ui.menu,name:crm.menu_action_resource_calendar_form
msgid "Working Time"
-msgstr ""
+msgstr "Werkuren"
#. module: crm
#: view:crm.segmentation.line:0
msgid "Partner Segmentation Lines"
-msgstr ""
+msgstr "Relatiesegmenteringslijnen"
#. module: crm
#: view:crm.lead:0 view:crm.meeting:0
msgid "Details"
-msgstr ""
+msgstr "Details"
#. module: crm
#: help:crm.meeting,exrule:0
@@ -650,16 +670,18 @@ msgid ""
"Defines a rule or repeating pattern of time to exclude from the recurring "
"rule."
msgstr ""
+"Definieert een regel of een herhalend tijdspatroon die van de recurrente "
+"regel moet worden uitgesloten."
#. module: crm
#: view:crm.lead:0
msgid "Leads Form"
-msgstr ""
+msgstr "Leadformulier"
#. module: crm
#: view:crm.segmentation:0 model:ir.model,name:crm.model_crm_segmentation
msgid "Partner Segmentation"
-msgstr ""
+msgstr "Relatiesegmentering"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_categ_meet
@@ -670,41 +692,46 @@ msgid ""
"using the caldav interface.\n"
" "
msgstr ""
+"De kalender van vergaderingen wordt door de verkoopteams gedeeld en is "
+"volledig geïntegreerd met andere toepassingen zoals werknemersvakantie of "
+"opportuniteiten. U kunt vergaderingen ook synchroniseren met uw gsm via de "
+"caldav-interface.\n"
+" "
#. module: crm
#: field:crm.lead2opportunity.partner.mass,user_ids:0
msgid "Salesmans"
-msgstr ""
+msgstr "Verkopers"
#. module: crm
#: field:crm.lead.report,probable_revenue:0
msgid "Probable Revenue"
-msgstr ""
+msgstr "Verwachte opbrengst"
#. module: crm
#: help:crm.lead.report,creation_month:0
msgid "Creation month"
-msgstr ""
+msgstr "Creatiemaand"
#. module: crm
#: help:crm.segmentation,name:0
msgid "The name of the segmentation."
-msgstr ""
+msgstr "Naam van de segmentering"
#. module: crm
#: field:crm.case.stage,probability:0 field:crm.lead,probability:0
msgid "Probability (%)"
-msgstr ""
+msgstr "Kans (%)"
#. module: crm
#: field:crm.lead,company_currency:0
msgid "Company Currency"
-msgstr ""
+msgstr "Firmamunt"
#. module: crm
#: view:crm.lead:0
msgid "Leads Generation"
-msgstr ""
+msgstr "Leads maken"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_section_view_form_installer
@@ -715,6 +742,11 @@ msgid ""
"opportunities, you can assign the following stage to the team: Territory, "
"Qualified, Qualified Sponsors, Proposition, Negociaton, Won/Lost."
msgstr ""
+"Maak verkoopteams om uw verkooporganisatie te structureren en voeg "
+"gebruikers toe aan elk team. Maak ook verkoopfasen per team/ Als u "
+"technieken zoals Solutions Selling gebruikt, kunt u vb. de volgende fasen "
+"aan een team toekennen: Territorium, Gekwalificeerd, Gekwalificeerde "
+"sponsors, Voorstel, Onderhandeling, Gewonnen/Verloren."
#. module: crm
#: code:addons/crm/crm_lead.py:718 view:crm.lead:0 selection:crm.lead,type:0
@@ -722,42 +754,42 @@ msgstr ""
#: field:crm.meeting,opportunity_id:0
#, python-format
msgid "Opportunity"
-msgstr ""
+msgstr "Opportuniteit"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities created in last month"
-msgstr ""
+msgstr "Leads/opportuniteiten van de afgelopen maand"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead7
msgid "Television"
-msgstr ""
+msgstr "Televisie"
#. module: crm
#: view:crm.segmentation:0
msgid "Stop Process"
-msgstr ""
+msgstr "Verwerking stoppen"
#. module: crm
#: view:crm.lead.report:0 view:crm.phonecall.report:0
msgid "Month-1"
-msgstr ""
+msgstr "Maand-1"
#. module: crm
#: view:crm.phonecall:0
msgid "Search Phonecalls"
-msgstr ""
+msgstr "Telefoongesprekken zoeken"
#. module: crm
#: view:crm.lead2partner:0 view:crm.phonecall2partner:0
msgid "Continue"
-msgstr ""
+msgstr "Doorgaan"
#. module: crm
#: field:crm.segmentation,som_interval:0
msgid "Days per Period"
-msgstr ""
+msgstr "Dagen per periode"
#. module: crm
#: field:crm.meeting,byday:0
@@ -767,17 +799,17 @@ msgstr ""
#. module: crm
#: field:base.action.rule,act_section_id:0
msgid "Set Team to"
-msgstr ""
+msgstr "Team instellen op"
#. module: crm
#: view:calendar.attendee:0 field:calendar.attendee,categ_id:0
msgid "Event Type"
-msgstr ""
+msgstr "Gebeurtenistype"
#. module: crm
#: field:crm.segmentation,exclusif:0
msgid "Exclusive"
-msgstr ""
+msgstr "Exclusief"
#. module: crm
#: code:addons/crm/crm_lead.py:832
@@ -786,43 +818,45 @@ msgid ""
"You cannot delete lead '%s'; it must be in state 'Draft' to be deleted. You "
"should better cancel it, instead of deleting it."
msgstr ""
+"U kunt lead '%s' niet verwijderen; daarvoor moet de lead in status "
+"'Voorlopig' staan. U kunt de lead beter annuleren."
#. module: crm
#: code:addons/crm/crm_lead.py:451
#, python-format
msgid "From %s : %s"
-msgstr ""
+msgstr "Van %s : %s"
#. module: crm
#: field:crm.lead.report,creation_year:0
msgid "Creation Year"
-msgstr ""
+msgstr "Creatiejaar"
#. module: crm
#: field:crm.lead.report,create_date:0
#: field:crm.phonecall.report,create_date:0
msgid "Create Date"
-msgstr ""
+msgstr "Creatiedatum"
#. module: crm
#: field:crm.lead,ref2:0
msgid "Reference 2"
-msgstr ""
+msgstr "Referentie 2"
#. module: crm
#: view:crm.segmentation:0
msgid "Sales Purchase"
-msgstr ""
+msgstr "Aankoop/verkoop"
#. module: crm
#: help:crm.case.section,resource_calendar_id:0
msgid "Used to compute open days"
-msgstr ""
+msgstr "Dient om dagen geopend te berekenen"
#. module: crm
#: view:crm.lead:0
msgid "Schedule Meeting"
-msgstr ""
+msgstr "Vergadering beleggen"
#. module: crm
#: view:crm.case.stage:0 field:crm.case.stage,requirements:0
@@ -835,21 +869,23 @@ msgid ""
"This property defines the list of date/time exceptions for a recurring "
"calendar component."
msgstr ""
+"Met dit kenmerk definieert u de lijst van uitzonderingen qua datum/tijd voor "
+"een recurrent kalenderonderdeel."
#. module: crm
#: view:crm.phonecall2opportunity:0
msgid "Convert To Opportunity "
-msgstr ""
+msgstr "Omzetten naar opportuniteit "
#. module: crm
#: help:crm.meeting,recurrency:0
msgid "Recurrent Meeting"
-msgstr ""
+msgstr "Recurrente vergadering"
#. module: crm
#: view:crm.phonecall:0
msgid "Unassigned Phonecalls"
-msgstr ""
+msgstr "Niet-toegewezen telefoongesprekken"
#. module: crm
#: view:crm.lead:0 field:crm.lead2opportunity.partner,opportunity_ids:0
@@ -859,45 +895,45 @@ msgstr ""
#: model:ir.ui.menu,name:crm.menu_crm_case_opp
#: model:process.node,name:crm.process_node_opportunities0
msgid "Opportunities"
-msgstr ""
+msgstr "Opportuniteiten"
#. module: crm
#: field:crm.segmentation,categ_id:0
msgid "Partner Category"
-msgstr ""
+msgstr "Relatiecategorie"
#. module: crm
#: view:crm.add.note:0
#: model:ir.actions.act_window,name:crm.action_crm_add_note
msgid "Add Note"
-msgstr ""
+msgstr "Notitie toevoegen"
#. module: crm
#: field:crm.lead,is_supplier_add:0
msgid "Supplier"
-msgstr ""
+msgstr "Leverancier"
#. module: crm
#: view:crm.lead:0
msgid "Mark Won"
-msgstr ""
+msgstr "Als gewonnen markeren"
#. module: crm
#: selection:crm.segmentation.line,expr_name:0
msgid "Purchase Amount"
-msgstr ""
+msgstr "Aankoopbedrag"
#. module: crm
#: view:crm.lead:0
msgid "Mark Lost"
-msgstr ""
+msgstr "Als verloren markeren"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "March"
-msgstr ""
+msgstr "Maart"
#. module: crm
#: code:addons/crm/crm_lead.py:491
@@ -905,62 +941,62 @@ msgstr ""
#: code:addons/crm/wizard/crm_lead_to_partner.py:47
#, python-format
msgid "Warning !"
-msgstr ""
+msgstr "Waarschuwing"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone calls made in current year"
-msgstr ""
+msgstr "Telefoongesprekken van dit jaar"
#. module: crm
#: field:crm.lead,day_open:0
msgid "Days to Open"
-msgstr ""
+msgstr "Dagen tot openen"
#. module: crm
#: view:crm.meeting:0
msgid "Show Time as"
-msgstr ""
+msgstr "Tijd tonen als"
#. module: crm
#: view:crm.phonecall2partner:0
msgid "Create Partner"
-msgstr ""
+msgstr "Relatie maken"
#. module: crm
#: selection:crm.segmentation.line,expr_operator:0
msgid "<"
-msgstr ""
+msgstr "<"
#. module: crm
#: field:crm.lead,mobile:0 field:crm.phonecall,partner_mobile:0
msgid "Mobile"
-msgstr ""
+msgstr "Gsm"
#. module: crm
#: view:crm.lead:0
msgid "Next Stage"
-msgstr ""
+msgstr "Volgende fase"
#. module: crm
#: view:crm.meeting:0
msgid "My Meetings"
-msgstr ""
+msgstr "Mijn vergaderingen"
#. module: crm
#: view:crm.phonecall:0
msgid "Todays's Phonecalls"
-msgstr ""
+msgstr "Telefoongesprekken van vandaag"
#. module: crm
#: view:board.board:0
msgid "Statistics Dashboard"
-msgstr ""
+msgstr "Statistiekdashboard"
#. module: crm
#: field:crm.lead,ref:0
msgid "Reference"
-msgstr ""
+msgstr "Referentie"
#. module: crm
#: field:crm.lead,optin:0
@@ -977,7 +1013,7 @@ msgstr ""
#: field:res.partner,meeting_ids:0
#, python-format
msgid "Meetings"
-msgstr ""
+msgstr "Vergaderingen"
#. module: crm
#: field:crm.lead,date_action_next:0 field:crm.lead,title_action:0
@@ -988,12 +1024,12 @@ msgstr ""
#. module: crm
#: field:crm.meeting,end_date:0
msgid "Repeat Until"
-msgstr ""
+msgstr "Herhalen tot"
#. module: crm
#: field:crm.meeting,date_deadline:0
msgid "Deadline"
-msgstr ""
+msgstr "Deadline"
#. module: crm
#: help:crm.meeting,active:0
@@ -1001,32 +1037,34 @@ msgid ""
"If the active field is set to true, it will allow you to hide the "
"event alarm information without removing it."
msgstr ""
+"Als het veld Actief is ingeschakeld, kunt u de alarminfo verbergen zonder "
+"dat u deze verwijdert."
#. module: crm
#: view:crm.lead:0
msgid "Change Color"
-msgstr ""
+msgstr "Kleur wijzigen"
#. module: crm
#: view:crm.segmentation:0
msgid "Partner Segmentations"
-msgstr ""
+msgstr "Relatiesegmenteringen"
#. module: crm
#: field:crm.meeting,user_id:0 view:crm.phonecall:0
#: field:crm.phonecall,user_id:0 view:res.partner:0
msgid "Responsible"
-msgstr ""
+msgstr "Verantwoordelijke"
#. module: crm
#: view:crm.lead.report:0
msgid "Show only opportunity"
-msgstr ""
+msgstr "Enkel opportuniteit tonen"
#. module: crm
#: view:res.partner:0
msgid "Previous"
-msgstr ""
+msgstr "Vorige"
#. module: crm
#: view:crm.lead:0
@@ -1036,52 +1074,52 @@ msgstr ""
#. module: crm
#: view:crm.lead:0
msgid "Statistics"
-msgstr ""
+msgstr "Statistieken"
#. module: crm
#: view:crm.meeting:0
msgid "From"
-msgstr ""
+msgstr "Van"
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
msgid "Convert into Opportunities"
-msgstr ""
+msgstr "Omzetten naar opportuniteit"
#. module: crm
#: view:crm.lead:0
msgid "Show Sales Team"
-msgstr ""
+msgstr "Verkoopteam tonen"
#. module: crm
#: view:res.partner:0
msgid "Next"
-msgstr ""
+msgstr "Volgende"
#. module: crm
#: view:crm.lead:0
msgid "Stage:"
-msgstr ""
+msgstr "Fase:"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead5 view:crm.lead:0
msgid "Won"
-msgstr ""
+msgstr "Gewonnen"
#. module: crm
#: field:crm.lead.report,delay_expected:0
msgid "Overpassed Deadline"
-msgstr ""
+msgstr "Deadline overschreden"
#. module: crm
#: model:crm.case.section,name:crm.section_sales_department
msgid "Sales Department"
-msgstr ""
+msgstr "Verkoopafdeling"
#. module: crm
#: selection:crm.segmentation.line,expr_name:0
msgid "State of Mind"
-msgstr ""
+msgstr "Humeur"
#. module: crm
#: field:crm.lead,type:0 field:crm.lead.report,type:0
@@ -1092,70 +1130,70 @@ msgstr ""
#. module: crm
#: view:crm.segmentation:0
msgid "Compute Segmentation"
-msgstr ""
+msgstr "Segmentering berekenen"
#. module: crm
#: field:crm.case.stage,on_change:0
msgid "Change Probability Automatically"
-msgstr ""
+msgstr "Kans automatisch wijzigen"
#. module: crm
#: field:crm.lead,create_date:0 field:crm.meeting,create_date:0
#: view:crm.phonecall:0 field:crm.phonecall,create_date:0
#: field:crm.phonecall.report,creation_date:0
msgid "Creation Date"
-msgstr ""
+msgstr "Creatiedatum"
#. module: crm
#: view:board.board:0
msgid "My Opportunities"
-msgstr ""
+msgstr "Mijn opportuniteiten"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor5
msgid "Need a Website Design"
-msgstr ""
+msgstr "Heeft een websiteontwerp nodig"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Year of call"
-msgstr ""
+msgstr "Jaar van telefoontje"
#. module: crm
#: field:crm.meeting,recurrent_uid:0
msgid "Recurrent ID"
-msgstr ""
+msgstr "Recurrente ID"
#. module: crm
#: view:crm.lead:0 view:crm.meeting:0 view:res.partner:0
msgid "Subject"
-msgstr ""
+msgstr "Onderwerp"
#. module: crm
#: field:crm.meeting,tu:0
msgid "Tue"
-msgstr ""
+msgstr "Din"
#. module: crm
#: view:crm.case.stage:0 view:crm.lead:0 field:crm.lead,stage_id:0
#: view:crm.lead.report:0 field:crm.lead.report,stage_id:0
msgid "Stage"
-msgstr ""
+msgstr "Fase"
#. module: crm
#: view:crm.lead:0
msgid "History Information"
-msgstr ""
+msgstr "Historiekinformatie"
#. module: crm
#: field:base.action.rule,act_mail_to_partner:0
msgid "Mail to Partner"
-msgstr ""
+msgstr "Mail naar relatie"
#. module: crm
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2phonecall:0
msgid "Call Details"
-msgstr ""
+msgstr "Details gesprek"
#. module: crm
#: field:crm.meeting,class:0
@@ -1165,22 +1203,24 @@ msgstr ""
#. module: crm
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2phonecall:0
msgid "Log call"
-msgstr ""
+msgstr "Gesprek noteren"
#. module: crm
#: help:crm.meeting,rrule_type:0
msgid "Let the event automatically repeat at that interval"
msgstr ""
+"Zorg ervoor dat de gebeurtenis automatisch wordt herhaald volgens dit "
+"interval."
#. module: crm
#: view:base.action.rule:0
msgid "Condition Case Fields"
-msgstr ""
+msgstr "Voorwaardevelden"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone calls which are in pending state"
-msgstr ""
+msgstr "Telefoongesprekken in status Wachtend."
#. module: crm
#: view:crm.case.section:0 field:crm.case.section,stage_ids:0
@@ -1189,14 +1229,14 @@ msgstr ""
#: model:ir.actions.act_window,name:crm.crm_lead_stage_act
#: model:ir.ui.menu,name:crm.menu_crm_lead_stage_act
msgid "Stages"
-msgstr ""
+msgstr "Fasen"
#. module: crm
#: field:crm.lead,planned_revenue:0
#: field:crm.partner2opportunity,planned_revenue:0
#: field:crm.phonecall2opportunity,planned_revenue:0
msgid "Expected Revenue"
-msgstr ""
+msgstr "Verwachte opbrengst"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_phonecall_categ_action
@@ -1204,18 +1244,20 @@ msgid ""
"Create specific phone call categories to better define the type of calls "
"tracked in the system."
msgstr ""
+"Maak specifieke gesprekscategorieën zodat u vlot de verschillende soorten "
+"gesprekken kunt opvolgen."
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "September"
-msgstr ""
+msgstr "September"
#. module: crm
#: field:crm.segmentation,partner_id:0
msgid "Max Partner ID processed"
-msgstr ""
+msgstr "Max. relatie-ID verwerkt"
#. module: crm
#: help:crm.case.stage,on_change:0
@@ -1223,38 +1265,39 @@ msgid ""
"Setting this stage will change the probability automatically on the "
"opportunity."
msgstr ""
+"Als u deze fase instelt, wijzigt de kans automatisch voor de opportuniteit."
#. module: crm
#: model:ir.actions.act_window,name:crm.action_report_crm_phonecall
#: model:ir.ui.menu,name:crm.menu_report_crm_phonecalls_tree
msgid "Phone Calls Analysis"
-msgstr ""
+msgstr "Analyse telefoongesprekken"
#. module: crm
#: field:crm.lead.report,opening_date:0
#: field:crm.phonecall.report,opening_date:0
msgid "Opening Date"
-msgstr ""
+msgstr "Startdatum"
#. module: crm
#: help:crm.phonecall,duration:0
msgid "Duration in Minutes"
-msgstr ""
+msgstr "Duur in minuten"
#. module: crm
#: field:crm.case.channel,name:0
msgid "Channel Name"
-msgstr ""
+msgstr "Kanaalnaam"
#. module: crm
#: field:crm.partner2opportunity,name:0 field:crm.phonecall2opportunity,name:0
msgid "Opportunity Name"
-msgstr ""
+msgstr "Opportuniteitnaam"
#. module: crm
#: help:crm.lead.report,deadline_day:0
msgid "Expected closing day"
-msgstr ""
+msgstr "Verwachte afsluitdatum"
#. module: crm
#: help:crm.case.section,active:0
@@ -1262,11 +1305,13 @@ msgid ""
"If the active field is set to true, it will allow you to hide the sales team "
"without removing it."
msgstr ""
+"Als het veld Actief is ingeschakeld, kunt u het verkoopteam verbergen zonder "
+"dat u dit verwijdert."
#. module: crm
#: field:crm.lead,street2:0
msgid "Street2"
-msgstr ""
+msgstr "Straat 2"
#. module: crm
#: help:crm.case.stage,case_default:0
@@ -1274,31 +1319,33 @@ msgid ""
"If you check this field, this stage will be proposed by default on each "
"sales team. It will not assign this stage to existing teams."
msgstr ""
+"Als u dit veld aanvinkt, wordt de fase standaard voor elk verkoopteam "
+"voorgesteld. De fase wordt niet toegewezen aan bestaande teams."
#. module: crm
#: field:crm.meeting,fr:0
msgid "Fri"
-msgstr ""
+msgstr "Vrij"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead
msgid "crm.lead"
-msgstr ""
+msgstr "Lead"
#. module: crm
#: field:crm.meeting,write_date:0
msgid "Write Date"
-msgstr ""
+msgstr "Schrijfdatum"
#. module: crm
#: view:crm.meeting:0
msgid "End of Recurrency"
-msgstr ""
+msgstr "Einde recurrentie"
#. module: crm
#: view:crm.meeting:0
msgid "Reminder"
-msgstr ""
+msgstr "Herinnering"
#. module: crm
#: help:crm.segmentation,sales_purchase_active:0
@@ -1306,16 +1353,18 @@ msgid ""
"Check if you want to use this tab as part of the segmentation rule. If not "
"checked, the criteria beneath will be ignored"
msgstr ""
+"Vink aan als u dit tabblad als onderdeel van een segmenteringsregel wilt "
+"gebruiken. Zoniet worden onderstaande criteria genegeerd."
#. module: crm
#: help:crm.meeting,alarm_id:0
msgid "Set an alarm at this time, before the event occurs"
-msgstr ""
+msgstr "Stel een alarm in voordat de gebeurtenis plaatsvindt."
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_create_partner
msgid "Schedule a Call"
-msgstr ""
+msgstr "Een gesprek plannen"
#. module: crm
#: view:crm.lead2partner:0 view:crm.phonecall:0 view:crm.phonecall2partner:0
@@ -1328,7 +1377,7 @@ msgstr ""
#. module: crm
#: field:crm.segmentation,state:0
msgid "Execution Status"
-msgstr ""
+msgstr "Uitvoeringsstatus"
#. module: crm
#: help:crm.phonecall,state:0
@@ -1341,16 +1390,24 @@ msgid ""
" \n"
"If the call needs to be done then the state is set to 'Not Held'."
msgstr ""
+"De status wordt op 'Uit te voeren' gezet als er een zaak wordt gemaakt. "
+" \n"
+"Als de zaak lopende is, wordt de status op 'Open' gezet. "
+" \n"
+"Als het gesprek is gevoerd, wordt de status op 'Uitgevoerd' gezet. "
+" \n"
+"Als het gesprek nog moet worden uitgevoerd, gaat de status naar 'Niet "
+"uitgevoerd'."
#. module: crm
#: selection:crm.meeting,week_list:0
msgid "Monday"
-msgstr ""
+msgstr "Maandag"
#. module: crm
#: field:crm.lead,day_close:0
msgid "Days to Close"
-msgstr ""
+msgstr "Dagen tot afsluiten"
#. module: crm
#: field:crm.case.section,complete_name:0
@@ -1361,60 +1418,62 @@ msgstr ""
#: code:addons/crm/crm_lead.py:296
#, python-format
msgid "The case '%s' has been closed."
-msgstr ""
+msgstr "Zaak '%s' is gesloten."
#. module: crm
#: model:ir.model,name:crm.model_crm_partner2opportunity
msgid "Partner To Opportunity"
-msgstr ""
+msgstr "Relatie naar opportuniteit"
#. module: crm
#: field:crm.meeting,date:0 field:crm.opportunity2phonecall,date:0
#: view:crm.phonecall:0 field:crm.phonecall,date:0
#: field:crm.phonecall2phonecall,date:0 view:res.partner:0
msgid "Date"
-msgstr ""
+msgstr "Datum"
#. module: crm
#: view:crm.lead.report:0 view:crm.phonecall.report:0
msgid "Extended Filters..."
-msgstr ""
+msgstr "Uitgebreide filters..."
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone calls which are in closed state"
-msgstr ""
+msgstr "Telefoongesprekken in status uitgevoerd."
#. module: crm
#: view:crm.phonecall.report:0
msgid "Search"
-msgstr ""
+msgstr "Zoeken"
#. module: crm
#: view:board.board:0
msgid "Opportunities by Categories"
-msgstr ""
+msgstr "Opportuniteiten per categorie"
#. module: crm
#: model:crm.case.section,name:crm.section_sales_marketing_department
msgid "Sales Marketing Department"
-msgstr ""
+msgstr "Afdeling Sales & Marketing"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Date of call"
-msgstr ""
+msgstr "Datum van gesprek"
#. module: crm
#: help:crm.lead,section_id:0
msgid ""
"When sending mails, the default email address is taken from the sales team."
msgstr ""
+"E-mails worden verzonden naar het standaardmailadres van het verkoopteam."
#. module: crm
#: view:crm.meeting:0
msgid "Choose day in the month where repeat the meeting"
msgstr ""
+"Kies de dag van de maand waarop deze vergadering moet worden herhaald."
#. module: crm
#: view:crm.segmentation:0
@@ -1425,18 +1484,18 @@ msgstr ""
#: view:crm.phonecall:0
#: model:ir.actions.act_window,name:crm.crm_case_categ_meet_create_partner
msgid "Schedule a Meeting"
-msgstr ""
+msgstr "Een vergadering beleggen"
#. module: crm
#: code:addons/crm/crm_lead.py:431
#, python-format
msgid "Merged opportunities"
-msgstr ""
+msgstr "Samengevoegde opportuniteiten"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_section_view_form_installer
msgid "Define Sales Team"
-msgstr ""
+msgstr "Verkoopteam instellen"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_segmentation_tree-act
@@ -1445,26 +1504,29 @@ msgid ""
"better manage your interactions with them. The segmentation tool is able to "
"assign categories to partners according to criteria you set."
msgstr ""
+"Maak specifieke relatiecategorieën die u aan relaties kunt toekennen voor "
+"een betere interactie. De segmenteringstool kan automatisch categorieën "
+"toewijzen aan relaties op basis van door u ingestelde criteria."
#. module: crm
#: field:crm.case.section,code:0
msgid "Code"
-msgstr ""
+msgstr "Code"
#. module: crm
#: field:crm.case.section,child_ids:0
msgid "Child Teams"
-msgstr ""
+msgstr "Onderliggende teams"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone calls which are in draft and open state"
-msgstr ""
+msgstr "Telefoongesprekken in status Uit te voeren en Open."
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead1
msgid "Telesales"
-msgstr ""
+msgstr "Televerkoop"
#. module: crm
#: view:crm.lead:0
@@ -1484,47 +1546,49 @@ msgstr ""
#. module: crm
#: model:ir.model,name:crm.model_res_users
msgid "res.users"
-msgstr ""
+msgstr "res.users"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities which are in pending state"
-msgstr ""
+msgstr "Leads/opportuniteiten in status Wachtend."
#. module: crm
#: model:ir.model,name:crm.model_crm_merge_opportunity
msgid "Merge two Opportunities"
-msgstr ""
+msgstr "Twee opportuniteiten samenvoegen"
#. module: crm
#: field:crm.meeting,exrule:0
msgid "Exception Rule"
-msgstr ""
+msgstr "Uitzonderingsregel"
#. module: crm
#: help:base.action.rule,act_mail_to_partner:0
msgid "Check this if you want the rule to send an email to the partner."
msgstr ""
+"Schakel dit in als u wilt dat met deze regel een e-mail naar de relatie "
+"wordt verstuurd."
#. module: crm
#: field:crm.phonecall,opportunity_id:0
msgid "Lead/Opportunity"
-msgstr ""
+msgstr "Lead/opportuniteit"
#. module: crm
#: view:crm.lead:0
msgid "Mail"
-msgstr ""
+msgstr "E-mail"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_phonecall_categ_action
msgid "Phonecall Categories"
-msgstr ""
+msgstr "Telefooncategorieën"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities which are in open state"
-msgstr ""
+msgstr "Leads/opportuniteiten in status Open."
#. module: crm
#: model:ir.actions.act_window,name:crm.act_oppor_categ
@@ -1537,43 +1601,45 @@ msgid ""
"The name of the future partner that will be created while converting the "
"lead into opportunity"
msgstr ""
+"De naam van de toekomstige relatie die zal worden gemaakt als van de lead "
+"een opportuniteit wordt gemaakt."
#. module: crm
#: constraint:crm.case.section:0
msgid "Error ! You cannot create recursive Sales team."
-msgstr ""
+msgstr "U kunt niet dezelfde verkoopteams maken."
#. module: crm
#: selection:crm.opportunity2phonecall,action:0
#: selection:crm.phonecall2phonecall,action:0
msgid "Log a call"
-msgstr ""
+msgstr "Gesprek noteren"
#. module: crm
#: selection:crm.lead2opportunity.partner,action:0
#: selection:crm.lead2opportunity.partner.mass,action:0
msgid "Do not link to a partner"
-msgstr ""
+msgstr "Geen relatie koppelen"
#. module: crm
#: view:crm.meeting:0
msgid "Search Meetings"
-msgstr ""
+msgstr "Vergaderingen zoeken"
#. module: crm
#: selection:crm.segmentation.line,expr_name:0
msgid "Sale Amount"
-msgstr ""
+msgstr "Verkoopbedrag"
#. module: crm
#: view:crm.meeting:0
msgid "Choose day where repeat the meeting"
-msgstr ""
+msgstr "Kies de dag waarop deze vergadering moet worden herhaald."
#. module: crm
#: selection:crm.meeting,state:0
msgid "Unconfirmed"
-msgstr ""
+msgstr "Niet bevestigd"
#. module: crm
#: model:ir.actions.act_window,help:crm.action_report_crm_opportunity
@@ -1584,6 +1650,10 @@ msgid ""
"mainly used by the sales manager in order to do the periodic review with the "
"teams of the sales pipeline."
msgstr ""
+"Met de Opportuniteitenanalyse krijgt u info zoals verwachte opbrengst, "
+"geplande kosten, overschreden deadlines of het aantal interacties per "
+"opportuniteit. Dit rapport wordt meestal door de sales manager gebruikt om "
+"periodiek de verkooppijplijn door te nemen met de teams."
#. module: crm
#: field:crm.case.categ,name:0 field:crm.lead,name:0
@@ -1594,7 +1664,7 @@ msgstr ""
#. module: crm
#: field:crm.meeting,alarm_id:0 field:crm.meeting,base_calendar_alarm_id:0
msgid "Alarm"
-msgstr ""
+msgstr "Herinnering"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_lead_stage_act
@@ -1603,48 +1673,51 @@ msgid ""
"organise their sales pipeline. Stages will allow them to easily track how a "
"specific lead or opportunity is positioned in the sales cycle."
msgstr ""
+"Voeg specifieke fasen toe aan leads en opportuniteiten waarmee uw verkopers "
+"hun pijplijn beter kunnen organiseren. Met fasen kan vlot worden opgevolgd "
+"waar een bepaalde lead of opportuniteit zich bevindt in de verkoopcyclus."
#. module: crm
#: model:ir.actions.act_window,name:crm.action_crm_send_mass_convert
msgid "Convert opportunities"
-msgstr ""
+msgstr "Opportuniteiten omzetten"
#. module: crm
#: view:crm.lead.report:0 view:crm.phonecall.report:0
msgid "My Case(s)"
-msgstr ""
+msgstr "Mijn zaken"
#. module: crm
#: field:crm.lead,birthdate:0
msgid "Birthdate"
-msgstr ""
+msgstr "Geboortedatum"
#. module: crm
#: view:crm.meeting:0
msgid "The"
-msgstr ""
+msgstr "De"
#. module: crm
#: view:crm.lead:0 view:crm.phonecall:0
msgid "Creation"
-msgstr ""
+msgstr "Creatie"
#. module: crm
#: selection:crm.lead,priority:0 selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
#: selection:crm.phonecall.report,priority:0
msgid "High"
-msgstr ""
+msgstr "Hoog"
#. module: crm
#: model:process.node,note:crm.process_node_partner0
msgid "Convert to prospect to business partner"
-msgstr ""
+msgstr "Prospect omzetten naar relatie"
#. module: crm
#: view:crm.meeting:0
msgid "Meeting / Partner"
-msgstr ""
+msgstr "Vergadering / relatie"
#. module: crm
#: view:crm.phonecall2opportunity:0
@@ -1658,6 +1731,9 @@ msgid ""
"sent/to be sent to your colleagues/partners. You can not only invite OpenERP "
"users, but also external parties, such as a customer."
msgstr ""
+"Met uitnodigingen kunt u vergaderingen beleggen met uw collega's / relaties "
+"en de aanwezigheden opvolgen. U kunt niet alleen OpenERP-gebruikers "
+"uitnodigen, maar ook externe partijen, zoals een klant."
#. module: crm
#: selection:crm.meeting,week_list:0
@@ -1667,164 +1743,165 @@ msgstr ""
#. module: crm
#: selection:crm.meeting,byday:0
msgid "Fifth"
-msgstr ""
+msgstr "Vijfde"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities which are in done state"
-msgstr ""
+msgstr "Leads/opportuniteiten in status Gereed."
#. module: crm
#: field:crm.lead.report,delay_close:0
msgid "Delay to Close"
-msgstr ""
+msgstr "Dagen tot afsluiten"
#. module: crm
#: field:crm.meeting,we:0
msgid "Wed"
-msgstr ""
+msgstr "Woe"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor6
msgid "Potential Reseller"
-msgstr ""
+msgstr "Mogelijke reseller"
#. module: crm
#: help:crm.case.section,change_responsible:0
msgid ""
"When escalating to this team override the saleman with the team leader."
msgstr ""
+"Bij escaleren naar dit team, wordt de verkoper vervangen door de teamleider."
#. module: crm
#: field:crm.lead.report,planned_revenue:0
msgid "Planned Revenue"
-msgstr ""
+msgstr "Geplande opbrengst"
#. module: crm
#: view:crm.lead:0 view:crm.lead.report:0 view:crm.phonecall:0
#: view:crm.phonecall.report:0
msgid "Group By..."
-msgstr ""
+msgstr "Groeperen op..."
#. module: crm
#: help:crm.lead,partner_id:0
msgid "Optional linked partner, usually after conversion of the lead"
-msgstr ""
+msgstr "Optionele gekoppelde relatie, doorgaans na omzetting van de lead"
#. module: crm
#: view:crm.meeting:0
msgid "Invitation details"
-msgstr ""
+msgstr "Details uitnodiging"
#. module: crm
#: field:crm.case.section,parent_id:0
msgid "Parent Team"
-msgstr ""
+msgstr "Hoofdteam"
#. module: crm
#: field:crm.lead,date_action:0
msgid "Next Action Date"
-msgstr ""
+msgstr "Volgende actiedatum"
#. module: crm
#: selection:crm.segmentation,state:0
msgid "Running"
-msgstr ""
+msgstr "Lopend"
#. module: crm
#: field:crm.lead,zip:0
msgid "Zip"
-msgstr ""
+msgstr "Postcode"
#. module: crm
#: code:addons/crm/crm_lead.py:278
#, python-format
msgid "The case '%s' has been opened."
-msgstr ""
+msgstr "Zaak '%s' is geopend."
#. module: crm
#: model:crm.case.categ,name:crm.categ_phone1
msgid "Inbound"
-msgstr ""
+msgstr "Inkomend"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Month of call"
-msgstr ""
+msgstr "Maand van gesprek"
#. module: crm
#: view:crm.phonecall.report:0
#: model:ir.actions.act_window,name:crm.act_crm_opportunity_crm_phonecall_new
msgid "Phone calls"
-msgstr ""
+msgstr "Telefoongesprekken"
#. module: crm
#: selection:crm.meeting,show_as:0
msgid "Free"
-msgstr ""
+msgstr "Vrij"
#. module: crm
#: field:crm.case.section,allow_unlink:0
msgid "Allow Delete"
-msgstr ""
+msgstr "Verwijderen toelaten"
#. module: crm
#: field:crm.meeting,mo:0
msgid "Mon"
-msgstr ""
+msgstr "Maa"
#. module: crm
#: selection:crm.lead,priority:0 selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
#: selection:crm.phonecall.report,priority:0
msgid "Highest"
-msgstr ""
+msgstr "Hoogste"
#. module: crm
#: help:crm.lead.report,creation_year:0
msgid "Creation year"
-msgstr ""
+msgstr "Creatiejaar"
#. module: crm
#: view:crm.case.section:0 view:crm.lead:0 field:crm.lead,description:0
#: view:crm.opportunity2phonecall:0
msgid "Notes"
-msgstr ""
+msgstr "Opmerkingen"
#. module: crm
#: field:crm.segmentation.line,expr_value:0
msgid "Value"
-msgstr ""
+msgstr "Waarde"
#. module: crm
#: help:crm.lead,type:0 help:crm.lead.report,type:0
msgid "Type is used to separate Leads and Opportunities"
-msgstr ""
+msgstr "Type wordt gebruikt om leads van opportuniteiten te onderscheiden"
#. module: crm
#: view:crm.lead:0 view:crm.lead.report:0
msgid "Opportunity by Categories"
-msgstr ""
+msgstr "Opportuniteiten per categorie"
#. module: crm
#: view:crm.lead:0 field:crm.lead,partner_name:0
msgid "Customer Name"
-msgstr ""
+msgstr "Klantennaam"
#. module: crm
#: model:ir.model,name:crm.model_crm_phonecall2opportunity
msgid "Phonecall To Opportunity"
-msgstr ""
+msgstr "Telefoongesprek naar opportuniteit"
#. module: crm
#: field:crm.case.section,reply_to:0
msgid "Reply-To"
-msgstr ""
+msgstr "Antwoord aan"
#. module: crm
#: view:crm.case.section:0
msgid "Select Stages for this Sales Team"
-msgstr ""
+msgstr "Fasen voor verkoopteam kiezen"
#. module: crm
#: view:board.board:0
@@ -1834,22 +1911,22 @@ msgstr ""
#. module: crm
#: view:crm.meeting:0
msgid "Recurrency Option"
-msgstr ""
+msgstr "Recurrentieoptie"
#. module: crm
#: view:crm.lead:0
msgid "Lead / Customer"
-msgstr ""
+msgstr "Lead / klant"
#. module: crm
#: model:process.transition,note:crm.process_transition_leadpartner0
msgid "Prospect is converting to business partner"
-msgstr ""
+msgstr "Prospect wordt omgezet naar relatie"
#. module: crm
#: model:ir.actions.act_window,name:crm.phonecall2opportunity_act
msgid "Convert To Opportunity"
-msgstr ""
+msgstr "Omzetten naar opportuniteit"
#. module: crm
#: view:crm.case.channel:0
@@ -1864,55 +1941,55 @@ msgstr ""
#: view:crm.phonecall.report:0 selection:crm.phonecall.report,state:0
#: view:res.partner:0
msgid "Held"
-msgstr ""
+msgstr "Uitgevoerd"
#. module: crm
#: view:crm.lead:0
msgid "Reset to Draft"
-msgstr ""
+msgstr "Terug naar Voorlopig"
#. module: crm
#: view:crm.lead:0
msgid "Extra Info"
-msgstr ""
+msgstr "Extra informatie"
#. module: crm
#: view:crm.merge.opportunity:0
#: model:ir.actions.act_window,name:crm.action_merge_opportunities
#: model:ir.actions.act_window,name:crm.merge_opportunity_act
msgid "Merge Opportunities"
-msgstr ""
+msgstr "Opportuniteiten samenvoegen"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead5
msgid "Google Adwords"
-msgstr ""
+msgstr "Google Adwords"
#. module: crm
#: model:ir.model,name:crm.model_crm_phonecall
msgid "crm.phonecall"
-msgstr ""
+msgstr "Telefoongesprek"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead3
msgid "Mail Campaign 2"
-msgstr ""
+msgstr "Mailcampagne 2"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead2
msgid "Mail Campaign 1"
-msgstr ""
+msgstr "Mailcampagne 1"
#. module: crm
#: view:crm.lead:0
msgid "Create"
-msgstr ""
+msgstr "Maken"
#. module: crm
#: code:addons/crm/crm_lead.py:849
#, python-format
msgid "Changed Stage to: %s"
-msgstr ""
+msgstr "Fase gewijzigd in: %s"
#. module: crm
#: view:crm.lead:0 field:crm.lead,priority:0 view:crm.lead.report:0
@@ -1924,38 +2001,38 @@ msgstr ""
#. module: crm
#: field:crm.segmentation,sales_purchase_active:0
msgid "Use The Sales Purchase Rules"
-msgstr ""
+msgstr "Gebruik de aankoop/verkoopregels"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead2opportunity_partner
msgid "Lead To Opportunity Partner"
-msgstr ""
+msgstr "Lead naar opportuniteit / relatie"
#. module: crm
#: field:crm.lead,location_id:0 field:crm.meeting,location:0
msgid "Location"
-msgstr ""
+msgstr "Locatie"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead2opportunity_partner_mass
msgid "Mass Lead To Opportunity Partner"
-msgstr ""
+msgstr "Vele leads naar opportuniteit / relatie"
#. module: crm
#: view:crm.lead:0
msgid "Reply"
-msgstr ""
+msgstr "Beantwoorden"
#. module: crm
#: model:process.node,note:crm.process_node_meeting0
msgid "Schedule a normal or phone meeting"
-msgstr ""
+msgstr "Plan een gewone of een telefonische vergadering"
#. module: crm
#: code:addons/crm/crm.py:430
#, python-format
msgid "Error !"
-msgstr ""
+msgstr "Fout"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_meeting_categ_action
@@ -1963,48 +2040,51 @@ msgid ""
"Create different meeting categories to better organize and classify your "
"meetings."
msgstr ""
+"Maak verschillende vergadercategorieën om uw vergaderingen beter te "
+"organiseren."
#. module: crm
#: model:ir.model,name:crm.model_crm_segmentation_line
msgid "Segmentation line"
-msgstr ""
+msgstr "Segmenteringslijn"
#. module: crm
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2phonecall:0
msgid "Planned Date"
-msgstr ""
+msgstr "Geplande datum"
#. module: crm
#: field:crm.meeting,base_calendar_url:0
msgid "Caldav URL"
-msgstr ""
+msgstr "Caldav-url"
#. module: crm
#: view:crm.lead:0
msgid "Expected Revenues"
-msgstr ""
+msgstr "Verwachte opbrengst"
#. module: crm
#: field:crm.lead,contact_name:0
msgid "Contact Name"
-msgstr ""
+msgstr "Naam contactpersoon"
#. module: crm
#: view:crm.lead:0
msgid "Leads creating during last 7 days"
-msgstr ""
+msgstr "Leads van de afgelopen 7 dagen"
#. module: crm
#: view:crm.phonecall2partner:0
msgid "Are you sure you want to create a partner based on this Phonecall ?"
msgstr ""
+"Bent u zeker dat u een relatie wilt maken op basis van dit telefoongesprek?"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "July"
-msgstr ""
+msgstr "Juli"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_section_act
@@ -2015,72 +2095,77 @@ msgid ""
"The opportunities and sales order displayed, will automatically be filtered "
"according to his team."
msgstr ""
+"Definieer een verkoopteam als u uw verkopers of afdelingen in afzonderlijke "
+"teams wilt onderbrengen. Elk team werkt op eigen opportuniteiten, "
+"verkooporders, enz. Elke gebruiker kan een standaardteam instellen via zijn "
+"voorkeuren. De getoonde opportuniteiten en verkooporders zijn automatisch "
+"diegene van dat team."
#. module: crm
#: view:crm.lead.report:0
msgid "Show only lead"
-msgstr ""
+msgstr "Enkel lead tonen"
#. module: crm
#: help:crm.meeting,count:0
msgid "Repeat x times"
-msgstr ""
+msgstr "x keren herhalen"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_section_act
#: model:ir.model,name:crm.model_crm_case_section
#: model:ir.ui.menu,name:crm.menu_crm_case_section_act
msgid "Sales Teams"
-msgstr ""
+msgstr "Verkoopteams"
#. module: crm
#: model:ir.model,name:crm.model_crm_lead2partner
msgid "Lead to Partner"
-msgstr ""
+msgstr "Lead naar relatie"
#. module: crm
#: view:crm.segmentation:0 field:crm.segmentation.line,segmentation_id:0
#: model:ir.actions.act_window,name:crm.crm_segmentation-act
msgid "Segmentation"
-msgstr ""
+msgstr "Segmentering"
#. module: crm
#: view:crm.lead:0
msgid "Team"
-msgstr ""
+msgstr "Team"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities which are in New state"
-msgstr ""
+msgstr "Leads/opportuniteiten in status Nieuw."
#. module: crm
#: view:crm.phonecall:0 selection:crm.phonecall,state:0
#: view:crm.phonecall.report:0 view:res.partner:0
msgid "Not Held"
-msgstr ""
+msgstr "Niet uitgevoerd"
#. module: crm
#: field:crm.lead.report,probability:0
msgid "Probability"
-msgstr ""
+msgstr "Kans"
#. module: crm
#: view:crm.lead:0
msgid "Pending Opportunities"
-msgstr ""
+msgstr "Wachtende opportuniteiten"
#. module: crm
#: code:addons/crm/crm_lead.py:491
#, python-format
msgid "Please select more than one opportunity from the list view."
-msgstr ""
+msgstr "Gelieve meer dan één opportuniteit te kiezen uit de lijst."
#. module: crm
#: view:crm.lead.report:0 field:crm.meeting,month_list:0
#: view:crm.phonecall.report:0 field:crm.phonecall.report,month:0
msgid "Month"
-msgstr ""
+msgstr "Maand"
#. module: crm
#: view:crm.lead:0
@@ -2088,7 +2173,7 @@ msgstr ""
#: model:ir.ui.menu,name:crm.menu_crm_case_categ0_act_leads
#: model:process.node,name:crm.process_node_leads0
msgid "Leads"
-msgstr ""
+msgstr "Leads"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_category_act_leads_all
@@ -2103,6 +2188,15 @@ msgid ""
"email gateway: new emails may create leads, each of them automatically gets "
"the history of the conversation with the prospect."
msgstr ""
+"Met leads kunt u initiële contacten met een prospect of relatie bijhouden "
+"die interesse heeft in uw producten of diensten. Een lead is doorgaans de "
+"eerste stap in uw verkoopcyclus. Na kwalificatie kan van de lead een "
+"opportuniteit worden gemaakt. Ook de relatie kan worden gemaakt voor verdere "
+"opvolging van activiteiten. U kunt een prospectendatabase importeren, uw "
+"visitekaartjes bijhouden of het contactformulier op uw website integreren "
+"met de leads in OpenERP. Leads kunnen ook worden gekoppeld aan de "
+"mailgateway: nieuwe e-mails kunnen een nieuwe lead maken en de historiek van "
+"de communicatie met de prospect wordt bijgehouden."
#. module: crm
#: selection:crm.lead2opportunity.partner,action:0
@@ -2110,18 +2204,18 @@ msgstr ""
#: selection:crm.lead2partner,action:0
#: selection:crm.phonecall2partner,action:0
msgid "Create a new partner"
-msgstr ""
+msgstr "Relatie maken"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_outgoing0
#: model:ir.ui.menu,name:crm.menu_crm_case_phone_outbound
msgid "Scheduled Calls"
-msgstr ""
+msgstr "Geplande gesprekken"
#. module: crm
#: view:crm.meeting:0 view:res.partner:0
msgid "Start Date"
-msgstr ""
+msgstr "Begindatum"
#. module: crm
#: view:crm.phonecall:0
@@ -2131,39 +2225,42 @@ msgstr ""
#. module: crm
#: view:crm.meeting:0
msgid "Decline"
-msgstr ""
+msgstr "Afwijzen"
#. module: crm
#: field:crm.lead,user_email:0
msgid "User Email"
-msgstr ""
+msgstr "E-mail gebruiker"
#. module: crm
#: help:crm.lead,optin:0
msgid "If opt-in is checked, this contact has accepted to receive emails."
msgstr ""
+"Als Inschrijven is ingeschakeld, wil deze contactpersoon e-mails ontvangen."
#. module: crm
#: view:crm.meeting:0
msgid "Reset to Unconfirmed"
-msgstr ""
+msgstr "Terug naar onbevestigd"
#. module: crm
#: field:crm.opportunity2phonecall,note:0 field:crm.phonecall2phonecall,note:0
msgid "Note"
-msgstr ""
+msgstr "Opmerking"
#. module: crm
#: constraint:res.users:0
msgid "The chosen company is not in the allowed companies for this user"
msgstr ""
+"De gekozen firma behoort niet tot de toegelaten bedrijven voor deze "
+"gebruiker."
#. module: crm
#: selection:crm.lead,priority:0 selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
#: selection:crm.phonecall.report,priority:0
msgid "Low"
-msgstr ""
+msgstr "Laag"
#. module: crm
#: selection:crm.add.note,state:0 field:crm.lead,date_closed:0
@@ -2171,22 +2268,22 @@ msgstr ""
#: selection:crm.lead.report,state:0 field:crm.meeting,date_closed:0
#: field:crm.phonecall,date_closed:0
msgid "Closed"
-msgstr ""
+msgstr "Gesloten"
#. module: crm
#: view:crm.lead:0
msgid "Total of Planned Revenue"
-msgstr ""
+msgstr "Totaal geplande opbrengst"
#. module: crm
#: view:crm.lead:0
msgid "Open Opportunities"
-msgstr ""
+msgstr "Openstaande opportuniteiten"
#. module: crm
#: model:crm.case.categ,name:crm.categ_meet2
msgid "Internal Meeting"
-msgstr ""
+msgstr "Interne vergadering"
#. module: crm
#: code:addons/crm/crm.py:454 selection:crm.add.note,state:0 view:crm.lead:0
@@ -2194,12 +2291,12 @@ msgstr ""
#: selection:crm.lead.report,state:0 selection:crm.phonecall.report,state:0
#, python-format
msgid "Pending"
-msgstr ""
+msgstr "Wachtend"
#. module: crm
#: model:crm.case.categ,name:crm.categ_meet1
msgid "Customer Meeting"
-msgstr ""
+msgstr "Vergadering met klant"
#. module: crm
#: field:crm.lead,email_cc:0
@@ -2212,72 +2309,72 @@ msgstr ""
#: model:ir.ui.menu,name:crm.menu_crm_case_phone
#: model:ir.ui.menu,name:crm.menu_crm_config_phonecall view:res.partner:0
msgid "Phone Calls"
-msgstr ""
+msgstr "Telefoongesprekken"
#. module: crm
#: view:crm.case.stage:0
msgid "Stage Search"
-msgstr ""
+msgstr "Fasen zoeken"
#. module: crm
#: help:crm.lead.report,delay_open:0 help:crm.phonecall.report,delay_open:0
msgid "Number of Days to open the case"
-msgstr ""
+msgstr "Aantal dagen tot openen van zaak"
#. module: crm
#: selection:crm.meeting,end_type:0
msgid "Number of repetitions"
-msgstr ""
+msgstr "Aantal herhalingen"
#. module: crm
#: field:crm.lead,phone:0 field:crm.opportunity2phonecall,phone:0
#: field:crm.phonecall,partner_phone:0 field:crm.phonecall2phonecall,phone:0
msgid "Phone"
-msgstr ""
+msgstr "Tel."
#. module: crm
#: field:crm.case.channel,active:0 field:crm.case.section,active:0
#: field:crm.lead,active:0 field:crm.meeting,active:0
#: field:crm.phonecall,active:0
msgid "Active"
-msgstr ""
+msgstr "Actief"
#. module: crm
#: code:addons/crm/crm_lead.py:856
#, python-format
msgid "The stage of opportunity '%s' has been changed to '%s'."
-msgstr ""
+msgstr "De fase van opportuniteit '%s' is gewijzigd in '%s'."
#. module: crm
#: selection:crm.segmentation.line,operator:0
msgid "Mandatory Expression"
-msgstr ""
+msgstr "Verplichte expressie"
#. module: crm
#: selection:crm.segmentation.line,expr_operator:0
msgid ">"
-msgstr ""
+msgstr ">"
#. module: crm
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2phonecall:0
msgid "Schedule Call"
-msgstr ""
+msgstr "Een gesprek plannen"
#. module: crm
#: view:crm.meeting:0
msgid "Uncertain"
-msgstr ""
+msgstr "Onzeker"
#. module: crm
#: help:crm.case.stage,sequence:0
msgid "Used to order stages."
-msgstr ""
+msgstr "Dient om fasen te rangschikken."
#. module: crm
#: code:addons/crm/crm_lead.py:276
#, python-format
msgid "The opportunity '%s' has been opened."
-msgstr ""
+msgstr "Opportuniteit '%s' is geopend."
#. module: crm
#: field:crm.lead2opportunity.partner,action:0
@@ -2285,44 +2382,44 @@ msgstr ""
#: field:crm.lead2partner,action:0 field:crm.opportunity2phonecall,action:0
#: field:crm.phonecall2partner,action:0 field:crm.phonecall2phonecall,action:0
msgid "Action"
-msgstr ""
+msgstr "Actie"
#. module: crm
#: field:crm.segmentation,som_interval_decrease:0
msgid "Decrease (0>1)"
-msgstr ""
+msgstr "Verlagen (0>1)"
#. module: crm
#: field:crm.lead.report,deadline_day:0
msgid "Exp. Closing Day"
-msgstr ""
+msgstr "Verw. sluiting"
#. module: crm
#: field:crm.case.section,change_responsible:0
msgid "Reassign Escalated"
-msgstr ""
+msgstr "Geëscaleerd opnieuw toewijzen"
#. module: crm
#: selection:crm.meeting,rrule_type:0
msgid "Weekly"
-msgstr ""
+msgstr "Wekelijks"
#. module: crm
#: view:crm.lead.report:0
#: model:ir.actions.act_window,name:crm.action_report_crm_opportunity
#: model:ir.ui.menu,name:crm.menu_report_crm_opportunities_tree
msgid "Opportunities Analysis"
-msgstr ""
+msgstr "Opportuniteitenanalyse"
#. module: crm
#: view:crm.lead:0
msgid "Misc"
-msgstr ""
+msgstr "Diversen"
#. module: crm
#: model:ir.actions.act_window,name:crm.open_board_crm
msgid "Sales"
-msgstr ""
+msgstr "Verkoop"
#. module: crm
#: code:addons/crm/crm.py:430
@@ -2331,58 +2428,60 @@ msgid ""
"You can not escalate, you are already at the top level regarding your sales-"
"team category."
msgstr ""
+"U kunt niet escaleren; u heeft het hoogste niveau in de verkoopteams al "
+"bereikt."
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor8 view:crm.meeting:0
msgid "Other"
-msgstr ""
+msgstr "Andere"
#. module: crm
#: view:crm.meeting:0 selection:crm.meeting,state:0
msgid "Done"
-msgstr ""
+msgstr "Gereed"
#. module: crm
#: help:crm.meeting,interval:0
msgid "Repeat every (Days/Week/Month/Year)"
-msgstr ""
+msgstr "Herhaal elk(e) (Dag/Week/Maand/Jaar)"
#. module: crm
#: field:crm.segmentation,som_interval_max:0
msgid "Max Interval"
-msgstr ""
+msgstr "Max. interval"
#. module: crm
#: code:addons/crm/crm.py:396 view:crm.lead:0 view:crm.lead.report:0
#: selection:crm.lead.report,state:0 view:res.partner:0
#, python-format
msgid "Open"
-msgstr ""
+msgstr "Open"
#. module: crm
#: field:crm.lead,city:0
msgid "City"
-msgstr ""
+msgstr "Plaats"
#. module: crm
#: view:crm.lead:0 view:res.partner:0
msgid "History"
-msgstr ""
+msgstr "Historiek"
#. module: crm
#: selection:crm.meeting,show_as:0
msgid "Busy"
-msgstr ""
+msgstr "Bezet"
#. module: crm
#: field:crm.lead.report,creation_day:0
msgid "Creation Day"
-msgstr ""
+msgstr "Creatiedatum"
#. module: crm
#: field:crm.meeting,interval:0
msgid "Repeat every"
-msgstr ""
+msgstr "Herhalen elke"
#. module: crm
#: field:crm.meeting,recurrency:0
@@ -2392,27 +2491,27 @@ msgstr ""
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone calls made in last month"
-msgstr ""
+msgstr "Telefoongesprekken van de afgelopen maand"
#. module: crm
#: model:ir.actions.act_window,name:crm.act_my_oppor
msgid "My Open Opportunities"
-msgstr ""
+msgstr "Mijn openstaande opportuniteiten"
#. module: crm
#: field:base.action.rule,trg_max_history:0
msgid "Maximum Communication History"
-msgstr ""
+msgstr "Maximale communicatiehistoriek"
#. module: crm
#: view:crm.meeting:0
msgid "Invite People"
-msgstr ""
+msgstr "Mensen uitnodigen"
#. module: crm
#: view:crm.meeting:0 field:crm.meeting,categ_id:0
msgid "Meeting Type"
-msgstr ""
+msgstr "Vergadertype"
#. module: crm
#: help:crm.lead,state:0
@@ -2425,16 +2524,23 @@ msgid ""
" \n"
"If the case needs to be reviewed then the state is set to 'Pending'."
msgstr ""
+"De status wordt op 'Nieuw' gezet als er een zaak wordt gemaakt. "
+" \n"
+"Als de zaak lopende is, wordt de status op 'Open' gezet. "
+" \n"
+"Als de zaak klaar is, wordt de status op 'Gereed' gezet. "
+" \n"
+"Als de zaak moet worden herbekeken, gaat de status naar 'Wachtend'."
#. module: crm
#: view:crm.meeting:0 view:res.partner:0
msgid "End Date"
-msgstr ""
+msgstr "Einddatum"
#. module: crm
#: selection:crm.meeting,byday:0
msgid "Third"
-msgstr ""
+msgstr "Derde"
#. module: crm
#: help:crm.segmentation,som_interval_max:0
@@ -2442,47 +2548,49 @@ msgid ""
"The computation is made on all events that occured during this interval, the "
"past X periods."
msgstr ""
+"De berekening wordt uitgevoerd voor alle gebeurtenissen tijdens dit "
+"interval, de afgelopen X perioden."
#. module: crm
#: view:crm.lead:0
msgid "Unassigned Opportunities"
-msgstr ""
+msgstr "Niet-toegewezen opportuniteiten"
#. module: crm
#: view:crm.lead.report:0
msgid "# of Emails"
-msgstr ""
+msgstr "# e-mails"
#. module: crm
#: view:crm.lead:0
msgid "Search Leads"
-msgstr ""
+msgstr "Leads zoeken"
#. module: crm
#: view:crm.lead.report:0 view:crm.phonecall.report:0
#: field:crm.phonecall.report,delay_open:0
msgid "Delay to open"
-msgstr ""
+msgstr "Dagen tot openen"
#. module: crm
#: view:crm.meeting:0
msgid "Recurrency period"
-msgstr ""
+msgstr "Recurrentieperiode"
#. module: crm
#: field:crm.meeting,week_list:0
msgid "Weekday"
-msgstr ""
+msgstr "Weekdag"
#. module: crm
#: view:crm.lead:0
msgid "Referrer"
-msgstr ""
+msgstr "Doorverwijzer"
#. module: crm
#: field:crm.lead,id:0 field:crm.meeting,id:0 field:crm.phonecall,id:0
msgid "ID"
-msgstr ""
+msgstr "ID"
#. module: crm
#: help:crm.lead,type_id:0
@@ -2490,235 +2598,237 @@ msgid ""
"From which campaign (seminar, marketing campaign, mass mailing, ...) did "
"this contact come from?"
msgstr ""
+"Van welke campagne (seminarie, marketingcampagne, mailing, ...) komt deze "
+"contactpersoon?"
#. module: crm
#: model:ir.model,name:crm.model_calendar_attendee
msgid "Attendee information"
-msgstr ""
+msgstr "Info over aanwezigen"
#. module: crm
#: view:crm.segmentation:0
msgid "Segmentation Test"
-msgstr ""
+msgstr "Segmenteringstest"
#. module: crm
#: field:crm.lead,user_login:0
msgid "User Login"
-msgstr ""
+msgstr "Aanmeldgegevens"
#. module: crm
#: view:crm.segmentation:0
msgid "Continue Process"
-msgstr ""
+msgstr "Verder verwerken"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities created in current year"
-msgstr ""
+msgstr "Leads/opportuniteiten van dit jaar"
#. module: crm
#: model:ir.model,name:crm.model_crm_phonecall2partner
msgid "Phonecall to Partner"
-msgstr ""
+msgstr "Telefoontje naar relatie"
#. module: crm
#: field:crm.opportunity2phonecall,user_id:0
#: field:crm.phonecall2phonecall,user_id:0
msgid "Assign To"
-msgstr ""
+msgstr "Toegewezen aan"
#. module: crm
#: field:crm.add.note,state:0
msgid "Set New State To"
-msgstr ""
+msgstr "Zet nieuwe status op"
#. module: crm
#: field:crm.lead,date_action_last:0 field:crm.meeting,date_action_last:0
#: field:crm.phonecall,date_action_last:0
msgid "Last Action"
-msgstr ""
+msgstr "Laatste actie"
#. module: crm
#: field:crm.meeting,duration:0 field:crm.phonecall,duration:0
#: field:crm.phonecall.report,duration:0
msgid "Duration"
-msgstr ""
+msgstr "Duur"
#. module: crm
#: view:crm.lead:0
msgid "Show countries"
-msgstr ""
+msgstr "Landen tonen"
#. module: crm
#: view:crm.lead2opportunity.partner.mass:0
msgid "Select Salesman"
-msgstr ""
+msgstr "Verkoper kiezen"
#. module: crm
#: view:board.board:0
msgid "Sales Dashboard"
-msgstr ""
+msgstr "Verkoopdashboard"
#. module: crm
#: field:crm.lead.report,nbr:0 field:crm.phonecall.report,nbr:0
msgid "# of Cases"
-msgstr ""
+msgstr "# zaken"
#. module: crm
#: help:crm.meeting,section_id:0 help:crm.phonecall,section_id:0
msgid "Sales team to which Case belongs to."
-msgstr ""
+msgstr "Verkoopteam aan wie de zaak toebehoort"
#. module: crm
#: selection:crm.meeting,week_list:0
msgid "Sunday"
-msgstr ""
+msgstr "Zondag"
#. module: crm
#: selection:crm.meeting,byday:0
msgid "Fourth"
-msgstr ""
+msgstr "Vierde"
#. module: crm
#: selection:crm.add.note,state:0
msgid "Unchanged"
-msgstr ""
+msgstr "Ongewijzigd"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_segmentation_tree-act
#: model:ir.ui.menu,name:crm.menu_crm_segmentation-act
msgid "Partners Segmentation"
-msgstr ""
+msgstr "Relatiesegmentering"
#. module: crm
#: field:crm.lead,fax:0
msgid "Fax"
-msgstr ""
+msgstr "Fax"
#. module: crm
#: view:crm.lead.report:0
msgid "Leads/Opportunities created in current month"
-msgstr ""
+msgstr "Leads/opportuniteiten van deze maand"
#. module: crm
#: view:crm.meeting:0
msgid "Assignment"
-msgstr ""
+msgstr "Toewijzing"
#. module: crm
#: field:crm.lead,company_id:0 view:crm.lead.report:0
#: field:crm.lead.report,company_id:0 field:crm.phonecall,company_id:0
#: view:crm.phonecall.report:0 field:crm.phonecall.report,company_id:0
msgid "Company"
-msgstr ""
+msgstr "Bedrijf"
#. module: crm
#: selection:crm.meeting,week_list:0
msgid "Friday"
-msgstr ""
+msgstr "Vrijdag"
#. module: crm
#: field:crm.meeting,allday:0
msgid "All Day"
-msgstr ""
+msgstr "Alle dagen"
#. module: crm
#: field:crm.segmentation.line,operator:0
msgid "Mandatory / Optional"
-msgstr ""
+msgstr "Verplicht / optie"
#. module: crm
#: view:crm.lead:0
msgid "Unassigned Leads"
-msgstr ""
+msgstr "Niet-toegewezen leads"
#. module: crm
#: field:crm.lead,subjects:0
msgid "Subject of Email"
-msgstr ""
+msgstr "Onderwerp van mail"
#. module: crm
#: model:ir.actions.act_window,name:crm.action_view_attendee_form
#: model:ir.ui.menu,name:crm.menu_attendee_invitations
msgid "Meeting Invitations"
-msgstr ""
+msgstr "Uitnodigingen"
#. module: crm
#: view:crm.phonecall:0 selection:crm.phonecall,state:0
#: view:crm.phonecall.report:0 selection:crm.phonecall.report,state:0
#: view:res.partner:0
msgid "Todo"
-msgstr ""
+msgstr "Uit te voeren"
#. module: crm
#: field:crm.case.categ,object_id:0
msgid "Object Name"
-msgstr ""
+msgstr "Objectnaam"
#. module: crm
#: help:crm.lead,email_from:0
msgid "E-mail address of the contact"
-msgstr ""
+msgstr "E-mailadres van de contactpersoon"
#. module: crm
#: field:crm.lead,referred:0
msgid "Referred by"
-msgstr ""
+msgstr "Doorverwijzer"
#. module: crm
#: view:crm.lead:0 model:ir.model,name:crm.model_crm_add_note
msgid "Add Internal Note"
-msgstr ""
+msgstr "Interne notitie toevoegen"
#. module: crm
#: code:addons/crm/crm_lead.py:853
#, python-format
msgid "The stage of lead '%s' has been changed to '%s'."
-msgstr ""
+msgstr "De fase van lead '%s' is gewijzigd in '%s'."
#. module: crm
#: selection:crm.meeting,byday:0
msgid "Last"
-msgstr ""
+msgstr "Laatste"
#. module: crm
#: field:crm.lead,message_ids:0 field:crm.meeting,message_ids:0
#: field:crm.phonecall,message_ids:0
msgid "Messages"
-msgstr ""
+msgstr "Berichten"
#. module: crm
#: help:crm.lead,channel_id:0
msgid "Communication channel (mail, direct, phone, ...)"
-msgstr ""
+msgstr "Communicatiekanaal (mail, direct, telefoon, ...)"
#. module: crm
#: code:addons/crm/crm_action_rule.py:61
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "Fout"
#. module: crm
#: field:crm.opportunity2phonecall,name:0 field:crm.phonecall2phonecall,name:0
msgid "Call summary"
-msgstr ""
+msgstr "Samenvatting gesprek"
#. module: crm
#: selection:crm.add.note,state:0 selection:crm.lead,state:0
#: selection:crm.lead.report,state:0 selection:crm.meeting,state:0
#: selection:crm.phonecall,state:0 selection:crm.phonecall.report,state:0
msgid "Cancelled"
-msgstr ""
+msgstr "Geannuleerd"
#. module: crm
#: field:crm.add.note,body:0
msgid "Note Body"
-msgstr ""
+msgstr "Midden notitie"
#. module: crm
#: view:board.board:0
msgid "My Planned Revenues by Stage"
-msgstr ""
+msgstr "Mijn geplande opbrengsten per fase"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_category_act_oppor11
@@ -2735,16 +2845,26 @@ msgid ""
"opportunities, convert them into quotations, manage related documents, track "
"all customer related activities, and much more."
msgstr ""
+"Via opportuniteiten kunt u uw verkooppijplijn opvolgen aan de hand van klant-"
+" of prospectgerelateerde verkoopdocumenten. Informatie zoals verwachte "
+"opbrengst, fase, verwachte sluitingsdatum, communicatiehistoriek, enz. kan "
+"worden bijgehouden. Opportuniteiten kunnen worden gekoppeld aan de "
+"mailgateway: maak van nieuwe mails een opportuniteit en bewaar de "
+"communicatiehistoriek.\n"
+"\n"
+"U en uw team kunnen vergadering en telefoongesprekken plannen voor "
+"opportuniteiten. Maak van een opportuniteit een offerte, volg de documenten "
+"en alle klantenactiviteiten op, en nog veel meer."
#. module: crm
#: field:crm.lead,color:0
msgid "Color Index"
-msgstr ""
+msgstr "Kleurindex"
#. module: crm
#: view:crm.lead:0
msgid "Links"
-msgstr ""
+msgstr "Koppelingen"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_lead_categ_action
@@ -2754,6 +2874,10 @@ msgid ""
"instance reflect your product structure or the different types of sales you "
"do."
msgstr ""
+"Maak specifieke categorieën volgens uw activiteiten, zodat u leads en "
+"opportuniteiten beter kunt organiseren en analyseren. Die categorieën kunnen "
+"bijvoorbeeld uw productenstructuur weergeven of de verschillende types "
+"verkoop."
#. module: crm
#: help:crm.segmentation,som_interval_decrease:0
@@ -2761,6 +2885,8 @@ msgid ""
"If the partner has not purchased (or bought) during a period, decrease the "
"state of mind by this factor. It's a multiplication"
msgstr ""
+"Als de relatie niets heeft gekocht gedurende een bepaalde periode, kunt u "
+"het humeur veranderen. Het gaat om een vermenigvuldiging."
#. module: crm
#: model:ir.actions.act_window,help:crm.action_report_crm_phonecall
@@ -2770,21 +2896,25 @@ msgid ""
"several criteria and drill down the information, by adding more groups in "
"the report."
msgstr ""
+"Hiermee analyseert u de prestaties van uw verkoopteam volgens hun "
+"telefoongespreken. U kunt de informatie groeperen of filteren volgens "
+"diverse criteria en verder zoeken in de infrmatie door meer groepen toe te "
+"voegen."
#. module: crm
#: view:crm.lead.report:0
msgid "# Mails"
-msgstr ""
+msgstr "# E-mails"
#. module: crm
#: field:crm.phonecall,name:0 view:res.partner:0
msgid "Call Summary"
-msgstr ""
+msgstr "Samenvatting gesprek"
#. module: crm
#: view:crm.lead:0
msgid "Todays' Leads"
-msgstr ""
+msgstr "Leads van de dag"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_outgoing0
@@ -2795,86 +2925,91 @@ msgid ""
"customer. You can also import a .CSV file with a list of calls to be done by "
"your sales team."
msgstr ""
+"In Geplande gesprekken vindt u alle telefoontjes die uw verkoopteam moet "
+"uitvoeren. Een verkoper kan info over het gesprek noteren in het formulier. "
+"Deze info is ook toegankelijk via de relatiefiche, zodat elk contact kan "
+"worden bijgehouden. U kunt ook een csv-bestand importeren met een lijst van "
+"uit te voeren telefoongesprekken."
#. module: crm
#: field:crm.segmentation.line,expr_operator:0
msgid "Operator"
-msgstr ""
+msgstr "Operator"
#. module: crm
#: model:ir.model,name:crm.model_crm_phonecall2phonecall
msgid "Phonecall To Phonecall"
-msgstr ""
+msgstr "Gesprek naar gesprek"
#. module: crm
#: view:crm.lead:0
#: model:ir.actions.act_window,name:crm.opportunity2phonecall_act
msgid "Schedule/Log Call"
-msgstr ""
+msgstr "Een gesprek plannen/noteren"
#. module: crm
#: selection:crm.meeting,state:0
msgid "Confirmed"
-msgstr ""
+msgstr "Bevestigd"
#. module: crm
#: model:ir.actions.act_window,name:crm.act_oppor_stage_user
msgid "Planned Revenue By User and Stage"
-msgstr ""
+msgstr "Geplande opbrengst per gebruiker en fase"
#. module: crm
#: view:crm.meeting:0
msgid "Confirm"
-msgstr ""
+msgstr "Bevestigen"
#. module: crm
#: field:crm.meeting,su:0
msgid "Sun"
-msgstr ""
+msgstr "Zon"
#. module: crm
#: field:crm.phonecall.report,section_id:0
msgid "Section"
-msgstr ""
+msgstr "Sectie"
#. module: crm
#: selection:crm.segmentation.line,operator:0
msgid "Optional Expression"
-msgstr ""
+msgstr "Optionele expressie"
#. module: crm
#: selection:crm.meeting,select1:0
msgid "Day of month"
-msgstr ""
+msgstr "Dag van de maand"
#. module: crm
#: model:ir.actions.act_window,name:crm.act_my_oppor_stage
msgid "Planned Revenue By Stage"
-msgstr ""
+msgstr "Geplande opbrengst per fase"
#. module: crm
#: selection:crm.add.note,state:0 model:crm.case.stage,name:crm.stage_lead1
#: view:crm.lead:0 selection:crm.lead,state:0 view:crm.lead.report:0
msgid "New"
-msgstr ""
+msgstr "Nieuw"
#. module: crm
#: view:crm.lead:0 field:crm.lead,email_from:0 field:crm.meeting,email_from:0
#: field:crm.phonecall,email_from:0
msgid "Email"
-msgstr ""
+msgstr "E-mail"
#. module: crm
#: view:crm.case.channel:0 view:crm.lead:0 field:crm.lead,channel_id:0
#: view:crm.lead.report:0 field:crm.lead.report,channel_id:0
msgid "Channel"
-msgstr ""
+msgstr "Kanaal"
#. module: crm
#: view:crm.lead:0 view:crm.lead.report:0 view:crm.meeting:0
#: view:crm.phonecall:0 view:crm.phonecall.report:0
msgid "My Sales Team(s)"
-msgstr ""
+msgstr "Mijn verkoopteam(s)"
#. module: crm
#: help:crm.segmentation,exclusif:0
@@ -2884,119 +3019,123 @@ msgid ""
"If checked, remove the category from partners that doesn't match "
"segmentation criterions"
msgstr ""
+"Schakel in als de categorie beperkt is tot relaties die voldoen aan de "
+"segmenteringsregels.\n"
+"Als dit is ingeschakeld, wordt de categorie verwijderd van relaties die niet "
+"voldoen aan de segmenteringscriteria."
#. module: crm
#: field:crm.meeting,exdate:0
msgid "Exception Date/Times"
-msgstr ""
+msgstr "Uitzonderingsdata/tijden"
#. module: crm
#: help:crm.meeting,date_deadline:0
msgid ""
"Deadline Date is automatically computed from Start "
"Date + Duration"
-msgstr ""
+msgstr "Deadline wordt automatisch berekend volgens Begindatum + Duur"
#. module: crm
#: field:crm.lead,state_id:0
msgid "Fed. State"
-msgstr ""
+msgstr "Staat/Provincie"
#. module: crm
#: model:process.transition,note:crm.process_transition_leadopportunity0
msgid "Creating business opportunities from Leads"
-msgstr ""
+msgstr "Opportuniteiten maken van leads"
#. module: crm
#: model:ir.actions.act_window,name:crm.open_board_statistical_dash
#: model:ir.ui.menu,name:crm.menu_board_statistics_dash
msgid "CRM Dashboard"
-msgstr ""
+msgstr "CRM-dashboard"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor4
msgid "Need Information"
-msgstr ""
+msgstr "Heeft informatie nodig"
#. module: crm
#: model:process.transition,name:crm.process_transition_leadopportunity0
msgid "Prospect Opportunity"
-msgstr ""
+msgstr "Opportuniteit"
#. module: crm
#: field:base.action.rule,act_categ_id:0
msgid "Set Category to"
-msgstr ""
+msgstr "Categorie instellen op"
#. module: crm
#: view:crm.meeting:0
msgid "Mail To"
-msgstr ""
+msgstr "Mail naar"
#. module: crm
#: field:crm.meeting,th:0
msgid "Thu"
-msgstr ""
+msgstr "Don"
#. module: crm
#: view:crm.add.note:0 view:crm.merge.opportunity:0
#: view:crm.opportunity2phonecall:0 view:crm.phonecall2opportunity:0
#: view:crm.phonecall2phonecall:0
msgid "_Cancel"
-msgstr ""
+msgstr "_Annuleren"
#. module: crm
#: selection:crm.meeting,rrule_type:0
msgid "Daily"
-msgstr ""
+msgstr "Dagelijks"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_stage_form_installer
msgid "Review Sales Stages"
-msgstr ""
+msgstr "Verkoopfasen bekijken"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead2
msgid "Qualification"
-msgstr ""
+msgstr "Kwalificatie"
#. module: crm
#: field:crm.lead,partner_address_email:0
msgid "Partner Contact Email"
-msgstr ""
+msgstr "E-mail contactpersoon relatie"
#. module: crm
#: code:addons/crm/wizard/crm_lead_to_partner.py:48
#, python-format
msgid "A partner is already defined."
-msgstr ""
+msgstr "De relatie bestaat al."
#. module: crm
#: selection:crm.meeting,byday:0
msgid "First"
-msgstr ""
+msgstr "Eerste"
#. module: crm
#: field:crm.lead.report,deadline_month:0
msgid "Exp. Closing Month"
-msgstr ""
+msgstr "Verw. sluitingsmaand"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "December"
-msgstr ""
+msgstr "December"
#. module: crm
#: view:base.action.rule:0
msgid "Condition on Communication History"
-msgstr ""
+msgstr "Voorwaarde op communicatiehistoriek"
#. module: crm
#: view:crm.phonecall:0
msgid "Date of Call"
-msgstr ""
+msgstr "Datum van gesprek"
#. module: crm
#: help:crm.segmentation,som_interval:0
@@ -3009,87 +3148,94 @@ msgid ""
"bought goods to another supplier. \n"
"Use this functionality for recurring businesses."
msgstr ""
+"Een periode is het gemiddelde aantal dagen tussen twee aankoop- of "
+"verkoopcycli voor deze segmentering. \n"
+"Het wordt doorgaans gebruikt om na te gaan of een relatie al lange tijd niks "
+"meer heeft gekocht of verkocht, waarbij we ervan uitgaan dat zijn humeur "
+"is gedaald omdat hij wellicht goederen bij een andere leverancier heeft "
+"gekocht. \n"
+"Gebruik deze functionaliteit voor terugkerende zaken."
#. module: crm
#: field:crm.meeting,vtimezone:0
msgid "Timezone"
-msgstr ""
+msgstr "Tijdzone"
#. module: crm
#: field:crm.meeting,sa:0
msgid "Sat"
-msgstr ""
+msgstr "Zat"
#. module: crm
#: view:crm.lead:0 field:crm.lead,user_id:0 view:crm.lead.report:0
#: view:crm.phonecall.report:0
msgid "Salesman"
-msgstr ""
+msgstr "Verkoper"
#. module: crm
#: view:crm.lead:0 field:crm.lead,date_deadline:0
msgid "Expected Closing"
-msgstr ""
+msgstr "Verwachte afsluitdatum"
#. module: crm
#: model:ir.model,name:crm.model_crm_opportunity2phonecall
msgid "Opportunity to Phonecall"
-msgstr ""
+msgstr "Opportuniteit naar telefoongesprek"
#. module: crm
#: help:crm.case.section,allow_unlink:0
msgid "Allows to delete non draft cases"
-msgstr ""
+msgstr "Hiermee kunt u zaken niet in status Nieuw verwijderen"
#. module: crm
#: field:crm.meeting,count:0
msgid "Repeat"
-msgstr ""
+msgstr "Herhalen"
#. module: crm
#: field:crm.lead.report,deadline_year:0
msgid "Ex. Closing Year"
-msgstr ""
+msgstr "Verw. sluitingsjaar"
#. module: crm
#: view:crm.lead:0
msgid "Partner Name"
-msgstr ""
+msgstr "Relatienaam"
#. module: crm
#: model:crm.case.categ,name:crm.categ_phone2
msgid "Outbound"
-msgstr ""
+msgstr "Uitgaand"
#. module: crm
#: field:crm.lead,date_open:0 field:crm.phonecall,date_open:0
msgid "Opened"
-msgstr ""
+msgstr "Geopend"
#. module: crm
#: view:crm.case.section:0 field:crm.case.section,member_ids:0
msgid "Team Members"
-msgstr ""
+msgstr "Teamleden"
#. module: crm
#: view:crm.lead:0 view:crm.meeting:0 view:crm.phonecall:0
msgid "Contacts"
-msgstr ""
+msgstr "Contactpersonen"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor1
msgid "Interest in Computer"
-msgstr ""
+msgstr "Interesse in computers"
#. module: crm
#: view:crm.meeting:0
msgid "Invitation Detail"
-msgstr ""
+msgstr "Details uitnodiging"
#. module: crm
#: field:crm.segmentation,som_interval_default:0
msgid "Default (0=None)"
-msgstr ""
+msgstr "Standaard (0=Geen)"
#. module: crm
#: help:crm.lead,email_cc:0
@@ -3098,35 +3244,38 @@ msgid ""
"outbound emails for this record before being sent. Separate multiple email "
"addresses with a comma"
msgstr ""
+"Deze e-mailadressen worden toegevoegd aan het CC-veld van alle inkomende en "
+"uitgaande mails voor dit record. Verschillende adressen kunnen worden "
+"gescheiden door een komma."
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_categ_phone_incoming0
#: model:ir.ui.menu,name:crm.menu_crm_case_phone_inbound
msgid "Logged Calls"
-msgstr ""
+msgstr "Genoteerde gesprekken"
#. module: crm
#: field:crm.partner2opportunity,probability:0
#: field:crm.phonecall2opportunity,probability:0
msgid "Success Probability"
-msgstr ""
+msgstr "Succesratio"
#. module: crm
#: code:addons/crm/crm.py:466 selection:crm.lead.report,state:0
#: selection:crm.phonecall,state:0 selection:crm.phonecall.report,state:0
#, python-format
msgid "Draft"
-msgstr ""
+msgstr "Nieuw"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_case_section_act_tree
msgid "Cases by Sales Team"
-msgstr ""
+msgstr "Zaken per verkoopteam"
#. module: crm
#: field:crm.meeting,attendee_ids:0
msgid "Attendees"
-msgstr ""
+msgstr "Deelnemers"
#. module: crm
#: view:crm.meeting:0 view:crm.phonecall:0
@@ -3134,306 +3283,307 @@ msgstr ""
#: model:process.node,name:crm.process_node_meeting0
#: model:res.request.link,name:crm.request_link_meeting
msgid "Meeting"
-msgstr ""
+msgstr "Vergadering"
#. module: crm
#: model:ir.model,name:crm.model_crm_case_categ
msgid "Category of Case"
-msgstr ""
+msgstr "Zaakcategorie"
#. module: crm
#: view:crm.lead:0 view:crm.phonecall:0
msgid "7 Days"
-msgstr ""
+msgstr "7 dagen"
#. module: crm
#: view:board.board:0
msgid "Planned Revenue by Stage and User"
-msgstr ""
+msgstr "Geplande opbrengsten per fase en gebruiker"
#. module: crm
#: view:crm.lead:0
msgid "Communication & History"
-msgstr ""
+msgstr "Communicatie & historiek"
#. module: crm
#: selection:crm.lead,priority:0 selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
#: selection:crm.phonecall.report,priority:0
msgid "Normal"
-msgstr ""
+msgstr "Normaal"
#. module: crm
#: code:addons/crm/wizard/crm_lead_to_opportunity.py:104
#, python-format
msgid "Closed/Cancelled Leads can not be converted into Opportunity"
msgstr ""
+"Gesloten/geannuleerd leads kunnen niet in een opportuniteit worden omgezet"
#. module: crm
#: model:ir.actions.act_window,name:crm.crm_meeting_categ_action
#: model:ir.ui.menu,name:crm.menu_crm_case_meeting-act
msgid "Meeting Categories"
-msgstr ""
+msgstr "Vergadercategorieën"
#. module: crm
#: view:crm.phonecall2partner:0
msgid "You may have to verify that this partner does not exist already."
-msgstr ""
+msgstr "U dient wellicht na te gaan of de relatie nog niet bestaat."
#. module: crm
#: field:crm.lead.report,delay_open:0
msgid "Delay to Open"
-msgstr ""
+msgstr "Tijd tot openen"
#. module: crm
#: field:crm.lead.report,user_id:0 field:crm.phonecall.report,user_id:0
msgid "User"
-msgstr ""
+msgstr "Gebruiker"
#. module: crm
#: code:addons/crm/crm.py:446
#, python-format
msgid "The case '%s' has been cancelled."
-msgstr ""
+msgstr "Zaak '%s' is geannuleerd."
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "November"
-msgstr ""
+msgstr "November"
#. module: crm
#: view:crm.lead.report:0
#: model:ir.actions.act_window,name:crm.act_opportunity_stage
msgid "Opportunities By Stage"
-msgstr ""
+msgstr "Opportuniteiten per fase"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "January"
-msgstr ""
+msgstr "Januari"
#. module: crm
#: model:process.process,name:crm.process_process_contractprocess0
msgid "Contract"
-msgstr ""
+msgstr "Contract"
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead4
msgid "Twitter Ads"
-msgstr ""
+msgstr "Twitter Ads"
#. module: crm
#: code:addons/crm/crm_lead.py:336
#, python-format
msgid "The opportunity '%s' has been been won."
-msgstr ""
+msgstr "Opportuniteit '%s' is gewonnen."
#. module: crm
#: field:crm.case.stage,case_default:0
msgid "Common to All Teams"
-msgstr ""
+msgstr "Voor alle teams"
#. module: crm
#: code:addons/crm/crm_lead.py:831 code:addons/crm/wizard/crm_add_note.py:28
#, python-format
msgid "Error"
-msgstr ""
+msgstr "Fout"
#. module: crm
#: view:crm.lead.report:0
msgid "Planned Revenues"
-msgstr ""
+msgstr "Geplande opbrengsten"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor7
msgid "Need Consulting"
-msgstr ""
+msgstr "Heeft consulting nodig"
#. module: crm
#: constraint:crm.segmentation:0
msgid "Error ! You can not create recursive profiles."
-msgstr ""
+msgstr "U kunt niet dezelfde profielen maken."
#. module: crm
#: help:crm.lead.report,deadline_year:0
msgid "Expected closing year"
-msgstr ""
+msgstr "Verwacht afsluitjaar"
#. module: crm
#: field:crm.lead,partner_address_id:0 field:crm.meeting,partner_address_id:0
#: field:crm.phonecall,partner_address_id:0
msgid "Partner Contact"
-msgstr ""
+msgstr "Contactpersoon relatie"
#. module: crm
#: field:crm.meeting,recurrent_id:0
msgid "Recurrent ID date"
-msgstr ""
+msgstr "Datum recurrente ID"
#. module: crm
#: sql_constraint:res.users:0
msgid "You can not have two users with the same login !"
-msgstr ""
+msgstr "U kunt geen twee gebruikers met dezelfde login maken."
#. module: crm
#: code:addons/crm/crm.py:409 view:crm.lead:0 view:res.partner:0
#, python-format
msgid "Close"
-msgstr ""
+msgstr "Sluiten"
#. module: crm
#: selection:crm.opportunity2phonecall,action:0
#: selection:crm.phonecall2phonecall,action:0
msgid "Schedule a call"
-msgstr ""
+msgstr "Een gesprek plannen"
#. module: crm
#: view:crm.lead:0 view:crm.phonecall:0
msgid "Categorization"
-msgstr ""
+msgstr "Categorisering"
#. module: crm
#: view:crm.lead:0
msgid "Log Call"
-msgstr ""
+msgstr "Gesprek noteren"
#. module: crm
#: model:ir.model,name:crm.model_base_action_rule
msgid "Action Rules"
-msgstr ""
+msgstr "Actieregels"
#. module: crm
#: field:crm.meeting,rrule_type:0
msgid "Recurrency"
-msgstr ""
+msgstr "Recurrentie"
#. module: crm
#: field:crm.meeting,phonecall_id:0
msgid "Phonecall"
-msgstr ""
+msgstr "Telefoongesprek"
#. module: crm
#: selection:crm.meeting,week_list:0
msgid "Thursday"
-msgstr ""
+msgstr "Donderdag"
#. module: crm
#: view:crm.meeting:0
msgid "To"
-msgstr ""
+msgstr "Aan"
#. module: crm
#: view:crm.lead:0
msgid "Create date"
-msgstr ""
+msgstr "Creatiedatum"
#. module: crm
#: selection:crm.meeting,class:0
msgid "Private"
-msgstr ""
+msgstr "Privé"
#. module: crm
#: selection:crm.meeting,class:0
msgid "Public for Employees"
-msgstr ""
+msgstr "Openbaar voor werknemers"
#. module: crm
#: field:crm.lead,function:0
msgid "Function"
-msgstr ""
+msgstr "Functie"
#. module: crm
#: view:crm.add.note:0
msgid "_Add"
-msgstr ""
+msgstr "_Toevoegen"
#. module: crm
#: field:crm.case.section,note:0 view:crm.meeting:0
#: field:crm.meeting,description:0 view:crm.phonecall:0
#: field:crm.phonecall,description:0 field:crm.segmentation,description:0
msgid "Description"
-msgstr ""
+msgstr "Omschrijving"
#. module: crm
#: view:crm.phonecall.report:0
msgid "Phone calls made in current month"
-msgstr ""
+msgstr "Telefoongesprekken van deze maand"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "May"
-msgstr ""
+msgstr "Mei"
#. module: crm
#: model:crm.case.categ,name:crm.categ_oppor2
msgid "Interest in Accessories"
-msgstr ""
+msgstr "Interesse in accessoires"
#. module: crm
#: view:crm.lead:0
msgid "New Opportunities"
-msgstr ""
+msgstr "Nieuwe opportuniteiten"
#. module: crm
#: code:addons/crm/crm_action_rule.py:61
#, python-format
msgid "No E-Mail Found for your Company address!"
-msgstr ""
+msgstr "Geen e-mail gevonden voor uw bedrijf"
#. module: crm
#: field:crm.lead.report,email:0
msgid "# Emails"
-msgstr ""
+msgstr "# E-mails"
#. module: crm
#: field:crm.lead,street:0
msgid "Street"
-msgstr ""
+msgstr "Straat"
#. module: crm
#: view:crm.lead.report:0
msgid "Opportunities by User and Team"
-msgstr ""
+msgstr "Opportuniteiten per gebruiker en team"
#. module: crm
#: view:crm.phonecall:0
msgid "Reset to Todo"
-msgstr ""
+msgstr "Terug naar Uit te voeren"
#. module: crm
#: field:crm.case.section,working_hours:0
msgid "Working Hours"
-msgstr ""
+msgstr "Werkuren"
#. module: crm
#: field:res.partner,phonecall_ids:0
msgid "Phonecalls"
-msgstr ""
+msgstr "Telefoongesprekken"
#. module: crm
#: view:crm.lead:0 field:crm.lead,is_customer_add:0
msgid "Customer"
-msgstr ""
+msgstr "Klant"
#. module: crm
#: selection:crm.lead,priority:0 selection:crm.lead.report,priority:0
#: selection:crm.phonecall,priority:0
#: selection:crm.phonecall.report,priority:0
msgid "Lowest"
-msgstr ""
+msgstr "Laagste"
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "February"
-msgstr ""
+msgstr "Februari"
#. module: crm
#: field:base.action.rule,trg_section_id:0 field:crm.case.categ,section_id:0
@@ -3446,23 +3596,23 @@ msgstr ""
#: view:crm.phonecall.report:0 field:crm.phonecall2phonecall,section_id:0
#: field:res.partner,section_id:0 field:res.users,context_section_id:0
msgid "Sales Team"
-msgstr ""
+msgstr "Verkoopteam"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead6 view:crm.lead:0
msgid "Lost"
-msgstr ""
+msgstr "Verloren"
#. module: crm
#: view:crm.lead:0
msgid "Edit"
-msgstr ""
+msgstr "Bewerken"
#. module: crm
#: field:crm.lead,country_id:0 view:crm.lead.report:0
#: field:crm.lead.report,country_id:0
msgid "Country"
-msgstr ""
+msgstr "Land"
#. module: crm
#: view:crm.lead:0 view:crm.lead2opportunity.partner:0
@@ -3471,12 +3621,12 @@ msgstr ""
#: selection:crm.lead2opportunity.partner.mass,name:0 view:crm.phonecall:0
#: view:res.partner:0
msgid "Convert to Opportunity"
-msgstr ""
+msgstr "Omzetten naar opportuniteit"
#. module: crm
#: selection:crm.meeting,week_list:0
msgid "Wednesday"
-msgstr ""
+msgstr "Woensdag"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_categ_phone_incoming0
@@ -3486,28 +3636,32 @@ msgid ""
"partner. From the phone call form, you can trigger a request for another "
"call, a meeting or an opportunity."
msgstr ""
+"Hiermee kunt u inkomende gesprekken snel noteren. Elk gesprek komt in de "
+"relatiefiche, zodat elk contact wordt bijgehouden. Via het telefoonformulier "
+"kunt u een nieuw gesprek plannen, een vergadering beleggen of een "
+"opportuniteit maken."
#. module: crm
#: selection:crm.lead.report,creation_month:0
#: selection:crm.lead.report,deadline_month:0
#: selection:crm.meeting,month_list:0 selection:crm.phonecall.report,month:0
msgid "April"
-msgstr ""
+msgstr "April"
#. module: crm
#: field:crm.case.resource.type,name:0
msgid "Campaign Name"
-msgstr ""
+msgstr "Campagnenaam"
#. module: crm
#: view:crm.segmentation:0
msgid "Profiling"
-msgstr ""
+msgstr "Profilering"
#. module: crm
#: model:ir.model,name:crm.model_crm_phonecall_report
msgid "Phone calls by user and section"
-msgstr ""
+msgstr "Telefoongesprekken per gebruik en sectie"
#. module: crm
#: model:ir.actions.act_window,help:crm.crm_case_channel_action
@@ -3516,79 +3670,81 @@ msgid ""
"channels that will be maintained at the creation of a document in the "
"system. Some examples of channels can be: Website, Phone Call, Reseller, etc."
msgstr ""
+"Via specifieke kanalen houdt u bij waar uw leads en opportuniteiten vandaan "
+"komen. Enkele voorbeelden: website, telefoon, reseller, enz."
#. module: crm
#: selection:crm.lead2opportunity.partner,name:0
#: selection:crm.lead2opportunity.partner.mass,name:0
msgid "Merge with existing Opportunity"
-msgstr ""
+msgstr "Samenvoegen met bestaande opportuniteit"
#. module: crm
#: field:crm.meeting,select1:0
msgid "Option"
-msgstr ""
+msgstr "Optie"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead4
msgid "Negotiation"
-msgstr ""
+msgstr "Onderhandeling"
#. module: crm
#: view:crm.lead:0
msgid "Exp.Closing"
-msgstr ""
+msgstr "Verw. sluiting"
#. module: crm
#: field:crm.case.stage,sequence:0 field:crm.meeting,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Volgorde"
#. module: crm
#: model:ir.model,name:crm.model_mail_compose_message
msgid "E-mail composition wizard"
-msgstr ""
+msgstr "E-mailcompositiewizard"
#. module: crm
#: view:crm.meeting:0
msgid "Accept"
-msgstr ""
+msgstr "Accepteren"
#. module: crm
#: field:crm.segmentation.line,expr_name:0
msgid "Control Variable"
-msgstr ""
+msgstr "Controlevariabele"
#. module: crm
#: selection:crm.meeting,byday:0
msgid "Second"
-msgstr ""
+msgstr "Tweede"
#. module: crm
#: model:crm.case.stage,name:crm.stage_lead3
msgid "Proposition"
-msgstr ""
+msgstr "Voorstel"
#. module: crm
#: field:crm.lead.report,date_closed:0
#: field:crm.phonecall.report,date_closed:0
msgid "Close Date"
-msgstr ""
+msgstr "Afsluitdatum"
#. module: crm
#: view:crm.lead.report:0 view:crm.phonecall.report:0
#: field:crm.phonecall.report,name:0
msgid "Year"
-msgstr ""
+msgstr "Jaar"
#. module: crm
#: constraint:res.partner:0
msgid "Error ! You cannot create recursive associated members."
-msgstr ""
+msgstr "U kunt niet dezelfde leden maken."
#. module: crm
#: model:crm.case.resource.type,name:crm.type_lead8
msgid "Newsletter"
-msgstr ""
+msgstr "Nieuwsbrief"
#~ msgid ""
#~ "The Object name must start with x_ and not contain any special character !"
diff --git a/addons/crm/res_partner.py b/addons/crm/res_partner.py
index 55cc0c95b2c..e43534476fd 100644
--- a/addons/crm/res_partner.py
+++ b/addons/crm/res_partner.py
@@ -26,12 +26,16 @@ class res_partner(osv.osv):
_inherit = 'res.partner'
def _opportunity_meeting_count(self, cr, uid, ids, field_name, arg, context=None):
- res = {}
- for partner in self.browse(cr, uid, ids, context):
- res[partner.id] = {
- 'opportunity_count': len(partner.opportunity_ids),
- 'meeting_count': len(partner.meeting_ids),
- }
+ res = dict(map(lambda x: (x,{'opportunity_count': 0, 'meeting_count': 0}), ids))
+ # the user may not have access rights for opportunities or meetings
+ try:
+ for partner in self.browse(cr, uid, ids, context):
+ res[partner.id] = {
+ 'opportunity_count': len(partner.opportunity_ids),
+ 'meeting_count': len(partner.meeting_ids),
+ }
+ except:
+ pass
return res
_columns = {
diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml
index eae78de70a0..84a0bd4cf49 100644
--- a/addons/crm/res_partner_view.xml
+++ b/addons/crm/res_partner_view.xml
@@ -54,7 +54,7 @@
<field name="src_model">res.partner</field>
<field name="res_model">crm.meeting</field>
<field name="view_mode">calendar,tree,form,gantt</field>
- <field name="context">{'search_default_partner_ids': active_id}</field>
+ <field name="context">{'default_partner_ids': [active_id]}</field>
</record>
<!-- open opportunities related to given partner -->
diff --git a/addons/crm/test/process/action_rule.yml b/addons/crm/test/process/action_rule.yml
index 9c869009906..f76e6c250bc 100644
--- a/addons/crm/test/process/action_rule.yml
+++ b/addons/crm/test/process/action_rule.yml
@@ -7,14 +7,14 @@
new_id = self.create(cr, uid, {'name': 'New Rule', 'model_id': model_ids[0], 'trg_user_id': ref('base.user_root'), 'trg_partner_id': ref('base.res_partner_1'), 'act_user_id': ref('base.user_demo') })
self._check(cr, uid)
-
- I create new lead to check record rule.
+ I create a new lead to check the record rule.
-
!record {model: crm.lead, id: crm_lead_test_rules_id}:
name: 'Test lead rules'
partner_id: base.res_partner_1
-
- I check record rule is apply and responsible is changed.
+ I check if the record rule is applied and the responsible is changed.
-
!python {model: crm.lead}: |
lead_user = self.browse(cr, uid, ref('crm_lead_test_rules_id'))
- assert lead_user.user_id.id == ref('base.user_demo'), "Responsible of lead is not changed."
+ assert lead_user.user_id.id == ref('base.user_demo'), "Responsible of lead is not changed."
diff --git a/addons/crm/test/process/cancel_lead.yml b/addons/crm/test/process/cancel_lead.yml
index 31c159c3fdf..edaf844952a 100644
--- a/addons/crm/test/process/cancel_lead.yml
+++ b/addons/crm/test/process/cancel_lead.yml
@@ -10,7 +10,7 @@
lead = self.browse(cr, uid, ref('crm_case_1'))
assert lead.stage_id.id == ref('crm.stage_lead7'), "Stage should be 'Dead' and is %s." % (lead.stage_id.name)
assert lead.state == 'cancel', "Opportunity is not in 'cancel' state."
- assert lead.probability == 0.0, 'Opportunity probability is wrong and should be 0.0.'
+ assert lead.probability == 0.0, 'Opportunity is probably wrong and should be 0.0.'
-
I reset cancelled lead into unqualified lead.
-
diff --git a/addons/crm/test/process/communication_with_customer.yml b/addons/crm/test/process/communication_with_customer.yml
index ec11528d15a..2137616ae3e 100644
--- a/addons/crm/test/process/communication_with_customer.yml
+++ b/addons/crm/test/process/communication_with_customer.yml
@@ -1,7 +1,7 @@
-
- Customer interested in our product. so he send request by email to get more details.
+ Customer interested in our product, so he sends request by email to get more details.
-
- Mail script will be fetched him request from mail server. so I process that mail after read EML file
+ Mail script will fetch his request from mail server. Then I process that mail after read EML file.
-
!python {model: mail.thread}: |
import addons
@@ -15,27 +15,27 @@
lead_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
assert lead_ids and len(lead_ids), "Lead is not created after getting request"
lead = self.browse(cr, uid, lead_ids[0], context=context)
- assert not lead.partner_id, "Customer should be a new"
+ assert not lead.partner_id, "Customer should be a new one"
assert lead.name == "Fournir votre devis avec le meilleur prix.", "Subject does not match"
-
- I reply him request with welcome message. TODO revert mail.mail to mail.compose.message (conversion to customer should be automatic).
+ I reply his request with welcome message. TODO revert mail.mail to mail.compose.message (conversion to customer should be automatic).
-
!python {model: mail.mail}: |
lead_ids = self.pool.get('crm.lead').search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
context.update({'active_model': 'crm.lead','active_id': lead_ids[0]})
- id = self.create(cr, uid, {'body': "Merci à l'intérêt pour notre produit.nous vous contacterons bientôt. Merci", 'email_from': 'sales@mycompany.com'}, context=context)
+ id = self.create(cr, uid, {'body': "Merci de votre intérêt pour notre produit, nous vous contacterons bientôt. Bien à vous", 'email_from': 'sales@mycompany.com'}, context=context)
try:
self.send_mail(cr, uid, [id], context=context)
except:
pass
-
- Now, I convert him into customer and put into regular customer list.
+ Now, I convert him into customer and put him into regular customer list.
-
!python {model: crm.lead}: |
lead_ids = self.search(cr, uid, [('email_from','=', 'Mr. John Right <info@customer.com>')])
self.convert_partner(cr, uid, lead_ids, context=context)
-
- I convert one phonecall request as a customer and put into regular customer list.
+ I convert one phonecall request to a customer and put him into regular customer list.
-
!python {model: crm.phonecall2partner}: |
context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_4")], 'active_id': ref("crm.crm_phonecall_4")})
@@ -48,5 +48,5 @@
partner_id = self.search(cr, uid, [('phonecall_ids', '=', ref('crm.crm_phonecall_4'))])
assert partner_id, "Customer is not found in regular customer list."
data = self.browse(cr, uid, partner_id, context=context)[0]
- assert data.user_id.id == ref("base.user_root"), "User not assign properly"
- assert data.name == "Wanted information about pricing of Laptops", "Bad partner name"
+ assert data.user_id.id == ref("base.user_root"), "User not assigned properly"
+ assert data.name == "Wanted information about pricing of laptops", "Bad partner name"
diff --git a/addons/crm/test/process/lead2opportunity2win.yml b/addons/crm/test/process/lead2opportunity2win.yml
index ed552421cf0..dc5aadbcf16 100644
--- a/addons/crm/test/process/lead2opportunity2win.yml
+++ b/addons/crm/test/process/lead2opportunity2win.yml
@@ -1,20 +1,22 @@
-
- In order to test convert customer lead into opportunity,
+ In order to test convert customer lead into opportunity,
-
I open customer lead.
-
!python {model: crm.lead}: |
self.case_open(cr, uid, [ref("crm_case_4")])
--
- I check lead state is "Open".
+-
+ I check lead state is "Open".
-
!assert {model: crm.lead, id: crm.crm_case_4, string: Lead in open state}:
- state == "open"
-
- I create partner from lead.
+ I fill in a lead2partner wizard.
-
!record {model: crm.lead2partner, id: crm_lead2partner_id1, context: '{"active_model": "crm.lead", "active_ids": [ref("crm_case_4")]}'}:
-
+ I create a partner from the lead2partner wizard.
+-
!python {model: crm.lead2partner}: |
context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_4')], 'active_id': ref('crm_case_4')})
self.make_partner(cr, uid ,[ref("crm_lead2partner_id1")], context=context)
@@ -24,7 +26,7 @@
!python {model: crm.lead}: |
self.convert_opportunity(cr, uid ,[ref("crm_case_4")], ref("base.res_partner_2"))
-
- I check details of converted opportunity.
+ I check details of converted opportunity.
-
!python {model: crm.lead}: |
lead = self.browse(cr, uid, ref('crm_case_4'))
@@ -37,15 +39,15 @@
!python {model: crm.opportunity2phonecall}: |
import time
context.update({'active_model': 'crm.lead', 'active_ids': [ref('crm_case_4')]})
- call_id = self.create(cr, uid, {'date': time.strftime('%Y-%m-%d %H:%M:%S'),
- 'name': "Bonjour M. Jean, Comment êtes-vous? J'ai obtenu votre demande. peut-on parler au sujet de ce pour quelques minutes?"}, context=context)
+ call_id = self.create(cr, uid, {'date': time.strftime('%Y-%m-%d %H:%M:%S'),
+ 'name': "Bonjour M. Jean, Comment allez-vous? J'ai bien reçu votre demande, pourrions-nous en parler quelques minutes?"}, context=context)
self.action_schedule(cr, uid, [call_id], context=context)
-
I check that phonecall is scheduled for that opportunity.
-
!python {model: crm.phonecall}: |
ids = self.search(cr, uid, [('opportunity_id', '=', ref('crm_case_4'))])
- assert len(ids), 'phonecall is not scheduled'
+ assert len(ids), 'Phonecall is not scheduled'
-
Now I schedule meeting with customer.
-
@@ -55,7 +57,7 @@
After communicated with customer, I put some notes with contract details.
-
!python {model: crm.lead}: |
- self.message_post(cr, uid, [ref('crm_case_4')], subject='Test note', body='ces détails envoyés par le client sur ​​le FAX pour la qualité')
+ self.message_post(cr, uid, [ref('crm_case_4')], subject='Test note', body='Détails envoyés par le client sur ​​le FAX pour la qualité')
-
I win this opportunity
-
@@ -73,7 +75,7 @@
I convert mass lead into opportunity customer.
-
!python {model: crm.lead2opportunity.partner.mass}: |
- context.update({'active_model': 'crm.lead', 'active_ids': [ref("crm_case_11"), ref("crm_case_2")], 'active_id': ref("crm_case_11")})
+ context.update({'active_model': 'crm.lead', 'active_ids': [ref("crm_case_11"), ref("crm_case_2")], 'active_id': ref("crm_case_11")})
id = self.create(cr, uid, {'user_ids': [ref('base.user_root')], 'section_id': ref('crm.section_sales_department')}, context=context)
self.mass_convert(cr, uid, [id], context=context)
-
@@ -111,7 +113,7 @@
I confirm review needs meeting.
-
!python {model: crm.meeting}: |
- context.update({'active_model': 'crm.meeting'})
+ context.update({'active_model': 'crm.meeting'})
self.case_open(cr, uid, [ref('base_calendar.crm_meeting_4')])
-
I invite a user for meeting.
diff --git a/addons/crm/test/process/merge_opportunity.yml b/addons/crm/test/process/merge_opportunity.yml
index 6d13278eded..155cd68274f 100644
--- a/addons/crm/test/process/merge_opportunity.yml
+++ b/addons/crm/test/process/merge_opportunity.yml
@@ -1,19 +1,19 @@
-
- I make direct opportunity for customer.
+ I make an opportunity from customer.
-
!python {model: crm.partner2opportunity}: |
context.update({'active_model': 'res.partner', 'active_ids': [ref("base.res_partner_9")]})
- res_id = self.create(cr, uid, {'name': "enquête pour l'achat de services"}, context=context)
+ res_id = self.create(cr, uid, {'name': "Enquête pour l'achat de services"}, context=context)
self.make_opportunity(cr, uid, [res_id], context=context)
-
- I make another opportunity from phonecall for same customer.
+ I make another opportunity from a phone call with the same customer.
-
!python {model: crm.phonecall2opportunity}: |
context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_6")]})
- res_id = self.create(cr, uid, {'name': "Quoi de prix de votre autre service?", 'partner_id': ref("base.res_partner_9")}, context=context)
+ res_id = self.create(cr, uid, {'name': "À propos du prix de votre autre service", 'partner_id': ref("base.res_partner_9")}, context=context)
self.make_opportunity(cr, uid, [res_id], context=context)
-
- Now I merge all opportunities of customer.
+ Now I merge these opportunities.
-
!python {model: crm.lead}: |
opportunity_ids = self.search(cr, uid, [('partner_id','=', ref("base.res_partner_9"))])
@@ -24,7 +24,7 @@
!python {model: crm.merge.opportunity}: |
self.action_merge(cr, uid, [ref("opportunity_merge_id")], context=context)
-
- I check for merged opportunities for customer.
+ I check for merged opportunities for customer.
-
!python {model: crm.lead}: |
merge_id = self.search(cr, uid, [('partner_id','=', ref("base.res_partner_9"))])
@@ -32,55 +32,3 @@
merge_data = self.browse(cr, uid, merge_id)[0]
assert merge_data.type == 'opportunity', 'Merged opportunity type not change!'
assert merge_data.partner_id.id == ref("base.res_partner_9"), 'Partner missmatch!'
--
- Now I schedule another phonecall to customer after merged.
--
- !python {model: crm.phonecall2phonecall}: |
- context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_6")], 'active_id': ref("crm.crm_phonecall_6")})
- res_id = self.create(cr, uid, {'name': "vos chances sont fusionnés en un seul"}, context=context)
- self.action_schedule(cr, uid, [res_id], context=context)
--
- I schedule meeting on this phonecall.
--
- !python {model: crm.phonecall}: |
- self.action_make_meeting(cr, uid, [ref("crm.crm_phonecall_6")])
--
- I set phone call to not held.
--
- !python {model: crm.phonecall}: |
- self.case_pending(cr, uid, [ref("crm.crm_phonecall_6")])
--
- I check that the phone call is in 'Not Held' state.
--
- !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call held.}:
- - state == "pending"
--
- I cancelled the phone call.
--
- !python {model: crm.phonecall}: |
- self.case_cancel(cr, uid, [ref("crm.crm_phonecall_6")])
--
- I check that the phone call is in 'Cancelled' state.
--
- !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not cancelled.}:
- - state == "cancel"
--
- I reset the phone call.
--
- !python {model: crm.phonecall}: |
- self.case_reset(cr, uid, [ref("crm.crm_phonecall_6")])
--
- I check that the phone call is reset or not.
--
- !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not reset.}:
- - state == "open"
--
- I set phone call to held (done).
--
- !python {model: crm.phonecall}: |
- self.case_close(cr, uid, [ref("crm.crm_phonecall_6")])
--
- I check that the phone call is in 'Held' state.
--
- !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not held.}:
- - state == "done"
diff --git a/addons/crm/test/process/phonecalls.yml b/addons/crm/test/process/phonecalls.yml
new file mode 100644
index 00000000000..51a933f3223
--- /dev/null
+++ b/addons/crm/test/process/phonecalls.yml
@@ -0,0 +1,52 @@
+-
+ I schedule a phone call with a customer.
+-
+ !python {model: crm.phonecall2phonecall}: |
+ context.update({'active_model': 'crm.phonecall', 'active_ids': [ref("crm.crm_phonecall_6")], 'active_id': ref("crm.crm_phonecall_6")})
+ res_id = self.create(cr, uid, {'name': "Proposition de réduction"}, context=context)
+ self.action_schedule(cr, uid, [res_id], context=context)
+-
+ I schedule a meeting based on this phone call.
+-
+ !python {model: crm.phonecall}: |
+ self.action_make_meeting(cr, uid, [ref("crm.crm_phonecall_6")])
+-
+ I set the phone call to not held.
+-
+ !python {model: crm.phonecall}: |
+ self.case_pending(cr, uid, [ref("crm.crm_phonecall_6")])
+-
+ I check that the phone call is in 'Not Held' state.
+-
+ !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call held.}:
+ - state == "pending"
+-
+ I cancel the phone call.
+-
+ !python {model: crm.phonecall}: |
+ self.case_cancel(cr, uid, [ref("crm.crm_phonecall_6")])
+-
+ I check that the phone call is in 'Cancelled' state.
+-
+ !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not cancelled.}:
+ - state == "cancel"
+-
+ I reset the phone call.
+-
+ !python {model: crm.phonecall}: |
+ self.case_reset(cr, uid, [ref("crm.crm_phonecall_6")])
+-
+ I check that the phone call is reset.
+-
+ !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not reset.}:
+ - state == "open"
+-
+ I set phone call to held (done).
+-
+ !python {model: crm.phonecall}: |
+ self.case_close(cr, uid, [ref("crm.crm_phonecall_6")])
+-
+ I check that the phone call is in 'Held' state.
+-
+ !assert {model: crm.phonecall, id: crm.crm_phonecall_6, string: Phone call is not held.}:
+ - state == "done"
diff --git a/addons/crm/wizard/crm_lead_to_opportunity.py b/addons/crm/wizard/crm_lead_to_opportunity.py
index 44ce73c23fe..2473a83206c 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity.py
+++ b/addons/crm/wizard/crm_lead_to_opportunity.py
@@ -34,15 +34,17 @@ class crm_lead2opportunity_partner(osv.osv_memory):
('create', 'Create a new customer'), \
('nothing', 'Do not link to a customer')], \
'Related Customer', required=True),
- 'name': fields.selection([('convert', 'Convert to Opportunities'), ('merge', 'Merge with existing Opportunities')], 'Conversion Action', required=True),
+ 'name': fields.selection([('convert', 'Convert to opportunity'), \
+ ('merge', 'Merge with existing opportunities')], \
+ 'Conversion Action', required=True),
'opportunity_ids': fields.many2many('crm.lead', string='Opportunities', domain=[('type', '=', 'opportunity')]),
}
def default_get(self, cr, uid, fields, context=None):
"""
- Default get for name, opportunity_ids
- if there is an exisitng partner link to the lead, find all existing opportunity link with this partnet to merge
- all information together
+ Default get for name, opportunity_ids.
+ If there is an exisitng partner link to the lead, find all existing
+ opportunities links with this partner to merge all information together
"""
lead_obj = self.pool.get('crm.lead')
@@ -62,12 +64,13 @@ class crm_lead2opportunity_partner(osv.osv_memory):
ids = []
if partner_id:
+ # Search for opportunities that have the same partner and that arent done or cancelled
ids = lead_obj.search(cr, uid, [('partner_id', '=', partner_id), ('type', '=', 'opportunity'), '!', ('state', 'in', ['done', 'cancel'])])
if ids:
opportunities.append(ids[0])
if not partner_id:
if email:
- # Find email of existing opportunity matches the email_from of the lead
+ # Find email of existing opportunity matching the email_from of the lead
cr.execute("""select id from crm_lead where type='opportunity' and
substring(email_from from '([^ ,<@]+@[^> ,]+)') in (%s)""" % (','.join(email)))
ids = map(lambda x:x[0], cr.fetchall())
@@ -83,12 +86,11 @@ class crm_lead2opportunity_partner(osv.osv_memory):
if 'opportunity_ids' in fields:
res.update({'opportunity_ids': opportunities})
-
return res
def view_init(self, cr, uid, fields, context=None):
"""
- This function checks for precondition before wizard executes
+ Check some preconditions before the wizard executes.
"""
if context is None:
context = {}
@@ -110,7 +112,7 @@ class crm_lead2opportunity_partner(osv.osv_memory):
partner_id = partner_ids_map.get(lead_id, False)
# FIXME: cannot pass user_ids as the salesman allocation only works in batch
res = lead.convert_opportunity(cr, uid, [lead_id], partner_id, [], team_id, context=context)
- # FIXME: must perform salesman allocation in batch separately here
+ # FIXME: must perform salesman allocation in batch separately here
user_ids = vals.get('user_ids', False)
if user_ids:
lead.allocate_salesman(cr, uid, lead_ids, user_ids, team_id=team_id, context=context)
@@ -136,9 +138,10 @@ class crm_lead2opportunity_partner(osv.osv_memory):
def action_apply(self, cr, uid, ids, context=None):
"""
- This converts lead to opportunity and opens Opportunity view
+ Convert lead to opportunity or merge lead and opportunity and open
+ the freshly created opportunity view.
"""
- if not context:
+ if context is None:
context = {}
lead = self.pool.get('crm.lead')
lead_ids = context.get('active_ids', [])
diff --git a/addons/crm/wizard/crm_lead_to_opportunity_view.xml b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
index ef8acf95b58..3390ad8f547 100644
--- a/addons/crm/wizard/crm_lead_to_opportunity_view.xml
+++ b/addons/crm/wizard/crm_lead_to_opportunity_view.xml
@@ -8,14 +8,8 @@
<field name="arch" type="xml">
<form string="Convert to Opportunity" version="7.0">
<group>
- <field name="action" class="oe_inline"/>
- <field name="partner_id"
- attrs="{'required': [('action', '=', 'exist')], 'invisible':[('action','!=','exist')]}"
- class="oe_inline"/>
- </group>
- <group>
<field name="name" class="oe_inline"/>
- <field name="opportunity_ids" attrs="{'invisible': [('name', '=', 'convert')]}">
+ <field name="opportunity_ids" attrs="{'invisible': [('name', '!=', 'merge')]}">
<tree>
<field name="name"/>
<field name="partner_id"/>
@@ -24,6 +18,12 @@
</tree>
</field>
</group>
+ <group attrs="{'invisible': [('name', '!=', 'convert')]}">
+ <field name="action" class="oe_inline"/>
+ <field name="partner_id"
+ attrs="{'required': [('action', '=', 'exist')], 'invisible':[('action','!=','exist')]}"
+ class="oe_inline"/>
+ </group>
<footer>
<button name="action_apply" string="Create Opportunity" type="object" class="oe_highlight"/>
or
@@ -38,23 +38,28 @@
<field name="model">crm.lead2opportunity.partner.mass</field>
<field name="arch" type="xml">
<form string="Convert to Opportunity" version="7.0">
- <group string="Conversion Options">
- <field name="action"/>
- <field name="partner_id" attrs="{'invisible':[('action','!=','exist')],'required': [('action', '=', 'exist')]}"/>
- <field name="name"/>
+ <separator string="Conversion Options"/>
+ <group>
+ <field name="name" class="oe_inline"/>
+ </group>
+ <group attrs="{'invisible': [('name', '!=', 'convert')]}">
+ <field name="action" class="oe_inline"/>
+ <field name="partner_id"
+ attrs="{'required': [('action', '=', 'exist')], 'invisible':[('action','!=','exist')]}"
+ class="oe_inline"/>
</group>
- <group string="Select Opportunities" attrs="{'invisible': [('name', '=', 'convert')]}">
- <field name="opportunity_ids" colspan="4" nolabel="1" attrs="{'invisible': [('name', '=', 'convert')]}">
- <tree>
- <field name="name" />
- <field name="partner_id" />
- <field name="user_id" />
- <field name="section_id" />
- </tree>
- </field>
+ <group string="Select Opportunities" attrs="{'invisible': [('name', '!=', 'merge')]}">
+ <field name="opportunity_ids" colspan="4" nolabel="1" attrs="{'invisible': [('name', '=', 'convert')]}">
+ <tree>
+ <field name="name" />
+ <field name="partner_id" />
+ <field name="user_id" />
+ <field name="section_id" />
+ </tree>
+ </field>
</group>
-
- <group string="Assign opportunities to">
+
+ <group string="Assign opportunities to" attrs="{'invisible': [('name', '=', '')]}">
<field name="section_id" />
<field name="user_ids" colspan="4">
<tree>
@@ -62,14 +67,14 @@
</tree>
</field>
</group>
-
+
<footer>
<button name="mass_convert" string="Convert to Opportunities" type="object" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
- </footer>
+ </footer>
</form>
- </field>
+ </field>
</record>
<record id="action_crm_lead2opportunity_partner" model="ir.actions.act_window">
@@ -83,10 +88,11 @@
<act_window id="action_crm_send_mass_convert"
multi="True"
- key2="client_action_multi" name="Convert opportunities"
+ key2="client_action_multi" name="Convert to opportunities"
res_model="crm.lead2opportunity.partner.mass" src_model="crm.lead"
view_mode="form" target="new" view_type="form"
context="{'mass_convert' : True}"
view_id="view_crm_lead2opportunity_partner_mass"/>
+
</data>
</openerp>
diff --git a/addons/crm/wizard/crm_merge_opportunities.py b/addons/crm/wizard/crm_merge_opportunities.py
index 381bb9871ea..edfefb5e5bc 100644
--- a/addons/crm/wizard/crm_merge_opportunities.py
+++ b/addons/crm/wizard/crm_merge_opportunities.py
@@ -27,6 +27,8 @@ class crm_merge_opportunity(osv.osv_memory):
_description = 'Merge two Opportunities'
def action_merge(self, cr, uid, ids, context=None):
+ if context is None:
+ context = {}
lead = self.pool.get('crm.lead')
record = self.browse(cr, uid, ids[0], context=context)
opportunities = record.opportunity_ids
@@ -38,7 +40,7 @@ class crm_merge_opportunity(osv.osv_memory):
return lead.redirect_opportunity_view(cr, uid, merge_id, context=context)
_columns = {
- 'opportunity_ids' : fields.many2many('crm.lead', 'merge_opportunity_rel', 'merge_id', 'opportunity_id', 'Opportunities', domain=[('type', '=', 'opportunity')]),
+ 'opportunity_ids': fields.many2many('crm.lead', rel='merge_opportunity_rel', id1='merge_id', id2='opportunity_id', string='Leads/Opportunities'),
}
def default_get(self, cr, uid, fields, context=None):
diff --git a/addons/crm/wizard/crm_merge_opportunities_view.xml b/addons/crm/wizard/crm_merge_opportunities_view.xml
index 3a0b11c4255..4b035200737 100644
--- a/addons/crm/wizard/crm_merge_opportunities_view.xml
+++ b/addons/crm/wizard/crm_merge_opportunities_view.xml
@@ -3,13 +3,12 @@
<data>
<!-- Merge Opportunities -->
-
<record model="ir.ui.view" id="merge_opportunity_form">
<field name="name">crm.merge.opportunity.form</field>
<field name="model">crm.merge.opportunity</field>
<field name="arch" type="xml">
- <form string="Merge Opportunities" version="7.0">
- <separator string="Select Opportunities"/>
+ <form string="Merge Leads/Opportunities" version="7.0">
+ <separator string="Select Leads/Opportunities"/>
<field name="opportunity_ids">
<tree>
<field name="name"/>
@@ -19,7 +18,7 @@
</tree>
</field>
<footer>
- <button name="action_merge" type="object" string="_Merge" class="oe_highlight"/>
+ <button name="action_merge" type="object" string="Merge" class="oe_highlight"/>
or
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
@@ -27,10 +26,9 @@
</field>
</record>
- <!-- Merge Opportunities action -->
-
+ <!-- Merge leads/opportunities action -->
<record model="ir.actions.act_window" id="merge_opportunity_act">
- <field name="name">Merge Opportunities</field>
+ <field name="name">Merge leads/opportunities</field>
<field name="res_model">crm.merge.opportunity</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
@@ -40,7 +38,7 @@
<act_window id="action_merge_opportunities"
multi="True"
- key2="client_action_multi" name="Merge Opportunities"
+ key2="client_action_multi" name="Merge leads/opportunities"
res_model="crm.merge.opportunity" src_model="crm.lead"
view_mode="form" target="new" view_type="form"/>
diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml
index 820fb38e58a..b319339bcfd 100644
--- a/addons/crm_claim/crm_claim_view.xml
+++ b/addons/crm_claim/crm_claim_view.xml
@@ -181,6 +181,7 @@
</group>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -241,7 +242,7 @@
<attribute name="invisible">False</attribute>
</xpath>
<xpath expr="//page[@name='page_history']" position="inside">
- <group name="grp_claim" string="Claim">
+ <group name="grp_claim" string="Claims">
<field name="claims_ids" colspan="4" nolabel="1">
<tree string="Partners Claim" editable="bottom">
<field name="name"/>
diff --git a/addons/crm_helpdesk/crm_helpdesk_view.xml b/addons/crm_helpdesk/crm_helpdesk_view.xml
index 5399c9880ca..d2be33e4584 100644
--- a/addons/crm_helpdesk/crm_helpdesk_view.xml
+++ b/addons/crm_helpdesk/crm_helpdesk_view.xml
@@ -61,10 +61,6 @@
on_change="onchange_partner_id(partner_id, email_from)"
/>
<field name="email_from"/>
- <button name="remind_partner"
- states="open,pending"
- string="Send Reminder" type="object"
- icon="gtk-go-forward" />
</group>
<group string="Categorization">
<field name="priority"/>
@@ -99,6 +95,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/crm_profiling/crm_profiling_view.xml b/addons/crm_profiling/crm_profiling_view.xml
index 1e894b456c0..dacbca0b3c6 100644
--- a/addons/crm_profiling/crm_profiling_view.xml
+++ b/addons/crm_profiling/crm_profiling_view.xml
@@ -124,7 +124,7 @@
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<notebook position="inside">
- <page string="Profiling">
+ <page string="Profiling" groups="base.group_user">
<button string="Use a questionnaire"
name="%(action_open_questionnaire)d" type="action" colspan="1"
icon="gtk-justify-fill" />
diff --git a/addons/crm_profiling/security/ir.model.access.csv b/addons/crm_profiling/security/ir.model.access.csv
index 24fd7009c6a..71149a912ee 100644
--- a/addons/crm_profiling/security/ir.model.access.csv
+++ b/addons/crm_profiling/security/ir.model.access.csv
@@ -1,6 +1,7 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_crm_profiling_answer_salesman,crm_profiling.answer.salesman,model_crm_profiling_answer,base.group_sale_salesman,1,1,1,0
access_crm_profiling_answer_manager,crm_profiling.answer.manager,model_crm_profiling_answer,base.group_sale_manager,1,1,1,1
+access_crm_profiling_answer_user,crm_profiling.answer.user,model_crm_profiling_answer,base.group_user,1,0,0,0
access_crm_profiling_question_salesman,crm_profiling.question.salesman,model_crm_profiling_question,base.group_sale_salesman,1,1,1,0
access_crm_profiling_question_manager,crm_profiling.question.manager,model_crm_profiling_question,base.group_sale_manager,1,1,1,1
access_crm_profiling_questionnarie_salesman,crm_profiling.questionnarie.salesman,model_crm_profiling_questionnaire,base.group_sale_salesman,1,1,1,0
diff --git a/addons/delivery/delivery_view.xml b/addons/delivery/delivery_view.xml
index deb59983ef2..4ac1ab12573 100644
--- a/addons/delivery/delivery_view.xml
+++ b/addons/delivery/delivery_view.xml
@@ -90,7 +90,7 @@
</record>
<record id="action_delivery_carrier_form" model="ir.actions.act_window">
- <field name="name">Delivery Method</field>
+ <field name="name">Delivery Methods</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">delivery.carrier</field>
<field name="view_type">form</field>
@@ -230,6 +230,10 @@
<field name="carrier_tracking_ref"/>
<field name="number_of_packages"/>
</field>
+ <field name="company_id" position="before">
+ <field name="weight"/>
+ <field name="weight_net" groups="base.group_no_one"/>
+ </field>
</field>
</record>
@@ -307,13 +311,26 @@
<record id="view_delivery_order_inherit_stock" model="ir.ui.view">
<field name="name">stock.picking.out.form</field>
<field name="model">stock.picking.out</field>
- <field name="inherit_id" ref="stock.view_picking_out_form"/>
+ <field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
- <xpath expr="/form/header//button[@string='Create Invoice/Refund']" position="after">
- <button name="%(report_shipping)d" string="Delivery Order" states="done" type="action" icon="gtk-print"/>
+ <xpath expr="/form/header//button[@name='action_process']" position="after">
+ <button name="%(report_shipping)d" string="Print Delivery Order" states="confirmed,assigned" type="action"/>
+ <button name="%(report_shipping)d" string="Print Delivery Order" states="done" type="action" class="oe_highlight"/>
</xpath>
</field>
</record>
-
+
+ <record id="view_picking_withcarrier_in_form" model="ir.ui.view">
+ <field name="name">delivery.stock.picking_withcarrier.in.form.view</field>
+ <field name="type">form</field>
+ <field name="model">stock.picking.in</field>
+ <field name="inherit_id" ref="stock.view_picking_form"/>
+ <field name="arch" type="xml">
+ <field name="company_id" position="before">
+ <field name="weight"/>
+ <field name="weight_net" groups="base.group_no_one"/>
+ </field>
+ </field>
+ </record>
</data>
</openerp>
diff --git a/addons/delivery/stock.py b/addons/delivery/stock.py
index f4d133e967a..c3ce236dc2e 100644
--- a/addons/delivery/stock.py
+++ b/addons/delivery/stock.py
@@ -202,5 +202,30 @@ class stock_picking_out(osv.osv):
'carrier_tracking_ref': fields.char('Carrier Tracking Ref', size=32),
'number_of_packages': fields.integer('Number of Packages'),
}
+stock_picking_out()
+
+class stock_picking_in(osv.osv):
+ _inherit = 'stock.picking.in'
+
+ def _cal_weight(self, cr, uid, ids, name, args, context=None):
+ return self.pool.get('stock.picking')._cal_weight(cr, uid, ids, name, args, context=context)
+
+ def _get_picking_line(self, cr, uid, ids, context=None):
+ return self.pool.get('stock.picking')._get_picking_line(cr, uid, ids, context=context)
+
+ _columns = {
+ 'weight': fields.function(_cal_weight, type='float', string='Weight', digits_compute= dp.get_precision('Stock Weight'), multi='_cal_weight',
+ store={
+ 'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20),
+ 'stock.move': (_get_picking_line, ['product_id','product_qty','product_uom','product_uos_qty'], 20),
+ }),
+ 'weight_net': fields.function(_cal_weight, type='float', string='Net Weight', digits_compute= dp.get_precision('Stock Weight'), multi='_cal_weight',
+ store={
+ 'stock.picking': (lambda self, cr, uid, ids, c={}: ids, ['move_lines'], 20),
+ 'stock.move': (_get_picking_line, ['product_id','product_qty','product_uom','product_uos_qty'], 20),
+ }),
+ }
+stock_picking_in()
+
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/document/__openerp__.py b/addons/document/__openerp__.py
index 3dc14054b40..e3354efff0c 100644
--- a/addons/document/__openerp__.py
+++ b/addons/document/__openerp__.py
@@ -57,6 +57,7 @@ ATTENTION:
],
'demo': [ 'document_demo.xml','board_document_demo.xml'],
'test': ['test/document_test2.yml'],
+ 'js': ['static/src/js/document.js'],
'installable': True,
'auto_install': False,
'images': ['images/1_directories.jpeg','images/2_storage_media.jpeg','images/3_directories_structure.jpeg'],
diff --git a/addons/document/static/src/js/document.js b/addons/document/static/src/js/document.js
new file mode 100644
index 00000000000..2dde2696c81
--- /dev/null
+++ b/addons/document/static/src/js/document.js
@@ -0,0 +1,10 @@
+openerp.document = function (instance) {
+ _t = instance.web._t;
+ instance.web.Sidebar.include({
+ init : function(){
+ this._super.apply(this, arguments);
+ this.sections.splice(1, 0, { 'name' : 'files', 'label' : _t('Attachment(s)'), });
+ this.items['files'] = [];
+ }
+ });
+}; \ No newline at end of file
diff --git a/addons/document_ftp/wizard/ftp_browse.py b/addons/document_ftp/wizard/ftp_browse.py
index b1120bc6511..8260424d653 100644
--- a/addons/document_ftp/wizard/ftp_browse.py
+++ b/addons/document_ftp/wizard/ftp_browse.py
@@ -39,7 +39,7 @@ class document_ftp_browse(osv.osv_memory):
data_pool = self.pool.get('ir.model.data')
aid = data_pool._get_id(cr, uid, 'document_ftp', 'action_document_browse')
aid = data_pool.browse(cr, uid, aid, context=context).res_id
- ftp_url = self.pool.get('ir.actions.url').browse(cr, uid, aid, context=context)
+ ftp_url = self.pool.get('ir.actions.act_url').browse(cr, uid, aid, context=context)
url = ftp_url.url and ftp_url.url.split('ftp://') or []
if url:
url = url[1]
diff --git a/addons/document_ftp/wizard/ftp_configuration.py b/addons/document_ftp/wizard/ftp_configuration.py
index 5da2ddf11e8..d0679973c5a 100644
--- a/addons/document_ftp/wizard/ftp_configuration.py
+++ b/addons/document_ftp/wizard/ftp_configuration.py
@@ -44,7 +44,7 @@ class document_ftp_configuration(osv.osv_memory):
# Update the action for FTP browse.
aid = data_pool._get_id(cr, uid, 'document_ftp', 'action_document_browse')
aid = data_pool.browse(cr, uid, aid, context=context).res_id
- self.pool.get('ir.actions.url').write(cr, uid, [aid],
+ self.pool.get('ir.actions.act_url').write(cr, uid, [aid],
{'url': 'ftp://'+(conf.host or 'localhost:8021')+'/' + cr.dbname+'/'})
document_ftp_configuration()
diff --git a/addons/document_ftp/wizard/ftp_configuration_view.xml b/addons/document_ftp/wizard/ftp_configuration_view.xml
index 36fb80c51af..9e05fba986e 100644
--- a/addons/document_ftp/wizard/ftp_configuration_view.xml
+++ b/addons/document_ftp/wizard/ftp_configuration_view.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
- <record model="ir.actions.url" id="action_document_browse">
+ <record model="ir.actions.act_url" id="action_document_browse">
<field name="name">Browse Files</field>
<field name="url">ftp://localhost:8021/</field>
</record>
diff --git a/addons/event/event_view.xml b/addons/event/event_view.xml
index fd396053d5d..f786592d06c 100644
--- a/addons/event/event_view.xml
+++ b/addons/event/event_view.xml
@@ -1,15 +1,14 @@
<?xml version="1.0"?>
<openerp>
<data>
-
- <act_window
- id="act_event_list_register_event"
- name="Registration"
- res_model="event.registration"
- src_model="event.event"
- view_mode="calendar,tree,form,graph"
- context="{'search_default_event_id': active_id, 'default_event_id': active_id}"
- view_type="form"/>
+
+ <record id="act_event_list_register_event" model="ir.actions.act_window">
+ <field name="res_model">event.registration</field>
+ <field name="view_type">form</field>
+ <field name="name">Registrations</field>
+ <field name="view_mode">calendar,tree,form,graph</field>
+ <field name="context">{'search_default_event_id': active_id, 'default_event_id': active_id}</field>
+ </record>
<!-- Top menu item -->
<menuitem name="Events"
@@ -197,6 +196,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -247,12 +247,12 @@
<t t-name="kanban-box">
<div class="oe_module_vignette">
<a type="open" class="oe_module_icon">
- <div class="oe_event_date "><t t-esc="record.date_begin.raw_value.getDate()"/></div>
- <div class="oe_event_month_year">
- <t t-esc="record.date_begin.raw_value.toString('MMM')"/>
- <t t-esc="record.date_begin.raw_value.getFullYear()"/>
- </div>
- <div class="oe_event_time"><t t-esc="record.date_begin.raw_value.toString('hh:mm tt')"/></div>
+ <div class="oe_event_date "><t t-esc="record.date_begin.raw_value.getDate()"/></div>
+ <div class="oe_event_month_year">
+ <t t-esc="record.date_begin.raw_value.toString('MMM')"/>
+ <t t-esc="record.date_begin.raw_value.getFullYear()"/>
+ </div>
+ <div class="oe_event_time"><t t-esc="record.date_begin.raw_value.toString('hh:mm tt')"/></div>
</a>
<div class="oe_module_desc">
<h4><a type="open"><field name="name"/></a></h4>
@@ -272,10 +272,10 @@
</p>
<t t-if="record.register_avail.raw_value != 0">
<t t-if="!record.is_subscribed.raw_value">
- <input t-att-id="record.id.raw_value" type="text" name="subscribe" class="no_of_seats" value="1" onchange="document.getElementById('btn_sub' +this.id).setAttribute('data-context',JSON.stringify({'ticket':this.value}))"/>
- <button t-att-id="'btn_sub'+record.id.raw_value" type="object" name="subscribe_to_event" class="oe_mail_button_follow">
- <span >Subscribe</span>
- </button>
+ <input t-att-id="record.id.raw_value" type="text" name="subscribe" class="no_of_seats" value="1" onchange="document.getElementById('btn_sub' +this.id).setAttribute('data-context',JSON.stringify({'ticket':this.value}))"/>
+ <button t-att-id="'btn_sub'+record.id.raw_value" type="object" name="subscribe_to_event" class="oe_mail_button_follow">
+ <span >Subscribe</span>
+ </button>
</t>
</t>
<t t-if="record.is_subscribed.raw_value">
@@ -479,6 +479,7 @@
</group>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/event/res_partner_view.xml b/addons/event/res_partner_view.xml
index 8e5ff480c2c..c3e8073a7ae 100644
--- a/addons/event/res_partner_view.xml
+++ b/addons/event/res_partner_view.xml
@@ -16,7 +16,7 @@
<attribute name="invisible">False</attribute>
</xpath>
<xpath expr="//page[@name='page_history']" position="inside">
- <group name="grp_event" string="Event">
+ <group name="grp_event" string="Events">
<field name="event_ids" colspan="4" nolabel="1">
<tree string="Events">
<field name="name" string="Event"/>
@@ -24,7 +24,7 @@
</tree>
</field>
</group>
- <group name="grp_registration" string="Registration">
+ <group name="grp_registration" string="Registrations">
<field name="event_registration_ids" colspan="4" nolabel="1">
<tree string="Events Registration">
<field name="event_begin_date" string="Date"/>
diff --git a/addons/event/security/event_security.xml b/addons/event/security/event_security.xml
index f46bc5fff96..2cc749a1a40 100644
--- a/addons/event/security/event_security.xml
+++ b/addons/event/security/event_security.xml
@@ -3,7 +3,7 @@
<data>
<record model="ir.module.category" id="module_category_event_management">
- <field name="name">Event</field>
+ <field name="name">Events</field>
<field name="description">Helps you manage your Events.</field>
<field name="sequence">3</field>
</record>
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py
index 70a05c6bd0e..e0023697594 100644
--- a/addons/fetchmail/fetchmail.py
+++ b/addons/fetchmail/fetchmail.py
@@ -195,7 +195,7 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS
strip_attachments=(not server.attach),
context=context)
if res_id and server.action_id:
- action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
+ action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", False)})
imap_server.store(num, '+FLAGS', '\\Seen')
cr.commit()
count += 1
@@ -220,7 +220,7 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS
strip_attachments=(not server.attach),
context=context)
if res_id and server.action_id:
- action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
+ action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id], 'active_model': context.get("thread_model", False)})
pop_server.dele(num)
cr.commit()
_logger.info("fetched/processed %s email(s) on %s server %s", numMsgs, server.type, server.name)
diff --git a/addons/hr/hr_demo.xml b/addons/hr/hr_demo.xml
index 8cb5ade52fe..914f373d02a 100644
--- a/addons/hr/hr_demo.xml
+++ b/addons/hr/hr_demo.xml
@@ -135,7 +135,7 @@
<field name="work_location">Grand-Rosière</field>
<field name="work_phone">+3281813700</field>
<field name="work_email">niv@openerp.com</field>
- <field name="image">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</field>
+ <field name="image">iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9wKAQ0xLdB+waQAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAgAElEQVR42r2dV4+cV3L+q3OOM9MTOBwxipREaYFdA7uA7Yu11zBgwPe+8lexv5IB+8rwlSHJGYuVZUkrkWKa2DOdc/xf7P7KTx++Q1LB/wEITuh++33PqVPhqaeqYn/913+9jsVitl6vbb1eG1/r9dri8biZmcViMYvH4xaLxSwWi5mZWSKR8O/NzJLJpH/P6/mKx+P+fr4SicTGNfQz9Jp8Jn9LJBL+Pdflfvkd3+vvuQ9+5pn5Xtcg6u9mZqvVKnI9+J710+fgd8vl0tbrtV+D6/Hzcrnc+Jn38jN/4x6Xy6W/hvfquvM7XQPWm71drVaWDDf2OkHQzdLNDTeO9+vC62v1SxcskUjYer32z9H7etPP+lkshH7marXyzdd71Ovxuqj71YUPhSWZTPr33LsKSnh//Kwbqq9lHUIhDtcNgdI94Rl5Xl2H8Gf2NZlKpSI/IJT+8GH0guHJ0g+8TouwUCqZ4ckOP083Rk87rwmfQx8+1Abh4oYCGwqLnkjVjrrZPE/UveizRAlEqL3YZBU2FRz9GxpVnxeB5HXh8/JzEtUdLkQoSbrY+mGhqlVJvu60qkq67lr62aGaDlVkKOnXCXAoyCrEfJ5uqi58uNlRmizq5/Bvem09GLpRoVDrPcRiMZvP579T37J34UarhgjXTQUsyQZE2bko26KLrAuqm83v9dqhmWDzw00O/QZ9X7hAeg/XnWDVRtfdMydIhSk0ZXr6VYBCkxkeIr1f1RDz+Xzj3lQrLhaLjefhtbFYzBaLhW/ufD63VCrlG856LhYL1xKpVGpj70ITkgydOf1KJpO2WCw2FlA3OGqjowQi9DNCZy5KAPS6ofpHDYbSHWWyVHuFrwkXJupLDwafGapRXZeo0897V6uV2/jlcumOGGu0Wq1sNpttvI6fk8mkzedzGw6Hvids/nw+39j88JCFppPruwkIJTl0ckLVEW4qNxtGB9wUi8P/urHh5utmqVMTerFRvkjUtTTqCBdCFyTKPoced+h/hNcM/QHVZJzq9Xrt37M+fM1mM5vNZpZKpVwY+HmxWNhoNLLxeOz7kkgkbDgc2nw+t3w+/4q3n8lkIk0A+xWLxf5XAPjS8IKHQKr0QVgA3XwN79brtaVSqVe81Os2KhQq3WRUmr5GVWiUH6ECpqpdT7T6Kbwe1ag2W4U+DF9DNa+nP51Ov3INVLwejvV6bdPp1KbTqSWTSVff0+nUtcBoNLJOp2PD4dBWq5VlMhnXAtls1maz2YagJ5PJDRMQ5QOs12tLptPpV1QZQhBlU1OplN9QNps1jSJUAqMwgChfIdQI2GKkXNWfboRuVChQURpBTQYLrIIQOmThFypc1XboK/A3vuewqMc+n89dAFQwEWgOHD/P53NrNps2Ho9tOp2amVkul7N0Ou1CNJvN/JAkk0nfF/Ym9Fd03TY0gKoobnK5XPpG8EBsyGAwsGQyablc7hVbqdogNAvhqRd1tLE5KhChMKXTaVssFpGRRigE6oTxPw5uMpk0NYOYPBUCNlzDqnDTuPdQ8+jBYA1Xq5Vrx9VqZYPBwJ9lMpnYfD63+Xxuo9HILi8vbTqd2uHhob3zzjtWq9UsnU5bsVi0yWRiw+HQer2eXVxcWLfbNTOzTCZjHOxQy4VhbVLVdBhWsfmpVMrG47FfaLlcWjqdtvF4bN1u121QJpNx9C50mDTWj0IM4/H4hr+hYU0sFrNsNrth97lvTgGfo9fQU8k1Z7PZxv3ppqnghrY69Flw4kKwSDdf1wBNMJ/PN9ZgPB7baDTya2IO2u22jUYj29/ft0ePHlmtVrNkMmnT6dSft1KpWKVSsYODA7t165ZdXl7axcWFLRYL9xFCACzU6Mko0CRElBKJhGWzWRcCVFQikbDFYmHj8dgmk4llMhnL5XKWy+X8RMzncz9NqCSNDvSm9KZ5D5vA36/DEXSxo6BctNpkMtnYaDYyk8lsePMKqXL9dDq9oQ31eUKfBfurWod1y2QytlqtbDqd2mAwMDOz0Whkq9XK+v2+TSYTq1Qq9gd/8Ad2dHRk0+nUut2ujcdjy+Vyls/nrVQquSZMJpNWKpX81OOzzedz9yM0pNeDmQwXK7T14/HYT3wikdi4oL5nMpnYYDCwfD5vhULBCoWChykOOvz+dCJUbPhyuXSnhwdis9Vu6+kO4380BqqU989mM1uv1y6k0+nUZrOZbxChLqEVn81nhmGZxuFqKnkWfh/G3PF43KbTqc3nc79+r9fbEACcwIcPH9rdu3ctn89bv9+3Xq9nq9XKqtWqlctlMzMbDAYusKj8eDxu1WrVxuOxC5KaOzXHHLJkFLiDpKRSKRuNRm7rkdr5fG6TyWTj4efzufV6Pet2u1YoFCybzVomk7FCobARouRyOV8kTjt2HhWN2eEe4vG4TSaTjVPFRvP/dDrdiK3T6bQtl0sbj8f+fhZyNBq5msSUpdNpP11476PRyHq9nmvA6XS64WzhgCkit1gsbDabbWhR1nUymdhkMrFUKmWTycRarZZNJhMXUtT97u6uTSYT6/f7tlwuLZvN2tbWluXzeY8GWGcEj1BxMpnYxcWFo4UhJhBGPcmomJgXpFIpKxQK1mw2bTgcWiKRsPl87lFAMpm0RqNh6XTa+v2+pVIpGwwGLtmo6VqtZvV63TKZjC0WCysWi75YCjWzMEhuGOKxsJgGDRFxnhAm1CEabD6f+4JyeliUdDpt6/XaMpmM1Wo1v79Op+MnNJlMWj6fd0Hl+qh0TiP3n06nN7THarVyAYzH4+64LRYLq1ar9v7779uDBw8smUxuvC4Wi1m1WrVqtWoXFxd2eXlpsVjM6vW6m4BEImGDwcBOTk787xwADlMU6BWPxy0ZJiY0xEokEn6Ke72en/pMJmM3btywcrlsuVzOMpmMOzfL5dL6/b51u13rdDp2eXlp3377rV1cXNju7q5VKhWbTqdWLBY9tEN1Et4MBgMbjUaWyWRcfbGJCCiqGMEgKuH1qVTKfRQEdrFYeLwdhqPz+dxyuZxriOVyaa1Wy1+bTCZtOBx69IHpMjMrFAruA4xGI5tMJhaLxSyfz7uQoZYXi4X1ej1rt9tmZnbv3j17+PCh7e3t+d+r1apr4mq1aslk0o6Pj63dblu5XPbnn06ndnFx4UI6HA5dkPFRWIcoR9B9gChol3iVB2HhqtWqPXz40G7dumXxeNy63a6r93a7bel02mq1mtvdwWBg5+fn9vz5czs+PrbT01Mrl8u2v79v1WrVVRwOYz6ft3g87hoE4cKBGg6HvvCTycSFDvVHSJXJZHyTFouFLw5OqcbhGhpyMgjD5vP5xknDZ0gmkzabzTbWZrVaOVIHDsD1h8Oh9ft9f8Z6vW4PHjywo6Mji8fjdnx8bIVCwXZ3dx3BSyaTNplM7OTkxBaLhe3u7lqz2bTBYGCdTsc6nY6buHq9voEa4t+EoZ/6TavV6ncaICo7pRApsX42m7V79+7Z/fv3LZ1O++J0Oh1brVa2v7+/YYvn87m/5+joyF6+fGmPHz+28/Nz63a7dnR0ZKVSyYrFot8s6ns6ndpwOLRSqeSLjXodj8c2Ho83HD6EpNfr2XK5tEwmY5lMxqbTqXvYCuTEYjEHUPDmua5qDrWhGi3wmTjF2WzW0TfWD8eWpE2hULBarWZ37tyxRqNhhULBxuOx9Xo9Ozg4sKOjIzd5k8nEnj17Zq1Wy+r1uq3Xa/vkk0+s2+36vaFViAi4j2w2a+l0esN5VUxDTX5SwZQQqUP9xeNxBx8ODw9dja/Xa3dErq6urN/vW6FQcOnP5XK2XC799N24ccN2d3ft/Pzcnj59ak+fPrVUKmXb29tu08bjsVWrVZvNZnZ1deVqz8ys0+n4aRsMBu485XI5MzPr9/sutLPZzIbDoT80GkR9iOl06g5g6CzhQHGi+CzWBKFRxC6VSrn5BKMvFApWKpXs6OjIbt++bclk0vESrvn+++9brVaz0Whk7Xbbut2uffXVV2Zmdvv2bTs7O7PPPvvMOp2O4/+DwcCdUA4jmq1UKr2S7g7RUieEED5FwbXJZNLG47FL0nK5dD+AB0GFHxwc2Hg8tuFw6DhAv9934ZlMJtZuty0ej1s+n7d79+5Zt9u18/Nza7VabvPRKJxmkLJMJmPtdtt6vd5GCMbf0Ro8j7J4cIgIyVD1vJ6NwGHi+pxywkGNHJSYQXjMPRElFYtFu3//vt2+fdvq9bqfWMLlcrlsN27csGQyaV988YU9fvzYo656vW47Ozv261//2p4+fer3cXFxYavVyur1umvm7e1tv0fFB0IgKIoEk1QnJ4oeRoiFre12u7a1teVxZyKRcCcMxA6PvFqtWi6Xs3a7bZlMxszM2u22n5x8Pm937tzxk8gJwJNl4/v9vm8GPgcYA/eHP0Asz0azUdwfD48GwOeJcjQJ8TQ/j4pHCADCNL6Ox+NWqVTswYMH9ujRIzMzOzk5sVarZbFYzMrlsqXTactms9bpdOzjjz+2Xq9n6XTaMpmMgz+ffvqptVotdy77/b6t12ur1WqWz+dtuVx6xEJkgu8T0vhCphdAWHI6nbrNi8rdK349nU7t8vLStra2XOK40GKxsH6/b8Ph0AVhMBhYuVy27e1tm0wmDhc3m02/IdDFarVqtVrNKpWKnZ+fu9k4Pz/3WJfNXq1WVigUNsJHzYUDJs1mM+P5WMTVamW5XM5V92Kx2DjRRBAIVz6f3/A3EDAFmxCwVCrlm3B4eGgHBweutXq9nt8fWuPLL7+08/NzSyQSVi6XXQM9fvzYnj596sKpzmM+n3dImP/B//P5vBWLRReCEN+J4jokNSRSbD3k0WFjWq2WXV1dWavVsidPnrgDqAsTj8cdVCkWi1av161Wq1kul7NGo+FeLwuCBpjNZlYsFu3GjRtuR588eWKtVsuGw+GGgC6XS8vlcq+kpAkt1aFlgzjJIIGoeoRQEz+kXBF8BLtQKHgIymejbVC71WrVCoWCnZ+fW7/ft2Kx6E4bgvTixQszMyuXy5bJZCyVStnZ2Zk9e/bM31Mul13YMT2xWMw1YiqV2hCKSqXiiTndS+U7hMygJA8fMnRCIoeGWthOzXlr2nM6nfpNptNpOz4+tlqtZltbW1apVCybzdrOzo5dXl76hgHVEmsDKT948MC++eYbe/r06caiA8xkMhnXNqh1NkUdQrQVDh0mBS1Bfl2TMkDc4/HYTQiOJc6hIpzgGPl83iaTiXW7XXeW5/O5h2yK6c9mM+v3+3Z8fGyXl5e2Xq+tVCpZNpt9hYSCEGoCD43Fe3QfVQtcJwRJMlHhyVebxvcIwHw+t3K5bNls1jFnNhKgBBiWB2i329ZsNq1arVqj0XCAiU1D/eJPdLvdjQih3+/b1dWVaw0YMiwUWgBnLJ/PWzab9VAMFJGfsfssqpJczMyy2ayHsmy0PiNwMGaCjQHNHA6H1mq1LJPJ2HA49GfkhM5mM+v1ev7/YDBw7VGv1111A4otFgsrl8tWLBbt6urKhsOhFQoFq1QqViwWLZ/PuylUplEUQVZ/5wKgjJdQCxCjx2IxpyURekFQYLGjSArL5dJGo5ENh0Nrt9t2cnJipVLJ6vW6M1rIgWsGkdTter22vb09W6/X1m63ffNGo5HnGTSDh60n3ELNg9ghaEQ1bKhSsXCyeAYlU6BBUPkIg/L4wAjI25MEUriYz0eQG42G3bp1y5bLpXU6Hev3+zYajdwslkolOz4+tkQiYVtbW1Yqldx8cG115qPYxSHmkwRx0wxdFD+f/wnPtra2bGtry2FWThYwKR/AzeEwJRIJm0wm1ul07OzszBqNhhWLRV9IbC5qi5xDoVCw7e3tjfhZ2Tn9fn9D6EDycIi4j9FotEF305CSU6/ED5ws3VieC43A6VN2EUKUTqet1+ttIJOwewgLcRrff/99WywW9vTpUzs7O7NMJmPvvfeePXjwwBKJhD1+/NgSiYQLFY4gzwbsGxJrVXhDTkAydK6UxROSNFjIbrdrs9nMyuWye6jJZNLK5bJn0IBE2SxQKuLfcrnsMTMqTuFYVD2bkEqlPFkzGAxstVo5SUTBGBIwOJfE96VSySMdngWUThm5OJfcR5iL4DPJTCqLSqHnRCLheEilUnEzQrjLRm1tbdnBwYHdv3/fJpOJ/c///I+Nx2P74IMP7Kc//ant7+/b5eWlff755/b48WO7uLiw2Wxm9XrdisWip935F0UBjyoscR/gOgFQ9a+IEg5Xr9dzx4cHA4YFz+ZEsvB49vgGSm1W5q+eNE4VmT60AfdEKEQUgbpTlg3eNH9HowFq4UzmcjkX2OFwaJVKxfEL7pkNJvYP6V+8Bt9EqWKpVMqd3FwuZ/v7+1YsFm1vb89Go5GdnZ3Z7du37b333rN79+5ZLBazr7/+2j7//HP77LPP7PLy0vGDRCLh903oGUWvD/mNoYAkcT50QcNyLYiGhCDL5dJqtZrdvXvXdnZ2rNVqWSqVslqt5naNTCL+wGAwsMFgYIVCwarVqidOULUkfQqFwv+CFBL/p9NpD4PCUi312pU8ClLG33DQ2FB9P9EEwgOYxN8J31DhHAxON9gHqGM6nXZoGFi81+tZKpWyarXqzhv3EovF7Gc/+9kGEeTf/u3f7PPPP7erqytPjqEds9msVatVNz+hE69FpSGBZoMSBoIWVYXL/5xSUr/YO2xdp9OxZ8+euYYgPh8Oh76JkBrIy49GI78xYFNQRLBtEjqAPqgvhJTFHQwG7n8o+0W5epwGzXKSNkVQR6ORdbtdF3hOD+8BNBqPxw68KMMHc6KMH4T58vLSUqmUryGfl0qlrF6v29HRkWf0njx5Yv/+7/9uJycnDrKBGbDG5XLZfQw119h8TX6FxBRlCCcBMa4r7QpLjVDHGg8TjigTJZ/Pu4SiDofDoacwye6x2GiHXC63kWvA8YzH41YqlaxUKrnjCTSqvADUvBZHsNgICouAs6lmYzqdujOIjddcCPep96axNpvA58AjUEY0pqdWq1m5XLaDgwMHjr766iv79ttvrdPpmJlZs9m0xWJhpVLJIfhyuWy7u7uv0O7C2kW0ngqE+gDr9fpVUmgUdqwXQE02m027urqy3d1dy+Vy/r8CF2gL4mA8WBYon89vkEUJ60qlknvZRAI4gZAtlPBBXkI3AUwAXwIsAPOkn4tNV2YvKpxTjfnB+SMtrBlEdUhJlIFzFItFN4ecZuL60WhkL168sIuLC5tMJu7j4CSyvth6NAD+CT4Qgs+948Brql1rFZwVHJUACku2edNsNvMFHAwGVq1WXT3zwSwQG63IFSqQ0x+WO8Mu5lrD4dA/E82DltCEjz4sOAI2n3vR+n08ZsJC5SESp3OawRIAk6CGKfqJE8s9cc8kj/gd+XrIHvwe5HR7e9s/g8MCwshnYZaV6Uv6G3NL+h5NFR5w9+9C/r3ChWH5MbYTlXh5eWnb29uO/vF7bB3ACypcbTDqGgiYBM5gMNionlHiCQ7meDy2crlspVLJzs/P3dZxH4AwRAx6InE+Qfk06wc3sN/vO7qH08V9wUtASIl02HDY1Nr0gtdpxDAYDFwbpdNpJ88Wi8WNAwnuAb+PNR0Oh3Z5ebnhkIK3gINoJBU6hBucwNDmh1x9dQx5cOz6dDq1UqlktVrN8/g4SthTWMKJRMJjfmBlvHtej/dNipeEB963ersIHJuuNYRq69hcNl1j/5ABpckkyKb4Pggtm8HnKsdAM6t8Dj8jIAhxIpGwQqHgryNa4rWEi9ls1kqlklUqFTe/Z2dnjsdkMhmrVqtuprSwBzN6XeVU8nUtWLRsilOEpBYKhQ027d7eniUSCbu6unIqNeEZ7ysUChvZMz6DRUEoFIXUh2IxST2DHmryhw1E8wCzQlPXjVFBgbip1HI4jWTx2GwgcVSsCp9WILE+vAeNqn4MGoT1x2QB8+IMT6dT+81vfmODwcArtXBasf8ayoeV1VGb705gWBKGpCLNWj4FcxZaFhCsMlQUhOEE8rAwXzEpePzqwOAo6TUgPOqJxz7yN8gjLOpwOHRnaLlcuteM567EETJ/EFlwUOHhq5etnneIF/A6NgHhQDXjcyiHQXmQYAgIYa/Xc0LtYDCw7e1t29rackHDjPR6vVcEIOwiEhbCbpSG6QsgNnARVAmOhmLMUL3UYdJKFd4HeyWXy3kxRL/fd44fsLGig4AkYUxPCEclEf4Dmxmmc3H2UOd47oobAGlDKAERVGg5LEdXRwznk+gHnoUykObz+Qb5hChFHW8E7/Ly0vMu5+fnDibhNxGF8D5Q2WKx6GViVAkrOBR2PElG9aaJx+OO2wM0KIhAGEIcS0rz8PDQGo2Ge9nq7CH5gCMsFKcbu0r9u7JeWCRSqnjrqExsPGqewhKcLZJCcPEwbYBASidD4OEjwkxSP4mDQkEMrGYioHa77YtNKIlQazIKv6JQKJjiMUQ+8Co0la3JN+BpyCOAaVoMEoJAYWeyZBRnXF9E2KY5cxw6Ejnkv+fzuTUaDU/0oKYgi2rcjKc+Go3cs0UIMBMsEF47n8sCF4tFP4VhEwp9HmwsWARIJWaEjdPeO5goHEBUuKZ/0Q6qxjudjucCNErAbivXYDgcerkXIWqv1/MNxoFjMwGXQo3C37WgVfsKRYX6nuDLZDJ/GyUE3HgID+PV4zWTxOh0OhseMckWABjsZdhsCmcL+6cpWh5EmzpooQY8fT5L6wUIvwCjtJII/Fzts7KfqYRWUAffh/doKlqjAoSD6+OHABVrpY6matGUHD78I3V+sfcAWJhO/JyQCazInxJkN3o9ROWIkXqyfJy2DTrx708ETgdqCMnudru+mHr6QOU0aYNXTZ0B94AAoW4BTzAfhGkqMFqNk81m/b6pt1e4O4yfgYa1PI7nw4lVmpmukyayyPghqFQ+AUhxTXwJTSFzD5qFJIEFGKRMKD2sXEcPYtjAK6SZJdWx0rw231Ob3mw2LZfLWblc9kwWN4mztVgsHCdvNpt2cXHhcTwnFsklG8cDKhSraCGOpJaO40ySgua0UMqlKeidnZ0NbAHgJ8zwodLBNlRLEfL2+/3INCvfEzJqlw6cNSXOoraV/4BwIyjkGVRzKita0Vqc6vF4vFFVrdB02CrPcZ6oJohqB7VSl1PLjYdJETaSm1sul/bs2TNbLBZWr9edxIBNVaKmEi1ZxJCujaSHDg3ZRTQGwsRGFItFa7Va7jtoVhHVq6GTNpAoFApWLpc3IouwoQXQMHQ5hZUxAUQrmtLmWooXICSsgTpzbCbaKuyHoJwNbU6hvI6w21vyujax3Bixv2aVsOvKR+MkEJ6Rsy4Wi9ZsNr0wFBAJB04jD2w9to3TgDYgQpjP59ZutzccSd4T0r1Qg/V63drttqOL5Cj0FIYVRYSkULBCRm06nbbd3V3nRHBNIhvNxmmLO4QeBw/ToJgCTi/PCEil8DKCo4QdzKtqFu28ErbpSV7X1pSbZ8FB87hJLbNS+0WWj5CmXC67Q4QdRl1pjT1eOGYFaUetad884FxUc7FYdGYskYl20chkMlav1204HFqz2XSwhetwigqFgt8fGobXqs1GpVYqFc/SUQ6mGgYkD22iEDQwOVouDNnCSElVOYLDSeeQsMGEkGEz7lAAXtEAYemQEiVHo5G3IMEBU6+Wzbq8vHRBgRuITbp3755LM7ZM26ngfEGd5tRRWo2NZZOSyaTduHHDYehut2utVss9ckrZbt++7ZuLAHD/OFyq9tUOU52s/YNYKw0nB4PBBoaB/YfEodnSMLTUBBsHQsvllMOgvgfaCR8LB1EFWxt2qnZ01DDsDaTsEsIKkCVsG5Idpli1nBr1pNk+ECytK6RQQr1TIgJt3gC0i53nQc7Pz21nZ8cODg4skUhYs9m0VqvlDw/jFhDlyZMnG02UtKePLhrOKwKvzB+ej2KMb7/91k5PT18pvADtxBSioXgdIJDCwqq+tXsahwUsRJFXTUMjPJgCbaSlbWM8GrkuT6xvRJ3zIKhuPpyNB/YFoEAtKhmDUiZFFzVeR0rpkaMOJk4ZThILdn5+7lWy/X7fzs/PPeTDPGQyGRuPx7azs2PT6dQ6nc4GWql9DePxuBWLRavVahsJLIWoWZfT01N7/vy5lctlb17BsyNAnE7YRBwYoh1COU4yWkDTu0Ds2o5PcziKl6AhNebX9LBWfyfDduvalZoXEpuSsODNmgbV6CAkRlA9w41j/+kGQi5ds3qoX/L4OG4IU7lc9n56JycnfiIhT6B2i8Wio5GZTMYODg7s/Pzc4V78F/6vVquOIaDteBbMHZS3eDxu7XbbisWit9ABlEK44BgSLfA3TAwkETQjf6c1DE44lPRwyoo2fML/wQmn7gCtElkdrAkCJVrSrAHkiQRHsVj0sm9tR6perjZj1KSJtjrF8+VkE5sjEDh/8Xjc8w60m8G5I3EyHo+t2WzajRs3rFKp2N7ennU6HdciQK1ci+wZAofw0cAK+pZqwul0apVKxelqtVrNLi4urN/ve+JGMQGteUD9a94A86RriGOrJBXtTYSvQtaVugMAJ91HCCNoOFX/G+2A1uv13143HEEbHKKWifXJd8NfUyIFAoHfoIAGYaM2jETtqQcconDh3BwWW9OeeL74GIRpuVzOrq6uNihiLCYNmPGi6ejBPfFsy+XSbt26ZT/96U/t0aNH9uzZM3v69Kn1er2NlrFhf2Ht8q10d7x/bDaePYdFW9Jq61d4FcrQDiFvnGHqNtkvADJtZHEtKTTMDuLJq7NEXRsqFx9Au1PxN806AhGjWQjzuB7eNIzjVCrlqkzbw3U6HY+3i8Wiq7ydnR371a9+5bafknbg3FKptJF6ZXFRscTY0LbW67WVy2V79OiR7e/v21dffWX/8R//4RAtMbt62lpXyNpQhAPzR3MC2WzW6xEQEqWn6yHSv+OnafFNOFQiqvm14wDhL6KaCeDhg2tD9ZEuVVUAACAASURBVA67UOlNYuOw50QU6ohwXR4mZLLg1WKvySqenZ15WIjq7Xa77qS2Wi3b2dmxX/7yl1YoFOzbb7+1yWRip6envlnKw+OUl8tld/qobMImHx4e2s2bNy2Xy9kXX3yxQfve29uzer1uV1dXNpvNvLRsvV57M0g2qdVqbaCI1P+ToEIQUe/KiELda09mDgDrqagop/51X8m3mZjB5mKv2XxNFfMzsWooddTDA3qogCjIAX8QAATPmqYUJycnnnINPfLhcOhgT6/XswcPHtgvf/lLK5VKNp/PPTfRbrft4ODAaw07nY4nV9gEFhZNtL+/7899dna2AQbt7e3Zcrm0drvtHINKpeL+w/Hx8UbpPP6OpnYVjuagof2g0ysVD98Hh0+7izebTccDwizvdxaAEKRBpaEmcZbwZEHyFBjRxAb5A62goW5AByCAD4xGI2u1WnZ6empnZ2cblKpUKmWNRsOxfzTEarWy09NT+9d//Vf7oz/6I2s0Gvbhhx/aixcv7Isvvtjosbuzs+PPpuQS0DoiCbxyml+yJrVazebzuZ2cnDgC2e12HSRindAku7u71mq1vLW7gj/L5dKbPCkhFdgc1R/OIAJzYM0hlLzNV8LM/vZtXogah7oM+0SLKJTkGTWpAx8CIcEhhHnDyUD19vt9a7Va7vnjA5RKJfuzP/sz+8u//EsvpNjZ2bH9/X1Lp9OuNXq9nn300Ud2584dV7lffvml3zebS8wNlR3WEM0Y79y5Yw8fPrRMJmOff/65ffLJJw6ykCWkuwfaiI2nvQykkGq16j4PQqw2XKn5YcMn1UjqbGtKWRNA4fST72UCVAOk02mrVCreuBgcHpWkdi0kIQJEqBnARuG9Q98CPGq323Z1deUVQ2zcz3/+c/urv/orOzs7s7OzM+8qVqlU7PDw0FKplH399dd2fHxs//zP/2wffvihVatVu3//vv3kJz+xjz/+2Pr9vtVqNff42QzCT4pgKdJgLMtvf/vbjSwmIZpmNxXp03yAZv4Ul1eOAGwixT0UGFJCq/Z05jAhMDicSmz5XgKAigfVggeooQfaQSuIwL5RY4REYZWtMnnoG0ivYcrNC4WC7e3t+Wm/e/eu3blzx/7u7/7Ojo+P3V9YLBbWaDSsUqlYuVy2Vqtl//iP/2i//OUv7Wc/+5llMhm7d++e/cu//ItrpGw2a7VazcEo9Zwho5CNbLVa9uLFi1fGy4EbtFotz4/QDhbNpVR7soZsuFZbcU/KWdQwkJONxlU2NWSUMMP5uqGabyUAePWUZCFdQL1g9oAYnHht1ITaw3GhzzCADeQONh+7jgdeLpft7OzMSqWSffnll/Y3f/M3dnp66vxBCJfcG6fw5cuX9umnn9rDhw+9OUWtVtuAmUlPg+ZhfjjBy+XSLi8v7fnz53ZxcbGBlwyHQ2+FB8CEo9btdu309NSfN5/Pe5dVNlB5f7lcznsS4DNganXcnCbYeFaIuRwcEmdhNdB3FgBOLYkdbpTFxB/gxrVVnI5N0Ro56M7MuVFvn25aqMTt7W07OjqyVqvlTiIhmlbjoHFAF/Hizcw+/vhj+8lPfmJ37951RhEJo9lsZpVKZaPog+vgC1CKReMqzcqtVit3TvP5vDfKbrfb1ul03DGMxWJWq9U22tLpM3D/FH8Sqob5Fg4kzweaiXMK+KPh4ev8gLf2AbBH1Mbh0NDVilAPXqAieMra1d44eO3KwqWlChD07u6ubW9vW7PZ9JkE+/v7ls/nvU/R+fm5FQoFe+edd6xYLG4kg9brtZ2cnNgXX3zhC1ur1ezs7MydJMgWACgIhTpWWhkdptAXi4U3hNTRcOpAc69XV1de0qV+ElpIwzz8g5Bsi0lRB5rZBjibYBFKZP1BAhCCRYRJ6iwR4uGIaEs0tUcssgqGdt8EnKG3D9y+eDxuFxcXls1m7e7du+4bpNNpq9frtrW1Za1Wy5rNZjgazU5PT+3evXu+uRRQKF9Q+/5Rb4dHn8vl7PHjx3Z6eup2lzZ3hKZRi0wX1Nu3bzsW0e12N7x57LwWq+APhA629kgMKfE0vFD08XUO4PcWAPWAsUna1Im4VeNbJTUqQgUvHhAEFc/3qOWjoyPb2dmx58+f2/Pnz225XHqx5P7+vs3nc7fR4O7JZNK2trY8cfP48WPb3t52zQURk3sijRoOoKa9HQSV1Wplt2/ftp///Oc2n8/t5cuXHqri2HL/jUbDGo2GjUYje/78uTd+UHg8RF05vVrgoYwewlVtdknGUBtTkgR6HRr4vQVAhUBbwK1WK2s0GhtMmjBWBWAB66aJtOa24eGTH6hUKvbo0SPHBl6+fGlnZ2cORmnWi82/efOmFYtFm06ndnJyYt9++639+Z//uR0eHm7M8AkHQcAd4F6/+eYb+/rrr+3Fixcewu3t7XluAObR6empHR8fO8iDxvvmm2/s2bNnG40zdWillr2TNldIHb9AtYD2XAAkol6T5JMigf8nAoA5wHFrt9t+ksrlsjeC1N45IG3a3RpJ5oShVrWefzKZ2NbWlt25c8eFQlPMGmd/9NFH9hd/8Re2v79v//Vf/2WffvqpnZ2d2dXVlf3mN7/xTmXgEdvb2+7MaqfSs7Mzn0vQarWs1+u5k9jtdu34+Ni/v7i4sKurKzs7O3PCKr2VNVJRnAD8gWrgarXqHAjCT1S9oqc6cg/HudfreXNJ1chRDaJ+VAFQdUbcDI+AMiw2Rjt+8X+hUPAOWEC/JHpIFtGF/L333rPbt29bLpezZrPpI1XT6bQdHR3ZL37xC/vVr35l9+/f99ielC1q+eTkxEGsdDpt+/v7Vq/XPcXa7/e9ATbetpacg8E/efLE08gIhxJlwzGy2o9Aq3lyuZxtbW1ZvV73WUHK5tUkmYJHMIza7badn59bu912kxwV+n1vHOBtv5Qxq2FNpVLxn4l5MQsQIaCJkchBELTbZywWs//8z/+0er1u7777rj169MiTLnt7e3bz5k3fWDz7Tz75xD777DO3meGsXvwBnFXeCwDDvRK26exETh2E0LAdW1iJG85XZs3IM/CM2pFVu4MgkDjQYP9MVQG3CNnDb/r6UQRA6+P4B5FyvV57HyFGukBcAIZVyhmA09nZmTWbTcvn8xsNIcbjsXU6HXv69KndvXvXkbdkMmm//vWvPa1LeEhH8t3dXSdVagsXwij1N6iG0l482igSzl+/3/cIQWsZFPELTx4ADtpPYWhCQzQIEQFAkPYdxCwS98NS0qZR4AH/5wKgI0wJD+mxQ5NmNltn2yDhODjkznGA+L1WFnOKmESGiVGzAyrGpt28edN5ftTeA1NfXV15h7KrqysPq9rt9gYHkdY3OkiC1LiqbbANhXcVOMKeF4tF297e9kER+jmQUnXSiY7RJVmmc5N0LgIb//9FA6C2wslUWkYGnw41TNysXDxqDpQkyoLTQFJ77ShVClWKH4LK39vb8w6nV1dXrmHYFOz2fD53u688f9Qsp5AKITYILafOKwAZI294Fl6jgx1Wq5W12+2N3v48jzpuCAcAD+tCvSTUNqhfb7PxP4oAhMObtW2bti0D2ybLValUNhhGmiWjB7G2VwnBErSExs3k5jVkArLWJtKMalNBzGaztru76w2vOEHMJ9J5Q/g0nGpOPGBVrVZzdc6mgHNACiHUZcMY+KCkTy2708ZWaFvtR6RE1O+y+T9YALSbuA4oiCq9xnZpBpFN0qnXpVLJGo2Gx8WYg+FwuKE5MAnMHaTfPvV0mBiEq1ar2c7Ojq1WKydvLBYLn2ISj8et2Wx69rJer7tDhbMHtqHdxbXnMIKpcwS0lbuOvuV3PD//a/ZPi0C01AwtqLkHravUXgBvhQOETSLf9KbwPdpiXtOUABRaHcsD0BaF7KDGtDiOZma1Ws1LzTEXyj2kTW29Xt8Aj/Dctdki7eyVy6hVN7FYzE89/ARiarRCo9GwWCxml5eXXstIBxMyjNQXMFVU+Xm01UcjaHUvCTatRQwLdnQ4Ns2mdZq78ileRwbdEICQcRKGMK/jCeiNsdG6wPwepA1vHnWueYKwvSuOJKeq1Wp5Z3KkXMfNQIciHsavgJ51eHhog8HAnj59aoPBwIrFov32t7/1xed90+nUer2eHR8fb8wMaDQadnBwYNPp1Me2VCoVq1Qqtr+/b1tbW96QgkLRQqGwEcpholTolAOgtZba0EqHXHNQlEuhdRVKHVNyTqQAhBOm9MWaz1dh0FkCesrxcLH1LCbUcR3MCIKHLQTG1K6gYTNm7QKGc6g2kmpkHCRYsldXV3bv3j3b2dmxd955x0ajkV1cXPj0biBYnWgCT5Fnv3//vv3hH/6hN3UGH9ja2vKws1KpWLVatcViYS9evLBer+eHAdgcmFbL6nXGj1ZeAxgpt1Cze0Qp2r4W+pmm5TWCeGVsnGLWWq8fOnZKXdJ+dGysxv+a09ZetdgtnCAWgykjqC/tIMqDQnemho4SLrWF9NrH6Tw9PbXlcmknJyceGRwdHfl8wn/4h3+wZ8+eucqkyIVIgOu/++679qd/+qf27rvvWiwWs5s3b24wlI+Pj+3i4mKjqghvn0iBGb/UG2itoU4rw2/g+TGpOl8hnNymCCRmLao/cFi8+vs9TL5iE8O5gcrl1wFFYYGCUsUpXYLeXCqVnOaMetSCEgAhHpze/TraleHLMGsI8ba2tuy9997zesF+v2/Pnz+3VCplN27csAcPHtjOzo7dvXvXp5ZhGv7+7//evvnmGx80BSwNoPPgwQP7kz/5E3v48KHVajWbTCZ2fn5uZ2dn9uWXXzrggj9ycHDgJWS6ljjC+XzemVXaDIpKYW16rb2VcTDDTB/aCgdbm3WogITd09wEaFdQddiUyKhVPVr1E1YR65RxiJSq3rB5FD3gSVPVQ/k3Dpj28tXrQ96kMxlcQtR4t9v1NC6TOUH5mLZlZvbo0SMHkL766isnp/B5lUrF7t69a7u7uxaLxezJkyd2enpqnU7H0um03bhxw2sm6/X6Rl8gnFEqgNComoQiCtB8gQ6vRiAVGlccBLuvGlYHf4Ut/yIFQHv2aP2/5qDZCGWfhqxWtIfCuTBoSL1qIaY2kdZWKdg1kDDat1KUiZ9AIke7mXBSYP1cXFzYaDTyaZyUkt+6dcsX7Pbt29bpdOzi4sKeP3/u6jSfz9sHH3xgN2/edESTFPPBwYFrLIRaR9lh43F0da4ybF80gA6Z0HpCDfVUfYeTP/TUh/Wd6t+pEGwcqnq97jehHayQUOWp83ft+KUOZMhaCSdXU/2C9Kojh93iVAB34lOg8vAhVOohhzBRQ3ECFpV709CJ59vd3bU//uM/tn/6p3+ys7Mzi8fj9u6779qHH37ooSWRAiex1Wq5FiJtC4WbfL7iG9qMChhZJ6BroYcW5Gqzae2UzhpQSKI1m8oI1v5B4Rj5WCxmSQY98QFawasl32rLUHU6RBE0LlQx2o9GsQBCHxYr6kQg3WQEydrpa5WNfH5+7rOJEAz8B/LtOmO41+t5k0umdkM+rdfrfprhMBK9LJdL5ycy+DmXyzmFjA0g/uf0q33m+XSolbajp9wrbLKpWUk0MmtCxBSOhdE2t684gaVSaSPUUzukaJoKgvbWi5o4rhpBgRu8f8UclPqkdYc6c1B5e0onw9OmglbvlQgC2jnMY3oVLxYLu7y8dBIFQBO+SbfbdeeV59WUN+1hcHbxMxSy1aYXIJKaqlU+H6RaKpv00OhwakUJWTMtog3nAoYnP+zUmtS8d0hG0M3Um1YGLaefEIeEiBIXwOEJX+h8rZ+n71GqU6/X81gXDh8pYO2OoRQrunIQOZBta7VaDgErCxmTpk2ZIaEA7GiBBVqAhWemkZpGjZ6y2ezGVBFtya/VP3yxycqn1N6GIWSsRTdKxdcDG2plNwEIgPa71y5UattxcpRYwQQrat50cZVSrmXL6tHSHBqzAyOYSIBuXIVCwa6urrwlOqcDNV2v132aBu/Vnv2ocO3zq3Q2yCpbW1sb7XAo9NSkE30LwlH2bAb8Ai1xRxtoZzUlniiDN/TqtV5Bcwv8HI76Cb39UAhUaye1758WbnBBBYeIdZE0hhofHh76KHRt0c5D9ft9582jAXRGgGbBtFduo9HwPj6EeDpniEEOW1tbbqvr9bovrrafQYgRYFrPwaVjwiil5CwsAkYPIcJbpb/zNz390MV0Wil2n+whzwRYplpFeQD4SeQe1I9C8KImvkT9/4oTGE6aVlQpjEk5+bQpqdfrdnh46ClSnf5N/Nrv952Qqb2Ew6aFnEZ1QrGzxWLRbt265VVEL168sKurKx8rz0RxCj6SyaTXCSgsjG1U4dRCS04o3ruGt1oRrdM62UASQXoSaRGH2WIDwT1Go5GXg/HMFHfosIr5fO6+js4SwhTomkY1g4wSAHcCQzuqXiwLpBoCgaA3H+VOVKZwQnWOADV/2iufE8rpx1bS1bNWqzlLdmdnx1O6nU7HisWiHR8fe4eu7e1te/fdd93Ot9ttz7hxYsg9EIlwGunYQY8DGMmz2cxTrfP5fGPz9URqzcNgMNgAgWAf0/6F6WOwpunnw2fBStYBFth2spSEwZgpnTqGA61+VJTtj8wFXDeLF0dPYeBCoeBMVnrlgburwGAzaaMCJ48iBmraKBylxvDu3btebKk1CIBJlKOR2mWIImFXu912rz7s74cPwQkiT0+RCnX++XzeGo2GF4dq8ynWRImuSmBBu7Tb7Q2uIyggjRzwWyjorNVqPj6WiSU4s2AnJNbwCarVqkcrHK6ws2mIx0TODAonhoYtTNiMfD5vu7u7tre35ySK58+fW7/f3+CuK8OFLhrQxqkRVNCC5hMkknSxIV2s12unT8MeoukTPggspND7V8IJiKIOuNY5RKhknfaJkJCMwTYrcEOGUDuIE1HAfGIDobtvb2+7Cbm4uLDpdGrVatUpcJhiQj91vqk3hA2tXUQ0dA83XSOaJJIbzp8Np4nxb2dnx46OjqxUKtlwOPTJ1rBpGYbMZtK4WDtXqqOjgA/dNCjBRqKx05gEyKS8jzicTdN4XjUEPkmr1fLNvbi4cJXa7/c36gFRqdqyheeAL8jzaFcUhc77/b6XwuvUEW2gTaka60j4qlpPQTidEKIhofpPYV+AqLFxv1/X5MbUT3UadKYedW63b9+2RqPhwIeWUOFA4ZjQGq3f73sRqaJTOnYVh/P8/Nxvrl6vO0MmKrWMzUTiNUTKZrP+mYSWvJ/PpCMYG0tDSVWh6q9At9ahGqSv8ch1PjCDM/hcchya54dyhlkF8k4mk9ZoNNxH0LAPbYWW0MYShKnheLgwRHQB0IrSMG+sbWIZ6gzjlQoeSA7quOh0cZoWYOcAXwqFgmMHvF4na+K0gQ4SJkWlN9XOaeME/AxidnL+mJjlcumOZbPZdIYPm06IDEVdu6VpJ1P1BxRNZaIq96CDrkKnjOtVKhXfj2q1ant7exvFrpq9DdlZ4Sj5qInwYbVQEnuEM4Oq00ERsFaxV0rgwLNlJBtEEN0AbGiv1/NeenjvtHTR/jfK/lGyI/dXLpdf6WccBX2GKhFKuHbdhjlMFROntdPp2NXVlXU6HW+EwVRUaiDJTUS1bsH/KZVKXiehI2HVWdRMHu1s+R0jYzWZpB3bwxOuML6iuNcKAKoFR0sbQ/IguVzODg4ObH9/3x0oJR8OBgNrtVqOvhGC6ciWxWJh5XLZHSgAIpwkJYHSekVn/GjffG2qqCPtwspbhbS1Q6n25CMzhybCwwZHgL0zHo/d2Vwul3Z2duYhG2APhJUQStfZStp3EY2h+X1yFcVi0ckpCBEOJtcja6r7RnQQzn2+lhSK1BEr41ThpeN0lMtlV4Nal/bs2TNrNpsu+bRuB6zgVKXTaSuXy7azs+PAiHL+BoOBpdNp29nZ8Qfls8IUNZogbN8e1dUsNGtcQxdG43pOVbFY9HIysA3wjUePHtnjx4/tv//7v+3ly5cb08hR19w7k1Y1eaat4bRCWodWcX/ML0ZDo3kQYlLROoyCz7rOXG4IgDJTtVMl6V6cCy3WoIiTQQk4iNls1q6urpw0Cfdue3vbKpWK4/HqBMK+JSWLpGubdmywIpNhgibKf4kalBhVyAoIFZZvA1wRFUBFAwmFkk5Bq5JIVYPp+DvN08N9pKsZJkW1FllM1W4ahjIJhaykjrsLJ5xEaYIkJUsaRumg43Q67V0uyLQ1m017+fKlXV1dOSGz0Wj4Io1GI5daPNrt7W0rFAp+85x+2rW8fPnS4+hut2ulUmmDiMIGQRnTiCCKABlOQrvuNaHp0BF6G23Vf29PdVpKqVSyBw8eWKfTsXa7bc1m0712+vZoqzkQUcI6nYWkcwSUZl8sFr0IlcolzJJODNE2dJqO1iFUkRpA27ihQrS4EQYuJ2EwGFin0/GGSDs7Ow5IMCNHR7cRA+OBY2u10LNSqXgVsNLQFIPgARDU10m1aoHrClrC94c9dfX3YfELCwwgBdyt9YsKVNG48cmTJ/bFF19Yr9fzzdXaSp5ZfQOtkSSFzqR25W1GCXw4KDoUbDOzJPZeY38dvAj+jTPG5pG6BYTQUmdOOiEizQuo5yf+Jv6HSaxxLOowHHKgUv+6jY8qbLkuXXrd96pKNWmFX0RKm6ojHDJOsWYuKUTJZrP29OlT1wzaWFMLa3VSG7UG2H7WSec1cR1FD0MGUNQaJCFf4lGTQtUhyQgJrFlei2PIB8HaQTKpsKHrxng8tlwu59RuRdHK5bK3aydmZiG0uDPqZIdqPIwGNNn1XSufwxMTOpPcDz4La8ZpY8IpG9loNOy9997zg6RNHmA7gTNoGxhNZOHh46Dq/6yVmoHr6gIcCAodKwQADxNnjU4UyqRBihUQQYgUqmVB6f8LsofaL5VKtrW1ZXt7e84DDIcmauUsDpVONSE8Cnv4hQ7RdxWC6zRN6EzqJBTeq8OwILUCDgEAtdttOz099XVDMGiVQyMutCQzB5VxBTLImod0vdeGgUoCYfMpVIRgMRgM7OzszJ0cOnlxw8ToPCxhIPkAOPHn5+fWbDa9iyaZN+W+aUmZJk9QeyB5Oi0T1fv/4+t1miH0KdR84GdB9yLKYOCVAkm0ziXNrvUX4C3UWLDOShQJi0uvFQAdlarACoALOfJOp2Pdbtfa7bbj4bPZzClUOsVbawNyuZy3SwV6PTo6cpIIqg7J1aISFQQWipOk3rq2onvlAZM/WhukDW7+63yI1zmbOHV60NQBjhqfE3YG0RoL6ivK5bJfSwt33hgGsvhadswLyazh+QPKcIMvX760fr/vBRpk2HTyGJ6uDoTW1mjQusgPwDSiQ6i2a8XhQhCURBkKQFQs/GNsfsjk/a5mRDEX7ZqGWUWjcnh08igOJS3ydMCGtpdTAm+UGVBhSKKqASxQVWrTYLZoMShtVV68eGH9ft8ODw8d8MG2U3WrvYNAu0h8aOVMqVTyf/gNIX2c+QQKKEWd/uuIkj9U7cN6ft2pepMghWxdVe8KYlEVxGcXCgUbDodeTcW18DNUIyqLSyOG0IlOggEoNVl7+iJF2twRm02fuuPj442RrtgjcAMtdOB1Gl6hEknMkIdXzxYToZ1BgYPDHkWvc+DedMKvwwi0+AIBeNvrX8fYjQKy1JcIJ4hoOx3lVugoWZ1Ypn9TjbhBCsWBwq4oX15Hu2KbsDOkLSeTiV1eXvo4Vs1SUfWCv4BHr0AQGT+SMuT+EQKlqmt/Ae3H+zab+LYnPAoNDLt0fVehCnsFvs45ex1iqRVGWgSi1H0dSqXtdJQUu1EXgErRiZ84cMDBKkU4G7PZzOr1ut2+fdtqtZpz4Smtos2LpnIRGAAgHDrlIiiYlMvlHEVE7elmaCgYhft/H/Wv1w3RQK0njIqto75/HUbxNgIaFV2w2TCr1IygHbWKWGsP1YeJxWKWhMnKw4Pusfmkd0ulktewa6KkUql4OROVN2dnZ45+gSKGiRhMC2lQTe/qiBSIJ9qrX/+9LiT7Po5eWAKmqValkL9u80MgSkfrvgmqfhvoWjWUIpQcEK3VVO2jmsFR1cFg4PN0ydNz2qfT6cbwZn1IcG8yeGwocf/x8bE1m82NGUPcoBahUi+o49iVc09rVqIKVWPXER1+aOu7KMw86iSGqj38m45+05F63/d+Q2hbS/b0HrT9DL8Lexi7Cej3+96ZAzuv3axDM8BpJURjQ4fDoR0fHzuql8lkvPASyJhYPpvN2vb29kZjJKja/E7DGBg5YcdN7dwZRX58kyaI+nuo/tGMSvyM+rsmdcJZflra9UOFNXx/FOU7bNmnLf3Ub1itVr9LByu0CEEDG0NzIxI46l3CXKVNC1yA0WjkDRNh/AwGA2+ipM4e9oxCEPh/+AaJRMIajYZnwBSxVAfwdZm/60xFeKKi0qakazVUi+qUHv5Np6L9mBoqqkvrdbhE2NgLraCl48lwYdRhgCmjw4m0BbrWtpE5hCHDe7RrNYUPzMYBAatUKra7u2s7Ozsb7c3wM6rV6kZvvTCOfpsQ7nWp4+tGrKm9jUIU1Q9Rc7RcLh3Gns/nG/TyN/kO3yfCCFvLXnftMHu4Xq8tSfiF1ELxLhaLzuHTRgUaKuEVU5qUy+W8Xg8Onzor29vbrhmAfXO5nO3t7TnhlMhAoVL4AkQTav/1wd9kp68TBBZEZx/qc2oLl6hiC1XtmEwGN2hq9k3RwY+Vj3idVtS1W61WvxMArehRlYetRWo4gTpAAQcnn8/78AbYxEgnHL/9/X03AWANygwmsYNPAsRZKBT8c0OuX6h2NfzhvlVFR/kLKiBRIZt601Fcex2YSSpXO4OGTbd+LC3wplz/m/ydeDz+uw4h8Obz+bwDLDokWgtEiOdxbMjW0Q+PDVRnkPQkzCGkUOf+oYmoRZhMJt5ujeJKLVOPsseKE4SC8aakkJ54fd+bSJX6euBvohayf6GjpgydH4pYDgR4SwAAA9dJREFUvq0AXfeepJZfkQ8gw6QZNeBazAFlUQgE41K11z0LCFuIIkZwftq14xRqJhLbqSPkON1aGKEPH5qGsE9R1MnTcbZRztN1v1fnSpk82vFDtaoOh/4xVH+I6n1f7ZEkXIF5w0biC4AKalNHwsV2u+1gES1iKFakTSv99nTaqHYl0evze04sMwHRPho1RLF9o9RsCBeHm6/099f5E6HwYAZD6jl+lHZQjRLAEGz6LnkFjVjeNul1nclJku2jwQHJGLpta/MBHWUWdhidzWZWLpftnXfe8UaOpI8PDw89vQkxFC5BNpt1SrQCKL1ez4tBtahDgZq3IWdcpzIVliY9HUUvuw7CxVGN0hAbSJvAttqp5Psmrfh8vcbbIopRWi1Jipa5uKlUynF9VDUOIE6N2mvIIJlMxu7cuWP37t3zkS7dbtfq9bodHR25KkSTgPejcSCehCHkhrQG6FYYir0poRL6C9quLQqajWIM6+mLQgy5njbLxJ/gfdfhCT+UqvZ9vpLaIClkqLK5+ANskjZ/4GGq1aq98847tr+/7xmp0Whk+/v7dnBw4IQGTgVevuYDOOX03iUFi/Opi36dQ/VdnCJl57xJlYb2X6MjVf0IqvY5oEYSk/FjbP53jSCuZQTVarUNLoDCvYpoEd4RJdRqNbu6urLJZGLFYtG2trZsZ2fHdnZ2NtBEql7QIjrIQZNQVL+gJcg9AENjV7W9XFRPgyiELzw1uvnaZet18bT23VXYl4wc6e7QqYUers0tfyj480Mynq/4TUz7pnw6HOaEh99oNPyh6caJEzibzRzkIU5vNBobuQKcJcid+BbgDrSSo4S6Xq97VKKUcBY1PMlvetiQJo4ZigKUov7XieDq+IX9A3Bsw1lK2sXz+2y64hqvYyq/TfSg2jSpDlZIocZJgpqEyoeC1Gg0vMffL37xCxcSTi3onTaGDAdL4KljimiRgu3UodSh06Uz9q7L7SsdShtghckb3eSopA9OXFiQCt+Bg8Azanipn/tdPf7Q9CgjKep1UaVtobbcaAoK81ZbnELDGgwGTsTQzhU4g/V63SaTid25c8c++OADr5bRChotpcIGcoKippVAO9OfQ3KjkkJoSxOVjCHJpZulsw/CEE0dwzBM472hsCEY2sFU/QLNw1/ns7xp83WMz3WmTVv5hc/1WicQ+HI0Gm10BaFBojZooM8fSGEul7OHDx/aRx995CxeYn9UJaoeRxNgJ+xMhunR9ueoVgoqQg0QcvS+C+PnuuzZm+YkRUUTIeWKk6rZRAT7u1LUtCtK2Eo3Kjp506SwUDv8PzpGIdvjPcPUAAAAAElFTkSuQmCC</field>
</record>
<record id="employee_stw" model="hr.employee">
diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml
index 5d4c2ae9d45..6253205eb7e 100644
--- a/addons/hr/hr_view.xml
+++ b/addons/hr/hr_view.xml
@@ -205,25 +205,6 @@
</field>
</record>
- <record id="open_view_employee_list_my_kanban" model="ir.actions.act_window.view">
- <field name="sequence" eval="0"/>
- <field name="view_mode">kanban</field>
- <field name="act_window_id" ref="open_view_employee_list_my"/>
- </record>
- <record id="open_view_employee_list_my_tree2" model="ir.actions.act_window.view">
- <field name="sequence" eval="1"/>
- <field name="view_mode">tree</field>
- <field name="view_id" ref="view_employee_tree"/>
- <field name="act_window_id" ref="open_view_employee_list_my"/>
- </record>
-
- <record id="open_view_employee_list_my_form2" model="ir.actions.act_window.view">
- <field name="sequence" eval="2"/>
- <field name="view_mode">form</field>
- <field name="view_id" ref="view_employee_form"/>
- <field name="act_window_id" ref="open_view_employee_list_my"/>
- </record>
-
<menuitem action="open_view_employee_list_my" id="menu_open_view_employee_list_my" sequence="3" parent="menu_hr_main"/>
<record id="ir_ui_view_sc_employee" model="ir.ui.view_sc">
@@ -350,10 +331,8 @@
<field name="arch" type="xml">
<form string="Job" version="7.0">
<header>
- <span groups="base.group_user">
- <button name="job_recruitement" string="In Recruitement" states="open" type="object" class="oe_highlight"/>
- <button name="job_open" string="Recruitment Done" states="recruit" type="object" class="oe_highlight"/>
- </span>
+ <button name="job_recruitement" string="In Recruitement" states="open" type="object" class="oe_highlight" groups="base.group_user"/>
+ <button name="job_open" string="Recruitment Done" states="recruit" type="object" class="oe_highlight" groups="base.group_user"/>
<field name="state" widget="statusbar" statusbar_visible="recruit,open"/>
</header>
<sheet>
@@ -374,14 +353,14 @@
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
</group>
</group>
- <notebook>
- <page string="Description">
- <label for="description"/>
- <field name="description"/>
- <label for="requirements"/>
- <field name="requirements"/>
- </page>
- </notebook>
+ <div>
+ <label for="description"/>
+ <field name="description"/>
+ </div>
+ <div>
+ <label for="requirements"/>
+ <field name="requirements"/>
+ </div>
</sheet>
</form>
</field>
diff --git a/addons/hr/res_config_view.xml b/addons/hr/res_config_view.xml
index 7507665c96d..f370b26139d 100644
--- a/addons/hr/res_config_view.xml
+++ b/addons/hr/res_config_view.xml
@@ -69,7 +69,7 @@
<field name="module_hr_timesheet_sheet" class="oe_inline"/>
<label for="module_hr_timesheet_sheet"/>
</div>
- <div>
+ <div name="hr_attendance">
<field name="module_hr_attendance" on_change="onchange_hr_attendance(module_hr_attendance)" class="oe_inline"/>
<label for="module_hr_attendance"/>
</div>
diff --git a/addons/hr_attendance/__init__.py b/addons/hr_attendance/__init__.py
index dadb043e016..feb32e22792 100644
--- a/addons/hr_attendance/__init__.py
+++ b/addons/hr_attendance/__init__.py
@@ -22,5 +22,6 @@
import hr_attendance
import wizard
import report
+import res_config
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_attendance/__openerp__.py b/addons/hr_attendance/__openerp__.py
index f47b0900fb6..631880ec73b 100644
--- a/addons/hr_attendance/__openerp__.py
+++ b/addons/hr_attendance/__openerp__.py
@@ -35,14 +35,14 @@ actions(Sign in/Sign out) performed by them.
'images': ['images/hr_attendances.jpeg'],
'depends': ['hr'],
'data': [
+ 'security/ir_rule.xml',
'security/ir.model.access.csv',
'hr_attendance_view.xml',
'hr_attendance_report.xml',
- 'security/ir.model.access.csv',
- 'security/ir_rule.xml',
'wizard/hr_attendance_bymonth_view.xml',
'wizard/hr_attendance_byweek_view.xml',
'wizard/hr_attendance_error_view.xml',
+ 'res_config_view.xml',
],
'demo': ['hr_attendance_demo.xml'],
'test': [
diff --git a/addons/hr_attendance/hr_attendance.py b/addons/hr_attendance/hr_attendance.py
index 8fdd2928fe6..a2ee3650a2f 100644
--- a/addons/hr_attendance/hr_attendance.py
+++ b/addons/hr_attendance/hr_attendance.py
@@ -126,9 +126,18 @@ class hr_employee(osv.osv):
result[id] = res[0]
return result
+ def _attendance_access(self, cr, uid, ids, name, args, context=None):
+ # this function field use to hide attendance button to singin/singout from menu
+ group = self.pool.get('ir.model.data').get_object(cr, uid, 'base', 'group_hr_attendance')
+ visible = False
+ if uid in [user.id for user in group.users]:
+ visible = True
+ return dict([(x, visible) for x in ids])
+
_columns = {
'state': fields.function(_state, type='selection', selection=[('absent', 'Absent'), ('present', 'Present')], string='Attendance'),
'last_sign': fields.function(_last_sign, type='datetime', string='Last Sign'),
+ 'attendance_access': fields.function(_attendance_access, type='boolean'),
}
def _action_check(self, cr, uid, emp_id, dt=False, context=None):
diff --git a/addons/hr_attendance/hr_attendance_view.xml b/addons/hr_attendance/hr_attendance_view.xml
index c686b4c1ff0..c38ee45b510 100644
--- a/addons/hr_attendance/hr_attendance_view.xml
+++ b/addons/hr_attendance/hr_attendance_view.xml
@@ -76,9 +76,9 @@
<menuitem id="menu_hr_time_tracking" name="Time Tracking" parent="hr.menu_hr_root" sequence="5" groups="base.group_user,base.group_hr_user,base.group_hr_manager"/>
- <menuitem id="menu_hr_attendance" name="Attendances" parent="hr.menu_hr_root" sequence="10" groups="base.group_user,base.group_hr_user,base.group_hr_manager"/>
+ <menuitem id="menu_hr_attendance" name="Attendances" parent="hr.menu_hr_root" sequence="10" groups="base.group_hr_attendance"/>
- <menuitem action="open_view_attendance" id="menu_open_view_attendance" parent="menu_hr_attendance" sequence="20"/>
+ <menuitem action="open_view_attendance" id="menu_open_view_attendance" parent="menu_hr_attendance" sequence="20" groups="base.group_hr_attendance"/>
<record id="edit_attendance_reason" model="ir.ui.view">
<field name="name">hr.action.reason.form</field>
@@ -114,9 +114,8 @@
</record>
<menuitem
- sequence="35" id="hr.menu_open_view_attendance_reason_new_config" parent="hr.menu_hr_configuration" name="Attendance"
- groups="base.group_no_one"/>
- <menuitem action="open_view_attendance_reason" id="menu_open_view_attendance_reason" parent="hr.menu_open_view_attendance_reason_new_config" groups="base.group_no_one"/>
+ sequence="35" id="hr.menu_open_view_attendance_reason_new_config" parent="hr.menu_hr_configuration" groups="base.group_hr_attendance" name="Attendance"/>
+ <menuitem action="open_view_attendance_reason" id="menu_open_view_attendance_reason" parent="hr.menu_open_view_attendance_reason_new_config" groups="base.group_hr_attendance"/>
<record id="hr_attendance_employee" model="ir.ui.view">
<field name="name">hr.employee.form1</field>
@@ -124,8 +123,8 @@
<field name="inherit_id" ref="hr.view_employee_form"/>
<field name="arch" type="xml">
<field name="active" position="before">
- <label for="state"/>
- <div>
+ <label for="state" groups="base.group_hr_attendance"/>
+ <div groups="base.group_hr_attendance">
<field name="state" class="oe_inline"/> -
<button class="oe_link" name="attendance_action_change" states="present" string="Sign Out" type="object" context="{'type':'sign_out'}" groups="base.group_hr_user"/>
<button class="oe_link" name="attendance_action_change" states="absent" string="Sign In" type="object" context="{'type':'sign_in'}" groups="base.group_hr_user"/>
diff --git a/addons/hr_attendance/res_config.py b/addons/hr_attendance/res_config.py
new file mode 100644
index 00000000000..0da2d183409
--- /dev/null
+++ b/addons/hr_attendance/res_config.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (C) 2004-2012 OpenERP S.A. (<http://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
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from osv import fields, osv
+
+class hr_attendance_config_settings(osv.osv_memory):
+ _inherit = 'hr.config.settings'
+
+ _columns = {
+ 'group_hr_attendance': fields.boolean('Track attendances',
+ implied_group='base.group_hr_attendance',
+ help="Allocates attendance group to all users."),
+ }
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/hr_attendance/res_config_view.xml b/addons/hr_attendance/res_config_view.xml
new file mode 100644
index 00000000000..252672ad86d
--- /dev/null
+++ b/addons/hr_attendance/res_config_view.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<openerp>
+ <data noupdate="1">
+ <record id="hr_attendace_group" model="ir.ui.view">
+ <field name="name">hr.config.settings.inherit</field>
+ <field name="model">hr.config.settings</field>
+ <field name="inherit_id" ref="hr.view_human_resources_configuration"/>
+ <field name="arch" type="xml">
+ <data>
+ <xpath expr="//div[@name='hr_attendance']" position="after">
+ <div>
+ <field name="group_hr_attendance" class="oe_inline"/>
+ <label for="group_hr_attendance"/>
+ </div>
+ </xpath>
+ </data>
+ </field>
+ </record>
+ </data>
+</openerp>
diff --git a/addons/hr_attendance/security/ir_rule.xml b/addons/hr_attendance/security/ir_rule.xml
index b934dc16f5a..e08af0644bc 100644
--- a/addons/hr_attendance/security/ir_rule.xml
+++ b/addons/hr_attendance/security/ir_rule.xml
@@ -2,6 +2,11 @@
<openerp>
<data noupdate="True">
+ <record id="base.group_hr_attendance" model="res.groups">
+ <field name="name">Attendances</field>
+ <field name="category_id" ref="base.module_category_hidden"/>
+ </record>
+
<record id="property_rule_attendace_manager" model="ir.rule">
<field name="name">Manager Attendance</field>
<field model="ir.model" name="model_id" ref="model_hr_attendance"/>
diff --git a/addons/hr_attendance/static/src/js/attendance.js b/addons/hr_attendance/static/src/js/attendance.js
index 1b5e271b4ba..d92e7534786 100644
--- a/addons/hr_attendance/static/src/js/attendance.js
+++ b/addons/hr_attendance/static/src/js/attendance.js
@@ -57,9 +57,12 @@ openerp.hr_attendance = function (instance) {
var employee = new instance.web.DataSetSearch(self, 'hr.employee', self.session.user_context, [
['user_id', '=', self.session.uid]
]);
- return employee.read_slice(['id', 'name', 'state', 'last_sign']).pipe(function (res) {
- if (_.isEmpty(res))
+ return employee.read_slice(['id', 'name', 'state', 'last_sign', 'attendance_access']).pipe(function (res) {
+ if (_.isEmpty(res) )
return;
+ if (res[0].attendance_access == false){
+ return;
+ }
self.$el.show();
self.employee = res[0];
self.last_sign = instance.web.str_to_datetime(self.employee.last_sign);
diff --git a/addons/hr_contract/hr_contract_view.xml b/addons/hr_contract/hr_contract_view.xml
index 6566f303d36..0659d661420 100644
--- a/addons/hr_contract/hr_contract_view.xml
+++ b/addons/hr_contract/hr_contract_view.xml
@@ -5,13 +5,13 @@
<!-- Contracts Button on Employee Form -->
- <act_window
- context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}"
- id="act_hr_employee_2_hr_contract"
- name="Contracts"
- res_model="hr.contract"
- src_model="hr.employee"
- groups="base.group_hr_manager"/>
+ <record id="act_hr_employee_2_hr_contract" model="ir.actions.act_window">
+ <field name="res_model">hr.contract</field>
+ <field name="view_type">form</field>
+ <field name="name">Contracts</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_employee_id': [active_id], 'default_employee_id': active_id}</field>
+ </record>
<menuitem id="next_id_56" name="Contract" parent="hr.menu_hr_configuration" sequence="30" groups="base.group_no_one"/>
<record id="hr_hr_employee_view_form2" model="ir.ui.view">
diff --git a/addons/hr_evaluation/hr_evaluation.py b/addons/hr_evaluation/hr_evaluation.py
index 3508dc36d49..d0da22c5681 100644
--- a/addons/hr_evaluation/hr_evaluation.py
+++ b/addons/hr_evaluation/hr_evaluation.py
@@ -141,6 +141,7 @@ hr_employee()
class hr_evaluation(osv.osv):
_name = "hr_evaluation.evaluation"
+ _inherit = "mail.thread"
_description = "Employee Appraisal"
_rec_name = 'employee_id'
_columns = {
@@ -242,8 +243,10 @@ class hr_evaluation(osv.osv):
def button_final_validation(self, cr, uid, ids, context=None):
request_obj = self.pool.get('hr.evaluation.interview')
self.write(cr, uid, ids, {'state':'progress'}, context=context)
- for id in self.browse(cr, uid, ids, context=context):
- if len(id.survey_request_ids) != len(request_obj.search(cr, uid, [('evaluation_id', '=', id.id),('state', 'in', ['done','cancel'])], context=context)):
+ for evaluation in self.browse(cr, uid, ids, context=context):
+ if evaluation.employee_id and evaluation.employee_id.parent_id and evaluation.employee_id.parent_id.user_id:
+ self.message_subscribe_users(cr, uid, [evaluation.id], user_ids=[evaluation.employee_id.parent_id.user_id.id], context=context)
+ if len(evaluation.survey_request_ids) != len(request_obj.search(cr, uid, [('evaluation_id', '=', evaluation.id),('state', 'in', ['done','cancel'])], context=context)):
raise osv.except_osv(_('Warning!'),_("You cannot change state, because some appraisal(s) are in waiting answer or draft state."))
return True
@@ -263,6 +266,10 @@ class hr_evaluation(osv.osv):
return True
def write(self, cr, uid, ids, vals, context=None):
+ if vals.get('employee_id'):
+ employee_id = self.pool.get('hr.employee').browse(cr, uid, vals.get('employee_id'), context=context)
+ if employee_id.parent_id and employee_id.parent_id.user_id:
+ vals['message_follower_ids'] = [(4, employee_id.parent_id.user_id.partner_id.id)]
if 'date' in vals:
new_vals = {'date_deadline': vals.get('date')}
obj_hr_eval_iterview = self.pool.get('hr.evaluation.interview')
diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml
index 29d68d7a12c..fb9d287ea77 100644
--- a/addons/hr_evaluation/hr_evaluation_view.xml
+++ b/addons/hr_evaluation/hr_evaluation_view.xml
@@ -58,6 +58,16 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
+
+ <!-- Appraisal Interviews Action -->
+
+ <record id="act_hr_employee_2_hr__evaluation_interview" model="ir.actions.act_window">
+ <field name="res_model">hr.evaluation.interview</field>
+ <field name="view_type">form</field>
+ <field name="name">Interviews</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_user_to_review_id': [active_id], 'default_user_to_review_id': active_id}</field>
+ </record>
<menuitem name="Appraisal" parent="hr.menu_hr_root" id="menu_eval_hr" sequence="25"/>
<menuitem name="Periodic Appraisal" parent="hr.menu_hr_configuration" id="menu_eval_hr_config" sequence="4"/>
@@ -134,6 +144,9 @@
<field name="evaluation_date"/>
</group>
</xpath>
+ <xpath expr="//div[@name='button_box']" position="inside">
+ <button name="%(act_hr_employee_2_hr__evaluation_interview)d" string="Appraisal Interviews" type="action"/>
+ </xpath>
</field>
</record>
@@ -165,7 +178,7 @@
<field nolabel="1" name="survey_request_ids">
<form string="Interview Appraisal" version="7.0">
<div class="oe_right oe_button_box">
- <button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer,done,cancel" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response,'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
+ <button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response,'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
<button name="%(survey.survey_browse_response)d" string="Print Interview" type="action" states="done" icon="gtk-print" context="{'survey_id': survey_id, 'response_id' : [response], 'response_no':0,}" attrs="{'readonly':[('response','=',False)]}" />
</div>
<group>
@@ -196,6 +209,10 @@
<field nolabel="1" name="note_summary" placeholder="Action Plan..."/>
</group>
</sheet>
+ <div class="oe_chatter">
+ <field name="message_ids" widget="mail_thread"/>
+ <field name="message_follower_ids" widget="mail_followers"/>
+ </div>
</form>
</field>
</record>
@@ -316,7 +333,7 @@
<field name="user_id" string="Interviewer"/>
<field name="user_to_review_id"/>
<field name="response" readonly="1" invisible="True"/>
- <button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer,done,cancel" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response, 'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
+ <button name="%(survey.action_view_survey_question_message)d" string="Answer Survey" type="action" states="waiting_answer" icon="gtk-execute" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0, 'active' : response, 'request' : True, 'object' : 'hr.evaluation.interview', 'cur_id' : active_id}" attrs="{'readonly':[('survey_id','=',False)]}"/>
<button name="action_print_survey" string="Print Survey" type="object" icon="gtk-print" context="{'survey_id': survey_id, 'response_id': [response], 'response_no':0}" attrs="{'readonly':[('survey_id','=',False)]}"/>
<button name="%(mail.action_email_compose_message_wizard)d" string="Send Reminder Email" icon="terp-mail-message-new" type="action" states="waiting_answer"/>
<field name="state"/>
@@ -408,13 +425,5 @@
'default_body_text': 'Hello,\n\nKindly post your response for the survey interview.\n\nThanks',
'default_subject': 'Reminder to fill up Survey'}"/>
- <!-- Appraisal Interviews Button on Employee Form -->
- <act_window
- context="{'search_default_user_to_review_id': [active_id], 'default_user_to_review_id': active_id}"
- id="act_hr_employee_2_hr__evaluation_interview"
- name="Appraisal Interviews"
- res_model="hr.evaluation.interview"
- src_model="hr.employee"/>
-
</data>
</openerp>
diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py
index 83f986e59cc..91dc44fed61 100644
--- a/addons/hr_expense/hr_expense.py
+++ b/addons/hr_expense/hr_expense.py
@@ -118,6 +118,9 @@ class hr_expense_expense(osv.osv):
return {'value': {'department_id': department_id, 'company_id': company_id}}
def expense_confirm(self, cr, uid, ids, *args):
+ for expense in self.browse(cr, uid, ids):
+ if expense.employee_id and expense.employee_id.parent_id.user_id:
+ self.message_subscribe_users(cr, uid, [expense.id], user_ids=[expense.employee_id.parent_id.user_id.id])
self.write(cr, uid, ids, {
'state':'confirm',
'date_confirm': time.strftime('%Y-%m-%d')
diff --git a/addons/hr_expense/hr_expense_view.xml b/addons/hr_expense/hr_expense_view.xml
index d9efa612c0b..f35547927fa 100644
--- a/addons/hr_expense/hr_expense_view.xml
+++ b/addons/hr_expense/hr_expense_view.xml
@@ -139,6 +139,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -195,12 +196,10 @@
<field name="model">product.product</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
- <field name="purchase_ok" position="before">
- <div>
+ <field name="purchase_ok" position="before">
<field name="hr_expense_ok" on_change="on_change_hr_expense_ok(hr_expense_ok)"/>
<label for="hr_expense_ok"/>
- </div>
- </field>
+ </field>
</field>
</record>
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index 759170224bd..76d4e42818a 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -303,7 +303,7 @@ class hr_holidays(osv.osv):
self.check_holidays(cr, uid, ids, context=context)
for record in self.browse(cr, uid, ids, context=context):
if record.employee_id and record.employee_id.parent_id and record.employee_id.parent_id.user_id:
- self.message_subscribe(cr, uid, [record.id], user_ids=[record.employee_id.parent_id.user_id.id], context=context)
+ self.message_subscribe_users(cr, uid, [record.id], user_ids=[record.employee_id.parent_id.user_id.id], context=context)
self.holidays_confirm_notificate(cr, uid, ids, context=context)
return self.write(cr, uid, ids, {'state':'confirm'})
diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml
index 347e2b17ca5..0a2054b14d2 100644
--- a/addons/hr_holidays/hr_holidays_view.xml
+++ b/addons/hr_holidays/hr_holidays_view.xml
@@ -121,6 +121,7 @@
</group>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -158,6 +159,7 @@
<field name="notes" nolabel="1" colspan="4" placeholder="Add a reason..."/>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/hr_payroll/hr_payroll.py b/addons/hr_payroll/hr_payroll.py
index 08dacc9a951..b56b49d3d99 100644
--- a/addons/hr_payroll/hr_payroll.py
+++ b/addons/hr_payroll/hr_payroll.py
@@ -317,7 +317,10 @@ class hr_payslip(osv.osv):
'company_id': company_id,
'period_id': False,
'basic_before_leaves': 0.0,
- 'basic_amount': 0.0
+ 'basic_amount': 0.0,
+ 'number': '',
+ 'payslip_run_id': False,
+ 'paid': False,
})
return super(hr_payslip, self).copy(cr, uid, id, default, context=context)
diff --git a/addons/hr_payroll/hr_payroll_view.xml b/addons/hr_payroll/hr_payroll_view.xml
index ef3c0ea2e9f..c87d36de591 100644
--- a/addons/hr_payroll/hr_payroll_view.xml
+++ b/addons/hr_payroll/hr_payroll_view.xml
@@ -234,7 +234,7 @@
</h2>
</div>
<group col="4">
- <field name="contract_id" domain="[('employee_id','=',employee_id)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
+ <field name="contract_id" domain="[('employee_id','=',employee_id),('date_start','&lt;=',date_to),'|',('date_end','&gt;=',date_from),('date_end','=',False)]" on_change="onchange_contract_id(date_from, date_to, employee_id, contract_id)" context="{'default_employee_id': employee_id}"/>
<field name="number"/>
<field name="struct_id" attrs="{'required':[('contract_id','&lt;&gt;',False)]}"/>
<field name="name"/>
@@ -369,14 +369,16 @@
<field name="view_id" ref="view_hr_payslip_tree"/>
<field name="search_view_id" ref="view_hr_payslip_filter"/>
</record>
- <menuitem action="action_view_hr_payslip_form" id="menu_department_tree" parent="menu_hr_root_payroll" groups="base.group_hr_user"/>
- <act_window name="Payslips"
- context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}"
- res_model="hr.payslip"
- src_model="hr.employee"
- view_id ="view_hr_payslip_tree"
- id="act_hr_employee_payslip_list"
- groups="base.group_hr_manager"/>
+
+ <menuitem action="action_view_hr_payslip_form" id="menu_department_tree" parent="menu_hr_root_payroll" groups="base.group_hr_user"/>
+
+ <record id="act_hr_employee_payslip_list" model="ir.actions.act_window">
+ <field name="res_model">hr.payslip</field>
+ <field name="name">Payslips</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_employee_id': [active_id], 'default_employee_id': active_id}</field>
+ </record>
<!-- Employee View -->
<record id="payroll_hr_employee_view_form" model="ir.ui.view">
diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml
index 08e5f31a2d2..32c26573e8c 100644
--- a/addons/hr_recruitment/hr_recruitment_view.xml
+++ b/addons/hr_recruitment/hr_recruitment_view.xml
@@ -183,6 +183,7 @@
<field name="description" placeholder="Feedback of interviews..."/>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/hr_recruitment/security/ir.model.access.csv b/addons/hr_recruitment/security/ir.model.access.csv
index 086e63e542b..2d0b85faf70 100644
--- a/addons/hr_recruitment/security/ir.model.access.csv
+++ b/addons/hr_recruitment/security/ir.model.access.csv
@@ -8,5 +8,5 @@ access_survey_hr_user,survey.hr.user,survey.model_survey,base.group_hr_user,1,1,
access_crm_meeting_hruser,crm.meeting.hruser,base_calendar.model_crm_meeting,base.group_hr_user,1,1,1,1
access_hr_recruitment_source_hr_officer,hr.recruitment.source,model_hr_recruitment_source,base.group_hr_user,1,1,1,1
access_hr_recruitment_source_all,hr.recruitment.source,model_hr_recruitment_source,,1,0,0,0
-access_hr_applicant_category,hr.applicant_category,model_hr_applicant_category,,1,0,0,0
+access_hr_applicant_category,hr.applicant_category,model_hr_applicant_category,,1,1,1,0
access_hr_applicant_category_manager,hr.applicant_category,model_hr_applicant_category,base.group_hr_manager,1,1,1,1
diff --git a/addons/hr_timesheet/hr_timesheet_view.xml b/addons/hr_timesheet/hr_timesheet_view.xml
index 43b677d7978..c81cda8493b 100644
--- a/addons/hr_timesheet/hr_timesheet_view.xml
+++ b/addons/hr_timesheet/hr_timesheet_view.xml
@@ -116,10 +116,12 @@
<field name="search_view_id" ref="hr_timesheet_line_search"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
- Click to your timesheets.
+ Click to record your timesheets.
</p><p>
- Through this menu you can register and follow your workings
- hours by project every day.
+ You can register and track your workings hours by project every
+ day. Every time spent on a project will become a cost in the
+ analytic accounting and can be re-invoiced to customers if
+ required.
</p>
</field>
</record>
diff --git a/addons/hr_timesheet/security/ir.model.access.csv b/addons/hr_timesheet/security/ir.model.access.csv
index d5f89098a69..069a5a9c170 100644
--- a/addons/hr_timesheet/security/ir.model.access.csv
+++ b/addons/hr_timesheet/security/ir.model.access.csv
@@ -1,8 +1,8 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_analytic_timesheet,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_hr_user,1,1,1,1
-access_hr_analytic_timesheet_employee,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_user,1,1,1,0
+access_hr_analytic_timesheet_employee,hr.analytic.timesheet,model_hr_analytic_timesheet,base.group_user,1,1,1,1
access_hr_account_analytic_line,account.account.analytic.line,account.model_account_analytic_line,base.group_hr_user,1,1,1,1
-access_hr_account_analytic_line_employee,account.account.analytic.line employee,account.model_account_analytic_line,base.group_user,1,1,1,0
+access_hr_account_analytic_line_employee,account.account.analytic.line employee,account.model_account_analytic_line,base.group_user,1,1,1,1
access_account_analytic_journal,account.account.analytic.journal,account.model_account_analytic_journal,base.group_hr_user,1,1,1,1
access_product_product_user,product.product user,product.model_product_product,base.group_hr_user,1,1,1,1
access_product_template_hr_timesheet,product.template.hr.timesheet,product.model_product_template,base.group_hr_user,1,1,1,1
diff --git a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py
index 6b6dd9f6e52..7af9603ebd8 100644
--- a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py
+++ b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report.py
@@ -31,7 +31,7 @@ class report_timesheet_line(osv.osv):
'user_id': fields.many2one('res.users', 'User', readonly=True),
'date': fields.date('Date', readonly=True),
'day': fields.char('Day', size=128, readonly=True),
- 'quantity': fields.float('Quantity', readonly=True),
+ 'quantity': fields.float('Time', readonly=True),
'cost': fields.float('Cost', readonly=True),
'product_id': fields.many2one('product.product', 'Product',readonly=True),
'account_id': fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
@@ -83,7 +83,7 @@ class report_timesheet_user(osv.osv):
_columns = {
'name': fields.char('Year',size=64,required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
- 'quantity': fields.float('Quantity', readonly=True),
+ 'quantity': fields.float('Time', readonly=True),
'cost': fields.float('Cost', readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
@@ -117,7 +117,7 @@ class report_timesheet_account(osv.osv):
'name': fields.char('Year',size=64,required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'account_id':fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
- 'quantity': fields.float('Quantity', readonly=True),
+ 'quantity': fields.float('Time', readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
@@ -151,7 +151,7 @@ class report_timesheet_account_date(osv.osv):
'name': fields.char('Year',size=64,required=False, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'account_id':fields.many2one('account.analytic.account', 'Analytic Account', readonly=True),
- 'quantity': fields.float('Quantity', readonly=True),
+ 'quantity': fields.float('Time', readonly=True),
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'),
('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True),
}
@@ -185,7 +185,7 @@ class report_timesheet_invoice(osv.osv):
'user_id':fields.many2one('res.users', 'User', readonly=True),
'account_id':fields.many2one('account.analytic.account', 'Project', readonly=True),
'manager_id':fields.many2one('res.users', 'Manager', readonly=True),
- 'quantity': fields.float('Quantity', readonly=True),
+ 'quantity': fields.float('Time', readonly=True),
'amount_invoice': fields.float('To invoice', readonly=True)
}
_rec_name = 'user_id'
diff --git a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
index 2d4b0debde8..6d6fe2f3776 100644
--- a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
+++ b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml
@@ -347,18 +347,11 @@
src_model="res.users"/>
<act_window
- context="{'search_default_account_id': [active_id],'default_account_id': [active_id]}"
- id="act_account_analytic_account_2_report_timehsheet_account"
- name="Timesheets"
- res_model="hr.analytic.timesheet"
- src_model="account.analytic.account"/>
-
- <act_window
- context="{'search_default_manager_id': [active_id]}"
- id="act_res_users_2_report_timesheet_invoice"
- name="Costs to invoice"
- res_model="report_timesheet.invoice"
- src_model="res.users"/>
+ context="{'search_default_manager_id': [active_id]}"
+ id="act_res_users_2_report_timesheet_invoice"
+ name="Costs to invoice"
+ res_model="report_timesheet.invoice"
+ src_model="res.users"/>
</data>
diff --git a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
index 76314e1986a..0014ac685b2 100644
--- a/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
+++ b/addons/hr_timesheet_invoice/wizard/hr_timesheet_invoice_create.py
@@ -79,17 +79,24 @@ class account_analytic_line(osv.osv):
curr_invoice = {
'name': time.strftime('%d/%m/%Y')+' - '+account.name,
'partner_id': account.partner_id.id,
+ 'company_id': account.company_id.id,
'payment_term': partner.property_payment_term.id or False,
'account_id': partner.property_account_receivable.id,
'currency_id': account.pricelist_id.currency_id.id,
'date_due': date_due,
'fiscal_position': account.partner_id.property_account_position.id
}
- last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context)
- invoices.append(last_invoice)
-
+
context2 = context.copy()
context2['lang'] = partner.lang
+ # set company_id in context, so the correct default journal will be selected
+ context2['force_company'] = curr_invoice['company_id']
+ # set force_company in context so the correct product properties are selected (eg. income account)
+ context2['company_id'] = curr_invoice['company_id']
+
+ last_invoice = invoice_obj.create(cr, uid, curr_invoice, context=context2)
+ invoices.append(last_invoice)
+
cr.execute("SELECT product_id, to_invoice, sum(unit_amount), product_uom_id, name " \
"FROM account_analytic_line as line " \
"WHERE account_id = %s " \
@@ -115,11 +122,11 @@ class account_analytic_line(osv.osv):
else:
price = 0.0
+ general_account = product.product_tmpl_id.property_account_income or product.categ_id.property_account_income_categ
+ if not general_account:
+ raise osv.except_osv(_("Configuration Error!"), _("Please define income account for product '%s'.") % product.name)
taxes = product.taxes_id
tax = fiscal_pos_obj.map_tax(cr, uid, account.partner_id.property_account_position, taxes)
- account_id = product.product_tmpl_id.property_account_income.id or product.categ_id.property_account_income_categ.id
- if not account_id:
- raise osv.except_osv(_("Configuration Error!"), _("Please define income account for product '%s'.") % product.name)
curr_line = {
'price_unit': price,
'quantity': qty,
@@ -130,7 +137,7 @@ class account_analytic_line(osv.osv):
'product_id': product_id,
'invoice_line_tax_id': [(6,0,tax)],
'uos_id': uom,
- 'account_id': account_id,
+ 'account_id': general_account.id,
'account_analytic_id': account.id,
}
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
index fcdbfda0667..13c11cf72c7 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py
@@ -103,6 +103,7 @@ class one2many_mod(fields.one2many):
class hr_timesheet_sheet(osv.osv):
_name = "hr_timesheet_sheet.sheet"
+ _inherit = "mail.thread"
_table = 'hr_timesheet_sheet_sheet'
_order = "id desc"
_description="Timesheet"
@@ -265,6 +266,8 @@ class hr_timesheet_sheet(osv.osv):
def button_confirm(self, cr, uid, ids, context=None):
for sheet in self.browse(cr, uid, ids, context=context):
+ if sheet.employee_id and sheet.employee_id.parent_id and sheet.employee_id.parent_id.user_id:
+ self.message_subscribe_users(cr, uid, [sheet.id], user_ids=[sheet.employee_id.parent_id.user_id.id], context=context)
self.check_employee_attendance_state(cr, uid, sheet.id, context=context)
di = sheet.user_id.company_id.timesheet_max_difference
if (abs(sheet.total_difference) < di) or not di:
diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
index 6c92e28564e..9a7416464af 100644
--- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
+++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml
@@ -64,9 +64,9 @@
<field name="company_id" groups="base.group_multi_company"/>
</group>
<group>
- <field name="total_attendance" widget="float_time"/>
+ <field name="total_attendance" widget="float_time" groups="base.group_hr_attendance"/>
<field name="total_timesheet" widget="float_time"/>
- <field name="total_difference" widget="float_time"/>
+ <field name="total_difference" widget="float_time" groups="base.group_hr_attendance"/>
<field name="user_id" invisible="1"/>
</group>
</group>
@@ -84,7 +84,7 @@
</div>
</group>
<group colspan="4" col="3">
- <field context="{'name':date_current,'user_id':user_id}" name="attendances_ids" nolabel="1">
+ <field context="{'name':date_current,'user_id':user_id}" name="attendances_ids" nolabel="1" groups="base.group_hr_attendance">
<tree string="Attendances" editable="bottom">
<field name="name"/>
<field name="action"/>
@@ -92,14 +92,14 @@
</tree>
</field>
<group>
- <div align="right" groups="base.group_hr_manager">
- <button name="attendance_action_change" attrs="{'invisible': [('state_attendance', '=', 'present')]}" type="object" string="Sign In"/>
- <button name="attendance_action_change" attrs="{'invisible': ['|', ('state_attendance','=',False), ('state_attendance', '=', 'absent')]}" type="object" string="Sign Out"/>
+ <div align="right" groups="base.group_hr_manager,base.group_hr_attendance">
+ <button name="attendance_action_change" attrs="{'invisible': [('state_attendance', '=', 'present')]}" type="object" string="Sign In" groups="base.group_hr_attendance"/>
+ <button name="attendance_action_change" attrs="{'invisible': ['|', ('state_attendance','=',False), ('state_attendance', '=', 'absent')]}" type="object" string="Sign Out" groups="base.group_hr_attendance"/>
</div>
</group>
</group>
<group col="4">
- <field name="state_attendance"/>
+ <field name="state_attendance" groups="base.group_hr_attendance"/>
</group>
<field colspan="4" context="{'date':date_current,'user_id':user_id}" domain="[('name','=',date_current)]" name="timesheet_ids" nolabel="1">
<tree editable="top" string="Timesheet Lines">
@@ -134,14 +134,18 @@
<field colspan="4" name="period_ids" nolabel="1">
<tree colors="red:total_difference&lt;0.1;blue:total_difference&gt;=0.1" string="Period">
<field name="name"/>
- <field name="total_attendance" widget="float_time"/>
+ <field name="total_attendance" widget="float_time" groups="base.group_hr_attendance"/>
<field name="total_timesheet" widget="float_time"/>
- <field name="total_difference" widget="float_time"/>
+ <field name="total_difference" widget="float_time" groups="base.group_hr_attendance"/>
</tree>
</field>
</page>
</notebook>
</sheet>
+ <div class="oe_chatter">
+ <field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
+ <field name="message_follower_ids" widget="mail_followers"/>
+ </div>
</form>
</field>
</record>
@@ -318,9 +322,9 @@
<field name="date_from"/>
<field name="date_to"/>
<field name="department_id"/>
- <field name="total_attendance" widget="float_time"/>
+ <field name="total_attendance" widget="float_time" groups="base.group_hr_attendance"/>
<field name="total_timesheet" widget="float_time"/>
- <field name="total_difference" widget="float_time"/>
+ <field name="total_difference" widget="float_time" groups="base.group_hr_attendance"/>
<field name="state"/>
</tree>
</field>
@@ -332,18 +336,23 @@
<field name="arch" type="xml">
<tree colors="blue:total_difference&lt;0.1;red:total_difference&gt;=0.1" string="Period">
<field name="name"/>
- <field name="total_attendance" widget="float_time" sum="Total Attendances"/>
+ <field name="total_attendance" widget="float_time" sum="Total Attendances" groups="base.group_hr_attendance"/>
<field name="total_timesheet" widget="float_time" sum="Total Timesheet"/>
- <field name="total_difference" widget="float_time" sum="Total Difference"/>
+ <field name="total_difference" widget="float_time" sum="Total Difference" groups="base.group_hr_attendance"/>
</tree>
</field>
</record>
<!-- Timesheet Button on Employee Form -->
- <act_window
- context="{'search_default_employee_id': [active_id], 'default_employee_id': active_id}"
- id="act_hr_employee_2_hr_timesheet" name="Timesheets" res_model="hr_timesheet_sheet.sheet" src_model="hr.employee"/>
+ <record id="act_hr_employee_2_hr_timesheet" model="ir.actions.act_window">
+ <field name="res_model">hr_timesheet_sheet.sheet</field>
+ <field name="view_type">form</field>
+ <field name="name">Timesheets</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_employee_id': [active_id], 'default_employee_id': active_id}</field>
+ </record>
+
<record id="hr_timesheet_sheet_employee_extd_form" model="ir.ui.view">
<field name="name">hr.timesheet.sheet.employee.extd_form</field>
<field name="model">hr.employee</field>
diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
index 49b18f75e4b..1fdcac9f7c6 100644
--- a/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report.py
@@ -43,7 +43,7 @@ class hr_timesheet_report(osv.osv):
'account_id': fields.many2one('account.analytic.account', 'Analytic Account',readonly=True),
'company_id': fields.many2one('res.company', 'Company',readonly=True),
'cost': fields.float('Cost',readonly=True, digits_compute=dp.get_precision('Account')),
- 'quantity': fields.float('Quantity',readonly=True),
+ 'quantity': fields.float('Time',readonly=True),
}
def init(self, cr):
diff --git a/addons/hr_timesheet_sheet/report/timesheet_report.py b/addons/hr_timesheet_sheet/report/timesheet_report.py
index 38e19d708d4..3db7ff8feb2 100644
--- a/addons/hr_timesheet_sheet/report/timesheet_report.py
+++ b/addons/hr_timesheet_sheet/report/timesheet_report.py
@@ -52,7 +52,7 @@ class timesheet_report(osv.osv):
('draft','Draft'),
('confirm','Confirmed'),
('done','Done')], 'Status', readonly=True),
- 'quantity': fields.float('#Quantity',readonly=True),
+ 'quantity': fields.float('Time',readonly=True),
'cost': fields.float('#Cost',readonly=True),
}
diff --git a/addons/idea/idea_view.xml b/addons/idea/idea_view.xml
index eab3d03ceea..1b7cc5446b8 100644
--- a/addons/idea/idea_view.xml
+++ b/addons/idea/idea_view.xml
@@ -77,6 +77,7 @@
<field name="description"/>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/import_google/wizard/google_import_message_view.xml b/addons/import_google/wizard/google_import_message_view.xml
index 158aff29bf3..d44bd8e26ec 100644
--- a/addons/import_google/wizard/google_import_message_view.xml
+++ b/addons/import_google/wizard/google_import_message_view.xml
@@ -10,6 +10,9 @@
<group>
<field name='name'/>
</group>
+ <footer>
+ <button string="Close" class="oe_highlight" special="cancel" />
+ </footer>
</form>
</field>
</record>
diff --git a/addons/import_google/wizard/import_google.py b/addons/import_google/wizard/import_google.py
index d231c186321..f8fc8991975 100644
--- a/addons/import_google/wizard/import_google.py
+++ b/addons/import_google/wizard/import_google.py
@@ -27,6 +27,7 @@ from dateutil import *
from pytz import timezone
from datetime import datetime
import time
+import base64
from osv import *
from tools.translate import _
@@ -282,7 +283,7 @@ class google_import(import_framework):
self.contact = self.gd_client.GetContactsFeed()
while self.contact:
for entry in self.contact.entry:
- data = {}
+ data = {}
data['id'] = entry.id.text
name = tools.ustr(entry.title.text)
if name == "None":
@@ -290,6 +291,8 @@ class google_import(import_framework):
data['name'] = name or _('Unknown')
emails = ','.join(email.address for email in entry.email)
data['email'] = emails
+ if self.gd_client.GetPhoto(entry):
+ data['image'] = base64.encodestring(self.gd_client.GetPhoto(entry))
if table == 'Contact':
data.update({'customer': str(self.context.get('customer')),
'supplier': str(self.context.get('supplier'))})
@@ -322,6 +325,12 @@ class google_import(import_framework):
'name': value('company', fallback='name'),
'customer': 'customer',
'supplier': 'supplier',
+ 'city': 'city',
+ 'phone': 'phone',
+ 'mobile': 'mobile',
+ 'email': 'email',
+ 'image': 'image',
+ 'fax': 'fax',
'child_ids/id': ref(self.TABLE_ADDRESS, 'id'),
}
}
diff --git a/addons/import_google/wizard/import_google_data.py b/addons/import_google/wizard/import_google_data.py
index 2132d141e29..5ce1d160f3e 100644
--- a/addons/import_google/wizard/import_google_data.py
+++ b/addons/import_google/wizard/import_google_data.py
@@ -104,7 +104,7 @@ class synchronize_google(osv.osv_memory):
_columns = {
'customer': fields.boolean('Customer', help="Check this box to set newly created partner as Customer."),
'supplier': fields.boolean('Supplier', help="Check this box to set newly created partner as Supplier."),
- 'group_name': fields.selection(_get_group, "Group Name",help="Choose which group to import, By default it takes all."),
+ 'group_name': fields.selection(_get_group, "Group Name", help="Choose which group to import, By default it takes all."),
'calendar_name': fields.selection(_get_calendars, "Calendar Name"),
}
diff --git a/addons/import_google/wizard/import_google_data_view.xml b/addons/import_google/wizard/import_google_data_view.xml
index f8e110e6a5d..e11b5aa2d08 100644
--- a/addons/import_google/wizard/import_google_data_view.xml
+++ b/addons/import_google/wizard/import_google_data_view.xml
@@ -7,7 +7,7 @@
<field name="arch" type="xml">
<form string="Import contacts from a google account" version="7.0">
<group colspan="4" col="4" width="430">
- <field name="group_name" colspan="4"/>
+ <field name="group_name" colspan="4" required="1"/>
<newline/>
<group colspan="4" col="4">
<separator string="Partner Status for this Group:" colspan="4"/>
@@ -32,7 +32,7 @@
<field name="arch" type="xml">
<form string="Import Google Calendar Events" version="7.0">
<group colspan="4" col="4" width="320">
- <field name="calendar_name" />
+ <field name="calendar_name" required="1"/>
</group>
<footer>
<button name="import_google" string="_Import Events" type="object" class="oe_highlight" />
diff --git a/addons/l10n_be/i18n/nl_BE.po b/addons/l10n_be/i18n/nl_BE.po
index f8ca47590cc..a6d4bffeb8b 100644
--- a/addons/l10n_be/i18n/nl_BE.po
+++ b/addons/l10n_be/i18n/nl_BE.po
@@ -1,30 +1,33 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
-# * l10n_be
-#
+# * l10n_be
+# Els Van Vossel <evv@agaplan.eu>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2011-12-23 09:56+0000\n"
-"PO-Revision-Date: 2009-02-03 14:48+0000\n"
-"Last-Translator: Niels Huylebroeck <Unknown>\n"
-"Language-Team: \n"
+"PO-Revision-Date: 2012-10-01 14:57+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-08-28 06:22+0000\n"
-"X-Generator: Launchpad (build 15864)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
+"Language: nl\n"
#. module: l10n_be
#: field:partner.vat.intra,test_xml:0
msgid "Test XML file"
-msgstr "Test XML bestand"
+msgstr "Test XML-bestand"
#. module: l10n_be
#: view:partner.vat.list_13:0
msgid "You can remove customers which you do not want in exported xml file"
msgstr ""
+"U kunt klanten die u niet wilt, verwijderen uit het geëxporteerde xml-"
+"bestand."
#. module: l10n_be
#: view:partner.vat_13:0
@@ -32,34 +35,36 @@ msgid ""
"This wizard will create an XML file for VAT details and total invoiced "
"amounts per partner."
msgstr ""
+"Deze assistent zal een XML-bestand maken met de btw-gegevens en totaal "
+"gefactureerde bedragen per relatie."
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_tiers_receiv
msgid "Tiers - Recevable"
-msgstr ""
+msgstr "Derden - te ontvangen"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:102
#, python-format
msgid "Wrong Period Code"
-msgstr ""
+msgstr "Verkeerde periode"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_partner_vat_listing.py:52
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:109
#, python-format
msgid "No partner has a VAT Number asociated with him."
-msgstr ""
+msgstr "Er is geen relatie met een btw-nummer."
#. module: l10n_be
#: constraint:res.company:0
msgid "Error! You can not create recursive companies."
-msgstr ""
+msgstr "U kunt niet dezelfde bedrijven maken."
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_tiers
msgid "Tiers"
-msgstr ""
+msgstr "Derde"
#. module: l10n_be
#: field:l1on_be.vat.declaration,period_id:0
@@ -69,18 +74,18 @@ msgstr "Periode"
#. module: l10n_be
#: field:partner.vat.intra,period_ids:0
msgid "Period (s)"
-msgstr ""
+msgstr "Periode(n)"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
#: view:partner.vat.intra:0
msgid "Save the File with '.xml' extension."
-msgstr ""
+msgstr "Bestand opslaan met '.xml'-extensie"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_charge
msgid "Charge"
-msgstr ""
+msgstr "Kosten"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_partner_vat_listing.py:47
@@ -89,13 +94,13 @@ msgstr ""
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:109
#, python-format
msgid "Data Insufficient!"
-msgstr ""
+msgstr "Onvoldoende gegevens"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
#: view:partner.vat.list_13:0
msgid "Create XML"
-msgstr "XML Aanmaken"
+msgstr "XML maken"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_capitaux
@@ -105,23 +110,23 @@ msgstr "Kapitaal"
#. module: l10n_be
#: view:partner.vat.list_13:0
msgid "Print"
-msgstr ""
+msgstr "Afdrukken"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "Save XML"
-msgstr ""
+msgstr "XML opslaan"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:219
#, python-format
msgid "Save"
-msgstr ""
+msgstr "Opslaan"
#. module: l10n_be
#: sql_constraint:res.company:0
msgid "The company name must be unique !"
-msgstr ""
+msgstr "De firmanaam moet uniek zijn"
#. module: l10n_be
#: field:l1on_be.vat.declaration,msg:0
@@ -133,65 +138,65 @@ msgstr "Bestand aangemaakt"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "_Close"
-msgstr ""
+msgstr "_Sluiten"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_account_vat_declaration.py:131
#, python-format
msgid "Save XML For Vat declaration"
-msgstr ""
+msgstr "XML voor btw-aangifte opslaan"
#. module: l10n_be
#: view:partner.vat.list_13:0
msgid "Customers"
-msgstr ""
+msgstr "Klanten"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_tax_in
msgid "Taxes à l'entrée"
-msgstr ""
+msgstr "Te ontvangen btw"
#. module: l10n_be
#: help:l1on_be.vat.declaration,ask_restitution:0
msgid "It indicates whether a resitution is to made or not?"
-msgstr ""
+msgstr "Het geeft aan of een teruggave nodig is of niet"
#. module: l10n_be
#: model:ir.actions.act_window,name:l10n_be.action_vat_declaration
msgid "Vat Declaraion"
-msgstr ""
+msgstr "Btw-aangifte"
#. module: l10n_be
#: view:partner.vat.intra:0
#: field:partner.vat.intra,no_vat:0
msgid "Partner With No VAT"
-msgstr ""
+msgstr "Relatie zonder btw"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_immo
msgid "Immobilisation"
-msgstr "Onroerende goederen"
+msgstr "Activa"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
#: view:partner.vat.intra:0
msgid "Company"
-msgstr ""
+msgstr "Bedrijf"
#. module: l10n_be
#: model:ir.model,name:l10n_be.model_partner_vat_13
msgid "partner.vat_13"
-msgstr ""
+msgstr "partner.vat_13"
#. module: l10n_be
#: model:ir.ui.menu,name:l10n_be.partner_vat_listing
msgid "Annual Listing Of VAT-Subjected Customers"
-msgstr ""
+msgstr "Jaarlijke klantenlisting"
#. module: l10n_be
#: view:partner.vat.list_13:0
msgid "XML File has been Created."
-msgstr "XML bestand is aangemaakt"
+msgstr "XML-bestand is gemaakt."
#. module: l10n_be
#: help:l1on_be.vat.declaration,client_nihil:0
@@ -199,64 +204,66 @@ msgid ""
"Tick this case only if it concerns only the last statement on the civil or "
"cessation of activity"
msgstr ""
+"Dit vakje alleen inschakelen als het gaat om de laatste aangifte van het "
+"boekjaar of om de stopzetting van een activiteit."
#. module: l10n_be
#: view:partner.vat.list_13:0
msgid "Select Fiscal Year"
-msgstr "Selecteer Fiscaaljaar"
+msgstr "Selecteer boekjaar"
#. module: l10n_be
#: field:l1on_be.vat.declaration,ask_restitution:0
msgid "Ask Restitution"
-msgstr ""
+msgstr "Teruggave"
#. module: l10n_be
#: model:ir.model,name:l10n_be.model_partner_vat_intra
#: model:ir.ui.menu,name:l10n_be.l10_be_vat_intra
msgid "Partner VAT Intra"
-msgstr ""
+msgstr "Intracommunautaire opgave"
#. module: l10n_be
#: model:ir.ui.menu,name:l10n_be.l10_be_vat_declaration
#: view:l1on_be.vat.declaration:0
msgid "Periodical VAT Declaration"
-msgstr ""
+msgstr "Periodieke btw-aangifte"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "Note: "
-msgstr ""
+msgstr "Opmerking: "
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "_Preview"
-msgstr ""
+msgstr "_Voorbeeld"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_tiers_payable
msgid "Tiers - Payable"
-msgstr ""
+msgstr "Derden - te betalen"
#. module: l10n_be
#: field:l1on_be.vat.declaration,tax_code_id:0
#: field:partner.vat.intra,tax_code_id:0
msgid "Tax Code"
-msgstr ""
+msgstr "Btw-code"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "Periods"
-msgstr ""
+msgstr "Perioden"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_produit
msgid "Produit"
-msgstr "Product"
+msgstr "Opbrengsten"
#. module: l10n_be
#: help:partner.vat.intra,test_xml:0
msgid "Sets the XML output as test file"
-msgstr ""
+msgstr "Maakt een testbestand in xml"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_view
@@ -266,18 +273,19 @@ msgstr "Weergave"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
msgid "Ok"
-msgstr "Ok"
+msgstr "OK"
#. module: l10n_be
#: field:l1on_be.vat.declaration,ask_payment:0
msgid "Ask Payment"
-msgstr ""
+msgstr "Betaling vragen"
#. module: l10n_be
#: help:partner.vat.intra,no_vat:0
msgid ""
"The Partner whose VAT number is not defined they doesn't include in XML File."
msgstr ""
+"Een relatie zonder btw-nummer wordt niet opgenomen in het xml-bestand."
#. module: l10n_be
#: field:partner.vat_13,limit_amount:0
@@ -287,44 +295,44 @@ msgstr "Bestedingslimiet"
#. module: l10n_be
#: model:ir.model,name:l10n_be.model_res_company
msgid "Companies"
-msgstr ""
+msgstr "Bedrijven"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "Create _XML"
-msgstr ""
+msgstr "_XML maken"
#. module: l10n_be
#: help:partner.vat.intra,period_ids:0
msgid ""
"Select here the period(s) you want to include in your intracom declaration"
-msgstr ""
+msgstr "Kies hier de periode(n) voor uw intracommunautaire opgave"
#. module: l10n_be
#: view:partner.vat_13:0
msgid "View Customers"
-msgstr ""
+msgstr "Klanten bekijken"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:102
#, python-format
msgid "The period code you entered is not valid."
-msgstr ""
+msgstr "De periode die u heeft ingevoerd, is onjuist."
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
msgid "Is Last Declaration"
-msgstr ""
+msgstr "Laatste aangifte"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_stock
msgid "Stock et Encours"
-msgstr ""
+msgstr "Voorraden in bestelling"
#. module: l10n_be
#: field:l1on_be.vat.declaration,client_nihil:0
msgid "Last Declaration of Enterprise"
-msgstr ""
+msgstr "Laatste aangifte van bedrijf"
#. module: l10n_be
#: help:partner.vat.intra,mand_id:0
@@ -332,6 +340,8 @@ msgid ""
"This identifies the representative of the sending company. This is a string "
"of 14 characters"
msgstr ""
+"Identificatie van de vertegenwoordiger van de verzender. Dit is een reeks "
+"van 14 tekens."
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_account_vat_declaration.py:75
@@ -339,37 +349,37 @@ msgstr ""
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:98
#, python-format
msgid "Data Insufficient"
-msgstr ""
+msgstr "Onvoldoende gegevens"
#. module: l10n_be
#: model:ir.ui.menu,name:l10n_be.menu_finance_belgian_statement
msgid "Belgium Statements"
-msgstr ""
+msgstr "Belgische aangiften"
#. module: l10n_be
#: model:ir.actions.act_window,name:l10n_be.action_vat_intra
msgid "Partner Vat Intra"
-msgstr ""
+msgstr "Intracommunautaire opgave"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
msgid "Declare Periodical VAT"
-msgstr ""
+msgstr "Periodieke btw-aangifte"
#. module: l10n_be
#: model:ir.model,name:l10n_be.model_partner_vat_list_13
msgid "partner.vat.list_13"
-msgstr ""
+msgstr "partner.vat.list_13"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
msgid "Save xml"
-msgstr ""
+msgstr "Xml opslaan"
#. module: l10n_be
#: field:partner.vat.intra,mand_id:0
msgid "MandataireId"
-msgstr ""
+msgstr "MandataireId"
#. module: l10n_be
#: field:l1on_be.vat.declaration,file_save:0
@@ -391,23 +401,32 @@ msgid ""
" YYYY stands for the year (4 positions).\n"
" "
msgstr ""
+"Hier typt u de periode voor de intracommunautaire opgave in het formaat: "
+"ppyyyy\n"
+" PP betekent een maand: van '01' tot '12'.\n"
+" PP kan ook een kwartaal beteken: '31','32','33','34'\n"
+" Het eerste cijfer duidt aan dat het om een kwartaal gaat,\n"
+" Het tweede cijfer geeft het specifieke kwartaal aan.\n"
+" PP kan ook een volledig boekjaar betekenen: '00'.\n"
+" YYYY duidt het jaar aan (4 posities).\n"
+" "
#. module: l10n_be
#: field:l1on_be.vat.declaration,name:0
#: field:partner.vat.intra,name:0
#: field:partner.vat.list_13,name:0
msgid "File Name"
-msgstr ""
+msgstr "Bestandsnaam"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_tax_out
msgid "Taxes à la sortie"
-msgstr ""
+msgstr "Te betalen btw"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_tax
msgid "Tax"
-msgstr "Belasting"
+msgstr "Btw"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_account_vat_declaration.py:75
@@ -415,83 +434,83 @@ msgstr "Belasting"
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:98
#, python-format
msgid "No VAT Number Associated with Main Company!"
-msgstr ""
+msgstr "De firma heeft geen btw-nummer."
#. module: l10n_be
#: model:ir.model,name:l10n_be.model_l1on_be_vat_declaration
msgid "Vat Declaration"
-msgstr ""
+msgstr "Btw-aangifte"
#. module: l10n_be
#: view:partner.vat.intra:0
#: field:partner.vat.intra,country_ids:0
msgid "European Countries"
-msgstr ""
+msgstr "Europese landen"
#. module: l10n_be
#: model:ir.actions.act_window,name:l10n_be.action_partner_vat_listing_13
#: view:partner.vat_13:0
msgid "Partner VAT Listing"
-msgstr ""
+msgstr "Intracommunautaire opgave"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "General Information"
-msgstr ""
+msgstr "Algemene informatie"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "Create an XML file for Vat Intra"
-msgstr ""
+msgstr "Maak een xml-bestand voor de IC-opgave"
#. module: l10n_be
#: field:partner.vat.intra,period_code:0
msgid "Period Code"
-msgstr ""
+msgstr "Periodecode"
#. module: l10n_be
#: model:account.account.type,name:l10n_be.user_type_financiers
msgid "Financier"
-msgstr ""
+msgstr "Financieel"
#. module: l10n_be
#: field:partner.vat_13,year:0
msgid "Year"
-msgstr ""
+msgstr "Jaar"
#. module: l10n_be
#: view:partner.vat_13:0
msgid "Cancel"
-msgstr "Annuleer"
+msgstr "Annuleren"
#. module: l10n_be
#: view:l1on_be.vat.declaration:0
#: view:partner.vat.intra:0
#: view:partner.vat.list_13:0
msgid "Close"
-msgstr ""
+msgstr "Sluiten"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_vat_intra.py:105
#, python-format
msgid "Please select at least one Period."
-msgstr ""
+msgstr "Selecteer minimaal een periode."
#. module: l10n_be
#: help:l1on_be.vat.declaration,ask_payment:0
msgid "It indicates whether a payment is to made or not?"
-msgstr ""
+msgstr "Het geeft aan of een betaling nodig is of niet"
#. module: l10n_be
#: view:partner.vat.intra:0
msgid "Partner VAT intra"
-msgstr ""
+msgstr "Intracommunautaire opgave"
#. module: l10n_be
#: code:addons/l10n_be/wizard/l10n_be_partner_vat_listing.py:47
#, python-format
msgid "No data for the selected Year."
-msgstr ""
+msgstr "Geen gegevens voor het geselecteerde jaar."
#~ msgid "Notification"
#~ msgstr "Mededeling"
diff --git a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py
index fad6ca53f92..d15b300597e 100644
--- a/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py
+++ b/addons/l10n_be/wizard/l10n_be_partner_vat_listing.py
@@ -70,7 +70,7 @@ class partner_vat(osv.osv_memory):
FROM account_move_line l
LEFT JOIN res_partner p ON l.partner_id = p.id
LEFT JOIN account_tax_code c ON l.tax_code_id = c.id
- WHERE c.code IN ('01','02','03','45','49')
+ WHERE c.code IN ('00','01','02','03','45','49')
AND l.partner_id IN %s
AND l.period_id IN %s
GROUP BY l.partner_id, p.name, p.vat) AS sub1
diff --git a/addons/l10n_ch/account_wizard.py b/addons/l10n_ch/account_wizard.py
index 7b80e3697ee..306207c612d 100644
--- a/addons/l10n_ch/account_wizard.py
+++ b/addons/l10n_ch/account_wizard.py
@@ -36,8 +36,9 @@ class WizardMultiChartsAccounts(osv.osv_memory):
def execute(self, cr, uid, ids, context=None):
"""Override of code in order to be able to link journal with account in XML"""
res = super(WizardMultiChartsAccounts, self).execute(cr, uid, ids, context)
- path = addons.get_module_resource(os.path.join('l10n_ch','sterchi_chart','account_journal_rel.xml'))
+ path = addons.get_module_resource('l10n_ch','sterchi_chart','account_journal_rel.xml')
tools.convert_xml_import(cr, 'l10n_ch', path, idref=None, mode='init', noupdate=True, report=None)
+ res.update({'type': 'ir.actions.act_window_close'})
return res
WizardMultiChartsAccounts()
diff --git a/addons/l10n_ch/bank.py b/addons/l10n_ch/bank.py
index 9dd0caddf38..79dcb1a6834 100644
--- a/addons/l10n_ch/bank.py
+++ b/addons/l10n_ch/bank.py
@@ -48,7 +48,7 @@ class ResPartnerBank(osv.osv):
'dta_code': fields.char('DTA code', size=5),
'print_bank': fields.boolean('Print Bank on BVR'),
'print_account': fields.boolean('Print Account Number on BVR'),
- 'acc_number': fields.char('Account/IBAN Number', size=64),
+ 'acc_number': fields.char('Account Number', size=64),
'my_bank': fields.boolean('Use my account to print BVR ?', help="Check to print BVR invoices"),
}
diff --git a/addons/l10n_ch/bank_view.xml b/addons/l10n_ch/bank_view.xml
index da1badd7fe8..017f9bd1f9b 100644
--- a/addons/l10n_ch/bank_view.xml
+++ b/addons/l10n_ch/bank_view.xml
@@ -28,34 +28,6 @@
</field>
</field>
</record>
-
- <!-- res.partner.bank in res partner form-->
- <!-- Partner -> Bank Details -->
-
- <record model="ir.ui.view" id="l10nch_view_res_partner_bank_add_groups">
- <field name="name">res.partner_bank.form.hide.f2</field>
- <field name="model">res.partner</field>
- <field name="inherit_id" ref="account.view_partner_property_form"/>
- <field name="arch" type="xml">
- <field name="state" position="after">
- <newline/>
- <separator colspan="4" string="Account Infos"/>
- <group string="Bank account info" colspan="4" attrs="{'invisible': [('state','in', ['bvpost','bvrpost'])]}" >
- <field name="acc_number" string="Account/IBAN Number" attrs="{'required': [('state','not in',['bvpost','bvrpost'])]}"/>
- <field name="dta_code"/>
- <newline/>
- </group>
- <newline/>
- <group string="Postal account info" colspan="4" attrs="{'invisible': [('state','not in', ['bvpost','bvrpost','bvbank','bvrbank'])]}" >
- <field name="post_number" attrs="{'required': [('state','in',['bvpost','bvrpost','bvrbank'])]}"/>
- <newline/>
- </group>
- <separator colspan="4" string="Financial Institute Infos"/>
- <field name="bank" />
- </field>
- </field>
- </record>
-
<!-- res.partner.bank base form-->
<!-- Sales -> Configuration -> Address Book -> Bank accounts -->
@@ -66,35 +38,21 @@
<field name="model">res.partner.bank</field>
<field name="inherit_id" ref="base.view_partner_bank_form"/>
<field name="arch" type="xml">
- <field name="state" position="after">
- <newline/>
-
- <separator colspan="4" string="Account Infos"/>
- <newline/>
- <group string="Bank account info" colspan="4" attrs="{'invisible': [('state','in', ['bvpost','bvrpost'])]}" >
- <field name="acc_number" string="Account/IBAN Number" attrs="{'required': [('state','not in',['bvpost','bvrpost'])]}"/>
- <field name="dta_code"/>
- <newline/>
- </group>
- <newline/>
- <group string="Postal account info" colspan="4" attrs="{'invisible': [('state','not in', ['bvpost','bvrpost','bvbank','bvrbank'])]}" >
- <field name="post_number" attrs="{'required': [('state','in',['bvpost','bvrpost','bvrbank'])]}"/>
- <newline/>
- </group>
- <separator colspan="4" string="Financial Institute Infos"/>
- <newline/>
- <group attrs="{'invisible': ['|', ('state', 'not in', ['bvrpost','bvrbank']), ('company_id', '=', False)]}" colspan="4">
- <field name="my_bank" attrs="{'invisible': [('company_id', '=', False)]}" />
- <group string="BVR print options" colspan="4" attrs="{'invisible': [('my_bank', '!=', True)]}" >
- <field name="bvr_adherent_num" attrs="{'invisible': [('state','!=','bvrbank')]}"/>
- <field name="print_bank"/>
- <field name="print_account"/>
- <newline/>
- </group>
+ <xpath expr="//field[@name='acc_number']" position="attributes">
+ <attribute name="attrs">{'required': [('state','not in',['bvpost','bvrpost'])]}</attribute>
+ </xpath>
+ <xpath expr="//field[@name='acc_number']" position="after">
+ <field name="post_number" attrs="{'required': [('state','in',['bvpost','bvrpost','bvrbank'])], 'invisible': [('state','not in', ['bvpost','bvrpost','bvbank','bvrbank'])]}"/>
+ <field name="dta_code" attrs="{'invisible': [('state','in', ['bvpost','bvrpost'])]}"/>
+ <field name="my_bank" attrs="{'invisible': ['|', ('state', 'not in', ['bvrpost','bvrbank']), ('company_id', '=', False)]}" />
+ </xpath>
+ <xpath expr="//group[@name='bank']" position="after">
+ <group string="BVR print options" attrs="{'invisible': [('my_bank', '!=', True)]}" >
+ <field name="bvr_adherent_num" attrs="{'invisible': [('state','!=','bvrbank')]}"/>
+ <field name="print_bank"/>
+ <field name="print_account"/>
</group>
- <newline/>
- <field name="bank" />
- </field>
+ </xpath>
</field>
</record>
diff --git a/addons/l10n_in/l10n_in_private_chart.xml b/addons/l10n_in/l10n_in_private_chart.xml
index f38f95750cf..45f5edb33d9 100644
--- a/addons/l10n_in/l10n_in_private_chart.xml
+++ b/addons/l10n_in/l10n_in_private_chart.xml
@@ -277,7 +277,7 @@
<field name="type">view</field>
<field name="user_type" ref="account.data_account_type_liability"/>
<field name="reconcile" eval="False"/>
- <field name="parent_id" ref="a1"/>
+ <field name="parent_id" ref="a20"/>
</record>
<!-- <record model="account.account.template" id="290">
diff --git a/addons/l10n_ma/__openerp__.py b/addons/l10n_ma/__openerp__.py
index 1648fb6b171..6cc213c8d2f 100644
--- a/addons/l10n_ma/__openerp__.py
+++ b/addons/l10n_ma/__openerp__.py
@@ -36,7 +36,6 @@ Seddik au cours du troisième trimestre 2010.""",
'website': 'http://www.kazacube.com',
'depends' : ['base', 'account'],
'data' : [
- 'security/compta_security.xml',
'security/ir.model.access.csv',
'account_type.xml',
'account_pcg_morocco.xml',
diff --git a/addons/l10n_ma/security/compta_security.xml b/addons/l10n_ma/security/compta_security.xml
deleted file mode 100644
index 8d511ae7154..00000000000
--- a/addons/l10n_ma/security/compta_security.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><openerp><data noupdate="0">
-
- <record id="group_expert_comptable" model="res.groups">
- <field name="name">Finance / Expert Comptable </field>
- <field name="users" eval="[(4, ref('base.user_root'))]"/>
- </record>
-</data>
-</openerp>
diff --git a/addons/l10n_nl/account_chart_netherlands.xml b/addons/l10n_nl/account_chart_netherlands.xml
index 4c9fe63308b..48cf78f382b 100644
--- a/addons/l10n_nl/account_chart_netherlands.xml
+++ b/addons/l10n_nl/account_chart_netherlands.xml
@@ -3955,11 +3955,13 @@
<field name="code">4a</field>
<field name="parent_id" ref="btw_code_vanuit_buitenland"/>
<field name="name">Leveringen uit landen buiten de EU (invoer) (BTW)</field>
+ <field name="sign" eval="-1" />
</record>
<record id="btw_code_4b" model="account.tax.code.template">
<field name="code">4b</field>
<field name="parent_id" ref="btw_code_vanuit_buitenland"/>
<field name="name">Verwerving van goederen uit landen binnen de EU (BTW)</field>
+ <field name="sign" eval="-1" />
</record>
<!-- 5. Voorbelasting, kleineondernemersregeling, schatting en eindtotaal -->
<record id="btw_code_voorbelasting" model="account.tax.code.template">
@@ -4100,6 +4102,7 @@
<field name="property_account_payable" ref="a_pay"/> <!-- crediteuren -->
<field name="property_account_expense_categ" ref="a_expense"/><!-- aankoop grondstoffen -->
<field name="property_account_income_categ" ref="a_sale"/> <!-- verkoop rekening -->
+ <field name="property_reserve_and_surplus_account" ref="a_9999"/>
</record>
<!-- BTW Template
@@ -4325,7 +4328,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_I_6_1" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import binnen EU laag(1)</field>
- <field eval="1.00" name="amount"/>
+ <field eval="-1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_I_6"/>
<field name="account_collected_id" ref="vat_payable6"/>
@@ -4337,7 +4340,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_I_6_2" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import binnen EU laag(2)</field>
- <field eval="-1.00" name="amount"/>
+ <field eval="1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_I_6"/>
<field name="account_collected_id" ref="vat_refund6"/>
@@ -4360,7 +4363,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_I_19_1" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import binnen EU hoog(1)</field>
- <field eval="1.00" name="amount"/>
+ <field eval="-1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_I_19"/>
<field name="account_collected_id" ref="vat_payable19"/>
@@ -4372,7 +4375,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_I_19_2" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import binnen EU hoog(2)</field>
- <field eval="-1.00" name="amount"/>
+ <field eval="1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_I_19"/>
<field name="account_collected_id" ref="vat_refund19"/>
@@ -4395,7 +4398,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_I_overig_1" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import binnen EU overig(1)</field>
- <field eval="1.00" name="amount"/>
+ <field eval="-1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_I_overig"/>
<field name="account_collected_id" ref="vat_payable19"/>
@@ -4407,7 +4410,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_I_overig_2" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import binnen EU overig(2)</field>
- <field eval="-1.00" name="amount"/>
+ <field eval="1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_I_overig"/>
<field name="account_collected_id" ref="vat_refund19"/>
@@ -4458,7 +4461,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_E1_1" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import buiten EU laag(1)</field>
- <field eval="1.00" name="amount"/>
+ <field eval="-1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_E1"/>
<field name="account_collected_id" ref="vat_payable6"/>
@@ -4470,7 +4473,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_E1_2" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import buiten EU laag(2)</field>
- <field eval="-1.00" name="amount"/>
+ <field eval="1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_E1"/>
<field name="account_collected_id" ref="vat_refund6"/>
@@ -4493,7 +4496,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_E2_1" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import buiten EU hoog(1)</field>
- <field eval="1.00" name="amount"/>
+ <field eval="-1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_E2"/>
<field name="account_collected_id" ref="vat_payable19"/>
@@ -4505,7 +4508,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_E2_2" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import buiten EU hoog(2)</field>
- <field eval="-1.00" name="amount"/>
+ <field eval="1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_E2"/>
<field name="account_collected_id" ref="vat_refund19"/>
@@ -4528,7 +4531,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_E_overig_1" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import buiten EU overig(1)</field>
- <field eval="1.00" name="amount"/>
+ <field eval="-1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_E_overig"/>
<field name="account_collected_id" ref="vat_payable19"/>
@@ -4540,7 +4543,7 @@ TODO rubriek 1c en 1d moeten nog, zijn variabel, dus BTW percentage moet door ge
<record id="btw_E_overig_2" model="account.tax.template">
<field name="chart_template_id" ref="l10nnl_chart_template"/>
<field name="name">Inkopen import buiten EU overig(2)</field>
- <field eval="-1.00" name="amount"/>
+ <field eval="1.00" name="amount"/>
<field name="type">percent</field>
<field name="parent_id" ref="btw_E_overig"/>
<field name="account_collected_id" ref="vat_refund19"/>
diff --git a/addons/lunch/wizard/lunch_order_cancel_view.xml b/addons/lunch/wizard/lunch_order_cancel_view.xml
index 8421dd74f9b..91d6a959241 100644
--- a/addons/lunch/wizard/lunch_order_cancel_view.xml
+++ b/addons/lunch/wizard/lunch_order_cancel_view.xml
@@ -33,7 +33,7 @@
<act_window id="action_lunch_order_cancel_values"
key2="client_action_multi" name="Cancel Order"
res_model="lunch.order.cancel" src_model="lunch.order"
- view_mode="form" target="new" view_type="form"/>
+ view_mode="form" target="new" view_type="form" multi="True"/>
</data>
</openerp>
diff --git a/addons/lunch/wizard/lunch_order_confirm_view.xml b/addons/lunch/wizard/lunch_order_confirm_view.xml
index dadde4ed089..022d17acea3 100644
--- a/addons/lunch/wizard/lunch_order_confirm_view.xml
+++ b/addons/lunch/wizard/lunch_order_confirm_view.xml
@@ -34,7 +34,7 @@
<act_window id="action_lunch_order_confirm_values"
key2="client_action_multi" name="Confirm Order"
res_model="lunch.order.confirm" src_model="lunch.order"
- view_mode="form" target="new" view_type="form"/>
+ view_mode="form" target="new" view_type="form" multi="True"/>
</data>
</openerp>
diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py
index b8f6c21ecf5..23417850f2a 100644
--- a/addons/mail/mail_followers.py
+++ b/addons/mail/mail_followers.py
@@ -19,6 +19,7 @@
#
##############################################################################
+from openerp import SUPERUSER_ID
from osv import osv
from osv import fields
import tools
@@ -91,7 +92,7 @@ class mail_notification(osv.Model):
:param browse_record message: mail.message to notify
"""
notify_pids = []
- for partner in self.pool.get('res.partner').browse(cr, uid, partner_ids, context=context):
+ for partner in self.pool.get('res.partner').browse(cr, SUPERUSER_ID, partner_ids, context=context):
# Do not send an email to the writer
if partner.user_ids and partner.user_ids[0].id == uid:
continue
diff --git a/addons/mail/mail_group_menu.py b/addons/mail/mail_group_menu.py
index 25b85bb7b22..707ece6a180 100644
--- a/addons/mail/mail_group_menu.py
+++ b/addons/mail/mail_group_menu.py
@@ -19,9 +19,10 @@
#
##############################################################################
+from openerp import SUPERUSER_ID
from osv import osv
from osv import fields
-from tools.translate import _
+
class ir_ui_menu(osv.osv):
""" Override of ir.ui.menu class. When adding mail_thread module, each
@@ -38,13 +39,14 @@ class ir_ui_menu(osv.osv):
def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
""" Override to take off menu entries (mail.group) the user is not
- following. """
+ following. Access are done using SUPERUSER_ID to avoid access
+ rights issues for an internal back-end algorithm. """
ids = super(ir_ui_menu, self).search(cr, uid, args, offset=0, limit=None, order=order, context=context, count=False)
- partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
+ partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
follower_obj = self.pool.get('mail.followers')
for menu in self.browse(cr, uid, ids, context=context):
if menu.mail_group_id:
- sub_ids = follower_obj.search(cr, uid, [
+ sub_ids = follower_obj.search(cr, SUPERUSER_ID, [
('partner_id', '=', partner_id), ('res_model', '=', 'mail.group'),
('res_id', '=', menu.mail_group_id.id)
], context=context)
diff --git a/addons/mail/mail_group_view.xml b/addons/mail/mail_group_view.xml
index a551a549b06..94b9f8f9b0b 100644
--- a/addons/mail/mail_group_view.xml
+++ b/addons/mail/mail_group_view.xml
@@ -81,6 +81,7 @@
</group>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"
options='{"thread_level": 1}'/>
<field name="message_follower_ids" widget="mail_followers"/>
diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index 6bbfa9bc30e..e9a569a8192 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -19,13 +19,12 @@
#
##############################################################################
-# import ast
import base64
import logging
import tools
-from osv import osv
-from osv import fields
+from openerp import SUPERUSER_ID
+from osv import osv, fields
from tools.translate import _
_logger = logging.getLogger(__name__)
@@ -134,7 +133,8 @@ class mail_mail(osv.Model):
:return: True
"""
if mail.auto_delete:
- mail.unlink()
+ # done with SUPERUSER_ID to avoid giving large unlink access rights
+ self.unlink(cr, SUPERUSER_ID, [mail.id], context=context)
return True
def send_get_mail_subject(self, cr, uid, mail, force=False, partner=None, context=None):
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py
index 1d5d85e36e0..7d9c7b3085f 100644
--- a/addons/mail/mail_message.py
+++ b/addons/mail/mail_message.py
@@ -24,8 +24,9 @@ import openerp
import tools
from email.header import decode_header
+from openerp import SUPERUSER_ID
from operator import itemgetter
-from osv import osv, fields
+from osv import osv, orm, fields
from tools.translate import _
_logger = logging.getLogger(__name__)
@@ -62,14 +63,14 @@ class mail_message(osv.Model):
continue
try:
result[message.id] = self._shorten_name(self.pool.get(message.model).name_get(cr, uid, [message.res_id], context=context)[0][1])
- except openerp.exceptions.AccessDenied, e:
+ except (orm.except_orm, osv.except_osv):
pass
return result
def _get_unread(self, cr, uid, ids, name, arg, context=None):
""" Compute if the message is unread by the current user. """
res = dict((id, {'unread': False}) for id in ids)
- partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
+ partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
notif_obj = self.pool.get('mail.notification')
notif_ids = notif_obj.search(cr, uid, [
('partner_id', 'in', [partner_id]),
@@ -87,7 +88,7 @@ class mail_message(osv.Model):
read_cond = '(read = false or read is null)'
else:
read_cond = 'read = true'
- partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
+ partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
cr.execute("SELECT message_id FROM mail_notification "\
"WHERE partner_id = %%s AND %s" % read_cond,
(partner_id,))
@@ -140,7 +141,8 @@ class mail_message(osv.Model):
return []
def _get_default_author(self, cr, uid, context=None):
- return self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
+ # remove context to avoid possible hack in browse with superadmin using context keys that could trigger a specific behavior
+ return self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=None).partner_id.id
_defaults = {
'type': 'email',
@@ -154,16 +156,17 @@ class mail_message(osv.Model):
#------------------------------------------------------
def vote_toggle(self, cr, uid, ids, user_ids=None, context=None):
- ''' Toggles voting '''
+ ''' Toggles voting. Done as SUPERUSER_ID because of write access on
+ mail.message not always granted. '''
if not user_ids:
user_ids = [uid]
for message in self.read(cr, uid, ids, ['vote_user_ids'], context=context):
for user_id in user_ids:
has_voted = user_id in message.get('vote_user_ids')
if not has_voted:
- self.write(cr, uid, message.get('id'), {'vote_user_ids': [(4, user_id)]}, context=context)
+ self.write(cr, SUPERUSER_ID, message.get('id'), {'vote_user_ids': [(4, user_id)]}, context=context)
else:
- self.write(cr, uid, message.get('id'), {'vote_user_ids': [(3, user_id)]}, context=context)
+ self.write(cr, SUPERUSER_ID, message.get('id'), {'vote_user_ids': [(3, user_id)]}, context=context)
return True
#------------------------------------------------------
@@ -171,17 +174,31 @@ class mail_message(osv.Model):
#------------------------------------------------------
def _message_dict_get(self, cr, uid, msg, context=None):
- """ Return a dict representation of the message browse record. """
+ """ Return a dict representation of the message browse record. A read
+ is performed to because of access rights issues (reading many2one
+ fields allow to have the foreign record name without having
+ to check external access rights).
+ """
has_voted = False
- vote_ids = self.pool.get('res.users').name_get(cr, uid, [user.id for user in msg.vote_user_ids], context=context)
+ vote_ids = self.pool.get('res.users').name_get(cr, SUPERUSER_ID, [user.id for user in msg.vote_user_ids], context=context)
for vote in vote_ids:
if vote[0] == uid:
has_voted = True
break
- attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)]
- author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0]
- author_user_id = self.pool.get('res.users').name_get(cr, uid, [msg.author_id.user_ids[0].id], context=context)[0]
- partner_ids = self.pool.get('res.partner').name_get(cr, uid, [x.id for x in msg.partner_ids], context=context)
+ try:
+ attachment_ids = [{'id': attach[0], 'name': attach[1]} for attach in self.pool.get('ir.attachment').name_get(cr, uid, [x.id for x in msg.attachment_ids], context=context)]
+ except (orm.except_orm, osv.except_osv):
+ attachment_ids = []
+ try:
+ author_id = self.pool.get('res.partner').name_get(cr, uid, [msg.author_id.id], context=context)[0]
+ is_author = uid in msg.author_id.user_ids
+ except (orm.except_orm, osv.except_osv):
+ author_id = False
+ is_author = False
+ try:
+ partner_ids = self.pool.get('res.partner').name_get(cr, uid, [x.id for x in msg.partner_ids], context=context)
+ except (orm.except_orm, osv.except_osv):
+ partner_ids = []
return {
'id': msg.id,
'type': msg.type,
@@ -193,7 +210,7 @@ class mail_message(osv.Model):
'subject': msg.subject,
'date': msg.date,
'author_id': author_id,
- 'author_user_id': author_user_id,
+ 'is_author': is_author,
'partner_ids': partner_ids,
'child_ids': [],
'vote_user_ids': vote_ids,
@@ -246,7 +263,7 @@ class mail_message(osv.Model):
limit = limit or self._message_read_limit
context = context or {}
if not ids:
- ids = self.search(cr, uid, domain, context=context, limit=limit)
+ ids = self.search(cr, SUPERUSER_ID, domain, context=context, limit=limit)
messages = self.browse(cr, uid, ids, context=context)
result = []
@@ -294,41 +311,99 @@ class mail_message(osv.Model):
cr.execute("""CREATE INDEX mail_message_model_res_id_idx ON mail_message (model, res_id)""")
def check_access_rule(self, cr, uid, ids, operation, context=None):
- """ mail.message access rule check
- - message received (a notification exists) -> ok
- - check rules of related document if exists
- - fallback on normal mail.message check """
+ """ Access rules of mail.message:
+ - read: if
+ - notification exist (I receive pushed message) OR
+ - author_id = pid (I am the author) OR
+ - I can read the related document if res_model, res_id
+ - Otherwise: raise
+ - create: if
+ - I am in the document message_follower_ids OR
+ - I can write on the related document if res_model, res_id
+ - Otherwise: raise
+ - write: if
+ - I can write on the related document if res_model, res_id
+ - Otherwise: raise
+ - unlink: if
+ - I can write on the related document if res_model, res_id
+ - Otherwise: raise
+ """
+ if uid == SUPERUSER_ID:
+ return
if isinstance(ids, (int, long)):
ids = [ids]
+ partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=None)['partner_id'][0]
- # check messages for which you have a notification
- partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
- not_obj = self.pool.get('mail.notification')
- not_ids = not_obj.search(cr, uid, [
- ('partner_id', '=', partner_id),
- ('message_id', 'in', ids),
- ], context=context)
- notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, uid, not_ids, context=context)
- if notification.message_id.id in ids]
+ # Read mail_message.ids to have their values
+ model_record_ids = {}
+ message_values = dict.fromkeys(ids)
+ cr.execute('SELECT DISTINCT id, model, res_id, author_id FROM "%s" WHERE id = ANY (%%s)' % self._table, (ids,))
+ for id, rmod, rid, author_id in cr.fetchall():
+ message_values[id] = {'res_model': rmod, 'res_id': rid, 'author_id': author_id}
+ if rmod:
+ model_record_ids.setdefault(rmod, set()).add(rid)
+
+ # Read: Check for received notifications -> could become an ir.rule, but not till we do not have a many2one variable field
+ if operation == 'read':
+ not_obj = self.pool.get('mail.notification')
+ not_ids = not_obj.search(cr, SUPERUSER_ID, [
+ ('partner_id', '=', partner_id),
+ ('message_id', 'in', ids),
+ ], context=context)
+ notified_ids = [notification.message_id.id for notification in not_obj.browse(cr, SUPERUSER_ID, not_ids, context=context)]
+ else:
+ notified_ids = []
+ # Read: Check messages you are author -> could become an ir.rule, but not till we do not have a many2one variable field
+ if operation == 'read':
+ author_ids = [mid for mid, message in message_values.iteritems()
+ if message.get('author_id') and message.get('author_id') == partner_id]
+ else:
+ author_ids = []
+
+ # Create: Check message_follower_ids
+ if operation == 'create':
+ doc_follower_ids = []
+ for model, mids in model_record_ids.items():
+ fol_obj = self.pool.get('mail.followers')
+ fol_ids = fol_obj.search(cr, SUPERUSER_ID, [
+ ('res_model', '=', model),
+ ('res_id', 'in', list(mids)),
+ ('partner_id', '=', partner_id),
+ ], context=context)
+ fol_mids = [follower.res_id for follower in fol_obj.browse(cr, SUPERUSER_ID, fol_ids, context=context)]
+ doc_follower_ids += [mid for mid, message in message_values.iteritems()
+ if message.get('res_model') == model and message.get('res_id') in fol_mids]
+ else:
+ doc_follower_ids = []
- # check messages linked to an existing document
+ # Calculate remaining ids, and related model/res_ids
model_record_ids = {}
- document_ids = []
- cr.execute('SELECT DISTINCT id, model, res_id FROM mail_message WHERE id = ANY (%s)', (ids,))
- for id, rmod, rid in cr.fetchall():
- if not (rmod and rid):
- continue
- document_ids.append(id)
- model_record_ids.setdefault(rmod, set()).add(rid)
+ other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids))
+ for id in other_ids:
+ if message_values[id]['res_model']:
+ model_record_ids.setdefault(message_values[id]['res_model'], set()).add(message_values[id]['res_id'])
+
+ # CRUD: Access rights related to the document
+ document_related_ids = []
for model, mids in model_record_ids.items():
model_obj = self.pool.get(model)
mids = model_obj.exists(cr, uid, mids)
- model_obj.check_access_rights(cr, uid, operation)
- model_obj.check_access_rule(cr, uid, mids, operation, context=context)
-
- # fall back on classic operation for other ids
- other_ids = set(ids).difference(set(notified_ids), set(document_ids))
- super(mail_message, self).check_access_rule(cr, uid, other_ids, operation, context=None)
+ if operation in ['create', 'write', 'unlink']:
+ model_obj.check_access_rights(cr, uid, 'write')
+ model_obj.check_access_rule(cr, uid, mids, 'write', context=context)
+ else:
+ model_obj.check_access_rights(cr, uid, operation)
+ model_obj.check_access_rule(cr, uid, mids, operation, context=context)
+ document_related_ids += [mid for mid, message in message_values.iteritems()
+ if message.get('res_model') == model and message.get('res_id') in mids]
+
+ # Calculate remaining ids: if not void, raise an error
+ other_ids = set(ids).difference(set(notified_ids), set(author_ids), set(doc_follower_ids), set(document_related_ids))
+ if not other_ids:
+ return
+ raise orm.except_orm(_('Access Denied'),
+ _('The requested operation cannot be completed due to security restrictions. Please contact your system administrator.\n\n(Document type: %s, Operation: %s)') % \
+ (self._description, operation))
def create(self, cr, uid, values, context=None):
if not values.get('message_id') and values.get('res_id') and values.get('model'):
@@ -337,6 +412,13 @@ class mail_message(osv.Model):
self.notify(cr, uid, newid, context=context)
return newid
+ def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
+ """ Override to explicitely call check_access_rule, that is not called
+ by the ORM. It instead directly fetches ir.rules and apply them. """
+ res = super(mail_message, self).read(cr, uid, ids, fields=fields, context=context, load=load)
+ self.check_access_rule(cr, uid, ids, 'read', context=context)
+ return res
+
def unlink(self, cr, uid, ids, context=None):
# cascade-delete attachments that are directly attached to the message (should only happen
# for mail.messages that act as parent for a standalone mail.mail record).
@@ -360,12 +442,14 @@ class mail_message(osv.Model):
partners_to_notify |= set(partner.id for partner in message.partner_ids)
# add all followers and set add them in partner_ids
if message.model and message.res_id:
- record = self.pool.get(message.model).browse(cr, uid, message.res_id, context=context)
+ record = self.pool.get(message.model).browse(cr, SUPERUSER_ID, message.res_id, context=context)
extra_notified = set(partner.id for partner in record.message_follower_ids)
missing_notified = extra_notified - partners_to_notify
if missing_notified:
- message.write({'partner_ids': [(4, p_id) for p_id in missing_notified]})
+ self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(4, p_id) for p_id in missing_notified]}, context=context)
partners_to_notify |= extra_notified
+ # # remove uid from partners
+ self.write(cr, SUPERUSER_ID, [newid], {'partner_ids': [(3, uid)]}, context=context)
self.pool.get('mail.notification').notify(cr, uid, list(partners_to_notify), newid, context=context)
def copy(self, cr, uid, id, default=None, context=None):
diff --git a/addons/mail/mail_message_view.xml b/addons/mail/mail_message_view.xml
index 914937a34f3..8e7129e8165 100644
--- a/addons/mail/mail_message_view.xml
+++ b/addons/mail/mail_message_view.xml
@@ -76,13 +76,6 @@
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_message_search"/>
</record>
-
- <act_window domain="[('partner_id', '=', active_id), ('email_from', '!=', False)]"
- context="{'default_partner_id': active_id}"
- id="act_res_partner_emails" name="Emails"
- res_model="mail.message"
- src_model="res.partner"
- view_id="view_message_tree"/>
<!-- Add menu entry in Settings/Email -->
<menuitem name="Messages" id="menu_mail_message" parent="base.menu_email" action="action_view_mail_message"/>
@@ -95,7 +88,7 @@
</record>
<record id="action_mail_my_feeds" model="ir.actions.client">
- <field name="name">My Feeds</field>
+ <field name="name">My Posts</field>
<field name="tag">mail.wall</field>
<field name="params" eval="&quot;{'domain': [('author_id.user_ids', 'in', [uid])],
'context': {'default_model': 'res.users', 'default_res_id': uid} }&quot;"/>
diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py
index abee20a35f8..c671dd55ec4 100644
--- a/addons/mail/mail_thread.py
+++ b/addons/mail/mail_thread.py
@@ -30,6 +30,7 @@ import xmlrpclib
from email.message import Message
from mail_message import decode
+from openerp import SUPERUSER_ID
from osv import osv, fields
from tools.safe_eval import safe_eval as eval
@@ -118,26 +119,27 @@ class mail_thread(osv.AbstractModel):
def _get_message_data(self, cr, uid, ids, name, args, context=None):
res = dict((id, dict(message_unread=False, message_summary='')) for id in ids)
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+ partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
+ # search for unread messages, by reading directly mail.notification, as SUPERUSER
notif_obj = self.pool.get('mail.notification')
- notif_ids = notif_obj.search(cr, uid, [
+ notif_ids = notif_obj.search(cr, SUPERUSER_ID, [
('partner_id.user_ids', 'in', [uid]),
('message_id.res_id', 'in', ids),
('message_id.model', '=', self._name),
('read', '=', False)
], context=context)
- for notif in notif_obj.browse(cr, uid, notif_ids, context=context):
+ for notif in notif_obj.browse(cr, SUPERUSER_ID, notif_ids, context=context):
res[notif.message_id.res_id]['message_unread'] = True
- for thread in self.browse(cr, uid, ids, context=context):
- cls = res[thread.id]['message_unread'] and ' class="oe_kanban_mail_new"' or ''
- res[thread.id]['message_summary'] = "<span%s><span class='oe_e'>9</span> %d</span> <span><span class='oe_e'>+</span> %d</span>" % (cls, len(thread.message_comment_ids), len(thread.message_follower_ids))
- res[thread.id]['message_is_follower'] = user.partner_id.id in [follower.id for follower in thread.message_follower_ids]
+ for thread in self.read(cr, uid, ids, ['message_follower_ids', 'message_comment_ids', 'message_ids'], context=context):
+ cls = res[thread['id']]['message_unread'] and ' class="oe_kanban_mail_new"' or ''
+ res[thread['id']]['message_summary'] = "<span%s><span class='oe_e'>9</span> %d</span> <span><span class='oe_e'>+</span> %d</span>" % (cls, len(thread['message_comment_ids']), len(thread['message_follower_ids']))
+ res[thread['id']]['message_is_follower'] = partner_id in thread['message_follower_ids']
return res
def _search_unread(self, cr, uid, obj=None, name=None, domain=None, context=None):
- partner_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).partner_id.id
+ partner_id = self.pool.get('res.users').read(cr, uid, uid, ['partner_id'], context=context)['partner_id'][0]
res = {}
notif_obj = self.pool.get('mail.notification')
notif_ids = notif_obj.search(cr, uid, [
@@ -196,6 +198,13 @@ class mail_thread(osv.AbstractModel):
fol_obj.unlink(cr, uid, fol_ids, context=context)
return super(mail_thread, self).unlink(cr, uid, ids, context=context)
+ def copy(self, cr, uid, id, default=None, context=None):
+ default = default or {}
+ default['message_ids'] = []
+ default['message_comment_ids'] = []
+ default['message_follower_ids'] = []
+ return super(mail_thread, self).copy(cr, uid, id, default=default, context=context)
+
#------------------------------------------------------
# mail.message wrappers and tools
#------------------------------------------------------
@@ -620,7 +629,7 @@ class mail_thread(osv.AbstractModel):
""" Wrapper on message_subscribe, using users. If user_ids is not
provided, subscribe uid instead. """
if not user_ids: user_ids = [uid]
- partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)]
+ partner_ids = [user['partner_id'][0] for user in self.pool.get('res.users').read(cr, uid, user_ids, ['partner_id'], context=context)]
return self.message_subscribe(cr, uid, ids, partner_ids, context=context)
def message_subscribe(self, cr, uid, ids, partner_ids, context=None):
@@ -631,7 +640,7 @@ class mail_thread(osv.AbstractModel):
""" Wrapper on message_subscribe, using users. If user_ids is not
provided, unsubscribe uid instead. """
if not user_ids: user_ids = [uid]
- partner_ids = [user.partner_id.id for user in self.pool.get('res.users').browse(cr, uid, user_ids, context=context)]
+ partner_ids = [user['partner_id'][0] for user in self.pool.get('res.users').read(cr, uid, user_ids, ['partner_id'], context=context)]
return self.message_unsubscribe(cr, uid, ids, partner_ids, context=context)
def message_unsubscribe(self, cr, uid, ids, partner_ids, context=None):
diff --git a/addons/mail/res_partner_view.xml b/addons/mail/res_partner_view.xml
index 2a8430926d5..5c051fc89b3 100644
--- a/addons/mail/res_partner_view.xml
+++ b/addons/mail/res_partner_view.xml
@@ -9,6 +9,7 @@
<field name="arch" type="xml">
<xpath expr="//sheet" position="after">
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"
options='{"thread_level": 1}'/>
<field name="message_follower_ids" widget="mail_followers"/>
diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv
index 2ec74086a34..26048e7a40c 100644
--- a/addons/mail/security/ir.model.access.csv
+++ b/addons/mail/security/ir.model.access.csv
@@ -1,13 +1,14 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_mail_global,mail.mail,model_mail_mail,base.group_system,1,1,1,1
-access_mail_message_all,mail.message.all,model_mail_message,,1,0,0,0
+access_mail_message_all,mail.message.all,model_mail_message,,1,0,1,0
access_mail_message_group_user,mail.message.group.user,model_mail_message,base.group_user,1,1,1,1
-access_mail_thread,mail.thread,model_mail_thread,base.group_user,1,1,1,0
-access_mail_followers_all,mail.followers.all,model_mail_followers,,1,1,1,1
-access_mail_notification_all,mail.notification.all,model_mail_notification,,1,1,1,1
-access_mail_group,mail.group,model_mail_group,base.group_user,1,1,1,1
+access_mail_mail_all,mail.mail.all,model_mail_mail,,0,0,1,0
+access_mail_mail_system,mail.mail.system,model_mail_mail,base.group_system,1,1,1,1
+access_mail_followers_all,mail.followers.all,model_mail_followers,,0,0,0,0
+access_mail_followers_system,mail.followers.system,model_mail_followers,base.group_system,1,1,1,1
+access_mail_notification_all,mail.notification.all,model_mail_notification,,1,0,0,0
+access_mail_notification_aystem,mail.notification.system,model_mail_notification,base.group_system,1,1,1,1
+access_mail_group_all,mail.group.all,model_mail_group,,1,0,0,0
+access_mail_group_user,mail.group.user,model_mail_group,base.group_user,1,1,1,1
+access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0
access_mail_alias_user,mail.alias,model_mail_alias,base.group_user,1,1,1,0
-access_mail_alias_system,mail.alias,model_mail_alias,base.group_system,1,1,1,1
-access_mail_mail_user,mail.mail,model_mail_mail,base.group_user,1,1,1,0
-access_mail_mail_manager,mail.mail,model_mail_mail,group_mail_manager,1,1,1,1
access_mail_vote_all,mail.vote.all,model_mail_vote,,1,1,1,1
diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml
index a12314e6f25..b503565bd11 100644
--- a/addons/mail/security/mail_security.xml
+++ b/addons/mail/security/mail_security.xml
@@ -2,20 +2,6 @@
<openerp>
<data>
- <!-- CATEGORY -->
- <record model="ir.module.category" id="module_category_social">
- <field name="name">Social and Sharing Tools</field>
- <field name="parent_id" ref="base.module_category_tools"/>
- <field name="sequence">26</field>
- </record>
-
- <!-- GROUPS -->
- <record id="group_mail_manager" model="res.groups">
- <field name="name">Mail manager</field>
- <field name="comment"></field>
- <field name="category_id" ref="module_category_social"/>
- </record>
-
<!-- RULES -->
<record id="group_rule_public_and_joined" model="ir.rule">
<field name="name">Mail.group: access only public and joined groups</field>
@@ -24,5 +10,18 @@
<field name="domain_force">['|', '|', ('public', '=', 'public'), ('message_follower_ids', 'in', [user.id]), '&amp;', ('public','=','groups'), ('group_public_id','in', [x.id for x in user.groups_id])]</field>
</record>
+ <!--
+ This rule can not be uncommented, because we have a more wide method in mail.message. When we implement a many2one_variable field, we will be able to uncomment this.
+
+ <record id="mail_message_read_partner_or_author" model="ir.rule">
+ <field name="name">mail.message: read if notified or author</field>
+ <field name="model_id" ref="model_mail_message"/>
+ <field name="domain_force">['|', ('partner_ids', 'in', user.partner_id.id), ('author_id', '=', user.partner_id.id)]</field>
+ <field name="perm_create" eval="False"/>
+ <field name="perm_write" eval="False"/>
+ <field name="perm_unlink" eval="False"/>
+ </record>
+ -->
+
</data>
</openerp>
diff --git a/addons/mail/static/src/css/mail.css b/addons/mail/static/src/css/mail.css
index 717d0439486..e69eaadbcdb 100644
--- a/addons/mail/static/src/css/mail.css
+++ b/addons/mail/static/src/css/mail.css
@@ -125,6 +125,14 @@
/* ------------------------------------------------------------ */
+/* Followers
+/* ------------------------------------------------------------ */
+
+.openerp div.oe_mail_recthread_aside h4 {
+ display: inline-block;
+}
+
+/* ------------------------------------------------------------ */
/* Thread
/* ------------------------------------------------------------ */
@@ -224,7 +232,7 @@
clear: both;
}
-.openerp .oe_mail_msg_content a {
+.openerp .oe_chatter a {
cursor: pointer;
}
@@ -258,30 +266,6 @@
display: none;
}
-/*--------------------------------------------------------------*/
-/* mail.vote
-/*--------------------------------------------------------------*/
-
-.openerp .oe_mail_msg_content button.oe_mail_msg_vote {
- height:21px;
- width: 30px;
- padding: 1px;
- background: #8A89BA;
- margin-top: -4px;
-}
-
-.openerp .oe_mail_msg_content button.oe_mail_msg_vote_true {
- background:#DC5F59;
-}
-
-.openerp .oe_mail_msg_content button.oe_mail_msg_vote span {
- color: white;
-}
-
-.openerp .oe_mail_msg_content span.oe_mail_vote_count{
- color: #807FB4;
-}
-
/* ------------------------------------------------------------ */
/* mail.compose.message form view & OpenERP hacks
diff --git a/addons/mail/static/src/js/mail.js b/addons/mail/static/src/js/mail.js
index 57c777441e7..196c54c8296 100644
--- a/addons/mail/static/src/js/mail.js
+++ b/addons/mail/static/src/js/mail.js
@@ -56,11 +56,6 @@ openerp.mail = function(session) {
return session.origin + '/web/binary/saveas?session_id=' + session.session_id + '&model=ir.attachment&field=datas&filename_field=datas_fname&id=' + attachment['id'];
},
- /** Check if the current user is the message author */
- is_author: function (widget, message_user_id) {
- return (widget.session && widget.session.uid != 0 && widget.session.uid == message_user_id);
- },
-
/** Replaces some expressions
* - :name - shortcut to an image
*/
@@ -301,6 +296,7 @@ openerp.mail = function(session) {
// TDE TODO: check for deferred, not sure it is correct
this._super.apply(this, arguments);
this.bind_events();
+ this.display_user_avatar();
// fetch and display message, using message_ids if set
var display_done = $.when(this.message_fetch(true, [], {})).then(this.proxy('do_customize_display'));
// add message composition form view
@@ -313,7 +309,6 @@ openerp.mail = function(session) {
/** Customize the display
* - show_header_compose: show the composition form in the header */
do_customize_display: function() {
- this.display_user_avatar();
if (this.options.show_header_compose) {
this.$el.find('div.oe_mail_thread_action').eq(0).show();
}
@@ -349,7 +344,8 @@ openerp.mail = function(session) {
// event: click on 'Reply by email' in msg side menu
this.$el.on('click', 'a.oe_mail_msg_reply_by_email', function (event) {
if (! self.compose_message_widget) return true;
- var msg_id = event.srcElement.dataset.msg_id;
+ evt = event.target || event.srcElement;
+ var msg_id = evt.dataset.msg_id;
if (! msg_id) return false;
self.compose_message_widget.refresh({
'default_composition_mode': 'reply',
@@ -370,9 +366,10 @@ openerp.mail = function(session) {
on_message_read: function (event) {
//TDE: TODO
- var msg_id = event.srcElement.dataset.id;
+ evt = event.target || event.srcElement;
+ var msg_id = evt.dataset.id;
if (! msg_id) return false;
- $(event.srcElement).parents('li.oe_mail_thread_msg').eq(0).remove();
+ $(evt).parents('li.oe_mail_thread_msg').eq(0).remove();
return this.ds_notification.call('set_message_read', [parseInt(msg_id)]);
},
@@ -489,8 +486,7 @@ openerp.mail = function(session) {
* - record.date: formatting according to the user timezone
* - record.timerelative: relative time givein by timeago lib
* - record.avatar: image url
- * - record.attachment_ids[].url: url of each attachment
- * - record.is_author: is the current user the author of the record */
+ * - record.attachment_ids[].url: url of each attachment */
display_record: function (record) {
// formatting and additional fields
record.date = session.web.format_value(record.date, {type:"datetime"});
@@ -504,7 +500,6 @@ openerp.mail = function(session) {
var attach = record.attachment_ids[l];
attach['url'] = mail.ChatterUtils.get_attachment_url(this.session, attach);
}
- record.is_author = mail.ChatterUtils.is_author(this, record.author_user_id[0]);
// add to internal storage
this.records[record.id] = record;
// render, add the expand feature
@@ -647,12 +642,15 @@ openerp.mail = function(session) {
// update domain
var domain = this.options.domain.concat([['model', '=', this.view.model], ['res_id', '=', this.view.datarecord.id]]);
// create and render Thread widget
+ var show_header_compose = this.view.is_action_enabled('edit') ||
+ (this.getParent().fields.message_is_follower && this.getParent().fields.message_is_follower.get_value());
this.$el.find('div.oe_mail_recthread_main').empty();
var thread = new mail.Thread(self, domain, this.options.context,
{ 'thread_level': this.options.thread_level,
- 'use_composer': true,
+ 'show_header_compose': show_header_compose,
+ 'use_composer': show_header_compose,
'show_dd_delete': true,
- 'show_reply_by_email': true });
+ 'show_reply_by_email': show_header_compose });
return thread.appendTo(this.$el.find('div.oe_mail_recthread_main'));
},
});
diff --git a/addons/mail/static/src/js/mail_followers.js b/addons/mail/static/src/js/mail_followers.js
index cf33bd64640..743c4704330 100644
--- a/addons/mail/static/src/js/mail_followers.js
+++ b/addons/mail/static/src/js/mail_followers.js
@@ -26,6 +26,8 @@ openerp_mail_followers = function(session, mail) {
this._super.apply(this, arguments);
this.options.image = this.node.attrs.image || 'image_small';
this.options.title = this.node.attrs.title || 'Followers';
+ this.options.context = this.node.attrs.context;
+ this.options.comment = this.node.attrs.help || false;
this.ds_model = new session.web.DataSetSearch(this, this.view.model);
this.ds_follow = new session.web.DataSetSearch(this, this.field.relation);
},
@@ -43,8 +45,8 @@ openerp_mail_followers = function(session, mail) {
},
reinit: function() {
- this.$el.find('button.oe_mail_button_follow').hide();
- this.$el.find('button.oe_mail_button_unfollow').hide();
+ this.message_is_follower == undefined;
+ this.display_buttons();
},
bind_events: function() {
@@ -53,7 +55,7 @@ openerp_mail_followers = function(session, mail) {
.mouseover(function () { $(this).html('Unfollow').removeClass('oe_mail_button_mouseout').addClass('oe_mail_button_mouseover'); })
.mouseleave(function () { $(this).html('Following').removeClass('oe_mail_button_mouseover').addClass('oe_mail_button_mouseout'); });
this.$el.on('click', 'button.oe_mail_button_follow', function () { self.do_follow(); });
- this.$el.on('click', 'button.oe_mail_button_invite', function(event) {
+ this.$el.on('click', 'a.oe_mail_invite', function(event) {
action = {
type: 'ir.actions.act_window',
res_model: 'mail.wizard.invite',
@@ -72,41 +74,65 @@ openerp_mail_followers = function(session, mail) {
read_value: function() {
var self = this;
- return this.ds_model.read_ids([this.view.datarecord.id], ['message_follower_ids']).pipe(function (results) {
- return results[0].message_follower_ids;
- }).pipe(this.proxy('set_value'));
+ return this.ds_model.read_ids([this.view.datarecord.id], ['message_is_follower', 'message_follower_ids']).then(function (results) {
+ self.set_value(results[0].message_follower_ids, results[0].message_is_follower);
+ });
},
- set_value: function(value_) {
+ set_value: function(value_, message_is_follower) {
this.reinit();
if (! this.view.datarecord.id ||
session.web.BufferedDataSet.virtual_id_regex.test(this.view.datarecord.id)) {
- this.$el.find('div.oe_mail_recthread_aside').hide();
+ this.$('div.oe_mail_recthread_aside').hide();
return;
}
- return this.fetch_followers(value_ || this.get_value());
+ return this.fetch_followers(value_ || this.get_value(), message_is_follower);
+ },
+
+ fetch_followers: function (value_, message_is_follower) {
+ this.value = value_;
+ this.message_is_follower = message_is_follower || (this.getParent().fields.message_is_follower && this.getParent().fields.message_is_follower.get_value());
+ return this.ds_follow.call('read', [value_, ['name', 'user_ids']]).pipe(this.proxy('display_followers'), this.proxy('display_generic'));
},
- fetch_followers: function (value_) {
- return this.ds_follow.call('read', [value_, ['name', 'user_ids']]).pipe(this.proxy('display_followers'));
+
+ /* Display generic info about follower, for people not having access to res_partner */
+ display_generic: function (error, event) {
+ event.preventDefault();
+ var node_user_list = this.$('ul.oe_mail_followers_display').empty();
+ // format content: Followers (You and 0 other) // Followers (3)
+ var content = this.options.title;
+ if (this.message_is_follower) {
+ content += ' (You and ' + (this.value.length-1) + ' other)';
+ }
+ else {
+ content += ' (' + this.value.length + ')'
+ }
+ this.$('div.oe_mail_recthread_followers h4').html(content);
+ this.display_buttons();
+ return $.when();
},
/** Display the followers, evaluate is_follower directly */
display_followers: function (records) {
var self = this;
- this.message_is_follower = _.indexOf(_.flatten(_.pluck(records, 'user_ids')), this.session.uid) != -1;
- var node_user_list = this.$el.find('ul.oe_mail_followers_display').empty();
- this.$el.find('div.oe_mail_recthread_followers h4').html(this.options.title + ' (' + records.length + ')');
+ var node_user_list = this.$('ul.oe_mail_followers_display').empty();
+ this.$('div.oe_mail_recthread_followers h4').html(this.options.title + ' (' + records.length + ')');
_(records).each(function (record) {
record.avatar_url = mail.ChatterUtils.get_image(self.session, 'res.partner', 'image_small', record.id);
$(session.web.qweb.render('mail.followers.partner', {'record': record})).appendTo(node_user_list);
});
- if (this.message_is_follower) {
- this.$el.find('button.oe_mail_button_follow').hide();
- this.$el.find('button.oe_mail_button_unfollow').show(); }
- else {
- this.$el.find('button.oe_mail_button_follow').show();
- this.$el.find('button.oe_mail_button_unfollow').hide(); }
+ this.display_buttons();
+ },
+
+ display_buttons: function () {
+ this.$('button.oe_mail_button_follow').hide();
+ this.$('button.oe_mail_button_unfollow').hide();
+ this.$('span.oe_mail_invite_wrapper').hide();
+ if (! this.view.is_action_enabled('edit')) return;
+ this.$('span.oe_mail_invite_wrapper').show();
+ if (this.message_is_follower) { this.$('button.oe_mail_button_unfollow').show(); }
+ else if (this.message_is_follower == false) { this.$('button.oe_mail_button_follow').show(); }
},
do_follow: function () {
diff --git a/addons/mail/static/src/xml/mail.xml b/addons/mail/static/src/xml/mail.xml
index e3586e723e4..c54bd4dbb2d 100644
--- a/addons/mail/static/src/xml/mail.xml
+++ b/addons/mail/static/src/xml/mail.xml
@@ -140,7 +140,7 @@
<li t-if="options.show_record_name and record.record_name and record.subject and options.thread_level > 0">
<a t-attf-href="#model=#{record.model}&amp;id=#{record.res_id}"><t t-raw="record.record_name"/></a>
</li>
- <li><a t-attf-href="#model=res.partner&amp;id=#{record.author_id[0]}"><t t-raw="record.author_id[1]"/></a></li>
+ <li t-if="record.author_id"><a t-attf-href="#model=res.partner&amp;id=#{record.author_id[0]}"><t t-raw="record.author_id[1]"/></a></li>
<li><span t-att-title="record.date"><t t-raw="record.timerelative"/></span></li>
<t t-call="mail.thread.message.vote"/>
<li t-if="options.show_reply"><a class="oe_mail_msg_reply">Reply</a></li>
@@ -185,7 +185,7 @@
<t t-if='record.vote_user_ids.length > 0'>
<span class="oe_left oe_mail_vote_count"><t t-esc="record.vote_user_ids.length"/> votes</span>
</t>
- <button t-attf-class="oe_mail_msg_vote oe_mail_msg_vote_#{record.has_voted}" t-attf-data-msg_id="{record.id}">
+ <button t-attf-class="oe_mail_msg_vote oe_tag" t-attf-data-msg_id="{record.id}">
<t t-if="! record.has_voted"><span>+1</span></t>
<t t-if="record.has_voted"><span>-1</span></t>
</button>
diff --git a/addons/mail/static/src/xml/mail_followers.xml b/addons/mail/static/src/xml/mail_followers.xml
index 32ce34d48d1..203a7bce789 100644
--- a/addons/mail/static/src/xml/mail_followers.xml
+++ b/addons/mail/static/src/xml/mail_followers.xml
@@ -7,13 +7,17 @@
-->
<div t-name="mail.followers" class="oe_mail_recthread_aside oe_semantic_html_override">
<div class="oe_mail_recthread_actions">
- <button type="button" class="oe_mail_button_invite">Invite</button>
<button type="button" class="oe_mail_button_follow">Follow</button>
<button type="button" class="oe_mail_button_unfollow oe_mail_button_mouseout">Following</button>
</div>
+ <div class="oe_grey">
+ <t t-if="widget.options.comment">
+ <h5><t t-raw="widget.options.comment"/></h5>
+ </t>
+ </div>
<div class="oe_mail_recthread_followers">
<t t-if="widget.options.title">
- <h4><t t-raw="widget.options.title"/></h4>
+ <h4><t t-raw="widget.options.title"/></h4><span class="oe_mail_invite_wrapper"> · <a class="oe_mail_invite" >Invite partners</a></span>
</t>
<ul class="oe_mail_followers_display"></ul>
</div>
diff --git a/addons/mail/tests/__init__.py b/addons/mail/tests/__init__.py
index d63c5634cc3..2d48fa233c4 100644
--- a/addons/mail/tests/__init__.py
+++ b/addons/mail/tests/__init__.py
@@ -18,10 +18,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
-from . import test_mail
+from . import test_mail, test_mail_access_rights
checks = [
test_mail,
+ test_mail_access_rights,
]
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/mail/tests/test_mail_access_rights.py b/addons/mail/tests/test_mail_access_rights.py
new file mode 100644
index 00000000000..104d7f28ffe
--- /dev/null
+++ b/addons/mail/tests/test_mail_access_rights.py
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Business Applications
+# Copyright (c) 2012-TODAY OpenERP S.A. <http://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
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+##############################################################################
+
+from openerp.addons.mail.tests import test_mail
+from osv.orm import except_orm
+
+
+class test_mail_access_rights(test_mail.TestMailMockups):
+
+ def setUp(self):
+ super(test_mail_access_rights, self).setUp()
+ cr, uid = self.cr, self.uid
+ self.mail_group = self.registry('mail.group')
+ self.mail_message = self.registry('mail.message')
+ self.mail_notification = self.registry('mail.notification')
+ self.res_users = self.registry('res.users')
+ self.res_groups = self.registry('res.groups')
+ self.res_partner = self.registry('res.partner')
+
+ # create a 'pigs' group that will be used through the various tests
+ self.group_pigs_id = self.mail_group.create(self.cr, self.uid,
+ {'name': 'Pigs', 'description': 'Fans of Pigs, unite !'})
+
+ # Find Employee group
+ group_employee_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'base', 'group_user')
+ self.group_employee_id = group_employee_ref and group_employee_ref[1] or False
+
+ # Create Bert (without groups) and Raoul( employee)
+ self.user_bert_id = self.res_users.create(cr, uid, {'name': 'Bert Tartopoils', 'login': 'bert', 'groups_id': [(6, 0, [])]})
+ self.user_raoul_id = self.res_users.create(cr, uid, {'name': 'Raoul Grosbedon', 'login': 'raoul', 'groups_id': [(6, 0, [self.group_employee_id])]})
+ self.user_bert = self.res_users.browse(cr, uid, self.user_bert_id)
+ self.partner_bert_id = self.user_bert.partner_id.id
+ self.user_raoul = self.res_users.browse(cr, uid, self.user_raoul_id)
+ self.partner_raoul_id = self.user_raoul.partner_id.id
+
+ def test_00_mail_message_read_access_rights(self):
+ """ Test basic mail_message read access rights. """
+ cr, uid = self.cr, self.uid
+ partner_bert_id, partner_raoul_id = self.partner_bert_id, self.partner_raoul_id
+ user_bert_id, user_raoul_id = self.user_bert_id, self.user_raoul_id
+
+ # Prepare groups: Pigs (employee), Jobs (public)
+ self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message')
+ self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'})
+
+ # ----------------------------------------
+ # CASE1: Bert, basic mail.message read access
+ # ----------------------------------------
+
+ # Do: create a new mail.message
+ message_id = self.mail_message.create(cr, uid, {'body': 'My Body'})
+ # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc
+ self.assertRaises(except_orm, self.mail_message.read,
+ cr, user_bert_id, message_id)
+ # Do: message is pushed to Bert
+ notif_id = self.mail_notification.create(cr, uid, {'message_id': message_id, 'partner_id': partner_bert_id})
+ # Test: Bert reads the message, ok because notification pushed
+ self.mail_message.read(cr, user_bert_id, message_id)
+ # Do: remove notification
+ self.mail_notification.unlink(cr, uid, notif_id)
+ # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc
+ self.assertRaises(except_orm, self.mail_message.read,
+ cr, self.user_bert_id, message_id)
+ # Do: Bert is now the author
+ self.mail_message.write(cr, uid, [message_id], {'author_id': partner_bert_id})
+ # Test: Bert reads the message, ok because Bert is the author
+ self.mail_message.read(cr, user_bert_id, message_id)
+ # Do: Bert is not the author anymore
+ self.mail_message.write(cr, uid, [message_id], {'author_id': partner_raoul_id})
+ # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc
+ self.assertRaises(except_orm, self.mail_message.read,
+ cr, user_bert_id, message_id)
+ # Do: message is attached to a document Bert can read, Jobs
+ self.mail_message.write(cr, uid, [message_id], {'model': 'mail.group', 'res_id': self.group_jobs_id})
+ # Test: Bert reads the message, ok because linked to a doc he is allowed to read
+ self.mail_message.read(cr, user_bert_id, message_id)
+ # Do: message is attached to a document Bert cannot read, Pigs
+ self.mail_message.write(cr, uid, [message_id], {'model': 'mail.group', 'res_id': self.group_pigs_id})
+ # Test: Bert reads the message, crash because not notification/not in doc followers/not read on doc
+ self.assertRaises(except_orm, self.mail_message.read,
+ cr, user_bert_id, message_id)
+
+ def test_05_mail_message_search_access_rights(self):
+ """ Test mail_message search override about access rights. """
+ self.assertTrue(1 == 1, 'Test not implemented, do not replace by return True')
+
+ def test_10_mail_flow_access_rights(self):
+ """ Test a Chatter-looks alike flow. """
+ cr, uid = self.cr, self.uid
+ partner_bert_id, partner_raoul_id = self.partner_bert_id, self.partner_raoul_id
+ user_bert_id, user_raoul_id = self.user_bert_id, self.user_raoul_id
+
+ # Prepare groups: Pigs (employee), Jobs (public)
+ self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message')
+ self.group_jobs_id = self.mail_group.create(cr, uid, {'name': 'Jobs', 'public': 'public'})
+
+ # ----------------------------------------
+ # CASE1: Bert, without groups
+ # ----------------------------------------
+ # Do: Bert creates a group, should crash because perm_create only for employees
+ self.assertRaises(except_orm,
+ self.mail_group.create,
+ cr, user_bert_id, {'name': 'Bert\'s Group'})
+ # Do: Bert reads Jobs basic fields, ok because public = read access on the group
+ self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['name', 'description'])
+ # Do: Bert browse Pigs, ok (no direct browse of partners)
+ self.mail_group.browse(cr, user_bert_id, self.group_jobs_id)
+ # Do: Bert reads Jobs messages, ok because read access on the group => read access on its messages
+ jobs_message_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_ids'])['message_ids']
+ self.mail_message.read(cr, user_bert_id, jobs_message_ids)
+ # Do: Bert reads Jobs followers, ko because partner are accessible to employees or partner manager
+ jobs_followers_ids = self.mail_group.read(cr, user_bert_id, self.group_jobs_id, ['message_follower_ids'])['message_follower_ids']
+ self.assertRaises(except_orm,
+ self.res_partner.read,
+ cr, user_bert_id, jobs_followers_ids)
+ # Do: Bert comments Jobs, ko because no write access on the group and not in the followers
+ self.assertRaises(except_orm,
+ self.mail_group.message_post,
+ cr, user_bert_id, self.group_jobs_id, body='I love Pigs')
+ # Do: add Bert to jobs followers
+ self.mail_group.message_subscribe(cr, uid, [self.group_jobs_id], [partner_bert_id])
+ # Do: Bert comments Jobs, ok because he is now in the followers
+ self.mail_group.message_post(cr, user_bert_id, self.group_jobs_id, body='I love Pigs')
+
+ # Do: Bert reads Pigs, should crash because mail.group security=groups only for employee group
+ self.assertRaises(except_orm,
+ self.mail_group.read,
+ cr, user_bert_id, self.group_pigs_id)
+
+ # ----------------------------------------
+ # CASE1: Raoul, employee
+ # ----------------------------------------
+ # Do: Bert read Pigs, ok because public
+ self.mail_group.read(cr, user_raoul_id, self.group_pigs_id)
+ # Do: Bert read Jobs, ok because group_public_id = employee
+ self.mail_group.read(cr, user_raoul_id, self.group_jobs_id)
diff --git a/addons/marketing_campaign/marketing_campaign_view.xml b/addons/marketing_campaign/marketing_campaign_view.xml
index 19b9536c432..189bd8285f2 100644
--- a/addons/marketing_campaign/marketing_campaign_view.xml
+++ b/addons/marketing_campaign/marketing_campaign_view.xml
@@ -5,21 +5,36 @@
<menuitem name="Configuration" id="menu_marketing_configuration" parent="base.marketing_menu" sequence="1"/>
<!-- Marketing Campaign -->
- <act_window name="All Segments"
- res_model="marketing.campaign.segment"
- src_model="marketing.campaign"
- view_type="form"
- view_mode="tree,form"
- id="act_marketing_campaing_segment_opened"
- context="{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}"/>
+
+ <record id="act_marketing_campaing_segment_opened" model="ir.actions.act_window">
+ <field name="res_model">marketing.campaign.segment</field>
+ <field name="view_type">form</field>
+ <field name="name">Segments</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}</field>
+ </record>
+
+ <!-- Campaign Follow-ups -->
+
+ <record id="act_marketing_campaing_followup" model="ir.actions.act_window">
+ <field name="res_model">marketing.campaign.workitem</field>
+ <field name="view_type">form</field>
+ <field name="name">Workitems</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}</field>
+ </record>
+
+ <!-- Campaign Statistics -->
+
+ <record id="act_marketing_campaing_stat" model="ir.actions.act_window" >
+ <field name="res_model">campaign.analysis</field>
+ <field name="view_type">form</field>
+ <field name="name">Campaign Follow-up</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}</field>
+ </record>
<!-- Campaign Followups -->
- <act_window
- context="{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}"
- id="act_marketing_campaing_followup"
- name="Campaign Follow-up" res_model="marketing.campaign.workitem"
- src_model="marketing.campaign" view_mode="tree,form"
- view_type="form"/>
<record model="ir.ui.view" id="view_marketing_campaign_form">
<field name="name">marketing.campaign.form</field>
@@ -35,12 +50,15 @@
</header>
<sheet string="Campaign">
<div class="oe_right oe_button_box" name="button_box">
- <button type="action"
+ <button type="action"
+ name="%(act_marketing_campaing_stat)d"
+ string="Campaign Statistics"/>
+ <button type="action"
+ name="%(act_marketing_campaing_segment_opened)d"
+ string="Segments"/>
+ <button type="action"
name="%(act_marketing_campaing_followup)d"
string="Follow-Up"/>
- <button type="action"
- name="%(act_marketing_campaing_segment_opened)d"
- string="Segments"/>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
@@ -422,29 +440,5 @@
<menuitem id="menu_action_marketing_campaign_workitem" parent="menu_marketing_campaign" action="action_marketing_campaign_workitem" sequence="10"/>
- <act_window name="All Segments"
- res_model="marketing.campaign.segment"
- src_model="marketing.campaign"
- view_type="form"
- view_mode="tree,form"
- id="act_marketing_campaing_segment_opened"
- context="{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}"/>
-
- <!-- Campaign Follow-ups -->
- <act_window
- context="{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}"
- id="act_marketing_campaing_followup"
- name="Campaign Follow-up" res_model="marketing.campaign.workitem"
- src_model="marketing.campaign" view_mode="tree,form"
- view_type="form"/>
-
- <!-- Campaign Statistics -->
- <act_window
- context="{'search_default_campaign_id': [active_id], 'default_campaign_id': active_id}"
- id="act_marketing_campaing_stat"
- name="Campaign Statistics" res_model="campaign.analysis"
- src_model="marketing.campaign" view_mode="tree,form"
- view_type="form"/>
-
</data>
</openerp>
diff --git a/addons/marketing_campaign/res_partner.py b/addons/marketing_campaign/res_partner.py
index 98ac53b7b29..8ae1ab8645a 100644
--- a/addons/marketing_campaign/res_partner.py
+++ b/addons/marketing_campaign/res_partner.py
@@ -29,7 +29,13 @@ class res_partner(osv.osv):
'partner_id', 'Workitems',
readonly=True),
}
-
+
+ def copy(self, cr, uid, id, default={}, context=None):
+ default.update({
+ 'workitem_ids': [],
+ })
+ return super(res_partner, self).copy(cr, uid, id, default=default, context=context)
+
res_partner()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/marketing_campaign/res_partner_view.xml b/addons/marketing_campaign/res_partner_view.xml
index 5b959625086..63c65ccd97f 100644
--- a/addons/marketing_campaign/res_partner_view.xml
+++ b/addons/marketing_campaign/res_partner_view.xml
@@ -12,7 +12,7 @@
<attribute name="invisible">False</attribute>
</xpath>
<xpath expr="//page[@name='page_history']" position="inside">
- <group name="grp_campaign" string="Campaign">
+ <group name="grp_campaign" string="Campaigns">
<field name="workitem_ids" colspan="4" nolabel="1"/>
</group>
</xpath>
diff --git a/addons/membership/membership.py b/addons/membership/membership.py
index 2a006814629..87af723f2f9 100644
--- a/addons/membership/membership.py
+++ b/addons/membership/membership.py
@@ -338,7 +338,7 @@ class Partner(osv.osv):
-Paid Member: A member who has paid the membership amount."""),
'membership_start': fields.function(
_membership_date, multi = 'membeship_start',
- string = 'Start Membership Date', type = 'date',
+ string = 'Membership Start Date', type = 'date',
store = {
'account.invoice': (_get_invoice_partner, ['state'], 10),
'membership.membership_line': (_get_partner_id, ['state'], 10, ),
@@ -346,7 +346,7 @@ class Partner(osv.osv):
}, help="Date from which membership becomes active."),
'membership_stop': fields.function(
_membership_date,
- string = 'Stop Membership Date', type='date', multi='membership_stop',
+ string = 'Membership End Date', type='date', multi='membership_stop',
store = {
'account.invoice': (_get_invoice_partner, ['state'], 10),
'membership.membership_line': (_get_partner_id, ['state'], 10),
diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py
index 94ee4bdb3b2..00a5790b67e 100644
--- a/addons/mrp/mrp.py
+++ b/addons/mrp/mrp.py
@@ -106,6 +106,7 @@ class mrp_routing_workcenter(osv.osv):
"""
_name = 'mrp.routing.workcenter'
_description = 'Work Center Usage'
+ _order = 'sequence'
_columns = {
'workcenter_id': fields.many2one('mrp.workcenter', 'Work Center', required=True),
'name': fields.char('Name', size=64, required=True),
@@ -226,6 +227,7 @@ class mrp_bom(osv.osv):
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.bom', context=c),
}
_order = "sequence"
+ _parent_name = "bom_id"
_sql_constraints = [
('bom_qty_zero', 'CHECK (product_qty>0)', 'All product quantities must be greater than 0.\n' \
'You should install the mrp_subproduct module if you want to manage extra products on BoMs !'),
@@ -461,7 +463,8 @@ class mrp_production(osv.osv):
'date_start': fields.datetime('Start Date', select=True, readonly=True),
'date_finished': fields.datetime('End Date', select=True, readonly=True),
- 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id','=',False)], readonly=True, states={'draft':[('readonly',False)]}),
+ 'bom_id': fields.many2one('mrp.bom', 'Bill of Material', domain=[('bom_id','=',False)], readonly=True, states={'draft':[('readonly',False)]},
+ help="Bill of Materials allow you to define the list of required raw materials to make a finished product."),
'routing_id': fields.many2one('mrp.routing', string='Routing', on_delete='set null', readonly=True, states={'draft':[('readonly',False)]},
help="The list of operations (list of work centers) to produce the finished product. The routing is mainly used to compute work center costs during operations and to plan future loads on work centers based on production plannification."),
'picking_id': fields.many2one('stock.picking', 'Picking List', readonly=True, ondelete="restrict",
@@ -670,7 +673,7 @@ class mrp_production(osv.osv):
for (production_id,name) in self.name_get(cr, uid, ids):
production = self.browse(cr, uid, production_id)
- if production.move_prod_id:
+ if production.move_prod_id and production.move_prod_id.location_id.id != production.location_dest_id.id:
move_obj.write(cr, uid, [production.move_prod_id.id],
{'location_id': production.location_dest_id.id})
self.action_ready_send_note(cr, uid, [production_id], context)
@@ -828,7 +831,8 @@ class mrp_production(osv.osv):
'ref': wc.code,
'product_id': wc.product_id.id,
'unit_amount': wc_line.hour,
- 'product_uom_id': wc.product_id.uom_id.id
+ 'product_uom_id': wc.product_id.id and wc.product_id.uom_id.id or False
+
} )
if wc.costs_journal_id and wc.costs_general_account_id:
value = wc_line.cycle * wc.costs_cycle
@@ -844,7 +848,8 @@ class mrp_production(osv.osv):
'ref': wc.code,
'product_id': wc.product_id.id,
'unit_amount': wc_line.cycle,
- 'product_uom_id': wc.product_id.uom_id.id
+ 'product_uom_id': wc.product_id.id and wc.product_id.uom_id.id or False
+
} )
return amount
diff --git a/addons/mrp/mrp_view.xml b/addons/mrp/mrp_view.xml
index d05893cf778..a198d736bbc 100644
--- a/addons/mrp/mrp_view.xml
+++ b/addons/mrp/mrp_view.xml
@@ -13,7 +13,7 @@
parent="base.menu_mrp_root"
sequence="1"/>
- <menuitem name="Master Data"
+ <menuitem name="Products"
id="menu_mrp_bom"
parent="base.menu_mrp_root"
sequence="5"/>
@@ -409,8 +409,9 @@
</page>
</notebook>
<div class="oe_chatter">
- <field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
- <field name="message_follower_ids" widget="mail_followers"/>
+ <field name="message_is_follower" invisible="1"/>
+ <field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
+ <field name="message_follower_ids" widget="mail_followers"/>
</div>
</form>
</field>
@@ -513,7 +514,15 @@
</p>
</field>
</record>
-
+
+ <record id="product_supply_method_produce" model="ir.actions.act_window">
+ <field name="name">Products</field>
+ <field name="res_model">product.product</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">kanban,tree,form</field>
+ <field name="context">{'search_default_filter_supply_method_produce' : 1}</field>
+ <field name="search_view_id" ref="product.product_search_form_view"/>
+ </record>
<!-- BOM menus -->
<menuitem
@@ -521,6 +530,10 @@
id="menu_mrp_bom_form_action"
parent="menu_mrp_bom"
sequence="10"/>
+ <menuitem name="Products"
+ id="menu_mrp_product_form"
+ action="product_supply_method_produce"
+ parent="menu_mrp_bom"/>
<menuitem
action="mrp_bom_form_action2"
id="menu_mrp_bom_form_action2"
@@ -532,9 +545,7 @@
<field name="name">Bill of Materials Structure</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.bom</field>
- <field name="domain">[('id','in',active_ids)]</field>
- <field name="view_type">tree</field>
- <field name="view_mode">tree</field>
+ <field name="domain">[('bom_id', '=',active_ids)]</field>
<field name="view_id" ref="mrp_bom_tree_view"/>
</record>
<record id="ir_BOM_structure" model="ir.values">
@@ -644,7 +655,7 @@
<field name="date_planned"/>
</group>
<group>
- <field name="bom_id" domain="[('product_id','=',product_id)]" context="{'default_product_id': product_id}" on_change="bom_id_change(bom_id)"/>
+ <field name="bom_id" domain="[('product_id','=',product_id)]" context="{'default_product_id': product_id}" on_change="bom_id_change(bom_id)" required="1"/>
<field name="routing_id" class="oe_inline" groups="mrp.group_mrp_routings"/>
<field name="user_id"/>
<field name="origin"/>
@@ -663,7 +674,7 @@
<field name="product_id"/>
<field name="product_qty" string="Quantity"/>
<field name="product_uom" string="Unit of Measure" groups="product.group_uom"/>
- <field name="prodlot_id" groups="stock.group_production_lot"/>
+ <field name="prodlot_id" groups="stock.group_production_lot" context="{'product_id': product_id}"/>
<field name="state" invisible="1"/>
<button name="%(stock.move_consume)d"
string="Consume Products" type="action"
@@ -787,6 +798,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml
index 834f3000472..0bcce6063f1 100644
--- a/addons/mrp_operations/mrp_operations_view.xml
+++ b/addons/mrp_operations/mrp_operations_view.xml
@@ -107,6 +107,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/mrp_repair/mrp_repair_view.xml b/addons/mrp_repair/mrp_repair_view.xml
index 55cbe49c75b..976961693c6 100644
--- a/addons/mrp_repair/mrp_repair_view.xml
+++ b/addons/mrp_repair/mrp_repair_view.xml
@@ -189,6 +189,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/mrp_repair/wizard/mrp_repair_make_invoice_view.xml b/addons/mrp_repair/wizard/mrp_repair_make_invoice_view.xml
index 431cf0d54b4..21d71064901 100644
--- a/addons/mrp_repair/wizard/mrp_repair_make_invoice_view.xml
+++ b/addons/mrp_repair/wizard/mrp_repair_make_invoice_view.xml
@@ -27,7 +27,8 @@
view_mode="form"
target="new"
key2="client_action_multi"
- id="act_mrp_repair_invoice"/>
+ id="act_mrp_repair_invoice"
+ multi="True"/>
</data>
</openerp>
diff --git a/addons/note/note_view.xml b/addons/note/note_view.xml
index 62b007aab6e..d5af65f8763 100644
--- a/addons/note/note_view.xml
+++ b/addons/note/note_view.xml
@@ -117,8 +117,11 @@
<field name="stage_id" domain="[('user_id','=',uid)]" widget="statusbar" clickable="1"/>
</header>
<field name="memo" widget="html"/><!-- editor_width="100%%" editor_height="60%%" -->
- <field name="message_follower_ids" widget="mail_followers"/>
- <field class="oe_chatter" name="message_ids" widget="mail_thread"/>
+ <div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
+ <field name="message_ids" widget="mail_thread"/>
+ <field name="message_follower_ids" widget="mail_followers"/>
+ </div>
</form>
</field>
</record>
diff --git a/addons/note/security/res.groups.csv b/addons/note/security/res.groups.csv
index 88d7b2cd667..b54b1b02393 100644
--- a/addons/note/security/res.groups.csv
+++ b/addons/note/security/res.groups.csv
@@ -1,2 +1,2 @@
-id,name,implied_ids/id
-group_note_fancy,Memo / Fancy mode,
+id,name,implied_ids/id,category_id/id
+group_note_fancy,Notes / Fancy mode,,base.module_category_hidden
diff --git a/addons/pad/static/src/css/etherpad.css b/addons/pad/static/src/css/etherpad.css
index bd73af6c2cd..6d27b527383 100644
--- a/addons/pad/static/src/css/etherpad.css
+++ b/addons/pad/static/src/css/etherpad.css
@@ -1,17 +1,36 @@
-.oe_pad_head {
- box-sizing: border-box;
- width: 100%;
- display: block;
- padding: 4px;
- text-align: right;
+.oe_pad {
+ margin-top: 16px;
}
-.oe_pad_head .oe_pad_switch {
-
+
+.oe_pad_switch_positioner {
+ position: relative;
}
-.oe_pad_readonly {
- border: 1px solid #ddd;
- padding: 8px;
+.oe_pad_switch {
+ position: absolute;
+ top: 5px;
+ left: 383px;
+ width: 28px;
+ height: 28px;
+ background-image: -webkit-linear-gradient(top, white, #f0f0f0);
+ border: solid 1px #ccc;
+ border-radius:3px;
+ text-align: center;
+ line-height: 22px;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ color: #666666;
+ padding-top:-3px;
+ padding-left:-1px;
+ cursor: pointer;
+}
+
+.oe_pad_switch:hover{
+ background-image: -webkit-linear-gradient(top, #f4f4f4, #e4e4e4);
+}
+
+.oe_pad_fullscreen .oe_pad_switch {
+ top:4px;
}
.oe_pad_fullscreen {
@@ -27,9 +46,9 @@
z-index: 1000;
}
-.oe_pad_content {
+.oe_pad.oe_configured .oe_pad_content.oe_editing{
border: solid 1px #c4c4c4;
- height: 150px;
+ height:300px;
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
-moz-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
-ms-box-shadow: 0 5px 10px rgba(0,0,0,0.1);
@@ -37,12 +56,7 @@
box-shadow: 0 5px 10px rgba(0,0,0,0.1);
}
-.oe_pad_content > p {
- text-align: center;
- opacity: 0.75;
-}
-
-.oe_pad_fullscreen .oe_pad_content {
+.oe_pad.oe_configured.oe_pad_fullscreen .oe_pad_content {
height: 100%;
border: none;
-webkit-box-shadow: none;
@@ -52,6 +66,16 @@
box-shadow: none;
}
+.oe_pad.oe_unconfigured > p {
+ text-align: center;
+ opacity: 0.75;
+}
+
+.oe_pad_loading{
+ text-align: center;
+ opacity: 0.75;
+}
+
.etherpad_readonly ul, .etherpad_readonly ol {
margin-before: 1em;
margin-after: 1em;
diff --git a/addons/pad/static/src/js/pad.js b/addons/pad/static/src/js/pad.js
index e598ecca4f5..1e45b535867 100644
--- a/addons/pad/static/src/js/pad.js
+++ b/addons/pad/static/src/js/pad.js
@@ -1,62 +1,61 @@
openerp.pad = function(instance) {
+
+ instance.web.form.FieldPad = instance.web.form.AbstractField.extend({
+ template: 'FieldPad',
+ configured: false,
+ content: "",
+ set_value: function(val) {
+ var self = this;
+ var _super = self._super;
+ _super.apply(self,[val]);
-instance.web.form.FieldPad = instance.web.form.AbstractField.extend({
- template: 'FieldPad',
- start: function() {
- this._super();
- var self = this;
- this.$el.find('div.oe_pad_head').click(function(ev) {
- self.$el.toggleClass('oe_pad_fullscreen');
- });
- this.on("change:effective_readonly", this, function() {
- this.render_value();
- });
- },
- set_value: function(val) {
- var self = this;
- var _super = self._super;
- _super.apply(self,[val]);
-
- if (val === false || val === "") {
- self.field_manager.dataset.call('pad_generate_url',{context:{
- model: self.field_manager.model,
- field_name: self.name,
- object_id: self.field_manager.datarecord.id
- }}).then(function(data) {
- if(data&&data.url){
- _super.apply(self,[data.url]);
- self.render_value();
- }
- });
- } else {
- self.render_value();
- }
- this._dirty_flag = true;
- },
- render_value: function() {
- var self = this;
- var value = this.get('value');
-
- if (!_.str.startsWith(value, "http")) {
- self.$('.oe_pad_content').html(instance.web.qweb.render('FieldPad.unconfigured'));
- } else {
- if (!this.get("effective_readonly")) {
- var pad_username = this.session.username;
- var code = '<iframe width="100%" height="100%" frameborder="0" src="'+value+'?showChat=false&userName='+pad_username+'"></iframe>';
- this.$('.oe_pad_content').html(code);
- } else {
- $.get(value+'/export/html').success(function(data) {
- self.$('.oe_pad_content').html('<div class="oe_pad_readonly">'+data+'</div>');
- }).error(function() {
- self.$('.oe_pad_content').text('Unable to load pad');
+ if (val === false || val === "") {
+ self.field_manager.dataset.call('pad_generate_url',{context:{
+ model: self.field_manager.model,
+ field_name: self.name,
+ object_id: self.field_manager.datarecord.id
+ }}).then(function(data) {
+ if(data&&data.url){
+ _super.apply(self,[data.url]);
+ self.renderElement();
+ }
});
+ } else {
+ self.renderElement();
}
- }
- },
-});
-
-instance.web.form.widgets = instance.web.form.widgets.extend({
- 'pad': 'instance.web.form.FieldPad',
-});
+ this._dirty_flag = true;
+ },
+ renderElement: function(){
+ var self = this;
+ var value = this.get('value');
+ if(!_.str.startsWith(value,'http')){
+ this.configured = false;
+ this.content = "";
+ }else{
+ this.configured = true;
+ if(!this.get('effective_readonly')){
+ this.content = '<iframe width="100%" height="100%" frameborder="0" src="'+value+'?showChat=false&userName='+this.session.username+'"></iframe>';
+ }else{
+ this.content = '<div class="oe_pad_loading">... Loading pad ...</div>';
+ $.get(value+'/export/html').success(function(data){
+ self.$('.oe_pad_content').html('<div class="oe_pad_readonly">'+data+'<div>');
+ }).error(function(){
+ self.$('.oe_pad_content').text('Unable to load pad');
+ });
+ }
+ }
+ this._super();
+ this.$('.oe_pad_content').html(this.content);
+ this.$('.oe_pad_switch').click(function(){
+ self.$el.toggleClass('oe_pad_fullscreen');
+ });
+ this.on('change:effective_readonly',this,function(){
+ self.renderElement();
+ });
+ },
+ });
+ instance.web.form.widgets = instance.web.form.widgets.extend({
+ 'pad': 'instance.web.form.FieldPad',
+ });
};
diff --git a/addons/pad/static/src/xml/pad.xml b/addons/pad/static/src/xml/pad.xml
index 911655b6b89..eaa519dc04b 100644
--- a/addons/pad/static/src/xml/pad.xml
+++ b/addons/pad/static/src/xml/pad.xml
@@ -2,17 +2,35 @@
<!-- vim:fdl=1:
-->
<templates id="template" xml:space="preserve">
-<t t-name="FieldPad">
- <div class="oe_form_field_text oe_pad">
- <div class="oe_pad_head">
- <button class="oe_pad_switch oe_button">Fullscreen</button>
- </div>
- <div class="oe_pad_content"></div>
- </div>
-</t>
-<t t-name="FieldPad.unconfigured">
- <p>
- You must configure the etherpad through the menu Setting > Companies > Companies, in the configuration tab of your company.<br/>
- </p>
-</t>
+
+ <t t-name="FieldPad">
+
+ <t t-if="!widget.configured">
+ <div class="oe_form_field_text oe_pad oe_unconfigured">
+ <p>
+ You must configure the etherpad through the menu Setting > Companies > Companies, in the configuration tab of your company.
+ </p>
+ </div>
+ </t>
+
+ <t t-if="widget.configured">
+ <t t-if="widget.get('effective_readonly')">
+ <div class="oe_form_field_text oe_pad oe_configured">
+ <div class="oe_pad_content etherpad_readonly">
+ </div>
+ </div>
+ </t>
+
+ <t t-if="!widget.get('effective_readonly')">
+ <div class="oe_form_field_text oe_pad oe_configured">
+ <div class="oe_pad_switch_positioner">
+ <span class="oe_pad_switch oe_e">&amp;Ntilde;</span>
+ </div>
+ <div class="oe_pad_content oe_editing">
+ </div>
+ </div>
+ </t>
+ </t>
+ </t>
+
</templates>
diff --git a/addons/point_of_sale/controllers/main.py b/addons/point_of_sale/controllers/main.py
index e6976dd319c..3d80fd53e24 100644
--- a/addons/point_of_sale/controllers/main.py
+++ b/addons/point_of_sale/controllers/main.py
@@ -119,21 +119,21 @@ class PointOfSaleController(openerpweb.Controller):
return
@openerpweb.jsonrequest
- def payment_request(self, request, price, method, info):
+ def payment_request(self, request, price):
"""
The PoS will activate the method payment
"""
- print "payment_request: price:"+str(price)+" method:"+str(method)+" info:"+str(info)
- return
+ print "payment_request: price:"+str(price)
+ return 'ok'
@openerpweb.jsonrequest
- def is_payment_accepted(self, request):
- print "is_payment_accepted"
- return 'waiting_for_payment'
+ def payment_status(self, request):
+ print "payment_status"
+ return { 'status':'waiting' }
@openerpweb.jsonrequest
- def payment_canceled(self, request):
- print "payment_canceled"
+ def payment_cancel(self, request):
+ print "payment_cancel"
return
@openerpweb.jsonrequest
diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css
index 8213df7fc44..cbb625c02d7 100644
--- a/addons/point_of_sale/static/src/css/pos.css
+++ b/addons/point_of_sale/static/src/css/pos.css
@@ -111,12 +111,10 @@
left:0;
top:0;
width: 100%;
- height: 33px;
+ height: 34px;
margin:0;
padding:0;
color: gray;
- border-top: solid 1px #d3d3d3;
- border-bottom: solid 1px black;
background: #393939;
background: -moz-linear-gradient(#7b7979, #393939);
background: -webkit-gradient(linear, left top, left bottom, from(#7b7979), to(#393939));
@@ -253,7 +251,7 @@
.point-of-sale #content {
width: 100%;
position: absolute;
- top: 35px;
+ top: 34px;
bottom: 0;
background: #F0EEEE;
}
@@ -292,22 +290,29 @@
vertical-align: top;
}
.point-of-sale #paypad button {
- height: 54px;
+ height: 50px;
width: 208px;
- margin: 0 -3px;
+ margin: 0px -6px 4px -2px;
font-weight: bold;
vertical-align: middle;
color: #555555;
border-top: 1px solid #efefef;
font-size: 14px;
}
-.point-of-sale #paypad button:hover {
+.point-of-sale #paypad button:hover, .point-of-sale #numpad button:hover, .point-of-sale #numpad .selected-mode, .point-of-sale .popup button:hover {
+ border: none;
color: white;
background: #7f82ac;
background: -webkit-gradient(linear, left top, left bottom, from(#9d9fc5), to(#7f82ac));
background: -moz-linear-gradient(#9d9fc5, #7f82ac);
background: -ms-linear-gradient(#9d9fc5, #7f82ac);
background: linear-gradient(#9d9fc5, #7f82ac);
+ text-shadow: 0px 0px 5px rgba(255,255,255,0.21);
+ -webkit-box-shadow: 0px 0px 2px rgba(0,0,0,0.3) inset, 0px 1px 2px rgba(0,0,0,0.1);
+ -moz-box-shadow: 0px 0px 2px rgba(0,0,0,0.3) inset, 0px 1px 2px rgba(0,0,0,0.1);
+ -ms-box-shadow: 0px 0px 2px rgba(0,0,0,0.3) inset, 0px 1px 2px rgba(0,0,0,0.1);
+ -o-box-shadow: 0px 0px 2px rgba(0,0,0,0.3) inset, 0px 1px 2px rgba(0,0,0,0.1);
+ box-shadow: 0px 0px 2px rgba(0,0,0,0.3) inset, 0px 1px 2px rgba(0,0,0,0.1);
}
/* ********* The Numpad ********* */
@@ -318,30 +323,14 @@
text-align: center;
}
.point-of-sale #numpad button {
- height: 54px;
- width: 54px;
- margin: 0 -3px;
+ height: 50px;
+ width: 50px;
+ margin: 0px 0px 4px 0px;
font-weight: bold;
vertical-align: middle;
color: #555555;
border-top: 1px solid #efefef;
}
-.point-of-sale #numpad button:hover {
- color: white;
- background: #7f82ac;
- background: -webkit-gradient(linear, left top, left bottom, from(#9d9fc5), to(#7f82ac));
- background: -moz-linear-gradient(#9d9fc5, #7f82ac);
- background: -ms-linear-gradient(#9d9fc5, #7f82ac);
- background: linear-gradient(#9d9fc5, #7f82ac);
-}
-.point-of-sale #numpad .selected-mode {
- color: white;
- background: #7f82ac;
- background: -webkit-gradient(linear, left top, left bottom, from(#9d9fc5), to(#7f82ac));
- background: -moz-linear-gradient(#9d9fc5, #7f82ac);
- background: -ms-linear-gradient(#9d9fc5, #7f82ac);
- background: linear-gradient(#9d9fc5, #7f82ac);
-}
.point-of-sale .input-button {
font-size: 24px;
}
@@ -364,7 +353,7 @@
.point-of-sale #rightpane header {
padding: 0;
height: 32px;
- border-bottom: 1px solid #cecbcb;
+ border-bottom: 1px solid #c7c7c7;
background: #d3d3d3;
background: -moz-linear-gradient(white, #d3d3d3);
background: -webkit-gradient(linear, left top, left bottom, from(white), to(#d3d3d3));
@@ -391,7 +380,6 @@
bottom:0px;
left:0px;
right:0px;
- background: #eeedff;
}
/* a) the product list navigation bar */
@@ -451,7 +439,7 @@
/*background:#f0f0f0;*/
position: relative;
background-image: url('../img/bg.png');
- border-bottom: 1px solid #cecbcb;
+ border-bottom: 2px solid #e0e0e0;
}
.point-of-sale #categories .white-gradient{
position: absolute;
@@ -485,9 +473,9 @@
background:#fff;
border: 1px solid #fff;
border-radius: 3px;
- -webkit-box-shadow: 0px 1px 8px rgba(0,0,0,0.2);
- -moz-box-shadow: 0px 1px 8px rgba(0,0,0,0.2);
- box-shadow: 0px 1px 8px rgba(0,0,0,0.2);
+ -webkit-box-shadow: 0px 2px 0px #E9E9E9, 0px 3px 8px rgba(0, 0, 0, 0.34);
+ -moz-box-shadow: 0px 2px 0px #E9E9E9, 0px 3px 8px rgba(0, 0, 0, 0.34);
+ box-shadow: 0px 2px 0px #E9E9E9, 0px 3px 8px rgba(0, 0, 0, 0.34);
cursor: pointer;
}
@@ -546,16 +534,18 @@
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
- top:auto;
- left: 2px;
- right: 2px;
- bottom: 2px;
- background: #8a89ba; /*-webkit-linear-gradient(-90deg,rgba(138,137,186,0),rgba(138,137,186,1), rgba(138,137,186,1));*/
+ bottom: 0;
+ top: auto;
+ line-height: 14px;
+ width: 100%;
+ background: -webkit-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+ background: -moz-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+ background: -ms-linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+ background: linear-gradient(-90deg,rgba(255,255,255,0),rgba(255,255,255,1), rgba(255,255,255,1));
+ /*background:#FFF;*/
padding: 3px;
- /*color:#8a89ba;*/
- color: #FFF;
- cursor: pointer;
- border-radius: 3px;
+ padding-top: 15px;
+ color: #7C7BAD;
}
/* e) the product */
@@ -572,9 +562,9 @@
background:#fff;
border: 1px solid #fff;
border-radius: 3px;
- -webkit-box-shadow: 0px 1px 8px rgba(127,130,172,0.4);
- -moz-box-shadow: 0px 1px 8px rgba(127,130,172,0.4);
- box-shadow: 0px 1px 8px rgba(127,130,172,0.4);
+ -webkit-box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480;
+ -moz-box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480;
+ box-shadow: 0px 2px 0px #dad8e4, 0px 1px 8px #636480;
}
.point-of-sale .product .product-img {
@@ -596,10 +586,11 @@
right: 2px;
vertical-align: top;
color: white;
- line-height: 14px;
+ line-height: 13px;
background: #7f82ac;
padding: 2px 5px;
border-radius: 3px;
+ box-shadow: 0px 1px 0px #9A9CC5, 0px 3px 0px #7E86AC, 0px 3px 3px rgba(12, 14, 68, 0.67);
}
.point-of-sale .product .product-name {
@@ -630,6 +621,8 @@
top:0px;
bottom:0px;
width:100%;
+ background-image: -webkit-radial-gradient(rgba(255, 255, 255, 0),rgba(51, 17, 124, 0.25)), url('../img/grid.png');
+ box-shadow: 0px 36px 24px rgba(0, 0, 0, 0.14) inset;
}
.point-of-sale .screen header h2 {
margin-top: 0px;
@@ -638,6 +631,22 @@
.point-of-sale .screen p{
font-size: 18px;
}
+.point-of-sale .dialog{
+ width: 500px;
+ margin-left: auto;
+ margin-right: auto;
+ margin-top: 50px;
+ padding: 40px;
+ background-color: #f8f8f8;
+ border-radius: 4px;
+ text-align: center;
+ box-shadow: 0px 1px 0px white,0px -1px 0px white, 0px 4px 0px #DFDFDF, 0px 10px 30px rgba(0, 0, 0, 0.21);
+}
+.point-of-sale .dialog p{
+ font-size: 25px;
+ margin-top: 10px;
+ color: #5a5a5a;
+}
/* a) Layout for the Product Screen */
@@ -681,11 +690,32 @@
}
.point-of-sale .pos-step-container input{
font-size: 1em;
+ outline: none;
+ border: none;
+ padding: 0px 8px;
+ padding-top: 8px;
+ margin-left: 16px;
+ border-radius: 5px;
+ background: white;
+ box-shadow: 0px -1px 0px #E2E2E2 inset,0px 1px 0px white inset, 0px 4px 0px #DDD inset, 0px 4px 8px rgba(0, 0, 0, 0.55) inset;
+ color: #4c4c4c;
+ -webkit-animation: all 250ms linear;
+}
+
+.point-of-sale .pos-step-container input:focus{
+ box-shadow: 0px -1px 0px #C9CFFD inset,0px 1px 0px #B8C8FC inset, 0px 4px 0px #9FD5FF inset, 0px 4px 9px rgba(0, 31, 255, 0.55) inset;
+ color: #5d7ad6;
+ -webkit-animation: all 250ms linear;
}
.point-of-sale .pos-payment-container {
text-align: left;
min-width: 500px;
+ margin-top: 50px;
+ padding: 40px;
+ background-color: #f8f8f8;
+ border-radius: 4px;
+ box-shadow: 0px 1px 0px white,0px -1px 0px white, 0px 4px 0px #DFDFDF, 0px 10px 30px rgba(0, 0, 0, 0.21);
}
.point-of-sale .pos-payment-container .left-block{
display: inline-block;
@@ -695,7 +725,7 @@
text-align:left;
}
.point-of-sale .pos-payment-container .header{
- margin-top: 50px;
+ margin-top: 0px;
margin-bottom:20px;
font-weight: bold;
}
@@ -738,9 +768,8 @@
padding-bottom:30px;
display: inline-block;
font-family: "Inconsolata";
- -webkit-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3);
- -moz-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3);
- box-shadow: 0px 5px 16px rgba(0,0,0, 0.3);
+ border-radius: 2px;
+ box-shadow: 0px 1px 0px white, 0px 3px 0px #C1B9D6, 0px 8px 16px rgba(0, 0, 0, 0.3);
}
.point-of-sale .pos-sale-ticket .emph{
font-size: 20px;
@@ -774,6 +803,9 @@
.pos-sale-ticket {
margin: 0;
}
+ .debug-widget{
+ display: none !important;
+ }
}
/* d) The Scale screen */
@@ -785,9 +817,14 @@
margin-top: 100px;
margin-left: auto;
margin-right: auto;
+ padding: 40px;
+ background: #f1f1f1;
+ box-shadow: 0px 1px 0px white, 0px -1px 0px white, 0px 4px 0px #dfdfdf, 0px 10px 30px rgba(0,0,0,0.21);
+ border-radius: 4px;
}
.point-of-sale .scale-screen .product-picture {
+ position: relative;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
@@ -803,9 +840,7 @@
background:#fff;
border: 1px solid #fff;
border-radius: 3px;
- -webkit-box-shadow: 0px 1px 8px rgba(0,0,0,0.2);
- -moz-box-shadow: 0px 1px 8px rgba(0,0,0,0.2);
- box-shadow: 0px 1px 8px rgba(0,0,0,0.2);
+ box-shadow: 0px 2px 0px #e9e9e9, 0px 2px 8px rgba(0,0,0,0.2);
}
.point-of-sale .scale-screen .product-picture img{
@@ -832,30 +867,40 @@
.point-of-sale .scale-screen .product-name {
position: absolute;
left:0;
- top:20px;
+ top:50px;
height:50px;
font-size:40px;
line-height:50px;
text-align:right;
- right:225px;
+ right:275px;
+ color: #8d8d8d;
}
.point-of-sale .scale-screen .weight{
position: absolute;
- left:0;
- height:90px;
- bottom:15px;
- right:220px;
- padding:5px;
+ left: 40px;
+ height: 90px;
+ bottom: 55px;
+ right: 260px;
+ padding: 6px;
+ padding-right: 33px;
+ padding-top: 11px;
+ background: white;
+ border-radius: 3px;
+ box-shadow: 0px -1px #E2E2E2 inset,0px 1px white inset, 0px 4px #E6E4E4 inset, 0px 4px 8px rgba(0, 0, 0, 0.4) inset;
+
}
.point-of-sale .scale-screen .weight p{
display: inline-block;
text-align:right;
line-height: 90px;
- font-size: 80px;
- width:100%;
- height:100%;
- margin:0;
+ font-size: 70px;
+ width: 100%;
+ height: 100%;
+ margin: 0;
+ margin-right: 18px
font-family: "Inconsolata";
+ color: #6c6c6c;
+ text-shadow: 0px 3px 3px rgba(0,0,0, 0.2);
}
/* e) The Welcome Screen */
@@ -909,9 +954,10 @@
margin-top:16px;
margin-bottom:16px;
font-size:16px;
- -webkit-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3);
- -moz-box-shadow: 0px 5px 16px rgba(0,0,0, 0.3);
- box-shadow: 0px 5px 16px rgba(0,0,0, 0.3);
+ border-radius: 2px;
+ -webkit-box-shadow: 0px 1px 0px white, 0px 3px 0px #DFDFDF, 0px 7px 16px rgba(0, 0, 0, 0.20);
+ -moz-box-shadow: 0px 1px 0px white, 0px 3px 0px #DFDFDF, 0px 7px 16px rgba(0, 0, 0, 0.20);
+ box-shadow: 0px 1px 0px white, 0px 3px 0px #DFDFDF, 0px 7px 16px rgba(0, 0, 0, 0.20);
}
@@ -1201,10 +1247,8 @@
font-size:20px;
font-weight:bold;
background-color: #F0EEEE;
- border: 1px solid #E0DDDD;
- -webkit-box-shadow: 0px 10px 20px rgba(0,0,0, 0.3);
- -moz-box-shadow: 0px 10px 20px rgba(0,0,0, 0.3);
- -ms-box-shadow: 0px 10px 20px rgba(0,0,0, 0.3);
+ border-radius: 4px;
+ box-shadow: 0px -1px white, 0px 1px white, 0px 4px #949494, 0px 10px 20px rgba(0, 0, 0, 0.3);
z-index:1200;
}
.point-of-sale .popup .footer{
diff --git a/addons/point_of_sale/static/src/img/bancontact.png b/addons/point_of_sale/static/src/img/bancontact.png
index 5c34fefb0f9..bd4f63dbb5a 100644
--- a/addons/point_of_sale/static/src/img/bancontact.png
+++ b/addons/point_of_sale/static/src/img/bancontact.png
Binary files differ
diff --git a/addons/point_of_sale/static/src/img/grid-purple.png b/addons/point_of_sale/static/src/img/grid-purple.png
new file mode 100644
index 00000000000..2f0f4331e34
--- /dev/null
+++ b/addons/point_of_sale/static/src/img/grid-purple.png
Binary files differ
diff --git a/addons/point_of_sale/static/src/img/grid.png b/addons/point_of_sale/static/src/img/grid.png
new file mode 100644
index 00000000000..35dbab00913
--- /dev/null
+++ b/addons/point_of_sale/static/src/img/grid.png
Binary files differ
diff --git a/addons/point_of_sale/static/src/img/scan.png b/addons/point_of_sale/static/src/img/scan.png
index e5eafbe821d..c0bc93d7ca1 100644
--- a/addons/point_of_sale/static/src/img/scan.png
+++ b/addons/point_of_sale/static/src/img/scan.png
Binary files differ
diff --git a/addons/point_of_sale/static/src/js/devices.js b/addons/point_of_sale/static/src/js/devices.js
index a26d8ca7154..142d35bd340 100644
--- a/addons/point_of_sale/static/src/js/devices.js
+++ b/addons/point_of_sale/static/src/js/devices.js
@@ -14,7 +14,14 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
this.weighting = false;
this.paying = false;
- this.payment_status = 'waiting_for_payment';
+ this.default_payment_status = {
+ status: 'waiting',
+ message: '',
+ payment_method: undefined,
+ receipt_client: undefined,
+ receipt_shop: undefined,
+ };
+ this.custom_payment_status = this.default_payment_status;
this.connection = new instance.web.JsonRPC();
this.connection.setup(url);
@@ -23,16 +30,21 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
this.notifications = {};
},
- message : function(name,params,success_callback, error_callback){
- success_callback = success_callback || function(){};
- error_callback = error_callback || function(){};
-
+ message : function(name,params){
+ var ret = new $.Deferred();
var callbacks = this.notifications[name] || [];
for(var i = 0; i < callbacks.length; i++){
callbacks[i](params);
}
- this.connection.rpc('/pos/'+name, params || {}, success_callback, error_callback);
+ this.connection.rpc('/pos/'+name, params || {},
+ function(result){
+ ret.resolve(result);
+ },
+ function(error){
+ ret.reject(error);
+ });
+ return ret;
},
// this allows the client to be notified when a proxy call is made. The notification
@@ -47,23 +59,23 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
//a product has been scanned and recognized with success
// ean is a parsed ean object
scan_item_success: function(ean){
- this.message('scan_item_success',{ean: ean});
+ return this.message('scan_item_success',{ean: ean});
},
// a product has been scanned but not recognized
// ean is a parsed ean object
scan_item_error_unrecognized: function(ean){
- this.message('scan_item_error_unrecognized',{ean: ean});
+ return this.message('scan_item_error_unrecognized',{ean: ean});
},
//the client is asking for help
help_needed: function(){
- this.message('help_needed');
+ return this.message('help_needed');
},
//the client does not need help anymore
help_canceled: function(){
- this.message('help_canceled');
+ return this.message('help_canceled');
},
//the client is starting to weight
@@ -72,7 +84,7 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
this.weight = 0;
this.weighting = true;
this.bypass_proxy = false;
- this.message('weighting_start');
+ return this.message('weighting_start');
}
},
@@ -84,11 +96,12 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
if(this.bypass_proxy){
return this.weight;
}else{
- this.message('weighting_read_kg',{},function(weight){
- if(self.weighting && !self.bypass_proxy){
- self.weight = weight;
- }
- });
+ this.message('weighting_read_kg',{})
+ .then(function(weight){
+ if(self.weighting && !self.bypass_proxy){
+ self.weight = weight;
+ }
+ });
return this.weight;
}
},
@@ -104,77 +117,76 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
this.weight = 0;
this.weighting = false;
this.bypass_proxy = false;
- this.message('weighting_end');
+ return this.message('weighting_end');
},
// the pos asks the client to pay 'price' units
- // method: 'mastercard' | 'cash' | ... ? TBD
- // info: 'extra information to display on the payment terminal' ... ? TBD
- payment_request: function(price, method, info){
+ payment_request: function(price){
+ var ret = new $.Deferred();
this.paying = true;
- this.payment_status = 'waiting_for_payment';
- this.message('payment_request',{'price':price,'method':method,'info':info});
+ this.custom_payment_status = this.default_payment_status;
+ return this.message('payment_request',{'price':price});
},
- // is called at regular interval after a payment request to see if the client
- // has paid the required money
- // returns 'waiting_for_payment' | 'payment_accepted' | 'payment_rejected'
- is_payment_accepted: function(){
- var self = this;
+ payment_status: function(){
if(this.bypass_proxy){
this.bypass_proxy = false;
- return this.payment_status;
+ return (new $.Deferred()).resolve(this.custom_payment_status);
}else{
- this.message('is_payment_accepted', {}, function(payment_status){
- if(self.paying){
- self.payment_status = payment_status;
- }
- });
- return this.payment_status;
+ return this.message('payment_status');
}
},
// override what the proxy says and accept the payment
debug_accept_payment: function(){
this.bypass_proxy = true;
- this.payment_status = 'payment_accepted';
+ this.custom_payment_status = {
+ status: 'paid',
+ message: 'Successfull Payment, have a nice day',
+ payment_method: 'AMEX',
+ receipt_client: '<xml>bla</xml>',
+ receipt_shop: '<xml>bla</xml>',
+ };
},
// override what the proxy says and reject the payment
debug_reject_payment: function(){
this.bypass_proxy = true;
- this.payment_status = 'payment_rejected';
+ this.custom_payment_status = {
+ status: 'error-rejected',
+ message: 'Sorry you don\'t have enough money :(',
+ };
},
// the client cancels his payment
- payment_canceled: function(){
+ payment_cancel: function(){
this.paying = false;
- this.payment_status = 'waiting_for_payment';
- this.message('payment_canceled');
+ this.custom_payment_status = 'waiting_for_payment';
+ return this.message('payment_cancel');
},
// called when the client logs in or starts to scan product
transaction_start: function(){
- this.message('transaction_start');
+ return this.message('transaction_start');
},
// called when the clients has finished his interaction with the machine
transaction_end: function(){
- this.message('transaction_end');
+ return this.message('transaction_end');
},
// called when the POS turns to cashier mode
cashier_mode_activated: function(){
- this.message('cashier_mode_activated');
+ return this.message('cashier_mode_activated');
},
// called when the POS turns to client mode
cashier_mode_deactivated: function(){
- this.message('cashier_mode_deactivated');
+ return this.message('cashier_mode_deactivated');
},
// ask for the cashbox (the physical box where you store the cash) to be opened
open_cashbox: function(){
- this.message('open_cashbox');
+ return this.message('open_cashbox');
},
/* ask the printer to print a receipt
@@ -216,12 +228,12 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal
* }
*/
print_receipt: function(receipt){
- this.message('print_receipt',{receipt: receipt});
+ return this.message('print_receipt',{receipt: receipt});
},
// asks the proxy to print an invoice in pdf form ( used to print invoices generated by the server )
print_pdf_invoice: function(pdfinvoice){
- this.message('print_pdf_invoice',{pdfinvoice: pdfinvoice});
+ return this.message('print_pdf_invoice',{pdfinvoice: pdfinvoice});
},
});
diff --git a/addons/point_of_sale/static/src/js/screens.js b/addons/point_of_sale/static/src/js/screens.js
index d2c79f19928..1ad03c5ead1 100644
--- a/addons/point_of_sale/static/src/js/screens.js
+++ b/addons/point_of_sale/static/src/js/screens.js
@@ -154,7 +154,7 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
},
barcode_product_screen: 'products', //if defined, this screen will be loaded when a product is scanned
- barcode_product_error_popup: 'error', //if defined, this popup will be loaded when there's an error in the popup
+ barcode_product_error_popup: 'error-product', //if defined, this popup will be loaded when there's an error in the popup
// what happens when a product is scanned :
// it will add the product to the order and go to barcode_product_screen. Or show barcode_product_error_popup if
@@ -411,6 +411,9 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
self.pos_widget.screen_selector.set_user_mode('cashier');
},
});
+ this.$('.footer .button').off('click').click(function(){
+ self.pos_widget.screen_selector.close_popup();
+ });
},
close:function(){
this._super();
@@ -419,12 +422,12 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
},
});
- module.ErrorProductNotRecognizedPopupWidget = module.ErrorPopupWidget.extend({
- template:'ErrorProductNotRecognizedPopupWidget',
+ module.ProductErrorPopupWidget = module.ErrorPopupWidget.extend({
+ template:'ProductErrorPopupWidget',
});
- module.ErrorNoSessionPopupWidget = module.ErrorPopupWidget.extend({
- template:'ErrorNoSessionPopupWidget',
+ module.ErrorSessionPopupWidget = module.ErrorPopupWidget.extend({
+ template:'ErrorSessionPopupWidget',
});
module.ScaleInviteScreenWidget = module.ScreenWidget.extend({
@@ -539,6 +542,60 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
},
});
+ // the JobQueue schedules a sequence of 'jobs'. each job is
+ // a function returning a deferred. the queue waits for each job to finish
+ // before launching the next. Each job can also be scheduled with a delay.
+ // the queue jobqueue is used to prevent parallel requests to the payment terminal.
+
+ module.JobQueue = function(){
+ var queue = [];
+ var running = false;
+ var run = function(){
+ if(queue.length > 0){
+ running = true;
+ var job = queue.shift();
+ setTimeout(function(){
+ var def = job.fun();
+ if(def){
+ def.then(run);
+ }else{
+ run();
+ }
+ },job.delay || 0);
+ }else{
+ running = false;
+ }
+ };
+
+ // adds a job to the schedule.
+ this.schedule = function(fun, delay){
+ queue.push({fun:fun, delay:delay});
+ if(!running){
+ run();
+ }
+ }
+
+ // remove all jobs from the schedule
+ this.clear = function(){
+ queue = [];
+ };
+ };
+
+ /*
+ module.BasicPaymentScreen = module.ScreenWidget.extend({
+ queue: new JobQueue(),
+ start_payment_transaction: function(){
+ },
+ update_payment_transaction: function(){
+ },
+ cancel_payment_transaction: function(){
+ },
+ show: function(){
+ this._super();
+ },
+ });
+ */
+
module.ClientPaymentScreenWidget = module.ScreenWidget.extend({
template:'ClientPaymentScreenWidget',
@@ -548,50 +605,102 @@ function openerp_pos_screens(instance, module){ //module is instance.point_of_sa
show: function(){
this._super();
var self = this;
-
- this.pos.proxy.payment_request(this.pos.get('selectedOrder').getDueLeft(),'card','info'); //TODO TOTAL
-
- this.intervalID = setInterval(function(){
- var payment = self.pos.proxy.is_payment_accepted();
- if(payment === 'payment_accepted'){
- clearInterval(this.intervalID);
-
- var currentOrder = self.pos.get('selectedOrder');
-
- //we get the first cashregister marked as self-checkout
- var selfCheckoutRegisters = [];
- for(var i = 0; i < self.pos.get('cashRegisters').models.length; i++){
- var cashregister = self.pos.get('cashRegisters').models[i];
- if(cashregister.self_checkout_payment_method){
- selfCheckoutRegisters.push(cashregister);
+
+ this.queue = new module.JobQueue();
+ this.canceled = false;
+ this.paid = false;
+
+ // initiates the connection to the payment terminal and starts the update requests
+ this.start = function(){
+ var def = new $.Deferred();
+ console.log("START");
+ self.pos.proxy.payment_request(self.pos.get('selectedOrder').getDueLeft())
+ .then(function(ack){
+ if(ack === 'ok'){
+ self.queue.schedule(self.update);
+ }else if(ack.indexOf('error') === 0){
+ console.error('cannot make payment. TODO');
+ }else{
+ console.error('unknown payment request return value:',ack);
}
- }
-
- var cashregister = selfCheckoutRegisters[0] || self.pos.get('cashRegisters').models[0];
- currentOrder.addPaymentLine(cashregister);
- self.pos.push_order(currentOrder.exportAsJSON())
- currentOrder.destroy();
- self.pos.proxy.transaction_end();
- self.pos_widget.screen_selector.set_current_screen(self.next_screen);
- }else if(payment === 'payment_rejected'){
- clearInterval(self.intervalID);
- //TODO show a tryagain thingie ?
+ console.log("START_END");
+ def.resolve();
+ });
+ return def;
+ };
+
+ // gets updated status from the payment terminal and performs the appropriate consequences
+ this.update = function(){
+ console.log("UPDATE");
+ var def = new $.Deferred();
+ if(self.canceled){
+ console.log("UPDATE_END");
+ return def.resolve();
}
- },500);
+ self.pos.proxy.payment_status()
+ .then(function(status){
+ if(status.status === 'paid'){
+
+ var currentOrder = self.pos.get('selectedOrder');
+
+ //we get the first cashregister marked as self-checkout
+ var selfCheckoutRegisters = [];
+ for(var i = 0; i < self.pos.get('cashRegisters').models.length; i++){
+ var cashregister = self.pos.get('cashRegisters').models[i];
+ if(cashregister.self_checkout_payment_method){
+ selfCheckoutRegisters.push(cashregister);
+ }
+ }
+
+ var cashregister = selfCheckoutRegisters[0] || self.pos.get('cashRegisters').models[0];
+ currentOrder.addPaymentLine(cashregister);
+ self.pos.push_order(currentOrder.exportAsJSON())
+ currentOrder.destroy();
+ self.pos.proxy.transaction_end();
+ self.pos_widget.screen_selector.set_current_screen(self.next_screen);
+ self.paid = true;
+ }else if(status.status.indexOf('error') === 0){
+ console.error('error in payment request. TODO');
+ }else if(status.status === 'waiting'){
+ self.queue.schedule(self.update,200);
+ }else{
+ console.error('unknown status value:',status.status);
+ }
+ console.log("UPDATE_END");
+ def.resolve();
+ });
+ return def;
+ }
+
+ // cancels a payment.
+ this.cancel = function(){
+ console.log("CANCEL");
+ if(!self.paid && !self.canceled){
+ self.canceled = true;
+ self.pos.proxy.payment_cancel();
+ self.pos_widget.screen_selector.set_current_screen(self.previous_screen);
+ self.queue.clear();
+ }
+ console.log("CANCEL_END");
+ return (new $.Deferred()).resolve();
+ }
+
+ this.queue.schedule(this.start);
this.add_action_button({
label: 'back',
icon: '/point_of_sale/static/src/img/icons/png48/go-previous.png',
click: function(){
- clearInterval(this.intervalID);
- self.pos.proxy.payment_canceled();
- self.pos_widget.screen_selector.set_current_screen(self.previous_screen);
+ self.queue.schedule(self.cancel);
}
});
},
close: function(){
+ if(this.queue){
+ this.queue.schedule(this.cancel);
+ }
+ //TODO CANCEL
this._super();
- clearInterval(this.intervalID);
},
});
diff --git a/addons/point_of_sale/static/src/js/widgets.js b/addons/point_of_sale/static/src/js/widgets.js
index f4d16b527c8..47a527a010d 100644
--- a/addons/point_of_sale/static/src/js/widgets.js
+++ b/addons/point_of_sale/static/src/js/widgets.js
@@ -687,7 +687,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
'print_receipt',
'print_pdf_invoice',
'weighting_read_kg',
- 'is_payment_accepted',
+ 'payment_status',
],
minimized: false,
start: function(){
@@ -898,10 +898,10 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
this.error_popup = new module.ErrorPopupWidget(this, {});
this.error_popup.appendTo($('.point-of-sale'));
- this.error_product_popup = new module.ErrorProductNotRecognizedPopupWidget(this, {});
+ this.error_product_popup = new module.ProductErrorPopupWidget(this, {});
this.error_product_popup.appendTo($('.point-of-sale'));
- this.error_session_popup = new module.ErrorNoSessionPopupWidget(this, {});
+ this.error_session_popup = new module.ErrorSessionPopupWidget(this, {});
this.error_session_popup.appendTo($('.point-of-sale'));
this.choose_receipt_popup = new module.ChooseReceiptPopupWidget(this, {});
diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml
index 7af3c2c2255..854dd61cc1b 100644
--- a/addons/point_of_sale/static/src/xml/pos.xml
+++ b/addons/point_of_sale/static/src/xml/pos.xml
@@ -261,8 +261,10 @@
<t t-name="WelcomeScreenWidget">
<div class="welcome-screen screen">
<header><h2>Welcome</h2></header>
+ <div class="dialog">
<img src="/point_of_sale/static/src/img/scan.png" />
<p> Please scan an item or your member card </p>
+ </div>
</div>
<div class="goodbye-message">
<p>Thank you for shopping with us.</p>
@@ -280,9 +282,11 @@
<t t-name="ClientPaymentScreenWidget">
<div class="scan-product-screen screen">
<header><h2>Payment</h2></header>
- <img src="/point_of_sale/static/src/img/bancontact.png" />
- <p>Please insert your card in the reader and follow the instructions to complete
+ <div class="dialog">
+ <img src="/point_of_sale/static/src/img/bancontact.png" />
+ <p>Please insert your card in the reader and follow the instructions to complete
your purchase</p>
+ </div>
</div>
</t>
@@ -327,15 +331,20 @@
</div>
</t>
- <t t-name="ErrorProductNotRecognizedPopupWidget">
+ <t t-name="ProductErrorPopupWidget">
<div class="modal-dialog">
<div class="popup popup-help">
<p class="message">The scanned product was not recognized<br /> Please wait, a cashier is on the way</p>
</div>
</div>
+ <div class="footer">
+ <div class="button">
+ Ok
+ </div>
+ </div>
</t>
- <t t-name="ErrorNoSessionPopupWidget">
+ <t t-name="ErrorSessionPopupWidget">
<div class="modal-dialog">
<div class="popup popup-help">
<p class="message">Sorry, we could not create a session for this user.</p>
@@ -455,11 +464,11 @@
<li class="event scan_item_success">Scan Item Success</li>
<li class="event scan_item_error_unrecognized">Scan Item Unrecognized</li>
<li class="event payment_request">Payment Request</li>
+ <li class="event payment_status">Payment Status</li>
<li class="event open_cashbox">Open Cashbox</li>
<li class="event print_receipt">Print Receipt</li>
<li class="event print_pdf_invoice">Print Invoice</li>
<li class="event weighting_read_kg">Read Weighting Scale</li>
- <li class="event is_payment_accepted">Check Payment</li>
</ul>
</div>
</div>
diff --git a/addons/portal/portal_data.xml b/addons/portal/portal_data.xml
index a980552a854..90a570bc1d5 100644
--- a/addons/portal/portal_data.xml
+++ b/addons/portal/portal_data.xml
@@ -5,6 +5,7 @@
<!-- Mail group for the company's news -->
<record id="company_news_feed" model="mail.group">
<field name="name">Company's news</field>
+ <field name="public">public</field>
</record>
<record id="action_news" model="ir.actions.act_window">
@@ -17,6 +18,7 @@
<!-- Mail group for the company's jobs -->
<record id="company_jobs" model="mail.group">
<field name="name">Company's jobs</field>
+ <field name="public">public</field>
</record>
<record id="action_jobs" model="ir.actions.act_window">
diff --git a/addons/portal/portal_demo.xml b/addons/portal/portal_demo.xml
index a8727b99556..e8d0fb4159b 100644
--- a/addons/portal/portal_demo.xml
+++ b/addons/portal/portal_demo.xml
@@ -9,7 +9,9 @@
<field name="password">portal</field>
<!-- Avoid auto-including this user in any default group -->
<field name="groups_id" eval="[(5,)]"/>
- <field name="partner_id" eval="ref('base.res_partner_1')"/>
+ <field name="supplier" eval="False"/>
+ <field name="customer" eval="True"/>
+ <field name="email">demo@portal.wrong.address</field>
</record>
<!-- Add the demo user to the portal (and therefore to the portal member group) -->
diff --git a/addons/portal/security/ir.model.access.csv b/addons/portal/security/ir.model.access.csv
index 2d7a17e0016..9202c7f4087 100644
--- a/addons/portal/security/ir.model.access.csv
+++ b/addons/portal/security/ir.model.access.csv
@@ -1,8 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_mail_message,mail.message,mail.model_mail_message,group_portal,1,0,1,1
-access_mail_message_all,mail.message.all,mail.model_mail_message,group_portal,1,0,0,0
-access_mail_thread,mail.thread,mail.model_mail_thread,group_portal,1,0,0,0
-access_mail_followers,mail.followers,mail.model_mail_followers,group_portal,1,0,1,1
-access_mail_notification,mail.notification,mail.model_mail_notification,group_portal,1,0,1,0
-access_mail_group,mail.group,mail.model_mail_group,group_portal,1,0,0,0
-access_mail_alias,mail.alias,mail.model_mail_alias,group_portal,1,0,0,0
+access_mail_message_portal,mail.message.portal,mail.model_mail_message,group_portal,1,0,1,1
+access_res_partner,res.partner,base.model_res_partner,portal.group_portal,1,0,0,0
+access_res_partner_address,res.partner_address,base.model_res_partner_address,portal.group_portal,1,0,0,0
+access_res_partner_category,res.partner_category,base.model_res_partner_category,portal.group_portal,1,0,0,0
+access_res_partner_title,res.partner_title,base.model_res_partner_title,portal.group_portal,1,0,0,0
diff --git a/addons/portal/tests/test_portal.py b/addons/portal/tests/test_portal.py
index 5e992fa06ea..653a05d40aa 100644
--- a/addons/portal/tests/test_portal.py
+++ b/addons/portal/tests/test_portal.py
@@ -21,15 +21,18 @@
from openerp.addons.mail.tests import test_mail
from openerp.tools import append_content_to_html
+from osv.orm import except_orm
class test_portal(test_mail.TestMailMockups):
def setUp(self):
super(test_portal, self).setUp()
+ cr, uid = self.cr, self.uid
self.ir_model = self.registry('ir.model')
self.mail_group = self.registry('mail.group')
self.mail_mail = self.registry('mail.mail')
+ self.mail_message = self.registry('mail.message')
self.res_users = self.registry('res.users')
self.res_partner = self.registry('res.partner')
@@ -37,7 +40,42 @@ class test_portal(test_mail.TestMailMockups):
self.group_pigs_id = self.mail_group.create(self.cr, self.uid,
{'name': 'Pigs', 'description': 'Fans of Pigs, unite !'})
- def test_00_mail_invite(self):
+ # Find Portal group
+ group_portal_ref = self.registry('ir.model.data').get_object_reference(cr, uid, 'portal', 'group_portal')
+ self.group_portal_id = group_portal_ref and group_portal_ref[1] or False
+
+ # Create Chell (portal user)
+ self.user_chell_id = self.res_users.create(cr, uid, {'name': 'Chell Gladys', 'login': 'chell', 'groups_id': [(6, 0, [self.group_portal_id])]})
+ self.user_chell = self.res_users.browse(cr, uid, self.user_chell_id)
+ self.partner_chell_id = self.user_chell.partner_id.id
+
+ def test_00_access_rights(self):
+ """ Test basic mail_message and mail_group access rights for portal users. """
+ cr, uid = self.cr, self.uid
+ partner_chell_id = self.partner_chell_id
+ user_chell_id = self.user_chell_id
+
+ # Prepare group: Pigs (portal)
+ self.mail_group.message_post(cr, uid, self.group_pigs_id, body='Message')
+ self.mail_group.write(cr, uid, [self.group_pigs_id], {'name': 'Jobs', 'public': 'groups', 'group_public_id': self.group_portal_id})
+
+ # ----------------------------------------
+ # CASE1: Chell will use the Chatter
+ # ----------------------------------------
+
+ # Do: Chell reads Pigs messages, ok because restricted to portal group
+ message_ids = self.mail_group.read(cr, user_chell_id, self.group_pigs_id, ['message_ids'])['message_ids']
+ self.mail_message.read(cr, user_chell_id, message_ids)
+ # Do: Chell posts a message on Pigs, crash because can not write on group or is not in the followers
+ self.assertRaises(except_orm,
+ self.mail_group.message_post,
+ cr, user_chell_id, self.group_pigs_id, body='Message')
+ # Do: Chell is added to Pigs followers
+ self.mail_group.message_subscribe(cr, uid, [self.group_pigs_id], [partner_chell_id])
+ # Test: Chell posts a message on Pigs, ok because in the followers
+ self.mail_group.message_post(cr, user_chell_id, self.group_pigs_id, body='Message')
+
+ def test_50_mail_invite(self):
cr, uid = self.cr, self.uid
user_admin = self.res_users.browse(cr, uid, uid)
self.mail_invite = self.registry('mail.wizard.invite')
diff --git a/addons/portal_claim/security/portal_security.xml b/addons/portal_claim/security/portal_security.xml
index 9fc47c4cfb0..a88c8ce7835 100644
--- a/addons/portal_claim/security/portal_security.xml
+++ b/addons/portal_claim/security/portal_security.xml
@@ -5,7 +5,7 @@
<record id="portal_stock_picking_user_rule" model="ir.rule">
<field name="name">Portal Personal Claims</field>
<field ref="crm_claim.model_crm_claim" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
diff --git a/addons/portal_crm/__openerp__.py b/addons/portal_crm/__openerp__.py
index 81b6815b942..1516ab13961 100644
--- a/addons/portal_crm/__openerp__.py
+++ b/addons/portal_crm/__openerp__.py
@@ -27,11 +27,14 @@
'complexity': 'easy',
'description': """
This module adds a contact page (with a contact form creating a lead when submitted) to your portal if crm and portal are installed.
-====================================================================================================================================
+====================================================================================================================================
""",
'author': 'OpenERP SA',
'depends': ['crm','portal'],
'data': ['wizard/contact_view.xml'],
+ 'test': [
+ 'test/contact_form.yml',
+ ],
'installable': True,
'auto_install': True,
'category': 'Hidden',
diff --git a/addons/portal_crm/test/contact_form.yml b/addons/portal_crm/test/contact_form.yml
new file mode 100644
index 00000000000..7ba93a9e831
--- /dev/null
+++ b/addons/portal_crm/test/contact_form.yml
@@ -0,0 +1,38 @@
+-
+ Set the current user as portal user.
+-
+ !context
+ 'uid': 'portal.demo_user0'
+-
+ As a portal user, I fill in the contact form and submit it.
+-
+ !record {model: portal_crm.crm_contact_us, id: contact_us_01}:
+ name: 'Need information about your contact form module'
+ partner_name: 'Mr. John Doe'
+ email_from: 'mister@john.doe'
+ phone: '+32 444 11 22 33'
+ description: 'Dear Sir or Madam, could you get back to me asap ? Regards.'
+-
+ For security reasons, the wizard values is empty.
+-
+ !python {model: portal_crm.crm_contact_us}: |
+ obj = self.browse(cr, uid, ref("contact_us_01"))
+ assert not(obj.name or obj.partner_name or obj.email_from or obj.phone or obj.description), 'All the wizard\'s values are not empty'
+-
+ And a lead is created with the proper values.
+-
+ !python {model: crm.lead}: |
+ from openerp import SUPERUSER_ID
+
+ ids = self.search(cr, SUPERUSER_ID, [('name', '=', 'Need information about your contact form module')])
+ assert len(ids) == 1, 'There are more than one matching lead, while only one was expected'
+
+ obj = self.browse(cr, SUPERUSER_ID, ids[0])
+ expected_values = dict(
+ name='Need information about your contact form module',
+ partner_name='Mr. John Doe',
+ email_from='mister@john.doe',
+ phone='+32 444 11 22 33',
+ description='Dear Sir or Madam, could you get back to me asap ? Regards.')
+ for k, v in expected_values.iteritems():
+ assert obj[k] == expected_values[k], 'Lead data mismatch: expected %s, got %s' % (expected_values[k], obj[k])
diff --git a/addons/portal_crm/wizard/contact.py b/addons/portal_crm/wizard/contact.py
index 036993e1720..a0f0d952a66 100644
--- a/addons/portal_crm/wizard/contact.py
+++ b/addons/portal_crm/wizard/contact.py
@@ -40,32 +40,51 @@ class crm_contact_us(osv.TransientModel):
r = self.pool.get('res.company').search(cr, uid, [], context=context)
return r
- def _get_current_user_email(self, cr, uid, context=None):
+ def _get_user_name(self, cr, uid, context=None):
"""
- If the user is logged in (i.e. not anonymous), get the user's email to
- pre-fill the email_from field.
+ If the user is logged in (i.e. not anonymous), get the user's name to
+ pre-fill the partner_name field.
+ Same goes for the other _get_user_attr methods.
- @return current user's email if the user isn't "anonymous", None otherwise
+ @return current user's name if the user isn't "anonymous", None otherwise
"""
- user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+ user = self.pool.get('res.users').read(cr, uid, uid, ['login'], context)
- if (user.login != 'anonymous'):
- return user.email
+ if (user['login'] != 'anonymous'):
+ return self.pool.get('res.users').name_get(cr, uid, uid, context)[0][1]
+ else:
+ return None
+
+ def _get_user_email(self, cr, uid, context=None):
+ user = self.pool.get('res.users').read(cr, uid, uid, ['login', 'email'], context)
+
+ if (user['login'] != 'anonymous' and user['email']):
+ return user['email']
+ else:
+ return None
+
+ def _get_user_phone(self, cr, uid, context=None):
+ user = self.pool.get('res.users').read(cr, uid, uid, ['login', 'phone'], context)
+
+ if (user['login'] != 'anonymous' and user['phone']):
+ return user['phone']
else:
return None
_defaults = {
- 'email_from' : _get_current_user_email,
- 'company_ids' : _get_companies,
+ 'partner_name': _get_user_name,
+ 'email_from': _get_user_email,
+ 'phone': _get_user_phone,
+ 'company_ids': _get_companies,
}
def create(self, cr, uid, values, context=None):
"""
- Since they potentially sensitive, we don't want any user to be able to
- read datas generated through this module. That's why we'll write those
- information in the crm.lead table and leave blank entries in the
- portal_crm.crm_contact_us table. This is why the create() method is
- overwritten.
+ Since they are potentially sensitive, we don't want any user to be able
+ to read datas generated through this module. Therefore we'll write
+ these information directly in the crm.lead table and leave blank
+ entries in the portal_crm.crm_contact_us table.
+ This is why the create() method is overwritten.
"""
crm_lead = self.pool.get('crm.lead')
@@ -74,8 +93,7 @@ class crm_contact_us(osv.TransientModel):
models implied (like mail.thread, among others, that performs a read
when its create() method is called (in method message_get_subscribers()),
it is quite complicated to set proper rights for this object.
- Therefore, user SUPERUSER_ID will perform the creation until a better
- workaround is figured out.
+ Therefore, user SUPERUSER_ID will perform the creation.
"""
values['contact_name'] = values['name']
crm_lead.create(cr, SUPERUSER_ID, dict(values,user_id=False), context)
@@ -84,15 +102,25 @@ class crm_contact_us(osv.TransientModel):
Create an empty record in the portal_crm.crm_contact_us table.
Since the 'name' field is mandatory, give an empty string to avoid an integrity error.
"""
- return super(crm_contact_us, self).create(cr, uid, {'name': ' '})
+ empty_values = dict((k, False) if k != 'name' else (k, '') for k, v in values.iteritems())
+ return super(crm_contact_us, self).create(cr, uid, empty_values)
def submit(self, cr, uid, ids, context=None):
""" When the form is submitted, redirect the user to a "Thanks" message """
- return {'type': 'ir.actions.act_window',
- 'view_mode': 'form',
- 'view_type': 'form',
- 'res_model': self._name,
- 'res_id': ids[0],
- 'view_id': self.pool.get('ir.model.data').get_object_reference(cr, uid, 'portal_crm', 'wizard_contact_form_view_thanks')[1],
- 'target': 'inline'
- }
+ return {
+ 'type': 'ir.actions.act_window',
+ 'view_mode': 'form',
+ 'view_type': 'form',
+ 'res_model': self._name,
+ 'res_id': ids[0],
+ 'view_id': self.pool.get('ir.model.data').get_object_reference(cr, uid, 'portal_crm', 'wizard_contact_form_view_thanks')[1],
+ 'target': 'inline',
+ }
+
+ def _needaction_domain_get(self, cr, uid, context=None):
+ """
+ This model doesn't need the needactions mechanism inherited from
+ crm_lead, so simply override the method to return an empty domain
+ and, therefore, 0 needactions.
+ """
+ return False
diff --git a/addons/portal_event/security/ir.model.access.csv b/addons/portal_event/security/ir.model.access.csv
index 7418b08bb4b..fc652f4bcd1 100644
--- a/addons/portal_event/security/ir.model.access.csv
+++ b/addons/portal_event/security/ir.model.access.csv
@@ -1,3 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_event,event,event.model_event_event,portal.group_portal,1,0,0,0
-access_registration,registration,event.model_event_registration,portal.group_portal,1,0,0,0
+access_registration,registration,event.model_event_registration,portal.group_portal,1,1,1,1
diff --git a/addons/portal_event/security/portal_security.xml b/addons/portal_event/security/portal_security.xml
index 74b2372c147..8f17808345b 100644
--- a/addons/portal_event/security/portal_security.xml
+++ b/addons/portal_event/security/portal_security.xml
@@ -12,7 +12,7 @@
<record id="portal_registration_rule" model="ir.rule">
<field name="name">Portal Personal Registrations</field>
<field ref="event.model_event_registration" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="domain_force">[('user_id','=',user.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
diff --git a/addons/portal_hr_employees/security/ir.model.access.csv b/addons/portal_hr_employees/security/ir.model.access.csv
index d18aeb90e1c..de204d43a09 100644
--- a/addons/portal_hr_employees/security/ir.model.access.csv
+++ b/addons/portal_hr_employees/security/ir.model.access.csv
@@ -1,6 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hr_employee_user,hr.employee user,hr.model_hr_employee,portal.group_portal,1,0,0,0
-access_res_partner,res.partner,base.model_res_partner,portal.group_portal,1,0,0,0
-access_res_partner_address,res.partner_address,base.model_res_partner_address,portal.group_portal,1,0,0,0
-access_res_partner_category,res.partner_category,base.model_res_partner_category,portal.group_portal,1,0,0,0
-access_res_partner_title,res.partner_title,base.model_res_partner_title,portal.group_portal,1,0,0,0
diff --git a/addons/portal_project/security/portal_security.xml b/addons/portal_project/security/portal_security.xml
index b9d37cec099..316fb1b4a15 100644
--- a/addons/portal_project/security/portal_security.xml
+++ b/addons/portal_project/security/portal_security.xml
@@ -5,7 +5,7 @@
<record id="portal_task_rule" model="ir.rule">
<field name="name">Portal Personal Task</field>
<field ref="project.model_project_task" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
diff --git a/addons/portal_project_issue/security/portal_security.xml b/addons/portal_project_issue/security/portal_security.xml
index 358b5e6a0ad..d58e160051b 100644
--- a/addons/portal_project_issue/security/portal_security.xml
+++ b/addons/portal_project_issue/security/portal_security.xml
@@ -5,7 +5,7 @@
<record id="portal_issue_rule" model="ir.rule">
<field name="name">Portal Personal Issues</field>
<field ref="project_issue.model_project_issue" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
diff --git a/addons/portal_sale/security/portal_security.xml b/addons/portal_sale/security/portal_security.xml
index 2f161a73281..d27317d0305 100644
--- a/addons/portal_sale/security/portal_security.xml
+++ b/addons/portal_sale/security/portal_security.xml
@@ -5,43 +5,43 @@
<!-- Sale Portal Access Rules -->
<record id="portal_sale_order_user_rule" model="ir.rule">
<field name="name">Portal Personal Quotations/Sales Orders</field>
- <field ref="sale.model_sale_order" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="model_id" ref="sale.model_sale_order"/>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record id="portal_stock_picking_user_rule" model="ir.rule">
<field name="name">Portal Personal Delivery Orders</field>
<field name="model_id" ref="stock.model_stock_picking"/>
- <field name="domain_force">[('partner_id','child_of',[user.partner_id.id])]</field>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record id="portal_stock_picking_user_rule" model="ir.rule">
<field name="name">Portal Personal Delivery Orders Out</field>
- <field ref="stock.model_stock_picking_out" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',[user.partner_id.id])]</field>
+ <field name="model_id" ref="stock.model_stock_picking_out"/>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record id="portal_account_invoice_user_rule" model="ir.rule">
<field name="name">Portal Personal Account Invoices</field>
- <field ref="account.model_account_invoice" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="model_id" ref="account.model_account_invoice"/>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record id="portal_personal_payment" model="ir.rule">
<field name="name">Portal Personal Payments</field>
- <field ref="account_voucher.model_account_voucher" name="model_id"/>
- <field name="domain_force">[('partner_id','child_of',user.partner_id.id)]</field>
+ <field name="model_id" ref="account_voucher.model_account_voucher"/>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
<record id="portal_personal_contact" model="ir.rule">
<field name="name">Portal Personal Contacts</field>
- <field ref="base.model_res_partner" name="model_id"/>
- <field name="domain_force">[('id','child_of',user.partner_id.id)]</field>
+ <field name="model_id" ref="base.model_res_partner"/>
+ <field name="domain_force">[('message_follower_ids','in',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('portal.group_portal'))]"/>
</record>
diff --git a/addons/procurement/company.py b/addons/procurement/company.py
index d544181a6e8..9d064c0e649 100644
--- a/addons/procurement/company.py
+++ b/addons/procurement/company.py
@@ -30,9 +30,9 @@ class company(osv.osv):
"today and today+range are skipped for future computation."),
}
_defaults = {
- 'schedule_range': 80.0,
+ 'schedule_range': 730.0,
}
company()
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/procurement/procurement.py b/addons/procurement/procurement.py
index 842f9ec27fa..c9b09761ed0 100644
--- a/addons/procurement/procurement.py
+++ b/addons/procurement/procurement.py
@@ -97,9 +97,9 @@ class procurement_order(osv.osv):
'product_uos_qty': fields.float('UoS Quantity', states={'draft':[('readonly',False)]}, readonly=True),
'product_uos': fields.many2one('product.uom', 'Product UoS', states={'draft':[('readonly',False)]}, readonly=True),
'move_id': fields.many2one('stock.move', 'Reservation', ondelete='set null'),
- 'close_move': fields.boolean('Close Move at end', required=True),
+ 'close_move': fields.boolean('Close Move at end'),
'location_id': fields.many2one('stock.location', 'Location', required=True, states={'draft':[('readonly',False)]}, readonly=True),
- 'procure_method': fields.selection([('make_to_stock','from stock'),('make_to_order','on order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
+ 'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', states={'draft':[('readonly',False)], 'confirmed':[('readonly',False)]},
readonly=True, required=True, help="If you encode manually a Procurement, you probably want to use" \
" a make to order method."),
@@ -333,8 +333,8 @@ class procurement_order(osv.osv):
move_obj = self.pool.get('stock.move')
for procurement in self.browse(cr, uid, ids, context=context):
if procurement.product_qty <= 0.00:
- raise osv.except_osv(_('Insufficient Data!'),
- _('Quantity in procurement order(s) must be greater than 0.'))
+ raise osv.except_osv(_('Data Insufficient !'),
+ _('Please check the quantity in procurement order(s) for the product "%s", it should not be 0 or less!' % procurement.product_id.name))
if procurement.product_id.type in ('product', 'consu'):
if not procurement.move_id:
source = procurement.location_id.id
@@ -423,24 +423,26 @@ class procurement_order(osv.osv):
"""
return 0
+ # XXX action_cancel() should accept a context argument
def action_cancel(self, cr, uid, ids):
- """ Cancels procurement and writes move state to Assigned.
+ """Cancel Procurements and either cancel or assign the related Stock Moves, depending on the procurement configuration.
+
@return: True
"""
- todo = []
- todo2 = []
+ to_assign = []
+ to_cancel = []
move_obj = self.pool.get('stock.move')
for proc in self.browse(cr, uid, ids):
if proc.close_move and proc.move_id:
if proc.move_id.state not in ('done', 'cancel'):
- todo2.append(proc.move_id.id)
+ to_cancel.append(proc.move_id.id)
else:
if proc.move_id and proc.move_id.state == 'waiting':
- todo.append(proc.move_id.id)
- if len(todo2):
- move_obj.action_cancel(cr, uid, todo2)
- if len(todo):
- move_obj.write(cr, uid, todo, {'state': 'assigned'})
+ to_assign.append(proc.move_id.id)
+ if len(to_cancel):
+ move_obj.action_cancel(cr, uid, to_cancel)
+ if len(to_assign):
+ move_obj.write(cr, uid, to_assign, {'state': 'assigned'})
self.write(cr, uid, ids, {'state': 'cancel'})
self.cancel_send_note(cr, uid, ids, context=None)
wf_service = netsvc.LocalService("workflow")
@@ -548,6 +550,19 @@ class stock_warehouse_orderpoint(osv.osv):
result[orderpoint.id] = procurement_ids
return result
+ def _check_product_uom(self, cr, uid, ids, context=None):
+ '''
+ Check if the UoM has the same category as the product standard UoM
+ '''
+ if not context:
+ context = {}
+
+ for rule in self.browse(cr, uid, ids, context=context):
+ if rule.product_id.uom_id.category_id.id != rule.product_uom.category_id.id:
+ return False
+
+ return True
+
_columns = {
'name': fields.char('Name', size=32, required=True),
'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the orderpoint without removing it."),
@@ -580,6 +595,9 @@ class stock_warehouse_orderpoint(osv.osv):
_sql_constraints = [
('qty_multiple_check', 'CHECK( qty_multiple > 0 )', 'Qty Multiple must be greater than zero.'),
]
+ _constraints = [
+ (_check_product_uom, 'You have to select a product unit of measure in the same category than the default unit of measure of the product', ['product_id', 'product_uom']),
+ ]
def default_get(self, cr, uid, fields, context=None):
res = super(stock_warehouse_orderpoint, self).default_get(cr, uid, fields, context)
@@ -610,9 +628,10 @@ class stock_warehouse_orderpoint(osv.osv):
"""
if product_id:
prod = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
+ d = {'product_uom': [('category_id', '=', prod.uom_id.category_id.id)]}
v = {'product_uom': prod.uom_id.id}
- return {'value': v}
- return {}
+ return {'value': v, 'domain': d}
+ return {'domain': {'product_uom': []}}
def copy(self, cr, uid, id, default=None, context=None):
if not default:
diff --git a/addons/procurement/procurement_view.xml b/addons/procurement/procurement_view.xml
index bf73b383216..34715f19e11 100644
--- a/addons/procurement/procurement_view.xml
+++ b/addons/procurement/procurement_view.xml
@@ -103,6 +103,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py
index f189b854fe5..3bc6e6d6814 100644
--- a/addons/product/pricelist.py
+++ b/addons/product/pricelist.py
@@ -203,7 +203,7 @@ class product_pricelist(osv.osv):
if partner:
partner_where = 'base <> -2 OR %s IN (SELECT name FROM product_supplierinfo WHERE product_id = %s) '
- partner_args = (partner, product_id)
+ partner_args = (partner, tmpl_id)
else:
partner_where = 'base <> -2 '
partner_args = ()
diff --git a/addons/product/product_view.xml b/addons/product/product_view.xml
index 8c19aee026f..8ffa4732c13 100644
--- a/addons/product/product_view.xml
+++ b/addons/product/product_view.xml
@@ -203,6 +203,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/product_visible_discount/__openerp__.py b/addons/product_visible_discount/__openerp__.py
index 09cf5ce61fd..81b99b8ac0a 100644
--- a/addons/product_visible_discount/__openerp__.py
+++ b/addons/product_visible_discount/__openerp__.py
@@ -35,7 +35,7 @@ To this end, a new check box named 'Visible Discount' is added to the pricelist
If the check box is unchecked, we will have on Sale Order and Invoice lines:
Unit price=225, Discount=0,00, Net price=225.
""",
- 'depends': ['sale'],
+ 'depends': ["sale","purchase"],
'demo': [],
'data': ['product_visible_discount_view.xml'],
'auto_install': False,
diff --git a/addons/project/i18n/nl.po b/addons/project/i18n/nl.po
index f543f48834e..f8c8bc84ba9 100644
--- a/addons/project/i18n/nl.po
+++ b/addons/project/i18n/nl.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0dev\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2012-06-28 12:50+0000\n"
+"PO-Revision-Date: 2012-09-29 14:57+0000\n"
"Last-Translator: Erwin <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-09-21 04:42+0000\n"
-"X-Generator: Launchpad (build 15985)\n"
+"X-Launchpad-Export-Date: 2012-09-30 04:44+0000\n"
+"X-Generator: Launchpad (build 16049)\n"
#. module: project
#: view:report.project.task.user:0
@@ -1326,7 +1326,7 @@ msgstr ""
#. module: project
#: view:project.task:0
msgid "Delegation"
-msgstr ""
+msgstr "Delegeren"
#. module: project
#: model:ir.model,name:project.model_res_users
diff --git a/addons/project/project.py b/addons/project/project.py
index 3572fd094b3..0d92d71a45f 100644
--- a/addons/project/project.py
+++ b/addons/project/project.py
@@ -509,6 +509,8 @@ def Project():
model_name=vals.get('alias_model', 'project.task'),
context=context)
vals['alias_id'] = alias_id
+ if vals.get('partner_id', False):
+ vals['type'] = 'contract'
project_id = super(project, self).create(cr, uid, vals, context)
mail_alias.write(cr, uid, [vals['alias_id']], {'alias_defaults': {'project_id': project_id} }, context)
self.create_send_note(cr, uid, [project_id], context=context)
@@ -690,7 +692,6 @@ class task(base_stage, osv.osv):
if not default.get('remaining_hours', False):
default['remaining_hours'] = float(self.read(cr, uid, id, ['planned_hours'])['planned_hours'])
default['active'] = True
- default['stage_id'] = False
if not default.get('name', False):
default['name'] = self.browse(cr, uid, id, context=context).name or ''
if not context.get('copy',False):
@@ -768,7 +769,7 @@ class task(base_stage, osv.osv):
}),
'user_id': fields.many2one('res.users', 'Assigned to'),
'delegated_user_id': fields.related('child_ids', 'user_id', type='many2one', relation='res.users', string='Delegated To'),
- 'partner_id': fields.many2one('res.partner', 'Contact'),
+ 'partner_id': fields.many2one('res.partner', 'Customer'),
'work_ids': fields.one2many('project.task.work', 'task_id', 'Work done'),
'manager_id': fields.related('project_id', 'analytic_account_id', 'user_id', type='many2one', relation='res.users', string='Project Manager'),
'company_id': fields.many2one('res.company', 'Company'),
@@ -1100,6 +1101,10 @@ class task(base_stage, osv.osv):
def create(self, cr, uid, vals, context=None):
task_id = super(task, self).create(cr, uid, vals, context=context)
+ project_id = self.browse(cr, uid, task_id, context=context).project_id
+ if project_id:
+ followers = [follower.id for follower in project_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [task_id], followers, context=context)
self._store_history(cr, uid, [task_id], context=context)
self.create_send_note(cr, uid, [task_id], context=context)
return task_id
@@ -1109,6 +1114,9 @@ class task(base_stage, osv.osv):
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
+ if vals.get('project_id'):
+ project_id = self.pool.get('project.project').browse(cr, uid, vals.get('project_id'), context=context)
+ vals['message_follower_ids'] = [(4, follower.id) for follower in project_id.message_follower_ids]
if vals and not 'kanban_state' in vals and 'stage_id' in vals:
new_stage = vals.get('stage_id')
vals_reset_kstate = dict(vals, kanban_state='normal')
diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml
index 83d3414f74e..e302199a65c 100644
--- a/addons/project/project_view.xml
+++ b/addons/project/project_view.xml
@@ -10,15 +10,14 @@
<menuitem id="menu_project_management" name="Project" parent="base.menu_main_pm" sequence="1"/>
<menuitem id="base.menu_definitions" name="Configuration" parent="base.menu_main_pm" sequence="60"/>
-
- <act_window
- context="{'search_default_project_id': [active_id], 'default_project_id': active_id}"
- id="act_project_project_2_project_task_all"
- name="Tasks"
- res_model="project.task"
- src_model="project.project"
- view_mode="kanban,tree,form,calendar,graph"
- view_type="form"/>
+
+ <record id="act_project_project_2_project_task_all" model="ir.actions.act_window">
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="name">Tasks</field>
+ <field name="view_mode">kanban,tree,form,calendar,graph</field>
+ <field name="context">{'search_default_project_id': [active_id], 'default_project_id': active_id}</field>
+ </record>
<!-- Project Read/Unread actions -->
<record id="actions_server_project_unread" model="ir.actions.server">
@@ -93,12 +92,12 @@
</div>
<group>
<group>
+ <field name="privacy_visibility"/>
<field name="user_id" string="Project Manager" attrs="{'readonly':[('state','in',['close', 'cancelled'])]}"/>
- <field name="partner_id" string="Contact" on_change="onchange_partner_id(partner_id)"/>
</group>
<group>
- <field name="privacy_visibility"/>
- <field name="analytic_account_id" readonly="1" required="0"/>
+ <field name="partner_id" on_change="onchange_partner_id(partner_id)"/>
+ <field name="analytic_account_id" readonly="1" required="0" attrs="{'invisible': [('analytic_account_id','=',False)]}"/>
</group>
</group>
<notebook>
@@ -122,14 +121,14 @@
</field>
</page>
<page string="Other Info">
- <group string="Email Interface" colspan="2">
- <div attrs="{'invisible': [('alias_domain', '=', False)]}">
- <field name="alias_id" invisible="1" required="0"/>
- <label for="alias_name" class="oe_edit_only "/>
- <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
- </div>
- </group>
<group>
+ <group string="Email Interface" attrs="{'invisible': [('alias_domain', '=', False)]}">
+ <div>
+ <field name="alias_id" invisible="1" required="0"/>
+ <label for="alias_name" class="oe_edit_only "/>
+ <field name="alias_name" class="oe_inline" attrs="{'required': [('alias_id', '!=', False)]}"/>@<field name="alias_domain" class="oe_inline"/>
+ </div>
+ </group>
<group string="Administration" groups="project.group_time_work_estimation_tasks">
<field name="planned_hours" widget="float_time"/>
<field name="effective_hours" widget="float_time"/>
@@ -137,8 +136,7 @@
</group>
<group string="Miscellaneous" name="misc">
<field name="date"/>
- <field name="parent_id" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
- <field name="priority"/>
+ <field name="priority" groups="base.group_no_one"/>
<field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
<field name="currency_id" groups="base.group_multi_currency" required="1"/>
@@ -152,8 +150,9 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
- <field name="message_follower_ids" widget="mail_followers"/>
+ <field name="message_follower_ids" widget="mail_followers" help="Follow this project to automatically follow all related tasks and issues."/>
</div>
</form>
</field>
@@ -207,15 +206,6 @@
</field>
</record>
- <act_window
- context="{'search_default_project_id': active_id, 'default_project_id': active_id}"
- id="act_project_project_2_project_task_all"
- name="Tasks"
- res_model="project.task"
- src_model="project.project"
- view_mode="kanban,tree,form,calendar,graph"
- view_type="form"/>
-
<record model="ir.ui.view" id="view_project_kanban">
<field name="name">project.project.kanban</field>
<field name="model">project.project</field>
@@ -250,7 +240,7 @@
<a t-if="record.use_tasks.raw_value" name="%(act_project_project_2_project_task_all)d" type="action"> <field name="task_count"/> Tasks</a>
</div>
<div class="oe_kanban_footer_left">
- <span>
+ <span groups="project.group_time_work_estimation_tasks">
<span class="oe_e">R</span>
<t t-esc="Math.round(record.effective_hours.raw_value)"/>/<t t-esc="Math.round(record.planned_hours.raw_value)"/> <field name="company_uom_id"/>
</span>
@@ -478,6 +468,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -529,7 +520,7 @@
<div class="oe_kanban_content">
<div><b><field name="name"/></b></div>
<div>
- <field name="project_id"/>
+ <field name="project_id"/><br/>
<t t-esc="kanban_text_ellipsis(record.description.value, 160)"/><br/>
<t t-if="record.date_deadline.raw_value and record.date_deadline.raw_value lt (new Date())" t-set="red">oe_kanban_text_red</t>
<span t-attf-class="#{red || ''}"><i><field name="date_deadline"/></i></span>
@@ -723,7 +714,7 @@
</record>
<record id="ir_project_task_open" model="ir.values">
- <field eval=" 'tree_but_open'" name="key2"/>
+ <field eval="'tree_but_open'" name="key2"/>
<field eval="'project.project'" name="model"/>
<field name="name">View project's tasks</field>
<field eval="'ir.actions.act_window,'+str(dblc_proj)" name="value"/>
@@ -767,7 +758,7 @@
<field name="model">project.task.type</field>
<field name="arch" type="xml">
<tree string="Task Stage">
- <field name="sequence"/>
+ <field name="sequence" widget="handle"/>
<field name="name"/>
<field name="state"/>
</tree>
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py
index f39be0c09d5..981ab0693d4 100644
--- a/addons/project_issue/project_issue.py
+++ b/addons/project_issue/project_issue.py
@@ -364,6 +364,10 @@ class project_issue(base_stage, osv.osv):
logged_fields = ['stage_id', 'state', 'message_ids']
if any([field in vals for field in logged_fields]):
vals['date_action_last'] = time.strftime('%Y-%m-%d %H:%M:%S')
+ if vals.get('project_id'):
+ project_id = self.pool.get('project.project').browse(cr, uid, vals.get('project_id'), context=context)
+ vals['message_follower_ids'] = [(4, follower.id) for follower in project_id.message_follower_ids]
+
return super(project_issue, self).write(cr, uid, ids, vals, context)
def onchange_task_id(self, cr, uid, ids, task_id, context=None):
@@ -381,6 +385,10 @@ class project_issue(base_stage, osv.osv):
def create(self, cr, uid, vals, context=None):
obj_id = super(project_issue, self).create(cr, uid, vals, context=context)
+ project_id = self.browse(cr, uid, obj_id, context=context).project_id
+ if project_id:
+ followers = [follower.id for follower in project_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [obj_id], followers, context=context)
self.create_send_note(cr, uid, [obj_id], context=context)
return obj_id
diff --git a/addons/project_issue/project_issue_demo.xml b/addons/project_issue/project_issue_demo.xml
index 0a4eee3067b..9759d15dabb 100644
--- a/addons/project_issue/project_issue_demo.xml
+++ b/addons/project_issue/project_issue_demo.xml
@@ -31,7 +31,7 @@
</record>
<record id="crm_case_programnotgivingproperoutput0" model="project.issue">
- <field eval="time.strftime('%Y-%m-15 12:50:00')" name="date"/>
+ <field eval="time.strftime('%Y-%m-15 12:50:00')" name="date"/>
<field name="priority">3</field>
<field name="user_id" ref="base.user_root"/>
<field name="partner_id" ref="base.res_partner_1"/>
diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml
index 8d54520261f..e41495590d7 100644
--- a/addons/project_issue/project_issue_view.xml
+++ b/addons/project_issue/project_issue_view.xml
@@ -161,6 +161,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -340,13 +341,13 @@
</field>
</record>
- <act_window id="act_project_project_2_project_issue_all"
- name="Issues"
- src_model="project.project"
- res_model="project.issue"
- view_type="form"
- view_mode="kanban,tree,form,calendar,graph"
- context="{'search_default_project_id': [active_id], 'default_project_id': active_id}"/>
+ <record id="act_project_project_2_project_issue_all" model="ir.actions.act_window">
+ <field name="res_model">project.issue</field>
+ <field name="view_type">form</field>
+ <field name="name">Issues</field>
+ <field name="view_mode">kanban,tree,form,calendar,graph</field>
+ <field name="context">{'search_default_project_id': [active_id], 'default_project_id': active_id}</field>
+ </record>
<!-- Project -->
<record id="view_project_form_inherited" model="ir.ui.view">
diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py
index 5b88d5209c8..b19238200e5 100644
--- a/addons/project_long_term/project_long_term.py
+++ b/addons/project_long_term/project_long_term.py
@@ -292,7 +292,7 @@ account_analytic_account()
class project_task(osv.osv):
_inherit = "project.task"
_columns = {
- 'phase_id': fields.many2one('project.phase', 'Project Phase'),
+ 'phase_id': fields.many2one('project.phase', 'Project Phase', domain="[('project_id', '=', project_id)]"),
}
project_task()
diff --git a/addons/project_long_term/project_long_term_view.xml b/addons/project_long_term/project_long_term_view.xml
index 55a91b36f08..69fe335c1b0 100644
--- a/addons/project_long_term/project_long_term_view.xml
+++ b/addons/project_long_term/project_long_term_view.xml
@@ -83,13 +83,14 @@
<!-- Project Phase -->
- <act_window id="act_project_phases"
- name="Phases"
- src_model="project.project"
- res_model="project.phase"
- view_type="form"
- view_mode="tree,form"
- context="{'search_default_project_id': [active_id], 'default_project_id': active_id}"/>
+
+ <record id="act_project_phases" model="ir.actions.act_window">
+ <field name="res_model">project.phase</field>
+ <field name="view_type">form</field>
+ <field name="name">Phases</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_project_id': [active_id], 'default_project_id': active_id}</field>
+ </record>
<record id="project_phase_form" model="ir.ui.view">
<field name="name">Inherit project form : Phase</field>
@@ -101,7 +102,7 @@
<label for="use_phases"/>
</xpath>
<xpath expr="//div[@name='buttons']" position='inside'>
- <button icon="terp-gtk-go-back-rtl" name="%(act_project_phases)d"
+ <button name="%(act_project_phases)d"
string="Phases" type="action"
attrs="{'invisible':[('use_phases','=', 0)]}"/>
</xpath>
@@ -123,6 +124,14 @@
</xpath>
</field>
</record>
+
+ <record id="project_phase_task_list" model="ir.actions.act_window">
+ <field name="res_model">project.task</field>
+ <field name="view_type">form</field>
+ <field name="name">Tasks</field>
+ <field name="view_mode">tree,form</field>
+ <field name="context">{'search_default_phase_id': [active_id], 'default_phase_id' : active_id}</field>
+ </record>
<record id="view_project_phase_form" model="ir.ui.view">
<field name="name">project.phase.form</field>
@@ -138,6 +147,7 @@
<field name="state" widget="statusbar" statusbar_visible="draft,open,done" statusbar_colors='{"pending":"blue"}'/>
</header>
<sheet>
+ <button name="%(project_phase_task_list)d" string="Related Tasks" type="action" class="oe_right"/>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
@@ -336,14 +346,6 @@
</field>
</record>
- <act_window
- context="{'search_default_phase_id': [active_id], 'default_phase_id' : active_id}"
- id="project_phase_task_list"
- name="Related Tasks"
- res_model="project.task"
- src_model="project.phase"
- view_mode="tree,form"/>
-
<record id="analytic_account_inherited_phase_form" model="ir.ui.view">
<field name="name">account.analytic.account.phase.form.inherit</field>
<field name="model">account.analytic.account</field>
diff --git a/addons/project_mrp/project_procurement.py b/addons/project_mrp/project_procurement.py
index f9f6fb6a279..1c347c8ae02 100644
--- a/addons/project_mrp/project_procurement.py
+++ b/addons/project_mrp/project_procurement.py
@@ -37,8 +37,10 @@ class procurement_order(osv.osv):
""" Checks if task is done or not.
@return: True or False.
"""
- return all(proc.product_id.type != 'service' or (proc.task_id and proc.task_id.state in ('done', 'cancelled')) \
- for proc in self.browse(cr, uid, ids, context=context))
+ for p in self.browse(cr, uid, ids, context=context):
+ if (p.product_id.type=='service') and (p.procure_method=='make_to_order') and p.task_id and (p.task_id.state not in ('done', 'cancelled')):
+ return False
+ return True
def check_produce_service(self, cr, uid, procurement, context=None):
return True
@@ -81,7 +83,7 @@ class procurement_order(osv.osv):
'project_id': project and project.id or False,
'company_id': procurement.company_id.id,
},context=context)
- self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running'}, context=context)
+ self.write(cr, uid, [procurement.id], {'task_id': task_id, 'state': 'running', 'message':'from project: task created.'}, context=context)
self.running_send_note(cr, uid, ids, context=None)
return task_id
diff --git a/addons/project_timesheet/project_timesheet.py b/addons/project_timesheet/project_timesheet.py
index 1e50848201c..488c780b988 100644
--- a/addons/project_timesheet/project_timesheet.py
+++ b/addons/project_timesheet/project_timesheet.py
@@ -46,23 +46,27 @@ class project_project(osv.osv):
def open_timesheets(self, cr, uid, ids, context=None):
""" open Timesheets view """
project = self.browse(cr, uid, ids[0], context)
- try:
- journal_id = self.pool.get('ir.model.data').get_object(cr, uid, 'hr_timesheet', 'analytic_journal').id
- except ValueError:
- journal_id = False
view_context = {
'search_default_account_id': [project.analytic_account_id.id],
'default_account_id': project.analytic_account_id.id,
- 'default_journal_id': journal_id,
}
+ help = _("""<p class="oe_view_nocontent_create">Record your timesheets for the project '%s'.</p>""")
+ try:
+ if project.to_invoice and project.partner_id:
+ help+= _("""<p>Timesheets on this project may be invoiced to %s, according to the terms defined in the contract.</p>""" ) % (project.partner_id.name,)
+ except:
+ # if the user do not have access rights on the partner
+ pass
+
return {
'type': 'ir.actions.act_window',
- 'name': _('Bill Tasks Works'),
- 'res_model': 'account.analytic.line',
+ 'name': _('Timesheets'),
+ 'res_model': 'hr.analytic.timesheet',
'view_type': 'form',
'view_mode': 'tree,form',
'context': view_context,
'nodestroy': True,
+ 'help': help
}
project_project()
diff --git a/addons/project_timesheet/project_timesheet_view.xml b/addons/project_timesheet/project_timesheet_view.xml
index 66104ee0d8c..c7d6ab15ab4 100644
--- a/addons/project_timesheet/project_timesheet_view.xml
+++ b/addons/project_timesheet/project_timesheet_view.xml
@@ -97,7 +97,7 @@
<menuitem action="hr_timesheet.action_hr_timesheet_sign_in"
id="menu_hr_timesheet_sign_in"
parent="hr_attendance.menu_hr_attendance"
- sequence="5" />
+ sequence="5" groups="base.group_hr_attendance" />
<menuitem id="menu_project_billing" name="Invoicing"
parent="base.menu_main_pm" sequence="5"/>
diff --git a/addons/purchase/i18n/nl_BE.po b/addons/purchase/i18n/nl_BE.po
index c86766b63de..c2d0d608e10 100644
--- a/addons/purchase/i18n/nl_BE.po
+++ b/addons/purchase/i18n/nl_BE.po
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-02-08 01:37+0100\n"
-"PO-Revision-Date: 2009-04-10 09:33+0000\n"
-"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
+"PO-Revision-Date: 2012-10-01 11:28+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-09-07 04:57+0000\n"
-"X-Generator: Launchpad (build 15914)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
#. module: purchase
#: model:process.transition,note:purchase.process_transition_confirmingpurchaseorder0
@@ -111,7 +111,7 @@ msgstr "Te factureren"
#. module: purchase
#: view:purchase.order.line_invoice:0
msgid "Do you want to generate the supplier invoices?"
-msgstr ""
+msgstr "Wilt u de aankoopfacturen maken?"
#. module: purchase
#: model:ir.actions.act_window,help:purchase.purchase_form_action
@@ -1831,7 +1831,7 @@ msgstr ""
#. module: purchase
#: view:purchase.order.group:0
msgid "Are you sure you want to merge these orders?"
-msgstr ""
+msgstr "Weet u zeker dat u deze orders wilt samenvoegen?"
#. module: purchase
#: model:process.transition,name:purchase.process_transition_purchaseinvoice0
diff --git a/addons/purchase/partner.py b/addons/purchase/partner.py
index 2edcf5ec0d8..6649ebfea9d 100644
--- a/addons/purchase/partner.py
+++ b/addons/purchase/partner.py
@@ -26,9 +26,13 @@ class res_partner(osv.osv):
_inherit = 'res.partner'
def _purchase_order_count(self, cr, uid, ids, field_name, arg, context=None):
- res = {}
- for partner in self.browse(cr, uid, ids, context=context):
- res[partner.id] = len(partner.purchase_order_ids)
+ res = dict(map(lambda x: (x,0), ids))
+ # this user may not have access to user rights
+ try:
+ for partner in self.browse(cr, uid, ids, context=context):
+ res[partner.id] = len(partner.purchase_order_ids)
+ except:
+ pass
return res
def copy(self, cr, uid, id, default=None, context=None):
diff --git a/addons/purchase/partner_view.xml b/addons/purchase/partner_view.xml
index da1f841ba9e..7b03861759a 100644
--- a/addons/purchase/partner_view.xml
+++ b/addons/purchase/partner_view.xml
@@ -20,12 +20,14 @@
<field name="view_mode">tree,form,graph</field>
<field name="context">{'search_default_partner_id': active_id}</field>
<field name="groups_id" eval="[(4, ref('purchase.group_purchase_user'))]"/>
- <field name="help">
- This supplier has no RFQ or Purchase Order. Click here to create a new RFQ.
- &lt;p&gt;
- The "Quotation" is the first step of the Purchases flow. Manage your purchases from quotation to invoice.
- &lt;p&gt;
- You will be able to buy products (manage receptions) as well as services (create projects).
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ This supplier has no purchase order. Click to create a new RfQ.
+ </p><p>
+ The request for quotation is the first step of the purchases flow. Once
+ converted into a purchase order, you will be able to control the reception
+ of the products and the supplier invoice.
+ </p>
</field>
</record>
@@ -53,12 +55,15 @@
<field name="view_mode">tree,form,graph</field>
<field name="domain">[('type','=','in_invoice')]</field>
<field name="context">{'search_default_partner_id': active_id, 'default_type': 'in_invoice', 'type': 'in_invoice', 'journal_type': 'purchase'}</field>
- <field name="help">
- Click here to create Supplier invoice.
- &lt;p&gt;
- You can control the invoice from your supplier according to what you purchased or received.
- &lt;p&gt;
- OpenERP can also generate draft invoices automatically from purchase orders or receipts.
+ <field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click here to record a supplier invoice.
+ </p><p>
+ Supplier invoices can be pre-generated based on purchase
+ orders or receptions. This allows you to control invoices
+ you receive from your supplier according to the draft
+ document in OpenERP.
+ </p>
</field>
</record>
diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py
index d2060016866..8502fd7ee3f 100644
--- a/addons/purchase/purchase.py
+++ b/addons/purchase/purchase.py
@@ -792,14 +792,6 @@ class purchase_order_line(osv.osv):
res[line.id] = cur_obj.round(cr, uid, cur, taxes['total'])
return res
- def _get_uom_id(self, cr, uid, context=None):
- try:
- proxy = self.pool.get('ir.model.data')
- result = proxy.get_object_reference(cr, uid, 'product', 'product_uom_unit')
- return result[1]
- except Exception, ex:
- return False
-
_columns = {
'name': fields.text('Description', required=True),
'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
@@ -826,7 +818,6 @@ class purchase_order_line(osv.osv):
}
_defaults = {
- 'product_uom' : _get_uom_id,
'product_qty': lambda *a: 1.0,
'state': lambda *args: 'draft',
'invoiced': lambda *a: 0,
@@ -1057,9 +1048,10 @@ class procurement_order(osv.osv):
purchase_date = self._get_purchase_order_date(cr, uid, procurement, company, schedule_date, context=context)
#Passing partner_id to context for purchase order line integrity of Line name
- context.update({'lang': partner.lang, 'partner_id': partner_id})
+ new_context = context.copy()
+ new_context.update({'lang': partner.lang, 'partner_id': partner_id})
- product = prod_obj.browse(cr, uid, procurement.product_id.id, context=context)
+ product = prod_obj.browse(cr, uid, procurement.product_id.id, context=new_context)
taxes_ids = procurement.product_id.product_tmpl_id.supplier_taxes_id
taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids)
@@ -1088,7 +1080,7 @@ class procurement_order(osv.osv):
'company_id': procurement.company_id.id,
'fiscal_position': partner.property_account_position and partner.property_account_position.id or False
}
- res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=context)
+ res[procurement.id] = self.create_procurement_purchase_order(cr, uid, procurement, po_vals, line_vals, context=new_context)
self.write(cr, uid, [procurement.id], {'state': 'running', 'purchase_id': res[procurement.id]})
self.running_send_note(cr, uid, [procurement.id], context=context)
return res
diff --git a/addons/purchase/purchase_view.xml b/addons/purchase/purchase_view.xml
index 7702d182b09..23bb8e7e278 100644
--- a/addons/purchase/purchase_view.xml
+++ b/addons/purchase/purchase_view.xml
@@ -285,6 +285,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
diff --git a/addons/purchase/report/request_quotation.rml b/addons/purchase/report/request_quotation.rml
index dc222a42398..66fd58060b8 100644
--- a/addons/purchase/report/request_quotation.rml
+++ b/addons/purchase/report/request_quotation.rml
@@ -167,4 +167,4 @@
<para style="terp_default_9">[[ user.signature or '' ]]</para>
</pto>
</story>
-</document>
+</document> \ No newline at end of file
diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py
index c17d145fea1..5ab19390656 100644
--- a/addons/purchase_requisition/purchase_requisition.py
+++ b/addons/purchase_requisition/purchase_requisition.py
@@ -267,16 +267,13 @@ class procurement_order(osv.osv):
}
def make_po(self, cr, uid, ids, context=None):
res = {}
- sequence_obj = self.pool.get('ir.sequence')
requisition_obj = self.pool.get('purchase.requisition')
warehouse_obj = self.pool.get('stock.warehouse')
procurement = self.browse(cr, uid, ids, context=context)[0]
if procurement.product_id.purchase_requisition:
- seq_name = sequence_obj.get(cr, uid, 'purchase.order.requisition')
warehouse_id = warehouse_obj.search(cr, uid, [('company_id', '=', procurement.company_id.id or company.id)], context=context)
res[procurement.id] = requisition_obj.create(cr, uid,
{
- 'name': seq_name,
'origin': procurement.origin,
'date_end': procurement.date_planned,
'warehouse_id':warehouse_id and warehouse_id[0] or False,
diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml
index 1fafec92bc7..eab920113a8 100644
--- a/addons/purchase_requisition/purchase_requisition_view.xml
+++ b/addons/purchase_requisition/purchase_requisition_view.xml
@@ -102,8 +102,9 @@
</notebook>
</sheet>
<div class="oe_chatter">
- <field name="message_ids" widget="mail_thread"/>
- <field name="message_follower_ids" widget="mail_followers"/>
+ <field name="message_is_follower" invisible="1"/>
+ <field name="message_ids" widget="mail_thread"/>
+ <field name="message_follower_ids" widget="mail_followers"/>
</div>
</form>
</field>
diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py
index e1ce5a38c6b..b03289c8748 100644
--- a/addons/report_webkit/webkit_report.py
+++ b/addons/report_webkit/webkit_report.py
@@ -107,7 +107,7 @@ class WebKitParser(report_sxw):
tmp_dir = tempfile.gettempdir()
out_filename = tempfile.mktemp(suffix=".pdf", prefix="webkit.tmp.")
files = []
- file_to_del = []
+ file_to_del = [out_filename]
if comm_path:
command = [comm_path]
else:
@@ -160,22 +160,33 @@ class WebKitParser(report_sxw):
file_to_del.append(html_file.name)
command.append(html_file.name)
command.append(out_filename)
+ stderr_fd, stderr_path = tempfile.mkstemp(text=True)
+ file_to_del.append(stderr_path)
try:
- status = subprocess.call(command, stderr=subprocess.PIPE) # ignore stderr
+ status = subprocess.call(command, stderr=stderr_fd)
+ os.close(stderr_fd) # ensure flush before reading
+ stderr_fd = None # avoid closing again in finally block
+ fobj = open(stderr_path, 'r')
+ error_message = fobj.read()
+ fobj.close()
+ if not error_message:
+ error_message = _('No diagnosis message was provided')
+ else:
+ error_message = _('The following diagnosis message was provided:\n') + error_message
if status :
- raise except_osv(
- _('Webkit raise an error!' ),
- status
- )
- except Exception:
- for f_to_del in file_to_del :
- os.unlink(f_to_del)
-
- pdf = file(out_filename, 'rb').read()
- for f_to_del in file_to_del :
- os.unlink(f_to_del)
-
- os.unlink(out_filename)
+ raise except_osv(_('Webkit error' ),
+ _("The command 'wkhtmltopdf' failed with error code = %s. Message: %s") % (status, error_message))
+ pdf_file = open(out_filename, 'rb')
+ pdf = pdf_file.read()
+ pdf_file.close()
+ finally:
+ if stderr_fd is not None:
+ os.close(stderr_fd)
+ for f_to_del in file_to_del:
+ try:
+ os.unlink(f_to_del)
+ except (OSError, IOError), exc:
+ _logger.error('cannot remove file %s: %s', f_to_del, exc)
return pdf
def translate_call(self, src):
diff --git a/addons/report_webkit_sample/report/report_webkit_html.mako b/addons/report_webkit_sample/report/report_webkit_html.mako
index 164a697f386..3ffca9f669c 100644
--- a/addons/report_webkit_sample/report/report_webkit_html.mako
+++ b/addons/report_webkit_sample/report/report_webkit_html.mako
@@ -8,7 +8,7 @@
%for inv in objects :
<% setLang(inv.partner_id.lang) %>
<table class="dest_address">
- <tr><td ><b>${inv.partner_id.title or ''|entity} ${inv.partner_id.name |entity}</b></td></tr>
+ <tr><td ><b>${inv.partner_id.title and inv.partner_id.title.name or ''|entity} ${inv.partner_id.name |entity}</b></td></tr>
<tr><td>${inv.address_invoice_id.street or ''|entity}</td></tr>
<tr><td>${inv.address_invoice_id.street2 or ''|entity}</td></tr>
<tr><td>${inv.address_invoice_id.zip or ''|entity} ${inv.address_invoice_id.city or ''|entity}</td></tr>
diff --git a/addons/sale/i18n/nl_BE.po b/addons/sale/i18n/nl_BE.po
index 3e8c86aea7c..513e7cef0c6 100644
--- a/addons/sale/i18n/nl_BE.po
+++ b/addons/sale/i18n/nl_BE.po
@@ -2,20 +2,21 @@
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
-#
+# Els Van Vossel <evv@agaplan.eu>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-09-20 07:29+0000\n"
-"PO-Revision-Date: 2012-03-20 15:57+0000\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: Dutch (Belgium) <nl_BE@li.org>\n"
+"PO-Revision-Date: 2012-10-01 17:10+0000\n"
+"Last-Translator: Els Van Vossel (Agaplan) <Unknown>\n"
+"Language-Team: Els Van Vossel\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Launchpad-Export-Date: 2012-09-22 04:56+0000\n"
-"X-Generator: Launchpad (build 15985)\n"
+"X-Launchpad-Export-Date: 2012-10-02 05:20+0000\n"
+"X-Generator: Launchpad (build 16061)\n"
+"Language: nl\n"
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:215
@@ -151,12 +152,127 @@ msgid ""
"</div>\n"
" "
msgstr ""
+"\n"
+"<div style=\"font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-"
+"serif; font-size: 12px; color: rgb(34, 34, 34); background-color: rgb(255, "
+"255, 255); \">\n"
+"\n"
+" <p>Hallo${object.partner_id.name and ' ' or ''}${object.partner_id.name "
+"or ''},</p>\n"
+" \n"
+" <p>Hier is uw ${object.state in ('draft', 'sent') and 'offerte' or "
+"'orderbevestiging'} van ${object.company_id.name}: </p>\n"
+"\n"
+" <p style=\"border-left: 1px solid #8e0000; margin-left: 30px;\">\n"
+" &nbsp;&nbsp;<strong>REFERENTIE</strong><br />\n"
+" &nbsp;&nbsp;Nummer: <strong>${object.name}</strong><br />\n"
+" &nbsp;&nbsp;Totaal: <strong>${object.amount_total} "
+"${object.pricelist_id.currency_id.name}</strong><br />\n"
+" &nbsp;&nbsp;Datum: ${object.date_order}<br />\n"
+" % if object.origin:\n"
+" &nbsp;&nbsp;Referentie: ${object.origin}<br />\n"
+" % endif\n"
+" % if object.client_order_ref:\n"
+" &nbsp;&nbsp;Uw referentie: ${object.client_order_ref}<br />\n"
+" % endif\n"
+" &nbsp;&nbsp;Uw contactpersoon: <a "
+"href=\"mailto:${object.user_id.email or "
+"''}?subject=Order%20${object.name}\">${object.user_id.name}</a>\n"
+" </p>\n"
+"\n"
+" <p>\n"
+" U kunt de ${object.state in ('draft', 'sent') and 'offerte' or "
+"'orderbevestiging'} bekijken, downloaden en on line betalen met de link:\n"
+" </p>\n"
+" <a style=\"display:block; width: 150px; height:20px; margin-"
+"left: 120px; color: #FFF; font-family: 'Lucida Grande', Helvetica, Arial, "
+"sans-serif; font-size: 13px; font-weight: bold; text-align: center; text-"
+"decoration: none !important; line-height: 1; padding: 5px 0px 0px 0px; "
+"background-color: #8E0000; border-radius: 5px 5px; background-repeat: repeat "
+"no-repeat;\"\n"
+" href=\"${ctx.get('edi_web_url_view') or ''}\">Document "
+"bekijken</a>\n"
+"\n"
+" % if object.order_policy in ('prepaid','manual') and "
+"object.company_id.paypal_account and object.state not in ('draft', 'sent'):\n"
+" <%\n"
+" comp_name = quote(object.company_id.name)\n"
+" order_name = quote(object.name)\n"
+" paypal_account = quote(object.company_id.paypal_account)\n"
+" order_amount = quote(str(object.amount_total))\n"
+" cur_name = quote(object.pricelist_id.currency_id.name)\n"
+" paypal_url = \"https://www.paypal.com/cgi-"
+"bin/webscr?cmd=_xclick&amp;business=%s&amp;item_name=%s%%20Order%%20%s\" \\\n"
+" "
+"\"&amp;invoice=%s&amp;amount=%s&amp;currency_code=%s&amp;button_subtype=servi"
+"ces&amp;no_note=1\" \\\n"
+" \"&amp;bn=OpenERP_Order_PayNow_%s\" % \\\n"
+" "
+"(paypal_account,comp_name,order_name,order_name,order_amount,cur_name,cur_nam"
+"e)\n"
+" %>\n"
+" <br/>\n"
+" <p>U kunt ook via Paypal betalen:</p>\n"
+" <a style=\"margin-left: 120px;\" href=\"${paypal_url}\">\n"
+" <img class=\"oe_edi_paypal_button\" "
+"src=\"https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif\"/>\n"
+" </a>\n"
+" % endif\n"
+"\n"
+" <br/>\n"
+" <p>Neem gerust contact met ons op als u vragen heeft.</p>\n"
+" <p>Bedankt dat u kiest voor ${object.company_id.name or 'us'}!</p>\n"
+" <br/>\n"
+" <br/>\n"
+" <div style=\"width: 375px; margin: 0px; padding: 0px; background-color: "
+"#8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; "
+"background-repeat: repeat no-repeat;\">\n"
+" <h3 style=\"margin: 0px; padding: 2px 14px; font-size: 12px; color: "
+"#FFF;\">\n"
+" <strong style=\"text-"
+"transform:uppercase;\">${object.company_id.name}</strong></h3>\n"
+" </div>\n"
+" <div style=\"width: 347px; margin: 0px; padding: 5px 14px; line-height: "
+"16px; background-color: #F2F2F2;\">\n"
+" <span style=\"color: #222; margin-bottom: 5px; display: block; \">\n"
+" % if object.company_id.street:\n"
+" ${object.company_id.street}<br/>\n"
+" % endif\n"
+" % if object.company_id.street2:\n"
+" ${object.company_id.street2}<br/>\n"
+" % endif\n"
+" % if object.company_id.city or object.company_id.zip:\n"
+" ${object.company_id.zip} ${object.company_id.city}<br/>\n"
+" % endif\n"
+" % if object.company_id.country_id:\n"
+" ${object.company_id.state_id and ('%s, ' % "
+"object.company_id.state_id.name) or ''} ${object.company_id.country_id.name "
+"or ''}<br/>\n"
+" % endif\n"
+" </span>\n"
+" % if object.company_id.phone:\n"
+" <div style=\"margin-top: 0px; margin-right: 0px; margin-bottom: "
+"0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: "
+"0px; padding-left: 0px; \">\n"
+" Tel.:&nbsp; ${object.company_id.phone}\n"
+" </div>\n"
+" % endif\n"
+" % if object.company_id.website:\n"
+" <div>\n"
+" Web :&nbsp;<a "
+"href=\"${object.company_id.website}\">${object.company_id.website}</a>\n"
+" </div>\n"
+" %endif\n"
+" <p></p>\n"
+" </div>\n"
+"</div>\n"
+" "
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_line_tree2
#: model:ir.ui.menu,name:sale.menu_invoicing_sales_order_lines
msgid "Order Lines to Invoice"
-msgstr ""
+msgstr "Te factureren lijnen"
#. module: sale
#: field:sale.order,date_confirm:0
@@ -176,8 +292,8 @@ msgid ""
"Sale Order Lines that are confirmed, done or in exception state and haven't "
"yet been invoiced"
msgstr ""
-"Verkooporderlijn in status bevestigd, gereed of uitzondering en die nog niet "
-"zijn gefactureerd"
+"Verkooporderlijnen in status bevestigd, gereed of uitzondering en die nog "
+"niet zijn gefactureerd"
#. module: sale
#: field:sale.order.line,address_allotment_id:0
@@ -187,7 +303,7 @@ msgstr "Relatie rechtstr. levering"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_view_sale_advance_payment_inv
msgid "Invoice Order"
-msgstr ""
+msgstr "Order factureren"
#. module: sale
#: help:sale.config.settings,group_sale_delivery_address:0
@@ -195,18 +311,20 @@ msgid ""
"Allows you to specify different delivery and invoice addresses on a sale "
"order."
msgstr ""
+"Hiermee kunt u aparte leverings- en factuuradressen ingeven op een "
+"verkooporder."
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:160
#: code:addons/sale/wizard/sale_make_invoice_advance.py:162
#, python-format
msgid "Advance of %s %s"
-msgstr ""
+msgstr "Voorschot van %s %s"
#. module: sale
#: view:sale.config.settings:0
msgid "Contract Feature"
-msgstr ""
+msgstr "Contractoptie"
#. module: sale
#: field:sale.report,state:0
@@ -225,6 +343,15 @@ msgid ""
"invoice automatically.\n"
" It installs the account_analytic_analysis module."
msgstr ""
+"Hiermee kunt u de contractvoorwaarden van een klant instellen: "
+"factuurmethode\n"
+" (vaste prijs, volgesn uurrooster, voorschotfactuur), de juiste "
+"prijs\n"
+" (650€/dag voor een ontwikkelaar), de duur (supportcontract van "
+"een jaar).\n"
+" U kunt de vooruitgang van het contract opvolgen en automatisch "
+"factureren.\n"
+" Hiermee wordt de module account_analytic_analysis geïnstalleerd."
#. module: sale
#: view:sale.order:0
@@ -236,7 +363,7 @@ msgstr "Te factureren"
#: view:sale.order.line:0
#: field:sale.report,product_uom:0
msgid "Unit of Measure"
-msgstr ""
+msgstr "Meeteenheid"
#. module: sale
#: help:sale.order,date_confirm:0
@@ -260,12 +387,12 @@ msgstr "Maart"
#: code:addons/sale/sale.py:558
#, python-format
msgid "First cancel all invoices attached to this sales order."
-msgstr ""
+msgstr "U moet eerst alle facturen voor deze verkooporder annuleren."
#. module: sale
#: selection:sale.advance.payment.inv,advance_payment_method:0
msgid "Invoice the whole sale order"
-msgstr ""
+msgstr "Factureer de volledige verkooporder"
#. module: sale
#: field:sale.order,project_id:0
@@ -305,12 +432,12 @@ msgstr "Factuuruitzondering"
#. module: sale
#: view:account.config.settings:0
msgid "0"
-msgstr ""
+msgstr "0"
#. module: sale
#: selection:sale.order,state:0
msgid "Draft Quotation"
-msgstr ""
+msgstr "Voorlopige offerte"
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:124
@@ -319,6 +446,8 @@ msgid ""
"You cannot make an advance on a sales order that is "
"defined as 'Automatic Invoice after delivery'."
msgstr ""
+"U kunt geen vooruitbetaling doen voor een verkooporder die is ingesteld als "
+"'Factuur na levering'."
#. module: sale
#: help:sale.order,amount_total:0
@@ -335,7 +464,7 @@ msgstr "Analytische rekening"
#. module: sale
#: field:sale.config.settings,module_sale_journal:0
msgid "Allow batch invoicing of delivery orders through journals"
-msgstr ""
+msgstr "Facturatie in batch toelaten voor leveringsorders volgens journalen"
#. module: sale
#: field:sale.order.line,price_subtotal:0
@@ -345,7 +474,7 @@ msgstr "Subtotaal"
#. module: sale
#: field:sale.config.settings,group_discount_per_so_line:0
msgid "Allow setting a discount on the sale order lines"
-msgstr ""
+msgstr "Mogelijkheid bieden om korting op verkooporderlijn in te stellen"
#. module: sale
#: model:process.transition.action,name:sale.process_transition_action_cancelorder0
@@ -360,29 +489,29 @@ msgstr "Gewicht"
#. module: sale
#: view:sale.config.settings:0
msgid "Warehouse Features"
-msgstr ""
+msgstr "Magazijnopties"
#. module: sale
#: view:sale.order:0
msgid "Quotation "
-msgstr ""
+msgstr "Offerte "
#. module: sale
#: field:sale.order.line,product_uom:0
msgid "Unit of Measure "
-msgstr ""
+msgstr "Meeteenheid "
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:148
#, python-format
msgid "Incorrect Data"
-msgstr ""
+msgstr "Ongeldige gegevens"
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:149
#, python-format
msgid "The value of Advance Amount must be positive."
-msgstr ""
+msgstr "De waarde van het voorschotbedrag moet positief zijn."
#. module: sale
#: help:sale.advance.payment.inv,advance_payment_method:0
@@ -393,16 +522,23 @@ msgid ""
" Use Some Order Lines to invoice a selection of the sale "
"order lines."
msgstr ""
+"Kies Alle om de eindfactuur te maken.\n"
+" Kies Percentage als u een percentage van het totale bedrag "
+"wilt factureren.\n"
+" Kies Vaste prijs als u een bepaald bedrag vooraf wilt "
+"factureren.\n"
+" Kies Bepaalde orderlijnen als u een selectie van "
+"verkooporderlijnen wilt factureren."
#. module: sale
#: selection:sale.order,state:0
msgid "Sale Order"
-msgstr ""
+msgstr "Verkooporder"
#. module: sale
#: field:sale.order,message_ids:0
msgid "Messages"
-msgstr ""
+msgstr "Berichten"
#. module: sale
#: selection:sale.report,month:0
@@ -423,7 +559,7 @@ msgstr "Bedrag excl. btw"
#. module: sale
#: field:sale.config.settings,module_project:0
msgid "Project"
-msgstr ""
+msgstr "Project"
#. module: sale
#: code:addons/sale/sale.py:319
@@ -434,7 +570,7 @@ msgstr ""
#: code:addons/sale/wizard/sale_make_invoice_advance.py:123
#, python-format
msgid "Error!"
-msgstr ""
+msgstr "Fout"
#. module: sale
#: report:sale.order:0
@@ -452,6 +588,12 @@ msgid ""
"available.\n"
" This installs the module analytic_user_function."
msgstr ""
+"Hiermee stelt u in wat de standaardfunctie van een gebruiker is voor een "
+"bepaalde rekening.\n"
+" Doorgaans wordt dit toegepast bij het invoeren van "
+"uurroosters. De waarden worden automatisch in de juiste velden gezet.\n"
+" Natuurlijk kunnen deze waarden nog worden aangepast.\n"
+" Hiermee wordt de module analytic_user_function geïnstalleerd."
#. module: sale
#: selection:sale.order,state:0
@@ -468,12 +610,13 @@ msgstr "Verkooporderlijnen gekoppeld aan een van mijn verkooporders"
#. module: sale
#: selection:sale.order,state:0
msgid "Quotation Sent"
-msgstr ""
+msgstr "Verstuurde offerte"
#. module: sale
#: help:sale.order,message_unread:0
msgid "If checked new messages require your attention."
msgstr ""
+"Als dit is ingeschakeld, zijn er nieuwe berichten die uw aandacht vragen."
#. module: sale
#: field:sale.order,amount_total:0
@@ -492,7 +635,7 @@ msgstr "Verkooppunt"
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_tree2
msgid "Sales in Exception"
-msgstr "Verkooporders met uitgestelde levering"
+msgstr "Verkooporders in uitzonderingsstatus"
#. module: sale
#: field:sale.order,partner_invoice_id:0
@@ -507,7 +650,7 @@ msgstr "Datum waarop verkooporder is gemaakt."
#. module: sale
#: view:res.partner:0
msgid "False"
-msgstr ""
+msgstr "Onwaar"
#. module: sale
#: view:sale.order:0
@@ -523,18 +666,18 @@ msgstr "Facturen maken"
#. module: sale
#: report:sale.order:0
msgid "Tax"
-msgstr ""
+msgstr "Btw"
#. module: sale
#: code:addons/sale/sale.py:986
#, python-format
msgid "Invalid Action!"
-msgstr ""
+msgstr "Ongeldige actie"
#. module: sale
#: view:sale.report:0
msgid "Reference Unit of Measure"
-msgstr ""
+msgstr "Referentiemeeteenheid"
#. module: sale
#: field:sale.report,date_confirm:0
@@ -553,11 +696,13 @@ msgid ""
"Holds the Chatter summary (number of messages, ...). This summary is "
"directly in html format in order to be inserted in kanban views."
msgstr ""
+"Bevat de Chatsamenvatting (aantal berichten, ...). Deze samenvatting is in "
+"html-formaat, zodat ze in de kanbanweergave kan worden gebruikt."
#. module: sale
#: field:sale.config.settings,group_sale_delivery_address:0
msgid "Allow a different address for delivery and invoicing "
-msgstr ""
+msgstr "Een apart adres voor levering en facturatie toelaten "
#. module: sale
#: view:sale.report:0
@@ -573,12 +718,12 @@ msgstr "Fax:"
#. module: sale
#: view:sale.order:0
msgid "(update)"
-msgstr ""
+msgstr "(bijwerken)"
#. module: sale
#: help:sale.config.settings,group_discount_per_so_line:0
msgid "Allows you to apply some discount per sale order line."
-msgstr ""
+msgstr "Hiermee kunt u een korting per verkooporderlijn toepassen"
#. module: sale
#: code:addons/sale/sale.py:578
@@ -615,12 +760,12 @@ msgstr "Bevestigd"
#. module: sale
#: field:sale.config.settings,module_analytic_user_function:0
msgid "One employee can have different roles per contract"
-msgstr ""
+msgstr "Een werknemer kan verschillende rollen per contract hebben."
#. module: sale
#: field:sale.order,note:0
msgid "Terms and conditions"
-msgstr ""
+msgstr "Verkoopvoorwaarden"
#. module: sale
#: field:sale.shop,payment_default_id:0
@@ -636,7 +781,7 @@ msgstr "Bevestigen"
#. module: sale
#: view:sale.order:0
msgid "Unread messages"
-msgstr ""
+msgstr "Ongelezen berichten"
#. module: sale
#: field:sale.order,partner_shipping_id:0
@@ -664,7 +809,7 @@ msgstr "Jaar"
#. module: sale
#: field:sale.config.settings,group_uom:0
msgid "Allow using different units of measures"
-msgstr ""
+msgstr "Verschillende meeteenheden toelaten"
#. module: sale
#: view:sale.order:0
@@ -674,12 +819,12 @@ msgstr "Onbevestigde verkooporders"
#. module: sale
#: field:sale.order,message_unread:0
msgid "Unread Messages"
-msgstr ""
+msgstr "Ongelezen berichten"
#. module: sale
#: view:sale.order:0
msgid "Print"
-msgstr ""
+msgstr "Afdrukken"
#. module: sale
#: report:sale.order:0
@@ -727,6 +872,10 @@ msgid ""
" and perform batch operations on journals.\n"
" This installs the module sale_journal."
msgstr ""
+"Hiermee kunt u verkopen en leveringen (ontvangsten) in verschillende "
+"journalen plaatsen,\n"
+" en batchbewerkingen uitvoeren per journaal.\n"
+" Hiermee wordt de module sale_journal geïnstalleerd."
#. module: sale
#: help:sale.make.invoice,grouped:0
@@ -742,7 +891,7 @@ msgstr "Facturen maken"
#. module: sale
#: model:ir.actions.server,name:sale.actions_server_sale_order_read
msgid "Mark read"
-msgstr ""
+msgstr "Als gelezen markeren"
#. module: sale
#: code:addons/sale/res_config.py:89
@@ -753,7 +902,7 @@ msgstr "Uur"
#. module: sale
#: field:res.partner,sale_order_count:0
msgid "# of Sales Order"
-msgstr ""
+msgstr "# verkooporders"
#. module: sale
#: help:sale.config.settings,timesheet:0
@@ -764,6 +913,12 @@ msgid ""
"user-wise as well as month wise.\n"
" This installs the module account_analytic_analysis."
msgstr ""
+"Hiermee past u de analytische weergave aan zodat belangrijke gegevens worden "
+"getoond voor projectleiders van dienstverlenende bedrijven.\n"
+" U kunt ook het rapport van de analytische rekening per "
+"gebruiker of per maand bekijken.\n"
+" Hiermee wordt de module account_analytic_analysis "
+"geïnstalleerd."
#. module: sale
#: field:sale.order,create_date:0
@@ -774,7 +929,7 @@ msgstr "Creatiedatum"
#: selection:sale.order,state:0
#: selection:sale.report,state:0
msgid "Waiting Schedule"
-msgstr "Volgende planning"
+msgstr "Wacht op planner"
#. module: sale
#: help:sale.order,partner_invoice_id:0
@@ -794,12 +949,12 @@ msgstr "Besteljaar van de verkooporder"
#. module: sale
#: field:sale.config.settings,module_sale_stock:0
msgid "Sale and Warehouse Management"
-msgstr ""
+msgstr "Beheer verkopen en magazijn"
#. module: sale
#: model:ir.model,name:sale.model_sale_config_settings
msgid "sale.config.settings"
-msgstr ""
+msgstr "sale.config.settings"
#. module: sale
#: field:sale.advance.payment.inv,qtty:0
@@ -838,12 +993,12 @@ msgstr "Juli"
#. module: sale
#: field:account.config.settings,module_sale_analytic_plans:0
msgid "Several analytic accounts on sales"
-msgstr ""
+msgstr "Meerdere analytische rekeningen voor verkopen"
#. module: sale
#: view:sale.config.settings:0
msgid "Default Options"
-msgstr ""
+msgstr "Standaardopties"
#. module: sale
#: code:addons/sale/sale.py:963
@@ -851,12 +1006,12 @@ msgstr ""
#: code:addons/sale/wizard/sale_make_invoice_advance.py:142
#, python-format
msgid "Configuration Error!"
-msgstr ""
+msgstr "Configuratiefout"
#. module: sale
#: field:account.config.settings,group_analytic_account_for_sales:0
msgid "Analytic accounting for sales"
-msgstr ""
+msgstr "Verkopen analytisch boeken"
#. module: sale
#: view:sale.order:0
@@ -869,6 +1024,8 @@ msgid ""
"After clicking 'Show Lines to Invoice', select lines to invoice and create "
"the invoice from the 'More' dropdown menu."
msgstr ""
+"Klik op 'Te factureren lijnen weergeven' en selecteer vervolgens de lijnen "
+"die u wilt factureren. Maak de factuur via het menu 'Extra'."
#. module: sale
#: code:addons/sale/edi/sale_order.py:151
@@ -896,11 +1053,25 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een offerte of verkooporder voor deze klant wilt "
+"maken.\n"
+" </p><p>\n"
+" Met OpenERP handelt u de volledige verkoopflow efficiënt "
+"af:\n"
+" offerte, order, levering, facturatie en\n"
+" betaling.\n"
+" </p><p>\n"
+" Met de sociale opties kunt u discussies voeren op een order\n"
+" en zo uw klant een zicht geven op de evolutie van de "
+"verkooporder.\n"
+" </p>\n"
+" "
#. module: sale
#: view:sale.config.settings:0
msgid "Invoicing Process"
-msgstr ""
+msgstr "Facturatiewijze"
#. module: sale
#: report:sale.order:0
@@ -919,17 +1090,21 @@ msgid ""
" - With 'Before Delivery', a draft invoice is created, and it must be paid "
"before delivery."
msgstr ""
+"Dit veld bepaalt hoe de factuur- en leveringsoperaties worden "
+"gesynchroniseerd.\n"
+" - Met 'Voor levering' wordt een voorlopige factuur gemaakt die moet worden "
+"betaald voordat kan worden geleverd."
#. module: sale
#: view:sale.order:0
msgid "Sales Order done"
-msgstr ""
+msgstr "Verkooporder afgewerkt."
#. module: sale
#: code:addons/sale/sale.py:320
#, python-format
msgid "Please define sales journal for this company: \"%s\" (id:%d)."
-msgstr ""
+msgstr "Stel een verkoopdagboek in voor dit bedrijf: \"%s\" (id:%d)."
#. module: sale
#: model:ir.actions.act_window,name:sale.act_res_partner_2_sale_order
@@ -942,6 +1117,7 @@ msgstr "Offertes en verkopen"
msgid ""
"Allows you to select and maintain different units of measure for products."
msgstr ""
+"Hiermee kunt u verschillende meeteenheden kiezen en instellen voor producten."
#. module: sale
#: model:ir.model,name:sale.model_res_partner
@@ -953,13 +1129,13 @@ msgstr "Relatie"
#. module: sale
#: view:sale.advance.payment.inv:0
msgid "Create and View Invoice"
-msgstr ""
+msgstr "Factuur maken en bekijken"
#. module: sale
#: code:addons/sale/sale.py:655
#, python-format
msgid "Sale Order for <em>%s</em> has been <b>done</b>"
-msgstr ""
+msgstr "Verkooporder voor <em>%s</em> is <b>afgewerkt</b>"
#. module: sale
#: model:ir.actions.act_window,help:sale.action_shop_form
@@ -974,6 +1150,15 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik als u een nieuw verkooppunt wilt instellen.\n"
+" </p><p>\n"
+" Elke offerte of verkooporder moet aan een verkooppunt worden "
+"gekoppeld. Het\n"
+" verkooppunt bepaalt ook het magazijn van waaruit de "
+"producten worden geleverd.\n"
+" </p>\n"
+" "
#. module: sale
#: model:ir.model,name:sale.model_sale_make_invoice
@@ -999,6 +1184,20 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik om een offerte te maken, de eerste stap naar een nieuwe "
+"verkoop.\n"
+" </p><p>\n"
+" Met OpenERP handelt u de volledige verkoopflow efficiënt "
+"af:\n"
+" offerte, order, levering, facturatie en\n"
+" betaling.\n"
+" </p><p>\n"
+" Met de sociale opties kunt u discussies voeren op een order\n"
+" en zo uw klant een zicht geven op de evolutie van de "
+"verkooporder.\n"
+" </p>\n"
+" "
#. module: sale
#: field:sale.order.line,discount:0
@@ -1017,7 +1216,7 @@ msgstr ""
"Factuur kan niet worden gemaakt voor deze verkooporderregel omdat:\\n\n"
"1. de status van deze verkooporder \\\"concept\\\" is of \\\"geannuleerd\\"
"\"\\n\n"
-"2. de verkooporderregel al is gefactureerd."
+"2. de verkooporderlijn al is gefactureerd."
#. module: sale
#: code:addons/sale/sale.py:783
@@ -1026,6 +1225,8 @@ msgid ""
"There is no Fiscal Position defined or Income category account defined for "
"default properties of Product categories."
msgstr ""
+"Er is geen fiscale positie ingesteld of er is geen opbrengstenrekening "
+"ingesteld voor de productcategorie."
#. module: sale
#: view:sale.order.line:0
@@ -1041,7 +1242,7 @@ msgstr "Mijn offertes"
#. module: sale
#: view:sale.advance.payment.inv:0
msgid "Invoice Sale Order"
-msgstr ""
+msgstr "Verkooporder factureren"
#. module: sale
#: selection:sale.report,month:0
@@ -1051,7 +1252,7 @@ msgstr "December"
#. module: sale
#: view:sale.config.settings:0
msgid "Contracts Management"
-msgstr ""
+msgstr "Contractbeheer"
#. module: sale
#: view:sale.order.line:0
@@ -1072,7 +1273,7 @@ msgstr "${object.company_id.name} Order (Ref. ${object.name or 'nvt' })"
#. module: sale
#: field:sale.order.line,sequence:0
msgid "Sequence"
-msgstr ""
+msgstr "Volgorde"
#. module: sale
#: code:addons/sale/sale.py:591
@@ -1095,22 +1296,22 @@ msgstr "Productcategorie"
#: code:addons/sale/sale.py:557
#, python-format
msgid "Cannot cancel this sales order!"
-msgstr ""
+msgstr "Kan verkooporder niet annuleren"
#. module: sale
#: help:sale.order,invoice_exists:0
msgid "It indicates that sale order has at least one invoice."
-msgstr ""
+msgstr "Geeft aan dat er voor de verkooporder tenminste een factuur bestaat."
#. module: sale
#: model:ir.model,name:sale.model_mail_message
msgid "Message"
-msgstr ""
+msgstr "Bericht"
#. module: sale
#: field:sale.config.settings,module_warning:0
msgid "Allow configuring alerts by customer or products"
-msgstr ""
+msgstr "Waarschuwingen instellen per klant of product"
#. module: sale
#: field:sale.shop,name:0
@@ -1123,6 +1324,8 @@ msgstr "Naam verkooppunt"
msgid ""
"In order to delete a confirmed sale order, you must cancel it before !"
msgstr ""
+"U kunt een bevestigde verkooporder pas verwijderen als u deze eerst "
+"annuleert."
#. module: sale
#: report:sale.order:0
@@ -1133,12 +1336,12 @@ msgstr "Btw:"
#: code:addons/sale/sale.py:658
#, python-format
msgid "Invoice has been <b>paid</b>."
-msgstr ""
+msgstr "Factuur is <b>betaald</b>."
#. module: sale
#: model:res.groups,name:sale.group_analytic_accounting
msgid "Analytic Accounting for Sales"
-msgstr ""
+msgstr "Verkopen analytisch boeken"
#. module: sale
#: model:ir.model,name:sale.model_sale_advance_payment_inv
@@ -1148,7 +1351,7 @@ msgstr "Voorschotfactuur"
#. module: sale
#: model:ir.actions.client,name:sale.action_client_sale_menu
msgid "Open Sale Menu"
-msgstr ""
+msgstr "Het verkoopmenu openen"
#. module: sale
#: selection:sale.report,state:0
@@ -1186,7 +1389,7 @@ msgstr ""
#: code:addons/sale/wizard/sale_make_invoice_advance.py:153
#, python-format
msgid "Advance of %s %%"
-msgstr ""
+msgstr "Voorschot van %s %%"
#. module: sale
#: model:ir.model,name:sale.model_sale_order_line_make_invoice
@@ -1207,6 +1410,7 @@ msgstr "Betaald"
#: help:sale.order.line,sequence:0
msgid "Gives the sequence order when displaying a list of sales order lines."
msgstr ""
+"Toont de volgorde bij het weergeven van een lijst van verkooporderlijnen."
#. module: sale
#: help:sale.order.line,state:0
@@ -1255,12 +1459,12 @@ msgstr "Btw-bedrag"
#: field:sale.order.line,state:0
#: view:sale.report:0
msgid "Status"
-msgstr ""
+msgstr "Status"
#. module: sale
#: selection:sale.order,order_policy:0
msgid "On Demand"
-msgstr ""
+msgstr "Op verzoek"
#. module: sale
#: selection:sale.report,month:0
@@ -1270,7 +1474,7 @@ msgstr "Augustus"
#. module: sale
#: view:sale.order:0
msgid "Sale Order "
-msgstr ""
+msgstr "Verkooporder "
#. module: sale
#: model:process.node,note:sale.process_node_saleorder0
@@ -1291,6 +1495,15 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p class=\"oe_view_nocontent_create\">\n"
+" Klik om een offerte te maken die kan worden omgezet in een "
+"verkooporder.\n"
+" </p><p>\n"
+" Met OpenERP handelt u de volledige verkoopflow efficiënt "
+"af:\n"
+" offerte, order, levering, facturatie en betaling.\n"
+" </p>\n"
+" "
#. module: sale
#: selection:sale.report,month:0
@@ -1311,17 +1524,17 @@ msgstr "Order"
#: code:addons/sale/sale.py:647
#, python-format
msgid "Quotation for <em>%s</em> <b>converted</b> to Sale Order of %s %s."
-msgstr ""
+msgstr "Offerte voor <em>%s</em> <b>omgezet</b> naar verkooporder van %s %s."
#. module: sale
#: view:sale.order:0
msgid "we should put a config wizard for these two fields"
-msgstr ""
+msgstr "We moeten een configuratiewizard maken voor deze twee velden"
#. module: sale
#: field:sale.order,message_is_follower:0
msgid "Is a Follower"
-msgstr ""
+msgstr "Is een volger"
#. module: sale
#: code:addons/sale/sale.py:261
@@ -1365,13 +1578,13 @@ msgstr "Uitgebreide filters..."
#: code:addons/sale/wizard/sale_make_invoice.py:42
#, python-format
msgid "Warning!"
-msgstr ""
+msgstr "Waarschuwing"
#. module: sale
#: field:sale.order,message_comment_ids:0
#: help:sale.order,message_comment_ids:0
msgid "Comments and emails"
-msgstr ""
+msgstr "Commentaar en e-mails"
#. module: sale
#: field:sale.advance.payment.inv,product_id:0
@@ -1406,6 +1619,9 @@ msgid ""
"Manage Related Stock.\n"
" This installs the module sale_stock."
msgstr ""
+"Hiermee maakt u een offerte, een verkooporder met verschillende bestelwijzen "
+"en voorraadopvolging.\n"
+" Hiermee wordt de module sale_stock geïnstalleerd."
#. module: sale
#: help:sale.advance.payment.inv,product_id:0
@@ -1414,6 +1630,9 @@ msgid ""
" You may have to create it and set it as a default value on "
"this field."
msgstr ""
+"Selecteer een product van het type Dienst dat 'Voorschotproduct' heet.\n"
+"\t\t\t U moet dit product wellicht eerst maken en instellen als "
+"standaardwaarde voor dit veld."
#. module: sale
#: selection:sale.report,month:0
@@ -1428,28 +1647,28 @@ msgstr "Lopende verkooporders"
#. module: sale
#: field:sale.order,message_summary:0
msgid "Summary"
-msgstr ""
+msgstr "Samenvatting"
#. module: sale
#: field:sale.config.settings,timesheet:0
msgid "Prepare invoices based on timesheets"
-msgstr ""
+msgstr "Facturen voorbereiden op basis van uurroosters"
#. module: sale
#: code:addons/sale/sale.py:651
#, python-format
msgid "Sale Order for <em>%s</em> <b>cancelled</b>."
-msgstr ""
+msgstr "Verkooporder voor <em>%s</em> <b>geannuleerd</b>."
#. module: sale
#: field:sale.advance.payment.inv,advance_payment_method:0
msgid "What do you want to invoice?"
-msgstr ""
+msgstr "Wat wilt u factureren?"
#. module: sale
#: field:sale.config.settings,group_sale_pricelist:0
msgid "Use pricelists to adapt your price per customers"
-msgstr ""
+msgstr "Gebruik prijslijsten als u specifieke prijzen per klant wilt"
#. module: sale
#: model:process.transition,note:sale.process_transition_confirmquotation0
@@ -1481,6 +1700,11 @@ msgid ""
"more than 5.\n"
" Supplier: don't forget to ask for an express delivery."
msgstr ""
+"Hiermee kunt u waarschuwingen instellen voor producten en deze weergeven als "
+"een gebruiker een bepaald product aan een klant wilt verkopen.\n"
+" Voorbeeld: Product: dit product is verouderd, gelieve er maximum "
+"5 te kopen.\n"
+" Leverancier: vraag om een snelle levering."
#. module: sale
#: view:sale.report:0
@@ -1501,7 +1725,7 @@ msgstr "Historiek"
#. module: sale
#: field:sale.config.settings,module_sale_margin:0
msgid "Display margins on sales orders"
-msgstr ""
+msgstr "Marges in verkooporder weergeven"
#. module: sale
#: help:sale.order,invoice_ids:0
@@ -1522,7 +1746,7 @@ msgstr "Uw referentie"
#. module: sale
#: view:sale.advance.payment.inv:0
msgid "Show Lines to Invoice"
-msgstr ""
+msgstr "Te factureren lijnen weergeven"
#. module: sale
#: field:sale.report,date:0
@@ -1635,7 +1859,7 @@ msgstr "Annuleren"
#. module: sale
#: field:sale.order,message_follower_ids:0
msgid "Followers"
-msgstr ""
+msgstr "Volgers"
#. module: sale
#: code:addons/sale/sale.py:947
@@ -1657,7 +1881,7 @@ msgstr "Niet-gefactureerde lijnen zoeken"
#. module: sale
#: model:ir.model,name:sale.model_account_config_settings
msgid "account.config.settings"
-msgstr ""
+msgstr "account.config.settings"
#. module: sale
#: sql_constraint:sale.order:0
@@ -1678,11 +1902,20 @@ msgid ""
" </p>\n"
" "
msgstr ""
+"<p>\n"
+" Hier is een lijst van alle te factureren verkooporderlijnen. "
+"U kunt\n"
+" verkooporders gedeeltelijk factureren, per lijn. U heeft "
+"deze\n"
+" lijst niet nodig als u factureert van zendnota of als u "
+"alles factureert.\n"
+" </p>\n"
+" "
#. module: sale
#: view:sale.config.settings:0
msgid "Product Features"
-msgstr ""
+msgstr "Productopties"
#. module: sale
#: view:sale.order.line:0
@@ -1706,12 +1939,12 @@ msgstr ""
#: code:addons/sale/sale.py:663
#, python-format
msgid "Draft Invoice of %s %s <b>waiting for validation</b>."
-msgstr ""
+msgstr "Voorlopige factuur van %s %s <b>wacht op goedkeuring</b>."
#. module: sale
#: field:sale.config.settings,module_account_analytic_analysis:0
msgid "Use contracts management"
-msgstr ""
+msgstr "Gebruik contractbeheer"
#. module: sale
#: code:addons/sale/sale.py:955
@@ -1720,6 +1953,8 @@ msgid ""
"Cannot find a pricelist line matching this product and quantity.\n"
"You have to change either the product, the quantity or the pricelist."
msgstr ""
+"Geen prijslijstlijn gevonden voor dit product en deze hoeveelheid.\n"
+"U moet het product, de hoeveelheid of de prijslijst veranderen."
#. module: sale
#: model:ir.actions.act_window,name:sale.action_order_report_all
@@ -1767,7 +2002,7 @@ msgstr "U kunt geen verkooporderlijn annuleren die al is gefactureerd."
#. module: sale
#: selection:sale.advance.payment.inv,advance_payment_method:0
msgid "Percentage"
-msgstr ""
+msgstr "Percentage"
#. module: sale
#: report:sale.order:0
@@ -1778,7 +2013,7 @@ msgstr ""
#: view:sale.report:0
#: field:sale.report,user_id:0
msgid "Salesperson"
-msgstr ""
+msgstr "Verkoper"
#. module: sale
#: view:sale.order.line:0
@@ -1792,7 +2027,7 @@ msgstr "Product"
#: view:sale.advance.payment.inv:0
#: view:sale.order:0
msgid "%"
-msgstr ""
+msgstr "%"
#. module: sale
#: report:sale.order:0
@@ -1804,6 +2039,7 @@ msgstr "Omschrijving"
#, python-format
msgid "There is no income account defined for this product: \"%s\" (id:%d)."
msgstr ""
+"Er is geen opbrengstenrekening gedefinieerd voor dit product: \"%s\" (id:%d)"
#. module: sale
#: selection:sale.report,month:0
@@ -1815,6 +2051,8 @@ msgstr "Mei"
#, python-format
msgid "Please define income account for this product: \"%s\" (id:%d)."
msgstr ""
+"Gelieve een opbrengstenrekening in te stellen voor dit product: \"%s\" "
+"(id:%d)."
#. module: sale
#: report:sale.order:0
@@ -1845,6 +2083,11 @@ msgid ""
"The 'Waiting Schedule' state is set when the invoice is confirmed but "
"waiting for the scheduler to run on the order date."
msgstr ""
+"Geeft de status van de offerte of verkooporder. \\n\n"
+"Status Uitzondering wordt automatisch ingesteld als er een fout optreedt "
+"voor een factuur (Factuuruitzondering).\n"
+"De 'Wacht op Planner' status wordt ingesteld als de factuur is bevestigd, "
+"maar wacht op de planner die op de 'Bestelde datum' zal lopen."
#. module: sale
#: report:sale.order:0
@@ -1855,7 +2098,7 @@ msgstr "Tel.:"
#: view:sale.make.invoice:0
#: view:sale.order.line.make.invoice:0
msgid "Do you really want to create the invoice(s)?"
-msgstr ""
+msgstr "Wilt u de factuur (facturen) maken?"
#. module: sale
#: view:sale.order:0
@@ -1865,7 +2108,7 @@ msgstr "Overige informatie"
#. module: sale
#: view:res.partner:0
msgid "sale.group_delivery_invoice_address"
-msgstr ""
+msgstr "sale.group_delivery_invoice_address"
#. module: sale
#: view:sale.order.line:0
@@ -1880,12 +2123,12 @@ msgstr "Door de boekhouder te controleren."
#. module: sale
#: view:sale.order:0
msgid "Send by Mail"
-msgstr ""
+msgstr "Via e-mail versturen"
#. module: sale
#: model:res.groups,name:sale.group_mrp_properties
msgid "Properties on lines"
-msgstr ""
+msgstr "Eigenschappen per lijn"
#. module: sale
#: help:sale.order,partner_shipping_id:0
@@ -1895,7 +2138,7 @@ msgstr "Leveringsadres voor de huidige verkooporder."
#. module: sale
#: selection:sale.order,state:0
msgid "Sale to Invoice"
-msgstr ""
+msgstr "Te factureren verkopen"
#. module: sale
#: model:ir.actions.report.xml,name:sale.report_sale_order
@@ -1905,7 +2148,7 @@ msgstr "Offerte / Order"
#. module: sale
#: view:sale.order:0
msgid "Inbox"
-msgstr ""
+msgstr "Postvak IN"
#. module: sale
#: view:sale.order:0
@@ -1932,13 +2175,13 @@ msgstr "Factureer op"
#. module: sale
#: selection:sale.advance.payment.inv,advance_payment_method:0
msgid "Fixed price (deposit)"
-msgstr ""
+msgstr "Vaste prijs (aanbetaling)"
#. module: sale
#: code:addons/sale/wizard/sale_make_invoice_advance.py:139
#, python-format
msgid "There is no income account defined as global property."
-msgstr ""
+msgstr "Er is geen opbrengstenrekening ingesteld als een globaal kenmerk."
#. module: sale
#: report:sale.order:0
@@ -1954,6 +2197,7 @@ msgstr "Productverkoopeenheid"
#: help:account.config.settings,group_analytic_account_for_sales:0
msgid "Allows you to specify an analytic account on sale orders."
msgstr ""
+"Hiermee kunt u een analytische rekening meegeven op een verkooporder."
#. module: sale
#: model:process.node,note:sale.process_node_quotation0
@@ -1978,23 +2222,23 @@ msgstr "Handmatig"
#. module: sale
#: model:ir.actions.server,name:sale.actions_server_sale_order_unread
msgid "Mark unread"
-msgstr ""
+msgstr "Als ongelezen markeren"
#. module: sale
#: code:addons/sale/sale.py:643
#, python-format
msgid "Quotation for <em>%s</em> <b>created</b>."
-msgstr ""
+msgstr "Offerte voor <em>%s</em> <b>is gemaakt</b>."
#. module: sale
#: model:res.groups,name:sale.group_delivery_invoice_address
msgid "Addresses in Sale Orders"
-msgstr ""
+msgstr "Adressen in verkooporders"
#. module: sale
#: field:sale.config.settings,time_unit:0
msgid "The default working time unit for services is"
-msgstr ""
+msgstr "De standaardwerkeenheid voor diensten is"
#. module: sale
#: view:sale.order:0
@@ -2004,12 +2248,12 @@ msgstr "Mijn verkooporders"
#. module: sale
#: model:res.groups,name:sale.group_invoice_so_lines
msgid "Enable Invoicing Sale order lines"
-msgstr ""
+msgstr "Factuur volgens verkooporderlijnen instellen"
#. module: sale
#: help:sale.order,message_ids:0
msgid "Messages and communication history"
-msgstr ""
+msgstr "Berichten en communicatiehistoriek"
#. module: sale
#: view:sale.order:0
@@ -2025,6 +2269,9 @@ msgid ""
"with\n"
" your customer."
msgstr ""
+"Gebruik contracten als u uw dienstverlening wilt opvolgen met\n"
+" meerdere facturen op hetzelfde contract met\n"
+" uw klant."
#. module: sale
#: view:sale.report:0
@@ -2067,13 +2314,13 @@ msgstr ""
#. module: sale
#: selection:sale.advance.payment.inv,advance_payment_method:0
msgid "Some order lines"
-msgstr ""
+msgstr "Enkele orderlijnen"
#. module: sale
#: code:addons/sale/sale.py:986
#, python-format
msgid "Cannot delete a sales order line which is in state '%s'."
-msgstr ""
+msgstr "Een verkooporderlijn die %s is, kan niet worden verwijderd."
#. module: sale
#: help:sale.order,project_id:0
@@ -2094,7 +2341,7 @@ msgstr "Te factureren verkooporders"
#. module: sale
#: help:account.config.settings,module_sale_analytic_plans:0
msgid "This allows install module sale_analytic_plans."
-msgstr ""
+msgstr "Hiermee wordt de module sale_analytic_plans geïnstalleerd."
#. module: sale
#: view:sale.advance.payment.inv:0
@@ -2106,7 +2353,7 @@ msgstr ""
#. module: sale
#: field:sale.order.line,name:0
msgid "Product Description"
-msgstr ""
+msgstr "Productomschrijving"
#. module: sale
#: help:sale.config.settings,group_sale_pricelist:0
@@ -2115,6 +2362,10 @@ msgid ""
" Example: 10% for retailers, promotion of 5 EUR on this "
"product, etc."
msgstr ""
+"Hiermee kunt u verschillende % fprijzen toepassen volgens regels per "
+"klantencategorie.\n"
+" Voorbeeld: 10% voor kleinhandelaars, promotie van 5 EUR voor "
+"een product, enz."
#. module: sale
#: report:sale.order:0
@@ -2124,7 +2375,7 @@ msgstr "Offertenr."
#. module: sale
#: model:res.groups,name:sale.group_discount_per_so_line
msgid "Discount on lines"
-msgstr ""
+msgstr "Korting per lijn"
#. module: sale
#: field:sale.order,client_order_ref:0
@@ -2144,6 +2395,10 @@ msgid ""
"between the Unit Price and Cost Price.\n"
" This installs the module sale_margin."
msgstr ""
+"Hiermee wordt de 'Marge' toegevoegd per verkooporder.\n"
+" Dit toont de winst op basis van het verschil tussen "
+"eenheidsprijs en kostprijs.\n"
+" Hiermee wordt de module sale_margin geïnstalleerd."
#. module: sale
#: code:addons/sale/sale.py:867
@@ -2152,6 +2407,8 @@ msgid ""
"Before choosing a product,\n"
" select a customer in the sales form."
msgstr ""
+"Kies eerst een klant in het verkoopformulier,\n"
+" en dan pas een product."
#. module: sale
#: view:sale.order:0
@@ -2172,6 +2429,10 @@ msgid ""
" will create a draft invoice that can be modified\n"
" before validation."
msgstr ""
+"Kies hoe u deze order wilt factureren. Er\n"
+" wordt een voorlopige factuur gemaakt die nog kan "
+"worden aangepast\n"
+" voor goedkeuring."
#. module: sale
#: view:sale.report:0
diff --git a/addons/sale/report/sale_order.rml b/addons/sale/report/sale_order.rml
index 9f7ba06db95..32926cc0626 100644
--- a/addons/sale/report/sale_order.rml
+++ b/addons/sale/report/sale_order.rml
@@ -153,6 +153,12 @@
</pto_header>
<para style="terp_default_8">[[repeatIn(objects,'o')]]</para>
<para style="terp_default_8">[[ setLang(o.partner_id.lang) ]]</para>
+ <para style="terp_default_8">
+ <font color="white"> </font>
+ </para>
+ <para style="terp_default_8">
+ <font color="white"> </font>
+ </para>
<blockTable colWidths="265.0,51.0,225.0" style="Table1">
<tr>
<td>
diff --git a/addons/sale/report/sale_report.py b/addons/sale/report/sale_report.py
index 3048b1414cd..0ae2e4f7133 100644
--- a/addons/sale/report/sale_report.py
+++ b/addons/sale/report/sale_report.py
@@ -93,6 +93,7 @@ class sale_report(osv.osv):
left join product_template t on (p.product_tmpl_id=t.id)
left join product_uom u on (u.id=l.product_uom)
left join product_uom u2 on (u2.id=t.uom_id)
+ where l.product_id is not null
group by
l.product_id,
l.product_uom_qty,
diff --git a/addons/sale/res_config_view.xml b/addons/sale/res_config_view.xml
index 9ebbc36f8de..6150d4ce1a3 100644
--- a/addons/sale/res_config_view.xml
+++ b/addons/sale/res_config_view.xml
@@ -12,10 +12,6 @@
<group>
<label for="id" string="Invoicing Process"/>
<div>
- <div>
- <field name="group_invoice_so_lines" on_change="onchange_invoice_methods(group_invoice_so_lines, group_invoice_deli_orders)" class="oe_inline"/>
- <label for="group_invoice_so_lines"/>
- </div>
<div name="timesheet">
<field name="timesheet" class="oe_inline" on_change="onchange_timesheet(timesheet)"/>
<label for="timesheet"/>
diff --git a/addons/sale/res_partner.py b/addons/sale/res_partner.py
index d7bcd5804ee..5e8d05b62c1 100644
--- a/addons/sale/res_partner.py
+++ b/addons/sale/res_partner.py
@@ -26,9 +26,13 @@ class res_partner(osv.osv):
_inherit = 'res.partner'
def _sale_order_count(self, cr, uid, ids, field_name, arg, context=None):
- res = {}
- for partner in self.browse(cr, uid, ids, context):
- res[partner.id] = len(partner.sale_order_ids)
+ res = dict(map(lambda x: (x,0), ids))
+ # The current user may not have access rights for sale orders
+ try:
+ for partner in self.browse(cr, uid, ids, context):
+ res[partner.id] = len(partner.sale_order_ids)
+ except:
+ pass
return res
def copy(self, cr, uid, record_id, default=None, context=None):
diff --git a/addons/sale/sale_view.xml b/addons/sale/sale_view.xml
index 23d2c556f40..343f06c2d69 100644
--- a/addons/sale/sale_view.xml
+++ b/addons/sale/sale_view.xml
@@ -174,7 +174,7 @@
</h1>
<group>
<group>
- <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1, 'show_address': 1}" options='{"always_reload": true}'/>
+ <field name="partner_id" on_change="onchange_partner_id(partner_id)" domain="[('customer','=',True)]" context="{'search_default_customer':1}"/>
<field name="partner_invoice_id" groups="sale.group_delivery_invoice_address"/>
<field name="partner_shipping_id" groups="sale.group_delivery_invoice_address"/>
<field name="project_id" context="{'partner_id':partner_id, 'pricelist_id':pricelist_id, 'default_name':name}" groups="sale.group_analytic_accounting" domain="[('type','in',['view','normal','contract'])]"/>
@@ -310,6 +310,7 @@
</notebook>
</sheet>
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" widget="mail_thread"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -364,7 +365,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
- <field name="context">{}</field>
+ <field name="context">{'show_address': 1}</field>
<field name="domain">[('state','not in',('draft','sent','cancel'))]</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
@@ -406,7 +407,7 @@
<field name="res_model">sale.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph</field>
- <field name="context">{}</field>
+ <field name="context">{'show_address': 1}</field>
<field name="domain">[('state','in',('draft','sent','cancel'))]</field>
<field name="search_view_id" ref="view_sales_order_filter"/>
<field name="help" type="html">
diff --git a/addons/sale/security/ir.model.access.csv b/addons/sale/security/ir.model.access.csv
index d0d14fc76a1..670c863a022 100644
--- a/addons/sale/security/ir.model.access.csv
+++ b/addons/sale/security/ir.model.access.csv
@@ -37,7 +37,7 @@ access_product_ul_sale_manager,product.ul salemanager,product.model_product_ul,b
access_product_category_sale_manager,product.category salemanager,product.model_product_category,base.group_sale_manager,1,1,1,1
access_product_supplierinfo_user,product.supplierinfo.user,product.model_product_supplierinfo,base.group_sale_salesman,1,0,0,0
access_product_supplierinfo_sale_manager,product.supplierinfo salemanager,product.model_product_supplierinfo,base.group_sale_manager,1,1,1,1
-access_pricelist_partnerinfo_sale_manager,pricelist.partnerinfo salemanager,product.model_pricelist_partnerinfo,base.group_sale_manager,1,1,1,1
+access_pricelist_partnerinfo_sale_manager,pricelist.partnerinfo salemanager,product.model_pricelist_partnerinfo,base.group_sale_manager,1,1,1,1
access_product_price_type_sale_manager,product.price.type salemanager,product.model_product_price_type,base.group_sale_manager,1,1,1,1
access_product_pricelist_type_sale_manager,product.pricelist.type salemanager,product.model_product_pricelist_type,base.group_sale_manager,1,1,1,1
access_product_pricelist_sale_manager,product.pricelist salemanager,product.model_product_pricelist,base.group_sale_manager,1,1,1,1
diff --git a/addons/sale_crm/sale_crm.py b/addons/sale_crm/sale_crm.py
index b6d5ec25ce1..80e9f3b4f42 100644
--- a/addons/sale_crm/sale_crm.py
+++ b/addons/sale_crm/sale_crm.py
@@ -23,13 +23,27 @@ from osv import osv,fields
class sale_order(osv.osv):
_inherit = 'sale.order'
-
_columns = {
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'categ_ids': fields.many2many('crm.case.categ', 'sale_order_category_rel', 'order_id', 'category_id', 'Categories', \
domain="['|',('section_id','=',section_id),('section_id','=',False), ('object_id.model', '=', 'crm.lead')]")
}
+ def create(self, cr, uid, vals, context=None):
+ order = super(sale_order, self).create(cr, uid, vals, context=context)
+ section_id = self.browse(cr, uid, order, context=context).section_id
+ if section_id:
+ followers = [follow.id for follow in section_id.message_follower_ids]
+ self.message_subscribe(cr, uid, [order], followers, context=context)
+ return order
+
+ def write(self, cr, uid, ids, vals, context=None):
+ if vals.get('section_id'):
+ section_id = self.pool.get('crm.case.section').browse(cr, uid, vals.get('section_id'), context=context)
+ if section_id:
+ vals['message_follower_ids'] = [(4, follower.id) for follower in section_id.message_follower_ids]
+ return super(sale_order, self).write(cr, uid, ids, vals, context=context)
+
sale_order()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/sale_stock/sale_stock.py b/addons/sale_stock/sale_stock.py
index a48b766f3bb..490af81ed41 100644
--- a/addons/sale_stock/sale_stock.py
+++ b/addons/sale_stock/sale_stock.py
@@ -253,7 +253,6 @@ class sale_order(osv.osv):
assert mode in ('finished', 'canceled'), _("invalid mode for test_state")
finished = True
canceled = False
- notcanceled = False
write_done_ids = []
write_cancel_ids = []
for order in self.browse(cr, uid, ids, context={}):
@@ -268,8 +267,6 @@ class sale_order(osv.osv):
canceled = True
if line.state != 'exception':
write_cancel_ids.append(line.id)
- else:
- notcanceled = True
if write_done_ids:
self.pool.get('sale.order.line').write(cr, uid, write_done_ids, {'state': 'done'})
if write_cancel_ids:
@@ -279,9 +276,6 @@ class sale_order(osv.osv):
return finished
elif mode == 'canceled':
return canceled
- if notcanceled:
- return False
- return canceled
def _prepare_order_line_procurement(self, cr, uid, order, line, move_id, date_planned, context=None):
return {
diff --git a/addons/share/ir_model.py b/addons/share/ir_model.py
index 008dd424fa5..0d90aec3eb7 100644
--- a/addons/share/ir_model.py
+++ b/addons/share/ir_model.py
@@ -40,6 +40,7 @@ class ir_model_access(osv.Model):
LEFT JOIN ir_module_category c ON (c.id=g.category_id)
WHERE
m.model=%s AND
+ a.active IS true AND
(g.share IS NULL or g.share IS false) AND
a.perm_''' + access_mode, (model_name,))
return [('%s/%s' % x) if x[0] else x[1] for x in cr.fetchall()]
diff --git a/addons/stock/i18n/es_MX.po b/addons/stock/i18n/es_MX.po
index 3cf93515b09..3ad451daa04 100644
--- a/addons/stock/i18n/es_MX.po
+++ b/addons/stock/i18n/es_MX.po
@@ -1,92 +1,103 @@
-# Translation of OpenERP Server.
-# This file contains the translation of the following modules:
-# * stock
+# Spanish (Mexico) translation for openobject-addons
+# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
+# This file is distributed under the same license as the openobject-addons package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
-"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2011-01-11 11:16+0000\n"
-"PO-Revision-Date: 2011-01-18 09:19+0000\n"
-"Last-Translator: Borja López Soilán (NeoPolus) <borjalopezsoilan@gmail.com>\n"
-"Language-Team: \n"
+"Project-Id-Version: openobject-addons\n"
+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
+"POT-Creation-Date: 2012-02-08 01:37+0100\n"
+"PO-Revision-Date: 2012-09-27 04:54+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: Spanish (Mexico) <es_MX@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-09-05 04:57+0000\n"
-"X-Generator: Launchpad (build 13830)\n"
-
-#~ msgid "Stock Management"
-#~ msgstr "Gestión de inventario"
+"X-Launchpad-Export-Date: 2012-09-28 04:39+0000\n"
+"X-Generator: Launchpad (build 16043)\n"
#. module: stock
#: field:product.product,track_outgoing:0
msgid "Track Outgoing Lots"
-msgstr "Lotes de seguimiento en salida"
+msgstr ""
#. module: stock
-#: model:ir.model,name:stock.model_stock_ups_upload
-msgid "Stock ups upload"
-msgstr "Stock ups carga"
+#: model:ir.model,name:stock.model_stock_move_split_lines
+msgid "Stock move Split lines"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:76
-#, python-format
-msgid "Variation Account is not specified for Product Category: %s"
+#: help:product.category,property_stock_account_input_categ:0
+msgid ""
+"When doing real-time inventory valuation, counterpart journal items for all "
+"incoming stock moves will be posted in this account, unless there is a "
+"specific valuation account set on the source location. This is the default "
+"value for all products in this category. It can also directly be set on each "
+"product"
msgstr ""
-"No se ha especificado la cuenta de variación para la categoría de producto: "
-"%s"
#. module: stock
#: field:stock.location,chained_location_id:0
msgid "Chained Location If Fixed"
-msgstr "Ubicación encadenada si fija"
+msgstr ""
#. module: stock
-#: view:stock.inventory:0
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.inventory:0 view:stock.move:0 view:stock.picking:0
msgid "Put in a new pack"
-msgstr "Poner en un paquete nuevo"
-
-#. module: stock
-#: field:stock.move.split.lines,action:0
-msgid "Action"
-msgstr "Acción"
+msgstr ""
#. module: stock
+#: code:addons/stock/wizard/stock_traceability.py:54
#: view:stock.production.lot:0
+#, python-format
msgid "Upstream Traceability"
-msgstr "Trazabilidad hacia arriba"
+msgstr ""
+
+#. module: stock
+#: model:ir.actions.todo.category,name:stock.category_stock_management_config
+msgid "Stock Management"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_line_date
#: model:ir.ui.menu,name:stock.menu_report_stock_line_date
msgid "Last Product Inventories"
-msgstr "Último inventario de productos"
+msgstr ""
#. module: stock
#: view:stock.move:0
msgid "Today"
-msgstr "Hoy"
+msgstr ""
#. module: stock
#: field:stock.production.lot.revision,indice:0
msgid "Revision Number"
-msgstr "Número de revisión"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0
+msgid "Orders processed Today or planned for Today"
+msgstr ""
#. module: stock
-#: view:stock.move.memory.in:0
-#: view:stock.move.memory.out:0
+#: view:stock.partial.move.line:0 view:stock.partial.picking:0
+#: field:stock.partial.picking,move_ids:0 view:stock.partial.picking.line:0
+#: view:stock.return.picking.memory:0
msgid "Product Moves"
-msgstr "Movimientos productos"
+msgstr ""
+
+#. module: stock
+#: model:ir.ui.menu,name:stock.menu_stock_uom_categ_form_action
+msgid "UoM Categories"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_move_report
#: model:ir.ui.menu,name:stock.menu_action_stock_move_report
#: view:report.stock.move:0
msgid "Moves Analysis"
-msgstr "Análisis movimientos"
+msgstr ""
#. module: stock
#: help:stock.production.lot,ref:0
@@ -94,8 +105,12 @@ msgid ""
"Internal reference number in case it differs from the manufacturer's serial "
"number"
msgstr ""
-"Número interno de referencia en caso de que sea diferente del número de "
-"serie del fabricante."
+
+#. module: stock
+#: code:addons/stock/wizard/stock_fill_inventory.py:47
+#, python-format
+msgid "You cannot perform this operation on more than one Stock Inventories."
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_inventory_form
@@ -104,39 +119,36 @@ msgid ""
"per location. You can use it once a year when you do the general inventory "
"or whenever you need it, to correct the current stock level of a product."
msgstr ""
-"Los inventarios periódicos se utilizan para contar el número de productos "
-"disponibles por ubicación. Lo puede utilizar una vez al año cuando realice "
-"el inventario general, o cuando lo necesite, para corregir el nivel actual "
-"de stock de un producto."
+
+#. module: stock
+#: code:addons/stock/wizard/stock_change_product_qty.py:87
+#, python-format
+msgid "Quantity cannot be negative."
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Picking list"
-msgstr "Albarán"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
#: field:report.stock.inventory,product_qty:0
#: field:report.stock.move,product_qty:0
#: field:stock.change.product.qty,new_quantity:0
#: field:stock.inventory.line,product_qty:0
#: field:stock.inventory.line.split,qty:0
-#: report:stock.inventory.move:0
-#: field:stock.move,product_qty:0
-#: field:stock.move.consume,product_qty:0
-#: field:stock.move.memory.in,quantity:0
-#: field:stock.move.memory.out,quantity:0
-#: field:stock.move.scrap,product_qty:0
-#: field:stock.move.split,qty:0
-#: field:stock.move.split.lines,quantity:0
-#: field:stock.move.split.lines.exist,quantity:0
-#: report:stock.picking.list:0
-#: field:stock.report.prodlots,qty:0
-#: field:stock.report.tracklots,name:0
+#: field:stock.inventory.line.split.lines,quantity:0
+#: report:stock.inventory.move:0 field:stock.move,product_qty:0
+#: field:stock.move.consume,product_qty:0 field:stock.move.scrap,product_qty:0
+#: field:stock.move.split,qty:0 field:stock.move.split.lines,quantity:0
+#: field:stock.partial.move.line,quantity:0
+#: field:stock.partial.picking.line,quantity:0 report:stock.picking.list:0
+#: field:stock.report.prodlots,qty:0 field:stock.report.tracklots,name:0
+#: field:stock.return.picking.memory,quantity:0
#: field:stock.split.into,quantity:0
msgid "Quantity"
-msgstr "Cantidad"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_picking_tree
@@ -144,76 +156,75 @@ msgid ""
"This is the list of all delivery orders that have to be prepared, according "
"to your different sales orders and your logistics rules."
msgstr ""
-"Esta es la lista de albaranes de salida que deben ser preparados, en función "
-"de sus pedidos de venta y sus reglas logísticas."
#. module: stock
-#: view:report.stock.move:0
-#: field:report.stock.move,day:0
+#: view:report.stock.move:0 field:report.stock.move,day:0
msgid "Day"
-msgstr "Día"
+msgstr ""
#. module: stock
-#: view:stock.inventory:0
-#: field:stock.inventory.line.split,product_uom:0
-#: view:stock.move:0
-#: field:stock.move.split,product_uom:0
-#: view:stock.picking:0
+#: view:stock.inventory:0 field:stock.inventory.line.split,product_uom:0
+#: view:stock.move:0 field:stock.move.split,product_uom:0 view:stock.picking:0
#: view:stock.production.lot:0
msgid "UoM"
-msgstr "UdM"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_change_product_qty.py:104
#: model:ir.actions.act_window,name:stock.action_inventory_form
#: model:ir.ui.menu,name:stock.menu_action_inventory_form
-#, python-format
msgid "Physical Inventories"
-msgstr "Inventarios físicos"
+msgstr ""
#. module: stock
-#: field:product.category,property_stock_journal:0
-#: view:report.stock.move:0
+#: field:product.category,property_stock_journal:0 view:report.stock.move:0
#: field:stock.change.standard.price,stock_journal:0
msgid "Stock journal"
-msgstr "Diario de inventario"
+msgstr ""
#. module: stock
-#: view:report.stock.move:0
-msgid "Incoming"
-msgstr "Entrada"
+#: view:report.stock.inventory:0 view:report.stock.move:0
+msgid "Current month"
+msgstr ""
#. module: stock
-#: help:product.category,property_stock_account_output_categ:0
-msgid ""
-"When doing real-time inventory valuation, counterpart Journal Items for all "
-"outgoing stock moves will be posted in this account. This is the default "
-"value for all products in this category, it can also directly be set on each "
-"product."
+#: code:addons/stock/wizard/stock_move.py:222
+#, python-format
+msgid "Unable to assign all lots to this move!"
msgstr ""
-"Al hacer la valoración de inventario en tiempo real, la contrapartida de los "
-"asientos del diario para todos los movimientos de stock de salida se creará "
-"en esta cuenta. Este es el valor por defecto para todos los productos de "
-"esta categoría, también puede indicarse directamente en cada producto."
#. module: stock
-#: code:addons/stock/stock.py:1170
-#: code:addons/stock/stock.py:2415
+#: code:addons/stock/stock.py:2516
#, python-format
msgid "Missing partial picking data for move #%s"
-msgstr "Faltan datos del albarán parcial para el movimiento #%s"
+msgstr ""
#. module: stock
#: model:ir.actions.server,name:stock.action_partial_move_server
msgid "Deliver/Receive Products"
-msgstr "Enviar/Recibir productos"
+msgstr ""
#. module: stock
#: code:addons/stock/report/report_stock.py:78
#: code:addons/stock/report/report_stock.py:135
#, python-format
msgid "You cannot delete any record!"
-msgstr "¡No puede eliminar ningún registro!"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Delivery orders to invoice"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Assigned Delivery Orders"
+msgstr ""
+
+#. module: stock
+#: field:stock.partial.move.line,update_cost:0
+#: field:stock.partial.picking.line,update_cost:0
+msgid "Need cost update"
+msgstr ""
#. module: stock
#: code:addons/stock/wizard/stock_splitinto.py:49
@@ -223,56 +234,51 @@ msgid ""
"if you really want to change it ' # 'for "
"this product: \"%s\" (id: %d)"
msgstr ""
-"La línea de movimiento actual ya está asignada a un albarán, elimínela "
-"primero si realmente quiere cambiarla ' # 'para este este producto: \"%s\" "
-"(id: %d)"
#. module: stock
#: selection:stock.picking,invoice_state:0
msgid "Not Applicable"
-msgstr "No aplicable"
+msgstr ""
#. module: stock
#: help:stock.tracking,serial:0
msgid "Other reference or serial number"
-msgstr "Otra referencia o número de serie."
+msgstr ""
#. module: stock
-#: field:stock.move,origin:0
-#: view:stock.picking:0
-#: field:stock.picking,origin:0
+#: field:stock.move,origin:0 view:stock.picking:0 field:stock.picking,origin:0
msgid "Origin"
-msgstr "Origen"
+msgstr ""
+
+#. module: stock
+#: view:board.board:0
+#: model:ir.actions.act_window,name:stock.action_stock_incoming_product_delay
+msgid "Incoming Products"
+msgstr ""
#. module: stock
#: view:report.stock.lines.date:0
msgid "Non Inv"
-msgstr "No factura"
+msgstr ""
#. module: stock
-#: view:stock.tracking:0
-msgid "Pack Identification"
-msgstr "Identificación paquete"
+#: code:addons/stock/wizard/stock_traceability.py:54
+#: view:stock.production.lot:0
+#, python-format
+msgid "Downstream Traceability"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: field:stock.move,picking_id:0
-#: field:stock.picking,name:0
+#: view:stock.move:0 field:stock.move,picking_id:0 field:stock.picking,name:0
#: view:stock.production.lot:0
msgid "Reference"
-msgstr "Referencia"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:666
-#: code:addons/stock/stock.py:1472
+#: code:addons/stock/stock.py:670 code:addons/stock/stock.py:1516
#, python-format
msgid "Products to Process"
-msgstr "Productos a procesar"
-
-#. module: stock
-#: constraint:product.category:0
-msgid "Error ! You can not create recursive categories."
-msgstr "¡Error! No puede crear categorías recursivas."
+msgstr ""
#. module: stock
#: help:stock.fill.inventory,set_stock_zero:0
@@ -280,238 +286,219 @@ msgid ""
"If checked, all product quantities will be set to zero to help ensure a real "
"physical inventory is done"
msgstr ""
-"Si se marca, todas las cantidades de producto se ponen a cero para ayudar a "
-"realizar un inventario físico real."
#. module: stock
-#: model:ir.model,name:stock.model_stock_move_split_lines
-msgid "Split lines"
-msgstr "Dividir líneas"
+#: view:stock.partial.move:0 view:stock.partial.picking:0
+msgid "_Validate"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1120
+#: code:addons/stock/stock.py:1149
#, python-format
msgid "You cannot cancel picking because stock move is in done state !"
msgstr ""
-"¡No puede cancelar el albarán porqué el movimiento de stock está en estado "
-"realizado!"
#. module: stock
-#: code:addons/stock/stock.py:2233
-#: code:addons/stock/stock.py:2274
-#: code:addons/stock/stock.py:2334
+#: code:addons/stock/stock.py:2337 code:addons/stock/stock.py:2379
+#: code:addons/stock/stock.py:2440
+#: code:addons/stock/wizard/stock_change_product_qty.py:87
#: code:addons/stock/wizard/stock_fill_inventory.py:53
+#: code:addons/stock/wizard/stock_partial_picking.py:141
#, python-format
msgid "Warning!"
-msgstr "¡Aviso!"
+msgstr ""
#. module: stock
#: field:stock.invoice.onshipping,group:0
msgid "Group by partner"
-msgstr "Agrupar por empresa"
+msgstr ""
#. module: stock
-#: model:ir.model,name:stock.model_res_partner
-#: view:report.stock.inventory:0
-#: field:report.stock.inventory,partner_id:0
-#: view:report.stock.move:0
-#: field:report.stock.move,partner_id:0
-#: view:stock.move:0
-#: field:stock.move,partner_id:0
-#: view:stock.picking:0
+#: model:ir.model,name:stock.model_res_partner view:report.stock.inventory:0
+#: field:report.stock.inventory,partner_id:0 view:report.stock.move:0
+#: field:report.stock.move,partner_id:0 view:stock.move:0
+#: field:stock.move,partner_id:0 view:stock.picking:0
#: field:stock.picking,partner_id:0
msgid "Partner"
-msgstr "Empresa"
+msgstr ""
#. module: stock
-#: help:stock.move.memory.in,currency:0
-#: help:stock.move.memory.out,currency:0
-msgid "Currency in which Unit cost is expressed"
-msgstr "Moneda en la que se expresa el coste unidad."
+#: code:addons/stock/stock.py:2119
+#, python-format
+msgid ""
+"Can not create Journal Entry, Input Account defined on this product and "
+"Valuation account on category of this product are same."
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:126
-#, python-format
+#: selection:stock.return.picking,invoice_state:0
msgid "No invoicing"
-msgstr "No facturación"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0
+msgid "Stock moves that have been processed"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_production_lot
#: field:stock.production.lot.revision,lot_id:0
#: field:stock.report.prodlots,prodlot_id:0
msgid "Production lot"
-msgstr "Lote de producción"
-
-#. module: stock
-#: model:ir.ui.menu,name:stock.menu_stock_uom_categ_form_action
-msgid "Units of Measure Categories"
-msgstr "Categorías de unidades de medida"
+msgstr ""
#. module: stock
#: help:stock.incoterms,code:0
msgid "Code for Incoterms"
-msgstr "Código para Incoterms"
+msgstr ""
#. module: stock
#: field:stock.tracking,move_ids:0
msgid "Moves for this pack"
-msgstr "Movimientos para este paquete"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Incoming Shipments Available"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: selection:stock.location,usage:0
msgid "Internal Location"
-msgstr "Ubicación interna"
+msgstr ""
#. module: stock
-#: view:stock.inventory:0
-msgid "Confirm Inventory"
-msgstr "Confirmar el inventario"
+#: view:stock.location.product:0
+msgid ""
+"(Keep empty to open the current situation. Adjust HH:MM:SS to 00:00:00 to "
+"filter all resources of the day for the 'From' date and 23:59:59 for the "
+"'To' date)"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: field:report.stock.inventory,state:0
-#: view:report.stock.move:0
-#: field:report.stock.move,state:0
-#: view:stock.inventory:0
-#: field:stock.inventory,state:0
-#: field:stock.inventory.line,state:0
-#: view:stock.move:0
-#: field:stock.move,state:0
-#: view:stock.picking:0
-#: field:stock.picking,state:0
+#: view:report.stock.inventory:0 field:report.stock.inventory,state:0
+#: view:report.stock.move:0 field:report.stock.move,state:0
+#: view:stock.inventory:0 field:stock.inventory,state:0
+#: field:stock.inventory.line,state:0 view:stock.move:0
+#: field:stock.move,state:0 view:stock.picking:0 field:stock.picking,state:0
#: report:stock.picking.list:0
msgid "State"
-msgstr "Estado"
+msgstr ""
+
+#. module: stock
+#: view:stock.location:0
+msgid "Accounting Information"
+msgstr ""
#. module: stock
#: field:stock.location,stock_real_value:0
msgid "Real Stock Value"
-msgstr "Valor stock real"
+msgstr ""
#. module: stock
#: field:report.stock.move,day_diff2:0
msgid "Lag (Days)"
-msgstr "Retraso (días)"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_action_traceability
msgid "Action traceability "
-msgstr "Acción trazabilidad "
-
-#. module: stock
-#: field:stock.location,posy:0
-msgid "Shelves (Y)"
-msgstr "Estantería (Y)"
+msgstr ""
#. module: stock
#: view:stock.move:0
msgid "UOM"
-msgstr "UdM"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0
-#: view:stock.move:0
-#: selection:stock.move,state:0
-#: view:stock.picking:0
-#: selection:stock.picking,state:0
-#: view:stock.production.lot:0
-#: field:stock.production.lot,stock_available:0
+#: selection:report.stock.move,state:0 view:stock.move:0
+#: selection:stock.move,state:0 view:stock.picking:0
+#: view:stock.production.lot:0 field:stock.production.lot,stock_available:0
msgid "Available"
-msgstr "Reservado"
+msgstr ""
#. module: stock
-#: view:stock.picking:0
-#: field:stock.picking,min_date:0
+#: view:stock.picking:0 field:stock.picking,min_date:0
msgid "Expected Date"
-msgstr "Fecha prevista"
-
-#. module: stock
-#: view:board.board:0
-#: model:ir.actions.act_window,name:stock.action_outgoing_product_board
-msgid "Outgoing Product"
-msgstr "Albarán de salida"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_warehouse_form
msgid ""
"Create and manage your warehouses and assign them a location from here"
-msgstr "Cree y gestione sus almacenes y asígneles una ubicación desde aquí."
+msgstr ""
#. module: stock
#: field:report.stock.move,product_qty_in:0
msgid "In Qty"
-msgstr "En cantidad"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_fill_inventory.py:106
+#: code:addons/stock/wizard/stock_fill_inventory.py:116
#, python-format
msgid "No product in this location."
-msgstr "No hay producto en esta ubicación."
+msgstr ""
#. module: stock
#: field:stock.warehouse,lot_output_id:0
msgid "Location Output"
-msgstr "Ubicación de salida"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.split_into
#: model:ir.model,name:stock.model_stock_split_into
msgid "Split into"
-msgstr "Dividir en"
+msgstr ""
+
+#. module: stock
+#: view:stock.location:0
+msgid "Internal Locations"
+msgstr ""
#. module: stock
#: field:stock.move,price_currency_id:0
msgid "Currency for average price"
-msgstr "Moneda para precio promedio"
+msgstr ""
#. module: stock
-#: help:product.template,property_stock_account_input:0
+#: help:product.category,property_stock_valuation_account_id:0
msgid ""
-"When doing real-time inventory valuation, counterpart Journal Items for all "
-"incoming stock moves will be posted in this account. If not set on the "
-"product, the one from the product category is used."
+"When real-time inventory valuation is enabled on a product, this account "
+"will hold the current value of the products."
msgstr ""
-"Al hacer la valoración de inventario en tiempo real, la contrapartida de los "
-"asientos del diario para todos los movimientos de stock de entrada se creará "
-"en esta cuenta. Si no se indica en el producto, se utilizará la definida en "
-"la categoría del producto."
#. module: stock
-#: field:report.stock.inventory,location_type:0
-#: field:stock.location,usage:0
+#: field:report.stock.inventory,location_type:0 field:stock.location,usage:0
msgid "Location Type"
-msgstr "Tipo de ubicación"
+msgstr ""
#. module: stock
-#: help:report.stock.move,type:0
-#: help:stock.picking,type:0
+#: help:report.stock.move,type:0 help:stock.picking,type:0
msgid "Shipping type specify, goods coming in or going out."
-msgstr "Indica el tipo de envío, recepción o envío de mercancías."
+msgstr ""
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_move_labels
msgid "Item Labels"
-msgstr "Etiquetas artículos"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_report_stock_move
msgid "Moves Statistics"
-msgstr "Estadísticas de movimientos"
+msgstr ""
#. module: stock
#: view:stock.production.lot:0
msgid "Product Lots Filter"
-msgstr "Filtro lotes de producto"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
-#: report:stock.inventory.move:0
-#: report:stock.picking.list:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:stock.inventory.move:0 report:stock.picking.list:0
msgid "["
-msgstr "["
+msgstr ""
#. module: stock
#: help:stock.production.lot,stock_available:0
@@ -519,58 +506,58 @@ msgid ""
"Current quantity of products with this Production Lot Number available in "
"company warehouses"
msgstr ""
-"Cantidad actual de productos con este número de lote de producción "
-"disponible en almacenes de la compañía."
#. module: stock
#: field:stock.move,move_history_ids:0
msgid "Move History (child moves)"
-msgstr "Historial movimientos (movimientos hijos)"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2015
+#: code:addons/stock/stock.py:2125
#, python-format
msgid ""
"There is no stock output account defined for this product or its category: "
"\"%s\" (id: %d)"
msgstr ""
-"No se ha definido una cuenta de salida de stock para este producto o su "
-"categoría: \"%s\" (id: %d)"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree6
#: model:ir.ui.menu,name:stock.menu_action_picking_tree6
#: field:stock.picking,move_lines:0
msgid "Internal Moves"
-msgstr "Albaranes internos"
+msgstr ""
#. module: stock
#: field:stock.move,location_dest_id:0
msgid "Destination Location"
-msgstr "Ubicación destino"
+msgstr ""
+
+#. module: stock
+#: model:ir.model,name:stock.model_stock_partial_move_line
+msgid "stock.partial.move.line"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:754
+#: code:addons/stock/stock.py:760
#, python-format
msgid "You can not process picking without stock moves"
-msgstr "No puede procesar un albarán sin movimientos de stock"
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_product_packaging_stock_action
#: field:stock.move,product_packaging:0
msgid "Packaging"
-msgstr "Empaquetado"
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Order(Origin)"
-msgstr "Pedido (origen)"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
msgid "Grand Total:"
-msgstr "Total:"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_out_picking_move
@@ -580,53 +567,42 @@ msgid ""
"buttons on the right of each line. You can filter the products to deliver by "
"customer, products or sale order (using the Origin field)."
msgstr ""
-"En esta lista encontrará todos los productos que ha de entregar a sus "
-"clientes. Puede procesar las entregas directamente desde esta lista usando "
-"los botones a la derecha de cada línea. Puede filtrar los productos a "
-"entregar por cliente, producto o pedido de venta (utilizando el campo "
-"origen)."
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_inventory_control
msgid "Inventory Control"
-msgstr "Control inventario"
+msgstr ""
#. module: stock
-#: view:stock.location:0
-#: field:stock.location,comment:0
+#: view:stock.location:0 field:stock.location,comment:0
msgid "Additional Information"
-msgstr "Información adicional"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
msgid "Location / Product"
-msgstr "Ubicación / Producto"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1303
+#: field:stock.move,address_id:0
+msgid "Destination Address "
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/stock.py:1333
#, python-format
msgid "Reception"
-msgstr "Recepción"
+msgstr ""
#. module: stock
#: field:stock.tracking,serial:0
msgid "Additional Reference"
-msgstr "Referencia adicional"
+msgstr ""
#. module: stock
#: view:stock.production.lot.revision:0
msgid "Production Lot Revisions"
-msgstr "Revisiones de lote de producción"
-
-#. module: stock
-#: help:product.product,track_outgoing:0
-msgid ""
-"Forces to specify a Production Lot for all moves containing this product and "
-"going to a Customer Location"
msgstr ""
-"Fuerza a indicar un lote de producción para todos los movimientos que "
-"contienen este producto y van a una ubicación del cliente."
#. module: stock
#: model:ir.actions.act_window,help:stock.action_stock_journal_form
@@ -636,97 +612,129 @@ msgid ""
"worker/team that should perform the operation. Examples of stock journals "
"may be: quality control, pick lists, packing, etc."
msgstr ""
-"El sistema de existencias diarias le permite asignar a cada operación de "
-"existencias a un diario específico según el tipo de operación a realizar por "
-"el trabajador/equipo que debe realizar la operación. Ejemplos de diarios de "
-"existencias pueden ser: control de calidad, listas de selección, embalaje, "
-"etc."
#. module: stock
-#: field:stock.location,complete_name:0
-#: field:stock.location,name:0
+#: field:stock.location,complete_name:0 field:stock.location,name:0
msgid "Location Name"
-msgstr "Nombre ubicación"
+msgstr ""
+
+#. module: stock
+#: model:res.company,overdue_msg:stock.res_company_shop0
+#: model:res.company,overdue_msg:stock.res_company_tinyshop0
+msgid ""
+"Our records indicate that the following payments are still due. If the "
+"amount\n"
+"has already been paid, please disregard this notice. However, if you have "
+"any\n"
+"queries regarding your account, please contact us.\n"
+"Thank you in advance.\n"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Posted Inventory"
-msgstr "Inventario enviado"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: model:ir.actions.act_window,help:stock.action_picking_tree4
+msgid ""
+"The Incoming Shipments is the list of all orders you will receive from your "
+"suppliers. An incoming shipment contains a list of products to be received "
+"according to the original purchase order. You can validate the shipment "
+"totally or partially."
+msgstr ""
+
+#. module: stock
+#: field:stock.move.split.lines,wizard_exist_id:0
+msgid "Parent Wizard (for existing lines)"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0 view:stock.picking:0
msgid "Move Information"
-msgstr "Información de movimiento"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/stock.py:2131
+#, python-format
+msgid ""
+"There is no inventory Valuation account defined on the product category: "
+"\"%s\" (id: %d)"
+msgstr ""
#. module: stock
#: view:report.stock.move:0
msgid "Outgoing"
-msgstr "Salida"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "August"
-msgstr "Agosto"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_tracking_form
#: model:ir.model,name:stock.model_stock_tracking
-#: model:ir.ui.menu,name:stock.menu_action_tracking_form
-#: view:stock.tracking:0
+#: model:ir.ui.menu,name:stock.menu_action_tracking_form view:stock.tracking:0
msgid "Packs"
-msgstr "Paquetes"
+msgstr ""
#. module: stock
#: 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"
+msgstr ""
#. module: stock
#: view:res.partner:0
msgid "Sales & Purchases"
-msgstr "Ventas y Compras"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "June"
-msgstr "Junio"
+msgstr ""
#. module: stock
#: field:product.template,property_stock_procurement:0
msgid "Procurement Location"
-msgstr "Ubicación de abastecimiento"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_production_lot_form
#: model:ir.ui.menu,name:stock.menu_action_production_lot_form
#: field:stock.inventory.line.split,line_exist_ids:0
#: field:stock.inventory.line.split,line_ids:0
-#: field:stock.move.split,line_exist_ids:0
-#: field:stock.move.split,line_ids:0
+#: field:stock.move.split,line_exist_ids:0 field:stock.move.split,line_ids:0
msgid "Production Lots"
-msgstr "Lotes de producción"
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Recipient"
-msgstr "Destinatario"
+msgstr ""
+
+#. module: stock
+#: model:stock.location,name:stock.location_refrigerator
+msgid "Refrigerator"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_location_tree
#: model:ir.ui.menu,name:stock.menu_action_location_tree
msgid "Location Structure"
-msgstr "Estructura ubicaciones"
+msgstr ""
#. module: stock
#: selection:report.stock.move,month:0
msgid "October"
-msgstr "Octubre"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_inventory_line
msgid "Inventory Line"
-msgstr "Línea inventario"
+msgstr ""
#. module: stock
#: help:product.category,property_stock_journal:0
@@ -734,20 +742,27 @@ msgid ""
"When doing real-time inventory valuation, this is the Accounting Journal in "
"which entries will be automatically posted when stock moves are processed."
msgstr ""
-"Al hacer la valoración de inventario en tiempo real, este es el diario "
-"contable donde los asientos se crearán automáticamente cuando los "
-"movimientos de stock se procesen."
#. module: stock
#: model:ir.actions.act_window,name:stock.action_partial_picking
msgid "Process Picking"
-msgstr "Procesar albarán"
+msgstr ""
+
+#. module: stock
+#: sql_constraint:stock.picking:0
+msgid "Reference must be unique per Company!"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:358
+#: code:addons/stock/product.py:417
#, python-format
msgid "Future Receptions"
-msgstr "Recepciones futuras"
+msgstr ""
+
+#. module: stock
+#: selection:stock.move,priority:0
+msgid "Urgent"
+msgstr ""
#. module: stock
#: help:stock.inventory.line.split,use_exist:0
@@ -756,149 +771,159 @@ msgid ""
"Check this option to select existing lots in the list below, otherwise you "
"should enter new ones line by line."
msgstr ""
-"Marque esta opción para seleccionar lotes existentes en la lista inferior, "
-"de lo contrario debe introducir otros de nuevos línea por la línea."
+
+#. module: stock
+#: code:addons/stock/product.py:75
+#, python-format
+msgid "Valuation Account is not specified for Product Category: %s"
+msgstr ""
#. module: stock
#: field:stock.move,move_dest_id:0
msgid "Destination Move"
-msgstr "Movimiento destino"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Process Now"
-msgstr "Procesar ahora"
+msgstr ""
#. module: stock
#: field:stock.location,address_id:0
msgid "Location Address"
-msgstr "Dirección ubicación"
+msgstr ""
#. module: stock
#: help:stock.move,prodlot_id:0
msgid "Production lot is used to put a serial number on the production"
msgstr ""
-"Lote de producción se utiliza para poner un número de serie a la producción."
#. module: stock
#: field:stock.warehouse,lot_input_id:0
msgid "Location Input"
-msgstr "Ubicación de entrada"
+msgstr ""
#. module: stock
#: help:stock.picking,date:0
msgid "Date of Order"
-msgstr "Fecha de la orden."
+msgstr ""
#. module: stock
#: selection:product.product,valuation:0
msgid "Periodical (manual)"
-msgstr "Periódico (manual)"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.location_procurement
msgid "Procurements"
-msgstr "Abastecimientos"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_3
msgid "IT Suppliers"
-msgstr "Proveedores TI"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_inventory_form_draft
msgid "Draft Physical Inventories"
-msgstr "Inventarios físicos borrador"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: selection:stock.location,usage:0
msgid "Transit Location for Inter-Companies Transfers"
-msgstr "Ubicación de tránsito para transferencias inter-compañías"
+msgstr ""
+
+#. module: stock
+#: selection:stock.location,chained_auto_packing:0
+msgid "Automatic Move"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_change_product_quantity
#: model:ir.model,name:stock.model_stock_change_product_qty
#: view:stock.change.product.qty:0
msgid "Change Product Quantity"
-msgstr "Cambiar cantidad producto"
+msgstr ""
+
+#. module: stock
+#: field:report.stock.inventory,month:0
+msgid "unknown"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_inventory_merge
msgid "Merge Inventory"
-msgstr "Fusionar inventario"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:374
+#: code:addons/stock/product.py:433
#, python-format
msgid "Future P&L"
-msgstr "P&L futuras"
+msgstr ""
#. module: stock
+#: view:board.board:0
+#: model:ir.actions.act_window,name:stock.action_incoming_product_board
#: model:ir.actions.act_window,name:stock.action_picking_tree4
-#: model:ir.ui.menu,name:stock.menu_action_picking_tree4
-#: view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_action_picking_tree4 view:stock.picking:0
msgid "Incoming Shipments"
-msgstr "Albaranes de entrada"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:report.stock.inventory:0 view:stock.move:0 view:stock.picking:0
msgid "Scrap"
-msgstr "Desecho"
+msgstr ""
#. module: stock
#: field:stock.location,child_ids:0
msgid "Contains"
-msgstr "Contiene"
-
-#. module: stock
-#: view:board.board:0
-msgid "Incoming Products Delay"
-msgstr "Retraso albaranes entrada"
+msgstr ""
#. module: stock
#: view:stock.location:0
msgid "Stock Locations"
-msgstr "Ubicaciones stock"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
-#: field:stock.move,price_unit:0
-msgid "Unit Price"
-msgstr "Precio un."
+#: view:report.stock.move:0
+msgid "Incoming"
+msgstr ""
#. module: stock
-#: model:ir.model,name:stock.model_stock_move_split_lines_exist
-msgid "Exist Split lines"
-msgstr "Dividir líneas existentes"
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: field:stock.move,price_unit:0
+msgid "Unit Price"
+msgstr ""
#. module: stock
#: field:stock.move,date_expected:0
msgid "Scheduled Date"
-msgstr "Fecha prevista"
+msgstr ""
#. module: stock
#: view:stock.tracking:0
msgid "Pack Search"
-msgstr "Buscar paquete"
+msgstr ""
#. module: stock
-#: selection:stock.move,priority:0
-msgid "Urgent"
-msgstr "Urgente"
+#: view:stock.picking:0
+msgid "Pickings already processed"
+msgstr ""
#. module: stock
-#: view:stock.picking:0
-#: report:stock.picking.list:0
+#: field:stock.partial.move.line,currency:0
+#: field:stock.partial.picking.line,currency:0
+msgid "Currency"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0 report:stock.picking.list:0
msgid "Journal"
-msgstr "Diario"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1315
+#: code:addons/stock/stock.py:1345
#, python-format
msgid "is scheduled %s."
msgstr ""
@@ -910,24 +935,26 @@ msgid ""
"needed.Set a location if you produce at a fixed location. This can be a "
"partner location if you subcontract the manufacturing operations."
msgstr ""
-"Déjelo vacío si produce en la ubicación donde los productos terminados son "
-"necesarios. Indique un lugar si produce en una ubicación fija. Esto puede "
-"ser una ubicación de empresa si subcontrata las operaciones de fabricación."
#. module: stock
#: view:res.partner:0
msgid "Inventory Properties"
-msgstr "Propiedades inventario"
+msgstr ""
#. module: stock
#: field:report.stock.move,day_diff:0
msgid "Execution Lead Time (Days)"
-msgstr "Tiempo inicial de ejecución (días)"
+msgstr ""
+
+#. module: stock
+#: model:ir.model,name:stock.model_stock_partial_move
+msgid "Partial Move Processing Wizard"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.act_stock_product_location_open
msgid "Stock by Location"
-msgstr "Existencias por ubicacion"
+msgstr ""
#. module: stock
#: help:stock.move,address_id:0
@@ -935,113 +962,88 @@ msgid ""
"Optional address where goods are to be delivered, specifically used for "
"allotment"
msgstr ""
-"Dirección opcional cuando las mercancías deben ser entregadas, utilizado "
-"específicamente para lotes."
#. module: stock
-#: view:report.stock.move:0
+#: view:report.stock.inventory:0 view:report.stock.move:0
msgid "Month-1"
-msgstr "Mes-1"
+msgstr ""
#. module: stock
#: help:stock.location,active:0
msgid ""
"By unchecking the active field, you may hide a location without deleting it."
msgstr ""
-"Si el campo activo se desmarca, permite ocultar la ubicación sin eliminarla."
#. module: stock
-#: model:ir.actions.report.xml,name:stock.report_picking_list
-msgid "Packing list"
-msgstr "Albarán"
+#: code:addons/stock/wizard/stock_inventory_merge.py:44
+#, python-format
+msgid ""
+"Please select multiple physical inventories to merge in the list view."
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Confirmed Pickings"
+msgstr ""
#. module: stock
#: field:stock.location,stock_virtual:0
msgid "Virtual Stock"
-msgstr "Stock virtual"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: selection:stock.location,usage:0
msgid "View"
-msgstr "Vista"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.inventory:0 view:report.stock.move:0
+msgid "Last month"
+msgstr ""
#. module: stock
#: field:stock.location,parent_left:0
msgid "Left Parent"
-msgstr "Padre izquierdo"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:132
-#, python-format
-msgid "Delivery Information"
-msgstr "Información de envío"
+#: field:product.category,property_stock_valuation_account_id:0
+msgid "Stock Valuation Account"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_fill_inventory.py:48
+#: code:addons/stock/stock.py:1349
#, python-format
-msgid "Stock Inventory is done"
-msgstr "Inventario de stock realizado"
+msgid "is waiting."
+msgstr ""
#. module: stock
#: constraint:product.product:0
msgid "Error: Invalid ean code"
-msgstr "Error: Código EAN no válido"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:148
+#: code:addons/stock/product.py:147
#, python-format
msgid ""
"There is no stock output account defined for this product: \"%s\" (id: %d)"
msgstr ""
-"No se ha definido una cuenta de salida de stock para este producto: \"%s\" "
-"(id: %d)"
#. module: stock
#: field:product.template,property_stock_production:0
msgid "Production Location"
-msgstr "Ubicación de producción"
+msgstr ""
#. module: stock
#: help:stock.picking,address_id:0
msgid "Address of partner"
-msgstr "Dirección de la empresa."
+msgstr ""
#. module: stock
-#: model:res.company,overdue_msg:stock.res_company_shop0
-#: model:res.company,overdue_msg:stock.res_company_tinyshop0
-msgid ""
-"\n"
-"Date: %(date)s\n"
-"\n"
-"Dear %(partner_name)s,\n"
-"\n"
-"Please find in attachment a reminder of all your unpaid invoices, for a "
-"total amount due of:\n"
-"\n"
-"%(followup_amount).2f %(company_currency)s\n"
-"\n"
-"Thanks,\n"
-"--\n"
-"%(user_signature)s\n"
-"%(company_name)s\n"
-" "
-msgstr ""
-"\n"
-"Fecha: %(date)s\n"
-"\n"
-"Estimado %(partner_name)s,\n"
-"\n"
-"En el adjunto encontrará un recordatorio de todas las facturas no pagadas, "
-"por un importe total de:\n"
-"\n"
-"%(followup_amount).2f %(company_currency)s\n"
-"\n"
-"Gracias,\n"
-"--\n"
-"%(user_signature)s\n"
-"%(company_name)s\n"
-" "
+#: field:report.stock.lines.date,date:0
+msgid "Latest Inventory Date"
+msgstr ""
#. module: stock
#: help:stock.location,usage:0
@@ -1070,91 +1072,76 @@ msgid ""
"location consumes the raw material and produces finished products\n"
" "
msgstr ""
-"* Ubicación proveedor: Ubicación virtual que representa la ubicación de "
-"origen para los productos procedentes de sus proveedores.\n"
-"\n"
-"* Vista: Ubicación virtual para crear una estructura jerárquica de su "
-"almacén, agregando sus ubicaciones hijas. No puede contener los productos "
-"directamente.\n"
-"\n"
-"* Ubicación interna: Ubicación física dentro de su propios almacenes.\n"
-"\n"
-"* Ubicación cliente: Ubicación virtual que representa la ubicación de "
-"destino para los productos enviados a sus clientes.\n"
-"\n"
-"* Inventario: Ubicación virtual que actúa como contrapartida de las "
-"operaciones de inventario utilizadas para corregir los niveles de "
-"existencias (inventarios físicos).\n"
-"\n"
-"* Abastecimiento: Ubicación virtual que actúa como contrapartida temporal de "
-"las operaciones de abastecimiento cuando el origen (proveedor o producción) "
-"no se conoce todavía. Esta ubicación debe estar vacía cuando el planificador "
-"de abastecimientos haya terminado de ejecutarse.\n"
-"\n"
-"* Producción: Ubicación virtual de contrapartida para operaciones de "
-"producción: esta ubicación consume la materia prima y produce los productos "
-"terminados.\n"
-" "
#. module: stock
#: field:stock.production.lot.revision,author_id:0
msgid "Author"
-msgstr "Autor"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1302
+#: code:addons/stock/stock.py:1332
#, python-format
msgid "Delivery Order"
-msgstr "Albarán de salida"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_move_memory_in
-msgid "stock.move.memory.in"
-msgstr "stock.movimiento.memoria.entrada"
+msgstr ""
#. module: stock
#: selection:stock.location,chained_auto_packing:0
msgid "Manual Operation"
-msgstr "Operación manual"
+msgstr ""
#. module: stock
-#: view:stock.location:0
-#: view:stock.move:0
+#: view:stock.location:0 view:stock.move:0
msgid "Supplier"
-msgstr "Proveedor"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/stock.py:2727
+#, python-format
+msgid ""
+"In order to cancel this inventory, you must first unpost related journal "
+"entries."
+msgstr ""
#. module: stock
#: field:stock.picking,date_done:0
msgid "Date Done"
-msgstr "Fecha realizado"
+msgstr ""
#. module: stock
-#: report:stock.picking.list:0
-msgid "Expected Shipping Date"
-msgstr "Fecha de envío prevista"
+#: code:addons/stock/wizard/stock_partial_picking.py:148
+#, python-format
+msgid ""
+"The uom rounding does not allow you to ship \"%s %s\", only roundings of "
+"\"%s %s\" is accepted by the uom."
+msgstr ""
#. module: stock
-#: selection:stock.move,state:0
-msgid "Not Available"
-msgstr "No disponible"
+#: view:stock.move:0
+msgid "Stock moves that are Available (Ready to process)"
+msgstr ""
+
+#. module: stock
+#: report:stock.picking.list:0
+msgid "Expected Shipping Date"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "March"
-msgstr "Marzo"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_stock_inventory_line_split
#: model:ir.model,name:stock.model_stock_inventory_line_split
-#: view:stock.inventory:0
-#: view:stock.inventory.line:0
+#: view:stock.inventory:0 view:stock.inventory.line:0
msgid "Split inventory lines"
-msgstr "Dividir líneas de inventario"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Physical Inventory"
-msgstr "Inventario físico"
+msgstr ""
#. module: stock
#: help:stock.location,chained_company_id:0
@@ -1162,9 +1149,6 @@ msgid ""
"The company the Picking List containing the chained move will belong to "
"(leave empty to use the default company determination rules"
msgstr ""
-"La compañía a la que pertenece el albarán que contiene el movimiento "
-"encadenado (dejarlo vacío para utilizar las reglas por defecto para "
-"determinar la compañía)."
#. module: stock
#: help:stock.location,chained_picking_type:0
@@ -1173,53 +1157,53 @@ msgid ""
"empty to automatically detect the type based on the source and destination "
"locations)."
msgstr ""
-"Tipo de envío del albarán que va a contener el movimiento encadenado (dejar "
-"vacío para detectar automáticamente el tipo basado en las ubicaciones de "
-"origen y destino)."
#. module: stock
#: view:stock.move.split:0
msgid "Lot number"
-msgstr "Número de lote"
+msgstr ""
#. module: stock
#: field:stock.inventory.line,product_uom:0
-#: field:stock.move.consume,product_uom:0
-#: field:stock.move.scrap,product_uom:0
+#: field:stock.move.consume,product_uom:0 field:stock.move.scrap,product_uom:0
msgid "Product UOM"
-msgstr "UdM del producto"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_locations_partner
msgid "Partner Locations"
-msgstr "Ubicaciones de empresas"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: view:report.stock.move:0
+#: view:report.stock.inventory:0 view:report.stock.move:0
+msgid "Current year"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.inventory:0 view:report.stock.move:0
msgid "Total quantity"
-msgstr "Cantidad total"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.move_consume
#: view:stock.move.consume:0
msgid "Consume Move"
-msgstr "Movimiento consumo"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_7
msgid "European Customers"
-msgstr "Clientes europeos"
+msgstr ""
#. module: stock
#: help:stock.location,chained_delay:0
msgid "Delay between original move and chained move in days"
-msgstr "Retraso entre movimiento original y movimiento encadenado en días."
+msgstr ""
#. module: stock
#: view:stock.fill.inventory:0
msgid "Import current product inventory from the following location"
-msgstr "Importar inventario de productos actual para la siguiente ubicación"
+msgstr ""
#. module: stock
#: help:stock.location,chained_auto_packing:0
@@ -1230,17 +1214,21 @@ msgid ""
"move has to be validated by a worker. With 'Automatic No Step Added', the "
"location is replaced in the original move."
msgstr ""
-"Se utiliza sólo si selecciona un tipo de ubicación encadenada.\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 'Mov. "
-"automático, paso no añadido', la ubicación se reemplaza en el movimiento "
-"original."
#. module: stock
-#: view:stock.production.lot:0
-msgid "Downstream Traceability"
-msgstr "Trazabilidad hacia abajo"
+#: view:stock.tracking:0
+msgid "Pack Identification"
+msgstr ""
+
+#. module: stock
+#: report:stock.picking.list:0
+msgid "Packing List:"
+msgstr ""
+
+#. module: stock
+#: selection:stock.move,state:0
+msgid "Waiting Another Move"
+msgstr ""
#. module: stock
#: help:product.template,property_stock_production:0
@@ -1249,25 +1237,24 @@ msgid ""
"default one, as the source location for stock moves generated by production "
"orders"
msgstr ""
-"Para los productos actuales, esta ubicación de stock se utilizará, en lugar "
-"de la de por defecto, como la ubicación de origen para los movimientos de "
-"stock generados por las órdenes de producción."
#. module: stock
-#: code:addons/stock/stock.py:2006
-#, python-format
+#: view:product.product:0
+msgid "Expected Stock Variations"
+msgstr ""
+
+#. module: stock
+#: help:stock.move,price_unit:0
msgid ""
-"Can not create Journal Entry, Output Account defined on this product and "
-"Variant account on category of this product are same."
+"Technical field used to record the product cost set by the user during a "
+"picking confirmation (when average price costing method is used)"
msgstr ""
-"No se puede crear el asiento, la cuenta de salida definida en este producto "
-"y la cuenta variante de la categoría de producto son la misma."
#. module: stock
-#: code:addons/stock/stock.py:1319
+#: code:addons/stock/stock.py:1350
#, python-format
msgid "is in draft state."
-msgstr "está en estado borrador."
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_tracking_form
@@ -1275,242 +1262,228 @@ msgid ""
"This is the list of all your packs. When you select a Pack, you can get the "
"upstream or downstream traceability of the products contained in the pack."
msgstr ""
-"Esta es la lista de todos sus albaranes. Cuando selecciona un albarán, puede "
-"obtener la trazabilidad hacia arriba o hacia abajo de los productos que "
-"forman este paquete."
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_ups_final
-msgid "Stock ups final"
-msgstr "Stock ups final"
#. module: stock
-#: field:stock.location,chained_auto_packing:0
-msgid "Chaining Type"
-msgstr "Tipo encadenado"
-
-#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:126
-#, python-format
+#: selection:stock.return.picking,invoice_state:0
msgid "To be refunded/invoiced"
-msgstr "Para ser abonado/facturado"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_shop0
msgid "Shop 1"
-msgstr "Tienda 1"
+msgstr ""
#. module: stock
-#: view:stock.change.product.qty:0
-#: view:stock.change.standard.price:0
-#: view:stock.fill.inventory:0
-#: view:stock.inventory.merge:0
-#: view:stock.invoice.onshipping:0
-#: view:stock.location.product:0
-#: view:stock.move:0
-#: view:stock.move.track:0
-#: view:stock.picking:0
-#: view:stock.split.into:0
+#: view:stock.change.product.qty:0 view:stock.change.standard.price:0
+#: view:stock.fill.inventory:0 view:stock.inventory.merge:0
+#: view:stock.invoice.onshipping:0 view:stock.location.product:0
+#: view:stock.move:0 view:stock.partial.move:0 view:stock.partial.picking:0
+#: view:stock.picking:0 view:stock.return.picking:0 view:stock.split.into:0
msgid "_Cancel"
-msgstr "_Cancelar"
+msgstr ""
#. module: stock
-#: view:stock.move:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Ready"
-msgstr "Preparado"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Calendar View"
-msgstr "Vista calendario"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Additional Info"
-msgstr "Información adicional"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1619
-#, python-format
-msgid "Operation forbidden"
-msgstr "Operación prohibida"
+#: field:stock.partial.move.line,move_id:0
+#: field:stock.partial.picking.line,move_id:0
+#: field:stock.return.picking.memory,move_id:0
+msgid "Move"
+msgstr ""
#. module: stock
#: field:stock.location.product,from_date:0
msgid "From"
-msgstr "Desde"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:77
+#: view:stock.picking:0
+msgid "Incoming Shipments already processed"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/wizard/stock_return_picking.py:99
#, python-format
msgid "You may only return pickings that are Confirmed, Available or Done!"
msgstr ""
-"¡Sólo puede devolver albaranes que estén confirmados, reservados o "
-"realizados!"
#. module: stock
-#: view:stock.picking:0
-#: field:stock.picking,invoice_state:0
+#: view:stock.picking:0 field:stock.picking,invoice_state:0
msgid "Invoice Control"
-msgstr "Control factura"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_production_lot_revision
msgid "Production lot revisions"
-msgstr "Revisiones de lote de producción"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Internal Picking List"
-msgstr "Albarán interno"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0
-#: selection:stock.move,state:0
-#: selection:stock.picking,state:0
+#: selection:report.stock.move,state:0 view:stock.picking:0
msgid "Waiting"
-msgstr "En espera"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: selection:stock.move.split.lines,action:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Split"
-msgstr "Dividir"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Search Stock Picking"
-msgstr "Buscar albarán stock"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:93
+#: code:addons/stock/product.py:92
#, python-format
msgid "Company is not specified in Location"
-msgstr "No se ha especificado una compañía en la ubicación"
+msgstr ""
#. module: stock
#: view:report.stock.move:0
-#: field:stock.partial.move,type:0
msgid "Type"
-msgstr "Tipo"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Available Pickings"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_5
msgid "Generic IT Suppliers"
-msgstr "Proveedores TI genéricos"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0
+msgid "Stock to be receive"
+msgstr ""
+
+#. module: stock
+#: help:stock.location,valuation_out_account_id:0
+msgid ""
+"Used for real-time inventory valuation. When set on a virtual location (non "
+"internal type), this account will be used to hold the value of products "
+"being moved out of this location and into an internal location, instead of "
+"the generic Stock Output Account set on the product. This has no effect for "
+"internal locations."
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Picking List:"
-msgstr "Albarán:"
+msgstr ""
#. module: stock
-#: field:stock.inventory,date:0
-#: field:stock.move,create_date:0
-#: field:stock.production.lot,date:0
-#: field:stock.tracking,date:0
+#: field:stock.inventory,date:0 field:stock.move,create_date:0
+#: field:stock.production.lot,date:0 field:stock.tracking,date:0
msgid "Creation Date"
-msgstr "Fecha creación"
+msgstr ""
#. module: stock
#: field:report.stock.lines.date,id:0
msgid "Inventory Line Id"
-msgstr "Id línea de inventario"
+msgstr ""
#. module: stock
#: help:stock.location,address_id:0
msgid "Address of customer or supplier."
-msgstr "Dirección del cliente o proveedor."
+msgstr ""
#. module: stock
-#: view:report.stock.move:0
-#: field:report.stock.move,picking_id:0
+#: view:report.stock.move:0 field:report.stock.move,picking_id:0
msgid "Packing"
-msgstr "Albarán"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: field:res.partner,property_stock_customer:0
#: selection:stock.location,usage:0
msgid "Customer Location"
-msgstr "Ubicación del cliente"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:85
+#: code:addons/stock/stock.py:2312
#, python-format
-msgid "Invalid action !"
-msgstr "¡Acción no válida!"
+msgid "You can only delete draft moves."
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:139
-#, python-format
-msgid "Receive Information"
-msgstr "Información de recepción"
+#: model:ir.model,name:stock.model_stock_inventory_line_split_lines
+msgid "Inventory Split lines"
+msgstr ""
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_location_overview
#: report:lot.stock.overview:0
msgid "Location Inventory Overview"
-msgstr "Resumen inventario ubicación"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_replacement
-msgid "Stock Replacement"
-msgstr "Reemplazo stock"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "General Informations"
-msgstr "Información general"
+msgstr ""
#. module: stock
-#: selection:stock.location,chained_location_type:0
-msgid "None"
-msgstr "Ninguno"
+#: view:report.stock.inventory:0
+msgid "Analysis including future moves (similar to virtual stock)"
+msgstr ""
#. module: stock
-#: model:ir.actions.act_window,name:stock.action3
-#: view:stock.tracking:0
+#: model:ir.actions.act_window,name:stock.action3 view:stock.tracking:0
msgid "Downstream traceability"
-msgstr "Trazabilidad hacia abajo"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_invoice_onshipping.py:101
+#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#, python-format
msgid "No Invoices were created"
-msgstr "No se han creado facturas"
-
-#. module: stock
-#: model:stock.location,name:stock.stock_location_company
-msgid "OpenERP S.A."
-msgstr "OpenERP S.A."
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:140
-#, python-format
-msgid "Receive"
-msgstr "Recibir"
+#: field:stock.location,posy:0
+msgid "Shelves (Y)"
+msgstr ""
#. module: stock
#: help:stock.incoterms,active:0
msgid ""
"By unchecking the active field, you may hide an INCOTERM without deleting it."
msgstr ""
-"Si el campo activo se desmarca, permite ocultar un INCOTERM sin eliminarlo."
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
-#: field:stock.picking,date:0
+#: view:stock.move:0 view:stock.picking:0 field:stock.picking,date:0
msgid "Order Date"
-msgstr "Fecha orden"
+msgstr ""
#. module: stock
-#: field:stock.location,location_id:0
+#: code:addons/stock/wizard/stock_change_product_qty.py:88
+#, python-format
+msgid "INV: %s"
+msgstr ""
+
+#. module: stock
+#: view:stock.location:0 field:stock.location,location_id:0
msgid "Parent Location"
-msgstr "Ubicación padre"
+msgstr ""
#. module: stock
#: help:stock.picking,state:0
@@ -1523,44 +1496,34 @@ msgid ""
"* Done: has been processed, can't be modified or cancelled anymore\n"
"* Cancelled: has been cancelled, can't be confirmed anymore"
msgstr ""
-"* Borrador: No se ha confirmado todavía y no se planificará hasta que se "
-"confirme.\n"
-"* Confirmado: A la espera de la disponibilidad de productos.\n"
-"* Reservado: Productos reservados, esperando la confirmación del envío.\n"
-"* En espera: Esperando que otro movimiento se realice antes de que sea "
-"disponible de forma automática (por ejemplo, en flujos "
-"Obtener_bajo_pedido).\n"
-"* Realizado: Ha sido procesado, no se puede modificar o cancelar nunca más.\n"
-"* Cancelado: Se ha cancelado, no se puede confirmar nunca más."
#. module: stock
#: help:stock.location,company_id:0
msgid "Let this field empty if this location is shared between all companies"
msgstr ""
-"Deje este campo vacío si esta ubicación está compartida entre todas las "
-"compañías."
#. module: stock
-#: code:addons/stock/stock.py:2233
+#: code:addons/stock/stock.py:2337
#, python-format
msgid "Please provide a positive quantity to scrap!"
-msgstr "¡Introduzca una cantidad positiva a desechar!"
+msgstr ""
#. module: stock
#: field:stock.location,chained_delay:0
msgid "Chaining Lead Time"
-msgstr "Tiempo inicial encadenado"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:85
-#, python-format
-msgid "Cannot deliver products which are already delivered !"
-msgstr "¡No se pueden enviar productos que ya están enviados!"
+#: help:product.product,track_outgoing:0
+msgid ""
+"Forces to specify a Production Lot for all moves containing this product and "
+"going to a Customer Location"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_invoice_onshipping
msgid "Stock Invoice Onshipping"
-msgstr "Stock factura en el envío"
+msgstr ""
#. module: stock
#: help:stock.move,state:0
@@ -1572,36 +1535,31 @@ msgid ""
" When the picking is done the state is 'Done'. \n"
"The state is 'Waiting' if the move is waiting for another one."
msgstr ""
-"Cuando se crea un movimiento de stock está en estado 'Borrador'.\n"
-" Después se establece en estado 'No disponible' si el planificador no ha "
-"encontrado los productos.\n"
-" Cuando los productos están reservados se establece como 'Reservado'.\n"
-" Cuando el albarán se envía el estado es 'Realizado'. \n"
-"El estado es 'En espera' si el movimiento está a la espera de otro."
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: field:res.partner,property_stock_supplier:0
#: selection:stock.location,usage:0
msgid "Supplier Location"
-msgstr "Ubicación del proveedor"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2254
+#: code:addons/stock/stock.py:2358
#, python-format
msgid "were scrapped"
-msgstr "estaban desechados"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
-msgid "Partial"
-msgstr "Parcial"
+#: help:stock.partial.move.line,currency:0
+#: help:stock.partial.picking.line,currency:0
+msgid "Currency in which Unit cost is expressed"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "September"
-msgstr "Septiembre"
+msgstr ""
#. module: stock
#: help:stock.picking,backorder_id:0
@@ -1609,283 +1567,271 @@ msgid ""
"If this picking was split this field links to the picking that contains the "
"other part that has been processed already."
msgstr ""
-"Si este albarán se dividió, este campo enlaza con el albarán que contiene la "
-"otra parte que ya ha sido procesada."
#. module: stock
#: model:ir.model,name:stock.model_report_stock_inventory
msgid "Stock Statistics"
-msgstr "Estadísticas de stock"
+msgstr ""
#. module: stock
-#: field:stock.move.memory.in,currency:0
-#: field:stock.move.memory.out,currency:0
-msgid "Currency"
-msgstr "Moneda"
+#: view:report.stock.move:0
+msgid "Month Planned"
+msgstr ""
#. module: stock
#: field:product.product,track_production:0
msgid "Track Manufacturing Lots"
-msgstr "Lotes seguimiento de fabricación"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_inventory_merge.py:44
-#, python-format
-msgid ""
-"Please select multiple physical inventories to merge in the list view."
+#: view:stock.picking:0
+msgid "Is a Back Order"
+msgstr ""
+
+#. module: stock
+#: field:stock.location,valuation_out_account_id:0
+msgid "Stock Valuation Account (Outgoing)"
msgstr ""
-"Seleccione varios inventarios físicos para fusionar en la vista lista."
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_open
#: model:ir.actions.act_window,name:stock.action_move_form2
-#: model:ir.ui.menu,name:stock.menu_action_move_form2
-#: view:stock.inventory:0
-#: view:stock.move:0
-#: view:stock.picking:0
-#: view:stock.production.lot:0
+#: model:ir.ui.menu,name:stock.menu_action_move_form2 view:stock.inventory:0
+#: view:stock.move:0 view:stock.picking:0 view:stock.production.lot:0
#: view:stock.tracking:0
msgid "Stock Moves"
-msgstr "Movimientos de stock"
+msgstr ""
#. module: stock
#: selection:report.stock.move,type:0
#: selection:stock.location,chained_picking_type:0
#: selection:stock.picking,type:0
msgid "Sending Goods"
-msgstr "Envío mercancías"
+msgstr ""
+
+#. module: stock
+#: model:ir.ui.menu,name:stock.menu_product_category_config_stock
+msgid "Product Categories"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Cancel Availability"
-msgstr "Cancelar disponibilidad"
+msgstr ""
#. module: stock
#: help:stock.move,date_expected:0
msgid "Scheduled date for the processing of this move"
-msgstr "Fecha planificada para el procesado de este movimiento."
+msgstr ""
#. module: stock
#: field:stock.inventory,move_ids:0
msgid "Created Moves"
-msgstr "Movimientos creados"
+msgstr ""
+
+#. module: stock
+#: field:stock.location,valuation_in_account_id:0
+msgid "Stock Valuation Account (Incoming)"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_14
msgid "Shelf 2"
-msgstr "Estante 2"
+msgstr ""
#. module: stock
#: field:stock.report.tracklots,tracking_id:0
msgid "Tracking lot"
-msgstr "Lote seguimiento"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Back Orders"
-msgstr "Albaranes pendientes"
+msgstr ""
#. module: stock
-#: view:product.product:0
-#: view:product.template:0
+#: view:product.product:0 view:product.template:0
msgid "Counter-Part Locations Properties"
-msgstr "Propiedades de las ubicaciones parte recíproca"
+msgstr ""
#. module: stock
#: view:stock.location:0
msgid "Localization"
-msgstr "Ubicación"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_report_tracklots
-msgid "Stock report by tracking lots"
-msgstr "Informe de stock por lotes de seguimiento"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:370
+#: code:addons/stock/product.py:429
#, python-format
msgid "Delivered Qty"
-msgstr "Ctdad enviada"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.track_line
-#: view:stock.inventory.line.split:0
-#: view:stock.move.split:0
+#: view:stock.inventory.line.split:0 view:stock.move.split:0
msgid "Split in lots"
-msgstr "Dividir en lotes"
+msgstr ""
#. module: stock
#: view:stock.move.split:0
msgid "Production Lot Numbers"
-msgstr "Números lote de producción"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: field:report.stock.inventory,date:0
-#: field:report.stock.move,date:0
-#: view:stock.inventory:0
-#: report:stock.inventory.move:0
-#: view:stock.move:0
-#: field:stock.move,date:0
-#: field:stock.partial.move,date:0
-#: field:stock.partial.picking,date:0
-#: view:stock.picking:0
-msgid "Date"
-msgstr "Fecha"
+#: help:product.template,property_stock_account_output:0
+msgid ""
+"When doing real-time inventory valuation, counterpart journal items for all "
+"outgoing stock moves will be posted in this account, unless there is a "
+"specific valuation account set on the destination location. When not set on "
+"the product, the one from the product category is used."
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
#: view:report.stock.move:0
-#: view:stock.move:0
+msgid "Day Planned"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.inventory:0 field:report.stock.inventory,date:0
+#: field:report.stock.move,date:0 view:stock.inventory:0
+#: report:stock.inventory.move:0 view:stock.move:0 field:stock.move,date:0
+#: field:stock.partial.move,date:0 field:stock.partial.picking,date:0
#: view:stock.picking:0
+msgid "Date"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.inventory:0 view:report.stock.move:0
msgid "Extended Filters..."
-msgstr "Filtros extendidos..."
+msgstr ""
#. module: stock
#: field:stock.warehouse,lot_stock_id:0
msgid "Location Stock"
-msgstr "Ubicación stock"
+msgstr ""
#. module: stock
#: code:addons/stock/wizard/stock_inventory_merge.py:64
#, python-format
msgid "Merging is only allowed on draft inventories."
-msgstr "La fusión sólo es permitida en inventarios borrador."
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_dashboard_stock
msgid "Dashboard"
-msgstr "Tablero"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_move_track
-msgid "Track moves"
-msgstr "Movimientos seguimiento"
+msgstr ""
#. module: stock
#: field:stock.incoterms,code:0
msgid "Code"
-msgstr "Código"
+msgstr ""
#. module: stock
#: view:stock.inventory.line.split:0
msgid "Lots Number"
-msgstr "Número lotes"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.open_board_warehouse
#: model:ir.ui.menu,name:stock.menu_board_warehouse
msgid "Warehouse Dashboard"
-msgstr "Tablero almacén"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:512
+#: code:addons/stock/stock.py:513
#, python-format
msgid "You can not remove a lot line !"
-msgstr "¡No puede eliminar una línea de lote!"
+msgstr ""
#. module: stock
-#: model:ir.model,name:stock.model_stock_move_scrap
-#: view:stock.move:0
-#: view:stock.move.scrap:0
-#: view:stock.picking:0
+#: model:ir.model,name:stock.model_stock_move_scrap view:stock.move:0
+#: view:stock.move.scrap:0 view:stock.picking:0
msgid "Scrap Products"
-msgstr "Desechar productos"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1128
+#: code:addons/stock/stock.py:1157
#, python-format
msgid "You cannot remove the picking which is in %s state !"
-msgstr "¡No puede eliminar el albarán que está en estado %s!"
+msgstr ""
#. module: stock
-#: view:stock.inventory.line.split:0
-#: view:stock.move.consume:0
-#: view:stock.move.scrap:0
-#: view:stock.move.split:0
-#: view:stock.picking:0
+#: view:stock.inventory.line.split:0 view:stock.move.consume:0
+#: view:stock.move.scrap:0 view:stock.move.split:0 view:stock.picking:0
msgid "Cancel"
-msgstr "Cancelar"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.act_stock_return_picking
#: model:ir.model,name:stock.model_stock_return_picking
msgid "Return Picking"
-msgstr "Devolver albarán"
+msgstr ""
#. module: stock
-#: view:stock.inventory:0
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.inventory:0 view:stock.move:0 view:stock.picking:0
msgid "Split in production lots"
-msgstr "Dividir en lotes de producción"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_location
-#: view:report.stock.inventory:0
+#: field:product.product,location_id:0 view:report.stock.inventory:0
#: field:report.stock.inventory,location_id:0
#: field:stock.change.product.qty,location_id:0
#: field:stock.fill.inventory,location_id:0
-#: field:stock.inventory.line,location_id:0
-#: report:stock.inventory.move:0
-#: view:stock.location:0
-#: view:stock.move:0
-#: field:stock.move.consume,location_id:0
-#: field:stock.move.scrap,location_id:0
-#: field:stock.picking,location_id:0
-#: report:stock.picking.list:0
+#: field:stock.inventory.line,location_id:0 report:stock.inventory.move:0
+#: view:stock.location:0 view:stock.move:0
+#: field:stock.move.consume,location_id:0 field:stock.move.scrap,location_id:0
+#: field:stock.partial.move.line,location_id:0
+#: field:stock.partial.picking.line,location_id:0
+#: field:stock.picking,location_id:0 report:stock.picking.list:0
#: field:stock.report.prodlots,location_id:0
#: field:stock.report.tracklots,location_id:0
msgid "Location"
-msgstr "Ubicación"
+msgstr ""
#. module: stock
#: view:product.template:0
msgid "Information"
-msgstr "Información"
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Shipping Address :"
-msgstr "Dirección de envío:"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:115
-#, python-format
-msgid "Provide the quantities of the returned products."
-msgstr "Indique las cantidades de los productos devueltos."
+#: help:stock.location,valuation_in_account_id:0
+msgid ""
+"Used for real-time inventory valuation. When set on a virtual location (non "
+"internal type), this account will be used to hold the value of products "
+"being moved from an internal location into this location, instead of the "
+"generic Stock Output Account set on the product. This has no effect for "
+"internal locations."
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2009
-#, python-format
-msgid ""
-"Can not create Journal Entry, Input Account defined on this product and "
-"Variant account on category of this product are same."
+#: view:stock.return.picking:0
+msgid "Provide the quantities of the returned products."
msgstr ""
-"No se puede crear el asiento, la cuenta de entrada definido en este producto "
-"y la cuenta variante en la categoría del producto son la misma."
#. module: stock
#: view:stock.change.standard.price:0
msgid "Cost Price"
-msgstr "Precio coste"
+msgstr ""
#. module: stock
-#: view:product.product:0
-#: field:product.product,valuation:0
+#: view:product.product:0 field:product.product,valuation:0
msgid "Inventory Valuation"
-msgstr "Valoración inventario"
+msgstr ""
#. module: stock
-#: view:stock.picking:0
-msgid "Create Invoice"
-msgstr "Crear factura"
+#: view:stock.move:0
+msgid "Orders planned for today"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Process Later"
-msgstr "Procesar más tarde"
+msgstr ""
#. module: stock
#: help:res.partner,property_stock_supplier:0
@@ -1893,24 +1839,11 @@ msgid ""
"This stock location will be used, instead of the default one, as the source "
"location for goods you receive from the current partner"
msgstr ""
-"Esta ubicación de stock será utilizada, en lugar de la ubicación por "
-"defecto, como la ubicación de origen para recibir mercancías desde esta "
-"empresa"
#. module: stock
#: field:stock.warehouse,partner_address_id:0
msgid "Owner Address"
-msgstr "Dirección propietario"
-
-#. module: stock
-#: help:stock.move,price_unit:0
-msgid ""
-"Technical field used to record the product cost set by the user during a "
-"picking confirmation (when average price costing method is used)"
msgstr ""
-"Campo técnico utilizado para registrar el coste del producto indicado por el "
-"usuario durante una confirmación de albarán (cuando se utiliza el método del "
-"precio medio de coste)."
#. module: stock
#: model:ir.actions.act_window,help:stock.action_stock_move_report
@@ -1919,51 +1852,58 @@ msgid ""
"moves. Use this report when you want to analyse the different routes taken "
"by your products and inventory management performance."
msgstr ""
-"El análisis de movimientos le permite analizar y verificar fácilmente los "
-"movimientos de stock de su compañía. Utilice este informe cuando quiera "
-"analizar las diferentes rutas tomadas por sus productos y el rendimiento de "
-"la gestión de su inventario."
+
+#. module: stock
+#: code:addons/stock/stock.py:2116
+#, python-format
+msgid ""
+"Can not create Journal Entry, Output Account defined on this product and "
+"Valuation account on category of this product are same."
+msgstr ""
#. module: stock
#: field:report.stock.move,day_diff1:0
msgid "Planned Lead Time (Days)"
-msgstr "Tiempo inicial planificado (días)"
+msgstr ""
#. module: stock
#: field:stock.change.standard.price,new_price:0
msgid "Price"
-msgstr "Precio"
+msgstr ""
+
+#. module: stock
+#: model:ir.model,name:stock.model_stock_return_picking_memory
+msgid "stock.return.picking.memory"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Search Inventory"
-msgstr "Buscar inventario"
+msgstr ""
#. module: stock
-#: field:stock.move.track,quantity:0
-msgid "Quantity per lot"
-msgstr "Cantidad por lote"
+#: model:ir.model,name:stock.model_stock_report_tracklots
+msgid "Stock report by tracking lots"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2012
+#: code:addons/stock/stock.py:2122
#, python-format
msgid ""
"There is no stock input account defined for this product or its category: "
"\"%s\" (id: %d)"
msgstr ""
-"No se ha definido una cuenta de entrada de stock para este producto o su "
-"categoría: \"%s\" (id: %d)"
#. module: stock
-#: code:addons/stock/product.py:360
+#: code:addons/stock/product.py:419
#, python-format
msgid "Received Qty"
-msgstr "Ctdad recibida"
+msgstr ""
#. module: stock
#: field:stock.production.lot,ref:0
msgid "Internal Reference"
-msgstr "Referencia interna"
+msgstr ""
#. module: stock
#: help:stock.production.lot,prefix:0
@@ -1971,73 +1911,32 @@ msgid ""
"Optional prefix to prepend when displaying this serial number: PREFIX/SERIAL "
"[INT_REF]"
msgstr ""
-"Prefijo opcional a añadir cuando se muestre el número de serie: "
-"PREFIJO/SERIE [REF_INT]"
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_stock_fill_inventory
#: model:ir.model,name:stock.model_stock_fill_inventory
#: view:stock.fill.inventory:0
msgid "Import Inventory"
-msgstr "Importar inventario"
+msgstr ""
#. module: stock
-#: field:stock.incoterms,name:0
-#: field:stock.move,name:0
+#: field:stock.incoterms,name:0 field:stock.move,name:0
#: field:stock.warehouse,name:0
msgid "Name"
-msgstr "Nombre"
+msgstr ""
#. module: stock
#: view:product.product:0
msgid "Stocks"
-msgstr "Stocks"
+msgstr ""
#. module: stock
-#: model:ir.module.module,description:stock.module_meta_information
+#: help:stock.partial.move,hide_tracking:0
+#: help:stock.partial.picking,hide_tracking:0
msgid ""
-"OpenERP Inventory Management module can manage multi-warehouses, multi and "
-"structured stock locations.\n"
-"Thanks to the double entry management, the inventory controlling is powerful "
-"and flexible:\n"
-"* Moves history and planning,\n"
-"* Different inventory methods (FIFO, LIFO, ...)\n"
-"* Stock valuation (standard or average price, ...)\n"
-"* Robustness faced with Inventory differences\n"
-"* Automatic reordering rules (stock level, JIT, ...)\n"
-"* Bar code supported\n"
-"* Rapid detection of mistakes through double entry system\n"
-"* Traceability (upstream/downstream, production lots, serial number, ...)\n"
-"* Dashboard for warehouse that includes:\n"
-" * Products to receive in delay (date < = today)\n"
-" * Procurement in exception\n"
-" * Graph : Number of Receive products vs planned (bar graph on week par "
-"day)\n"
-" * Graph : Number of Delivery products vs planned (bar graph on week par "
-"day)\n"
-" "
-msgstr ""
-"El módulo de OpenERP de gestión de inventario puede gestionar múltiples "
-"almacenes, y varias ubicaciones estructuradas.\n"
-"Gracias a la gestión de doble entrada, el control de inventario es potente y "
-"flexible:\n"
-"* Historial de movimientos y planificación,\n"
-"* Diferentes métodos de inventario (FIFO, LIFO, ...)\n"
-"* Valoración de existencias (precio estándar o medio, ...)\n"
-"* Robustez frente a las diferencias de inventario\n"
-"* Normas de reordenación automática (nivel de existencias, JIT, ...)\n"
-"* Código de barras soportado\n"
-"* Detección rápida de errores a través del sistema de entrada doble\n"
-"* Trazabilidad (hacia arriba/hacia abajo, lotes de producción, número de "
-"serie, ...)\n"
-"* Panel de almacén que incluye:\n"
-" * Productos a recibir con retraso (fecha <= hoy)\n"
-" * Compras en excepción\n"
-" * Gráfico: Número de productos Recibidos frente al previsto (gráfico de "
-"barras semanal por día)\n"
-" * Gráfico: Número de productos Entregados frente al previsto (gráfico de "
-"barras semanal por día)\n"
-" "
+"This field is for internal purpose. It is used to decide if the column "
+"prodlot has to be shown on the move_ids field or not"
+msgstr ""
#. module: stock
#: help:product.template,property_stock_inventory:0
@@ -2046,49 +1945,47 @@ msgid ""
"default one, as the source location for stock moves generated when you do an "
"inventory"
msgstr ""
-"Para los productos actuales, esta ubicación de stock se utilizará, en lugar "
-"de la por defecto, como la ubicación de origen para los movimientos de stock "
-"generados cuando realiza un inventario."
#. module: stock
#: view:report.stock.lines.date:0
msgid "Stockable"
-msgstr "Almacenable"
+msgstr ""
#. module: stock
#: selection:product.product,valuation:0
msgid "Real Time (automated)"
-msgstr "Tiempo real (automatizado)"
+msgstr ""
#. module: stock
#: help:stock.move,tracking_id:0
msgid "Logistical shipping unit: pallet, box, pack ..."
-msgstr "Unidad de envío logística: Palet, caja, paquete, ..."
+msgstr ""
#. module: stock
-#: view:stock.change.product.qty:0
-#: view:stock.change.standard.price:0
+#: view:stock.location:0
+msgid "Customer Locations"
+msgstr ""
+
+#. module: stock
+#: view:stock.change.product.qty:0 view:stock.change.standard.price:0
msgid "_Apply"
-msgstr "_Aplicar"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
-#: report:stock.inventory.move:0
-#: report:stock.picking.list:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
+#: report:stock.inventory.move:0 report:stock.picking.list:0
msgid "]"
-msgstr "]"
+msgstr ""
#. module: stock
#: field:product.template,property_stock_inventory:0
msgid "Inventory Location"
-msgstr "Ubicación de inventario"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: view:report.stock.move:0
+#: view:report.stock.inventory:0 view:report.stock.move:0
msgid "Total value"
-msgstr "Valor total"
+msgstr ""
#. module: stock
#: help:stock.location,chained_journal_id:0
@@ -2096,55 +1993,56 @@ msgid ""
"Inventory Journal in which the chained move will be written, if the Chaining "
"Type is not Transparent (no journal is used if left empty)"
msgstr ""
-"Diario de inventario en el que el movimiento encadenado será escrito, si el "
-"tipo de encadenamiento no es transparente (no se utiliza ningún diario si se "
-"deja vacío)."
-
-#. module: stock
-#: view:board.board:0
-#: model:ir.actions.act_window,name:stock.action_incoming_product_board
-msgid "Incoming Product"
-msgstr "Albarán de entrada"
#. module: stock
#: view:stock.move:0
msgid "Creation"
-msgstr "Creación"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.inventory:0
+msgid ""
+"Analysis of current inventory (only moves that have already been processed)"
+msgstr ""
#. module: stock
-#: field:stock.move.memory.in,cost:0
-#: field:stock.move.memory.out,cost:0
+#: field:stock.partial.move.line,cost:0
+#: field:stock.partial.picking.line,cost:0
msgid "Cost"
-msgstr "Coste"
+msgstr ""
#. module: stock
#: field:product.category,property_stock_account_input_categ:0
#: field:product.template,property_stock_account_input:0
#: field:stock.change.standard.price,stock_account_input:0
-#: field:stock.location,valuation_in_account_id:0
msgid "Stock Input Account"
-msgstr "Cuenta entrada stock"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.move:0
+msgid "Shipping type specify, goods coming in or going out"
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_warehouse_mgmt
#: model:ir.ui.menu,name:stock.menu_warehouse_config
msgid "Warehouse Management"
-msgstr "Gestión de almacenes"
+msgstr ""
#. module: stock
#: selection:stock.picking,move_type:0
msgid "Partial Delivery"
-msgstr "Entrega parcial"
+msgstr ""
#. module: stock
#: selection:stock.location,chained_auto_packing:0
msgid "Automatic No Step Added"
-msgstr "Mov. automático, paso no añadido"
+msgstr ""
#. module: stock
#: view:stock.location.product:0
msgid "Stock Location Analysis"
-msgstr "Análisis ubicación stock"
+msgstr ""
#. module: stock
#: help:stock.move,date:0
@@ -2152,57 +2050,46 @@ msgid ""
"Move date: scheduled date until move is done, then date of actual move "
"processing"
msgstr ""
-"Fecha del movimiento: Fecha planificada hasta que el movimiento esté "
-"realizado, después fecha real en que el movimiento ha sido procesado."
#. module: stock
-#: field:report.stock.lines.date,date:0
-msgid "Latest Inventory Date"
-msgstr "Fecha último inventario"
-
-#. module: stock
-#: view:report.stock.inventory:0
-#: view:report.stock.move:0
-#: view:stock.inventory:0
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:report.stock.inventory:0 view:report.stock.move:0
+#: view:stock.inventory:0 view:stock.move:0 view:stock.picking:0
#: view:stock.production.lot:0
msgid "Group By..."
-msgstr "Agrupar por..."
+msgstr ""
#. module: stock
#: view:stock.location:0
msgid "Chained Locations"
-msgstr "Ubicaciones encadenadas"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.location_inventory
msgid "Inventory loss"
-msgstr "Pérdidas de inventario"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1311
+#: code:addons/stock/stock.py:1341
#, python-format
msgid "Document"
-msgstr "Documento"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Input Picking List"
-msgstr "Albarán de entrada"
+msgstr ""
#. module: stock
-#: field:stock.move,product_uom:0
-#: field:stock.move.memory.in,product_uom:0
-#: field:stock.move.memory.out,product_uom:0
+#: field:stock.move,product_uom:0 field:stock.partial.move.line,product_uom:0
+#: field:stock.partial.picking.line,product_uom:0
msgid "Unit of Measure"
-msgstr "Unidad de medida"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:176
+#: code:addons/stock/product.py:175
#, python-format
msgid "Products: "
-msgstr "Productos: "
+msgstr ""
#. module: stock
#: help:product.product,track_production:0
@@ -2210,142 +2097,122 @@ msgid ""
"Forces to specify a Production Lot for all moves containing this product and "
"generated by a Manufacturing Order"
msgstr ""
-"Fuerza a especificar un lote de producción para todos los movimientos que "
-"contienen este producto y generados por una orden de fabricación."
-
-#. module: stock
-#: model:ir.actions.act_window,name:stock.track_line_old
-#: view:stock.move.track:0
-msgid "Tracking a move"
-msgstr "Seguimiento de un movimiento"
#. module: stock
#: view:product.product:0
msgid "Update"
-msgstr "Actualizar"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Set to Draft"
-msgstr "Cambiar a borrador"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_journal_form
#: model:ir.ui.menu,name:stock.menu_action_stock_journal_form
msgid "Stock Journals"
-msgstr "Diarios de stock"
+msgstr ""
#. module: stock
#: selection:report.stock.move,type:0
msgid "Others"
-msgstr "Otros"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:90
+#: code:addons/stock/product.py:89
#, python-format
msgid "Could not find any difference between standard price and new price!"
msgstr ""
-"¡No se puede encontrar ninguna diferencia entre precio estándar y precio "
-"nuevo!"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_partial_picking
-msgid "Partial Picking"
-msgstr "Empaquetado parcial"
#. module: stock
#: model:stock.location,name:stock.stock_location_scrapped
#: field:stock.move,scrapped:0
msgid "Scrapped"
-msgstr "Desechado"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Products "
-msgstr "Productos "
+msgstr ""
#. module: stock
#: field:product.product,track_incoming:0
msgid "Track Incoming Lots"
-msgstr "Lotes de seguimiento de entrada"
+msgstr ""
#. module: stock
#: view:board.board:0
msgid "Warehouse board"
-msgstr "Tablero almacén"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:380
+#: code:addons/stock/product.py:439
#, python-format
msgid "Future Qty"
-msgstr "Ctdad futura"
-
-#. module: stock
-#: field:product.category,property_stock_variation:0
-msgid "Stock Variation Account"
-msgstr "Cuenta variación stock"
+msgstr ""
#. module: stock
-#: field:stock.move,note:0
-#: view:stock.picking:0
-#: field:stock.picking,note:0
+#: field:stock.move,note:0 view:stock.picking:0 field:stock.picking,note:0
msgid "Notes"
-msgstr "Notas"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
msgid "Value"
-msgstr "Valor"
+msgstr ""
#. module: stock
-#: field:report.stock.move,type:0
-#: field:stock.location,chained_picking_type:0
+#: field:report.stock.move,type:0 field:stock.location,chained_picking_type:0
#: field:stock.picking,type:0
msgid "Shipping Type"
-msgstr "Tipo de envío"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2210
-#, python-format
-msgid "You can only delete draft moves."
-msgstr "Sólo puede eliminar movimientos borrador."
+#: view:stock.move:0
+msgid "Stock moves that are Confirmed, Available or Waiting"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_picking.py:97
#: model:ir.actions.act_window,name:stock.act_product_location_open
-#: model:ir.ui.menu,name:stock.menu_stock_products_menu
-#: view:stock.inventory:0
-#: view:stock.picking:0
-#, python-format
+#: model:ir.ui.menu,name:stock.menu_product_in_config_stock
+#: model:ir.ui.menu,name:stock.menu_stock_product
+#: model:ir.ui.menu,name:stock.menu_stock_products_menu view:stock.inventory:0
+#: view:stock.partial.move:0 view:stock.partial.picking:0 view:stock.picking:0
msgid "Products"
-msgstr "Productos"
+msgstr ""
+
+#. module: stock
+#: selection:stock.location,chained_location_type:0
+msgid "None"
+msgstr ""
#. module: stock
#: view:stock.change.standard.price:0
msgid "Change Price"
-msgstr "Cambiar precio"
+msgstr ""
#. module: stock
#: field:stock.picking,move_type:0
msgid "Delivery Method"
-msgstr "Método entrega"
+msgstr ""
#. module: stock
#: help:report.stock.move,location_dest_id:0
-#: help:stock.move,location_dest_id:0
-#: help:stock.picking,location_dest_id:0
+#: help:stock.move,location_dest_id:0 help:stock.picking,location_dest_id:0
msgid "Location where the system will stock the finished products."
-msgstr "Ubicación donde el sistema almacenará los productos finalizados."
+msgstr ""
#. module: stock
-#: help:product.category,property_stock_variation:0
-msgid ""
-"When real-time inventory valuation is enabled on a product, this account "
-"will hold the current value of the products."
+#: view:stock.move:0
+msgid "Stock to be delivered (Available or not)"
+msgstr ""
+
+#. module: stock
+#: view:board.board:0
+#: model:ir.actions.act_window,name:stock.action_stock_outgoing_product_delay
+msgid "Outgoing Products"
msgstr ""
-"Cuando está activada una valoración de inventario en tiempo real de un "
-"producto, esta cuenta contiene el valor actual de los productos."
#. module: stock
#: model:ir.actions.act_window,help:stock.action_reception_picking_move
@@ -2356,50 +2223,48 @@ msgid ""
"the supplier or the purchase order reference. Then you can confirm all "
"products received using the buttons on the right of each line."
msgstr ""
-"Aquí podrá recibir los productos individuales, sin importar de que pedido de "
-"compra o albarán de entrada provienen. Encontrará la lista de todos los "
-"productos que está esperando. Una vez recibido el albarán, puede filtrar "
-"basándose en el nombre del proveedor o en la referencia del pedido de "
-"compra. Entonces, puede confirmar todos los productos recibidos usando los "
-"botones a la derecha de cada línea."
#. module: stock
#: model:ir.model,name:stock.model_stock_move
msgid "Stock Move"
-msgstr "Movimiento stock"
+msgstr ""
#. module: stock
#: view:report.stock.move:0
msgid "Delay(Days)"
-msgstr "Retraso (días)"
+msgstr ""
#. module: stock
-#: field:stock.move.memory.in,move_id:0
-#: field:stock.move.memory.out,move_id:0
-msgid "Move"
-msgstr "Movimiento"
+#: code:addons/stock/stock.py:1697
+#, python-format
+msgid "Operation forbidden"
+msgstr ""
#. module: stock
#: help:stock.picking,min_date:0
msgid "Expected date for the picking to be processed"
-msgstr "Fecha prevista para procesar el albarán."
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:376
+#: code:addons/stock/product.py:435
#, python-format
msgid "P&L Qty"
-msgstr "Ctdad P&L"
+msgstr ""
#. module: stock
-#: view:stock.production.lot:0
-#: field:stock.production.lot,revisions:0
+#: view:stock.picking:0
+msgid "Internal Pickings to invoice"
+msgstr ""
+
+#. module: stock
+#: view:stock.production.lot:0 field:stock.production.lot,revisions:0
msgid "Revisions"
-msgstr "Revisiones"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "This operation will cancel the shipment. Do you want to continue?"
-msgstr "Esta operación cancelará el envío. ¿Desea continuar?"
+msgstr ""
#. module: stock
#: help:product.product,valuation:0
@@ -2410,12 +2275,6 @@ msgid ""
"current inventory value, and the stock input and stock output account will "
"hold the counterpart moves for incoming and outgoing products."
msgstr ""
-"Si la valoración en tiempo real está habilitada para un producto, el sistema "
-"automáticamente escribirá asientos en el diario correspondientes a los "
-"movimientos de stock. La cuenta de variación de inventario especificada en "
-"la categoría del producto representará el valor de inventario actual, y la "
-"cuenta de entrada y salida de stock contendrán las contrapartidas para los "
-"productos entrantes y salientes."
#. module: stock
#: model:ir.actions.act_window,help:stock.action_stock_inventory_report
@@ -2424,19 +2283,13 @@ msgid ""
"levels. Sort and group by selection criteria in order to better analyse and "
"manage your company activities."
msgstr ""
-"El análisis de inventario le permite verificar y analizar fácilmente los "
-"niveles de stock de su compañia. Ordene y agrupe por criterios de selección "
-"para analizar y gestionar mejor las actividades de su empresa."
#. module: stock
-#: help:report.stock.move,location_id:0
-#: help:stock.move,location_id:0
+#: help:report.stock.move,location_id:0 help:stock.move,location_id:0
msgid ""
"Sets a location if you produce at a fixed location. This can be a partner "
"location if you subcontract the manufacturing operations."
msgstr ""
-"Indica una ubicación si se producen en una ubicación fija. Puede ser una "
-"ubicación de empresa si subcontrata las operaciones de fabricación."
#. module: stock
#: model:ir.actions.act_window,help:stock.action_location_form
@@ -2451,109 +2304,95 @@ msgid ""
"location to the Stock location. Each report can be performed on physical, "
"partner or virtual locations."
msgstr ""
-"Defina sus ubicaciones para reflejar la estructura de su almacén y "
-"organización. OpenERP es capaz de manejar ubicaciones físicas (almacén, "
-"estante, caja, etc.), ubicaciones de empresa (clientes, proveedores) y "
-"ubicaciones virtuales que son la contrapartida de las operaciones de stock "
-"como los consumos por órdenes de la fabricación, inventarios, etc. Cada "
-"operación de stock en OpenERP mueve los productos de una ubicación a otra. "
-"Por ejemplo, si recibe productos de un proveedor, OpenERP moverá productos "
-"desde la ubicación del proveedor a la ubicación del stock. Cada informe "
-"puede ser realizado sobre ubicaciones físicas, de empresa o virtuales."
#. module: stock
#: view:stock.invoice.onshipping:0
msgid "Create"
-msgstr "Crear"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Dates"
-msgstr "Fechas"
+msgstr ""
#. module: stock
#: field:stock.move,priority:0
msgid "Priority"
-msgstr "Prioridad"
+msgstr ""
#. module: stock
#: view:stock.move:0
msgid "Source"
-msgstr "Origen"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2589
#: model:ir.model,name:stock.model_stock_inventory
#: selection:report.stock.inventory,location_type:0
-#: field:stock.inventory.line,inventory_id:0
-#: report:stock.inventory.move:0
+#: field:stock.inventory.line,inventory_id:0 report:stock.inventory.move:0
#: selection:stock.location,usage:0
-#, python-format
msgid "Inventory"
-msgstr "Inventario"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_picking
msgid "Picking List"
-msgstr "Albarán"
+msgstr ""
#. module: stock
#: sql_constraint:stock.production.lot:0
msgid ""
"The combination of serial number and internal reference must be unique !"
msgstr ""
-"¡La combinación de número de serie y referencia interna debe ser única!"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_ups
-msgid "Stock ups"
-msgstr "Stock ups"
#. module: stock
#: view:stock.inventory:0
msgid "Cancel Inventory"
-msgstr "Cancelar el inventario"
-
-#. module: stock
-#: field:stock.move.split.lines,name:0
-#: field:stock.move.split.lines.exist,name:0
-msgid "Tracking serial"
-msgstr "Seguimiento nº serie"
+msgstr ""
#. module: stock
#: code:addons/stock/report/report_stock.py:78
-#: code:addons/stock/report/report_stock.py:135
-#: code:addons/stock/stock.py:754
+#: code:addons/stock/report/report_stock.py:135 code:addons/stock/stock.py:760
#, python-format
msgid "Error !"
-msgstr "¡Error!"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_replacement_result
-msgid "Stock Replacement result"
-msgstr "Resultado reemplazo stock"
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_unit_measure_stock
#: model:ir.ui.menu,name:stock.menu_stock_uom_form_action
msgid "Units of Measure"
-msgstr "Unidades de medida"
+msgstr ""
#. module: stock
#: selection:stock.location,chained_location_type:0
msgid "Fixed Location"
-msgstr "Ubicaciones fijas"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/stock.py:2486
+#, python-format
+msgid "Product '%s' is consumed with '%s' quantity."
+msgstr ""
#. module: stock
+#: model:product.template,description:stock.product_icecream_product_template
+msgid ""
+"Ice cream can be mass-produced and thus is widely available in developed "
+"parts of the world. Ice cream can be purchased in large cartons (vats and "
+"squrounds) from supermarkets and grocery stores, in smaller quantities from "
+"ice cream shops, convenience stores, and milk bars, and in individual "
+"servings from small carts or vans at public events."
+msgstr ""
+
+#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "July"
-msgstr "Julio"
+msgstr ""
#. module: stock
#: view:report.stock.lines.date:0
msgid "Consumable"
-msgstr "Consumible"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_stock_line_date
@@ -2563,259 +2402,233 @@ msgid ""
"need this report in order to ensure that the stock of each product is "
"controlled at least once a year."
msgstr ""
-"Muestra los últimos inventarios realizados sobre sus productos y los ordena "
-"fácilmente con filtros específicos. Si realiza inventarios parciales "
-"frecuentemente, necesita este informe para asegurar que el stock de cada "
-"producto ha sido controlado al menos una vez al año."
+
+#. module: stock
+#: model:stock.location,name:stock.location_opening
+msgid "opening"
+msgstr ""
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_product_history
msgid "Stock Level Forecast"
-msgstr "Previsión nivel de stock"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_journal
-#: field:report.stock.move,stock_journal:0
-#: view:stock.journal:0
-#: field:stock.journal,name:0
-#: field:stock.picking,stock_journal_id:0
+#: field:report.stock.move,stock_journal:0 view:stock.journal:0
+#: field:stock.journal,name:0 field:stock.picking,stock_journal_id:0
msgid "Stock Journal"
-msgstr "Diario de inventario"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: selection:stock.location,usage:0
msgid "Procurement"
-msgstr "Abastecimiento"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_4
msgid "Maxtor Suppliers"
-msgstr "Proveedores Maxtor"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_change_product_qty.py:80
-#: code:addons/stock/wizard/stock_change_standard_price.py:106
+#: code:addons/stock/wizard/stock_change_product_qty.py:78
+#: code:addons/stock/wizard/stock_change_standard_price.py:107
#, python-format
msgid "Active ID is not set in Context"
-msgstr "No se ha establecido el ID activo en el Contexto"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Force Availability"
-msgstr "Forzar disponibilidad"
+msgstr ""
#. module: stock
-#: model:ir.actions.act_window,name:stock.move_scrap
-#: view:stock.move.scrap:0
+#: model:ir.actions.act_window,name:stock.move_scrap view:stock.move.scrap:0
msgid "Scrap Move"
-msgstr "Movimiento desecho"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:138
#: model:ir.actions.act_window,name:stock.action_reception_picking_move
-#: model:ir.ui.menu,name:stock.menu_action_pdct_in
-#: view:stock.move:0
-#, python-format
+#: model:ir.ui.menu,name:stock.menu_action_pdct_in view:stock.move:0
msgid "Receive Products"
-msgstr "Recibir productos"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:131
#: model:ir.actions.act_window,name:stock.action_out_picking_move
#: model:ir.ui.menu,name:stock.menu_action_pdct_out
-#, python-format
msgid "Deliver Products"
-msgstr "Enviar productos"
+msgstr ""
#. module: stock
#: view:stock.location.product:0
msgid "View Stock of Products"
-msgstr "Ver stock de productos"
-
-#. module: stock
-#: view:stock.picking:0
-msgid "Internal Picking List"
-msgstr "Albarán interno"
+msgstr ""
#. module: stock
-#: view:report.stock.move:0
+#: view:report.stock.inventory:0 view:report.stock.move:0
#: field:report.stock.move,month:0
msgid "Month"
-msgstr "Mes"
+msgstr ""
#. module: stock
#: help:stock.picking,date_done:0
msgid "Date of Completion"
-msgstr "Fecha de realización."
+msgstr ""
#. module: stock
#: help:stock.production.lot,name:0
msgid "Unique production lot, will be displayed as: PREFIX/SERIAL [INT_REF]"
-msgstr "Lote de producción único, se mostrará como: PREFIJO/SERIE [REF_INT]"
+msgstr ""
+
+#. module: stock
+#: model:stock.location,name:stock.stock_location_company
+msgid "Your Company"
+msgstr ""
+
+#. module: stock
+#: constraint:stock.move:0
+msgid "You can not move products from or to a location of the type view."
+msgstr ""
#. module: stock
#: help:stock.tracking,active:0
msgid ""
"By unchecking the active field, you may hide a pack without deleting it."
msgstr ""
-"Si el campo activo se desmarca, permite ocultar un paquete sin eliminarlo."
#. module: stock
#: view:stock.inventory.merge:0
msgid "Yes"
-msgstr "Sí"
+msgstr ""
#. module: stock
#: field:stock.inventory,inventory_line_id:0
msgid "Inventories"
-msgstr "Inventarios"
+msgstr ""
#. module: stock
#: view:report.stock.move:0
msgid "Todo"
-msgstr "Por hacer"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: field:report.stock.inventory,company_id:0
-#: view:report.stock.move:0
-#: field:report.stock.move,company_id:0
-#: field:stock.inventory,company_id:0
-#: field:stock.inventory.line,company_id:0
-#: field:stock.location,company_id:0
-#: field:stock.move,company_id:0
-#: field:stock.picking,company_id:0
-#: field:stock.production.lot,company_id:0
+#: view:report.stock.inventory:0 field:report.stock.inventory,company_id:0
+#: view:report.stock.move:0 field:report.stock.move,company_id:0
+#: field:stock.inventory,company_id:0 field:stock.inventory.line,company_id:0
+#: field:stock.location,company_id:0 field:stock.move,company_id:0
+#: field:stock.picking,company_id:0 field:stock.production.lot,company_id:0
#: field:stock.production.lot.revision,company_id:0
#: field:stock.warehouse,company_id:0
msgid "Company"
-msgstr "Compañía"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Unit Of Measure"
-msgstr "Unidad de medida"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:122
+#: code:addons/stock/product.py:121
#, python-format
msgid ""
"There is no stock input account defined for this product: \"%s\" (id: %d)"
msgstr ""
-"No se ha definido una cuenta de entrada de stock para este producto: \"%s\" "
-"(id: %d)"
#. module: stock
-#: code:addons/stock/stock.py:2339
+#: code:addons/stock/stock.py:2445
#, python-format
msgid "Can not consume a move with negative or zero quantity !"
msgstr ""
-"¡No se puede consumir un movimiento con una cantidad negativa o cero!"
#. module: stock
#: field:stock.location,stock_real:0
msgid "Real Stock"
-msgstr "Stock real"
+msgstr ""
#. module: stock
#: view:stock.fill.inventory:0
msgid "Fill Inventory"
-msgstr "Rellenar inventario"
+msgstr ""
#. module: stock
#: constraint:product.template:0
msgid ""
"Error: The default UOM and the purchase UOM must be in the same category."
msgstr ""
-"Error: La UdM por defecto y la UdM de compra deben estar en la misma "
-"categoría."
#. module: stock
-#: help:product.category,property_stock_account_input_categ:0
-msgid ""
-"When doing real-time inventory valuation, counterpart Journal Items for all "
-"incoming stock moves will be posted in this account. This is the default "
-"value for all products in this category, it can also directly be set on each "
-"product."
+#: model:stock.location,name:stock.location_delivery_counter
+msgid "Delivery Counter"
msgstr ""
-"Al hacer la valoración de inventario en tiempo real, la contrapartida de los "
-"asientos del diario para todos los movimientos de stock de entrada se creará "
-"en esta cuenta. Este es el valor por defecto para todos los productos de "
-"esta categoría, también puede indicarse directamente en cada producto."
#. module: stock
-#: field:stock.production.lot.revision,date:0
-msgid "Revision Date"
-msgstr "Fecha de revisión"
-
-#. module: stock
-#: view:report.stock.inventory:0
-#: field:report.stock.inventory,prodlot_id:0
-#: view:stock.move:0
-#: field:stock.move.split.lines,lot_id:0
-#: field:stock.move.split.lines.exist,lot_id:0
-#: report:stock.picking.list:0
+#: view:report.stock.inventory:0 field:report.stock.inventory,prodlot_id:0
+#: view:stock.move:0 report:stock.picking.list:0
msgid "Lot"
-msgstr "Lote"
+msgstr ""
#. module: stock
#: view:stock.move.split:0
msgid "Production Lot Number"
-msgstr "Número lote de producción"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/stock.py:2697
+#, python-format
+msgid "Inventory '%s' is done."
+msgstr ""
#. module: stock
#: field:stock.move,product_uos_qty:0
msgid "Quantity (UOS)"
-msgstr "Cantidad (UdV)"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1664
+#: code:addons/stock/stock.py:1743
#, python-format
msgid ""
"You are moving %.2f %s products but only %.2f %s available in this lot."
msgstr ""
-"Está moviendo %.2f %s productos pero sólo %.2f %s están disponibles en este "
-"lote."
#. module: stock
#: view:stock.move:0
msgid "Set Available"
-msgstr "Reservar"
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Contact Address :"
-msgstr "Dirección de contacto :"
+msgstr ""
#. module: stock
#: field:stock.move,backorder_id:0
msgid "Back Order"
-msgstr "Albarán pendiente"
+msgstr ""
#. module: stock
-#: field:stock.incoterms,active:0
-#: field:stock.location,active:0
+#: field:stock.incoterms,active:0 field:stock.location,active:0
#: field:stock.tracking,active:0
msgid "Active"
-msgstr "Activo"
-
-#. module: stock
-#: model:ir.module.module,shortdesc:stock.module_meta_information
-msgid "Inventory Management"
-msgstr "Almacenes y logística"
+msgstr ""
#. module: stock
#: view:product.template:0
msgid "Properties"
-msgstr "Propiedades"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:974
+#: code:addons/stock/stock.py:1082
#, python-format
msgid "Error, no partner !"
-msgstr "¡Error, sin empresa!"
+msgstr ""
+
+#. module: stock
+#: field:stock.inventory.line.split.lines,wizard_exist_id:0
+#: field:stock.inventory.line.split.lines,wizard_id:0
+#: field:stock.move.split.lines,wizard_id:0
+msgid "Parent Wizard"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_incoterms_tree
@@ -2823,14 +2636,18 @@ msgstr "¡Error, sin empresa!"
#: model:ir.ui.menu,name:stock.menu_action_incoterm_open
#: view:stock.incoterms:0
msgid "Incoterms"
-msgstr "Incoterms"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
+#: model:ir.model,name:stock.model_stock_partial_picking_line
+msgid "stock.partial.picking.line"
+msgstr ""
+
+#. module: stock
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
#: report:stock.inventory.move:0
msgid "Total:"
-msgstr "Total:"
+msgstr ""
#. module: stock
#: help:stock.incoterms,name:0
@@ -2839,9 +2656,6 @@ msgid ""
"costs and responsibilities between buyer and seller and reflect state-of-the-"
"art transportation practices."
msgstr ""
-"Los Incoterms son una serie de términos de ventas. Se utilizan para dividir "
-"los costes de transacción y las responsabilidades entre el comprador y el "
-"vendedor, y reflejan las prácticas de transporte más recientes."
#. module: stock
#: help:stock.fill.inventory,recursive:0
@@ -2849,290 +2663,267 @@ msgid ""
"If checked, products contained in child locations of selected location will "
"be included as well."
msgstr ""
-"Si se marca, los productos que figuran en las ubicaciones hijas de la "
-"ubicación seleccionada se incluirán también."
-
-#. module: stock
-#: field:stock.move.track,tracking_prefix:0
-msgid "Tracking prefix"
-msgstr "Prefijo seguimiento"
#. module: stock
#: field:stock.inventory,name:0
msgid "Inventory Reference"
-msgstr "Referencia inventario"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1304
+#: code:addons/stock/stock.py:1334
#, python-format
msgid "Internal picking"
-msgstr "Albarán interno"
+msgstr ""
#. module: stock
#: view:stock.location.product:0
msgid "Open Product"
-msgstr "Abrir producto"
+msgstr ""
#. module: stock
#: field:stock.location.product,to_date:0
msgid "To"
-msgstr "Hasta"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Process"
-msgstr "Procesar"
+msgstr ""
#. module: stock
#: field:stock.production.lot.revision,name:0
msgid "Revision Name"
-msgstr "Nombre de revisión"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_warehouse
#: model:ir.ui.menu,name:stock.menu_stock_root
-#: view:stock.warehouse:0
+#: field:product.product,warehouse_id:0 view:stock.warehouse:0
msgid "Warehouse"
-msgstr "Almacén"
+msgstr ""
#. module: stock
-#: view:stock.location.product:0
-msgid ""
-"(Keep empty to open the current situation. Adjust HH:MM:SS to 00:00:00 to "
-"filter all resources of the day for the 'From' date and 23:59:59 for the "
-"'To' date)"
+#: view:stock.inventory:0
+msgid "Confirm Inventory"
msgstr ""
-"(Déjelo vacío para abrir la situación actual. Ponga HH:MM:SS a 00:00:00 para "
-"filtrar todos los recursos del día en el campo fecha 'Desde' y 23:59:59 en "
-"el campo fecha 'Hasta'.)"
#. module: stock
#: view:product.category:0
msgid "Accounting Stock Properties"
-msgstr "Propiedades contables del stock"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_picking_tree_out
msgid "Customers Packings"
-msgstr "Paquetes cliente"
+msgstr ""
#. module: stock
-#: selection:report.stock.inventory,state:0
-#: view:report.stock.move:0
-#: selection:report.stock.move,state:0
-#: selection:stock.inventory,state:0
-#: view:stock.move:0
-#: selection:stock.move,state:0
-#: view:stock.picking:0
+#: selection:report.stock.inventory,state:0 view:report.stock.move:0
+#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
+#: view:stock.move:0 selection:stock.move,state:0 view:stock.picking:0
#: selection:stock.picking,state:0
msgid "Done"
-msgstr "Realizado"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_change_standard_price
#: model:ir.model,name:stock.model_stock_change_standard_price
#: view:stock.change.standard.price:0
msgid "Change Standard Price"
-msgstr "Cambiar precio estándar"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_locations_virtual
msgid "Virtual Locations"
-msgstr "Ubicaciones virtuales"
+msgstr ""
#. module: stock
#: selection:stock.picking,invoice_state:0
msgid "To Be Invoiced"
-msgstr "Para facturar"
+msgstr ""
#. module: stock
#: field:stock.inventory,date_done:0
msgid "Date done"
-msgstr "Fecha realización"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:975
+#: code:addons/stock/stock.py:1083
#, python-format
msgid ""
"Please put a partner on the picking list if you want to generate invoice."
msgstr ""
-"Por favor indique una empresa en el albarán si desea generar factura."
#. module: stock
#: selection:stock.move,priority:0
msgid "Not urgent"
-msgstr "No urgente"
-
-#. module: stock
-#: view:stock.move:0
-msgid "To Do"
-msgstr "Para hacer"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_warehouse_form
#: model:ir.ui.menu,name:stock.menu_action_warehouse_form
msgid "Warehouses"
-msgstr "Almacenes"
+msgstr ""
#. module: stock
#: field:stock.journal,user_id:0
msgid "Responsible"
-msgstr "Responsable"
-
-#. module: stock
-#: field:stock.move,returned_price:0
-msgid "Returned product price"
-msgstr "Precio producto devuelto"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_inventory_report
#: model:ir.ui.menu,name:stock.menu_action_stock_inventory_report
#: view:report.stock.inventory:0
msgid "Inventory Analysis"
-msgstr "Análisis inventario"
+msgstr ""
#. module: stock
#: field:stock.invoice.onshipping,journal_id:0
msgid "Destination Journal"
-msgstr "Diario de destino"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.act_stock_tracking_lot_2_stock_report_tracklots
#: model:stock.location,name:stock.stock_location_stock
msgid "Stock"
-msgstr "Stock"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_product_product
-#: model:ir.ui.menu,name:stock.menu_product_in_config_stock
-#: model:ir.ui.menu,name:stock.menu_stock_product
-#: view:report.stock.inventory:0
-#: field:report.stock.inventory,product_id:0
-#: field:report.stock.lines.date,product_id:0
-#: view:report.stock.move:0
+#: view:report.stock.inventory:0 field:report.stock.inventory,product_id:0
+#: field:report.stock.lines.date,product_id:0 view:report.stock.move:0
#: field:report.stock.move,product_id:0
#: field:stock.change.product.qty,product_id:0
#: field:stock.inventory.line,product_id:0
-#: field:stock.inventory.line.split,product_id:0
-#: report:stock.inventory.move:0
-#: view:stock.move:0
-#: field:stock.move,product_id:0
-#: field:stock.move.consume,product_id:0
-#: field:stock.move.memory.in,product_id:0
-#: field:stock.move.memory.out,product_id:0
-#: field:stock.move.scrap,product_id:0
+#: field:stock.inventory.line.split,product_id:0 report:stock.inventory.move:0
+#: view:stock.move:0 field:stock.move,product_id:0
+#: field:stock.move.consume,product_id:0 field:stock.move.scrap,product_id:0
#: field:stock.move.split,product_id:0
-#: view:stock.production.lot:0
+#: field:stock.partial.move.line,product_id:0
+#: field:stock.partial.picking.line,product_id:0 view:stock.production.lot:0
#: field:stock.production.lot,product_id:0
#: field:stock.report.prodlots,product_id:0
#: field:stock.report.tracklots,product_id:0
+#: field:stock.return.picking.memory,product_id:0
msgid "Product"
-msgstr "Producto"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:126
-#, python-format
+#: view:stock.return.picking:0
+msgid "Return"
+msgstr ""
+
+#. module: stock
+#: field:stock.return.picking,invoice_state:0
msgid "Invoicing"
-msgstr "Facturación"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2274
-#: code:addons/stock/stock.py:2334
+#: view:stock.picking:0
+msgid "Assigned Internal Moves"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/stock.py:2379 code:addons/stock/stock.py:2440
+#: code:addons/stock/wizard/stock_partial_picking.py:141
#, python-format
msgid "Please provide Proper Quantity !"
-msgstr "¡Indique cantidad correcta!"
+msgstr ""
#. module: stock
#: field:stock.move,product_uos:0
msgid "Product UOS"
-msgstr "UdV del producto"
+msgstr ""
#. module: stock
#: field:stock.location,posz:0
msgid "Height (Z)"
-msgstr "Altura (Z)"
-
-#. module: stock
-#: field:stock.ups,weight:0
-msgid "Lot weight"
-msgstr "Peso lote"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_move_consume
#: view:stock.move.consume:0
msgid "Consume Products"
-msgstr "Consumir productos"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1663
+#: code:addons/stock/stock.py:1742
#, python-format
msgid "Insufficient Stock in Lot !"
-msgstr "¡Stock insuficiente en el lote!"
+msgstr ""
#. module: stock
#: field:stock.location,parent_right:0
msgid "Right Parent"
-msgstr "Padre derecho"
+msgstr ""
#. module: stock
#: field:stock.picking,address_id:0
msgid "Address"
-msgstr "Dirección"
+msgstr ""
#. module: stock
-#: report:lot.stock.overview:0
-#: report:lot.stock.overview_all:0
+#: report:lot.stock.overview:0 report:lot.stock.overview_all:0
msgid "Variants"
-msgstr "Variantes"
+msgstr ""
#. module: stock
#: field:stock.location,posx:0
msgid "Corridor (X)"
-msgstr "Pasillo (X)"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_suppliers
msgid "Suppliers"
-msgstr "Proveedores"
+msgstr ""
#. module: stock
-#: field:report.stock.inventory,value:0
-#: field:report.stock.move,value:0
+#: field:report.stock.inventory,value:0 field:report.stock.move,value:0
msgid "Total Value"
-msgstr "Valor total"
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_product_by_category_stock_form
msgid "Products by Category"
-msgstr "Productos por categoría"
+msgstr ""
#. module: stock
-#: model:ir.ui.menu,name:stock.menu_product_category_config_stock
-msgid "Products Categories"
-msgstr "Categorías de productos"
+#: selection:stock.picking,state:0
+msgid "Waiting Another Operation"
+msgstr ""
#. module: stock
-#: field:stock.move.memory.in,wizard_id:0
-#: field:stock.move.memory.out,wizard_id:0
+#: view:stock.location:0
+msgid "Supplier Locations"
+msgstr ""
+
+#. module: stock
+#: field:stock.partial.move.line,wizard_id:0
+#: field:stock.partial.picking.line,wizard_id:0
+#: field:stock.return.picking.memory,wizard_id:0
msgid "Wizard"
-msgstr "Asistente"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.move:0
+msgid "Completed Stock-Moves"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_stock_location_product
#: model:ir.model,name:stock.model_stock_location_product
msgid "Products by Location"
-msgstr "Productos por ubicación"
+msgstr ""
#. module: stock
#: field:stock.fill.inventory,recursive:0
msgid "Include children"
-msgstr "Incluir hijos"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_components
msgid "Shelf 1"
-msgstr "Estante 1"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_picking_tree6
@@ -3144,159 +2935,154 @@ msgid ""
"preconfigured logistics rules, but you can also record manual stock "
"operations."
msgstr ""
-"Los movimientos internos muestran todas las operaciones de inventario que se "
-"deben realizar en su almacén. Todas las operaciones pueden ser clasificadas "
-"en diarios de stock, para que cada trabajador tenga su propia lista de "
-"operaciones a realizar en su propio diario. La mayor parte de operaciones "
-"son preparadas automáticamente por OpenERP según sus reglas de logística "
-"preconfiguradas, pero también puede registrar operaciones de stock de forma "
-"manual."
#. module: stock
#: view:stock.move:0
msgid "Order"
-msgstr "Orden"
+msgstr ""
+
+#. module: stock
+#: view:product.product:0
+msgid "Cost Price :"
+msgstr ""
#. module: stock
#: field:stock.tracking,name:0
msgid "Pack Reference"
-msgstr "Referencia paquete"
+msgstr ""
#. module: stock
-#: view:report.stock.move:0
-#: field:report.stock.move,location_id:0
-#: field:stock.move,location_id:0
+#: view:report.stock.move:0 field:report.stock.move,location_id:0
+#: field:stock.inventory.line.split,location_id:0
+#: field:stock.move,location_id:0 field:stock.move.split,location_id:0
msgid "Source Location"
-msgstr "Ubicación origen"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0
+msgid " Waiting"
+msgstr ""
#. module: stock
#: view:product.template:0
msgid "Accounting Entries"
-msgstr "Asientos contables"
+msgstr ""
+
+#. module: stock
+#: model:res.groups,name:stock.group_stock_manager
+msgid "Manager"
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Total"
-msgstr "Total"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_intermediatelocation0
msgid "Internal Shippings"
-msgstr "Envíos internos"
+msgstr ""
#. module: stock
#: field:stock.change.standard.price,enable_stock_in_out_acc:0
msgid "Enable Related Account"
-msgstr "Activa cuenta relacionada"
+msgstr ""
#. module: stock
#: field:stock.location,stock_virtual_value:0
msgid "Virtual Stock Value"
-msgstr "Valor stock virtual"
+msgstr ""
#. module: stock
-#: view:product.product:0
-#: view:stock.inventory.line.split:0
+#: view:product.product:0 view:stock.inventory.line.split:0
#: view:stock.move.split:0
msgid "Lots"
-msgstr "Lotes"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "New Pack"
-msgstr "Nuevo paquete"
+msgstr ""
#. module: stock
#: view:stock.move:0
msgid "Destination"
-msgstr "Destinación"
+msgstr ""
#. module: stock
#: selection:stock.picking,move_type:0
msgid "All at once"
-msgstr "Todo junto"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1620
+#: code:addons/stock/stock.py:1698
#, python-format
msgid ""
"Quantities, UoMs, Products and Locations cannot be modified on stock moves "
"that have already been processed (except by the Administrator)"
msgstr ""
-"Las cantidades, UdM, productos y ubicaciones no se pueden modificar en los "
-"movimientos de stock que ya han sido procesados (excepto por el "
-"administrador)"
#. module: stock
-#: code:addons/stock/product.py:386
+#: code:addons/stock/product.py:445
#, python-format
msgid "Future Productions"
-msgstr "Producciones futuras"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "To Invoice"
-msgstr "Para facturar"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:115
-#, python-format
+#: view:stock.return.picking:0
msgid "Return lines"
-msgstr "Líneas de devolución"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_report_stock_lines_date
#: view:report.stock.lines.date:0
msgid "Dates of Inventories"
-msgstr "Fechas de inventarios"
+msgstr ""
#. module: stock
#: view:report.stock.move:0
msgid "Total incoming quantity"
-msgstr "Cantidad de entrada total"
+msgstr ""
#. module: stock
#: field:report.stock.move,product_qty_out:0
msgid "Out Qty"
-msgstr "Ctdad salida"
+msgstr ""
#. module: stock
#: field:stock.production.lot,move_ids:0
msgid "Moves for this production lot"
-msgstr "Movimientos para este lote de producción"
-
-#. module: stock
-#: model:ir.model,name:stock.model_stock_move_memory_out
-msgid "stock.move.memory.out"
-msgstr "stock.movimiento.memoria.salida"
-
-#. module: stock
-#: code:addons/stock/wizard/stock_fill_inventory.py:115
-#, python-format
-msgid "Message !"
-msgstr "¡ Mensaje !"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Put in current pack"
-msgstr "Poner en el paquete actual"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Lot Inventory"
-msgstr "Regularización de inventario"
+msgstr ""
#. module: stock
#: view:stock.move:0
msgid "Reason"
-msgstr "Motivo"
+msgstr ""
#. module: stock
-#: report:stock.picking.list:0
-msgid "Delivery Order:"
-msgstr "Albarán de salida:"
+#: model:product.template,name:stock.product_icecream_product_template
+msgid "Ice Cream"
+msgstr ""
+
+#. module: stock
+#: model:ir.model,name:stock.model_stock_partial_picking
+msgid "Partial Picking Processing Wizard"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_production_lot_form
@@ -3308,107 +3094,102 @@ msgid ""
"'Available' button to get all the lots you produced, received or delivered "
"to customers."
msgstr ""
-"Esta es la lista de todos los lotes de producción (números de serie) que "
-"registró. Cuando selecciona un lote, puede obtener la trazabilidad hacia "
-"arriba o hacia abajo de los productos que componen el lote. Por defecto, la "
-"lista es filtrada según los números de serie disponibles en su almacén, pero "
-"puede desmarcar el botón 'Disponible' para obtener todos los lotes que "
-"produjo, recibió o entregó a sus clientes."
#. module: stock
#: field:stock.location,icon:0
msgid "Icon"
-msgstr "Icono"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:2209
-#: code:addons/stock/stock.py:2617
+#: code:addons/stock/stock.py:2311 code:addons/stock/stock.py:2726
#, python-format
msgid "UserError"
-msgstr "Error de usuario"
+msgstr ""
#. module: stock
-#: view:stock.inventory.line.split:0
-#: view:stock.move.consume:0
-#: view:stock.move.scrap:0
-#: view:stock.move.split:0
-#: view:stock.move.track:0
-#: view:stock.split.into:0
+#: field:stock.partial.move,hide_tracking:0
+#: field:stock.partial.move.line,tracking:0
+#: field:stock.partial.picking,hide_tracking:0
+#: field:stock.partial.picking.line,tracking:0
+msgid "Tracking"
+msgstr ""
+
+#. module: stock
+#: view:stock.inventory.line.split:0 view:stock.move.consume:0
+#: view:stock.move.scrap:0 view:stock.move.split:0 view:stock.split.into:0
msgid "Ok"
-msgstr "Aceptar"
+msgstr ""
+
+#. module: stock
+#: help:product.category,property_stock_account_output_categ:0
+msgid ""
+"When doing real-time inventory valuation, counterpart journal items for all "
+"outgoing stock moves will be posted in this account, unless there is a "
+"specific valuation account set on the destination location. This is the "
+"default value for all products in this category. It can also directly be set "
+"on each product"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_8
msgid "Non European Customers"
-msgstr "Clientes no europeos"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:76
-#: code:addons/stock/product.py:90
-#: code:addons/stock/product.py:93
-#: code:addons/stock/product.py:100
-#: code:addons/stock/product.py:121
-#: code:addons/stock/product.py:147
-#: code:addons/stock/stock.py:2006
-#: code:addons/stock/stock.py:2009
-#: code:addons/stock/stock.py:2012
-#: code:addons/stock/stock.py:2015
-#: code:addons/stock/stock.py:2018
-#: code:addons/stock/stock.py:2021
-#: code:addons/stock/stock.py:2339
+#: code:addons/stock/product.py:75 code:addons/stock/product.py:89
+#: code:addons/stock/product.py:92 code:addons/stock/product.py:99
+#: code:addons/stock/product.py:120 code:addons/stock/product.py:146
+#: code:addons/stock/stock.py:2116 code:addons/stock/stock.py:2119
+#: code:addons/stock/stock.py:2122 code:addons/stock/stock.py:2125
+#: code:addons/stock/stock.py:2128 code:addons/stock/stock.py:2131
+#: code:addons/stock/stock.py:2445
#: code:addons/stock/wizard/stock_fill_inventory.py:47
#: code:addons/stock/wizard/stock_splitinto.py:49
#: code:addons/stock/wizard/stock_splitinto.py:53
#, python-format
msgid "Error!"
-msgstr "¡Error!"
-
-#. module: stock
-#: code:addons/stock/stock.py:2021
-#, python-format
-msgid ""
-"There is no inventory variation account defined on the product category: "
-"\"%s\" (id: %d)"
msgstr ""
-"No se ha definido una cuenta de variación de inventario en la categoría del "
-"producto: \"%s\" (id: %d)"
#. module: stock
#: view:stock.inventory.merge:0
msgid "Do you want to merge theses inventories?"
-msgstr "¿Desea fusionar estos inventarios?"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0
-#: selection:stock.inventory,state:0
-#: selection:stock.move,state:0
-#: selection:stock.picking,state:0
+#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
+#: selection:stock.move,state:0 selection:stock.picking,state:0
msgid "Cancelled"
-msgstr "Cancelado"
+msgstr ""
#. module: stock
-#: view:stock.move:0
+#: view:stock.picking:0
+msgid "Confirmed Delivery Orders"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0 field:stock.partial.move,picking_id:0
+#: field:stock.partial.picking,picking_id:0
msgid "Picking"
-msgstr "Albarán"
+msgstr ""
#. module: stock
#: help:stock.picking,move_type:0
msgid "It specifies goods to be delivered all at once or by direct delivery"
-msgstr "Indica si las mercancías se enviarán todas a la vez o directamente."
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_invoice_onshipping.py:85
+#: code:addons/stock/wizard/stock_invoice_onshipping.py:96
#, python-format
msgid "This picking list does not require invoicing."
-msgstr "Este albarán no requiere facturación."
+msgstr ""
#. module: stock
#: selection:report.stock.move,type:0
#: selection:stock.location,chained_picking_type:0
#: selection:stock.picking,type:0
msgid "Getting Goods"
-msgstr "Recepción mercancías"
+msgstr ""
#. module: stock
#: help:stock.location,chained_location_type:0
@@ -3424,36 +3205,39 @@ msgid ""
"* Fixed Location: The chained location is taken from the next field: Chained "
"Location if Fixed."
msgstr ""
-"Determina si esta ubicación está encadenada a otra, por ejemplo cualquier "
-"producto que entre en esta ubicación debe ir a la siguiente ubicación "
-"encadenada. La ubicación encadenada se determina en función del tipo: \n"
-"*Ninguna: No se encadena con ninguna.\n"
-"*Cliente: Se utiliza la ubicación encadenada definida en el campo Ubicación "
-"del cliente del formulario del cliente especificado en el albarán de los "
-"productos entrantes.\n"
-"*Ubicación fija: Se utiliza la ubicación encadenada del siguiente campo: "
-"Ubicación encadenada si fija."
#. module: stock
#: code:addons/stock/wizard/stock_inventory_merge.py:43
#: code:addons/stock/wizard/stock_inventory_merge.py:63
+#: code:addons/stock/wizard/stock_partial_picking.py:148
+#: code:addons/stock/wizard/stock_partial_picking.py:159
#, python-format
msgid "Warning"
-msgstr "Advertencia"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1318
-#: code:addons/stock/stock.py:2589
+#: code:addons/stock/stock.py:1348
#, python-format
msgid "is done."
-msgstr "está realizado."
+msgstr ""
#. module: stock
+#: field:stock.production.lot.revision,date:0
+msgid "Revision Date"
+msgstr ""
+
+#. module: stock
+#: view:board.board:0
+#: model:ir.actions.act_window,name:stock.action_outgoing_product_board
#: model:ir.actions.act_window,name:stock.action_picking_tree
-#: model:ir.ui.menu,name:stock.menu_action_picking_tree
-#: view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_action_picking_tree view:stock.picking:0
msgid "Delivery Orders"
-msgstr "Albaranes de salida"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Delivery orders already processed"
+msgstr ""
#. module: stock
#: help:res.partner,property_stock_customer:0
@@ -3461,126 +3245,126 @@ msgid ""
"This stock location will be used, instead of the default one, as the "
"destination location for goods you send to this partner"
msgstr ""
-"Esta ubicación de stock será utilizada, en lugar de la ubicación por "
-"defecto, como la ubicación de destino para enviar mercancías a esta empresa"
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0
-#: selection:stock.inventory,state:0
+#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
#: view:stock.picking:0
-#: selection:stock.picking,state:0
msgid "Confirmed"
-msgstr "Confirmado"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Confirm"
-msgstr "Confirmar"
+msgstr ""
#. module: stock
-#: help:stock.location,icon:0
-msgid "Icon show in hierarchical tree view"
-msgstr "Icono mostrado en la vista de árbol jerárquica."
+#: view:stock.picking:0
+msgid "Check Availability"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_view_stock_merge_inventories
#: view:stock.inventory.merge:0
msgid "Merge Inventories"
-msgstr "Fusionar inventarios"
+msgstr ""
#. module: stock
#: help:stock.change.product.qty,new_quantity:0
msgid "This quantity is expressed in the Default UoM of the product."
-msgstr "Esta cantidad está expresada en la UdM por defecto del producto."
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Reception:"
-msgstr "Recepción:"
+msgstr ""
#. module: stock
#: help:stock.location,scrap_location:0
msgid ""
"Check this box to allow using this location to put scrapped/damaged goods."
msgstr ""
-"Marque esta opción para permitir utilizar esta ubicación para poner "
-"mercancías desechadas/defectuosas."
#. module: stock
#: model:ir.actions.act_window,name:stock.act_relate_picking
msgid "Related Picking"
-msgstr "Albarán relacionado"
+msgstr ""
+
+#. module: stock
+#: view:report.stock.move:0
+msgid "Year Planned"
+msgstr ""
#. module: stock
#: view:report.stock.move:0
msgid "Total outgoing quantity"
-msgstr "Cantidad de salida total"
+msgstr ""
#. module: stock
-#: field:stock.picking,backorder_id:0
-msgid "Back Order of"
-msgstr "Albarán pendiente de"
+#: selection:stock.move,state:0 selection:stock.picking,state:0
+msgid "New"
+msgstr ""
#. module: stock
-#: help:stock.move.memory.in,cost:0
-#: help:stock.move.memory.out,cost:0
+#: help:stock.partial.move.line,cost:0 help:stock.partial.picking.line,cost:0
msgid "Unit Cost for this product line"
-msgstr "Coste unidad para esta línea de producto"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_product_category
#: view:report.stock.inventory:0
-#: field:report.stock.inventory,product_categ_id:0
-#: view:report.stock.move:0
+#: field:report.stock.inventory,product_categ_id:0 view:report.stock.move:0
#: field:report.stock.move,categ_id:0
msgid "Product Category"
-msgstr "Categoría de producto"
-
-#. module: stock
-#: code:addons/stock/wizard/stock_change_product_qty.py:88
-#, python-format
-msgid "INV: %s"
msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.next_id_61
msgid "Reporting"
-msgstr "Informe"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1313
+#: code:addons/stock/stock.py:1343
#, python-format
msgid " for the "
-msgstr " para el "
+msgstr ""
#. module: stock
#: view:stock.split.into:0
msgid "Quantity to Leave in the Current Pack"
-msgstr "Cantidad a dejar en el paquete actual"
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0
+msgid "Stock available to be delivered"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_stock_invoice_onshipping
#: view:stock.invoice.onshipping:0
msgid "Create invoice"
-msgstr "Crear factura"
+msgstr ""
+
+#. module: stock
+#: view:stock.picking:0
+msgid "Confirmed Internal Moves"
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_configuration
msgid "Configuration"
-msgstr "Configuración"
+msgstr ""
#. module: stock
#: field:stock.inventory.line.split,use_exist:0
#: field:stock.move.split,use_exist:0
msgid "Existing Lots"
-msgstr "Lotes existentes"
+msgstr ""
#. module: stock
-#: field:product.product,location_id:0
#: view:stock.location:0
msgid "Stock Location"
-msgstr "Ubicación de stock"
+msgstr ""
#. module: stock
#: help:stock.change.standard.price,new_price:0
@@ -3591,105 +3375,94 @@ msgid ""
"If cost price is decreased, stock variation account will be creadited and "
"stock input account will be debited."
msgstr ""
-"Si el precio de coste se incrementa, la cuenta la variación de existencias "
-"irá al debe y la cuenta de salida de stock irá al haber con el valor = "
-"(diferencia de cantidad * cantidad disponible).\n"
-"Si el precio de coste se reduce, la cuenta la variación de existencias irá "
-"al haber y la cuenta de entrada de stock irá al debe."
#. module: stock
#: field:stock.location,chained_journal_id:0
msgid "Chaining Journal"
-msgstr "Diario encadenamiento"
+msgstr ""
+
+#. module: stock
+#: model:ir.actions.report.xml,name:stock.report_picking_list
+msgid "Packing list"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:732
+#: code:addons/stock/stock.py:738
#, python-format
msgid "Not enough stock, unable to reserve the products."
-msgstr "No suficiente stock, no ha sido posible reservar los productos."
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_customers
msgid "Customers"
-msgstr "Clientes"
+msgstr ""
+
+#. module: stock
+#: selection:stock.move,state:0 selection:stock.picking,state:0
+msgid "Waiting Availability"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:1317
+#: code:addons/stock/stock.py:1347
#, python-format
msgid "is cancelled."
-msgstr "está cancelado."
+msgstr ""
#. module: stock
#: view:stock.inventory.line:0
msgid "Stock Inventory Lines"
-msgstr "Líneas regularización de inventario"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_partial_picking.py:97
-#, python-format
-msgid "Process Document"
-msgstr "Procesar documento"
+#: view:stock.move:0
+msgid "Waiting "
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:368
+#: code:addons/stock/product.py:427
#, python-format
msgid "Future Deliveries"
-msgstr "Entregas futuras"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "Additional info"
-msgstr "Información adicional"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: field:stock.move,tracking_id:0
+#: view:stock.move:0 field:stock.move,tracking_id:0
msgid "Pack"
-msgstr "Paquete"
+msgstr ""
#. module: stock
-#: view:stock.move:0
-#: view:stock.picking:0
+#: view:stock.move:0 view:stock.picking:0
msgid "Date Expected"
-msgstr "Fecha prevista"
-
-#. module: stock
-#: model:ir.actions.act_window,help:stock.action_picking_tree4
-msgid ""
-"The Incoming Shipments is the list of all orders you will receive from your "
-"supplier. An incoming shipment contains a list of products to be received "
-"according to the original purchase order. You can validate the shipment "
-"totally or partially."
msgstr ""
-"Los albaranes de entrada son la lista de todos los pedidos que va a recibir "
-"de su proveedor. Un albarán de entrada contiene la lista de productos a "
-"recibir en función del pedido de compra original. Puede validar el envío "
-"totalmente o parcialmente."
#. module: stock
#: field:stock.move,auto_validate:0
msgid "Auto Validate"
-msgstr "Auto validar"
+msgstr ""
#. module: stock
#: report:stock.picking.list:0
msgid "Weight"
-msgstr "Peso"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_product_template
msgid "Product Template"
-msgstr "Plantilla producto"
+msgstr ""
#. module: stock
#: selection:report.stock.move,month:0
msgid "December"
-msgstr "Diciembre"
+msgstr ""
#. module: stock
-#: selection:stock.location,chained_auto_packing:0
-msgid "Automatic Move"
-msgstr "Movimiento automático"
+#: view:stock.production.lot:0
+msgid "Available Product Lots"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_move_form2
@@ -3698,19 +3471,16 @@ msgid ""
"specific product. You can filter on the product to see all the past or "
"future movements for the product."
msgstr ""
-"Este menú le da la trazabilidad completa de las operaciones de inventario "
-"sobre un producto específico. Puede filtrar sobre el producto para ver todos "
-"los movimientos pasados o futuros para el producto."
#. module: stock
#: view:stock.picking:0
msgid "Return Products"
-msgstr "Devolver productos"
+msgstr ""
#. module: stock
#: view:stock.inventory:0
msgid "Validate Inventory"
-msgstr "Validar inventario"
+msgstr ""
#. module: stock
#: help:stock.move,price_currency_id:0
@@ -3718,69 +3488,62 @@ msgid ""
"Technical field used to record the currency chosen by the user during a "
"picking confirmation (when average price costing method is used)"
msgstr ""
-"Campo técnico utilizado para registrar la moneda elegida por el usuario "
-"durante una confirmación de albarán (cuando se utiliza el método de precio "
-"medio de coste)."
+
+#. module: stock
+#: code:addons/stock/wizard/stock_fill_inventory.py:53
+#, python-format
+msgid "Stock Inventory is already Validated."
+msgstr ""
#. module: stock
#: model:ir.ui.menu,name:stock.menu_stock_products_moves
msgid "Products Moves"
-msgstr "Movimientos de productos"
+msgstr ""
#. module: stock
#: selection:stock.picking,invoice_state:0
msgid "Invoiced"
-msgstr "Facturado"
-
-#. module: stock
-#: field:stock.move,address_id:0
-msgid "Destination Address"
-msgstr "Dirección destino"
+msgstr ""
#. module: stock
#: field:stock.picking,max_date:0
msgid "Max. Expected Date"
-msgstr "Fecha prevista máx."
+msgstr ""
#. module: stock
#: field:stock.picking,auto_picking:0
msgid "Auto-Picking"
-msgstr "Auto-Albarán"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_shop1
msgid "Shop 2"
-msgstr "Tienda 2"
+msgstr ""
#. module: stock
-#: constraint:res.partner:0
-msgid "Error ! You can not create recursive associated members."
-msgstr "¡Error! No puede crear miembros asociados recursivos."
+#: field:stock.location,chained_auto_packing:0
+msgid "Chaining Type"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: view:report.stock.move:0
-#: selection:report.stock.move,type:0
-#: view:stock.location:0
+#: view:report.stock.inventory:0 view:report.stock.move:0
+#: selection:report.stock.move,type:0 view:stock.location:0
#: selection:stock.location,chained_picking_type:0
#: selection:stock.picking,type:0
msgid "Internal"
-msgstr "Interno"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,state:0
-#: selection:report.stock.move,state:0
-#: selection:stock.inventory,state:0
-#: selection:stock.move,state:0
-#: selection:stock.picking,state:0
+#: selection:report.stock.move,state:0 selection:stock.inventory,state:0
msgid "Draft"
-msgstr "Borrador"
+msgstr ""
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_stock_inventory_move
#: report:stock.inventory.move:0
msgid "Stock Inventory"
-msgstr "Inventario stock"
+msgstr ""
#. module: stock
#: help:report.stock.inventory,state:0
@@ -3791,27 +3554,17 @@ msgid ""
" When the picking it done the state is 'Done'. \n"
"The state is 'Waiting' if the move is waiting for another one."
msgstr ""
-"Cuando se crea un movimiento de stock está en estado 'Borrador'.\n"
-" Después se establece en estado 'Confirmado'.\n"
-" Si está reservado en stock se establece como 'Reservado'.\n"
-" Cuando el albarán se envía el estado es 'Realizado'. \n"
-"El estado es 'En espera' si el movimiento está a la espera de otro."
#. module: stock
-#: view:board.board:0
-msgid "Outgoing Products Delay"
-msgstr "Retraso albaranes salida"
-
-#. module: stock
-#: field:stock.move.split.lines,use_exist:0
-msgid "Existing Lot"
-msgstr "Lote existente"
+#: view:stock.picking:0
+msgid "Create Invoice"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:194
+#: code:addons/stock/wizard/stock_return_picking.py:189
#, python-format
msgid "Please specify at least one non-zero quantity!"
-msgstr "¡Introduzca por lo menos una cantidad que no sea cero!"
+msgstr ""
#. module: stock
#: help:product.template,property_stock_procurement:0
@@ -3819,65 +3572,66 @@ msgid ""
"For the current product, this stock location will be used, instead of the "
"default one, as the source location for stock moves generated by procurements"
msgstr ""
-"Para los productos actuales, esta ubicación de stock se utilizará, en lugar "
-"de la por defecto, como la ubicación de origen para los movimientos de stock "
-"generados por los abastecimientos."
#. module: stock
-#: code:addons/stock/stock.py:1316
+#: code:addons/stock/stock.py:1346
#, python-format
msgid "is ready to process."
-msgstr "preparado para procesar."
+msgstr ""
#. module: stock
#: help:stock.picking,origin:0
msgid "Reference of the document that produced this picking."
-msgstr "Referencia del documento que ha generado este albarán."
+msgstr ""
#. module: stock
#: field:stock.fill.inventory,set_stock_zero:0
msgid "Set to zero"
-msgstr "Inicializar a cero"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_invoice_onshipping.py:87
+#: model:res.groups,name:stock.group_stock_user
+msgid "User"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/wizard/stock_invoice_onshipping.py:98
#, python-format
msgid "None of these picking lists require invoicing."
-msgstr "Ninguno de estos albaranes requiere facturación."
+msgstr ""
#. module: stock
#: selection:report.stock.move,month:0
msgid "November"
-msgstr "Noviembre"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:101
-#: code:addons/stock/stock.py:2018
+#: code:addons/stock/product.py:100 code:addons/stock/stock.py:2128
#, python-format
msgid "There is no journal defined on the product category: \"%s\" (id: %d)"
msgstr ""
-"No se ha definido un diario en la categoría de producto: \"%s\" (id: %d)"
#. module: stock
-#: code:addons/stock/product.py:382
+#: code:addons/stock/product.py:441
#, python-format
msgid "Unplanned Qty"
-msgstr "Ctdad no planificada"
+msgstr ""
#. module: stock
#: field:stock.location,chained_company_id:0
msgid "Chained Company"
-msgstr "Compañía encadenada"
+msgstr ""
#. module: stock
-#: view:stock.picking:0
-msgid "Check Availability"
-msgstr "Comprobar disponibilidad"
+#: help:stock.location,icon:0
+msgid "Icon show in hierarchical tree view"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "January"
-msgstr "Enero"
+msgstr ""
#. module: stock
#: help:product.product,track_incoming:0
@@ -3885,43 +3639,35 @@ msgid ""
"Forces to specify a Production Lot for all moves containing this product and "
"coming from a Supplier Location"
msgstr ""
-"Fuerza a introducir un lote de producción para todos los movimientos que "
-"contiene este producto y procedente de una ubicación de proveedores."
#. module: stock
#: model:ir.actions.act_window,name:stock.act_product_stock_move_futur_open
msgid "Future Stock Moves"
-msgstr "Movimientos de stock futuros"
+msgstr ""
#. module: stock
#: field:stock.move,move_history_ids2:0
msgid "Move History (parent moves)"
-msgstr "Historial movimientos (mov. padres)"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:364
+#: code:addons/stock/product.py:423
#, python-format
msgid "Future Stock"
-msgstr "Stock futuro"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:512
-#: code:addons/stock/stock.py:1120
-#: code:addons/stock/stock.py:1128
-#: code:addons/stock/wizard/stock_invoice_onshipping.py:101
+#: code:addons/stock/stock.py:513 code:addons/stock/stock.py:1149
+#: code:addons/stock/stock.py:1157
+#: code:addons/stock/wizard/stock_invoice_onshipping.py:112
#, python-format
msgid "Error"
-msgstr "Error"
-
-#. module: stock
-#: field:stock.ups.final,xmlfile:0
-msgid "XML File"
-msgstr "Fichero XML"
+msgstr ""
#. module: stock
#: view:stock.change.product.qty:0
msgid "Select Quantity"
-msgstr "Seleccionar cantidad"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,help:stock.action_location_tree
@@ -3930,54 +3676,48 @@ msgid ""
"click on a location to get the list of the products and their stock level in "
"this particular location and all its children."
msgstr ""
-"Esta es la estructura de los almacenes y ubicaciones de su compañía. Puede "
-"pulsar sobre una ubicación para obtener la lista de los productos y su nivel "
-"de stock en esta ubicación específica y todos sus hijas."
#. module: stock
#: model:res.request.link,name:stock.req_link_tracking
#: field:stock.change.product.qty,prodlot_id:0
#: field:stock.inventory.line,prod_lot_id:0
-#: report:stock.inventory.move:0
-#: field:stock.move,prodlot_id:0
-#: field:stock.move.memory.in,prodlot_id:0
-#: field:stock.move.memory.out,prodlot_id:0
-#: field:stock.move.split.lines.exist,prodlot_id:0
-#: view:stock.production.lot:0
+#: field:stock.inventory.line.split.lines,name:0
+#: field:stock.inventory.line.split.lines,prodlot_id:0
+#: report:stock.inventory.move:0 field:stock.move,prodlot_id:0
+#: field:stock.move.split.lines,name:0
+#: field:stock.move.split.lines,prodlot_id:0
+#: field:stock.partial.move.line,prodlot_id:0
+#: field:stock.partial.picking.line,prodlot_id:0 view:stock.production.lot:0
#: field:stock.production.lot,name:0
msgid "Production Lot"
-msgstr "Lote de producción"
+msgstr ""
#. module: stock
-#: model:ir.ui.menu,name:stock.menu_traceability
-#: view:stock.move:0
-#: view:stock.picking:0
-#: view:stock.production.lot:0
-#: view:stock.tracking:0
+#: model:ir.ui.menu,name:stock.menu_traceability view:stock.move:0
+#: view:stock.picking:0 view:stock.production.lot:0 view:stock.tracking:0
msgid "Traceability"
-msgstr "Trazabilidad"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "To invoice"
-msgstr "Para facturar"
+msgstr ""
#. module: stock
#: model:ir.actions.act_window,name:stock.action_location_form
-#: model:ir.ui.menu,name:stock.menu_action_location_form
-#: view:stock.picking:0
+#: model:ir.ui.menu,name:stock.menu_action_location_form view:stock.picking:0
msgid "Locations"
-msgstr "Ubicaciones"
+msgstr ""
#. module: stock
#: view:stock.picking:0
msgid "General Information"
-msgstr "Información general"
+msgstr ""
#. module: stock
#: field:stock.production.lot,prefix:0
msgid "Prefix"
-msgstr "Prefijo"
+msgstr ""
#. module: stock
#: code:addons/stock/wizard/stock_splitinto.py:53
@@ -3986,1088 +3726,259 @@ msgid ""
"Total quantity after split exceeds the quantity to split for this product: "
"\"%s\" (id: %d)"
msgstr ""
-"Cantidad total después de que la división exceda la cantidad para dividir "
-"para este producto: \"%s\" (id: %d)"
#. module: stock
-#: view:stock.move:0
-#: field:stock.partial.move,product_moves_in:0
-#: field:stock.partial.move,product_moves_out:0
-#: field:stock.partial.picking,product_moves_in:0
-#: field:stock.partial.picking,product_moves_out:0
+#: help:product.template,property_stock_account_input:0
+msgid ""
+"When doing real-time inventory valuation, counterpart journal items for all "
+"incoming stock moves will be posted in this account, unless there is a "
+"specific valuation account set on the source location. When not set on the "
+"product, the one from the product category is used."
+msgstr ""
+
+#. module: stock
+#: view:stock.move:0 field:stock.partial.move,move_ids:0
+#: field:stock.return.picking,product_return_moves:0
msgid "Moves"
-msgstr "Movimientos"
+msgstr ""
#. module: stock
-#: view:report.stock.move:0
-#: field:report.stock.move,location_dest_id:0
+#: view:report.stock.move:0 field:report.stock.move,location_dest_id:0
+#: field:stock.partial.move.line,location_dest_id:0
+#: field:stock.partial.picking.line,location_dest_id:0
#: field:stock.picking,location_dest_id:0
msgid "Dest. Location"
-msgstr "Ubicación destino"
+msgstr ""
#. module: stock
#: help:stock.move,product_packaging:0
msgid ""
"It specifies attributes of packaging like type, quantity of packaging,etc."
msgstr ""
-"Indica los atributos del empaquetado como el tipo, la cantidad de paquetes, "
-"etc."
-
-#. module: stock
-#: code:addons/stock/stock.py:2386
-#, python-format
-msgid "Product '%s' is consumed with '%s' quantity."
-msgstr ""
-
-#. module: stock
-#: code:addons/stock/stock.py:2595
-#, python-format
-msgid "Inventory '%s' is done."
-msgstr ""
#. module: stock
#: 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"
+msgstr ""
#. module: stock
#: view:stock.move:0
msgid "Expected"
-msgstr "Previsto"
+msgstr ""
#. module: stock
#: selection:report.stock.inventory,location_type:0
#: model:stock.location,name:stock.location_production
#: selection:stock.location,usage:0
msgid "Production"
-msgstr "Producción"
+msgstr ""
#. module: stock
#: view:stock.split.into:0
msgid "Split Move"
-msgstr "Dividir movimiento"
+msgstr ""
#. module: stock
-#: code:addons/stock/wizard/stock_return_picking.py:92
+#: field:stock.picking,backorder_id:0
+msgid "Back Order of"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/wizard/stock_return_picking.py:106
#, python-format
msgid ""
"There are no products to return (only lines in Done state and not fully "
"returned yet can be returned)!"
msgstr ""
-"¡No hay productos para devolver (sólo las líneas en estado Realizado y "
-"todavía no devueltas totalmente pueden ser devueltas)!"
+
+#. module: stock
+#: view:report.stock.move:0
+msgid "Future Stock-Moves"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_move_split
msgid "Split in Production lots"
-msgstr "Dividir en lotes de producción"
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/wizard/stock_move.py:213
+#, python-format
+msgid "Processing Error"
+msgstr ""
#. module: stock
#: view:report.stock.inventory:0
msgid "Real"
-msgstr "Real"
+msgstr ""
#. module: stock
-#: report:stock.picking.list:0
-#: view:stock.production.lot.revision:0
+#: report:stock.picking.list:0 view:stock.production.lot.revision:0
#: field:stock.production.lot.revision,description:0
msgid "Description"
-msgstr "Descripción"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "May"
-msgstr "Mayo"
-
-#. module: stock
-#: code:addons/stock/wizard/stock_partial_move.py:133
-#, python-format
-msgid "Deliver"
-msgstr "Enviar"
-
-#. module: stock
-#: help:product.template,property_stock_account_output:0
-msgid ""
-"When doing real-time inventory valuation, counterpart Journal Items for all "
-"outgoing stock moves will be posted in this account. If not set on the "
-"product, the one from the product category is used."
msgstr ""
-"Al hacer la valoración de inventario en tiempo real, la contrapartida de los "
-"asientos del diario para todos los movimientos de stock de salida se creará "
-"en esta cuenta. Si no se indica en el producto, se utilizará la cuenta de la "
-"categoría del producto."
#. module: stock
-#: model:ir.actions.act_window,name:stock.action5
-#: view:stock.tracking:0
+#: model:ir.actions.act_window,name:stock.action5 view:stock.tracking:0
msgid "Upstream traceability"
-msgstr "Trazabilidad hacia arriba"
+msgstr ""
#. module: stock
#: model:ir.actions.report.xml,name:stock.report_location_overview_all
#: report:lot.stock.overview_all:0
msgid "Location Content"
-msgstr "Contenido ubicación"
+msgstr ""
#. module: stock
-#: code:addons/stock/product.py:388
+#: code:addons/stock/product.py:447
#, python-format
msgid "Produced Qty"
-msgstr "Ctdad producida"
+msgstr ""
#. module: stock
#: field:product.category,property_stock_account_output_categ:0
#: field:product.template,property_stock_account_output:0
#: field:stock.change.standard.price,stock_account_output:0
-#: field:stock.location,valuation_out_account_id:0
msgid "Stock Output Account"
-msgstr "Cuenta salida stock"
+msgstr ""
#. module: stock
#: field:stock.location,chained_location_type:0
msgid "Chained Location Type"
-msgstr "Tipo ubicaciones encadenadas"
+msgstr ""
#. module: stock
#: model:ir.model,name:stock.model_stock_report_prodlots
msgid "Stock report by production lots"
-msgstr "Reporte de inventario por lotes de producción"
+msgstr ""
#. module: stock
-#: view:stock.location:0
-#: selection:stock.location,chained_location_type:0
+#: view:stock.location:0 selection:stock.location,chained_location_type:0
#: view:stock.move:0
msgid "Customer"
-msgstr "Cliente"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "February"
-msgstr "Febrero"
+msgstr ""
#. module: stock
#: view:stock.production.lot:0
msgid "Production Lot Identification"
-msgstr "Identificación lote de producción"
+msgstr ""
+
+#. module: stock
+#: model:stock.location,name:stock.location_refrigerator_small
+msgid "Small Refrigerator"
+msgstr ""
#. module: stock
-#: field:stock.location,scrap_location:0
-#: view:stock.move.scrap:0
+#: model:stock.location,name:stock.location_convenience_shop
+msgid "Convenient Store"
+msgstr ""
+
+#. module: stock
+#: field:stock.location,scrap_location:0 view:stock.move.scrap:0
msgid "Scrap Location"
-msgstr "Ubicación desecho"
+msgstr ""
#. module: stock
+#: selection:report.stock.inventory,month:0
#: selection:report.stock.move,month:0
msgid "April"
-msgstr "Abril"
+msgstr ""
#. module: stock
-#: view:report.stock.inventory:0
-#: view:stock.move:0
+#: view:report.stock.inventory:0 view:stock.move:0
msgid "Future"
-msgstr "Futuro"
+msgstr ""
#. module: stock
#: field:stock.invoice.onshipping,invoice_date:0
msgid "Invoiced date"
-msgstr "Fecha facturado"
+msgstr ""
#. module: stock
-#: code:addons/stock/stock.py:732
-#: code:addons/stock/wizard/stock_fill_inventory.py:106
-#: code:addons/stock/wizard/stock_invoice_onshipping.py:85
-#: code:addons/stock/wizard/stock_invoice_onshipping.py:87
-#: code:addons/stock/wizard/stock_return_picking.py:77
-#: code:addons/stock/wizard/stock_return_picking.py:92
-#: code:addons/stock/wizard/stock_return_picking.py:194
+#: code:addons/stock/stock.py:738
+#: code:addons/stock/wizard/stock_fill_inventory.py:116
+#: code:addons/stock/wizard/stock_invoice_onshipping.py:96
+#: code:addons/stock/wizard/stock_invoice_onshipping.py:98
+#: code:addons/stock/wizard/stock_return_picking.py:99
+#: code:addons/stock/wizard/stock_return_picking.py:106
+#: code:addons/stock/wizard/stock_return_picking.py:189
#, python-format
msgid "Warning !"
-msgstr "¡Aviso!"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_output
msgid "Output"
-msgstr "Salida"
+msgstr ""
#. module: stock
-#: selection:stock.move.split.lines,action:0
-msgid "Keep in one lot"
-msgstr "Mantener en un lote"
+#: help:stock.tracking,name:0
+msgid ""
+"By default, the pack reference is generated following the sscc standard. "
+"(Serial number + 1 check digit)"
+msgstr ""
#. module: stock
-#: view:product.product:0
-msgid "Cost Price:"
-msgstr "Precio coste:"
+#: constraint:res.partner:0
+msgid "Error ! You cannot create recursive associated members."
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/wizard/stock_partial_picking.py:159
+#, python-format
+msgid ""
+"The rounding of the initial uom does not allow you to ship \"%s %s\", as it "
+"would let a quantity of \"%s %s\" to ship and only roundings of \"%s %s\" is "
+"accepted by the uom."
+msgstr ""
+
+#. module: stock
+#: code:addons/stock/wizard/stock_move.py:213
+#, python-format
+msgid ""
+"Production lot quantity %d of %s is larger than available quantity (%d) !"
+msgstr ""
+
+#. module: stock
+#: constraint:product.category:0
+msgid "Error ! You cannot create recursive categories."
+msgstr ""
#. module: stock
#: help:stock.move,move_dest_id:0
msgid "Optional: next stock move when chaining them"
-msgstr "Opcional: Siguiente movimiento de stock cuando se encadenan."
+msgstr ""
#. module: stock
-#: view:report.stock.move:0
-#: field:report.stock.move,year:0
+#: view:report.stock.inventory:0 field:report.stock.inventory,year:0
+#: view:report.stock.move:0 field:report.stock.move,year:0
msgid "Year"
-msgstr "Año"
+msgstr ""
#. module: stock
#: model:stock.location,name:stock.stock_location_locations
msgid "Physical Locations"
-msgstr "Ubicaciones físicas"
+msgstr ""
#. module: stock
-#: model:ir.model,name:stock.model_stock_partial_move
-msgid "Partial Move"
-msgstr "Movimiento parcial"
+#: view:stock.picking:0 selection:stock.picking,state:0
+msgid "Ready to Process"
+msgstr ""
#. module: stock
-#: help:stock.location,posx:0
-#: help:stock.location,posy:0
+#: help:stock.location,posx:0 help:stock.location,posy:0
#: help:stock.location,posz:0
msgid "Optional localization details, for information purpose only"
-msgstr "Detalles de ubicación opcionales, sólo para fines de información."
-
-#~ msgid "Sub Products"
-#~ msgstr "Sub productos"
-
-#~ msgid "STOCK_SAVE"
-#~ msgstr "STOCK_SAVE"
-
-#~ msgid "STOCK_QUIT"
-#~ msgstr "STOCK_QUIT"
-
-#~ msgid "STOCK_CANCEL"
-#~ msgstr "STOCK_CANCEL"
-
-#~ msgid "STOCK_NEW"
-#~ msgstr "STOCK_NEW"
-
-#~ msgid "STOCK_UNDERLINE"
-#~ msgstr "STOCK_UNDERLINE"
-
-#~ msgid "STOCK_PREFERENCES"
-#~ msgstr "STOCK_PREFERENCES"
-
-#~ msgid "LIFO"
-#~ msgstr "LIFO"
-
-#~ msgid "terp-account"
-#~ msgstr "terp-account"
-
-#~ msgid "STOCK_SORT_ASCENDING"
-#~ msgstr "STOCK_SORT_ASCENDING"
-
-#~ msgid "Revision"
-#~ msgstr "Revisión"
-
-#~ msgid "STOCK_MEDIA_FORWARD"
-#~ msgstr "STOCK_MEDIA_FORWARD"
-
-#~ msgid "STOCK_ZOOM_100"
-#~ msgstr "STOCK_ZOOM_100"
-
-#~ msgid "Return packing"
-#~ msgstr "Devolución de paquete"
-
-#~ msgid "Fill Inventory for specific location"
-#~ msgstr "Rellenar inventario para una determinada ubicación"
-
-#~ msgid "Amount"
-#~ msgstr "Cantidad"
-
-#~ msgid "Products Received"
-#~ msgstr "Productos recibidos"
-
-#~ msgid "Move History"
-#~ msgstr "Histórico movimientos"
-
-#~ msgid "Make Parcel"
-#~ msgstr "Hacer envíos parciales"
-
-#~ msgid "STOCK_GOTO_TOP"
-#~ msgstr "STOCK_GOTO_TOP"
-
-#~ msgid "STOCK_ABOUT"
-#~ msgstr "STOCK_ABOUT"
-
-#~ msgid "terp-hr"
-#~ msgstr "terp-hr"
-
-#~ msgid "terp-purchase"
-#~ msgstr "terp-purchase"
-
-#~ msgid "STOCK_DND"
-#~ msgstr "STOCK_DND"
-
-#~ msgid "Products Sent"
-#~ msgstr "Productos enviados"
-
-#~ msgid "STOCK_GOTO_FIRST"
-#~ msgstr "STOCK_GOTO_FIRST"
-
-#~ msgid "Serial"
-#~ msgstr "Nº serie"
-
-#~ msgid "STOCK_FLOPPY"
-#~ msgstr "STOCK_FLOPPY"
-
-#~ msgid "Stock location"
-#~ msgstr "Ubicación de existencias"
-
-#~ msgid "Unreceived Products"
-#~ msgstr "Productos no recibidos"
-
-#~ msgid "Status"
-#~ msgstr "Estado"
-
-#~ msgid "Include all childs for the location"
-#~ msgstr "Incluir todos los descendientes de la ubicación"
-
-#~ msgid "Track line"
-#~ msgstr "Línea de seguimiento"
-
-#~ msgid "STOCK_BOLD"
-#~ msgstr "STOCK_BOLD"
-
-#~ msgid "terp-graph"
-#~ msgstr "terp-graph"
-
-#~ msgid "Stock Level 1"
-#~ msgstr "Nivel de Existencias 1"
-
-#~ msgid "STOCK_MEDIA_REWIND"
-#~ msgstr "STOCK_MEDIA_REWIND"
-
-#~ msgid "Stock Properties"
-#~ msgstr "Propiedades de stock"
-
-#~ msgid "Draft Moves"
-#~ msgstr "Movimientos borrador"
-
-#~ msgid "Product Id"
-#~ msgstr "Id producto"
-
-#~ msgid "Customer Invoice"
-#~ msgstr "Factura de cliente"
-
-#~ msgid "Force to use a Production Lot during production order"
-#~ msgstr ""
-#~ "Fuerza a utilizar un lote de producción durante la orden de producción"
-
-#~ msgid "STOCK_CUT"
-#~ msgstr "STOCK_CUT"
-
-#~ msgid ""
-#~ "For the current product (template), this stock location will be used, "
-#~ "instead of the default one, as the source location for stock moves generated "
-#~ "when you do an inventory"
-#~ msgstr ""
-#~ "Para el actual producto (plantilla), esta ubicación de existencia se "
-#~ "utilizará, en lugar de la por defecto, como la ubicación origen para "
-#~ "movimientos de stock generados cuando realice un inventario"
-
-#~ msgid "This account will be used to value the output stock"
-#~ msgstr "Esta cuenta será utilizada para calcular las salidas de existencias"
-
-#~ msgid "STOCK_ZOOM_FIT"
-#~ msgstr "STOCK_ZOOM_FIT"
-
-#~ msgid ""
-#~ "This journal will be used for the accounting move generated by stock move"
-#~ msgstr ""
-#~ "Este diario será utilizado para contabilizar un movimiento generado por un "
-#~ "movimiento de Existencias"
-
-#~ msgid "Calendar of Deliveries"
-#~ msgstr "Calendario de entregas"
-
-#~ msgid "STOCK_SAVE_AS"
-#~ msgstr "STOCK_SAVE_AS"
-
-#~ msgid "STOCK_DIALOG_ERROR"
-#~ msgstr "STOCK_DIALOG_ERROR"
-
-#~ msgid "Latest Date of Inventory"
-#~ msgstr "Última fecha de inventario"
-
-#~ msgid "STOCK_INDEX"
-#~ msgstr "STOCK_INDEX"
-
-#~ msgid "STOCK_GOTO_BOTTOM"
-#~ msgstr "STOCK_GOTO_BOTTOM"
-
-#~ msgid "Tracking Lot"
-#~ msgstr "Lote de seguimiento"
-
-#~ msgid "STOCK_GO_FORWARD"
-#~ msgstr "STOCK_GO_FORWARD"
-
-#~ msgid "STOCK_UNDELETE"
-#~ msgstr "STOCK_UNDELETE"
-
-#~ msgid "STOCK_EXECUTE"
-#~ msgstr "STOCK_EXECUTE"
-
-#~ msgid "STOCK_DIALOG_QUESTION"
-#~ msgstr "STOCK_DIALOG_QUESTION"
-
-#~ msgid "Tracking/Serial"
-#~ msgstr "Seguimiento/Número de serie"
-
-#~ msgid "STOCK_SELECT_FONT"
-#~ msgstr "STOCK_SELECT_FONT"
-
-#~ msgid "STOCK_PASTE"
-#~ msgstr "STOCK_PASTE"
-
-#~ msgid ""
-#~ "Tracking lot is the code that will be put on the logistical unit/pallet"
-#~ msgstr ""
-#~ "Lote de seguimiento es el código que se colocará en la unidad/palet "
-#~ "logístico."
-
-#~ msgid "Tracking Number"
-#~ msgstr "Número seguimiento"
-
-#~ msgid "terp-stock"
-#~ msgstr "terp-stock"
-
-#~ msgid "Packing List:"
-#~ msgstr "Albarán:"
-
-#~ msgid "STOCK_MEDIA_RECORD"
-#~ msgstr "STOCK_MEDIA_RECORD"
-
-#~ msgid "Non Assigned Products:"
-#~ msgstr "Productos no asignados:"
-
-#~ msgid "terp-report"
-#~ msgstr "terp-report"
-
-#~ msgid "Location Content (With children)"
-#~ msgstr "Contenido ubicación (con hijos)"
-
-#~ msgid "STOCK_FILE"
-#~ msgstr "STOCK_FILE"
-
-#~ msgid "STOCK_EDIT"
-#~ msgstr "STOCK_EDIT"
-
-#~ msgid "STOCK_CONNECT"
-#~ msgstr "STOCK_CONNECT"
-
-#~ msgid "STOCK_GO_DOWN"
-#~ msgstr "STOCK_GO_DOWN"
-
-#~ msgid "STOCK_OK"
-#~ msgstr "STOCK_OK"
-
-#~ msgid "New Internal Packing"
-#~ msgstr "Nuevo albarán interno"
-
-#~ msgid "Finished products"
-#~ msgstr "Productos finalizados"
-
-#~ msgid "Date create"
-#~ msgstr "Fecha creación"
-
-#~ msgid "Set to Zero"
-#~ msgstr "Fijar a cero"
-
-#~ msgid "All Stock Moves"
-#~ msgstr "Todos los movimientos de stock"
-
-#~ msgid "Invalid XML for View Architecture!"
-#~ msgstr "¡XML inválido para la definición de la vista!"
-
-#~ msgid "STOCK_HELP"
-#~ msgstr "STOCK_HELP"
-
-#~ msgid "This account will be used to value the input stock"
-#~ msgstr "Esta cuenta será utilizada para calcular el stock de entrada"
-
-#, python-format
-#~ msgid "Invoice state"
-#~ msgstr "Estado de la factura"
-
-#~ msgid "STOCK_UNDO"
-#~ msgstr "STOCK_UNDO"
-
-#~ msgid "Date Created"
-#~ msgstr "Fecha creación"
-
-#~ msgid "STOCK_GO_BACK"
-#~ msgstr "STOCK_GO_BACK"
-
-#~ msgid "STOCK_JUSTIFY_FILL"
-#~ msgstr "STOCK_JUSTIFY_FILL"
-
-#~ msgid "Allocation Method"
-#~ msgstr "Método asignación"
-
-#~ msgid "terp-administration"
-#~ msgstr "terp-administration"
-
-#~ msgid "STOCK_APPLY"
-#~ msgstr "STOCK_APPLY"
-
-#, python-format
-#~ msgid "Please select at least two inventories."
-#~ msgstr "Por favor, seleccione por lo menos dos inventarios."
-
-#~ msgid "Dest. Address"
-#~ msgstr "Dirección destinatario"
-
-#~ msgid "Periodical Inventory"
-#~ msgstr "Inventario periódico"
-
-#~ msgid "terp-crm"
-#~ msgstr "terp-crm"
-
-#~ msgid "STOCK_STRIKETHROUGH"
-#~ msgstr "STOCK_STRIKETHROUGH"
-
-#~ msgid "terp-partner"
-#~ msgstr "terp-partner"
-
-#~ msgid "Draft Periodical Inventories"
-#~ msgstr "Inventarios periódicos borrador"
-
-#~ msgid "STOCK_MISSING_IMAGE"
-#~ msgstr "STOCK_MISSING_IMAGE"
-
-#~ msgid "STOCK_SPELL_CHECK"
-#~ msgstr "STOCK_SPELL_CHECK"
-
-#~ msgid "Stock Tracking Lots"
-#~ msgstr "Lotes seguimiento de stock"
-
-#~ msgid "Origin Reference"
-#~ msgstr "Referencia origen"
-
-#~ msgid "Available Moves"
-#~ msgstr "Movimientos disponibles"
-
-#~ msgid "STOCK_HARDDISK"
-#~ msgstr "STOCK_HARDDISK"
-
-#~ msgid "Open Products"
-#~ msgstr "Abrir productos"
-
-#~ msgid "Input Packing List"
-#~ msgstr "Albaranes de entrada"
-
-#~ msgid "Packing List"
-#~ msgstr "Albarán"
-
-#~ msgid "STOCK_COPY"
-#~ msgstr "STOCK_COPY"
-
-#~ msgid "STOCK_CDROM"
-#~ msgstr "STOCK_CDROM"
-
-#~ msgid "Not from Packing"
-#~ msgstr "No a partir de albarán"
-
-#~ msgid "Internal Ref"
-#~ msgstr "Ref. interna"
-
-#~ msgid "STOCK_REFRESH"
-#~ msgstr "STOCK_REFRESH"
-
-#~ msgid "STOCK_STOP"
-#~ msgstr "STOCK_STOP"
-
-#~ msgid "STOCK_FIND_AND_REPLACE"
-#~ msgstr "STOCK_FIND_AND_REPLACE"
-
-#~ msgid "Validate"
-#~ msgstr "Validar"
-
-#~ msgid "STOCK_DIALOG_WARNING"
-#~ msgstr "STOCK_DIALOG_WARNING"
-
-#~ msgid "STOCK_ZOOM_IN"
-#~ msgstr "STOCK_ZOOM_IN"
-
-#~ msgid "STOCK_CONVERT"
-#~ msgstr "STOCK_CONVERT"
-
-#~ msgid "Move lines"
-#~ msgstr "Líneas de movimientos"
-
-#~ msgid "terp-calendar"
-#~ msgstr "terp-calendar"
-
-#~ msgid "STOCK_ITALIC"
-#~ msgstr "STOCK_ITALIC"
-
-#~ msgid "STOCK_YES"
-#~ msgstr "STOCK_YES"
-
-#~ msgid "Fill From Unreceived Products"
-#~ msgstr "Rellenar a partir de productos no recibidos"
-
-#~ msgid "Dest. Move"
-#~ msgstr "Mov. destino"
-
-#~ msgid "New Periodical Inventory"
-#~ msgstr "Nuevo inventario periódico"
-
-#~ msgid "FIFO"
-#~ msgstr "FIFO"
-
-#~ msgid "Delivery Orders to Process"
-#~ msgstr "Órdenes de entrega a procesar"
-
-#~ msgid "Invoice Status"
-#~ msgstr "Estado de facturación"
-
-#~ msgid "STOCK_JUSTIFY_LEFT"
-#~ msgstr "STOCK_JUSTIFY_LEFT"
-
-#~ msgid "Future Stock Forecast"
-#~ msgstr "Previsión de futuro stock"
-
-#~ msgid ""
-#~ "The Object name must start with x_ and not contain any special character !"
-#~ msgstr ""
-#~ "¡El nombre del objeto debe empezar con x_ y no contener ningún carácter "
-#~ "especial!"
-
-#~ msgid "Planned Date"
-#~ msgstr "Fecha prevista"
-
-#, python-format
-#~ msgid "No production sequence defined"
-#~ msgstr "No se ha definido una secuencia de producción"
-
-#~ msgid "STOCK_COLOR_PICKER"
-#~ msgstr "STOCK_COLOR_PICKER"
-
-#~ msgid "Lots by location"
-#~ msgstr "Lotes por ubicación"
-
-#~ msgid "STOCK_DELETE"
-#~ msgstr "STOCK_DELETE"
-
-#~ msgid "STOCK_CLEAR"
-#~ msgstr "STOCK_CLEAR"
-
-#~ msgid "Created Date"
-#~ msgstr "Fecha creación"
-
-#~ msgid "terp-mrp"
-#~ msgstr "terp-mrp"
-
-#~ msgid "STOCK_GO_UP"
-#~ msgstr "STOCK_GO_UP"
-
-#~ msgid "STOCK_SORT_DESCENDING"
-#~ msgstr "STOCK_SORT_DESCENDING"
-
-#~ msgid "Tracking Lots"
-#~ msgstr "Lotes seguimiento"
-
-#~ msgid "STOCK_HOME"
-#~ msgstr "STOCK_HOME"
-
-#~ msgid "STOCK_PROPERTIES"
-#~ msgstr "STOCK_PROPERTIES"
-
-#~ msgid "Create invoices"
-#~ msgstr "Crear facturas"
-
-#~ msgid "Set Stock to Zero"
-#~ msgstr "Fijar stock a cero"
-
-#~ msgid "STOCK_MEDIA_STOP"
-#~ msgstr "STOCK_MEDIA_STOP"
-
-#~ msgid "Make packing"
-#~ msgstr "Realizar albarán"
-
-#~ msgid "STOCK_DND_MULTIPLE"
-#~ msgstr "STOCK_DND_MULTIPLE"
-
-#~ msgid "STOCK_REMOVE"
-#~ msgstr "STOCK_REMOVE"
-
-#~ msgid "STOCK_DIALOG_AUTHENTICATION"
-#~ msgstr "STOCK_DIALOG_AUTHENTICATION"
-
-#~ msgid "STOCK_ZOOM_OUT"
-#~ msgstr "STOCK_ZOOM_OUT"
-
-#~ msgid "Nearest"
-#~ msgstr "El más cercano"
-
-#~ msgid "STOCK_SELECT_COLOR"
-#~ msgstr "STOCK_SELECT_COLOR"
-
-#~ msgid "STOCK_PRINT"
-#~ msgstr "STOCK_PRINT"
-
-#~ msgid "STOCK_NO"
-#~ msgstr "STOCK_NO"
-
-#~ msgid "Workshop"
-#~ msgstr "Tienda"
-
-#~ msgid "STOCK_REDO"
-#~ msgstr "STOCK_REDO"
-
-#~ msgid "Tiny sprl"
-#~ msgstr "Tiny sprl"
-
-#~ msgid "STOCK_CLOSE"
-#~ msgstr "STOCK_CLOSE"
-
-#~ msgid "Force to use a Production Lot during deliveries"
-#~ msgstr "Fuerza a utilizar un lote de producción durante las entregas"
-
-#~ msgid "Split move lines in two"
-#~ msgstr "Dividir líneas de movimiento en dos"
-
-#~ msgid "Return"
-#~ msgstr "Devolver"
-
-#~ msgid "Auto-Packing"
-#~ msgstr "Auto-Empaquetado"
-
-#~ msgid "STOCK_JUMP_TO"
-#~ msgstr "STOCK_JUMP_TO"
-
-#~ msgid "terp-tools"
-#~ msgstr "terp-tools"
-
-#~ msgid "Location Overview"
-#~ msgstr "Vista general ubicaciones"
-
-#~ msgid "STOCK_DIALOG_INFO"
-#~ msgstr "STOCK_DIALOG_INFO"
-
-#~ msgid "Split move line"
-#~ msgstr "Partir línea de movimiento"
-
-#~ msgid "terp-sale"
-#~ msgstr "terp-sale"
-
-#~ msgid "STOCK_ADD"
-#~ msgstr "STOCK_ADD"
-
-#~ msgid "Chained Delay (days)"
-#~ msgstr "Retraso encadenado (días)"
-
-#~ msgid "STOCK_MEDIA_PAUSE"
-#~ msgstr "STOCK_MEDIA_PAUSE"
-
-#~ msgid "STOCK_PRINT_PREVIEW"
-#~ msgstr "STOCK_PRINT_PREVIEW"
-
-#~ msgid "STOCK_FIND"
-#~ msgstr "STOCK_FIND"
-
-#~ msgid "Tracking"
-#~ msgstr "Seguimiento"
-
-#~ msgid ""
-#~ "This account will be used, instead of the default one, to value input stock"
-#~ msgstr ""
-#~ "Esta cuenta se utilizará en lugar de la por defecto para valorar el stock de "
-#~ "entrada"
-
-#~ msgid "Components"
-#~ msgstr "Componentes"
-
-#~ msgid "Max. Planned Date"
-#~ msgstr "Fecha prevista máx."
-
-#~ msgid "STOCK_MEDIA_PLAY"
-#~ msgstr "STOCK_MEDIA_PLAY"
-
-#~ msgid "STOCK_OPEN"
-#~ msgstr "STOCK_OPEN"
-
-#~ msgid "STOCK_MEDIA_PREVIOUS"
-#~ msgstr "STOCK_MEDIA_PREVIOUS"
-
-#~ msgid "Stock Locations Structure"
-#~ msgstr "Estructura ubicaciones stock"
-
-#~ msgid "STOCK_DISCONNECT"
-#~ msgstr "STOCK_DISCONNECT"
-
-#~ msgid ""
-#~ "This account will be used, instead of the default one, to value output stock"
-#~ msgstr ""
-#~ "Esta cuenta será utilizada, en lugar de la por defecto, para calcular el "
-#~ "stock de salida"
-
-#~ msgid "Confirm (Do Not Process Now)"
-#~ msgstr "Confirmar (no procesar ahora)"
-
-#~ msgid "Moves Tracked"
-#~ msgstr "Seguimiento movimientos"
-
-#~ msgid "STOCK_NETWORK"
-#~ msgstr "STOCK_NETWORK"
-
-#~ msgid "terp-project"
-#~ msgstr "terp-project"
-
-#~ msgid "Stock by Lots"
-#~ msgstr "Stock por lotes"
-
-#~ msgid "STOCK_UNINDENT"
-#~ msgstr "STOCK_UNINDENT"
-
-#~ msgid "STOCK_GOTO_LAST"
-#~ msgstr "STOCK_GOTO_LAST"
-
-#~ msgid "STOCK_DIRECTORY"
-#~ msgstr "STOCK_DIRECTORY"
-
-#~ msgid ""
-#~ "For the current product (template), this stock location will be used, "
-#~ "instead of the default one, as the source location for stock moves generated "
-#~ "by production orders"
-#~ msgstr ""
-#~ "Para el actual producto (plantilla), esta ubicación de stock se utilizará, "
-#~ "en lugar de la por defecto, como la ubicación origen para movimientos de "
-#~ "stock generados por órdenes de producción"
-
-#~ msgid "Add"
-#~ msgstr "Añadir"
-
-#~ msgid "STOCK_JUSTIFY_CENTER"
-#~ msgstr "STOCK_JUSTIFY_CENTER"
-
-#~ msgid "Set Stock to 0"
-#~ msgstr "Fijar stock a 0"
-
-#~ msgid "Localisation"
-#~ msgstr "Ubicación"
-
-#~ msgid "Do you want to set stocks to zero ?"
-#~ msgstr "¿Desea fijar stocks a cero?"
-
-#~ msgid "Direct Delivery"
-#~ msgstr "Entrega directa"
-
-#~ msgid "STOCK_REVERT_TO_SAVED"
-#~ msgstr "STOCK_REVERT_TO_SAVED"
-
-#~ msgid "Track Production Lots"
-#~ msgstr "Lotes seguimiento de producción"
-
-#~ msgid "Split in Two"
-#~ msgstr "Partir en dos"
-
-#~ msgid ""
-#~ "For the current product (template), this stock location will be used, "
-#~ "instead of the default one, as the source location for stock moves generated "
-#~ "by procurements"
-#~ msgstr ""
-#~ "Para el actual producto (plantilla), esta ubicación de stock se utilizará, "
-#~ "en lugar de la por defecto, como la ubicación origen para movimientos de "
-#~ "stock generados por abastecimientos"
-
-#~ msgid "stock.picking.move.wizard"
-#~ msgstr "stock.picking.move.wizard"
-
-#~ msgid "Date Order"
-#~ msgstr "Fecha orden"
-
-#~ msgid "Supplier Invoice"
-#~ msgstr "Factura de proveedor"
-
-#, python-format
-#~ msgid "to be invoiced"
-#~ msgstr "Para facturar"
-
-#~ msgid "terp-product"
-#~ msgstr "terp-product"
-
-#~ msgid "Close"
-#~ msgstr "Cerrar"
-
-#~ msgid "Inventory Account"
-#~ msgstr "Cuenta inventario"
-
-#~ msgid "Set Stocks to Zero"
-#~ msgstr "Fijar stocks a cero"
-
-#~ msgid "Low Level"
-#~ msgstr "Nivel inferior"
-
-#~ msgid "STOCK_INDENT"
-#~ msgstr "STOCK_INDENT"
-
-#~ msgid "Delivery"
-#~ msgstr "Entrega"
-
-#~ msgid "Locations' Values"
-#~ msgstr "Valores ubicaciones"
-
-#~ msgid "STOCK_JUSTIFY_RIGHT"
-#~ msgstr "STOCK_JUSTIFY_RIGHT"
-
-#~ msgid "Inventory line"
-#~ msgstr "Línea de inventario"
-
-#~ msgid "Others info"
-#~ msgstr "Otras info."
-
-#~ msgid "STOCK_MEDIA_NEXT"
-#~ msgstr "STOCK_MEDIA_NEXT"
-
-#~ msgid "Move State"
-#~ msgstr "Estado de movimientos"
-
-#, python-format
-#~ msgid "Invoice is not created"
-#~ msgstr "No se ha creado factura"
-
-#, python-format
-#~ msgid "Invoice cannot be created from Packing."
-#~ msgstr "No se puede crear factura desde albaranes."
-
-#~ msgid "Future Delivery Orders"
-#~ msgstr "Órdenes de entrega futuras"
-
-#~ msgid ""
-#~ "This is used only if you selected a chained location type.\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 sólo si selecciona un tipo de ubicación encadenada.\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 'Mov. "
-#~ "automático, paso no añadido', la ubicación se reemplaza en el movimiento "
-#~ "original."
-
-#~ msgid "Make Picking"
-#~ msgstr "Realizar albarán"
-
-#~ msgid "Packing result"
-#~ msgstr "Resultado albarán"
-
-#~ msgid "Available Packing"
-#~ msgstr "Albarán disponible"
-
-#~ msgid "Packing Done"
-#~ msgstr "Albarán realizado"
-
-#~ msgid "The packing has been successfully made !"
-#~ msgstr "¡El albarán ha sido realizado correctamente!"
-
-#~ msgid "Packing to Process"
-#~ msgstr "Albaranes a procesar"
-
-#~ msgid "Confirmed Packing Waiting Availability"
-#~ msgstr "Albarán confirmado esperando disponibilidad"
-
-#~ msgid "Partial packing"
-#~ msgstr "Albarán parcial"
-
-#~ msgid "Incoming Products"
-#~ msgstr "Albaranes de entrada"
-
-#~ msgid "Outgoing Products"
-#~ msgstr "Albaranes de salida"
-
-#~ msgid "Force to use a Production Lot during receptions"
-#~ msgstr "Fuerza a usar un lote de producción durante la recepción"
-
-#~ msgid "Print Item Labels"
-#~ msgstr "Imprimir etiquetas"
-
-#, python-format
-#~ msgid "Please select one and only one inventory !"
-#~ msgstr "¡ Por favor, seleccione un y sólo un inventario !"
-
-#, python-format
-#~ msgid "Invoice is already created."
-#~ msgstr "La factura ya está creada."
-
-#~ msgid "Units"
-#~ msgstr "Unidades"
-
-#~ msgid "Total :"
-#~ msgstr "Total:"
-
-#~ msgid ""
-#~ "Scheduled date for the movement of the products or real date if the move is "
-#~ "done."
-#~ msgstr ""
-#~ "Fecha programada para el movimiento de productos o fecha real si el "
-#~ "movimiento ha sido realizado."
-
-#~ msgid "New Reception Packing"
-#~ msgstr "Nuevo albarán de entrada"
-
-#~ msgid "Invalid model name in the action definition."
-#~ msgstr "Nombre de modelo no válido en la definición de la acción."
-
-#~ msgid "Customer Refund"
-#~ msgstr "Factura rectificativa (abono) de cliente"
-
-#~ msgid "Move Lines"
-#~ msgstr "Líneas movimiento"
-
-#~ msgid "Supplier Refund"
-#~ msgstr "Factura rectificativa (abono) de proveedor"
-
-#~ msgid ""
-#~ "OpenERP Stock Management module can manage multi-warehouses, multi and "
-#~ "structured stock locations.\n"
-#~ "Thanks to the double entry management, the inventory controlling is powerful "
-#~ "and flexible:\n"
-#~ "* Moves history and planning,\n"
-#~ "* Different inventory methods (FIFO, LIFO, ...)\n"
-#~ "* Stock valuation (standard or average price, ...)\n"
-#~ "* Robustness faced with Inventory differences\n"
-#~ "* Automatic reordering rules (stock level, JIT, ...)\n"
-#~ "* Bar code supported\n"
-#~ "* Rapid detection of mistakes through double entry system\n"
-#~ "* Traceability (upstream/downstream, production lots, serial number, ...)\n"
-#~ " "
-#~ msgstr ""
-#~ "El módulo de inventario y logística de OpenERP puede gestionar multi-"
-#~ "almacenes y multi-ubicaciones jerárquicas de stock.\n"
-#~ "Gracias a la gestión de partida doble, el control de inventario es potente y "
-#~ "flexible:\n"
-#~ "* Historial de movimientos y planificación,\n"
-#~ "* Métodos de inventario diferentes (FIFO, LIFO ...)\n"
-#~ "* Valoración de existencias (estándar o precio medio ...)\n"
-#~ "* Robustez frente a las diferencias de inventario\n"
-#~ "* Reglas automáticas de abastecimiento (nivel de stock mínimo, JIT ...)\n"
-#~ "* Soporte a código de barras\n"
-#~ "* Detección rápida de errores a través de sistema de partida doble\n"
-#~ "* Trazabilidad (hacia arriba/abajo, lotes de producción, número de serie "
-#~ "...)\n"
-#~ " "
-
-#, python-format
-#~ msgid "is consumed with"
-#~ msgstr "es consumido con"
-
-#, python-format
-#~ msgid "Product "
-#~ msgstr "Producto "
-
-#, python-format
-#~ msgid "is scheduled"
-#~ msgstr "está planificado"
-
-#, python-format
-#~ msgid "quantity."
-#~ msgstr "cantidad."
-
-#, python-format
-#~ msgid "INV: "
-#~ msgstr "INV: "
+msgstr ""
diff --git a/addons/stock/report/report_stock_move.py b/addons/stock/report/report_stock_move.py
index aeb34d4265e..4f8aedcd5a6 100644
--- a/addons/stock/report/report_stock_move.py
+++ b/addons/stock/report/report_stock_move.py
@@ -167,6 +167,7 @@ class report_stock_inventory(osv.osv):
help='When the stock move is created it is in the \'Draft\' state.\n After that it is set to \'Confirmed\' state.\n If stock is available state is set to \'Avaiable\'.\n When the picking it done the state is \'Done\'.\
\nThe state is \'Waiting\' if the move is waiting for another one.'),
'location_type': fields.selection([('supplier', 'Supplier Location'), ('view', 'View'), ('internal', 'Internal Location'), ('customer', 'Customer Location'), ('inventory', 'Inventory'), ('procurement', 'Procurement'), ('production', 'Production'), ('transit', 'Transit Location for Inter-Companies Transfers')], 'Location Type', required=True),
+ 'scrap_location': fields.boolean('scrap'),
}
def init(self, cr):
tools.drop_view_if_exists(cr, 'report_stock_inventory')
@@ -177,7 +178,7 @@ CREATE OR REPLACE view report_stock_inventory AS (
to_char(m.date, 'YYYY') as year,
to_char(m.date, 'MM') as month,
m.partner_id as partner_id, m.location_id as location_id,
- m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type,
+ m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type, l.scrap_location as scrap_location,
m.company_id,
m.state as state, m.prodlot_id as prodlot_id,
@@ -194,14 +195,14 @@ CREATE OR REPLACE view report_stock_inventory AS (
LEFT JOIN stock_location l ON (m.location_id=l.id)
GROUP BY
m.id, m.product_id, m.product_uom, pt.categ_id, m.partner_id, m.location_id, m.location_dest_id,
- m.prodlot_id, m.date, m.state, l.usage, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
+ m.prodlot_id, m.date, m.state, l.usage, l.scrap_location, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
) UNION ALL (
SELECT
-m.id as id, m.date as date,
to_char(m.date, 'YYYY') as year,
to_char(m.date, 'MM') as month,
m.partner_id as partner_id, m.location_dest_id as location_id,
- m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type,
+ m.product_id as product_id, pt.categ_id as product_categ_id, l.usage as location_type, l.scrap_location as scrap_location,
m.company_id,
m.state as state, m.prodlot_id as prodlot_id,
coalesce(sum(pt.standard_price * m.product_qty * pu.factor / pu2.factor)::decimal, 0.0) as value,
@@ -217,7 +218,7 @@ CREATE OR REPLACE view report_stock_inventory AS (
LEFT JOIN stock_location l ON (m.location_dest_id=l.id)
GROUP BY
m.id, m.product_id, m.product_uom, pt.categ_id, m.partner_id, m.location_id, m.location_dest_id,
- m.prodlot_id, m.date, m.state, l.usage, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
+ m.prodlot_id, m.date, m.state, l.usage, l.scrap_location, m.company_id, pt.uom_id, to_char(m.date, 'YYYY'), to_char(m.date, 'MM')
)
);
""")
diff --git a/addons/stock/report/report_stock_move_view.xml b/addons/stock/report/report_stock_move_view.xml
index 4c911dd6e7c..9b53ffd6d58 100644
--- a/addons/stock/report/report_stock_move_view.xml
+++ b/addons/stock/report/report_stock_move_view.xml
@@ -155,7 +155,7 @@
<field name="state"/>
<field name="location_type"/>
<field name="date"/>
- <filter icon="terp-go-home" name="location_type_scrap" string="Scrap" domain="[('location_type','=','scrap')]"/>
+ <filter icon="terp-go-home" name="location_type_scrap" string="Scrap" domain="[('scrap_location','=','True')]"/>
</group>
<group expand="1" string="Group By..." >
<filter string="Partner" name="group_partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
diff --git a/addons/stock/res_config_view.xml b/addons/stock/res_config_view.xml
index f3abb9bbc95..9cc8553f4ea 100644
--- a/addons/stock/res_config_view.xml
+++ b/addons/stock/res_config_view.xml
@@ -2,6 +2,16 @@
<openerp>
<data>
+ <!-- After installation of the module, open the related menu -->
+ <record id="action_client_warehouse_menu" model="ir.actions.client">
+ <field name="name">Open Warehouse Menu</field>
+ <field name="tag">reload</field>
+ <field name="params" eval="{'menu_id': ref('menu_stock_root')}"/>
+ </record>
+ <record id="base.open_menu" model="ir.actions.todo">
+ <field name="action_id" ref="action_client_warehouse_menu"/>
+ <field name="state">open</field>
+ </record>
<record id="view_stock_config_settings" model="ir.ui.view">
<field name="name">stock settings</field>
<field name="model">stock.config.settings</field>
diff --git a/addons/stock/security/ir.model.access.csv b/addons/stock/security/ir.model.access.csv
index b0ae333a9ef..84b475adf1d 100644
--- a/addons/stock/security/ir.model.access.csv
+++ b/addons/stock/security/ir.model.access.csv
@@ -36,8 +36,8 @@ access_stock_report_tracklots,stock.report.tracklots,model_stock_report_tracklot
access_report_stock_move_user,report.stock.move user,model_report_stock_move,stock.group_stock_user,1,0,0,0
access_report_stock_move_manager,report.stock.move manager,model_report_stock_move,stock.group_stock_manager,1,1,1,1
access_report_stock_inventory_user,report.stock.inventory user,model_report_stock_inventory,stock.group_stock_user,1,1,1,1
-access_product_product_stock_user,product_product_stock_user,product.model_product_product,stock.group_stock_user,1,0,0,0
-access_product_template_stock_user,product.template stock user,product.model_product_template,stock.group_stock_user,1,0,0,0
+access_product_product_stock_user,product_product_stock_user,product.model_product_product,stock.group_stock_user,1,1,0,0
+access_product_template_stock_user,product.template stock user,product.model_product_template,stock.group_stock_user,1,1,0,0
access_account_invoice_user,account.invoice stock user,account.model_account_invoice,stock.group_stock_user,1,1,1,0
access_account_invoice_line_user,account.invoice.line stock user,account.model_account_invoice_line,stock.group_stock_user,1,1,1,0
access_account_invoice_tax_user,account.invoice.tax stock user,account.model_account_invoice_tax,stock.group_stock_user,1,1,1,0
diff --git a/addons/stock/stock.py b/addons/stock/stock.py
index efd596684cb..8e1180352c2 100644
--- a/addons/stock/stock.py
+++ b/addons/stock/stock.py
@@ -510,9 +510,13 @@ class stock_tracking(osv.osv):
return self.name_get(cr, user, ids, context)
def name_get(self, cr, uid, ids, context=None):
+ """Append the serial to the name"""
if not len(ids):
return []
- res = [(r['id'], r['name']+' ['+(r['serial'] or '')+']') for r in self.read(cr, uid, ids, ['name', 'serial'], context)]
+ res = [ (r['id'], r['serial'] and '%s [%s]' % (r['name'], r['serial'])
+ or r['name'] )
+ for r in self.read(cr, uid, ids, ['name', 'serial'],
+ context=context) ]
return res
def unlink(self, cr, uid, ids, context=None):
@@ -644,7 +648,7 @@ class stock_picking(osv.osv):
),
'min_date': fields.function(get_min_max_date, fnct_inv=_set_minimum_date, multi="min_max_date",
store=True, type='datetime', string='Scheduled Date', select=1, help="Scheduled date for the shipment to be processed"),
- 'date': fields.datetime('Order Date', help="Date of order", select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
+ 'date': fields.datetime('Date', help="Creation date, usually the date of the order.", select=True, states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
'date_done': fields.datetime('Date Done', help="Date of Completion", states={'done':[('readonly', True)], 'cancel':[('readonly',True)]}),
'max_date': fields.function(get_min_max_date, fnct_inv=_set_maximum_date, multi="min_max_date",
store=True, type='datetime', string='Max. Expected Date', select=2),
@@ -675,6 +679,7 @@ class stock_picking(osv.osv):
def action_process(self, cr, uid, ids, context=None):
if context is None:
context = {}
+ """Open the partial picking wizard"""
context.update({
'active_model': self._name,
'active_ids': ids,
@@ -723,6 +728,7 @@ class stock_picking(osv.osv):
return {}
def action_explode(self, cr, uid, moves, context=None):
+ """Hook to allow other modules to split the moves of a picking."""
return moves
def action_confirm(self, cr, uid, ids, context=None):
@@ -864,14 +870,20 @@ class stock_picking(osv.osv):
# TODO: change and create a move if not parents
#
def action_done(self, cr, uid, ids, context=None):
- """ Changes picking state to done.
+ """Changes picking state to done.
+
+ This method is called at the end of the workflow by the activity "done".
@return: True
"""
self.write(cr, uid, ids, {'state': 'done', 'date_done': time.strftime('%Y-%m-%d %H:%M:%S')})
return True
def action_move(self, cr, uid, ids, context=None):
- """ Changes move state to assigned.
+ """Process the Stock Moves of the Picking
+
+ This method is called by the workflow by the activity "move".
+ Normally that happens when the signal button_done is received (button
+ "Done" pressed on a Picking view).
@return: True
"""
for pick in self.browse(cr, uid, ids, context=context):
@@ -1274,9 +1286,14 @@ class stock_picking(osv.osv):
for move in too_few:
product_qty = move_product_qty[move.id]
if not new_picking:
+ new_picking_name = pick.name
+ self.write(cr, uid, [pick.id],
+ {'name': sequence_obj.get(cr, uid,
+ 'stock.picking.%s'%(pick.type)),
+ })
new_picking = self.copy(cr, uid, pick.id,
{
- 'name': sequence_obj.get(cr, uid, 'stock.picking.%s'%(pick.type)),
+ 'name': new_picking_name,
'move_lines' : [],
'state':'draft',
})
@@ -1296,9 +1313,10 @@ class stock_picking(osv.osv):
move_obj.copy(cr, uid, move.id, defaults)
move_obj.write(cr, uid, [move.id],
{
- 'product_qty' : move.product_qty - partial_qty[move.id],
+ 'product_qty': move.product_qty - partial_qty[move.id],
'product_uos_qty': move.product_qty - partial_qty[move.id], #TODO: put correct uos_qty
-
+ 'prodlot_id': False,
+ 'tracking_id': False,
})
if new_picking:
@@ -1343,6 +1361,22 @@ class stock_picking(osv.osv):
res[pick.id] = {'delivered_picking': delivered_pack.id or False}
return res
+
+ # views associated to each picking type
+ _VIEW_LIST = {
+ 'out': 'view_picking_out_form',
+ 'in': 'view_picking_in_form',
+ 'internal': 'view_picking_form',
+ }
+ def _get_view_id(self, cr, uid, type):
+ """Get the view id suiting the given type
+
+ @param type: the picking type as a string
+ @return: view i, or False if no view found
+ """
+ res = self.pool.get('ir.model.data').get_object_reference(cr, uid,
+ 'stock', self._VIEW_LIST.get(type, 'view_picking_form'))
+ return res and res[1] or False
def log_picking(self, cr, uid, ids, context=None):
""" This function will create log messages for picking.
@@ -1353,7 +1387,6 @@ class stock_picking(osv.osv):
"""
if context is None:
context = {}
- data_obj = self.pool.get('ir.model.data')
for pick in self.browse(cr, uid, ids, context=context):
msg=''
if pick.auto_picking:
@@ -1363,11 +1396,6 @@ class stock_picking(osv.osv):
'in':_('Reception'),
'internal': _('Internal picking'),
}
- view_list = {
- 'out': 'view_picking_out_form',
- 'in': 'view_picking_in_form',
- 'internal': 'view_picking_form',
- }
message = type_list.get(pick.type, _('Document')) + " '" + (pick.name or '?') + "' "
if pick.min_date:
msg= _(' for the ')+ datetime.strptime(pick.min_date, '%Y-%m-%d %H:%M:%S').strftime('%m/%d/%Y')
@@ -1379,8 +1407,7 @@ class stock_picking(osv.osv):
'auto': _('is waiting.'),
'draft': _('is in draft state.'),
}
- res = data_obj.get_object_reference(cr, uid, 'stock', view_list.get(pick.type, 'view_picking_form'))
- context.update({'view_id': res and res[1] or False})
+ context['view_id'] = self._get_view_id(cr, uid, pick.type)
message += state_list[pick.state]
return True
@@ -1620,7 +1647,8 @@ class stock_move(osv.osv):
(move.product_id.track_production and move.location_id.usage == 'production') or \
(move.product_id.track_production and move.location_dest_id.usage == 'production') or \
(move.product_id.track_incoming and move.location_id.usage == 'supplier') or \
- (move.product_id.track_outgoing and move.location_dest_id.usage == 'customer') \
+ (move.product_id.track_outgoing and move.location_dest_id.usage == 'customer') or \
+ (move.product_id.track_incoming and move.location_id.usage == 'inventory') \
)):
return False
return True
@@ -1642,7 +1670,16 @@ class stock_move(osv.osv):
'date_expected': fields.datetime('Scheduled Date', states={'done': [('readonly', True)]},required=True, select=True, help="Scheduled date for the processing of this move"),
'product_id': fields.many2one('product.product', 'Product', required=True, select=True, domain=[('type','<>','service')],states={'done': [('readonly', True)]}),
- 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True,states={'done': [('readonly', True)]}),
+ 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'),
+ required=True,states={'done': [('readonly', True)]},
+ help="This is the quantity of products from an inventory "
+ "point of view. For moves in the state 'done', this is the "
+ "quantity of products that were actually moved. For other "
+ "moves, this is the quantity of product that is planned to "
+ "be moved. Lowering this quantity does not generate a "
+ "backorder. Changing this quantity on assigned moves affects "
+ "the product reservation, and should be done with care."
+ ),
'product_uom': fields.many2one('product.uom', 'Unit of Measure', required=True,states={'done': [('readonly', True)]}),
'product_uos_qty': fields.float('Quantity (UOS)', digits_compute=dp.get_precision('Product Unit of Measure'), states={'done': [('readonly', True)]}),
'product_uos': fields.many2one('product.uom', 'Product UOS', states={'done': [('readonly', True)]}),
@@ -1677,7 +1714,7 @@ class stock_move(osv.osv):
'price_unit': fields.float('Unit Price', digits_compute= dp.get_precision('Account'), help="Technical field used to record the product cost set by the user during a picking confirmation (when average price costing method is used)"),
'price_currency_id': fields.many2one('res.currency', 'Currency for average price', help="Technical field used to record the currency chosen by the user during a picking confirmation (when average price costing method is used)"),
'company_id': fields.many2one('res.company', 'Company', required=True, select=True),
- 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order", select=True),
+ 'backorder_id': fields.related('picking_id','backorder_id',type='many2one', relation="stock.picking", string="Back Order of", select=True),
'origin': fields.related('picking_id','origin',type='char', size=64, relation="stock.picking", string="Source", store=True),
# used for colors in tree views:
@@ -1863,19 +1900,32 @@ class stock_move(osv.osv):
result = {
'product_uos_qty': 0.00
}
+ warning = {}
if (not product_id) or (product_qty <=0.0):
+ result['product_qty'] = 0.0
return {'value': result}
product_obj = self.pool.get('product.product')
uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff'])
+
+ # Warn if the quantity was decreased
+ if ids:
+ for move in self.read(cr, uid, ids, ['product_qty']):
+ if product_qty < move['product_qty']:
+ warning.update({
+ 'title': _('Information'),
+ 'message': _("By changing this quantity here, you accept the "
+ "new quantity as complete: OpenERP will not "
+ "automatically generate a back order.") })
+ break
if product_uos and product_uom and (product_uom != product_uos):
result['product_uos_qty'] = product_qty * uos_coeff['uos_coeff']
else:
result['product_uos_qty'] = product_qty
- return {'value': result}
+ return {'value': result, 'warning': warning}
def onchange_uos_quantity(self, cr, uid, ids, product_id, product_uos_qty,
product_uos, product_uom):
@@ -1889,19 +1939,30 @@ class stock_move(osv.osv):
result = {
'product_qty': 0.00
}
+ warning = {}
if (not product_id) or (product_uos_qty <=0.0):
+ result['product_uos_qty'] = 0.0
return {'value': result}
product_obj = self.pool.get('product.product')
uos_coeff = product_obj.read(cr, uid, product_id, ['uos_coeff'])
+
+ # Warn if the quantity was decreased
+ for move in self.read(cr, uid, ids, ['product_uos_qty']):
+ if product_uos_qty < move['product_uos_qty']:
+ warning.update({
+ 'title': _('Warning: No Back Order'),
+ 'message': _("By changing the quantity here, you accept the "
+ "new quantity as complete: OpenERP will not "
+ "automatically generate a Back Order.") })
+ break
if product_uos and product_uom and (product_uom != product_uos):
result['product_qty'] = product_uos_qty / uos_coeff['uos_coeff']
else:
result['product_qty'] = product_uos_qty
-
- return {'value': result}
+ return {'value': result, 'warning': warning}
def onchange_product_id(self, cr, uid, ids, prod_id=False, loc_id=False,
loc_dest_id=False, partner_id=False):
@@ -1927,7 +1988,8 @@ class stock_move(osv.osv):
'product_uom': product.uom_id.id,
'product_uos': uos_id,
'product_qty': 1.00,
- 'product_uos_qty' : self.pool.get('stock.move').onchange_quantity(cr, uid, ids, prod_id, 1.00, product.uom_id.id, uos_id)['value']['product_uos_qty']
+ 'product_uos_qty' : self.pool.get('stock.move').onchange_quantity(cr, uid, ids, prod_id, 1.00, product.uom_id.id, uos_id)['value']['product_uos_qty'],
+ 'prodlot_id' : False,
}
if not ids:
result['name'] = product.partner_ref
@@ -2114,6 +2176,10 @@ class stock_move(osv.osv):
@return: True
"""
self.write(cr, uid, ids, {'state': 'assigned'})
+ wf_service = netsvc.LocalService('workflow')
+ for move in self.browse(cr, uid, ids, context):
+ if move.picking_id:
+ wf_service.trg_write(uid, 'stock.picking', move.picking_id.id, cr)
return True
def cancel_assign(self, cr, uid, ids, context=None):
@@ -2490,8 +2556,6 @@ class stock_move(osv.osv):
'tracking_id': move.tracking_id.id,
'prodlot_id': move.prodlot_id.id,
}
- if move.location_id.usage <> 'internal':
- default_val.update({'location_id': move.location_dest_id.id})
new_move = self.copy(cr, uid, move.id, default_val)
res += [new_move]
@@ -2505,6 +2569,7 @@ class stock_move(osv.osv):
return res
# action_split function is not used anywhere
+ # FIXME: deprecate this method
def action_split(self, cr, uid, ids, quantity, split_by_qty=1, prefix=False, with_lot=True, context=None):
""" Split Stock Move lines into production lot which specified split by quantity.
@param cr: the database cursor
@@ -2709,8 +2774,10 @@ class stock_move(osv.osv):
complete.append(self.browse(cr, uid, new_move))
self.write(cr, uid, [move.id],
{
- 'product_qty' : move.product_qty - product_qty,
- 'product_uos_qty':move.product_qty - product_qty,
+ 'product_qty': move.product_qty - product_qty,
+ 'product_uos_qty': move.product_qty - product_qty,
+ 'prodlot_id': False,
+ 'tracking_id': False,
})
@@ -2749,7 +2816,7 @@ class stock_inventory(osv.osv):
'name': fields.char('Inventory Reference', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}),
'date': fields.datetime('Creation Date', required=True, readonly=True, states={'draft': [('readonly', False)]}),
'date_done': fields.datetime('Date done'),
- 'inventory_line_id': fields.one2many('stock.inventory.line', 'inventory_id', 'Inventories', states={'done': [('readonly', True)]}),
+ 'inventory_line_id': fields.one2many('stock.inventory.line', 'inventory_id', 'Inventories', readonly=True, states={'draft': [('readonly', False)]}),
'move_ids': fields.many2many('stock.move', 'stock_inventory_move_rel', 'inventory_id', 'move_id', 'Created Moves'),
'state': fields.selection( (('draft', 'Draft'), ('cancel','Cancelled'), ('confirm','Confirmed'), ('done', 'Done')), 'Status', readonly=True, select=True),
'company_id': fields.many2one('res.company', 'Company', required=True, select=True, readonly=True, states={'draft':[('readonly',False)]}),
@@ -2896,11 +2963,11 @@ class stock_inventory_line(osv.osv):
@return: Dictionary of changed values
"""
if not product:
- return {'value': {'product_qty': 0.0, 'product_uom': False}}
+ return {'value': {'product_qty': 0.0, 'product_uom': False, 'prod_lot_id': False}}
obj_product = self.pool.get('product.product').browse(cr, uid, product)
uom = uom or obj_product.uom_id.id
amount = self.pool.get('stock.location')._product_get(cr, uid, location_id, [product], {'uom': uom, 'to_date': to_date, 'compute_child': False})[product]
- result = {'product_qty': amount, 'product_uom': uom}
+ result = {'product_qty': amount, 'product_uom': uom, 'prod_lot_id': False}
return {'value': result}
stock_inventory_line()
@@ -2945,7 +3012,7 @@ class stock_picking_in(osv.osv):
_name = "stock.picking.in"
_inherit = "stock.picking"
_table = "stock_picking"
- _description = "Incomming Shipments"
+ _description = "Incoming Shipments"
def check_access_rights(self, cr, uid, operation, raise_exception=True):
#override in order to redirect the check of acces rights on the stock.picking object
diff --git a/addons/stock/stock_view.xml b/addons/stock/stock_view.xml
index 83fed186f42..d991e811777 100644
--- a/addons/stock/stock_view.xml
+++ b/addons/stock/stock_view.xml
@@ -759,26 +759,26 @@
<field name="state" widget="statusbar" statusbar_visible="draft,assigned,done" statusbar_colors='{"shipping_except":"red","invoice_except":"red","waiting_date":"blue"}'/>
</header>
<sheet>
- <label for="name" class="oe_edit_only"/>
<h1>
- <field name="name" class="oe_inline"/>
+ <field name="name" class="oe_inline" attrs="{'invisible': [('name','=','/')]}" readonly="1"/>
</h1>
<group>
<group>
<field name="partner_id" on_change="onchange_partner_in(partner_id)"/>
- <field name="backorder_id" readonly="1"/>
+ <field name="backorder_id" readonly="1" attrs="{'invisible': [('backorder_id','=',False)]}"/>
<field name="invoice_state" string="Invoice Control" groups="account.group_account_invoice" attrs="{'invisible':[('invoice_state', '=', 'none')]}"/>
<field name="stock_journal_id" widget="selection" groups="account.group_account_user"/>
</group>
<group>
<field name="date"/>
- <field name="min_date" readonly="1"/>
+ <field name="min_date" readonly="1" attrs="{'invisible': [('min_date','=',False)]}"/>
<field name="origin" placeholder="e.g. PO0032" class="oe_inline"/>
</group>
</group>
<notebook>
<page string="Products">
<field name="move_lines" context="{'address_in_id': partner_id, 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
+ <field name="note" placeholder="Add an internal note..." class="oe_inline"/>
</page>
<page string="Additional Info">
<group>
@@ -793,9 +793,6 @@
</group>
</group>
</page>
- <page string="Notes">
- <field name="note" placeholder="Add an internal note..."/>
- </page>
</notebook>
</sheet>
</form>
@@ -913,10 +910,11 @@
<field name="partner_id" on_change="onchange_partner_in(partner_id)" string="Customer"/>
</xpath>
<xpath expr="//field[@name='move_lines']" position="replace">
- <field name="move_lines" context="{'address_in_id': partner_id, 'picking_type': 'out', 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
+ <field name="move_lines" context="{'address_out_id': partner_id, 'picking_type': 'out', 'form_view_ref':'view_move_picking_form', 'tree_view_ref':'view_move_picking_tree'}"/>
</xpath>
<xpath expr="/form/sheet" position="after">
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -1043,6 +1041,7 @@
</xpath>
<xpath expr="/form/sheet" position="after">
<div class="oe_chatter">
+ <field name="message_is_follower" invisible="1"/>
<field name="message_ids" colspan="4" widget="mail_thread" nolabel="1"/>
<field name="message_follower_ids" widget="mail_followers"/>
</div>
@@ -1120,7 +1119,7 @@
<record id="view_move_tree" model="ir.ui.view">
<field name="name">stock.move.tree</field>
<field name="model">stock.move</field>
- <field eval="6" name="priority"/>
+ <field eval="8" name="priority"/>
<field name="arch" type="xml">
<tree colors="grey:state == 'cancel';red:(state not in ('cancel','done')) and date > current_date" string="Moves" editable="top">
<field name="name"/>
@@ -1494,7 +1493,7 @@
<field name="view_id" ref="view_move_tree_reception_picking"/>
<field name="context">{'product_receive': True, 'search_default_future': True, 'picking_type': 'in'}</field>
<field name="help" type="html">
- <p>
+ <p class="oe_view_nocontent_create">
Click to register a product reception.
</p><p>
Here you can receive individual products, no matter what
@@ -1629,6 +1628,9 @@
<field name="view_id" ref="view_move_tree_reception_picking"/>
<field name="context">{'picking_type': 'out', 'search_default_future': True}</field>
<field name="help" type="html">
+ <p class="oe_view_nocontent_create">
+ Click to register a product delivery.
+ </p>
<p>
You will find in this list all products you have to deliver to
your customers. You can process the deliveries directly from
@@ -1694,7 +1696,7 @@
<field name="type">ir.actions.act_window</field>
<field name="view_type">form</field>
<field name="help" type="html">
- <p>
+ <p class="oe_view_nocontent_create">
Click to create a new journal.
</p><p>
The stock journal system allows you to assign each stock
diff --git a/addons/stock/wizard/stock_fill_inventory.py b/addons/stock/wizard/stock_fill_inventory.py
index 9b730d22982..11907b674a1 100644
--- a/addons/stock/wizard/stock_fill_inventory.py
+++ b/addons/stock/wizard/stock_fill_inventory.py
@@ -109,16 +109,17 @@ class stock_fill_inventory(osv.osv_memory):
for move in move_obj.browse(cr, uid, move_ids, context=context):
lot_id = move.prodlot_id.id
prod_id = move.product_id.id
- if move.location_dest_id.id == location:
- qty = uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
- else:
- qty = -uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
+ if move.location_dest_id.id != move.location_id.id:
+ if move.location_dest_id.id == location:
+ qty = uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
+ else:
+ qty = -uom_obj._compute_qty(cr, uid, move.product_uom.id,move.product_qty, move.product_id.uom_id.id)
- if datas.get((prod_id, lot_id)):
- qty += datas[(prod_id, lot_id)]['product_qty']
+ if datas.get((prod_id, lot_id)):
+ qty += datas[(prod_id, lot_id)]['product_qty']
- datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_id': location, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prod_lot_id': lot_id}
+ datas[(prod_id, lot_id)] = {'product_id': prod_id, 'location_id': location, 'product_qty': qty, 'product_uom': move.product_id.uom_id.id, 'prod_lot_id': lot_id}
if datas:
flag = True
diff --git a/addons/stock/wizard/stock_partial_picking.py b/addons/stock/wizard/stock_partial_picking.py
index 2cf0a743faa..61ae519f65f 100644
--- a/addons/stock/wizard/stock_partial_picking.py
+++ b/addons/stock/wizard/stock_partial_picking.py
@@ -65,6 +65,7 @@ class stock_partial_picking_line(osv.TransientModel):
class stock_partial_picking(osv.osv_memory):
_name = "stock.partial.picking"
+ _rec_name = 'picking_id'
_description = "Partial Picking Processing Wizard"
def _hide_tracking(self, cursor, user, ids, name, arg, context=None):
diff --git a/addons/subscription/subscription.py b/addons/subscription/subscription.py
index 45916e04aee..25137f6303c 100644
--- a/addons/subscription/subscription.py
+++ b/addons/subscription/subscription.py
@@ -72,7 +72,7 @@ class subscription_subscription(osv.osv):
'state': fields.selection([('draft','Draft'),('running','Running'),('done','Done')], 'Status'),
'doc_source': fields.reference('Source Document', required=True, selection=_get_document_types, size=128, help="User can choose the source document on which he wants to create documents"),
'doc_lines': fields.one2many('subscription.subscription.history', 'subscription_id', 'Documents created', readonly=True),
- 'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription"),
+ 'cron_id': fields.many2one('ir.cron', 'Cron Job', help="Scheduler which runs on subscription", states={'running':[('readonly',True)], 'done':[('readonly',True)]}),
'note': fields.text('Notes', help="Description or Summary of Subscription"),
}
_defaults = {
diff --git a/addons/survey/survey.py b/addons/survey/survey.py
index 2426ae5eeed..f618a95cccf 100644
--- a/addons/survey/survey.py
+++ b/addons/survey/survey.py
@@ -145,10 +145,14 @@ class survey(osv.osv):
return report
def fill_survey(self, cr, uid, ids, context=None):
- sur_obj = self.read(cr, uid, ids,['title'], context=context)
+ sur_obj = self.read(cr, uid, ids,['title', 'page_ids'], context=context)
for sur in sur_obj:
name = sur['title']
- context.update({'active':False,'survey_id': ids[0]})
+ pages = sur['page_ids']
+ if not pages:
+ raise osv.except_osv(_('Warning!'), _('This survey has no question defined. Please define the questions and answers first.'))
+ else:
+ context.update({'active':False,'survey_id': ids[0]})
return {
'view_type': 'form',
'view_mode': 'form',