[merge] from trunk
bzr revid: xmo@tinyerp.com-20100112083009-gn2zawih1y6hbpsr
This commit is contained in:
commit
f51eaab7ea
|
@ -7,14 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-30 01:35+0000\n"
|
||||
"Last-Translator: Jordi Esteve - http://www.zikzakmedia.com "
|
||||
"<jesteve@zikzakmedia.com>\n"
|
||||
"PO-Revision-Date: 2009-12-31 12:45+0000\n"
|
||||
"Last-Translator: Albert Cervera i Areny <albert@nan-tic.com>\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: 2009-12-16 05:10+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-01 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
|
@ -3307,7 +3306,7 @@ msgstr "Codi"
|
|||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.menu_finance
|
||||
msgid "Financial Management"
|
||||
msgstr "Gestió financera"
|
||||
msgstr "Comptabilitat i finances"
|
||||
|
||||
#. module: account
|
||||
#: selection:account.account.type,close_method:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-24 07:35+0000\n"
|
||||
"Last-Translator: Paco Molinero <paco@byasl.com>\n"
|
||||
"PO-Revision-Date: 2010-01-02 04:23+0000\n"
|
||||
"Last-Translator: Federico Vera <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: 2009-12-25 04:41+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-03 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
|
@ -325,7 +325,7 @@ msgstr "Origen"
|
|||
#. module: account
|
||||
#: rml:account.analytic.account.journal:0
|
||||
msgid "Move Name"
|
||||
msgstr ""
|
||||
msgstr "Mover nombre"
|
||||
|
||||
#. module: account
|
||||
#: xsl:account.transfer:0
|
||||
|
@ -1516,7 +1516,7 @@ msgstr "Cerrar estados"
|
|||
#. module: account
|
||||
#: model:ir.model,name:account.model_wizard_company_setup
|
||||
msgid "wizard.company.setup"
|
||||
msgstr ""
|
||||
msgstr "wizard.company.setup"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.action_account_analytic_account_line_extended_form
|
||||
|
@ -2491,7 +2491,7 @@ msgstr "Abrir diario"
|
|||
#. module: account
|
||||
#: rml:account.analytic.account.journal:0
|
||||
msgid "KI"
|
||||
msgstr ""
|
||||
msgstr "KI"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.wizard,name:account.action_account_analytic_line
|
||||
|
@ -2746,7 +2746,7 @@ msgstr "-"
|
|||
#. module: account
|
||||
#: rml:account.analytic.account.journal:0
|
||||
msgid "asgfas"
|
||||
msgstr ""
|
||||
msgstr "asgfas"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.action_account_analytic_account_tree2
|
||||
|
@ -3308,7 +3308,7 @@ msgstr "Código"
|
|||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.menu_finance
|
||||
msgid "Financial Management"
|
||||
msgstr "Gestión financiera"
|
||||
msgstr "Contabilidad y finanzas"
|
||||
|
||||
#. module: account
|
||||
#: selection:account.account.type,close_method:0
|
||||
|
|
|
@ -8,13 +8,13 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-29 10:14+0000\n"
|
||||
"Last-Translator: NightSpirit <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-01-05 09:22+0000\n"
|
||||
"Last-Translator: pmjt <Unknown>\n"
|
||||
"Language-Team: Finnish <fi@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: 2009-12-30 04:47+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-06 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
|
@ -692,7 +692,7 @@ msgstr "Analyyttiset merkinnät"
|
|||
#. module: account
|
||||
#: selection:account.subscription,period_type:0
|
||||
msgid "month"
|
||||
msgstr ""
|
||||
msgstr "kuukausi"
|
||||
|
||||
#. module: account
|
||||
#: field:account.analytic.account,partner_id:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-17 09:58+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-01-06 18:48+0000\n"
|
||||
"Last-Translator: eLBati <elbaddy@gmail.com>\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: 2009-12-16 05:11+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-07 04:49+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
|
@ -24,13 +24,13 @@ msgstr "Nome Interno"
|
|||
#. module: account
|
||||
#: view:account.tax.code:0
|
||||
msgid "Account Tax Code"
|
||||
msgstr "Codice conto tasse"
|
||||
msgstr "Codice conto imposte"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.action_invoice_tree9
|
||||
#: model:ir.ui.menu,name:account.menu_action_invoice_tree9
|
||||
msgid "Unpaid Supplier Invoices"
|
||||
msgstr "Non pagate"
|
||||
msgstr "Fatture fornitori non pagate"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.menu_finance_entries
|
||||
|
@ -139,7 +139,7 @@ msgstr "Annulla riconcigliazione voci"
|
|||
#. module: account
|
||||
#: constraint:account.period:0
|
||||
msgid "Error ! The duration of the Period(s) is/are invalid. "
|
||||
msgstr ""
|
||||
msgstr "Errore ! La durata del/dei Periodo/i non è valida "
|
||||
|
||||
#. module: account
|
||||
#: view:account.bank.statement.reconcile:0
|
||||
|
@ -1019,7 +1019,7 @@ msgstr "Posizione fiscale"
|
|||
#: field:account.analytic.line,product_uom_id:0
|
||||
#: field:account.move.line,product_uom_id:0
|
||||
msgid "UoM"
|
||||
msgstr "UM"
|
||||
msgstr "Unità di Misura"
|
||||
|
||||
#. module: account
|
||||
#: wizard_field:account.third_party_ledger.report,init,page_split:0
|
||||
|
|
|
@ -7,30 +7,30 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-09-18 15:14+0000\n"
|
||||
"Last-Translator: Jay (Open ERP) <jvo@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2009-12-30 12:50+0000\n"
|
||||
"Last-Translator: Mikael Larsson <lvkvmicke@gmail.com>\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: 2009-12-16 05:13+0000\n"
|
||||
"X-Launchpad-Export-Date: 2009-12-31 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
#: field:account.tax.template,description:0
|
||||
msgid "Internal Name"
|
||||
msgstr ""
|
||||
msgstr "Internt namn"
|
||||
|
||||
#. module: account
|
||||
#: view:account.tax.code:0
|
||||
msgid "Account Tax Code"
|
||||
msgstr ""
|
||||
msgstr "Skattekonto kod"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.action_invoice_tree9
|
||||
#: model:ir.ui.menu,name:account.menu_action_invoice_tree9
|
||||
msgid "Unpaid Supplier Invoices"
|
||||
msgstr ""
|
||||
msgstr "Obetalda leverantörsfakturor"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.menu_finance_entries
|
||||
|
@ -40,7 +40,7 @@ msgstr ""
|
|||
#. module: account
|
||||
#: model:ir.actions.todo,note:account.config_wizard_account_base_setup_form
|
||||
msgid "Specify The Message for the Overdue Payment Report."
|
||||
msgstr ""
|
||||
msgstr "Ange meddelande till rapporten försenade betalningar."
|
||||
|
||||
#. module: account
|
||||
#: model:process.transition,name:account.process_transition_confirmstatementfromdraft0
|
||||
|
|
|
@ -8,13 +8,13 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-17 03:24+0000\n"
|
||||
"Last-Translator: pdqt <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-01-11 07:51+0000\n"
|
||||
"Last-Translator: Nguyễn Thịnh <thinhnverp@gmail.com>\n"
|
||||
"Language-Team: Vietnamese <vi@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: 2009-12-18 04:32+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-12 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
|
@ -73,34 +73,35 @@ msgstr ""
|
|||
msgid ""
|
||||
"This account will be used to value incoming stock for the current product "
|
||||
"category"
|
||||
msgstr ""
|
||||
msgstr "tài khoản này sẽ được dùng cho giá của sản phẩm đưa vào danh mục"
|
||||
|
||||
#. module: account
|
||||
#: help:account.invoice,period_id:0
|
||||
msgid "Keep empty to use the period of the validation(invoice) date."
|
||||
msgstr ""
|
||||
"Giữ sản phẩm nào để sử dụng khoảng thời gian xác nhận của (hoá đơn) ngày"
|
||||
|
||||
#. module: account
|
||||
#: wizard_view:account.automatic.reconcile,reconcile:0
|
||||
msgid "Reconciliation result"
|
||||
msgstr ""
|
||||
msgstr "kết quả hòa giả"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.act_account_acount_move_line_open_unreconciled
|
||||
msgid "Unreconciled entries"
|
||||
msgstr ""
|
||||
msgstr "không thể hòa giải"
|
||||
|
||||
#. module: account
|
||||
#: field:account.invoice.tax,base_code_id:0
|
||||
#: field:account.tax,base_code_id:0
|
||||
#: field:account.tax.template,base_code_id:0
|
||||
msgid "Base Code"
|
||||
msgstr ""
|
||||
msgstr "mã số cơ bản"
|
||||
|
||||
#. module: account
|
||||
#: view:account.account:0
|
||||
msgid "Account Statistics"
|
||||
msgstr ""
|
||||
msgstr "thống kê tài chính"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.wizard,name:account.wizard_vat_declaration
|
||||
|
@ -121,7 +122,7 @@ msgstr ""
|
|||
#. module: account
|
||||
#: field:account.invoice,residual:0
|
||||
msgid "Residual"
|
||||
msgstr ""
|
||||
msgstr "số dư"
|
||||
|
||||
#. module: account
|
||||
#: field:account.tax,base_sign:0
|
||||
|
@ -610,6 +611,8 @@ msgid ""
|
|||
"The sequence field is used to order the resources from lower sequences to "
|
||||
"higher ones"
|
||||
msgstr ""
|
||||
"Các lĩnh vực chuỗi được dùng để sắp các nguồn lực từ các chuỗi thấp hơn cho "
|
||||
"những người cao"
|
||||
|
||||
#. module: account
|
||||
#: wizard_view:account.analytic.account.chart,init:0
|
||||
|
@ -657,12 +660,12 @@ msgstr ""
|
|||
#. module: account
|
||||
#: help:account.fiscalyear,company_id:0
|
||||
msgid "Keep empty if the fiscal year belongs to several companies."
|
||||
msgstr ""
|
||||
msgstr "Hãy bỏ trống nếu năm tài chính thuộc về một số công ty"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.ui.menu,name:account.menu_analytic_accounting
|
||||
msgid "Analytic Accounting"
|
||||
msgstr ""
|
||||
msgstr "phân tích tài chính kế toán"
|
||||
|
||||
#. module: account
|
||||
#: rml:account.overdue:0
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -236,7 +236,7 @@ class account_invoice(osv.osv):
|
|||
'reference': fields.char('Invoice Reference', size=64, help="The partner reference of this invoice."),
|
||||
'reference_type': fields.selection(_get_reference_type, 'Reference Type',
|
||||
required=True),
|
||||
'comment': fields.text('Additional Information'),
|
||||
'comment': fields.text('Additional Information', translate=True),
|
||||
|
||||
'state': fields.selection([
|
||||
('draft','Draft'),
|
||||
|
@ -1093,7 +1093,7 @@ class account_invoice_line(osv.osv):
|
|||
'quantity': fields.float('Quantity', required=True),
|
||||
'discount': fields.float('Discount (%)', digits=(16, int(config['price_accuracy']))),
|
||||
'invoice_line_tax_id': fields.many2many('account.tax', 'account_invoice_line_tax', 'invoice_line_id', 'tax_id', 'Taxes', domain=[('parent_id','=',False)]),
|
||||
'note': fields.text('Notes'),
|
||||
'note': fields.text('Notes', translate=True),
|
||||
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
|
||||
'company_id': fields.related('invoice_id','company_id',type='many2one',relation='res.company',string='Company',store=True)
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ msgstr ""
|
|||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2009-12-30 04:47+0000\n"
|
||||
"X-Launchpad-Export-Date: 2009-12-31 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0_rc3\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-17 09:38+0000\n"
|
||||
"Last-Translator: Idler <idler@pcinhk.com>\n"
|
||||
"PO-Revision-Date: 2010-01-08 03:52+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:16+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-10 07:17+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
|
@ -26,7 +26,7 @@ msgstr "可开据加已开据的小时数"
|
|||
#. module: account_analytic_analysis
|
||||
#: model:ir.model,name:account_analytic_analysis.model_account_analytic_analysis_summary_user
|
||||
msgid "Hours summary by user"
|
||||
msgstr ""
|
||||
msgstr "按用户汇总小时数"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,last_invoice_date:0
|
||||
|
@ -41,18 +41,18 @@ msgstr "计算公式: 最大开据价格 - 已开据总计"
|
|||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,remaining_hours:0
|
||||
msgid "Computed using the formula: Maximum Quantity - Hours Tot."
|
||||
msgstr ""
|
||||
msgstr "使用以下公式计算: 最大数量 - 总时间"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_all
|
||||
msgid "All Analytic Accounts"
|
||||
msgstr ""
|
||||
msgstr "所有分析科目列表"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_open
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_analytic_account_to_valid_open
|
||||
msgid "My Current Accounts"
|
||||
msgstr ""
|
||||
msgstr "我的当前科目列表"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: constraint:ir.ui.view:0
|
||||
|
@ -72,7 +72,7 @@ msgstr "理论收益"
|
|||
#. module: account_analytic_analysis
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "在动作定义中输入的对象名称错误"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,theorical_margin:0
|
||||
|
@ -83,7 +83,7 @@ msgstr ""
|
|||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
msgstr "对象名称必须以“x_”起头且不能包含任何特殊字符!"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_new
|
||||
|
@ -105,7 +105,7 @@ msgstr ""
|
|||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_all_open
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_all_open
|
||||
msgid "Current Analytic Accounts"
|
||||
msgstr ""
|
||||
msgstr "当前分析科目列表"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,last_worked_date:0
|
||||
|
@ -127,24 +127,24 @@ msgstr ""
|
|||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,last_worked_date:0
|
||||
msgid "Date of Last Cost/Work"
|
||||
msgstr ""
|
||||
msgstr "最后工作日期"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,total_cost:0
|
||||
msgid "Total Costs"
|
||||
msgstr ""
|
||||
msgstr "总成本"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,hours_quantity:0
|
||||
msgid ""
|
||||
"Number of hours you spent on the analytic account (from timesheet). It "
|
||||
"computes on all journal of type 'general'."
|
||||
msgstr ""
|
||||
msgstr "在当前核算项目上的工时数。根据类型为总账的凭证计算而来。"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,remaining_hours:0
|
||||
msgid "Remaining Hours"
|
||||
msgstr ""
|
||||
msgstr "剩余小时数"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,ca_theorical:0
|
||||
|
@ -152,13 +152,13 @@ msgid ""
|
|||
"Based on the costs you had on the project, what would have been the revenue "
|
||||
"if all these costs have been invoiced at the normal sale price provided by "
|
||||
"the pricelist."
|
||||
msgstr ""
|
||||
msgstr "根据项目的当前成本测算出来的利润,这些成本对应的收入是按价格表中的一般销售单价计算出来的。"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,user_ids:0
|
||||
#: field:account_analytic_analysis.summary.user,user:0
|
||||
msgid "User"
|
||||
msgstr ""
|
||||
msgstr "用户"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_pending
|
||||
|
@ -170,18 +170,18 @@ msgstr ""
|
|||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_hr_tree_invoiced_my
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_hr_tree_invoiced_my
|
||||
msgid "My Uninvoiced Entries"
|
||||
msgstr ""
|
||||
msgstr "未开发票条目"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,real_margin:0
|
||||
msgid "Computed using the formula: Invoiced Amount - Total Costs."
|
||||
msgstr ""
|
||||
msgstr "计算公式:发票数量 - 总成本"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_analytic_account_managed
|
||||
msgid "My Accounts"
|
||||
msgstr ""
|
||||
msgstr "我的科目列表"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.module.module,description:account_analytic_analysis.module_meta_information
|
||||
|
@ -194,27 +194,27 @@ msgstr ""
|
|||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,hours_qtt_non_invoiced:0
|
||||
msgid "Uninvoiced Hours"
|
||||
msgstr ""
|
||||
msgstr "未开发票工时"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,hours_quantity:0
|
||||
msgid "Hours Tot"
|
||||
msgstr ""
|
||||
msgstr "工时总计"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_account
|
||||
msgid "Analytic Accounts"
|
||||
msgstr "分析科目"
|
||||
msgstr "核算项目"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.module.module,shortdesc:account_analytic_analysis.module_meta_information
|
||||
msgid "report_account_analytic"
|
||||
msgstr ""
|
||||
msgstr "核算项目报表"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,ca_invoiced:0
|
||||
msgid "Invoiced Amount"
|
||||
msgstr ""
|
||||
msgstr "已开票数量"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.next_id_71
|
||||
|
@ -224,28 +224,28 @@ msgstr ""
|
|||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,last_worked_invoiced_date:0
|
||||
msgid "Date of Last Invoiced Cost"
|
||||
msgstr ""
|
||||
msgstr "最后开票日期"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,ca_to_invoice:0
|
||||
msgid "Uninvoiced Amount"
|
||||
msgstr ""
|
||||
msgstr "未开票金额"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_all_pending
|
||||
#: model:ir.ui.menu,name:account_analytic_analysis.menu_action_account_analytic_all_pending
|
||||
msgid "Pending Analytic Accounts"
|
||||
msgstr ""
|
||||
msgstr "未决分析科目列表"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,hours_qtt_invoiced:0
|
||||
msgid "Invoiced Hours"
|
||||
msgstr ""
|
||||
msgstr "已开票小时数"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,real_margin:0
|
||||
msgid "Real Margin"
|
||||
msgstr ""
|
||||
msgstr "实际利润"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,ca_invoiced:0
|
||||
|
@ -255,12 +255,12 @@ msgstr ""
|
|||
#. module: account_analytic_analysis
|
||||
#: model:ir.model,name:account_analytic_analysis.model_account_analytic_analysis_summary_month
|
||||
msgid "Hours summary by month"
|
||||
msgstr ""
|
||||
msgstr "按月汇总工时数"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,real_margin_rate:0
|
||||
msgid "Computes using the formula: (Real Margin / Total Costs) * 100."
|
||||
msgstr ""
|
||||
msgstr "计算公式: (实际利润 / 总成本) * 100."
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: help:account.analytic.account,hours_qtt_non_invoiced:0
|
||||
|
@ -272,7 +272,7 @@ msgstr ""
|
|||
#. module: account_analytic_analysis
|
||||
#: view:account.analytic.account:0
|
||||
msgid "Analytic accounts"
|
||||
msgstr ""
|
||||
msgstr "分析科目"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,remaining_ca:0
|
||||
|
@ -300,7 +300,7 @@ msgstr ""
|
|||
#: field:account_analytic_analysis.summary.month,unit_amount:0
|
||||
#: field:account_analytic_analysis.summary.user,unit_amount:0
|
||||
msgid "Total Time"
|
||||
msgstr ""
|
||||
msgstr "总时间"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: field:account.analytic.account,month_ids:0
|
||||
|
@ -312,7 +312,7 @@ msgstr ""
|
|||
#: field:account_analytic_analysis.summary.month,account_id:0
|
||||
#: field:account_analytic_analysis.summary.user,account_id:0
|
||||
msgid "Analytic Account"
|
||||
msgstr ""
|
||||
msgstr "分析科目"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
#: model:ir.actions.act_window,name:account_analytic_analysis.action_account_analytic_managed_overpassed
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-24 07:15+0000\n"
|
||||
"Last-Translator: Paco Molinero <paco@byasl.com>\n"
|
||||
"PO-Revision-Date: 2010-01-02 04:24+0000\n"
|
||||
"Last-Translator: Federico Vera <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: 2009-12-25 04:41+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-03 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_balance
|
||||
|
@ -165,7 +165,7 @@ msgstr "Total :"
|
|||
#: rml:account.account.balance.landscape:0
|
||||
#: rml:account.balance.account.balance:0
|
||||
msgid "Account Balance -"
|
||||
msgstr ""
|
||||
msgstr "Balance de cuenta -"
|
||||
|
||||
#. module: account_balance
|
||||
#: wizard_field:account.balance.account.balance.report,init,format_perc:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-17 09:33+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2009-12-30 23:55+0000\n"
|
||||
"Last-Translator: Jarosław Ogrodnik <nobodythere@gmail.com>\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: 2009-12-16 05:25+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-01 05:02+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_budget
|
||||
|
@ -35,7 +35,7 @@ msgstr "Pozycje budżetowe"
|
|||
#. module: account_budget
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "Nieprawidłowa nazwa modelu w definicji akcji."
|
||||
|
||||
#. module: account_budget
|
||||
#: rml:account.analytic.account.budget:0
|
||||
|
@ -51,7 +51,7 @@ msgstr "Zatwierdź"
|
|||
#. module: account_budget
|
||||
#: field:crossovered.budget,validating_user_id:0
|
||||
msgid "Validate User"
|
||||
msgstr ""
|
||||
msgstr "Waliduj użytkownika"
|
||||
|
||||
#. module: account_budget
|
||||
#: constraint:ir.model:0
|
||||
|
|
|
@ -7,19 +7,19 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-09-08 14:27+0000\n"
|
||||
"Last-Translator: xu dong <gnodux@gmail.com>\n"
|
||||
"PO-Revision-Date: 2010-01-08 03:31+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:25+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-10 07:17+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_budget
|
||||
#: field:crossovered.budget,creating_user_id:0
|
||||
msgid "Responsible User"
|
||||
msgstr ""
|
||||
msgstr "负责用户"
|
||||
|
||||
#. module: account_budget
|
||||
#: rml:account.budget:0
|
||||
|
@ -30,23 +30,23 @@ msgstr ""
|
|||
#: model:ir.actions.act_window,name:account_budget.open_budget_post_form
|
||||
#: model:ir.ui.menu,name:account_budget.menu_budget_post_form
|
||||
msgid "Budgetary Positions"
|
||||
msgstr ""
|
||||
msgstr "预算状况"
|
||||
|
||||
#. module: account_budget
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "在动作定义使用了无效的模型名称。"
|
||||
|
||||
#. module: account_budget
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Printed at:"
|
||||
msgstr ""
|
||||
msgstr "打印于:"
|
||||
|
||||
#. module: account_budget
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
msgstr "确认"
|
||||
|
||||
#. module: account_budget
|
||||
#: field:crossovered.budget,validating_user_id:0
|
||||
|
@ -57,12 +57,12 @@ msgstr ""
|
|||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
msgstr "对象名称必须以“x_”起头且不能包含任何特殊字符!"
|
||||
|
||||
#. module: account_budget
|
||||
#: selection:crossovered.budget,state:0
|
||||
msgid "Confirmed"
|
||||
msgstr ""
|
||||
msgstr "已确认"
|
||||
|
||||
#. module: account_budget
|
||||
#: field:account.budget.post.dotation,period_id:0
|
||||
|
@ -80,12 +80,12 @@ msgstr "期末"
|
|||
#. module: account_budget
|
||||
#: rml:account.budget:0
|
||||
msgid "Printing date:"
|
||||
msgstr ""
|
||||
msgstr "打印时间:"
|
||||
|
||||
#. module: account_budget
|
||||
#: selection:crossovered.budget,state:0
|
||||
msgid "Draft"
|
||||
msgstr ""
|
||||
msgstr "草稿"
|
||||
|
||||
#. module: account_budget
|
||||
#: rml:account.analytic.account.budget:0
|
||||
|
@ -109,7 +109,7 @@ msgstr ""
|
|||
#: rml:account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Currency:"
|
||||
msgstr ""
|
||||
msgstr "货币:"
|
||||
|
||||
#. module: account_budget
|
||||
#: rml:account.budget:0
|
||||
|
@ -203,7 +203,7 @@ msgstr ""
|
|||
#: rml:account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Total :"
|
||||
msgstr ""
|
||||
msgstr "总计:"
|
||||
|
||||
#. module: account_budget
|
||||
#: rml:account.analytic.account.budget:0
|
||||
|
@ -256,12 +256,12 @@ msgstr ""
|
|||
#: field:crossovered.budget,date_to:0
|
||||
#: field:crossovered.budget.lines,date_to:0
|
||||
msgid "End Date"
|
||||
msgstr ""
|
||||
msgstr "结束时间"
|
||||
|
||||
#. module: account_budget
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
msgstr "无效的 XML 视图架构!"
|
||||
|
||||
#. module: account_budget
|
||||
#: field:crossovered.budget.lines,theoritical_amount:0
|
||||
|
|
|
@ -7,19 +7,19 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-01-30 12:43+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"PO-Revision-Date: 2010-01-08 03:45+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:17+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-10 07:17+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_date_check
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
msgstr "无效的 XML 视图架构!"
|
||||
|
||||
#. module: account_date_check
|
||||
#: field:account.journal,allow_date:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-01-30 12:49+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-01-08 04:00+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:17+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-10 07:17+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_payment
|
||||
|
@ -29,7 +29,7 @@ msgstr ""
|
|||
#. module: account_payment
|
||||
#: view:payment.order:0
|
||||
msgid "Set to draft"
|
||||
msgstr ""
|
||||
msgstr "设为草稿"
|
||||
|
||||
#. module: account_payment
|
||||
#: help:payment.order,mode:0
|
||||
|
@ -39,7 +39,7 @@ msgstr ""
|
|||
#. module: account_payment
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "在动作定义使用了无效的模型名称。"
|
||||
|
||||
#. module: account_payment
|
||||
#: view:payment.line:0
|
||||
|
|
|
@ -1,312 +0,0 @@
|
|||
# Finnish translation for openobject-addons
|
||||
# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2008-09-05 16:26+0000\n"
|
||||
"PO-Revision-Date: 2009-12-29 10:12+0000\n"
|
||||
"Last-Translator: NightSpirit <Unknown>\n"
|
||||
"Language-Team: Finnish <fi@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: 2009-12-30 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,creating_user_id:0
|
||||
msgid "Responsible User"
|
||||
msgstr "Vastaava Käyttäjä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: selection:crossovered.budget,state:0
|
||||
msgid "Confirmed"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Printed at:"
|
||||
msgstr "Tulostettu:"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,validating_user_id:0
|
||||
msgid "Validate User"
|
||||
msgstr "Vahvista Käyttäjä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget.lines,analytic_account_id:0
|
||||
msgid "Analytic Account Ref"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Currency:"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: selection:crossovered.budget,state:0
|
||||
msgid "Draft"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "at"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.actions.report.xml,name:account_budget_crossover.account_analytic_account_budget
|
||||
#: model:ir.actions.report.xml,name:account_budget_crossover.report_crossovered_budget
|
||||
#: model:ir.actions.wizard,name:account_budget_crossover.account_analytic_account_budget_report
|
||||
#: model:ir.actions.wizard,name:account_budget_crossover.wizard_crossovered_budget_menu
|
||||
msgid "Print Budgets"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: wizard_button:wizard.analytic.account.budget.report,init,report:0
|
||||
#: wizard_button:wizard.crossovered.budget,init,report:0
|
||||
#: wizard_button:wizard.crossovered.budget.summary,init,report:0
|
||||
msgid "Print"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget.lines,percentage:0
|
||||
msgid "Percentage"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: selection:crossovered.budget,state:0
|
||||
msgid "Validated"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.model,name:account_budget_crossover.model_crossovered_budget_lines
|
||||
msgid "Crossovered Budget Lines"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,name:0
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,state:0
|
||||
msgid "Status"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "%"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Description"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
msgid "Analytic Account :"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget.lines,crossovered_budget_id:0
|
||||
msgid "Budget Ref"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "to"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
#: field:crossovered.budget.lines,planned_amount:0
|
||||
msgid "Planned Amount"
|
||||
msgstr "Suunniteltu määrä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.ui.menu,name:account_budget_crossover.menu_financial_reporting_budget_budget_entries
|
||||
msgid "Entries"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Validate"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: wizard_view:wizard.crossovered.budget,init:0
|
||||
#: wizard_view:wizard.crossovered.budget.summary,init:0
|
||||
msgid "Select Options"
|
||||
msgstr "Valitse asetukset"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
#: field:crossovered.budget.lines,practical_amount:0
|
||||
msgid "Practical Amount"
|
||||
msgstr "Käytännöllinen määrä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,date_to:0
|
||||
#: field:crossovered.budget.lines,date_to:0
|
||||
msgid "End Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget.lines,theoritical_amount:0
|
||||
msgid "Theoritical Amount"
|
||||
msgstr "Teoreettinen määrä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Total:"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: selection:crossovered.budget,state:0
|
||||
msgid "Cancelled"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget.lines,general_budget_id:0
|
||||
msgid "Master Budget Ref"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: view:account.analytic.account:0
|
||||
msgid "Lines"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.actions.act_window,name:account_budget_crossover.act_crossovered_budget_view
|
||||
#: model:ir.ui.menu,name:account_budget_crossover.menu_act_crossovered_budget_view
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Budget"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: wizard_view:wizard.analytic.account.budget.report,init:0
|
||||
msgid "Select Dates Period"
|
||||
msgstr "Valitse päivien aikajakso"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget.lines,paid_date:0
|
||||
msgid "Paid Date"
|
||||
msgstr "Maksupäivä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.ui.menu,name:account_budget_crossover.menu_financial_reporting_budget_budget
|
||||
msgid "Budgets"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: wizard_field:wizard.analytic.account.budget.report,init,date_to:0
|
||||
#: wizard_field:wizard.crossovered.budget,init,date_to:0
|
||||
#: wizard_field:wizard.crossovered.budget.summary,init,date_to:0
|
||||
msgid "End of period"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.model,name:account_budget_crossover.model_crossovered_budget
|
||||
msgid "Crossovered Budget"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: wizard_field:wizard.analytic.account.budget.report,init,date_from:0
|
||||
#: wizard_field:wizard.crossovered.budget,init,date_from:0
|
||||
#: wizard_field:wizard.crossovered.budget.summary,init,date_from:0
|
||||
msgid "Start of period"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.actions.wizard,name:account_budget_crossover.wizard_crossovered_budget_menu_1
|
||||
msgid "Print Summary of Budgets"
|
||||
msgstr "Tulosta Budjettien yhteenveto"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,code:0
|
||||
msgid "Code"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Theoretical Amount"
|
||||
msgstr "Teoreettinen määrä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Budget :"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: selection:crossovered.budget,state:0
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Done"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: model:ir.actions.act_window,name:account_budget_crossover.act_crossovered_budget_lines_view
|
||||
#: field:account.analytic.account,crossovered_budget_line:0
|
||||
#: field:account.budget.post,crossovered_budget_line:0
|
||||
#: field:crossovered.budget,crossovered_budget_line:0
|
||||
#: model:ir.ui.menu,name:account_budget_crossover.menu_act_crossovered_budget_lines_view
|
||||
#: view:crossovered.budget:0
|
||||
#: view:account.analytic.account:0
|
||||
#: view:crossovered.budget.lines:0
|
||||
msgid "Budget Lines"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: wizard_button:wizard.analytic.account.budget.report,init,end:0
|
||||
#: wizard_button:wizard.crossovered.budget,init,end:0
|
||||
#: wizard_button:wizard.crossovered.budget.summary,init,end:0
|
||||
#: view:crossovered.budget:0
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:account.budget.post.dotation,tot_planned:0
|
||||
msgid "Total Planned Amount"
|
||||
msgstr "Suunniteltu yhteismäärä"
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: field:crossovered.budget,date_from:0
|
||||
#: field:crossovered.budget.lines,date_from:0
|
||||
msgid "Start Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: account_budget_crossover
|
||||
#: rml:account.analytic.account.budget:0
|
||||
#: rml:crossovered.budget.report:0
|
||||
msgid "Analysis from"
|
||||
msgstr "Analyysit"
|
|
@ -1,88 +0,0 @@
|
|||
# Finnish translation for openobject-addons
|
||||
# Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009
|
||||
# This file is distributed under the same license as the openobject-addons package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2009.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2008-12-30 13:19+0000\n"
|
||||
"PO-Revision-Date: 2009-12-29 09:55+0000\n"
|
||||
"Last-Translator: NightSpirit <Unknown>\n"
|
||||
"Language-Team: Finnish <fi@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: 2009-12-30 04:47+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.node,name:hr_timesheet_project.process_node_timesheettask0
|
||||
msgid "Timesheet task"
|
||||
msgstr "Tuntilistan tehtävä"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.node,name:hr_timesheet_project.process_node_taskwork0
|
||||
msgid "Task Work"
|
||||
msgstr "Työtehtävä"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.transition,note:hr_timesheet_project.process_transition_filltimesheet0
|
||||
msgid "Task summary is comes into the timesheet line"
|
||||
msgstr "Tehtäväyhteenveto tulee tuntilistan riville"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.node,note:hr_timesheet_project.process_node_workontask0
|
||||
msgid "Defines the work summary of task"
|
||||
msgstr "Määrittää tehtävän työyhteenvedon"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.transition,name:hr_timesheet_project.process_transition_taskencoding0
|
||||
msgid "Task encoding"
|
||||
msgstr "Tehtävän koodaus"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.transition,note:hr_timesheet_project.process_transition_tasktimesheet0
|
||||
msgid "Moves task entry into the timesheet line"
|
||||
msgstr "Siirtää tehtäväkohdan tuntilistan riville"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.transition,name:hr_timesheet_project.process_transition_tasktimesheet0
|
||||
msgid "Task timesheet"
|
||||
msgstr "Tehtävän tuntilista"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.node,name:hr_timesheet_project.process_node_workontask0
|
||||
msgid "Work on Task"
|
||||
msgstr "Työskentele tehtävässä"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.transition,note:hr_timesheet_project.process_transition_taskencoding0
|
||||
msgid "Encode how much time u spent on your task"
|
||||
msgstr "Kerro paljonko aikaa käytit tehtävääsi"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.transition,name:hr_timesheet_project.process_transition_filltimesheet0
|
||||
msgid "Fill Timesheet"
|
||||
msgstr "Täytä tuntilista"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:ir.actions.wizard,name:hr_timesheet_project.encode_hour_tss
|
||||
msgid "Import Hours From Tasks"
|
||||
msgstr "Tuo tunnit tehtävästä"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.node,note:hr_timesheet_project.process_node_timesheettask0
|
||||
msgid "Complete Your Timesheet."
|
||||
msgstr "Tee tuntilistasi valmiiksi"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:ir.ui.menu,name:hr_timesheet_project.menu_act_hr_timesheet_line_me_today_project_form
|
||||
msgid "Hours From Tasks"
|
||||
msgstr "Tunnit tehtävästä"
|
||||
|
||||
#. module: hr_timesheet_project
|
||||
#: model:process.node,note:hr_timesheet_project.process_node_taskwork0
|
||||
msgid "Work on task"
|
||||
msgstr "Työskentele tehtävässä"
|
|
@ -7,19 +7,19 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-04-10 10:16+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-01-06 14:14+0000\n"
|
||||
"Last-Translator: Kalle Kniivilä <kalle@kniivila.net>\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: 2009-12-16 05:24+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-07 04:49+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: analytic_journal_billing_rate
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
msgstr "Felaktig XML för Vyarkitektur!"
|
||||
|
||||
#. module: analytic_journal_billing_rate
|
||||
#: field:analytic_journal_rate_grid,journal_id:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-17 09:13+0000\n"
|
||||
"Last-Translator: Kuvaly <kuvaly@seznam.cz>\n"
|
||||
"PO-Revision-Date: 2010-01-04 19:11+0000\n"
|
||||
"Last-Translator: Konki <pavel.konkol@seznam.cz>\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: 2009-12-16 05:25+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: analytic_user_function
|
||||
|
@ -24,7 +24,7 @@ msgstr "Invalidní XML pro zobrazení architektury!"
|
|||
#. module: analytic_user_function
|
||||
#: model:ir.model,name:analytic_user_function.model_analytic_user_funct_grid
|
||||
msgid "Relation table between users and products on a analytic account"
|
||||
msgstr ""
|
||||
msgstr "Vztah mezi uživateli a tabulkou produktů na analytickém účtu"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: field:analytic_user_funct_grid,product_id:0
|
||||
|
|
|
@ -7,58 +7,58 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-09 13:45+0000\n"
|
||||
"Last-Translator: <>\n"
|
||||
"PO-Revision-Date: 2010-01-11 19:35+0000\n"
|
||||
"Last-Translator: Triwanto <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: 2009-12-16 05:25+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-12 04:46+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
msgstr "Salah dalam penyusunan format XML"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: model:ir.model,name:analytic_user_function.model_analytic_user_funct_grid
|
||||
msgid "Relation table between users and products on a analytic account"
|
||||
msgstr ""
|
||||
msgstr "Tabel hubungan antara pengguna dengan produk pada akun analitik"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: field:analytic_user_funct_grid,product_id:0
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
msgstr "Produk"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: field:analytic_user_funct_grid,account_id:0
|
||||
msgid "Analytic Account"
|
||||
msgstr ""
|
||||
msgstr "Akun Analisis"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: view:account.analytic.account:0
|
||||
#: field:account.analytic.account,user_product_ids:0
|
||||
msgid "Users/Products Rel."
|
||||
msgstr ""
|
||||
msgstr "Pengguna/Products Rel"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: field:analytic_user_funct_grid,user_id:0
|
||||
msgid "User"
|
||||
msgstr ""
|
||||
msgstr "Pengguna"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
msgstr "Nama Obyek harus berawalan _x dan tidak mengandung karakter khusus !"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: model:ir.module.module,shortdesc:analytic_user_function.module_meta_information
|
||||
msgid "Analytic User Function"
|
||||
msgstr ""
|
||||
msgstr "Fungsi Pengguna Analitik"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: view:analytic_user_funct_grid:0
|
||||
msgid "User's Product for this Analytic Account"
|
||||
msgstr ""
|
||||
msgstr "Produk Pengguna untuk Akun Analitik ini"
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-02-03 09:18+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-01-02 01:26+0000\n"
|
||||
"Last-Translator: Jarosław Ogrodnik <nobodythere@gmail.com>\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: 2009-12-16 05:25+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-03 04:45+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: analytic_user_function
|
||||
|
@ -34,7 +34,7 @@ msgstr ""
|
|||
#. module: analytic_user_function
|
||||
#: field:analytic_user_funct_grid,account_id:0
|
||||
msgid "Analytic Account"
|
||||
msgstr ""
|
||||
msgstr "Konto analityczne"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: view:account.analytic.account:0
|
||||
|
@ -45,7 +45,7 @@ msgstr ""
|
|||
#. module: analytic_user_function
|
||||
#: field:analytic_user_funct_grid,user_id:0
|
||||
msgid "User"
|
||||
msgstr ""
|
||||
msgstr "Użytkownik"
|
||||
|
||||
#. module: analytic_user_function
|
||||
#: constraint:ir.model:0
|
||||
|
|
|
@ -8,13 +8,13 @@ msgstr ""
|
|||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-29 10:07+0000\n"
|
||||
"Last-Translator: NightSpirit <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-01-05 09:13+0000\n"
|
||||
"Last-Translator: pmjt <Unknown>\n"
|
||||
"Language-Team: Finnish <fi@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: 2009-12-30 04:47+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-06 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: base_contact
|
||||
|
@ -31,7 +31,7 @@ msgstr ""
|
|||
#: constraint:ir.model:0
|
||||
msgid ""
|
||||
"The Object name must start with x_ and not contain any special character !"
|
||||
msgstr ""
|
||||
msgstr "Objektin nimen tulee alkaa x_ ja se ei saa sisältää erikoismerkkejä!"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,function_id:0
|
||||
|
@ -46,7 +46,7 @@ msgstr ""
|
|||
#: view:res.partner.address:0
|
||||
#: field:res.partner.address,job_ids:0
|
||||
msgid "Contacts"
|
||||
msgstr ""
|
||||
msgstr "Kontaktit"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,sequence_partner:0
|
||||
|
@ -56,7 +56,7 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: selection:res.partner.job,state:0
|
||||
msgid "Current"
|
||||
msgstr ""
|
||||
msgstr "Nykyinen"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.contact,first_name:0
|
||||
|
@ -71,7 +71,7 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: field:res.partner.job,other:0
|
||||
msgid "Other"
|
||||
msgstr ""
|
||||
msgstr "Muu"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.transition,name:base_contact.process_transition_contacttofunction0
|
||||
|
@ -81,7 +81,7 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "Virheellinen mallin nimi toimenpiteen määrittelyssä."
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.transition,name:base_contact.process_transition_partnertoaddress0
|
||||
|
@ -101,22 +101,22 @@ msgstr "Lisäpuheliinnumero:"
|
|||
#. module: base_contact
|
||||
#: model:process.node,name:base_contact.process_node_function0
|
||||
msgid "Function"
|
||||
msgstr ""
|
||||
msgstr "Toiminto"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,fax:0
|
||||
msgid "Fax"
|
||||
msgstr ""
|
||||
msgstr "Faksi"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.contact,lang_id:0
|
||||
msgid "Language"
|
||||
msgstr ""
|
||||
msgstr "Kieli"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,phone:0
|
||||
msgid "Phone"
|
||||
msgstr ""
|
||||
msgstr "Puhelin"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.transition,note:base_contact.process_transition_contacttofunction0
|
||||
|
@ -149,7 +149,7 @@ msgstr ""
|
|||
#: field:res.partner.contact,email:0
|
||||
#: field:res.partner.job,email:0
|
||||
msgid "E-Mail"
|
||||
msgstr ""
|
||||
msgstr "Sähköposti"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,date_stop:0
|
||||
|
@ -160,7 +160,7 @@ msgstr "Loppupäivämäärä"
|
|||
#: view:res.partner:0
|
||||
#: field:res.partner.job,address_id:0
|
||||
msgid "Address"
|
||||
msgstr ""
|
||||
msgstr "Osoite"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:ir.actions.act_window,name:base_contact.action_res_partner_job
|
||||
|
@ -189,7 +189,7 @@ msgstr "Päätyötehtävä"
|
|||
#. module: base_contact
|
||||
#: view:res.partner:0
|
||||
msgid "Categories"
|
||||
msgstr ""
|
||||
msgstr "Kategoriat"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.contact,function_id:0
|
||||
|
@ -204,7 +204,7 @@ msgstr "Määrittää kumppanit ja heidän osoitteet"
|
|||
#. module: base_contact
|
||||
#: constraint:ir.ui.view:0
|
||||
msgid "Invalid XML for View Architecture!"
|
||||
msgstr ""
|
||||
msgstr "Virheellinen XML näkymä-arkkitehtuurille!"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.process,name:base_contact.process_process_basecontactprocess0
|
||||
|
@ -219,12 +219,12 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: field:res.partner.job,extension:0
|
||||
msgid "Extension"
|
||||
msgstr ""
|
||||
msgstr "Laajennus"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.contact,mobile:0
|
||||
msgid "Mobile"
|
||||
msgstr ""
|
||||
msgstr "Matkapuhelin"
|
||||
|
||||
#. module: base_contact
|
||||
#: help:res.partner.job,extension:0
|
||||
|
@ -250,12 +250,12 @@ msgstr "Toiminnot ja osoitteet"
|
|||
#. module: base_contact
|
||||
#: field:res.partner.contact,active:0
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
msgstr "Aktiivinen"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,contact_id:0
|
||||
msgid "Contact"
|
||||
msgstr ""
|
||||
msgstr "Kontakti"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.node,note:base_contact.process_node_partners0
|
||||
|
@ -275,23 +275,23 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: model:ir.actions.act_window,name:base_contact.act_res_partner_jobs
|
||||
msgid "Partner Contacts"
|
||||
msgstr ""
|
||||
msgstr "Kumppanien yhteishenkilöt"
|
||||
|
||||
#. module: base_contact
|
||||
#: view:res.partner.contact:0
|
||||
msgid "Partner Contact"
|
||||
msgstr ""
|
||||
msgstr "Kumppanin Yhteystiedot"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.node,name:base_contact.process_node_partners0
|
||||
msgid "Partners"
|
||||
msgstr ""
|
||||
msgstr "Kumppanit"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.node,name:base_contact.process_node_addresses0
|
||||
#: view:res.partner:0
|
||||
msgid "Addresses"
|
||||
msgstr ""
|
||||
msgstr "Osoitteet"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.node,note:base_contact.process_node_addresses0
|
||||
|
@ -301,7 +301,7 @@ msgstr "Työ -ja yksityisosoitteet"
|
|||
#. module: base_contact
|
||||
#: field:res.partner.contact,name:0
|
||||
msgid "Last Name"
|
||||
msgstr ""
|
||||
msgstr "Sukunimi"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,state:0
|
||||
|
@ -312,7 +312,7 @@ msgstr ""
|
|||
#: view:res.partner.contact:0
|
||||
#: view:res.partner.job:0
|
||||
msgid "General"
|
||||
msgstr ""
|
||||
msgstr "Yleiset"
|
||||
|
||||
#. module: base_contact
|
||||
#: selection:res.partner.job,state:0
|
||||
|
@ -322,7 +322,7 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: view:res.partner.contact:0
|
||||
msgid "General Information"
|
||||
msgstr ""
|
||||
msgstr "Yleiset Tiedot"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.node,note:base_contact.process_node_function0
|
||||
|
@ -332,12 +332,12 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: field:res.partner.job,name:0
|
||||
msgid "Partner"
|
||||
msgstr ""
|
||||
msgstr "Kumppani"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.job,date_start:0
|
||||
msgid "Date Start"
|
||||
msgstr ""
|
||||
msgstr "Aloituspäivämäärä"
|
||||
|
||||
#. module: base_contact
|
||||
#: model:process.transition,note:base_contact.process_transition_functiontoaddress0
|
||||
|
@ -347,9 +347,9 @@ msgstr ""
|
|||
#. module: base_contact
|
||||
#: field:res.partner.contact,website:0
|
||||
msgid "Website"
|
||||
msgstr ""
|
||||
msgstr "Websivu"
|
||||
|
||||
#. module: base_contact
|
||||
#: field:res.partner.contact,birthdate:0
|
||||
msgid "Birth Date"
|
||||
msgstr ""
|
||||
msgstr "Syntymäaika"
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-16 13:06+0000\n"
|
||||
"Last-Translator: Silence <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-01-07 11:24+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-17 04:44+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-08 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: base_module_merge
|
||||
|
@ -29,7 +29,7 @@ msgstr "信息"
|
|||
#. module: base_module_merge
|
||||
#: wizard_view:base_module_merge.module_merge,init:0
|
||||
msgid "Module Merging"
|
||||
msgstr ""
|
||||
msgstr "模块合并"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_field:base_module_merge.module_merge,info,author:0
|
||||
|
@ -60,12 +60,12 @@ msgstr "版本"
|
|||
#: wizard_view:base_module_merge.module_merge,info:0
|
||||
#: wizard_view:base_module_merge.module_merge,save:0
|
||||
msgid "Module Recording"
|
||||
msgstr ""
|
||||
msgstr "模块记录"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_view:base_module_merge.module_merge,save:0
|
||||
msgid "Thanks in advance for your contribution."
|
||||
msgstr ""
|
||||
msgstr "感谢您的贡献。"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_field:base_module_merge.module_merge,info,description:0
|
||||
|
@ -81,12 +81,12 @@ msgstr "模块名称"
|
|||
#: model:ir.actions.wizard,name:base_module_merge.wizard_base_module_merger
|
||||
#: model:ir.ui.menu,name:base_module_merge.menu_wizard_base_module_merger
|
||||
msgid "Merge module"
|
||||
msgstr ""
|
||||
msgstr "合并模块"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_field:base_module_merge.module_merge,save,module_file:0
|
||||
msgid "Module .zip File"
|
||||
msgstr ""
|
||||
msgstr "模块 .zip 文件"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: model:ir.module.module,shortdesc:base_module_merge.module_meta_information
|
||||
|
@ -96,7 +96,7 @@ msgstr "模块合并"
|
|||
#. module: base_module_merge
|
||||
#: wizard_view:base_module_merge.module_merge,save:0
|
||||
msgid "Module successfully created !"
|
||||
msgstr ""
|
||||
msgstr "模块已成功创建!"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_field:base_module_merge.module_merge,info,website:0
|
||||
|
@ -117,7 +117,7 @@ msgstr "继续"
|
|||
#. module: base_module_merge
|
||||
#: selection:base_module_merge.module_merge,info,data_kind:0
|
||||
msgid "Normal Data"
|
||||
msgstr ""
|
||||
msgstr "普通数据"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_view:base_module_merge.module_merge,save:0
|
||||
|
@ -126,21 +126,23 @@ msgid ""
|
|||
"publish it on OpenERP.com, in the 'Modules' section. You can do it through "
|
||||
"the website or using features of the 'base_module_publish' module."
|
||||
msgstr ""
|
||||
"如果您认为您的模块其他人也会感兴趣,我们希望您能够把它发布到 OpenERP.com "
|
||||
"的“Modules”部分中。您可以直接通过网站进行发布或者使用“base_module_publish”模块。"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: help:base_module_merge.module_merge,init,modules_list:0
|
||||
msgid "Select Modules which you want to merge in single module"
|
||||
msgstr ""
|
||||
msgstr "选择您希望合并成为单个模块的模块列表"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_field:base_module_merge.module_merge,info,data_kind:0
|
||||
msgid "Type of Data"
|
||||
msgstr ""
|
||||
msgstr "数据类型"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_view:base_module_merge.module_merge,info:0
|
||||
msgid "Module Information"
|
||||
msgstr ""
|
||||
msgstr "模块信息"
|
||||
|
||||
#. module: base_module_merge
|
||||
#: wizard_button:base_module_merge.module_merge,info,end:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-01 15:51+0000\n"
|
||||
"PO-Revision-Date: 2010-01-07 11:38+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:09+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-08 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: base_module_record
|
||||
|
@ -43,7 +43,7 @@ msgstr "对象名必须以“x_”开始且不能包含任何特殊字符!"
|
|||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record_objects,init:0
|
||||
msgid "Choose objects to record"
|
||||
msgstr ""
|
||||
msgstr "选择要记录的对象列表"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,intro,author:0
|
||||
|
@ -83,7 +83,7 @@ msgstr "版本"
|
|||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record_objects,init:0
|
||||
msgid "Objects Recording"
|
||||
msgstr ""
|
||||
msgstr "对象记录"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,init,check_date:0
|
||||
|
@ -94,7 +94,7 @@ msgstr ""
|
|||
#: wizard_view:base_module_record.module_record,stop:0
|
||||
#: wizard_view:base_module_record.module_save,init:0
|
||||
msgid "Recording Information"
|
||||
msgstr ""
|
||||
msgstr "记录信息"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_save,init,info_status:0
|
||||
|
@ -111,24 +111,24 @@ msgstr "状态"
|
|||
#: wizard_view:base_module_record.module_save,init:0
|
||||
#: wizard_view:base_module_record.module_save,save:0
|
||||
msgid "Module Recording"
|
||||
msgstr ""
|
||||
msgstr "模块记录"
|
||||
|
||||
#. module: base_module_record
|
||||
#: model:ir.actions.wizard,name:base_module_record.wizard_base_module_record_objects
|
||||
#: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_objects
|
||||
msgid "Export Customizations As a Module"
|
||||
msgstr ""
|
||||
msgstr "把自定义设置作为模块导出"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record_objects,save:0
|
||||
#: wizard_view:base_module_record.module_save,save:0
|
||||
msgid "Thanks in advance for your contribution."
|
||||
msgstr ""
|
||||
msgstr "感谢您的贡献。"
|
||||
|
||||
#. module: base_module_record
|
||||
#: help:base_module_record.module_record_objects,init,objects:0
|
||||
msgid "List of objects to be recorded"
|
||||
msgstr ""
|
||||
msgstr "将被记录的对象列表"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_button:base_module_record.module_record,start,start_confirm:0
|
||||
|
@ -139,30 +139,30 @@ msgstr "开始录制"
|
|||
#. module: base_module_record
|
||||
#: selection:base_module_record.module_save,init,info_status:0
|
||||
msgid "Not Recording"
|
||||
msgstr ""
|
||||
msgstr "没有记录"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,intro,description:0
|
||||
#: wizard_field:base_module_record.module_save,info,description:0
|
||||
msgid "Full Description"
|
||||
msgstr ""
|
||||
msgstr "完整描述"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,intro,name:0
|
||||
#: wizard_field:base_module_record.module_save,info,name:0
|
||||
msgid "Module Name"
|
||||
msgstr ""
|
||||
msgstr "模块名称"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,init,objects:0
|
||||
msgid "Objects"
|
||||
msgstr ""
|
||||
msgstr "对象"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,save,module_file:0
|
||||
#: wizard_field:base_module_record.module_save,save,module_file:0
|
||||
msgid "Module .zip File"
|
||||
msgstr ""
|
||||
msgstr "模块 .zip 文件"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record,start:0
|
||||
|
@ -173,49 +173,49 @@ msgstr ""
|
|||
#: wizard_view:base_module_record.module_record_objects,save:0
|
||||
#: wizard_view:base_module_record.module_save,save:0
|
||||
msgid "Module successfully created !"
|
||||
msgstr ""
|
||||
msgstr "模块已成功创建!"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record,start:0
|
||||
msgid "Recording Stopped"
|
||||
msgstr ""
|
||||
msgstr "记录已停止"
|
||||
|
||||
#. module: base_module_record
|
||||
#: selection:base_module_record.module_record_objects,init,filter_cond:0
|
||||
msgid "Created"
|
||||
msgstr ""
|
||||
msgstr "已创建"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record_objects,end:0
|
||||
#: wizard_view:base_module_record.module_save,end:0
|
||||
msgid "Thanks For using Module Recorder"
|
||||
msgstr ""
|
||||
msgstr "感谢使用模块记录器"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record,start,continue:0
|
||||
msgid "Continue Previous Session"
|
||||
msgstr ""
|
||||
msgstr "继续上次会话"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_field:base_module_record.module_record_objects,intro,website:0
|
||||
#: wizard_field:base_module_record.module_save,info,website:0
|
||||
msgid "Documentation URL"
|
||||
msgstr ""
|
||||
msgstr "文档地址-URL"
|
||||
|
||||
#. module: base_module_record
|
||||
#: selection:base_module_record.module_record_objects,init,filter_cond:0
|
||||
msgid "Modified"
|
||||
msgstr ""
|
||||
msgstr "已修改"
|
||||
|
||||
#. module: base_module_record
|
||||
#: selection:base_module_record.module_save,init,info_status:0
|
||||
msgid "Recording"
|
||||
msgstr ""
|
||||
msgstr "记录中"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_button:base_module_record.module_record_objects,init,record:0
|
||||
msgid "Record"
|
||||
msgstr ""
|
||||
msgstr "记录"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_button:base_module_record.module_record,stop,end:0
|
||||
|
@ -223,25 +223,25 @@ msgstr ""
|
|||
#: wizard_button:base_module_record.module_save,info,save:0
|
||||
#: wizard_button:base_module_record.module_save,init,check:0
|
||||
msgid "Continue"
|
||||
msgstr ""
|
||||
msgstr "继续"
|
||||
|
||||
#. module: base_module_record
|
||||
#: model:ir.module.module,shortdesc:base_module_record.module_meta_information
|
||||
#: model:ir.ui.menu,name:base_module_record.menu_wizard_base_mod_rec_rec
|
||||
msgid "Module Recorder"
|
||||
msgstr ""
|
||||
msgstr "模块记录器"
|
||||
|
||||
#. module: base_module_record
|
||||
#: selection:base_module_record.module_record_objects,intro,data_kind:0
|
||||
#: selection:base_module_record.module_save,info,data_kind:0
|
||||
msgid "Normal Data"
|
||||
msgstr ""
|
||||
msgstr "普通数据"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_button:base_module_record.module_record_objects,end,end:0
|
||||
#: wizard_button:base_module_record.module_save,end,end:0
|
||||
msgid "OK"
|
||||
msgstr ""
|
||||
msgstr "确定"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record_objects,save:0
|
||||
|
@ -251,6 +251,8 @@ msgid ""
|
|||
"publish it on OpenERP.com, in the 'Modules' section. You can do it through "
|
||||
"the website or using features of the 'base_module_publish' module."
|
||||
msgstr ""
|
||||
"如果您认为您的模块其他人也会感兴趣,我们希望您能够把它发布到 OpenERP.com "
|
||||
"的“Modules”部分中。您可以直接通过网站进行发布或者使用“base_module_publish”模块。"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record,start:0
|
||||
|
@ -281,13 +283,13 @@ msgstr ""
|
|||
#: wizard_field:base_module_record.module_record_objects,intro,data_kind:0
|
||||
#: wizard_field:base_module_record.module_save,info,data_kind:0
|
||||
msgid "Type of Data"
|
||||
msgstr ""
|
||||
msgstr "数据类型"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_view:base_module_record.module_record_objects,intro:0
|
||||
#: wizard_view:base_module_record.module_save,info:0
|
||||
msgid "Module Information"
|
||||
msgstr ""
|
||||
msgstr "模块信息"
|
||||
|
||||
#. module: base_module_record
|
||||
#: model:ir.actions.wizard,name:base_module_record.wizard_base_module_save
|
||||
|
@ -308,13 +310,13 @@ msgstr ""
|
|||
#: wizard_button:base_module_record.module_save,info,end:0
|
||||
#: wizard_button:base_module_record.module_save,init,end:0
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
msgstr "取消"
|
||||
|
||||
#. module: base_module_record
|
||||
#: wizard_button:base_module_record.module_record_objects,save,end:0
|
||||
#: wizard_button:base_module_record.module_save,save,end:0
|
||||
msgid "Close"
|
||||
msgstr ""
|
||||
msgstr "关闭"
|
||||
|
||||
#. module: base_module_record
|
||||
#: selection:base_module_record.module_record_objects,init,filter_cond:0
|
||||
|
@ -324,4 +326,4 @@ msgstr ""
|
|||
#. module: base_module_record
|
||||
#: model:ir.ui.menu,name:base_module_record.menu_wizard_base_module_record_stop
|
||||
msgid "Stop Recording"
|
||||
msgstr ""
|
||||
msgstr "结束记录"
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2008-11-01 13:18+0000\n"
|
||||
"Last-Translator: Sergei Kostigoff <sergei.kostigoff@gmail.com>\n"
|
||||
"PO-Revision-Date: 2010-01-04 08:52+0000\n"
|
||||
"Last-Translator: Stanislav Terentyev <stas@chinese-russian.com>\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: 2009-12-16 05:18+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: base_report_designer
|
||||
|
@ -24,7 +24,7 @@ msgstr "Введение"
|
|||
#. module: base_report_designer
|
||||
#: wizard_view:base_report_designer.modify,send_form:0
|
||||
msgid "Upload your modified report"
|
||||
msgstr "Выгрузить ваш измененный отчет"
|
||||
msgstr "Выгрузить измененный вами отчет"
|
||||
|
||||
#. module: base_report_designer
|
||||
#: wizard_button:base_report_designer.modify,get_form_result,send_form:0
|
||||
|
@ -54,7 +54,7 @@ msgstr "Ваш отчет был изменен"
|
|||
#. module: base_report_designer
|
||||
#: model:ir.module.module,shortdesc:base_report_designer.module_meta_information
|
||||
msgid "Report designer interface module"
|
||||
msgstr ""
|
||||
msgstr "Модуль интерфейса для оформления отчетов"
|
||||
|
||||
#. module: base_report_designer
|
||||
#: wizard_field:base_report_designer.modify,get_form,report_id:0
|
||||
|
@ -99,6 +99,10 @@ msgid ""
|
|||
"to modify it. Once it is modified, re-upload it in Open ERP using this "
|
||||
"wizard."
|
||||
msgstr ""
|
||||
"Это шаблон запрошенного вами отчета. Сохраните его как файл формата .SXW и "
|
||||
"откройте с помощью программы OpenOffice. Не забудьте установить пакет Tiny "
|
||||
"OpenOffice для его изменения. По завершении изменения загрузите его снова в "
|
||||
"Open ERP с помощью этого мастера."
|
||||
|
||||
#. module: base_report_designer
|
||||
#: wizard_button:base_report_designer.modify,send_form,send_form_result:0
|
||||
|
@ -108,7 +112,7 @@ msgstr "Обновить отчет"
|
|||
#. module: base_report_designer
|
||||
#: selection:base_report_designer.modify,init,operation:0
|
||||
msgid "Create a new report"
|
||||
msgstr ""
|
||||
msgstr "Создать новый отчет"
|
||||
|
||||
#. module: base_report_designer
|
||||
#: selection:base_report_designer.modify,init,operation:0
|
||||
|
|
|
@ -7,14 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-04 16:47+0000\n"
|
||||
"Last-Translator: Jordi Esteve - http://www.zikzakmedia.com "
|
||||
"<jesteve@zikzakmedia.com>\n"
|
||||
"PO-Revision-Date: 2009-12-30 19:26+0000\n"
|
||||
"Last-Translator: Camilo Usuga <milousuga@gmail.com>\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: 2009-12-16 05:09+0000\n"
|
||||
"X-Launchpad-Export-Date: 2009-12-31 04:57+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: base_vat
|
||||
|
@ -38,4 +37,4 @@ msgstr "Sujeto a IVA"
|
|||
#. module: base_vat
|
||||
#: model:ir.module.module,shortdesc:base_vat.module_meta_information
|
||||
msgid "VAT"
|
||||
msgstr "CIF/NIF"
|
||||
msgstr "IVA"
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -7,24 +7,24 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-15 13:43+0000\n"
|
||||
"Last-Translator: Silence <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-01-08 04:21+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:21+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-10 07:17+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: board_account
|
||||
#: view:board.board:0
|
||||
msgid "Analytic accounts to close"
|
||||
msgstr ""
|
||||
msgstr "要关闭的分析科目"
|
||||
|
||||
#. module: board_account
|
||||
#: view:board.board:0
|
||||
msgid "Draft invoices"
|
||||
msgstr ""
|
||||
msgstr "发票草稿"
|
||||
|
||||
#. module: board_account
|
||||
#: constraint:ir.ui.view:0
|
||||
|
@ -35,12 +35,12 @@ msgstr "无效的XML视图结构!"
|
|||
#: model:ir.actions.act_window,name:board_account.open_board_account
|
||||
#: model:ir.ui.menu,name:board_account.menu_board_account
|
||||
msgid "Accounting Dashboard"
|
||||
msgstr ""
|
||||
msgstr "会计看板"
|
||||
|
||||
#. module: board_account
|
||||
#: model:ir.actions.act_window,name:board_account.action_aged_receivable
|
||||
msgid "Receivable Accounts"
|
||||
msgstr ""
|
||||
msgstr "应收款科目"
|
||||
|
||||
#. module: board_account
|
||||
#: view:board.board:0
|
||||
|
@ -77,7 +77,7 @@ msgstr ""
|
|||
#. module: board_account
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "在动作定义使用了无效的模型名称。"
|
||||
|
||||
#. module: board_account
|
||||
#: model:ir.ui.menu,name:board_account.next_id_68
|
||||
|
@ -87,7 +87,7 @@ msgstr "会计及账簿"
|
|||
#. module: board_account
|
||||
#: view:board.board:0
|
||||
msgid "Account Board"
|
||||
msgstr ""
|
||||
msgstr "会计看板"
|
||||
|
||||
#. module: board_account
|
||||
#: view:board.board:0
|
||||
|
|
|
@ -7,13 +7,13 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2008-11-04 11:07+0000\n"
|
||||
"Last-Translator: Sergei Kostigoff <sergei.kostigoff@gmail.com>\n"
|
||||
"PO-Revision-Date: 2010-01-04 08:44+0000\n"
|
||||
"Last-Translator: Stanislav Terentyev <stas@chinese-russian.com>\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: 2009-12-16 05:04+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-05 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: board_association
|
||||
|
@ -24,7 +24,7 @@ msgstr "Ассоциации"
|
|||
#. module: board_association
|
||||
#: model:ir.module.module,shortdesc:board_association.module_meta_information
|
||||
msgid "Dashboard for Associations"
|
||||
msgstr ""
|
||||
msgstr "Панель инструментов для ассоциаций"
|
||||
|
||||
#. module: board_association
|
||||
#: constraint:ir.ui.view:0
|
||||
|
@ -55,7 +55,7 @@ msgstr "НЕоплаченные счета"
|
|||
#. module: board_association
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "Недопустимое имя модели в определении действия."
|
||||
|
||||
#. module: board_association
|
||||
#: view:board.board:0
|
||||
|
|
|
@ -7,25 +7,25 @@ msgstr ""
|
|||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-12-15 13:24+0000\n"
|
||||
"Last-Translator: Silence <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-01-07 11:12+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\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: 2009-12-16 05:06+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-01-08 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: board_sale
|
||||
#: model:ir.module.module,shortdesc:board_sale.module_meta_information
|
||||
msgid "Dashboard for sales"
|
||||
msgstr ""
|
||||
msgstr "销售情况看板"
|
||||
|
||||
#. module: board_sale
|
||||
#: model:ir.actions.act_window,name:board_sale.open_board_sales_manager
|
||||
#: model:ir.ui.menu,name:board_sale.menu_board_sales_manager
|
||||
msgid "Sale Dashboard"
|
||||
msgstr ""
|
||||
msgstr "销售看板"
|
||||
|
||||
#. module: board_sale
|
||||
#: view:board.board:0
|
||||
|
|
|
@ -37,7 +37,9 @@
|
|||
"author" : "Tiny",
|
||||
'category': 'Generic Modules/Others',
|
||||
'website': 'http://www.openerp.com',
|
||||
"init_xml" : [],
|
||||
"init_xml" : [
|
||||
'caldav_data.xml'
|
||||
],
|
||||
"demo_xml" : [],
|
||||
"update_xml" : [
|
||||
'security/ir.model.access.csv',
|
||||
|
|
|
@ -0,0 +1,134 @@
|
|||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
|
||||
<data noupdate="1">
|
||||
<record model="res.alarm" id="alarm1">
|
||||
<field name="name">1 minute before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="1" />
|
||||
<field name="trigger_interval">minutes</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm2">
|
||||
<field name="name">5 minutes before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="5" />
|
||||
<field name="trigger_interval">minutes</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm3">
|
||||
<field name="name">10 minutes before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="10" />
|
||||
<field name="trigger_interval">minutes</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm4">
|
||||
<field name="name">15 minutes before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="15" />
|
||||
<field name="trigger_interval">minutes</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm5">
|
||||
<field name="name">30 minutes before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="30" />
|
||||
<field name="trigger_interval">minutes</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm6">
|
||||
<field name="name">45 minutes before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="45" />
|
||||
<field name="trigger_interval">minutes</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm7">
|
||||
<field name="name">1 hour before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="1" />
|
||||
<field name="trigger_interval">hours</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm8">
|
||||
<field name="name">2 hours before</field>
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="2" />
|
||||
<field name="trigger_interval">hours</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm9">
|
||||
<field name="name">3 hours before</field>
|
||||
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="3" />
|
||||
<field name="trigger_interval">hours</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm10">
|
||||
<field name="name">4 hours before</field>
|
||||
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="4" />
|
||||
<field name="trigger_interval">hours</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm11">
|
||||
<field name="name">5 hours before</field>
|
||||
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="5" />
|
||||
<field name="trigger_interval">hours</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
<record model="res.alarm" id="alarm12">
|
||||
<field name="name">18 hours before</field>
|
||||
|
||||
<field name="active" eval="1" />
|
||||
<field name="trigger_duration" eval="18" />
|
||||
<field name="trigger_interval">hours</field>
|
||||
<field name="trigger_occurs">before</field>
|
||||
<field name="trigger_related">start</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Scheduler for Event Alarm-->
|
||||
<record forcecreate="True" id="ir_cron_scheduler_alarm"
|
||||
model="ir.cron">
|
||||
<field name="name">Run Event Reminder</field>
|
||||
<field eval="True" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">minutes</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'calendar.alarm'" name="model" />
|
||||
<field eval="'do_run_scheduler'" name="function" />
|
||||
<field eval="'(False,)'" name="args" />
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -1,88 +1,221 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- Attendee invite wizard-->
|
||||
|
||||
<record id="view_calendar_invite_attendee_wizard" model="ir.ui.view">
|
||||
<field name="name">Invite Attendees</field>
|
||||
<field name="model">caldav.invite.attendee</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Invite Attendees">
|
||||
<separator string="Atendee details" colspan="4"/>
|
||||
<field name="attendee_ids" mode="tree,form" nolabel="1" widget="one2many_list" colspan="4">
|
||||
<form string="Attendee details">
|
||||
<field name="user_id" on_change="onchange_user_id(user_id)" />
|
||||
<field name="availability" />
|
||||
<field name="email" select="1"/>
|
||||
<newline />
|
||||
<field name="role" select="1" />
|
||||
<field name="cutype" select="1" />
|
||||
<newline />
|
||||
<field name="rsvp" />
|
||||
</form>
|
||||
<tree string="Attendee details" editable="bottom">
|
||||
<field name="user_id" on_change="onchange_user_id(user_id)" />
|
||||
<field name="availability" />
|
||||
<field name="email" select="1"/>
|
||||
<field name="role" select="1" />
|
||||
<field name="cutype" select="1" />
|
||||
<field name="language" />
|
||||
<field name="rsvp" />
|
||||
</tree>
|
||||
</field>
|
||||
<separator string="" colspan="6" />
|
||||
<label string="" colspan="2"/>
|
||||
<button icon='gtk-cancel' special="cancel" string="Cancel"/>
|
||||
<button string="Invite"
|
||||
name="do_invite"
|
||||
icon="gtk-ok" type="object" />
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_view_calendar_invite_attendee_wizard" model="ir.actions.act_window">
|
||||
<field name="name">Invite Attendees</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">caldav.invite.attendee</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<record id="caldav_attendee_form_view" model="ir.ui.view">
|
||||
<field name="name">crm.case.caldav.attendee</field>
|
||||
<field name="model">crm.caldav.attendee</field>
|
||||
<field name="name">calendar.attendee.form</field>
|
||||
<field name="model">calendar.attendee</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Atendee details">
|
||||
<field name="cutype" select="1"/>
|
||||
<field name="member"/>
|
||||
<field name="role" select="1"/>
|
||||
<field name="partstat"/>
|
||||
<field name="rsvp"/>
|
||||
<field name="delegated_to" select="1"/>
|
||||
<field name="delegated_from" select="1"/>
|
||||
<field name="sent_by"/>
|
||||
<field name="cn" select="1"/>
|
||||
<field name="dir"/>
|
||||
<field name="language"/>
|
||||
</form>
|
||||
<field name="user_id"
|
||||
on_change="onchange_user_id(user_id)" readonly="1" />
|
||||
<field name="email" select="1" readonly="1" />
|
||||
<newline />
|
||||
<field name="role" select="1" readonly="1" string="Role" />
|
||||
<field name="cutype" select="1" readonly="1" string="Invitation type" />
|
||||
<newline />
|
||||
<field name="rsvp" readonly="1" />
|
||||
<notebook colspan="4">
|
||||
<page string="Details">
|
||||
<field name="event_date" />
|
||||
<field name="event_end_date" />
|
||||
<newline />
|
||||
<field name="sent_by_uid" readonly="1"/>
|
||||
<field name="dir" widget='url' readonly="1"/>
|
||||
<field name="language" readonly="1"/>
|
||||
<newline />
|
||||
<field name="ref" colspan="4" readonly="1"/>
|
||||
</page>
|
||||
<page string="Delegation Info">
|
||||
<separator string="Delegated to" colspan="4" />
|
||||
<field name="del_to_user_ids" nolabel="1"
|
||||
colspan="4" readonly="1" />
|
||||
<separator string="Delegated from" colspan="4" />
|
||||
<field name="del_from_user_ids" nolabel="1"
|
||||
colspan="4" readonly="1" />
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="6" colspan="4">
|
||||
<field name="state" select="2" />
|
||||
<button name="do_tentative"
|
||||
string="Uncertain"
|
||||
states="needs-action" type="object"
|
||||
icon="terp-crm" />
|
||||
<button name="do_accept"
|
||||
string="Accept"
|
||||
states="needs-action" type="object"
|
||||
icon="gtk-apply" />
|
||||
<button name="do_decline"
|
||||
string="Decline"
|
||||
states="needs-action" type="object"
|
||||
icon="gtk-cancel" />
|
||||
<button
|
||||
name="%(caldav.action_view_calendar_invite_attendee_wizard)d"
|
||||
states="needs-action" string="Delegate"
|
||||
type="action" icon="gtk-sort-descending"
|
||||
context="{'model' : 'calendar.attendee', 'state' : 'delegated'}" />
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="caldav_attendee_tree_view" model="ir.ui.view">
|
||||
<field name="name">crm.case.caldav.attendee</field>
|
||||
<field name="model">crm.caldav.attendee</field>
|
||||
<field name="name">calendar.attendee.tree</field>
|
||||
<field name="model">calendar.attendee</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Atendee details">
|
||||
<field name="cutype" select="1"/>
|
||||
<field name="member"/>
|
||||
<field name="role" select="1"/>
|
||||
<field name="partstat"/>
|
||||
<field name="rsvp"/>
|
||||
<field name="delegated_to" select="1"/>
|
||||
<field name="delegated_from" select="1"/>
|
||||
<field name="sent_by"/>
|
||||
<field name="cn" select="1"/>
|
||||
<field name="dir"/>
|
||||
<field name="language"/>
|
||||
</tree>
|
||||
<field name="cn" select="1" />
|
||||
<field name="state" />
|
||||
<field name="cutype" select="1" />
|
||||
<field name="role" select="1" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_view_attendee_form" model="ir.actions.act_window">
|
||||
<field name="name">My Invitations</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">calendar.attendee</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="caldav_attendee_tree_view" />
|
||||
<field name="domain">[('user_id', '=', uid)]</field>
|
||||
<field name="context">{'default_sent_by_uid': uid}</field>
|
||||
</record>
|
||||
|
||||
<record id="action_invitation_tree_view1" model="ir.actions.act_window.view">
|
||||
<field eval="1" name="sequence" />
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="caldav_attendee_tree_view" />
|
||||
<field name="act_window_id" ref="action_view_attendee_form" />
|
||||
</record>
|
||||
|
||||
<record id="action_invitation_form_view1" model="ir.actions.act_window.view">
|
||||
<field eval="2" name="sequence" />
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="caldav_attendee_form_view" />
|
||||
<field name="act_window_id" ref="action_view_attendee_form" />
|
||||
</record>
|
||||
|
||||
|
||||
<record id="caldav_attendee_tree_model" model="ir.ui.view">
|
||||
<field name="name">calendar.attendee.tree1</field>
|
||||
<field name="model">calendar.attendee</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="priority">10</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Atendee details">
|
||||
<field name="user_id" select="1" />
|
||||
<field name="email" />
|
||||
<field name="state" />
|
||||
<field name="cutype" select="1" />
|
||||
<field name="role" select="1" />
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="caldav_alarm_form_view" model="ir.ui.view">
|
||||
<field name="name">crm.case.caldav.alarm.form</field>
|
||||
<field name="model">crm.caldav.alarm</field>
|
||||
<record id="caldav_attendee_form_model" model="ir.ui.view">
|
||||
<field name="name">calendar.attendee.form1</field>
|
||||
<field name="model">calendar.attendee</field>
|
||||
<field name="type">form</field>
|
||||
<field name="priority">10</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Atendee details">
|
||||
<field name="user_id" select="1"/>
|
||||
<field name="state" />
|
||||
<field name="cutype" select="1" />
|
||||
<field name="role" select="1" />
|
||||
<newline/>
|
||||
<field name="rsvp" select="1" />
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="res_alarm_form_view" model="ir.ui.view">
|
||||
<field name="name">res.alarm.form</field>
|
||||
<field name="model">res.alarm</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Alarm details">
|
||||
<field name="action"/>
|
||||
<field name="name" select="1" attrs="{'required' : [('action','in',('EMAIL', 'DISPLAY'))]}"/>
|
||||
<separator string="Description" colspan="4"/>
|
||||
<field name="description" colspan="4" nolabel="1" attrs="{'required' : [('action','in',('EMAIL'))]}"/>
|
||||
<form string="Reminder details">
|
||||
<field name="name" select="1"/>
|
||||
<field name="active"/>
|
||||
<group string="Reminder details" col="4" colspan="4">
|
||||
<field name="trigger_duration" nolabel="1" select="1"/>
|
||||
<field name="trigger_interval" nolabel="1" select="1"/>
|
||||
<field name="trigger_occurs" nolabel="1" select="1"/>
|
||||
<field name="trigger_related" nolabel="1" select="1"/>
|
||||
</group>
|
||||
<field name="duration"/>
|
||||
<field name="repeat"/>
|
||||
<field name="attach" colspan="4" attrs="{'required' : [('action','in',('AUDIO', 'PROCEDURE'))]}"/>
|
||||
</group>
|
||||
<field name="duration"/>
|
||||
<field name="repeat"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="caldav_alarm_tree_view" model="ir.ui.view">
|
||||
<field name="name">crm.case.caldav.alarm.tree</field>
|
||||
<field name="model">crm.caldav.alarm</field>
|
||||
<record id="res_tree_view" model="ir.ui.view">
|
||||
<field name="name">res.alarm.tree</field>
|
||||
<field name="model">res.alarm</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Alarm details">
|
||||
<field name="name" select="1"/>
|
||||
<field name="action"/>
|
||||
<field name="trigger_interval" select="1"/>
|
||||
<field name="trigger_duration" select="1"/>
|
||||
<field name="trigger_related" select="1"/>
|
||||
<field name="trigger_occurs" select="1"/>
|
||||
<field name="active"/>
|
||||
</tree>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Reminder details">
|
||||
<field name="name" select="1"/>
|
||||
<field name="trigger_interval" select="1"/>
|
||||
<field name="trigger_duration" select="1"/>
|
||||
<field name="trigger_related" select="1"/>
|
||||
<field name="trigger_occurs" select="1"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record id="view_caldav_set_rrule_wizard" model="ir.ui.view">
|
||||
<field name="name">Add RRule</field>
|
||||
|
@ -99,7 +232,7 @@
|
|||
<field name="end_date"
|
||||
attrs="{'required' : [('count','<=',0), ('freq', '!=', 'None')]}"/>
|
||||
<group col="7" colspan="4" name="Select weekdays"
|
||||
attrs="{'invisible' : [('freq','!=','WEEKLY')]}">
|
||||
attrs="{'invisible' : [('freq','!=','weekly')]}">
|
||||
<separator string="" colspan="6" />
|
||||
<newline />
|
||||
<field name="mo" colspan="1" />
|
||||
|
@ -111,7 +244,7 @@
|
|||
<field name="su" colspan="1" />
|
||||
<newline />
|
||||
</group>
|
||||
<group col="4" colspan="4" attrs="{'invisible' : [('freq','!=','MONTHLY'), ('freq','!=','YEARLY')]}">
|
||||
<group col="4" colspan="4" attrs="{'invisible' : [('freq','!=','monthly'), ('freq','!=','yearly')]}">
|
||||
<separator string="" colspan="6"/>
|
||||
<group col="2" colspan="4">
|
||||
<field name="select1"/>
|
||||
|
@ -129,14 +262,15 @@
|
|||
<label string="of the Month" />
|
||||
<newline />
|
||||
</group>
|
||||
<group col="2" colspan="4" attrs="{'invisible' : [('freq','!=','YEARLY')]}">
|
||||
<group col="2" colspan="4" attrs="{'invisible' : [('freq','!=','yearly')]}">
|
||||
<field name="month_list" string="of" colspan="1"
|
||||
attrs="{'required' : [('freq','=','YEARLY')]}"/>
|
||||
attrs="{'required' : [('freq','=','yearly')]}"/>
|
||||
</group>
|
||||
</group>
|
||||
<separator string="" colspan="6" />
|
||||
<label string="" colspan="3"/>
|
||||
<button name="add_rrule" string="Ok" type="object" icon="gtk-ok"/>
|
||||
<label string="" colspan="2"/>
|
||||
<button icon='gtk-cancel' special="cancel" string="Cancel"/>
|
||||
<button name="do_add" string="Ok" type="object" icon="gtk-ok"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
@ -150,6 +284,5 @@
|
|||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -44,7 +44,9 @@ def map_data(cr, uid, obj):
|
|||
continue
|
||||
mapping =obj.__attribute__[map_dict].get('mapping', False)
|
||||
if mapping:
|
||||
map_val = mapping[map_val]
|
||||
map_val = mapping[map_val.lower()]
|
||||
else:
|
||||
map_val = map_val.lower()
|
||||
if field_type == 'many2many':
|
||||
ids = []
|
||||
if not map_val:
|
||||
|
@ -59,7 +61,7 @@ def map_data(cr, uid, obj):
|
|||
continue
|
||||
if field_type == 'many2one':
|
||||
id = None
|
||||
if not map_val:
|
||||
if not map_val or not isinstance(map_val, dict):
|
||||
vals[field] = id
|
||||
continue
|
||||
model = obj.__attribute__[map_dict].get('object', False)
|
||||
|
@ -75,14 +77,8 @@ class CalDAV(object):
|
|||
__attribute__ = {
|
||||
}
|
||||
def get_recurrent_dates(self, rrulestring, exdate, startdate=None):
|
||||
def todate(date):
|
||||
val = parser.parse(''.join((re.compile('\d')).findall(date)) + 'Z')
|
||||
return val
|
||||
|
||||
if not startdate:
|
||||
startdate = datetime.now()
|
||||
else:
|
||||
startdate = todate(startdate)
|
||||
startdate = datetime.now()
|
||||
rset1 = rrulestr(rrulestring, dtstart=startdate, forceset=True)
|
||||
|
||||
for date in exdate:
|
||||
|
@ -132,12 +128,16 @@ class CalDAV(object):
|
|||
continue
|
||||
uidval = common.openobjectid2uid(cr, data[map_field], model)
|
||||
vevent.add('uid').value = uidval
|
||||
elif field == 'attendee' and data[map_field]:
|
||||
attendee_obj = self.pool.get('caldav.attendee')
|
||||
vevent = attendee_obj.export_ical(cr, uid, data[map_field], vevent, context=context)
|
||||
elif field == 'valarm' and data[map_field]:
|
||||
alarm_obj = self.pool.get('caldav.alarm')
|
||||
vevent = alarm_obj.export_ical(cr, uid, data[map_field][0], vevent, context=context)
|
||||
elif field == 'attendee' and data[map_field]:
|
||||
#vevent.add('attendee').value = data[map_field]
|
||||
#TODO : To export attendee
|
||||
pass
|
||||
|
||||
elif field == 'valarm' and data[map_field]:
|
||||
# vevent.add('valarm').value = data[map_field]
|
||||
#TODO : To export valarm
|
||||
pass
|
||||
|
||||
elif data[map_field]:
|
||||
if map_type == "text":
|
||||
vevent.add(field).value = str(data[map_field])
|
||||
|
@ -148,10 +148,12 @@ class CalDAV(object):
|
|||
vevent.add(field).value = parser.parse(data[map_field])
|
||||
elif map_type == "timedelta":
|
||||
vevent.add(field).value = timedelta(hours=data[map_field])
|
||||
elif map_type == "many2one":
|
||||
vevent.add(field).value = [data.get(map_field)[1]]
|
||||
if self.__attribute__.get(field).has_key('mapping'):
|
||||
for key1, val1 in self.ical_get(field, 'mapping').items():
|
||||
if val1 == data[map_field]:
|
||||
vevent.add(field).value = key1
|
||||
vevent.add(field).value = key1
|
||||
return ical
|
||||
|
||||
def import_ical(self, cr, uid, ical_data):
|
||||
|
@ -160,26 +162,30 @@ class CalDAV(object):
|
|||
res = []
|
||||
for child in parsedCal.getChildren():
|
||||
for cal_data in child.getChildren():
|
||||
if cal_data.name.lower() == 'attendee':
|
||||
attendee = self.pool.get('caldav.attendee')
|
||||
att_data.append(attendee.import_ical(cr, uid, cal_data))
|
||||
self.ical_set(cal_data.name.lower(), att_data, 'value')
|
||||
continue
|
||||
if cal_data.name.lower() == 'valarm':
|
||||
alarm = self.pool.get('caldav.alarm')
|
||||
vals = alarm.import_ical(cr, uid, cal_data)
|
||||
self.ical_set(cal_data.name.lower(), vals, 'value')
|
||||
continue
|
||||
#if cal_data.name.lower() == 'attendee':
|
||||
# attendee = self.pool.get('basic.calendar.attendee')
|
||||
# att_data.append(attendee.import_ical(cr, uid, cal_data))
|
||||
# self.ical_set(cal_data.name.lower(), cal_data.value, 'value')
|
||||
# continue
|
||||
#if cal_data.name.lower() == 'valarm':
|
||||
# alarm = self.pool.get('basic.calendar.alarm')
|
||||
# vals = alarm.import_ical(cr, uid, cal_data)
|
||||
# self.ical_set(cal_data.name.lower(), cal_data.value, 'value')
|
||||
# continue
|
||||
if cal_data.name.lower() in self.__attribute__:
|
||||
self.ical_set(cal_data.name.lower(), cal_data.value, 'value')
|
||||
vals = map_data(cr, uid, self)
|
||||
if vals: res.append(vals)
|
||||
self.ical_reset('value')
|
||||
if child.name.lower() in ('vevent', 'vtodo'):
|
||||
vals = map_data(cr, uid, self)
|
||||
else:
|
||||
vals = {}
|
||||
continue
|
||||
if vals: res.append(vals)
|
||||
self.ical_reset('value')
|
||||
return res
|
||||
|
||||
|
||||
class Calendar(CalDAV, osv.osv_memory):
|
||||
_name = 'caldav.calendar'
|
||||
_name = 'basic.calendar'
|
||||
__attribute__ = {
|
||||
'prodid': None, # Use: R-1, Type: TEXT, Specifies the identifier for the product that created the iCalendar object.
|
||||
'version': None, # Use: R-1, Type: TEXT, Specifies the identifier corresponding to the highest version number
|
||||
|
@ -198,7 +204,7 @@ class Calendar(CalDAV, osv.osv_memory):
|
|||
Calendar()
|
||||
|
||||
class Event(CalDAV, osv.osv_memory):
|
||||
_name = 'caldav.event'
|
||||
_name = 'basic.calendar.event'
|
||||
__attribute__ = {
|
||||
'class': None, # Use: O-1, Type: TEXT, Defines the access classification for a calendar component like "PUBLIC" / "PRIVATE" / "CONFIDENTIAL"
|
||||
'created': None, # Use: O-1, Type: DATE-TIME, Specifies the date and time that the calendar information was created by the calendar user agent in the calendar store.
|
||||
|
@ -226,7 +232,7 @@ class Event(CalDAV, osv.osv_memory):
|
|||
'exrule': None, # Use: O-n, Type: RECUR, Defines a rule or repeating pattern for an exception to a recurrence set.
|
||||
'rstatus': None,
|
||||
'related': None, # Use: O-n, Specify the relationship of the alarm trigger with respect to the start or end of the calendar component.
|
||||
# like A trigger set 5 minutes after the end of the event or to-do.---> TRIGGER;RELATED=END:PT5M
|
||||
# like A trigger set 5 minutes after the end of the event or to-do.---> TRIGGER;related=END:PT5M
|
||||
'resources': None, # Use: O-n, Type: TEXT, Defines the equipment or resources anticipated for an activity specified by a calendar entity like RESOURCES:EASEL,PROJECTOR,VCR, LANGUAGE=fr:1 raton-laveur
|
||||
'rdate': None, # Use: O-n, Type: DATE-TIME, Defines the list of date/times for a recurrence set.
|
||||
'rrule': None, # Use: O-n, Type: RECUR, Defines a rule or repeating pattern for recurring events, to-dos, or time zone definitions.
|
||||
|
@ -240,7 +246,7 @@ class Event(CalDAV, osv.osv_memory):
|
|||
Event()
|
||||
|
||||
class ToDo(CalDAV, osv.osv_memory):
|
||||
_name = 'caldav.todo'
|
||||
_name = 'basic.calendar.todo'
|
||||
|
||||
__attribute__ = {
|
||||
'class': None,
|
||||
|
@ -316,79 +322,83 @@ class Timezone(CalDAV):
|
|||
|
||||
|
||||
class Alarm(CalDAV, osv.osv_memory):
|
||||
_name = 'caldav.alarm'
|
||||
_name = 'basic.calendar.alarm'
|
||||
__attribute__ = {
|
||||
'action': None, # Use: R-1, Type: Text, defines the action to be invoked when an alarm is triggered LIKE "AUDIO" / "DISPLAY" / "EMAIL" / "PROCEDURE"
|
||||
'description': None, # Type: Text, Provides a more complete description of the calendar component, than that provided by the "SUMMARY" property. Use:- R-1 for DISPLAY,Use:- R-1 for EMAIL,Use:- R-1 for PROCEDURE
|
||||
'summary': None, # Use: R-1, Type: Text Which contains the text to be used as the message subject. Use for EMAIL
|
||||
'attendee': None, # Use: R-n, Type: CAL-ADDRESS, Contain the email address of attendees to receive the message. It can also include one or more. Use for EMAIL
|
||||
'trigger': None, # Use: R-1, Type: DURATION, The "TRIGGER" property specifies a duration prior to the start of an event or a to-do. The "TRIGGER" edge may be explicitly set to be relative to the "START" or "END" of the event or to-do with the "RELATED" parameter of the "TRIGGER" property. The "TRIGGER" property value type can alternatively be set to an absolute calendar date and time of day value. Use for all action like AUDIO, DISPLAY, EMAIL and PROCEDURE
|
||||
'trigger': None, # Use: R-1, Type: DURATION, The "TRIGGER" property specifies a duration prior to the start of an event or a to-do. The "TRIGGER" edge may be explicitly set to be relative to the "START" or "END" of the event or to-do with the "related" parameter of the "TRIGGER" property. The "TRIGGER" property value type can alternatively be set to an absolute calendar date and time of day value. Use for all action like AUDIO, DISPLAY, EMAIL and PROCEDURE
|
||||
'duration': None, # Type: DURATION, Duration' and 'repeat' are both optional, and MUST NOT occur more than once each, but if one occurs, so MUST the other. Use:- 0-1 for AUDIO, EMAIL and PROCEDURE, Use:- 0-n for DISPLAY
|
||||
'repeat': None, # Type: INTEGER, Duration' and 'repeat' are both optional, and MUST NOT occur more than once each, but if one occurs, so MUST the other. Use:- 0-1 for AUDIO, EMAIL and PROCEDURE, Use:- 0-n for DISPLAY
|
||||
'attach': None, # Use:- O-n: which MUST point to a sound resource, which is rendered when the alarm is triggered for AUDIO, Use:- O-n: which are intended to be sent as message attachments for EMAIL, Use:- R-1:which MUST point to a procedure resource, which is invoked when the alarm is triggered for PROCEDURE.
|
||||
'x-prop': None,
|
||||
}
|
||||
|
||||
def export_ical(self, cr, uid, alarm_id, vevent, context={}):
|
||||
valarm = vevent.add('valarm')
|
||||
alarm_object = self.pool.get('crm.caldav.alarm')
|
||||
alarm_data = alarm_object.read(cr, uid, alarm_id, [])
|
||||
def export_ical(self, cr, uid, alarm_datas, context={}):
|
||||
ical = vobject.iCalendar()
|
||||
vevent = ical.add('vevent')
|
||||
valarms = []
|
||||
for alarm_data in alarm_datas:
|
||||
valarm = vevent.add('valarm')
|
||||
|
||||
# Compute trigger data
|
||||
interval = alarm_data['trigger_interval']
|
||||
occurs = alarm_data['trigger_occurs']
|
||||
duration = (occurs == 'after' and alarm_data['trigger_duration']) \
|
||||
or -(alarm_data['trigger_duration'])
|
||||
related = alarm_data['trigger_related']
|
||||
trigger = valarm.add('trigger')
|
||||
trigger.params['related'] = [related.upper()]
|
||||
if interval == 'days':
|
||||
delta = timedelta(days=duration)
|
||||
if interval == 'hours':
|
||||
delta = timedelta(hours=duration)
|
||||
if interval == 'minutes':
|
||||
delta = timedelta(minutes=duration)
|
||||
trigger.value = delta
|
||||
|
||||
# Compute trigger data
|
||||
interval = alarm_data['trigger_interval']
|
||||
occurs = alarm_data['trigger_occurs']
|
||||
duration = (occurs == 'AFTER' and alarm_data['trigger_duration']) \
|
||||
or -(alarm_data['trigger_duration'])
|
||||
related = alarm_data['trigger_related']
|
||||
trigger = valarm.add('TRIGGER')
|
||||
trigger.params['RELATED'] = [related.upper()]
|
||||
if interval == 'DAYS':
|
||||
delta = timedelta(days=duration)
|
||||
if interval == 'HOURS':
|
||||
delta = timedelta(hours=duration)
|
||||
if interval == 'MINUTES':
|
||||
delta = timedelta(minutes=duration)
|
||||
trigger.value = delta
|
||||
|
||||
# Compute other details
|
||||
valarm.add('DESCRIPTION').value = alarm_data['name']
|
||||
valarm.add('ACTION').value = alarm_data['action']
|
||||
return vevent
|
||||
# Compute other details
|
||||
valarm.add('description').value = alarm_data['name']
|
||||
valarm.add('action').value = alarm_data['action']
|
||||
|
||||
valarms.append(valarm)
|
||||
return valarms
|
||||
|
||||
def import_ical(self, cr, uid, ical_data):
|
||||
def import_ical(self, cr, uid, ical_data):
|
||||
for child in ical_data.getChildren():
|
||||
if child.name.lower() == 'trigger':
|
||||
seconds = child.value.seconds
|
||||
days = child.value.days
|
||||
diff = (days * 86400) + seconds
|
||||
interval = 'DAYS'
|
||||
related = 'BEFORE'
|
||||
interval = 'days'
|
||||
related = 'before'
|
||||
if not seconds:
|
||||
duration = abs(days)
|
||||
related = days>0 and 'AFTER' or 'BEFORE'
|
||||
related = days>0 and 'after' or 'before'
|
||||
elif (abs(diff) / 3600) == 0:
|
||||
duration = abs(diff / 60)
|
||||
interval = 'MINUTES'
|
||||
related = days>=0 and 'AFTER' or 'BEFORE'
|
||||
interval = 'minutes'
|
||||
related = days>=0 and 'after' or 'before'
|
||||
else:
|
||||
duration = abs(diff / 3600)
|
||||
interval = 'HOURS'
|
||||
related = days>=0 and 'AFTER' or 'BEFORE'
|
||||
interval = 'hours'
|
||||
related = days>=0 and 'after' or 'before'
|
||||
self.ical_set('trigger_interval', interval, 'value')
|
||||
self.ical_set('trigger_duration', duration, 'value')
|
||||
self.ical_set('trigger_occurs', related, 'value')
|
||||
self.ical_set('trigger_occurs', related.lower(), 'value')
|
||||
if child.params:
|
||||
if child.params.get('RELATED'):
|
||||
self.ical_set('trigger_related', child.params.get('RELATED')[0].lower(), 'value')
|
||||
if child.params.get('related'):
|
||||
self.ical_set('trigger_related', child.params.get('related')[0].lower(), 'value')
|
||||
else:
|
||||
self.ical_set(child.name.lower(), child.value, 'value')
|
||||
self.ical_set(child.name.lower(), child.value.lower(), 'value')
|
||||
vals = map_data(cr, uid, self)
|
||||
return vals
|
||||
|
||||
Alarm()
|
||||
|
||||
class Attendee(CalDAV, osv.osv_memory):
|
||||
_name = 'caldav.attendee'
|
||||
_name = 'basic.calendar.attendee'
|
||||
__attribute__ = {
|
||||
'cutype': None, # Use: 0-1 Specify the type of calendar user specified by the property like "INDIVIDUAL"/"GROUP"/"RESOURCE"/"ROOM"/"UNKNOWN".
|
||||
'member': None, # Use: 0-1 Specify the group or list membership of the calendar user specified by the property.
|
||||
|
@ -403,28 +413,31 @@ class Attendee(CalDAV, osv.osv_memory):
|
|||
'language': None, # Use: 0-1 Specify the language for text values in a property or property parameter.
|
||||
}
|
||||
|
||||
def import_ical(self, cr, uid, ical_data):
|
||||
def import_ical(self, cr, uid, ical_data):
|
||||
for para in ical_data.params:
|
||||
if para.lower() == 'cn':
|
||||
self.ical_set(para.lower(), ical_data.params[para][0]+':'+ ical_data.value, 'value')
|
||||
else:
|
||||
self.ical_set(para.lower(), ical_data.params[para][0], 'value')
|
||||
self.ical_set(para.lower(), ical_data.params[para][0].lower(), 'value')
|
||||
if not ical_data.params.get('CN'):
|
||||
self.ical_set('cn', ical_data.value, 'value')
|
||||
vals = map_data(cr, uid, self)
|
||||
return vals
|
||||
|
||||
def export_ical(self, cr, uid, attendee_id, vevent, context={}):
|
||||
attendee_object = self.pool.get('crm.caldav.attendee')
|
||||
for attendee in attendee_object.read(cr, uid, attendee_id, []):
|
||||
def export_ical(self, cr, uid, attendee_data, context={}):
|
||||
ical = vobject.iCalendar()
|
||||
attendees = []
|
||||
vevent = ical.add('vevent')
|
||||
for attendee in attendee_data:
|
||||
attendee_add = vevent.add('attendee')
|
||||
for a_key, a_val in attendee_object.__attribute__.items():
|
||||
for a_key, a_val in self.__attribute__.items():
|
||||
if attendee[a_val['field']]:
|
||||
if a_val['type'] == 'text':
|
||||
attendee_add.params[a_key] = [str(attendee[a_val['field']])]
|
||||
elif a_val['type'] == 'boolean':
|
||||
attendee_add.params[a_key] = [str(attendee[a_val['field']])]
|
||||
return vevent
|
||||
attendees.append(attendee_add)
|
||||
return attendees
|
||||
|
||||
Attendee()
|
||||
|
||||
|
|
|
@ -23,22 +23,37 @@ from osv import fields, osv
|
|||
from service import web_services
|
||||
from tools.translate import _
|
||||
import re
|
||||
import time
|
||||
import datetime
|
||||
|
||||
months = {1:"January", 2:"February", 3:"March", 4:"April", 5:"May", 6:"June", \
|
||||
7:"July", 8:"August", 9:"September", 10:"October", 11:"November", \
|
||||
12:"December"}
|
||||
months = {
|
||||
1:"January", 2:"February", 3:"March", 4:"April", \
|
||||
5:"May", 6:"June", 7:"July", 8:"August", 9:"September", \
|
||||
10:"October", 11:"November", 12:"December"}
|
||||
|
||||
def caldevIDs2readIDs(caldev_ID = None):
|
||||
if caldev_ID:
|
||||
if isinstance(caldev_ID, str):
|
||||
return int(caldev_ID.split('-')[0])
|
||||
return caldev_ID
|
||||
def caldav_id2real_id(caldav_id = None, with_date=False):
|
||||
if caldav_id and isinstance(caldav_id, (str, unicode)):
|
||||
res = caldav_id.split('-')
|
||||
if len(res) >= 2:
|
||||
real_id = res[0]
|
||||
if with_date:
|
||||
real_date = time.strftime("%Y-%m-%d %H:%M:%S", \
|
||||
time.strptime(res[1], "%Y%m%d%H%M%S"))
|
||||
return (int(real_id), real_date)
|
||||
return int(real_id)
|
||||
return caldav_id and int(caldav_id) or caldav_id
|
||||
|
||||
def real_id2caldav_id(real_id, recurrent_date):
|
||||
if real_id and recurrent_date:
|
||||
recurrent_date = time.strftime("%Y%m%d%H%M%S", \
|
||||
time.strptime(recurrent_date, "%Y-%m-%d %H:%M:%S"))
|
||||
return '%d-%s'%(real_id, recurrent_date)
|
||||
return real_id
|
||||
|
||||
def uid2openobjectid(cr, uidval, oomodel):
|
||||
__rege = re.compile(r'OpenERP-([\w|\.]+)_([0-9]+)@(\w+)$')
|
||||
__rege = re.compile(r'OpenObject-([\w|\.]+)_([0-9]+)@(\w+)$')
|
||||
wematch = __rege.match(uidval.encode('utf8'))
|
||||
if not wematch:
|
||||
# raise osv.except_osv('Warning!!', "Cannot locate UID in %s" % val['id'])
|
||||
return False
|
||||
else:
|
||||
model, id, dbname = wematch.groups()
|
||||
|
@ -49,13 +64,19 @@ def uid2openobjectid(cr, uidval, oomodel):
|
|||
if id in ids:
|
||||
return id
|
||||
return False
|
||||
|
||||
|
||||
def openobjectid2uid(cr, uidval, oomodel):
|
||||
value = 'OpenERP-%s_%s@%s' % (oomodel, uidval, cr.dbname)
|
||||
value = 'OpenObject-%s_%s@%s' % (oomodel, uidval, cr.dbname)
|
||||
return value
|
||||
|
||||
class crm_caldav_attendee(osv.osv):
|
||||
_name = 'crm.caldav.attendee'
|
||||
def _links_get(self, cr, uid, context={}):
|
||||
obj = self.pool.get('res.request.link')
|
||||
ids = obj.search(cr, uid, [])
|
||||
res = obj.read(cr, uid, ids, ['object', 'name'], context)
|
||||
return [(r['object'], r['name']) for r in res]
|
||||
|
||||
class calendar_attendee(osv.osv):
|
||||
_name = 'calendar.attendee'
|
||||
_description = 'Attendee information'
|
||||
_rec_name = 'cutype'
|
||||
|
||||
|
@ -63,53 +84,210 @@ class crm_caldav_attendee(osv.osv):
|
|||
'cutype': {'field':'cutype', 'type':'text'},
|
||||
'member': {'field':'member', 'type':'text'},
|
||||
'role': {'field':'role', 'type':'selection'},
|
||||
'partstat': {'field':'partstat', 'type':'text'},
|
||||
'partstat': {'field':'state', 'type':'text'},
|
||||
'rsvp': {'field':'rsvp', 'type':'boolean'},
|
||||
'delegated-to': {'field':'delegated_to', 'type':'char'},
|
||||
'delegated-from': {'field':'delegated_from', 'type':'char'},
|
||||
'delegated-to': {'field':'delegated_to', 'type':'text'},
|
||||
'delegated-from': {'field':'delegated_from', 'type':'text'},
|
||||
'sent-by': {'field':'sent_by', 'type':'text'},
|
||||
'cn': {'field':'cn', 'type':'text'},
|
||||
'dir': {'field':'dir', 'type':'text'},
|
||||
'language': {'field':'language', 'type':'text'},
|
||||
}
|
||||
def export_cal(self, cr, uid, ids, context={}):
|
||||
basic_attendee_obj = self.pool.get('basic.calendar.attendee')
|
||||
basic_attendee_obj.__attribute__.update(self.__attribute__)
|
||||
data = self.read(cr, uid, ids)
|
||||
attendees = basic_attendee_obj.export_ical(cr, uid, data, {'model': self._name})
|
||||
cal_val = ''
|
||||
for attendee in attendees:
|
||||
cal_val += attendee.serialize()
|
||||
return cal_val
|
||||
|
||||
def import_cal(self, cr, uid, data, context={}):
|
||||
file_content = base64.decodestring(data)
|
||||
basic_attendee_obj = self.pool.get('basic.calendar.attendee')
|
||||
basic_attendee_obj.__attribute__.update(self.__attribute__)
|
||||
|
||||
vals = basic_attendee_obj.import_ical(cr, uid, file_content)
|
||||
ids = []
|
||||
for val in vals:
|
||||
is_exists = uid2openobjectid(cr, val['id'], self._name)
|
||||
if val.has_key('create_date'): val.pop('create_date')
|
||||
val.pop('id')
|
||||
if is_exists:
|
||||
self.write(cr, uid, [is_exists], val)
|
||||
ids.append(is_exists)
|
||||
else:
|
||||
attendee_id = self.create(cr, uid, val)
|
||||
ids.append(attendee_id)
|
||||
return ids
|
||||
|
||||
def _get_address(self, name=None, email=None):
|
||||
if name and email:
|
||||
name += ':'
|
||||
return (name or '') + (email and ('MAILTO:' + email) or '')
|
||||
|
||||
def _compute_data(self, cr, uid, ids, name, arg, context):
|
||||
name = name[0]
|
||||
result = {}
|
||||
|
||||
def get_delegate_data(user):
|
||||
email = user.address_id and user.address_id.email or ''
|
||||
return self._get_address(user.name, email)
|
||||
|
||||
for attdata in self.browse(cr, uid, ids, context=context):
|
||||
id = attdata.id
|
||||
result[id] = {}
|
||||
if name == 'sent_by':
|
||||
if not attdata.sent_by_uid:
|
||||
result[id][name] = ''
|
||||
continue
|
||||
else:
|
||||
result[id][name] = self._get_address(attdata.sent_by_uid.name, \
|
||||
attdata.sent_by_uid.address_id.email)
|
||||
if name == 'cn':
|
||||
result[id][name] = self._get_address(attdata.user_id.name, attdata.email)
|
||||
if name == 'delegated_to':
|
||||
user_obj = self.pool.get('res.users')
|
||||
todata = map(get_delegate_data, attdata.del_to_user_ids)
|
||||
result[id][name] = ', '.join(todata)
|
||||
if name == 'delegated_from':
|
||||
dstring = []
|
||||
user_obj = self.pool.get('res.users')
|
||||
fromdata = map(get_delegate_data, attdata.del_from_user_ids)
|
||||
result[id][name] = ', '.join(fromdata)
|
||||
if name == 'event_date':
|
||||
if attdata.ref:
|
||||
model, res_id = tuple(attdata.ref.split(','))
|
||||
model_obj = self.pool.get(model)
|
||||
obj = model_obj.read(cr, uid, res_id, ['date'])[0]
|
||||
result[id][name] = obj['date']
|
||||
if name == 'event_end_date':
|
||||
if attdata.ref:
|
||||
model, res_id = tuple(attdata.ref.split(','))
|
||||
model_obj = self.pool.get(model)
|
||||
obj = model_obj.read(cr, uid, res_id, ['date_deadline'])[0]
|
||||
result[id][name] = obj['date_deadline']
|
||||
|
||||
if name == 'sent_by_uid':
|
||||
if attdata.ref:
|
||||
model, res_id = tuple(attdata.ref.split(','))
|
||||
model_obj = self.pool.get(model)
|
||||
obj = model_obj.read(cr, uid, res_id, ['user_id'])[0]
|
||||
result[id][name] = obj['user_id']
|
||||
return result
|
||||
|
||||
def _links_get(self, cr, uid, context={}):
|
||||
obj = self.pool.get('res.request.link')
|
||||
ids = obj.search(cr, uid, [])
|
||||
res = obj.read(cr, uid, ids, ['object', 'name'], context)
|
||||
return [(r['object'], r['name']) for r in res]
|
||||
|
||||
def _lang_get(self, cr, uid, context={}):
|
||||
obj = self.pool.get('res.lang')
|
||||
ids = obj.search(cr, uid, [])
|
||||
res = obj.read(cr, uid, ids, ['code', 'name'], context)
|
||||
res = [((r['code']).replace('_', '-'), r['name']) for r in res]
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'cutype': fields.selection([('INDIVIDUAL', 'INDIVIDUAL'), ('GROUP', 'GROUP'), \
|
||||
('RESOURCE', 'RESOURCE'), ('ROOM', 'ROOM'), \
|
||||
('UNKNOWN', 'UNKNOWN') ], 'CUTYPE', \
|
||||
help="Specify the type of calendar user"),
|
||||
'member': fields.char('Member', size=124, help="Indicate the groups that the attendee belongs to"),
|
||||
'role': fields.selection([ ('REQ-PARTICIPANT', 'REQ-PARTICIPANT'), \
|
||||
('CHAIR', 'CHAIR'), ('OPT-PARTICIPANT', 'OPT-PARTICIPANT'), \
|
||||
('NON-PARTICIPANT', 'NON-PARTICIPANT')], 'ROLE', \
|
||||
help='Participation role for the calendar user'),
|
||||
'partstat': fields.selection([('TENTATIVE', 'TENTATIVE'),
|
||||
('NEEDS-ACTION', 'NEEDS-ACTION'),
|
||||
('ACCEPTED', 'ACCEPTED'),
|
||||
('DECLINED', 'DECLINED'),
|
||||
('DELEGATED', 'DELEGATED')], 'PARTSTAT', \
|
||||
help="Status of the attendee's participation"),
|
||||
'rsvp': fields.boolean('RSVP', help="Indicats whether the favor of a reply is requested"),
|
||||
'delegated_to': fields.char('DELEGATED-TO', size=124, \
|
||||
help="The calendar users that the original request was delegated to"),
|
||||
'delegated_from': fields.char('DELEGATED-FROM', size=124, \
|
||||
help="Indicates whom the request was delegated from"),
|
||||
'sent_by': fields.char('SENT-BY', size=124, \
|
||||
help="Specify the calendar user that is acting on behalf of the calendar user"),
|
||||
'cn': fields.char('CN', size=124, help="The common or displayable name to be associated with the calendar user"),
|
||||
'dir': fields.char('DIR', size=124, help="Reference to the URI that points to the directory information corresponding to the attendee."),
|
||||
'language': fields.char('LANGUAGE', size=124, help="To specify the language for text values in a property or property parameter."),
|
||||
}
|
||||
'cutype': fields.selection([('individual', 'Individual'), \
|
||||
('group', 'Group'), ('resource', 'Resource'), \
|
||||
('room', 'Room'), ('unknown', 'Unknown') ], \
|
||||
'User Type', help="Specify the type of calendar user"),
|
||||
'member': fields.char('Member', size=124,
|
||||
help="Indicate the groups that the attendee belongs to"),
|
||||
'role': fields.selection([('req-participant', 'Participation required'), \
|
||||
('chair', 'Chair Person'), \
|
||||
('opt-participant', 'Optional Participation'), \
|
||||
('non-participant', 'For information Purpose')], 'Role', \
|
||||
help='Participation role for the calendar user'),
|
||||
'state': fields.selection([('tentative', 'Tentative'),
|
||||
('needs-action', 'Needs Action'),
|
||||
('accepted', 'Accepted'),
|
||||
('declined', 'Declined'),
|
||||
('delegated', 'Delegated')], 'State', readonly=True,
|
||||
help="Status of the attendee's participation"),
|
||||
'rsvp': fields.boolean('Required Reply?',
|
||||
help="Indicats whether the favor of a reply is requested"),
|
||||
'delegated_to': fields.function(_compute_data, method=True, \
|
||||
string='Delegated To', type="char", size=124, store=True, \
|
||||
multi='delegated_to', help="The users that the original request \
|
||||
was delegated to"),
|
||||
'del_to_user_ids': fields.many2many('res.users', 'att_del_to_user_rel',
|
||||
'attendee_id', 'user_id', 'Users'),
|
||||
'delegated_from': fields.function(_compute_data, method=True, string=\
|
||||
'Delegated From', type="char", store=True, size=124, multi='delegated_from'),
|
||||
'del_from_user_ids': fields.many2many('res.users', 'att_del_from_user_rel', \
|
||||
'attendee_id', 'user_id', 'Users'),
|
||||
'sent_by': fields.function(_compute_data, method=True, string='Sent By', type="char", multi='sent_by', store=True, size=124, help="Specify the user that is acting on behalf of the calendar user"),
|
||||
'sent_by_uid': fields.function(_compute_data, method=True, string='Sent by', type="many2one", obj='res.users', multi='sent_by_uid'),
|
||||
'cn': fields.function(_compute_data, method=True, string='Common name', type="char", size=124, multi='cn', store=True),
|
||||
'dir': fields.char('URI Reference', size=124, help="Reference to the URI that points to the directory information corresponding to the attendee."),
|
||||
'language': fields.selection(_lang_get, 'Language',
|
||||
help="To specify the language for text values in a property or property parameter."),
|
||||
'user_id': fields.many2one('res.users', 'User', required=True),
|
||||
'email': fields.char('Email', size=124),
|
||||
'event_date' : fields.function(_compute_data, method=True, string='Event Date', type="datetime", multi='event_date'),
|
||||
'event_end_date' : fields.function(_compute_data, method=True, string='Event End Date', type="datetime", multi='event_end_date'),
|
||||
'ref':fields.reference('Document Ref', selection=_links_get, size=128),
|
||||
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
|
||||
}
|
||||
_defaults = {
|
||||
'cn': lambda *x: 'MAILTO:',
|
||||
}
|
||||
|
||||
crm_caldav_attendee()
|
||||
'state': lambda *x: 'needs-action',
|
||||
}
|
||||
|
||||
class crm_caldav_alarm(osv.osv):
|
||||
_name = 'crm.caldav.alarm'
|
||||
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
|
||||
if not user_id:
|
||||
return {'value': {'email': ''}}
|
||||
usr_obj = self.pool.get('res.users')
|
||||
user = usr_obj.browse(cr, uid, user_id, *args)
|
||||
return {'value': {'email': user.address_id.email, 'availability':user.availability}}
|
||||
|
||||
def do_tentative(self, cr, uid, ids, context=None, *args):
|
||||
self.write(cr, uid, ids, {'state': 'tentative'}, context)
|
||||
|
||||
def do_accept(self, cr, uid, ids, context=None, *args):
|
||||
self.write(cr, uid, ids, {'state': 'accepted'}, context)
|
||||
|
||||
def do_decline(self, cr, uid, ids, context=None, *args):
|
||||
self.write(cr, uid, ids, {'state': 'declined'}, context)
|
||||
|
||||
calendar_attendee()
|
||||
|
||||
class res_alarm(osv.osv):
|
||||
_name = 'res.alarm'
|
||||
_description = 'basic alarm information'
|
||||
_columns = {
|
||||
'name':fields.char('Name', size=256, required=True),
|
||||
'trigger_occurs': fields.selection([('before', 'Before'), ('after', 'After')], \
|
||||
'Trigger time', required=True),
|
||||
'trigger_interval': fields.selection([('minutes', 'Minutes'), ('hours', 'Hours'), \
|
||||
('days', 'Days')], 'Trigger duration', required=True),
|
||||
'trigger_duration': fields.integer('Time', required=True),
|
||||
'trigger_related': fields.selection([('start', 'The event starts'), ('end', \
|
||||
'The event ends')], 'Trigger Occures at', required=True),
|
||||
'duration': fields.integer('Duration', help="""Duration' and 'Repeat' \
|
||||
are both optional, but if one occurs, so MUST the other"""),
|
||||
'repeat': fields.integer('Repeat'),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the event alarm information without removing it."),
|
||||
|
||||
|
||||
}
|
||||
_defaults = {
|
||||
'trigger_interval': lambda *x: 'minutes',
|
||||
'trigger_duration': lambda *x: 5,
|
||||
'trigger_occurs': lambda *x: 'before',
|
||||
'trigger_related': lambda *x: 'start',
|
||||
'active': lambda *x: 1,
|
||||
}
|
||||
|
||||
res_alarm()
|
||||
|
||||
class calendar_alarm(osv.osv):
|
||||
_name = 'calendar.alarm'
|
||||
_description = 'Event alarm information'
|
||||
|
||||
_inherits = {'res.alarm': "alarm_id"}
|
||||
__attribute__ = {
|
||||
'action': {'field': 'action', 'type': 'text'},
|
||||
'description': {'field': 'name', 'type': 'text'},
|
||||
|
@ -123,42 +301,140 @@ class crm_caldav_alarm(osv.osv):
|
|||
'repeat': {'field': 'repeat', 'type': 'text'},
|
||||
'attach': {'field': 'attach', 'type': 'text'},
|
||||
}
|
||||
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Summary', size=124, help="""Contains the text to be used as the message subject for EMAIL
|
||||
or contains the text to be used for DISPLAY"""),
|
||||
'action': fields.selection([('AUDIO', 'AUDIO'), ('DISPLAY', 'DISPLAY'), \
|
||||
('PROCEDURE', 'PROCEDURE'), ('EMAIL', 'EMAIL') ], 'Action', \
|
||||
'alarm_id': fields.many2one('res.alarm', 'Basic Alarm', ondelete='cascade'),
|
||||
'name': fields.char('Summary', size=124, help="""Contains the text to be used as the message subject for email
|
||||
or contains the text to be used for display"""),
|
||||
'action': fields.selection([('audio', 'Audio'), ('display', 'Display'), \
|
||||
('procedure', 'Procedure'), ('email', 'Email') ], 'Action', \
|
||||
required=True, help="Defines the action to be invoked when an alarm is triggered"),
|
||||
'description': fields.text('Description', help='Provides a more complete description of the calendar component, than that provided by the "SUMMARY" property'),
|
||||
'attendee_ids': fields.many2many('crm.caldav.attendee', 'alarm_attendee_rel', \
|
||||
'alarm_id', 'attendee_id', 'Attendees'),
|
||||
'trigger_occurs': fields.selection([('BEFORE', 'BEFORE'), ('AFTER', 'AFTER')], \
|
||||
'Trigger time', required=True),
|
||||
'trigger_interval': fields.selection([('MINUTES', 'MINUTES'), ('HOURS', 'HOURS'), \
|
||||
('DAYS', 'DAYS')], 'Trigger duration', required=True),
|
||||
'trigger_duration': fields.integer('TIme', required=True),
|
||||
'trigger_related': fields.selection([('start', 'The event starts'), ('end', \
|
||||
'The event ends')], 'Trigger Occures at', required=True),
|
||||
'duration': fields.integer('Duration', help="""Duration' and 'Repeat' \
|
||||
are both optional, but if one occurs, so MUST the other"""),
|
||||
'repeat': fields.integer('Repeat'), # TODO
|
||||
'attach': fields.binary('Attachment', help="""* Points to a sound resource, which is rendered when the alarm is triggered for AUDIO,
|
||||
* File which is intended to be sent as message attachments for EMAIL,
|
||||
* Points to a procedure resource, which is invoked when the alarm is triggered for PROCEDURE.
|
||||
"""),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the event alarm information without removing it."),
|
||||
}
|
||||
'attendee_ids': fields.many2many('calendar.attendee', 'alarm_attendee_rel', \
|
||||
'alarm_id', 'attendee_id', 'Attendees', readonly=True),
|
||||
'attach': fields.binary('Attachment', help="""* Points to a sound resource, which is rendered when the alarm is triggered for audio,
|
||||
* File which is intended to be sent as message attachments for email,
|
||||
* Points to a procedure resource, which is invoked when the alarm is triggered for procedure."""),
|
||||
'res_id' : fields.integer('Resource ID'),
|
||||
'model_id': fields.many2one('ir.model', 'Model'),
|
||||
'user_id': fields.many2one('res.users', 'Owner'),
|
||||
'event_date' : fields.datetime('Event Date'),
|
||||
'event_end_date' : fields.datetime('Event End Date'),
|
||||
'trigger_date' : fields.datetime('Trigger Date', readonly="True"),
|
||||
'state':fields.selection([
|
||||
('draft', 'Draft'),
|
||||
('run', 'Run'),
|
||||
('stop', 'Stop'),
|
||||
('done', 'Done'),
|
||||
], 'State', select=True, readonly=True),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'action': lambda *x: 'EMAIL',
|
||||
'trigger_interval': lambda *x: 'MINUTES',
|
||||
'trigger_duration': lambda *x: 5,
|
||||
'trigger_occurs': lambda *x: 'BEFORE',
|
||||
'trigger_related': lambda *x: 'start',
|
||||
}
|
||||
|
||||
crm_caldav_alarm()
|
||||
'action': lambda *x: 'email',
|
||||
'state' : lambda *x: 'run',
|
||||
}
|
||||
|
||||
def export_cal(self, cr, uid, ids, context={}):
|
||||
basic_alarm_obj = self.pool.get('basic.calendar.alarm')
|
||||
basic_alarm_obj.__attribute__.update(self.__attribute__)
|
||||
data = self.read(cr, uid, ids)
|
||||
alarms = basic_alarm_obj.export_ical(cr, uid, data, {'model': self._name})
|
||||
cal_val = ''
|
||||
for alarm in alarms:
|
||||
cal_val += alarm.serialize()
|
||||
return cal_val
|
||||
|
||||
def import_cal(self, cr, uid, data, context={}):
|
||||
file_content = base64.decodestring(data)
|
||||
basic_alarm_obj = self.pool.get('basic.calendar.alarm')
|
||||
basic_alarm_obj.__attribute__.update(self.__attribute__)
|
||||
|
||||
vals = basic_alarm_obj.import_ical(cr, uid, file_content)
|
||||
ids = []
|
||||
for val in vals:
|
||||
is_exists = uid2openobjectid(cr, val['id'], self._name)
|
||||
if val.has_key('create_date'): val.pop('create_date')
|
||||
val.pop('id')
|
||||
if is_exists:
|
||||
self.write(cr, uid, [is_exists], val)
|
||||
ids.append(is_exists)
|
||||
else:
|
||||
alarm_id = self.create(cr, uid, val)
|
||||
ids.append(alarm_id)
|
||||
return ids
|
||||
|
||||
def create(self, cr, uid, vals, context={}):
|
||||
event_date = vals.get('event_date', False)
|
||||
if event_date:
|
||||
dtstart = datetime.datetime.strptime(vals['event_date'], "%Y-%m-%d %H:%M:%S")
|
||||
if vals['trigger_interval'] == 'days':
|
||||
delta = datetime.timedelta(days=vals['trigger_duration'])
|
||||
if vals['trigger_interval'] == 'hours':
|
||||
delta = datetime.timedelta(hours=vals['trigger_duration'])
|
||||
if vals['trigger_interval'] == 'minutes':
|
||||
delta = datetime.timedelta(minutes=vals['trigger_duration'])
|
||||
trigger_date = dtstart + (vals['trigger_occurs'] == 'after' and delta or -delta)
|
||||
vals['trigger_date'] = trigger_date
|
||||
res = super(calendar_alarm, self).create(cr, uid, vals, context)
|
||||
return res
|
||||
|
||||
def do_run_scheduler(self, cr, uid, automatic=False, use_new_cursor=False, \
|
||||
context=None):
|
||||
if not context:
|
||||
context = {}
|
||||
current_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||
cr.execute("select alarm.id as id \
|
||||
from calendar_alarm alarm \
|
||||
where alarm.state = %s and alarm.trigger_date <= %s", ('run', current_datetime))
|
||||
res = cr.dictfetchall()
|
||||
alarm_ids = map(lambda x: x['id'], res)
|
||||
attendee_obj = self.pool.get('calendar.attendee')
|
||||
request_obj = self.pool.get('res.request')
|
||||
mail_to = []
|
||||
for alarm in self.browse(cr, uid, alarm_ids):
|
||||
if alarm.action == 'display':
|
||||
value = {
|
||||
'name': alarm.name,
|
||||
'act_from': alarm.user_id.id,
|
||||
'act_to': alarm.user_id.id,
|
||||
'body': alarm.description,
|
||||
'trigger_date': alarm.trigger_date,
|
||||
'ref_doc1' : '%s,%s' %(alarm.model_id.model, alarm.res_id)
|
||||
}
|
||||
request_id = request_obj.create(cr, uid, value)
|
||||
request_ids = [request_id]
|
||||
for attendee in alarm.attendee_ids:
|
||||
value['act_to'] = attendee.user_id.id
|
||||
request_id = request_obj.create(cr, uid, value)
|
||||
request_ids.append(request_id)
|
||||
request_obj.request_send(cr, uid, request_ids)
|
||||
|
||||
if alarm.action == 'email':
|
||||
sub = '[Openobject Remainder] %s' %(alarm.name)
|
||||
body = """
|
||||
Name : %s
|
||||
Date : %s
|
||||
Description : %s
|
||||
|
||||
From :
|
||||
%s
|
||||
%s
|
||||
|
||||
""" %(alarm.name, alarm.trigger_date, alarm.description, alarm.user_id.name, alarm.user_id.sign)
|
||||
mail_to = [alarm.user_id.address_id.email]
|
||||
for att in alarm.attendee_ids:
|
||||
mail_to.append(att.user_id.address_id.email)
|
||||
|
||||
tools.email_send(
|
||||
tools.confirm['from_mail'],
|
||||
mail_to,
|
||||
sub,
|
||||
body
|
||||
)
|
||||
self.write(cr, uid, [alarm.id], {'state':'done'})
|
||||
return True
|
||||
|
||||
calendar_alarm()
|
||||
|
||||
class ir_attachment(osv.osv):
|
||||
_name = 'ir.attachment'
|
||||
|
@ -175,9 +451,9 @@ class ir_attachment(osv.osv):
|
|||
new_args = args
|
||||
for i, arg in enumerate(new_args):
|
||||
if arg[0] == 'res_id':
|
||||
new_args[i] = (arg[0], arg[1], caldevIDs2readIDs(arg[2]))
|
||||
return super(ir_attachment, self).search(cr, uid, new_args, offset=offset,
|
||||
limit=limit, order=order,
|
||||
new_args[i] = (arg[0], arg[1], caldav_id2real_id(arg[2]))
|
||||
return super(ir_attachment, self).search(cr, uid, new_args, offset=offset,
|
||||
limit=limit, order=order,
|
||||
context=context, count=False)
|
||||
ir_attachment()
|
||||
|
||||
|
@ -189,7 +465,7 @@ class ir_values(osv.osv):
|
|||
new_model = []
|
||||
for data in models:
|
||||
if type(data) in (list, tuple):
|
||||
new_model.append((data[0], caldevIDs2readIDs(data[1])))
|
||||
new_model.append((data[0], caldav_id2real_id(data[1])))
|
||||
else:
|
||||
new_model.append(data)
|
||||
return super(ir_values, self).set(cr, uid, key, key2, name, new_model, value, \
|
||||
|
@ -200,7 +476,7 @@ class ir_values(osv.osv):
|
|||
new_model = []
|
||||
for data in models:
|
||||
if type(data) in (list, tuple):
|
||||
new_model.append((data[0], caldevIDs2readIDs(data[1])))
|
||||
new_model.append((data[0], caldav_id2real_id(data[1])))
|
||||
else:
|
||||
new_model.append(data)
|
||||
return super(ir_values, self).get(cr, uid, key, key2, new_model, meta, context, \
|
||||
|
@ -217,9 +493,9 @@ class ir_model(osv.osv):
|
|||
data = super(ir_model, self).read(cr, uid, ids, fields=fields, context=context, load=load)
|
||||
if data:
|
||||
for val in data:
|
||||
val['id'] = caldevIDs2readIDs(val['id'])
|
||||
val['id'] = caldav_id2real_id(val['id'])
|
||||
return data
|
||||
|
||||
|
||||
ir_model()
|
||||
|
||||
class virtual_report_spool(web_services.report_spool):
|
||||
|
@ -229,47 +505,26 @@ class virtual_report_spool(web_services.report_spool):
|
|||
return super(virtual_report_spool, self).exp_report(db, uid, object, ids, datas, context)
|
||||
new_ids = []
|
||||
for id in ids:
|
||||
new_ids.append(caldevIDs2readIDs(id))
|
||||
datas['id'] = caldevIDs2readIDs(datas['id'])
|
||||
new_ids.append(caldav_id2real_id(id))
|
||||
datas['id'] = caldav_id2real_id(datas['id'])
|
||||
super(virtual_report_spool, self).exp_report(db, uid, object, new_ids, datas, context)
|
||||
return super(virtual_report_spool, self).exp_report(db, uid, object, new_ids, datas, context)
|
||||
|
||||
virtual_report_spool()
|
||||
|
||||
class virtual_wizard(web_services.wizard):
|
||||
def exp_execute(self, db, uid, wiz_id, datas, action='init', context=None):
|
||||
if wiz_id not in self.wiz_uid:
|
||||
# TODO: To Check why need it
|
||||
if wiz_id == 1:
|
||||
wiz_name ='base_setup.base_setup'
|
||||
if wiz_id == 2:
|
||||
wiz_name ='module.upgrade'
|
||||
super(virtual_wizard,self).exp_create(db, uid, wiz_name, datas)
|
||||
new_ids = []
|
||||
if 'id' in datas:
|
||||
datas['id'] = caldevIDs2readIDs(datas['id'])
|
||||
for id in datas['ids']:
|
||||
new_ids.append(caldevIDs2readIDs(id))
|
||||
datas['ids'] = new_ids
|
||||
res=super(virtual_wizard, self).exp_execute(db, uid, wiz_id, datas, action, context)
|
||||
return res
|
||||
|
||||
virtual_wizard()
|
||||
|
||||
|
||||
class set_rrule_wizard(osv.osv_memory):
|
||||
_name = "caldav.set.rrule"
|
||||
_description = "Set RRULE"
|
||||
|
||||
_columns = {
|
||||
'freq': fields.selection([('None', 'No Repeat'), \
|
||||
('SECONDLY', 'SECONDLY'), \
|
||||
('MINUTELY', 'MINUTELY'), \
|
||||
('HOURLY', 'HOURLY'), \
|
||||
('DAILY', 'DAILY'), \
|
||||
('WEEKLY', 'WEEKLY'), \
|
||||
('MONTHLY', 'MONTHLY'), \
|
||||
('YEARLY', 'YEARLY')], 'Frequency', required=True),
|
||||
('secondly', 'Secondly'), \
|
||||
('minutely', 'Minutely'), \
|
||||
('hourly', 'Hourly'), \
|
||||
('daily', 'Daily'), \
|
||||
('weekly', 'Weekly'), \
|
||||
('monthly', 'Monthly'), \
|
||||
('yearly', 'Yearly')], 'Frequency', required=True),
|
||||
'interval': fields.integer('Interval'),
|
||||
'count': fields.integer('Count'),
|
||||
'mo': fields.boolean('Mon'),
|
||||
|
@ -294,19 +549,12 @@ class set_rrule_wizard(osv.osv_memory):
|
|||
}
|
||||
|
||||
_defaults = {
|
||||
'freq': lambda *x: 'DAILY',
|
||||
'freq': lambda *x: 'daily',
|
||||
'select1': lambda *x: 'date',
|
||||
'interval': lambda *x: 1,
|
||||
}
|
||||
|
||||
def add_rrule(self, cr, uid, ids, context={}):
|
||||
datas = self.read(cr, uid, ids)[0]
|
||||
if not context or not context.get('model'):
|
||||
return {}
|
||||
else:
|
||||
model = context.get('model')
|
||||
obj = self.pool.get(model)
|
||||
res_obj = obj.browse(cr, uid, context['active_id'])
|
||||
def compute_rule_string(self, cr, uid, datas, context=None, *args):
|
||||
weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
|
||||
weekstring = ''
|
||||
monthstring = ''
|
||||
|
@ -318,14 +566,13 @@ class set_rrule_wizard(osv.osv_memory):
|
|||
if freq == 'None':
|
||||
obj.write(cr, uid, [res_obj.id], {'rrule' : ''})
|
||||
return {}
|
||||
if datas.get('interval') <= 0:
|
||||
raise osv.except_osv(_('Error!'), ("Please select proper Interval"))
|
||||
|
||||
if freq == 'WEEKLY':
|
||||
byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas))
|
||||
weekstring = ';BYDAY=' + ','.join(byday)
|
||||
|
||||
elif freq == 'MONTHLY':
|
||||
if freq == 'weekly':
|
||||
byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas))
|
||||
if byday:
|
||||
weekstring = ';BYDAY=' + ','.join(byday)
|
||||
|
||||
elif freq == 'monthly':
|
||||
byday = ''
|
||||
if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
|
||||
raise osv.except_osv(_('Error!'), ("Please select proper Day of month"))
|
||||
|
@ -333,7 +580,7 @@ class set_rrule_wizard(osv.osv_memory):
|
|||
byday = ';BYDAY=' + datas.get('byday') + datas.get('week_list')
|
||||
monthstring = byday or (';BYMONTHDAY=' + str(datas.get('day')))
|
||||
|
||||
elif freq == 'YEARLY':
|
||||
elif freq == 'yearly':
|
||||
bymonth = ''
|
||||
byday = ''
|
||||
if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
|
||||
|
@ -353,10 +600,117 @@ class set_rrule_wizard(osv.osv_memory):
|
|||
rrule_string = 'FREQ=' + freq + weekstring + ';INTERVAL=' + \
|
||||
str(datas.get('interval')) + enddate + monthstring + yearstring
|
||||
|
||||
# End logic
|
||||
# End logic
|
||||
return rrule_string
|
||||
|
||||
def do_add(self, cr, uid, ids, context={}):
|
||||
datas = self.read(cr, uid, ids)[0]
|
||||
if datas.get('interval') <= 0:
|
||||
raise osv.except_osv(_('Error!'), ("Please select proper Interval"))
|
||||
|
||||
|
||||
if not context or not context.get('model'):
|
||||
return {}
|
||||
else:
|
||||
model = context.get('model')
|
||||
obj = self.pool.get(model)
|
||||
res_obj = obj.browse(cr, uid, context['active_id'])
|
||||
|
||||
rrule_string = self.compute_rule_string(cr, uid, datas)
|
||||
obj.write(cr, uid, [res_obj.id], {'rrule' : rrule_string})
|
||||
return {}
|
||||
|
||||
set_rrule_wizard()
|
||||
|
||||
class res_users(osv.osv):
|
||||
_inherit = 'res.users'
|
||||
|
||||
def _get_user_avail(self, cr, uid, ids, context=None):
|
||||
current_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||
res = {}
|
||||
attendee_obj = self.pool.get('calendar.attendee')
|
||||
attendee_ids = attendee_obj.search(cr, uid, [
|
||||
('event_date','<=',current_datetime), ('event_end_date','<=',current_datetime),
|
||||
('state','=','accepted'), ('user_id','in',ids)
|
||||
])
|
||||
|
||||
result = cr.dictfetchall()
|
||||
for attendee_data in attendee_obj.read(cr, uid, attendee_ids, ['user_id']):
|
||||
user_id = attendee_data['user_id']
|
||||
status = 'busy'
|
||||
res.update({user_id:status})
|
||||
|
||||
#TOCHECK : Delegrated Event
|
||||
#cr.execute("SELECT user_id,'busy' FROM att_del_to_user_rel where user_id = ANY(%s)", (ids,))
|
||||
#res.update(cr.dictfetchall())
|
||||
for user_id in ids:
|
||||
if user_id not in res:
|
||||
res[user_id] = 'free'
|
||||
|
||||
return res
|
||||
|
||||
def _get_user_avail_fun(self, cr, uid, ids, name, args, context=None):
|
||||
return self._get_user_avail(cr, uid, ids, context=context)
|
||||
|
||||
_columns = {
|
||||
'availability': fields.function(_get_user_avail_fun, type='selection', \
|
||||
selection=[('free', 'Free'), ('busy', 'Busy')], \
|
||||
string='Free/Busy', method=True),
|
||||
}
|
||||
res_users()
|
||||
|
||||
class invite_attendee_wizard(osv.osv_memory):
|
||||
_name = "caldav.invite.attendee"
|
||||
_description = "Invite Attendees"
|
||||
|
||||
_columns = {
|
||||
'attendee_ids': fields.many2many('calendar.attendee', 'invite_attendee_rel', 'invite_id', 'attendee_id', 'Attendees Detail'),
|
||||
}
|
||||
|
||||
def create(self, cr, uid, vals, context={}):
|
||||
attendee_ids = vals.get('attendee_ids',False)
|
||||
model = context.get('model', False)
|
||||
res_id = context.get('active_id', False)
|
||||
state = context.get('state', False)
|
||||
attendee_obj = self.pool.get('calendar.attendee')
|
||||
|
||||
if attendee_ids and model and res_id:
|
||||
attend = False
|
||||
if model == 'calendar.attendee' and state == 'delegated':
|
||||
attend = attendee_obj.read(cr, uid, res_id, ['ref','user_id','del_to_user_ids'])
|
||||
|
||||
for v1, v2, attendee in attendee_ids:
|
||||
vals = {}
|
||||
ref = '%s,%d'%(model, res_id)
|
||||
if attend:
|
||||
ref = attend['ref']
|
||||
del_from_user_ids = [attend['user_id'][0]]
|
||||
del_to_user_ids = attend['del_to_user_ids']
|
||||
del_to_user_ids.append(attendee['user_id'])
|
||||
vals.update({
|
||||
'del_from_user_ids' : [(6, 0, del_from_user_ids)]
|
||||
})
|
||||
attendee_obj.write(cr, uid, [res_id], {'state':'delegated','del_to_user_ids' : [(6, 0, del_to_user_ids)]})
|
||||
|
||||
vals.update({
|
||||
'ref': ref,
|
||||
})
|
||||
attendee.update(vals)
|
||||
attendee_obj.create(cr, uid, attendee)
|
||||
|
||||
res = super(invite_attendee_wizard, self).create(cr, uid, {}, context=context)
|
||||
return res
|
||||
|
||||
def do_invite(self, cr, uid, ids, context={}):
|
||||
return {}
|
||||
|
||||
|
||||
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
|
||||
if not user_id:
|
||||
return {'value': {'email': ''}}
|
||||
user = self.pool.get('res.users').browse(cr, uid, user_id, *args)
|
||||
return {'value': {'email': user.address_id.email}}
|
||||
|
||||
invite_attendee_wizard()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"caldav_calendar_all","caldav.calendar","model_caldav_calendar",,1,1,1,1
|
||||
"caldav_event_all","caldav.event","model_caldav_event",,1,1,1,1
|
||||
"caldav_attendee_all","caldav.attendee","model_caldav_attendee",,1,1,1,1
|
||||
"access_crm_caldav_attendee","crm.caldav.attendee","model_crm_caldav_attendee",,1,1,1,1
|
||||
"access_crm_caldav_alarm","crm.caldav.alarm","model_crm_caldav_alarm",,1,1,1,1
|
||||
"basic_calendar_all","basic.calendar","model_basic_calendar",,1,1,1,1
|
||||
"basic_calendar_event_all","basic.calendar.event","model_basic_calendar_event",,1,1,1,1
|
||||
"basic_calendar_attendee_all","basic.calendar.attendee","model_basic_calendar_attendee",,1,1,1,1
|
||||
"access_basic_calendar_attendee","calendar.attendee","model_basic_calendar_attendee",,1,1,1,1
|
||||
"access_basic_calendar_alarm","calendar.alarm","model_basic_calendar_alarm",,1,1,1,1
|
||||
|
|
|
|
@ -20,9 +20,10 @@
|
|||
##############################################################################
|
||||
|
||||
import crm
|
||||
import crm_mailgate
|
||||
import crm_segmentation
|
||||
import crm_meeting
|
||||
import crm_config
|
||||
import crm_meeting
|
||||
import crm_lead
|
||||
import crm_phonecall
|
||||
import crm_opportunity
|
||||
|
@ -31,6 +32,7 @@ import crm_fundraising
|
|||
import crm_job
|
||||
import crm_helpdesk
|
||||
|
||||
|
||||
import report
|
||||
import wizard
|
||||
|
||||
|
|
|
@ -21,9 +21,9 @@
|
|||
|
||||
|
||||
{
|
||||
'name': 'Customer & Supplier Relationship Management',
|
||||
'version': '1.0',
|
||||
'category': 'Generic Modules/CRM & SRM',
|
||||
'name': 'Customer & Supplier Relationship Management',
|
||||
'version': '1.0',
|
||||
'category': 'Generic Modules/CRM & SRM',
|
||||
'description': """The generic Open ERP Customer Relationship Management
|
||||
system enables a group of people to intelligently and efficiently manage
|
||||
leads, opportunities, tasks, issues, requests, bugs, campaign, claims, etc.
|
||||
|
@ -41,64 +41,67 @@ appropriate staff, and making sure all future correspondence gets to the right
|
|||
place.
|
||||
|
||||
The CRM module has a email gateway for the synchronisation interface
|
||||
between mails and Open ERP.""",
|
||||
'author': 'Tiny',
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': ['base',
|
||||
'caldav',
|
||||
'process'
|
||||
],
|
||||
between mails and Open ERP.""",
|
||||
'author': 'Tiny',
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': ['base',
|
||||
'caldav',
|
||||
'process',
|
||||
'mail_gateway',
|
||||
],
|
||||
'init_xml': ['crm_data.xml',
|
||||
'crm_meeting_data.xml',
|
||||
'crm_claims_data.xml',
|
||||
'crm_fund_data.xml',
|
||||
'crm_helpdesk_data.xml',
|
||||
'crm_jobs_data.xml',
|
||||
'crm_lead_data.xml',
|
||||
'crm_meeting_data.xml',
|
||||
'crm_claims_data.xml',
|
||||
'crm_fund_data.xml',
|
||||
'crm_helpdesk_data.xml',
|
||||
'crm_jobs_data.xml',
|
||||
'crm_lead_data.xml',
|
||||
'crm_meeting_data.xml',
|
||||
'crm_opportunity_data.xml',
|
||||
'crm_phonecall_data.xml',
|
||||
],
|
||||
'crm_opportunity_data.xml',
|
||||
'crm_phonecall_data.xml',
|
||||
],
|
||||
'update_xml': [
|
||||
'crm_wizard.xml',
|
||||
'crm_configuration_wizard.xml',
|
||||
'crm_view.xml',
|
||||
'crm_config_view.xml',
|
||||
'crm_jobs_view.xml',
|
||||
'crm_jobs_menu.xml',
|
||||
'crm_lead_view.xml',
|
||||
'crm_lead_menu.xml',
|
||||
'crm_meeting_wizard.xml',
|
||||
'crm_meeting_view.xml',
|
||||
'crm_meeting_menu.xml',
|
||||
'crm_opportunity_view.xml',
|
||||
'crm_opportunity_menu.xml',
|
||||
'crm_fund_view.xml',
|
||||
'crm_fund_menu.xml',
|
||||
'crm_claims_view.xml',
|
||||
'crm_claims_menu.xml',
|
||||
'crm_phonecall_view.xml',
|
||||
'crm_phonecall_menu.xml',
|
||||
'crm_report_view.xml',
|
||||
'crm_helpdesk_view.xml',
|
||||
'crm_report.xml',
|
||||
'security/crm_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'crm_wizard.xml',
|
||||
'crm_view.xml',
|
||||
'crm_config_view.xml',
|
||||
'crm_job_wizard.xml',
|
||||
'crm_jobs_view.xml',
|
||||
'crm_jobs_menu.xml',
|
||||
'crm_lead_wizard.xml',
|
||||
'crm_lead_view.xml',
|
||||
'crm_lead_menu.xml',
|
||||
'crm_meeting_wizard.xml',
|
||||
'crm_meeting_view.xml',
|
||||
'crm_meeting_menu.xml',
|
||||
'crm_opportunity_wizard.xml',
|
||||
'crm_opportunity_view.xml',
|
||||
'crm_opportunity_menu.xml',
|
||||
'crm_fund_view.xml',
|
||||
'crm_fund_menu.xml',
|
||||
'crm_claims_view.xml',
|
||||
'crm_claims_menu.xml',
|
||||
'crm_phonecall_wizard.xml',
|
||||
'crm_phonecall_view.xml',
|
||||
'crm_phonecall_menu.xml',
|
||||
'crm_report_view.xml',
|
||||
'crm_helpdesk_view.xml',
|
||||
'crm_report.xml',
|
||||
'security/crm_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'process/crm_configuration_process.xml'
|
||||
],
|
||||
],
|
||||
'demo_xml': [
|
||||
'crm_demo.xml',
|
||||
'crm_meeting_demo.xml',
|
||||
'crm_claims_demo.xml',
|
||||
'crm_fund_demo.xml',
|
||||
'crm_helpdesk_demo.xml',
|
||||
'crm_jobs_demo.xml',
|
||||
'crm_lead_demo.xml',
|
||||
'crm_claims_demo.xml',
|
||||
'crm_fund_demo.xml',
|
||||
'crm_helpdesk_demo.xml',
|
||||
'crm_jobs_demo.xml',
|
||||
'crm_lead_demo.xml',
|
||||
'crm_meeting_demo.xml',
|
||||
'crm_opportunity_demo.xml',
|
||||
'crm_phonecall_demo.xml'],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0079056041421',
|
||||
'crm_opportunity_demo.xml',
|
||||
'crm_phonecall_demo.xml'],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0079056041421',
|
||||
}
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -32,12 +32,6 @@ import tools
|
|||
from osv import fields,osv,orm
|
||||
from osv.orm import except_orm
|
||||
|
||||
from scripts.openerp_mailgate import openerp_mailgate
|
||||
import email
|
||||
import netsvc
|
||||
from poplib import POP3, POP3_SSL
|
||||
from imaplib import IMAP4, IMAP4_SSL
|
||||
|
||||
MAX_LEVEL = 15
|
||||
AVAILABLE_STATES = [
|
||||
('draft','Draft'),
|
||||
|
@ -64,18 +58,16 @@ icon_lst = {
|
|||
class crm_case_section(osv.osv):
|
||||
_name = "crm.case.section"
|
||||
_description = "Case Section"
|
||||
_order = "name"
|
||||
_columns = {
|
||||
'name': fields.char('Case Section',size=64, required=True, translate=True),
|
||||
'code': fields.char('Section Code',size=8),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the case section without removing it."),
|
||||
'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
|
||||
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of case sections."),
|
||||
'user_id': fields.many2one('res.users', 'Responsible User'),
|
||||
'reply_to': fields.char('Reply-To', size=64, help="The email address put in the 'Reply-To' of all emails sent by Open ERP about cases in this section"),
|
||||
'parent_id': fields.many2one('crm.case.section', 'Parent Section'),
|
||||
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Sections'),
|
||||
"gateway_ids" : fields.one2many("crm.email.gateway",'section_id',"Email Gateways"),
|
||||
'calendar' : fields.boolean('Calendar', help='Allows to show calendar'),
|
||||
}
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
|
@ -96,106 +88,6 @@ class crm_case_section(osv.osv):
|
|||
_constraints = [
|
||||
(_check_recursion, 'Error ! You cannot create recursive sections.', ['parent_id'])
|
||||
]
|
||||
|
||||
# Mainly used by the wizard
|
||||
def menu_create_data(self, cr, uid, data, menu_lst, context):
|
||||
menus = {}
|
||||
menus[0] = data['menu_parent_id']
|
||||
section = self.browse(cr, uid, data['section_id'], context)
|
||||
for (index, mname, mdomain, latest, view_mode) in menu_lst:
|
||||
view_mode = data['menu'+str(index)+'_option']
|
||||
if view_mode=='no':
|
||||
menus[index] = data['menu_parent_id']
|
||||
continue
|
||||
icon = icon_lst.get(view_mode.split(',')[0], 'STOCK_JUSTIFY_FILL')
|
||||
menu_id=self.pool.get('ir.ui.menu').create(cr, uid, {
|
||||
'name': data['menu'+str(index)],
|
||||
'parent_id': menus[latest],
|
||||
'icon': icon
|
||||
})
|
||||
menus[index] = menu_id
|
||||
action_id = self.pool.get('ir.actions.act_window').create(cr,uid, {
|
||||
'name': data['menu'+str(index)],
|
||||
'res_model': 'crm.case',
|
||||
'domain': mdomain.replace('SECTION_ID', str(data['section_id'])),
|
||||
'view_type': 'form',
|
||||
'view_mode': view_mode,
|
||||
})
|
||||
seq = 0
|
||||
for mode in view_mode.split(','):
|
||||
self.pool.get('ir.actions.act_window.view').create(cr, uid, {
|
||||
'sequence': seq,
|
||||
'view_id': data['view_'+mode],
|
||||
'view_mode': mode,
|
||||
'act_window_id': action_id,
|
||||
'multi': True
|
||||
})
|
||||
seq+=1
|
||||
self.pool.get('ir.values').create(cr, uid, {
|
||||
'name': data['menu'+str(index)],
|
||||
'key2': 'tree_but_open',
|
||||
'model': 'ir.ui.menu',
|
||||
'res_id': menu_id,
|
||||
'value': 'ir.actions.act_window,%d'%action_id,
|
||||
'object': True
|
||||
})
|
||||
return True
|
||||
|
||||
#
|
||||
# Used when called from .XML file
|
||||
#
|
||||
def menu_create(self, cr, uid, ids, name, menu_parent_id=False, context={}):
|
||||
menus = {}
|
||||
menus[-1] = menu_parent_id
|
||||
for section in self.browse(cr, uid, ids, context):
|
||||
for (index, mname, mdomain, latest) in [
|
||||
(0,'',"[('section_id','=',"+str(section.id)+")]", -1),
|
||||
(1,'My ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid)]", 0),
|
||||
(2,'My Unclosed ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('state','<>','cancel'), ('state','<>','done')]", 1),
|
||||
(5,'My Open ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('state','=','open')]", 2),
|
||||
(6,'My Pending ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('state','=','pending')]", 2),
|
||||
(7,'My Draft ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('state','=','draft')]", 2),
|
||||
|
||||
(3,'My Late ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('date_deadline','<=',time.strftime('%Y-%m-%d')), ('state','<>','cancel'), ('state','<>','done')]", 1),
|
||||
(4,'My Canceled ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('state','=','cancel')]", 1),
|
||||
(8,'All ',"[('section_id','=',"+str(section.id)+"),]", 0),
|
||||
(9,'Unassigned ',"[('section_id','=',"+str(section.id)+"),('user_id','=',False)]", 8),
|
||||
(10,'Late ',"[('section_id','=',"+str(section.id)+"),('user_id','=',uid), ('date_deadline','<=',time.strftime('%Y-%m-%d')), ('state','<>','cancel'), ('state','<>','done')]", 8),
|
||||
(11,'Canceled ',"[('section_id','=',"+str(section.id)+"),('state','=','cancel')]", 8),
|
||||
(12,'Unclosed ',"[('section_id','=',"+str(section.id)+"),('state','<>','cancel'), ('state','<>','done')]", 8),
|
||||
(13,'Open ',"[('section_id','=',"+str(section.id)+"),('state','=','open')]", 12),
|
||||
(14,'Pending ',"[('section_id','=',"+str(section.id)+"),('state','=','pending')]", 12),
|
||||
(15,'Draft ',"[('section_id','=',"+str(section.id)+"),('state','=','draft')]", 12),
|
||||
(16,'Unassigned ',"[('section_id','=',"+str(section.id)+"),('user_id','=',False),('state','<>','cancel'),('state','<>','done')]", 12),
|
||||
]:
|
||||
view_mode = 'tree,form'
|
||||
icon = 'STOCK_JUSTIFY_FILL'
|
||||
if index==0:
|
||||
view_mode = 'form,tree'
|
||||
icon = 'STOCK_NEW'
|
||||
menu_id=self.pool.get('ir.ui.menu').create(cr, uid, {
|
||||
'name': mname+name,
|
||||
'parent_id': menus[latest],
|
||||
'icon': icon
|
||||
})
|
||||
menus[index] = menu_id
|
||||
action_id = self.pool.get('ir.actions.act_window').create(cr,uid, {
|
||||
'name': mname+name+' Cases',
|
||||
'res_model': 'crm.case',
|
||||
'domain': mdomain,
|
||||
'view_type': 'form',
|
||||
'view_mode': view_mode,
|
||||
})
|
||||
self.pool.get('ir.values').create(cr, uid, {
|
||||
'name': 'Open Cases',
|
||||
'key2': 'tree_but_open',
|
||||
'model': 'ir.ui.menu',
|
||||
'res_id': menu_id,
|
||||
'value': 'ir.actions.act_window,%d'%action_id,
|
||||
'object': True
|
||||
})
|
||||
return True
|
||||
|
||||
def name_get(self, cr, uid, ids, context={}):
|
||||
if not len(ids):
|
||||
return []
|
||||
|
@ -209,148 +101,6 @@ class crm_case_section(osv.osv):
|
|||
return res
|
||||
crm_case_section()
|
||||
|
||||
class crm_email_gateway_server(osv.osv):
|
||||
_name = "crm.email.gateway.server"
|
||||
_description = "Email Gateway Server"
|
||||
_columns = {
|
||||
'name': fields.char('Server Address',size=64,required=True ,help="IMAP/POP Address Of Email gateway Server"),
|
||||
'login': fields.char('User',size=64,required=True,help="User Login Id of Email gateway"),
|
||||
'password': fields.char('Password',size=64,required=True,help="User Password Of Email gateway"),
|
||||
'server_type': fields.selection([("pop","POP"),("imap","Imap")],"Type of Server", required=True, help="Type of Email gateway Server"),
|
||||
'port': fields.integer("Port" , help="Port Of Email gateway Server. If port is omitted, the standard POP3 port (110) is used for POP EMail Server and the standard IMAP4 port (143) is used for IMAP Sever."),
|
||||
'ssl': fields.boolean('SSL',help ="Use Secure Authentication"),
|
||||
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the email gateway server without removing it."),
|
||||
}
|
||||
_defaults = {
|
||||
'server_type':lambda * a:'pop',
|
||||
'active':lambda * a:True,
|
||||
}
|
||||
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False):
|
||||
port = 0
|
||||
if server_type == 'pop':
|
||||
port = ssl and 995 or 110
|
||||
elif server_type == 'imap':
|
||||
port = ssl and 993 or 143
|
||||
return {'value':{'port':port}}
|
||||
crm_email_gateway_server()
|
||||
|
||||
|
||||
|
||||
class crm_email_gateway(osv.osv):
|
||||
_name = "crm.email.gateway"
|
||||
_description = "Email Gateway"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Name',size=64,help="Name of Mail Gateway."),
|
||||
'server_id': fields.many2one('crm.email.gateway.server',"Gateway Server", required=True),
|
||||
'to_email_id': fields.char('TO', size=64, help="Email address used in the From field of outgoing messages"),
|
||||
'cc_email_id': fields.char('CC',size=64,help="Default eMail in case of any trouble."),
|
||||
'section_id': fields.many2one('crm.case.section',"Section",required=True),
|
||||
'mail_history': fields.one2many("crm.email.history","gateway_id","History", readonly=True)
|
||||
}
|
||||
|
||||
def _fetch_mails(self, cr, uid, ids=False, context={}):
|
||||
'''
|
||||
Function called by the scheduler to fetch mails
|
||||
'''
|
||||
cr.execute('select * from crm_email_gateway gateway \
|
||||
inner join crm_email_gateway_server server \
|
||||
on server.id = gateway.server_id where server.active = True')
|
||||
ids2 = map(lambda x: x[0], cr.fetchall() or [])
|
||||
return self.fetch_mails(cr, uid, ids=ids2, context=context)
|
||||
|
||||
def parse_mail(self, cr, uid, gateway_id, email_message, email_parser=None, context={}):
|
||||
msg_id = case_id = note = False
|
||||
user_obj = self.pool.get('res.users')
|
||||
mail_history_obj = self.pool.get('crm.email.history')
|
||||
users = user_obj.read(cr, uid, uid, ['password'])
|
||||
mailgateway = self.browse(cr, uid, gateway_id, context=context)
|
||||
try :
|
||||
if not email_parser:
|
||||
email_parser = openerp_mailgate.email_parser(uid, users['password'], mailgateway.section_id.id,
|
||||
mailgateway.to_email_id or '', mailgateway.cc_email_id or '', dbname=cr.dbname,
|
||||
host=tools.config['interface'] or 'localhost', port=tools.config['port'] or '8069')
|
||||
|
||||
msg_txt = email.message_from_string(email_message)
|
||||
msg_id = msg_txt['Message-ID']
|
||||
case_id = email_parser.parse(msg_txt)[0]
|
||||
except Exception, e:
|
||||
note = "Error in Parsing Mail: %s " %(str(e))
|
||||
netsvc.Logger().notifyChannel('Emailgate:Parsing mail:%s' % (mailgateway.name or
|
||||
'%s (%s)'%(mailgateway.server_id.login, mailgateway.server_id.name)), netsvc.LOG_ERROR, str(e))
|
||||
|
||||
mail_history_obj.create(cr, uid, {'name':msg_id, 'case_id': case_id, 'gateway_id':mailgateway.id, 'note':note})
|
||||
return case_id,note
|
||||
|
||||
def fetch_mails(self, cr, uid, ids=[], section_ids=[], context={}):
|
||||
if len(section_ids):
|
||||
casesection_obj = self.pool.get('crm.case.section')
|
||||
for section in casesection_obj.read(cr, uid, section_ids, ['gateway_ids']):
|
||||
ids += section['gateway_ids']
|
||||
log_messages = []
|
||||
for mailgateway in self.browse(cr, uid, ids):
|
||||
try :
|
||||
mailgate_server = mailgateway.server_id
|
||||
if not mailgate_server.active:
|
||||
continue
|
||||
mailgate_name = mailgateway.name or "%s (%s)" % (mailgate_server.login, mailgate_server.name)
|
||||
log_messages.append("Mail Server : %s" % mailgate_name)
|
||||
log_messages.append("="*40)
|
||||
new_messages = []
|
||||
if mailgate_server.server_type == 'pop':
|
||||
if mailgate_server.ssl:
|
||||
pop_server = POP3_SSL(mailgate_server.name or 'localhost', mailgate_server.port or 110)
|
||||
else:
|
||||
pop_server = POP3(mailgate_server.name or 'localhost', mailgate_server.port or 110)
|
||||
pop_server.user(mailgate_server.login)
|
||||
pop_server.pass_(mailgate_server.password)
|
||||
pop_server.list()
|
||||
(numMsgs, totalSize) = pop_server.stat()
|
||||
for i in range(1, numMsgs + 1):
|
||||
(header, msges, octets) = pop_server.retr(i)
|
||||
case_id, note = self.parse_mail(cr, uid, mailgateway.id, '\n'.join(msges))
|
||||
log = ''
|
||||
if case_id:
|
||||
log = _('Case Successfull Created : %d'% case_id)
|
||||
if note:
|
||||
log = note
|
||||
log_messages.append(log)
|
||||
new_messages.append(i)
|
||||
pop_server.quit()
|
||||
|
||||
elif mailgate_server.server_type == 'imap':
|
||||
if mailgate_server.ssl:
|
||||
imap_server = IMAP4_SSL(mailgate_server.name or 'localhost', mailgate_server.port or 143)
|
||||
else:
|
||||
imap_server = IMAP4(mailgate_server.name or 'localhost', mailgate_server.port or 143)
|
||||
imap_server.login(mailgate_server.login, mailgate_server.password)
|
||||
imap_server.select()
|
||||
typ, data = imap_server.search(None, '(UNSEEN)')
|
||||
for num in data[0].split():
|
||||
typ, data = imap_server.fetch(num, '(RFC822)')
|
||||
case_id, note = self.parse_mail(cr, uid, mailgateway.id, data[0][1])
|
||||
log = ''
|
||||
if case_id:
|
||||
log = 'Case Successfully Created : %d'% case_id
|
||||
if note:
|
||||
log = note
|
||||
log_messages.append(log)
|
||||
new_messages.append(num)
|
||||
imap_server.close()
|
||||
imap_server.logout()
|
||||
|
||||
except Exception, e:
|
||||
log_messages.append("Error in Fetching Mail: %s " %(str(e)))
|
||||
netsvc.Logger().notifyChannel('Emailgate:Fetching mail:[%d]%s' % (mailgate_server.id, mailgate_server.name), netsvc.LOG_ERROR, str(e))
|
||||
|
||||
log_messages.append("-"*25)
|
||||
log_messages.append("Total Read Mail: %d\n\n" %(len(new_messages)))
|
||||
return log_messages
|
||||
|
||||
crm_email_gateway()
|
||||
|
||||
|
||||
|
||||
class crm_case_categ(osv.osv):
|
||||
_name = "crm.case.categ"
|
||||
_description = "Category of case"
|
||||
|
@ -551,6 +301,11 @@ class crm_case(osv.osv):
|
|||
if context.get('portal', False):
|
||||
return False
|
||||
return uid
|
||||
|
||||
def _get_section(self, cr, uid, context):
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid,context=context)
|
||||
return user.context_section_id
|
||||
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'user_id': _get_default_user,
|
||||
|
@ -560,6 +315,7 @@ class crm_case(osv.osv):
|
|||
'state': lambda *a: 'draft',
|
||||
'priority': lambda *a: AVAILABLE_PRIORITIES[2][0],
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'section_id': _get_section,
|
||||
}
|
||||
_order = 'priority, date_deadline desc, date desc,id desc'
|
||||
|
||||
|
@ -963,9 +719,6 @@ class crm_case(osv.osv):
|
|||
self._action(cr,uid, cases, 'open')
|
||||
return True
|
||||
|
||||
def emails_get(self, cr, uid, id, context={}):
|
||||
case = self.browse(cr, uid, id)
|
||||
return ((case.user_id and case.user_id.address_id and case.user_id.address_id.email) or False, case.email_from, case.email_cc, case.priority)
|
||||
|
||||
def case_cancel(self, cr, uid, ids, *args):
|
||||
cases = self.browse(cr, uid, ids)
|
||||
|
@ -1040,19 +793,6 @@ class crm_case_history(osv.osv):
|
|||
}
|
||||
crm_case_history()
|
||||
|
||||
class crm_email_history(osv.osv):
|
||||
_name = "crm.email.history"
|
||||
_description = "Email History"
|
||||
_columns = {
|
||||
'name': fields.char('Message Id', size=64, help="Message Id in Email Server."),
|
||||
'case_id': fields.many2one('crm.case',"Case"),
|
||||
'gateway_id': fields.many2one('crm.email.gateway',"Email Gateway", required=True),
|
||||
'note': fields.text('Notes'),
|
||||
}
|
||||
_order = 'id desc'
|
||||
crm_email_history()
|
||||
|
||||
|
||||
class crm_email_add_cc_wizard(osv.osv_memory):
|
||||
_name = "crm.email.add.cc"
|
||||
_description = "Email Add CC"
|
||||
|
@ -1105,5 +845,23 @@ class crm_email_add_cc_wizard(osv.osv_memory):
|
|||
return {}
|
||||
|
||||
crm_email_add_cc_wizard()
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
def _section_get(self, cr, uid, context={}):
|
||||
obj = self.pool.get('crm.case.section')
|
||||
ids = obj.search(cr, uid, [])
|
||||
res = obj.read(cr, uid, ids, ['id','name'], context)
|
||||
res = [(str(r['id']),r['name']) for r in res]
|
||||
return res
|
||||
|
||||
class users(osv.osv):
|
||||
_inherit = 'res.users'
|
||||
_description = "Users"
|
||||
_columns = {
|
||||
'context_section_id': fields.selection(_section_get, 'Sales Section'),
|
||||
}
|
||||
|
||||
users()
|
||||
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
|
@ -15,7 +15,7 @@
|
|||
# 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/>.
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
|
@ -30,21 +30,30 @@ class crm_claim(osv.osv):
|
|||
_name = "crm.claim"
|
||||
_description = "Claim Cases"
|
||||
_order = "id desc"
|
||||
_inherits = {'crm.case':"inherit_case_id"}
|
||||
_columns = {
|
||||
_inherits = {'crm.case':"inherit_case_id"}
|
||||
_columns = {
|
||||
'inherit_case_id': fields.many2one('crm.case','Case',ondelete='cascade'),
|
||||
}
|
||||
def _map_ids(self, method, cr, uid, ids, *args, **argv):
|
||||
case_data = self.browse(cr, uid, ids)
|
||||
if isinstance(ids, (str, int, long)):
|
||||
select = [ids]
|
||||
else:
|
||||
select = ids
|
||||
case_data = self.browse(cr, uid, select)
|
||||
new_ids = []
|
||||
for case in case_data:
|
||||
if case.inherit_case_id:
|
||||
new_ids.append(case.inherit_case_id.id)
|
||||
return getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
res = getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
if isinstance(ids, (str, int, long)) and isinstance(res, list):
|
||||
return res and res[0] or False
|
||||
return res
|
||||
|
||||
|
||||
def onchange_case_id(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
|
||||
def stage_next(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
|
||||
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
|
||||
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
|
||||
|
@ -52,15 +61,93 @@ class crm_claim(osv.osv):
|
|||
def onchange_categ_id(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('onchange_categ_id',cr,uid,ids,*args,**argv)
|
||||
def case_close(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_close',cr,uid,ids,*args,**argv)
|
||||
return self._map_ids('case_close',cr,uid,ids,*args,**argv)
|
||||
def case_open(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_open',cr,uid,ids,*args,**argv)
|
||||
def case_cancel(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
|
||||
def case_reset(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
|
||||
def case_escalate(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
|
||||
def case_pending(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
|
||||
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
|
||||
def case_escalate(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
|
||||
def case_pending(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
|
||||
|
||||
def msg_new(self, cr, uid, msg):
|
||||
mailgate_obj = self.pool.get('mail.gateway')
|
||||
msg_body = mailgate_obj.msg_body_get(msg)
|
||||
data = {
|
||||
'name': msg['Subject'],
|
||||
'email_from': msg['From'],
|
||||
'email_cc': msg['Cc'],
|
||||
'user_id': False,
|
||||
'description': msg_body['body'],
|
||||
'history_line': [(0, 0, {'description': msg_body['body'], 'email': msg['From'] })],
|
||||
}
|
||||
res = mailgate_obj.partner_get(cr, uid, msg['From'])
|
||||
if res:
|
||||
data.update(res)
|
||||
res = self.create(cr, uid, data)
|
||||
return res
|
||||
|
||||
def msg_update(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_update',cr, uid, ids, *args, **argv)
|
||||
def emails_get(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('emails_get',cr, uid, ids, *args, **argv)
|
||||
def msg_send(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_send',cr, uid, ids, *args, **argv)
|
||||
crm_claim()
|
||||
|
||||
|
||||
class crm_claim_assign_wizard(osv.osv_memory):
|
||||
_name = 'crm.claim.assign_wizard'
|
||||
|
||||
_columns = {
|
||||
'section_id': fields.many2one('crm.case.section', 'Section', required=False),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
}
|
||||
|
||||
def _get_default_section(self, cr, uid, context):
|
||||
case_id = context.get('active_id',False)
|
||||
if not case_id:
|
||||
return False
|
||||
case_obj = self.pool.get('crm.claim')
|
||||
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
|
||||
if case['state'] in ('done'):
|
||||
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
|
||||
return case['section_id']
|
||||
|
||||
|
||||
_defaults = {
|
||||
'section_id': _get_default_section
|
||||
}
|
||||
def action_create(self, cr, uid, ids, context=None):
|
||||
case_obj = self.pool.get('crm.claim')
|
||||
case_id = context.get('active_id',[])
|
||||
res = self.read(cr, uid, ids)[0]
|
||||
case = case_obj.browse(cr, uid, case_id)
|
||||
if case.state in ('done'):
|
||||
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
|
||||
new_case_id = case_obj.copy(cr, uid, case_id, default=
|
||||
{
|
||||
'section_id':res.get('section_id',False),
|
||||
'user_id':res.get('user_id',False),
|
||||
'case_id' : case.inherit_case_id.id
|
||||
}, context=context)
|
||||
case_obj.case_close(cr, uid, [case_id])
|
||||
|
||||
data_obj = self.pool.get('ir.model.data')
|
||||
result = data_obj._get_id(cr, uid, 'crm', 'view_crm_case_claims_filter')
|
||||
search_view = data_obj.read(cr, uid, result, ['res_id'])
|
||||
value = {
|
||||
'name': _('Claims'),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form,tree',
|
||||
'res_model': 'crm.claim',
|
||||
'res_id': int(new_case_id),
|
||||
'type': 'ir.actions.act_window',
|
||||
'search_view_id': search_view['res_id']
|
||||
}
|
||||
return value
|
||||
|
||||
crm_claim_assign_wizard()
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<!--
|
||||
((((((((((( Demo Cases )))))))))))
|
||||
-->
|
||||
<record id="crm_case_claim01" model="crm.case">
|
||||
<record id="crm_case_claim01" model="crm.claim">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_15"/>
|
||||
<field eval="time.strftime('%Y-%m-04 10:45:36')" name="date"/>
|
||||
<field name="category2_id" ref="crm.category_claim1"/>
|
||||
|
@ -20,7 +20,7 @@
|
|||
<field name="stage_id" ref="crm.stage_claim1"/>
|
||||
<field eval=""(769) 703-274"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_claim02" model="crm.case">
|
||||
<record id="crm_case_claim02" model="crm.claim">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_6"/>
|
||||
<field eval="time.strftime('%Y-%m-11 11:19:25')" name="date"/>
|
||||
<field name="category2_id" ref="crm.category_claim2"/>
|
||||
|
@ -36,7 +36,7 @@
|
|||
<field name="stage_id" ref="crm.stage_claim5"/>
|
||||
<field eval=""(956) 293-2595"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_claim03" model="crm.case">
|
||||
<record id="crm_case_claim03" model="crm.claim">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_2"/>
|
||||
<field eval="time.strftime('%Y-%m-15 17:44:12')" name="date"/>
|
||||
<field name="category2_id" ref="crm.category_claim1"/>
|
||||
|
@ -53,7 +53,7 @@
|
|||
<field eval=""(079) 681-2139"" name="partner_phone"/>
|
||||
<field eval=""contact@tecsas.fr"" name="email_from"/>
|
||||
</record>
|
||||
<record id="crm_case_claim04" model="crm.case">
|
||||
<record id="crm_case_claim04" model="crm.claim">
|
||||
<field eval="time.strftime('%Y-%m-21 14:10:23')" name="date"/>
|
||||
<field name="category2_id" ref="crm.category_claim2"/>
|
||||
<field name="partner_id" ref="base.res_partner_tinyatwork"/>
|
||||
|
@ -68,7 +68,7 @@
|
|||
<field name="stage_id" ref="crm.stage_claim5"/>
|
||||
<field eval=""(514) 698-4118"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_claim05" model="crm.case">
|
||||
<record id="crm_case_claim05" model="crm.claim">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_10"/>
|
||||
<field eval="time.strftime('%Y-%m-28 16:20:43')" name="date"/>
|
||||
<field name="category2_id" ref="crm.category_claim1"/>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<field name="stage_id" ref="crm.stage_claim3"/>
|
||||
<field eval=""(855) 924-4364"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_claim06" model="crm.case">
|
||||
<record id="crm_case_claim06" model="crm.claim">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_1"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="crm.category_claim2"/>
|
||||
|
@ -101,7 +101,7 @@
|
|||
<field eval=""(373) 907-1009"" name="partner_phone"/>
|
||||
<field eval=""info@opensides.be"" name="email_from"/>
|
||||
</record>
|
||||
<record id="crm_case_claims07" model="crm.case">
|
||||
<record id="crm_case_claims07" model="crm.claim">
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="crm.category_claim1"/>
|
||||
<field name="partner_id" ref="base.res_partner_seagate"/>
|
||||
|
@ -117,4 +117,4 @@
|
|||
<field eval=""(282) 603-7489"" name="partner_phone"/>
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
|
|
|
@ -6,11 +6,10 @@
|
|||
######################## CLAIMS (menu) ###########################
|
||||
<record model="ir.actions.act_window" id="crm_case_categ_claim0">
|
||||
<field name="name">All Claims</field>
|
||||
<field name="res_model">crm.case</field>
|
||||
<field name="res_model">crm.claim</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,calendar</field>
|
||||
<field name="view_id" ref="crm_case_claims_tree_view"/>
|
||||
<field name="domain" eval="'[(\'section_id\',\'=\','+str(ref('section_support_claims'))+')]'"/>
|
||||
<field name="view_id" ref="crm_case_claims_tree_view"/>
|
||||
<field name="context" eval="{'default_state':'open'}"/>
|
||||
<field name="search_view_id" ref="crm.view_crm_case_claims_filter"/>
|
||||
</record>
|
||||
|
|
|
@ -5,9 +5,37 @@
|
|||
# Claims
|
||||
# ------------------------------------------------------
|
||||
|
||||
<record model="ir.ui.view" id="crm_claim_assign_wizard_form">
|
||||
<field name="name">crm.claim.assign_wizard.form</field>
|
||||
<field name="model">crm.claim.assign_wizard</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="To Assign">
|
||||
<group col="2">
|
||||
<field name="section_id" select="1" widget="selection"/>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<separator colspan="4"/>
|
||||
<group col="2" colspan="2">
|
||||
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
|
||||
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_crm_claim_assign_wizard" model="ir.actions.act_window">
|
||||
<field name="name">To Assign</field>
|
||||
<field name="res_model">crm.claim.assign_wizard</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm_claim_assign_wizard_form"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="crm_case_claims_tree_view">
|
||||
<field name="name">CRM - Claims Tree</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.claim</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Claims" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
|
||||
|
@ -24,7 +52,7 @@
|
|||
|
||||
<record model="ir.ui.view" id="crm_case_claims_form_view">
|
||||
<field name="name">CRM - Claims Form</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.claim</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Claims">
|
||||
|
@ -43,7 +71,7 @@
|
|||
</group>
|
||||
<group colspan="2">
|
||||
<field name="case_id" select="1"/>
|
||||
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
|
||||
<button string="Assign" name="%(action_crm_claim_assign_wizard)d" type="action" />
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
|
@ -139,7 +167,7 @@
|
|||
|
||||
<record model="ir.ui.view" id="crm_case_claims_calendar_view">
|
||||
<field name="name">CRM - Claims Calendar</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.claim</field>
|
||||
<field name="type">calendar</field>
|
||||
<field name="priority" eval="2"/>
|
||||
<field name="arch" type="xml">
|
||||
|
@ -152,8 +180,8 @@
|
|||
</record>
|
||||
|
||||
<record id="view_crm_case_claims_filter" model="ir.ui.view">
|
||||
<field name="name">crm.case.claims.select</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="name">CRM - Claims Search</field>
|
||||
<field name="model">crm.claim</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Claims">
|
||||
|
|
|
@ -182,46 +182,5 @@ class crm_menu_config_wizard(osv.osv_memory):
|
|||
cr.commit()
|
||||
db, pool = pooler.restart_pool(cr.dbname, update_module=True)
|
||||
crm_menu_config_wizard()
|
||||
|
||||
|
||||
class crm_generic_wizard(osv.osv_memory):
|
||||
_name = 'crm.generic_wizard'
|
||||
|
||||
_columns = {
|
||||
'section_id': fields.many2one('crm.case.section', 'Section', required=True),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
}
|
||||
|
||||
def _get_default_section(self, cr, uid, context):
|
||||
case_id = context.get('active_id',False)
|
||||
if not case_id:
|
||||
return False
|
||||
case_obj = self.pool.get('crm.case')
|
||||
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
|
||||
if case['state'] in ('done'):
|
||||
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
|
||||
return case['section_id']
|
||||
|
||||
|
||||
_defaults = {
|
||||
'section_id': _get_default_section
|
||||
}
|
||||
def action_create(self, cr, uid, ids, context=None):
|
||||
case_obj = self.pool.get('crm.case')
|
||||
case_id = context.get('active_id',[])
|
||||
res = self.read(cr, uid, ids)[0]
|
||||
case = case_obj.read(cr, uid, case_id, ['state'])
|
||||
if case['state'] in ('done'):
|
||||
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
|
||||
new_case_id = case_obj.copy(cr, uid, case_id, default=
|
||||
{
|
||||
'section_id':res.get('section_id',False),
|
||||
'user_id':res.get('user_id',False)
|
||||
}, context=context)
|
||||
case_obj.write(cr, uid, case_id, {'case_id':new_case_id}, context=context)
|
||||
case_obj.case_close(cr, uid, [case_id])
|
||||
return {}
|
||||
|
||||
crm_generic_wizard()
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -62,36 +62,8 @@
|
|||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm_case_stage_tree"/>
|
||||
</record>
|
||||
<menuitem action="crm_case_stage_act" id="menu_crm_case_stage_act" parent="crm.next_id_51"/>
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="crm_generic_wizard">
|
||||
<field name="name">crm.generic_wizard.form</field>
|
||||
<field name="model">crm.generic_wizard</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Generic Wizard">
|
||||
<group col="2">
|
||||
<field name="section_id" select="1" widget="selection"/>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<separator colspan="4"/>
|
||||
<group col="2" colspan="2">
|
||||
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
|
||||
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="crm_generic_wizard_act" model="ir.actions.act_window">
|
||||
<field name="name">Generic Wizard</field>
|
||||
<field name="res_model">crm.generic_wizard</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm_generic_wizard"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
<menuitem action="crm_case_stage_act" id="menu_crm_case_stage_act" parent="crm.next_id_51"/>
|
||||
|
||||
|
||||
|
||||
</data>
|
||||
|
|
|
@ -1,63 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<wizard
|
||||
string="History of Events"
|
||||
name="crm.case.history.events"
|
||||
model="crm.case"
|
||||
id="wizard_case_history_event"
|
||||
keyword="client_action_relate"
|
||||
|
||||
/>
|
||||
|
||||
<wizard
|
||||
id="wizard_crm_partner_create"
|
||||
keyword="client_action_multi"
|
||||
model="crm.case"
|
||||
name="crm.case.partner_create"
|
||||
multi="True"
|
||||
string="Create Partner"/>
|
||||
|
||||
<wizard
|
||||
id="wizard_crm_meeting"
|
||||
keyword="client_action_multi"
|
||||
model="crm.case"
|
||||
name="crm.case.meeting"
|
||||
multi="True"
|
||||
string="Schedule Meeting"/>
|
||||
|
||||
<wizard
|
||||
id="wizard_crm_opportunity_set"
|
||||
keyword="client_action_multi"
|
||||
model="crm.case"
|
||||
name="crm.case.opportunity_set"
|
||||
multi="True"
|
||||
string="Convert To Opportunity"/>
|
||||
|
||||
<wizard
|
||||
id="wizard_partner_create_opportunity"
|
||||
keyword="client_action_multi"
|
||||
model="res.partner"
|
||||
name="crm.case.partner.opportunity_create"
|
||||
menu="False"
|
||||
string="Create Opportunity"/>
|
||||
|
||||
<wizard
|
||||
id="wizard_crm_reschedule_phone_call"
|
||||
keyword="client_action_multi"
|
||||
model="crm.case"
|
||||
name="crm.case.reschedule_phone_call"
|
||||
multi="True"
|
||||
string="Schedule Phone Call" />
|
||||
|
||||
<wizard
|
||||
id="wizard_partner_create_opportunity1"
|
||||
keyword="client_action_relate"
|
||||
model="res.partner"
|
||||
name="crm.case.partner.opportunity_create"
|
||||
string="Create Opportunity"/>
|
||||
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -65,18 +65,7 @@
|
|||
<field eval="'crm.case.rule'" name="model"/>
|
||||
<field eval="'_check'" name="function"/>
|
||||
<field eval="'()'" name="args"/>
|
||||
</record>
|
||||
|
||||
<record id="ir_cron_crm_email_gateway_action" model="ir.cron">
|
||||
<field name="name">Check Email (Fetchmail)</field>
|
||||
<field name="interval_number">5</field>
|
||||
<field name="interval_type">minutes</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall"/>
|
||||
<field eval="'crm.email.gateway'" name="model"/>
|
||||
<field eval="'_fetch_mails'" name="function"/>
|
||||
<field eval="'()'" name="args"/>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_helpingstreetchildren0" model="crm.case">
|
||||
<record id="crm_case_helpingstreetchildren0" model="crm.fundraising">
|
||||
<field eval="50" name="probability"/>
|
||||
<field name="partner_address_id" ref="base.res_partner_address_1"/>
|
||||
<field eval="1" name="active"/>
|
||||
|
@ -20,7 +20,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_helpingearthquakevictims0" model="crm.case">
|
||||
<record id="crm_case_helpingearthquakevictims0" model="crm.fundraising">
|
||||
<field eval="80" name="probability"/>
|
||||
<field name="partner_address_id" ref="base.main_address"/>
|
||||
<field eval="1" name="active"/>
|
||||
|
@ -38,7 +38,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_donatingbookstoschoollibraries0" model="crm.case">
|
||||
<record id="crm_case_donatingbookstoschoollibraries0" model="crm.fundraising">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_zen"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="categ2_fund1"/>
|
||||
|
@ -55,7 +55,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_renovatinggovernmentschools0" model="crm.case">
|
||||
<record id="crm_case_renovatinggovernmentschools0" model="crm.fundraising">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_7"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="categ2_fund2"/>
|
||||
|
@ -73,7 +73,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_donatingambulancestohospitals0" model="crm.case">
|
||||
<record id="crm_case_donatingambulancestohospitals0" model="crm.fundraising">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_13"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="categ2_fund4"/>
|
||||
|
@ -90,7 +90,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_donatinghospitalequipments0" model="crm.case">
|
||||
<record id="crm_case_donatinghospitalequipments0" model="crm.fundraising">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_2"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="categ2_fund3"/>
|
||||
|
@ -108,7 +108,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_encouragingarts0" model="crm.case">
|
||||
<record id="crm_case_encouragingarts0" model="crm.fundraising">
|
||||
<field name="partner_address_id" ref="base.res_partner_address_14"/>
|
||||
<field eval="1" name="active"/>
|
||||
<field name="category2_id" ref="categ2_fund2"/>
|
||||
|
@ -125,7 +125,7 @@
|
|||
</record>
|
||||
</data>
|
||||
<data noupdate="1">
|
||||
<record id="crm_case_promotingculturalprogramsandpreservingdyingartforms0" model="crm.case">
|
||||
<record id="crm_case_promotingculturalprogramsandpreservingdyingartforms0" model="crm.fundraising">
|
||||
<field eval="10" name="probability"/>
|
||||
<field name="partner_address_id" ref="base.res_partner_address_1"/>
|
||||
<field eval="1" name="active"/>
|
||||
|
|
|
@ -4,10 +4,9 @@
|
|||
<!-- MENU -->
|
||||
<record model="ir.actions.act_window" id="crm_case_category_act_fund_all1">
|
||||
<field name="name">All Funds</field>
|
||||
<field name="res_model">crm.case</field>
|
||||
<field name="res_model">crm.fundraising</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="view_id" ref="crm.crm_case_tree_view_fund"/>
|
||||
<field name="domain" eval="'[(\'section_id\',\'=\','+str(section_support4)+')]'"/>
|
||||
<field name="view_id" ref="crm.crm_case_tree_view_fund"/>
|
||||
<field name="context" eval="{'default_state':'open'}"/>
|
||||
<field name="search_view_id" ref="crm.view_crm_case_fund_filter"/>
|
||||
</record>
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# ------------------------------------------------------
|
||||
<record model="ir.ui.view" id="crm_case_tree_view_fund">
|
||||
<field name="name">CRM - Funds Tree</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.fundraising</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Funds Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
|
||||
|
@ -30,7 +30,7 @@
|
|||
</record>
|
||||
<record model="ir.ui.view" id="crm_case_form_view_fund">
|
||||
<field name="name">CRM - Funds Form</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.fundraising</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Funds Form">
|
||||
|
@ -127,7 +127,7 @@
|
|||
</record>
|
||||
<record model="ir.ui.view" id="crm_case_calendar_view_fund">
|
||||
<field name="name">CRM - Funds Calendar</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.fundraising</field>
|
||||
<field name="type">calendar</field>
|
||||
<field name="priority" eval="2"/>
|
||||
<field name="arch" type="xml">
|
||||
|
@ -139,7 +139,7 @@
|
|||
</record>
|
||||
<record model="ir.ui.view" id="crm_case_graph_view_fund">
|
||||
<field name="name">CRM - Funds Graph</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="model">crm.fundraising</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Funds by Categories" type="bar" orientation="horizontal">
|
||||
|
@ -151,8 +151,8 @@
|
|||
</record>
|
||||
|
||||
<record id="view_crm_case_fund_filter" model="ir.ui.view">
|
||||
<field name="name">crm.case.fund.select</field>
|
||||
<field name="model">crm.case</field>
|
||||
<field name="name">CRM - Funds Search</field>
|
||||
<field name="model">crm.fundraising</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Search Funds">
|
||||
|
|
|
@ -41,12 +41,19 @@ class crm_fundraising(osv.osv):
|
|||
'inherit_case_id': fields.many2one('crm.case','Case',ondelete='cascade'),
|
||||
}
|
||||
def _map_ids(self, method, cr, uid, ids, *args, **argv):
|
||||
case_data = self.browse(cr, uid, ids)
|
||||
if isinstance(ids, (str, int, long)):
|
||||
select = [ids]
|
||||
else:
|
||||
select = ids
|
||||
case_data = self.browse(cr, uid, select)
|
||||
new_ids = []
|
||||
for case in case_data:
|
||||
if case.inherit_case_id:
|
||||
new_ids.append(case.inherit_case_id.id)
|
||||
return getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
res = getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
if isinstance(ids, (str, int, long)) and isinstance(res, list):
|
||||
return res and res[0] or False
|
||||
return res
|
||||
|
||||
|
||||
def onchange_case_id(self, cr, uid, ids, *args, **argv):
|
||||
|
@ -68,6 +75,30 @@ class crm_fundraising(osv.osv):
|
|||
def case_escalate(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_escalate',cr,uid,ids,*args,**argv)
|
||||
def case_pending(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
|
||||
return self._map_ids('case_pending',cr,uid,ids,*args,**argv)
|
||||
|
||||
def msg_new(self, cr, uid, msg):
|
||||
mailgate_obj = self.pool.get('mail.gateway')
|
||||
msg_body = mailgate_obj.msg_body_get(msg)
|
||||
data = {
|
||||
'name': msg['Subject'],
|
||||
'email_from': msg['From'],
|
||||
'email_cc': msg['Cc'],
|
||||
'user_id': False,
|
||||
'description': msg_body['body'],
|
||||
'history_line': [(0, 0, {'description': msg_body['body'], 'email': msg['From'] })],
|
||||
}
|
||||
res = mailgate_obj.partner_get(cr, uid, msg['From'])
|
||||
if res:
|
||||
data.update(res)
|
||||
res = self.create(cr, uid, data)
|
||||
return res
|
||||
|
||||
def msg_update(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_update',cr, uid, ids, *args, **argv)
|
||||
def emails_get(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('emails_get',cr, uid, ids, *args, **argv)
|
||||
def msg_send(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_send',cr, uid, ids, *args, **argv)
|
||||
|
||||
crm_fundraising()
|
||||
crm_fundraising()
|
||||
|
|
|
@ -36,18 +36,25 @@ class crm_helpdesk(osv.osv):
|
|||
_name = "crm.helpdesk"
|
||||
_description = "Helpdesk Cases"
|
||||
_order = "id desc"
|
||||
_inherits = {'crm.case':"inherit_case_id"}
|
||||
_columns = {
|
||||
_inherits = {'crm.case':"inherit_case_id"}
|
||||
_columns = {
|
||||
'inherit_case_id':fields.many2one('crm.case','Case'),
|
||||
}
|
||||
|
||||
|
||||
def _map_ids(self, method, cr, uid, ids, *args, **argv):
|
||||
case_data = self.browse(cr, uid, ids)
|
||||
if isinstance(ids, (str, int, long)):
|
||||
select = [ids]
|
||||
else:
|
||||
select = ids
|
||||
case_data = self.browse(cr, uid, select)
|
||||
new_ids = []
|
||||
for case in case_data:
|
||||
if case.inherit_case_id:
|
||||
new_ids.append(case.inherit_case_id.id)
|
||||
return getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
res = getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
if isinstance(ids, (str, int, long)) and isinstance(res, list):
|
||||
return res and res[0] or False
|
||||
return res
|
||||
|
||||
|
||||
def onchange_case_id(self, cr, uid, ids, *args, **argv):
|
||||
|
@ -59,15 +66,77 @@ class crm_helpdesk(osv.osv):
|
|||
def onchange_categ_id(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('onchange_categ_id',cr,uid,ids,*args,**argv)
|
||||
def case_close(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_close',cr,uid,ids,*args,**argv)
|
||||
return self._map_ids('case_close',cr,uid,ids,*args,**argv)
|
||||
def case_open(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_open',cr,uid,ids,*args,**argv)
|
||||
def case_cancel(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
|
||||
def case_reset(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
|
||||
|
||||
|
||||
def msg_new(self, cr, uid, msg):
|
||||
mailgate_obj = self.pool.get('mail.gateway')
|
||||
msg_body = mailgate_obj.msg_body_get(msg)
|
||||
data = {
|
||||
'name': msg['Subject'],
|
||||
'email_from': msg['From'],
|
||||
'email_cc': msg['Cc'],
|
||||
'user_id': False,
|
||||
'description': msg_body['body'],
|
||||
'history_line': [(0, 0, {'description': msg_body['body'], 'email': msg['From'] })],
|
||||
}
|
||||
res = mailgate_obj.partner_get(cr, uid, msg['From'])
|
||||
if res:
|
||||
data.update(res)
|
||||
res = self.create(cr, uid, data)
|
||||
return res
|
||||
|
||||
def msg_update(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_update',cr, uid, ids, *args, **argv)
|
||||
def emails_get(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('emails_get',cr, uid, ids, *args, **argv)
|
||||
def msg_send(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_send',cr, uid, ids, *args, **argv)
|
||||
|
||||
crm_helpdesk()
|
||||
|
||||
class crm_helpdesk_assign_wizard(osv.osv_memory):
|
||||
_name = 'crm.helpdesk.assign_wizard'
|
||||
|
||||
_columns = {
|
||||
'section_id': fields.many2one('crm.case.section', 'Section', required=False),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
}
|
||||
|
||||
def _get_default_section(self, cr, uid, context):
|
||||
case_id = context.get('active_id',False)
|
||||
if not case_id:
|
||||
return False
|
||||
case_obj = self.pool.get('crm.helpdesk')
|
||||
case = case_obj.read(cr, uid, case_id, ['state','section_id'])
|
||||
if case['state'] in ('done'):
|
||||
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
|
||||
return case['section_id']
|
||||
|
||||
|
||||
_defaults = {
|
||||
'section_id': _get_default_section
|
||||
}
|
||||
def action_create(self, cr, uid, ids, context=None):
|
||||
case_obj = self.pool.get('crm.helpdesk')
|
||||
case_id = context.get('active_id',[])
|
||||
res = self.read(cr, uid, ids)[0]
|
||||
case = case_obj.read(cr, uid, case_id, ['state'])
|
||||
if case['state'] in ('done'):
|
||||
raise osv.except_osv(_('Error !'), _('You can not assign Closed Case.'))
|
||||
new_case_id = case_obj.copy(cr, uid, case_id, default=
|
||||
{
|
||||
'section_id':res.get('section_id',False),
|
||||
'user_id':res.get('user_id',False)
|
||||
}, context=context)
|
||||
case_obj.write(cr, uid, case_id, {'case_id':new_case_id}, context=context)
|
||||
case_obj.case_close(cr, uid, [case_id])
|
||||
return {}
|
||||
|
||||
crm_helpdesk_assign_wizard()
|
||||
|
||||
|
|
|
@ -6,6 +6,34 @@
|
|||
# Helpdesk Support
|
||||
# ------------------------------------------------------
|
||||
|
||||
<record model="ir.ui.view" id="crm_helpdesk_assign_wizard_form">
|
||||
<field name="name">crm.helpdesk.assign_wizard.form</field>
|
||||
<field name="model">crm.helpdesk.assign_wizard</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="To Assign">
|
||||
<group col="2">
|
||||
<field name="section_id" select="1" widget="selection"/>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<separator colspan="4"/>
|
||||
<group col="2" colspan="2">
|
||||
<button icon="gtk-cancel" special="cancel" string="Cancel"/>
|
||||
<button icon="gtk-execute" name="action_create" string="Assign" type="object"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="action_crm_helpdesk_assign_wizard" model="ir.actions.act_window">
|
||||
<field name="name">To Assign</field>
|
||||
<field name="res_model">crm.opportunity.assign_wizard</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm_helpdesk_assign_wizard_form"/>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="crm_case_form_view_helpdesk">
|
||||
<field name="name">CRM - Helpdesk Support Form</field>
|
||||
<field name="model">crm.case</field>
|
||||
|
@ -20,7 +48,7 @@
|
|||
<field name="priority"/>
|
||||
<group colspan="2">
|
||||
<field name="case_id" select="1"/>
|
||||
<button string="Assign" name="%(crm_generic_wizard_act)d" type="action" />
|
||||
<button string="Assign" name="%(action_crm_helpdesk_assign_wizard)d" type="action" />
|
||||
</group>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
|
|
|
@ -31,6 +31,7 @@ from tools.translate import _
|
|||
import tools
|
||||
from osv import fields,osv,orm
|
||||
from osv.orm import except_orm
|
||||
|
||||
class crm_job(osv.osv):
|
||||
_name = "crm.job"
|
||||
_description = "Job Cases"
|
||||
|
@ -40,16 +41,25 @@ class crm_job(osv.osv):
|
|||
'inherit_case_id': fields.many2one('crm.case','Case',ondelete='cascade'),
|
||||
}
|
||||
def _map_ids(self, method, cr, uid, ids, *args, **argv):
|
||||
case_data = self.browse(cr, uid, ids)
|
||||
if isinstance(ids, (str, int, long)):
|
||||
select = [ids]
|
||||
else:
|
||||
select = ids
|
||||
case_data = self.browse(cr, uid, select)
|
||||
new_ids = []
|
||||
for case in case_data:
|
||||
if case.inherit_case_id:
|
||||
new_ids.append(case.inherit_case_id.id)
|
||||
return getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
res = getattr(self.pool.get('crm.case'),method)(cr, uid, new_ids, *args, **argv)
|
||||
if isinstance(ids, (str, int, long)) and isinstance(res, list):
|
||||
return res and res[0] or False
|
||||
return res
|
||||
|
||||
|
||||
def onchange_case_id(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('onchange_case_id',cr,uid,ids,*args,**argv)
|
||||
def stage_next(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('stage_next',cr,uid,ids,*args,**argv)
|
||||
def onchange_partner_id(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('onchange_partner_id',cr,uid,ids,*args,**argv)
|
||||
def onchange_partner_address_id(self, cr, uid, ids, *args, **argv):
|
||||
|
@ -63,5 +73,29 @@ class crm_job(osv.osv):
|
|||
def case_cancel(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_cancel',cr,uid,ids,*args,**argv)
|
||||
def case_reset(self,cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
|
||||
crm_job()
|
||||
return self._map_ids('case_reset',cr,uid,ids,*args,**argv)
|
||||
|
||||
def msg_new(self, cr, uid, msg):
|
||||
mailgate_obj = self.pool.get('mail.gateway')
|
||||
msg_body = mailgate_obj.msg_body_get(msg)
|
||||
data = {
|
||||
'name': msg['Subject'],
|
||||
'email_from': msg['From'],
|
||||
'email_cc': msg['Cc'],
|
||||
'user_id': False,
|
||||
'description': msg_body['body'],
|
||||
'history_line': [(0, 0, {'description': msg_body['body'], 'email': msg['From'] })],
|
||||
}
|
||||
res = mailgate_obj.partner_get(cr, uid, msg['From'])
|
||||
if res:
|
||||
data.update(res)
|
||||
res = self.create(cr, uid, data)
|
||||
return res
|
||||
|
||||
def msg_update(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_update',cr, uid, ids, *args, **argv)
|
||||
def emails_get(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('emails_get',cr, uid, ids, *args, **argv)
|
||||
def msg_send(self, cr, uid, ids, *args, **argv):
|
||||
return self._map_ids('msg_send',cr, uid, ids, *args, **argv)
|
||||
crm_job()
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<wizard
|
||||
id="wizard_crm_job_reschedule_phone_call"
|
||||
keyword="client_action_multi"
|
||||
model="crm.job"
|
||||
name="crm.job.reschedule_phone_call"
|
||||
multi="True"
|
||||
string="Schedule Phone Call" />
|
||||
|
||||
<wizard
|
||||
id="wizard_crm_job_meeting_set"
|
||||
keyword="client_action_multi"
|
||||
model="crm.job"
|
||||
name="crm.job.meeting_set"
|
||||
multi="True"
|
||||
string="Schedule Meeting"/>
|
||||
|
||||
<wizard
|
||||
id="wizard_crm_job_partner_create"
|
||||
keyword="client_action_multi"
|
||||
model="crm.job"
|
||||
name="crm.job.partner_create"
|
||||
multi="True"
|
||||
string="Create Partner"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -6,7 +6,7 @@
|
|||
-->
|
||||
|
||||
<!--For Jobs Requests-->
|
||||
<record id="crm_case_salesman0" model="crm.case">
|
||||
<record id="crm_case_salesman0" model="crm.job">
|
||||
<field eval="time.strftime('%Y-%m-01 10:35:50')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-03')" name="date_deadline"/>
|
||||
<field name="category2_id" ref="crm.category_job1"/>
|
||||
|
@ -25,7 +25,7 @@
|
|||
<field eval=""Salesman"" name="name"/>
|
||||
<field eval=""1236547890"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_traineemca0" model="crm.case">
|
||||
<record id="crm_case_traineemca0" model="crm.job">
|
||||
<field model="res.partner.canal" name="canal_id" search="[('name','=','E-mail')]"/>
|
||||
<field name="partner_address_id" ref="base.res_partner_address_14"/>
|
||||
<field name="som" ref="base.som_fury"/>
|
||||
|
@ -47,7 +47,7 @@
|
|||
<field eval="time.strftime('%Y-%m-15')" name="date_deadline"/>
|
||||
<field eval=""6633225"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_fresher0" model="crm.case">
|
||||
<record id="crm_case_fresher0" model="crm.job">
|
||||
<field model="res.partner.canal" name="canal_id" search="[('name','=','direct')]"/>
|
||||
<field name="som" ref="base.som_happy"/>
|
||||
<field eval="time.strftime('%Y-%m-15 16:10:00')" name="date"/>
|
||||
|
@ -67,7 +67,7 @@
|
|||
<field eval=""Fresher"" name="name"/>
|
||||
<field eval=""999666735"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_yrsexperienceinphp0" model="crm.case">
|
||||
<record id="crm_case_yrsexperienceinphp0" model="crm.job">
|
||||
<field eval="time.strftime('%Y-%m-25 16:25:52')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="categ_id" ref="crm.categ_job2"/>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<field name="stage_id" ref="crm.stage_job6"/>
|
||||
<field eval=""More than 5 yrs Experience in PHP"" name="name"/>
|
||||
</record>
|
||||
<record id="crm_case_marketingjob0" model="crm.case">
|
||||
<record id="crm_case_marketingjob0" model="crm.job">
|
||||
<field eval="time.strftime('%Y-%m-26 17:15:32')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="category2_id" ref="crm.category_job2"/>
|
||||
|
@ -103,7 +103,7 @@
|
|||
<field eval=""Marketing Job"" name="name"/>
|
||||
<field eval=""33968745"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_financejob0" model="crm.case">
|
||||
<record id="crm_case_financejob0" model="crm.job">
|
||||
<field eval="time.strftime('%Y-%m-26 17:39:42')" name="date"/>
|
||||
<field eval="time.strftime('%Y-%m-28')" name="date_deadline"/>
|
||||
<field name="category2_id" ref="crm.category_job2"/>
|
||||
|
@ -122,7 +122,7 @@
|
|||
<field eval=""Finance Job"" name="name"/>
|
||||
<field eval=""33968745"" name="partner_phone"/>
|
||||
</record>
|
||||
<record id="crm_case_traineemca1" model="crm.case">
|
||||
<record id="crm_case_traineemca1" model="crm.job">
|
||||
<field model="res.partner.canal" name="canal_id" search="[('name','=','E-mail')]"/>
|
||||
<field name="partner_address_id" ref="base.res_partner_address_14"/>
|
||||
<field name="som" ref="base.som_fury"/>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue