[merge] from trunk

bzr revid: xmo@tinyerp.com-20100112083009-gn2zawih1y6hbpsr
This commit is contained in:
Xavier Morel 2010-01-12 09:30:09 +01:00
commit f51eaab7ea
338 changed files with 137261 additions and 651930 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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ä"

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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 "结束记录"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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',

View File

@ -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>

View File

@ -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','&lt;=',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>

View File

@ -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()

View File

@ -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:

View File

@ -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

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 caldav_calendar_all basic_calendar_all caldav.calendar basic.calendar model_caldav_calendar model_basic_calendar 1 1 1 1
3 caldav_event_all basic_calendar_event_all caldav.event basic.calendar.event model_caldav_event model_basic_calendar_event 1 1 1 1
4 caldav_attendee_all basic_calendar_attendee_all caldav.attendee basic.calendar.attendee model_caldav_attendee model_basic_calendar_attendee 1 1 1 1
5 access_crm_caldav_attendee access_basic_calendar_attendee crm.caldav.attendee calendar.attendee model_crm_caldav_attendee model_basic_calendar_attendee 1 1 1 1
6 access_crm_caldav_alarm access_basic_calendar_alarm crm.caldav.alarm calendar.alarm model_crm_caldav_alarm model_basic_calendar_alarm 1 1 1 1

View File

@ -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

View File

@ -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:

294
addons/crm/crm.py Executable file → Normal file
View File

@ -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:

View File

@ -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()

View File

@ -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="&quot;(769) 703-274&quot;" 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="&quot;(956) 293-2595&quot;" 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="&quot;(079) 681-2139&quot;" name="partner_phone"/>
<field eval="&quot;contact@tecsas.fr&quot;" 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="&quot;(514) 698-4118&quot;" 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="&quot;(855) 924-4364&quot;" 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="&quot;(373) 907-1009&quot;" name="partner_phone"/>
<field eval="&quot;info@opensides.be&quot;" 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="&quot;(282) 603-7489&quot;" name="partner_phone"/>
</record>
</data>
</openerp>
</openerp>

View File

@ -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>

View File

@ -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">

View File

@ -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:

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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"/>

View File

@ -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>

View File

@ -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">

View File

@ -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()

View File

@ -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()

View File

@ -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">

View File

@ -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()

View File

@ -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>

View File

@ -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="&quot;Salesman&quot;" name="name"/>
<field eval="&quot;1236547890&quot;" 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="&quot;6633225&quot;" 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="&quot;Fresher&quot;" name="name"/>
<field eval="&quot;999666735&quot;" 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="&quot;More than 5 yrs Experience in PHP&quot;" 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="&quot;Marketing Job&quot;" name="name"/>
<field eval="&quot;33968745&quot;" 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="&quot;Finance Job&quot;" name="name"/>
<field eval="&quot;33968745&quot;" 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