[MERGE]: merging from same branch

bzr revid: mga@tinyerp.com-20100419210635-fv7bhc6474l4blc8
This commit is contained in:
Mantavya Gajjar 2010-04-20 02:36:35 +05:30
commit 5f197ef01f
250 changed files with 4910 additions and 2470 deletions

View File

@ -122,16 +122,16 @@
<field name="name" select="1" colspan="4"/>
<field name="code" select="1"/>
<field name="parent_id"/>
<field name="company_id" select="2" widget="selection" groups="base.group_multi_company"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
<field name="user_type" select="1"/>
</group>
<notebook colspan="4">
<page string="General Information">
<newline/>
<field name="currency_id" select="2"/>
<field name="currency_mode" select="2"/>
<field name="currency_id"/>
<field name="currency_mode"/>
<field name="reconcile"/>
<field name="active" select="2"/>
<field name="active"/>
<field name="check_history"/>
<field name="type" select="1"/>
<newline/>
@ -338,7 +338,7 @@
<field name="date" select="1"/>
<field name="journal_id" on_change="onchange_journal_id(journal_id)" select="1"/>
<field name="currency"/>
<field name="period_id" select="2"/>
<field name="period_id"/>
<group colspan="2" col="3">
<!-- <button name="%(action_view_account_statement_from_invoice)d"-->
<!-- string="Import Invoice" type="action" attrs="{'invisible':[('state','=','confirm')]}" icon="gtk-open"/>-->
@ -382,7 +382,7 @@
</page>
</notebook>
<group col="7" colspan="4">
<field name="state" select="2"/>
<field name="state"/>
<field name="balance_end"/>
<button name="button_dummy" states="draft" string="Compute" icon="gtk-execute"/>
<button name="button_confirm" states="draft" string="Confirm" type="object" icon="gtk-apply"/>
@ -599,14 +599,14 @@
<field name="name" select="1"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
<field name="description" select="1"/>
<field name="active" select="2"/>
<field name="active"/>
<field name="tax_group" select="1"/>
<field name="type"/>
</group>
<notebook colspan="4">
<page string="Tax Definition">
<field name="applicable_type"/>
<field name="amount" select="2" attrs="{'readonly':[('type','=','none'),('type','=','code')]}"/>
<field name="amount" attrs="{'readonly':[('type','=','none'),('type','=','code')]}"/>
<field groups="base.group_extended" name="include_base_amount"/>
<field groups="base.group_extended" name="domain"/>
<newline/>
@ -701,23 +701,23 @@
<separator colspan="4" string="General Information"/>
<field name="name" select="1"/>
<field name="date" select="1"/>
<field name="ref" select="2"/>
<field name="invoice" select="2"/>
<field name="ref"/>
<field name="invoice"/>
<field name="account_id" select="1" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
<field name="partner_id" select="1" on_change="onchange_partner_id(False,partner_id,account_id,debit,credit,date)"/>
<field name="debit" select="2"/>
<field name="credit" select="2"/>
<field name="debit"/>
<field name="credit"/>
<field name="company_id" required="1" groups="base.group_multi_company"/>
<separator colspan="4" string="Optional Information"/>
<field name="currency_id"/>
<field name="amount_currency"/>
<field name="quantity" select="2"/>
<field name="quantity"/>
<field name="move_id" required="False"/>
<newline/>
<field name="statement_id" select="2"/>
<field name="blocked" select="2"/>
<field name="statement_id"/>
<field name="blocked"/>
<field name="date_maturity"/>
<field name="date_created"/>
<newline/>
@ -728,11 +728,11 @@
<field name="analytic_account_id"/>
<separator colspan="4" string="State"/>
<field name="journal_id" select="2"/>
<field name="journal_id"/>
<field name="period_id"/>
<field name="reconcile_id"/>
<field name="reconcile_partial_id"/>
<field name="state" select="2"/>
<field name="state"/>
</page>
<page string="Analytic Lines">
<field colspan="4" name="analytic_lines" nolabel="1" context="{'default_general_account_id':account_id, 'default_name': name, 'default_date':date, 'amount': (debit or 0.0)-(credit or 0.0)}"/>
@ -754,14 +754,14 @@
<page string="Information">
<separator colspan="4" string="General Information"/>
<field name="name" select="1"/>
<field name="date" select="2"/>
<field name="date"/>
<field name="journal_id" readonly="False" select="1"/>
<field name="period_id" readonly="False" select="2"/>
<field name="period_id" readonly="False"/>
<field name="account_id" select="1" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]"/>
<field name="partner_id" select="2" on_change="onchange_partner_id(False,partner_id,account_id,debit,credit,date)"/>
<field name="partner_id" on_change="onchange_partner_id(False,partner_id,account_id,debit,credit,date)"/>
<newline/>
<field name="debit" select="2"/>
<field name="credit" select="2"/>
<field name="debit"/>
<field name="credit"/>
<separator colspan="4" string="Optional Information"/>
<field name="currency_id"/>
@ -780,7 +780,7 @@
<newline/>
<field name="reconcile_id"/>
<field name="reconcile_partial_id"/>
<field name="state" select="2"/>
<field name="state"/>
</page>
<page string="Analytic Lines">
<field colspan="4" name="analytic_lines" nolabel="1"/>
@ -861,13 +861,13 @@
<form string="Account Entry">
<group colspan="4" col="6">
<field name="name" select="1" readonly="True"/>
<field name="period_id" select="2"/>
<field name="period_id"/>
<field name="journal_id" select="1"/>
<field name="company_id" required="1" groups="base.group_multi_company"/>
<field name="date" select="1"/>
<field name="ref" select="1"/>
<field name="to_check" select="2"/>
<field name="type" select="2" groups="base.group_extended"/>
<field name="to_check"/>
<field name="type" groups="base.group_extended"/>
</group>
<field name="partner_id" invisible="1" select="1"/>
<field name="amount" invisible="1" select="1"/>
@ -917,7 +917,7 @@
</tree>
</field>
<separator colspan="4" string="Narration"/>
<field name="narration" select="2" colspan="4" nolabel="1"/>
<field name="narration" colspan="4" nolabel="1"/>
<separator colspan="4" string="State"/>
<field name="state" select="1"/>
<group col="2" colspan="2">
@ -1041,7 +1041,7 @@
</page>
</notebook>
<group col="7" colspan="4">
<field name="state" select="2"/>
<field name="state"/>
<field name="balance_end"/>
<button name="button_dummy" states="draft" string="Compute" icon="gtk-execute"/>
<button name="button_confirm" states="draft" string="Confirm" type="object" icon="gtk-apply"/>
@ -1315,7 +1315,7 @@
<separator colspan="4" string="Subscription Periods"/>
<field name="date_start" select="1"/>
<field name="period_total" select="2"/>
<field name="period_total"/>
<field name="period_nbr"/>
<field name="period_type"/>
@ -1328,7 +1328,7 @@
<field colspan="4" name="lines_id" widget="one2many_list" nolabel="1"/>
<separator colspan="4" string="State"/>
<field name="state" select="2"/>
<field name="state"/>
<group col="1" colspan="2">
<button name="state_draft" states="done" string="Set to Draft" type="object" icon="gtk-convert" />
</group>
@ -1485,6 +1485,7 @@
<!-- register configuration wizard -->
<record id="config_fiscalyear" model="ir.actions.todo">
<field name="action_id" ref="action_account_config_wizard_form"/>
<field name="restart">onskip</field>
</record>
<record id="view_account_addtmpl_wizard_form" model="ir.ui.view">
@ -1534,7 +1535,7 @@
<field name="type" select="1"/>
<field name="user_type" select="1"/>
<field name="currency_id" select="2"/>
<field name="currency_id"/>
<field name="reconcile"/>
<field name="tax_ids" colspan="4"/>
</page>
@ -1627,13 +1628,13 @@
<newline/>
<field name="chart_template_id" select="1"/>
<field name="tax_group" select="1"/>
<field name="type" select="2"/>
<field name="type_tax_use" select="2"/>
<field name="type"/>
<field name="type_tax_use"/>
</group>
<notebook colspan="4">
<page string="Tax Definition">
<field name="applicable_type"/>
<field name="amount" select="2" attrs="{'readonly':[('type','=','none'),('type','=','code')]}"/>
<field name="amount" attrs="{'readonly':[('type','=','none'),('type','=','code')]}"/>
<field groups="base.group_extended" name="include_base_amount"/>
<field groups="base.group_extended" name="domain"/>
<newline/>

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-17 23:18+0000\n"
"Last-Translator: Sianna <Unknown>\n"
"PO-Revision-Date: 2010-04-17 18:26+0000\n"
"Last-Translator: Boris <boris.t.ivanov@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: 2010-04-17 04:05+0000\n"
"X-Launchpad-Export-Date: 2010-04-19 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
@ -55,7 +55,7 @@ msgstr "Актив"
#. module: account
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Невалидно име на модел при задаването на действие."
#. module: account
#: help:account.journal,currency:0
@ -257,7 +257,7 @@ msgstr "Данъци за доставчици"
#. module: account
#: view:account.move:0
msgid "Total Debit"
msgstr ""
msgstr "Общ дебит"
#. module: account
#: rml:account.tax.code.entries:0
@ -370,7 +370,7 @@ msgstr "Аналитична сметка"
#: field:account.tax,child_depend:0
#: field:account.tax.template,child_depend:0
msgid "Tax on Children"
msgstr ""
msgstr "Данък върху подчинени"
#. module: account
#: rml:account.central.journal:0
@ -387,7 +387,7 @@ msgstr "Описание на фактура"
#. module: account
#: constraint:account.analytic.account:0
msgid "Error! You can not create recursive analytic accounts."
msgstr ""
msgstr "Грешка! Не можете да създадете рекурсивни аналитични сметки."
#. module: account
#: field:account.bank.statement.reconcile,total_entry:0
@ -398,7 +398,7 @@ msgstr "Общо записи"
#: field:account.fiscal.position.account,account_src_id:0
#: field:account.fiscal.position.account.template,account_src_id:0
msgid "Account Source"
msgstr ""
msgstr "Счетоводен източник"
#. module: account
#: field:account.journal,update_posted:0
@ -537,7 +537,7 @@ msgstr ""
#: model:ir.actions.act_window,name:account.action_account_tax_template_form
#: model:ir.ui.menu,name:account.menu_action_account_tax_template_form
msgid "Tax Templates"
msgstr ""
msgstr "Шаблони на данъци"
#. module: account
#: field:account.invoice,reconciled:0
@ -552,13 +552,13 @@ msgstr "Отложен метод"
#. module: account
#: field:account.tax.template,include_base_amount:0
msgid "Include in Base Amount"
msgstr ""
msgstr "Включване в основната сума"
#. module: account
#: field:account.tax,ref_base_code_id:0
#: field:account.tax.template,ref_base_code_id:0
msgid "Refund Base Code"
msgstr ""
msgstr "Базов код на обезщетение"
#. module: account
#: view:account.invoice.line:0
@ -591,7 +591,7 @@ msgstr "account.tax"
#. module: account
#: rml:account.central.journal:0
msgid "Printing Date"
msgstr ""
msgstr "Дата на отпечатване"
#. module: account
#: rml:account.general.ledger:0

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-12-31 12:45+0000\n"
"PO-Revision-Date: 2010-04-18 09:39+0000\n"
"Last-Translator: Albert Cervera i Areny - http://www.NaN-tic.com <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: 2010-04-17 04:05+0000\n"
"X-Launchpad-Export-Date: 2010-04-19 03:46+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account
@ -41,7 +41,7 @@ msgstr "Codificació assentaments"
#. 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 "Especifiquel el missage per als pagaments fora de termini."
#. module: account
#: model:process.transition,name:account.process_transition_confirmstatementfromdraft0
@ -326,7 +326,7 @@ msgstr "Origen"
#. module: account
#: rml:account.analytic.account.journal:0
msgid "Move Name"
msgstr ""
msgstr "Nom de l'assentament"
#. module: account
#: xsl:account.transfer:0
@ -436,7 +436,7 @@ msgstr "Negatiu"
#. module: account
#: rml:account.partner.balance:0
msgid "(Account/Partner) Name"
msgstr ""
msgstr "(Compte/Empresa) Nom"
#. module: account
#: selection:account.move,type:0
@ -482,7 +482,7 @@ msgstr "Conciliació bancària"
#. module: account
#: rml:account.invoice:0
msgid "Disc.(%)"
msgstr ""
msgstr "Desc.(%)"
#. module: account
#: rml:account.general.ledger:0
@ -1160,7 +1160,7 @@ msgstr "Preu un."
#. module: account
#: rml:account.analytic.account.journal:0
msgid "Period from :"
msgstr ""
msgstr "Període des de:"
#. module: account
#: model:ir.model,name:account.model_wizard_multi_charts_accounts
@ -1353,7 +1353,7 @@ msgstr "Homòleg centralitzat"
#. module: account
#: view:wizard.company.setup:0
msgid "Message"
msgstr ""
msgstr "Missatge"
#. module: account
#: model:process.node,note:account.process_node_supplierpaymentorder0
@ -1516,7 +1516,7 @@ msgstr "Tanca estats"
#. 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
@ -1854,7 +1854,7 @@ msgstr "Compte director"
#. module: account
#: rml:account.analytic.account.journal:0
msgid "to :"
msgstr ""
msgstr "a:"
#. module: account
#: wizard_field:account.move.line.reconcile,init_full,debit:0
@ -2186,7 +2186,7 @@ msgstr "Assentament analític"
#. module: account
#: view:res.company:0 field:res.company,overdue_msg:0
msgid "Overdue Payments Message"
msgstr ""
msgstr "Missatge de pagaments fora de termini"
#. module: account
#: model:ir.actions.act_window,name:account.action_tax_code_tree
@ -2488,7 +2488,7 @@ msgstr "Obre diari"
#. 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
@ -2681,7 +2681,7 @@ msgstr "Patrimoni"
#. module: account
#: field:wizard.company.setup,overdue_msg:0
msgid "Overdue Payment Message"
msgstr ""
msgstr "Missage dels pagaments fora de termini"
#. module: account
#: model:ir.model,name:account.model_account_tax_code_template
@ -2743,7 +2743,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
@ -3898,7 +3898,7 @@ msgstr ""
#: model:ir.actions.act_window,name:account.action_wizard_company_setup_form
#: view:wizard.company.setup:0
msgid "Overdue Payment Report Message"
msgstr ""
msgstr "Missatge de l'informe dels pagaments fora de termini"
#. module: account
#: selection:account.tax,tax_group:0

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: 2010-04-17 04:06+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account

View File

@ -84,23 +84,23 @@
</group>
<group col="2" colspan="2">
<separator string="Customer Credit" colspan="2"/>
<field name="credit" select="2"/>
<field name="credit_limit" select="2" groups="base.group_extended"/>
<field name="credit"/>
<field name="credit_limit" groups="base.group_extended"/>
</group>
<group col="2" colspan="2">
<separator string="Supplier Debit" colspan="2"/>
<field name="debit" select="2"/>
<field name="debit"/>
</group>
<field colspan="4" context="{'address': address}" name="bank_ids" nolabel="1" select="2">
<field colspan="4" context="{'address': address}" name="bank_ids" nolabel="1">
<form string="Bank account">
<field name="state" select="2"/>
<field name="state"/>
<newline/>
<field name="acc_number" select="1"/>
<newline/>
<field name="bank"/>
<newline/>
<field name="sequence"/>
<field colspan="4" name="name" select="2"/>
<field colspan="4" name="name"/>
<separator colspan="4" string="Bank account owner"/>
<field colspan="4" name="owner_name"/>
<field colspan="4" name="street"/>

View File

@ -2,7 +2,7 @@
<data>
<menuitem icon="terp-project" id="base.menu_main_pm" name="Project Management" sequence="1"/>
<menuitem id="next_id_71" name="Financial Project Management" parent="base.menu_main_pm" groups="account.group_account_invoice" sequence="20"/>
<menuitem id="menu_invoicing" name="Invoicing" parent="next_id_71" sequence="20"/>
<menuitem id="menu_invoicing" name="Billing" parent="next_id_71" sequence="20"/>
<record id="action_hr_tree_invoiced_all" model="ir.actions.act_window">
<field name="name">All Uninvoiced Entries</field>

View File

@ -39,11 +39,11 @@
<field name="last_invoice_date"/>
<field name="last_worked_invoiced_date" select="2"/>
<field name="last_worked_invoiced_date"/>
<field name="last_worked_date"/>
<separator colspan="4" string="To be invoiced"/>
<field name="hours_qtt_non_invoiced"/>
<field name="ca_to_invoice" select="2"/>
<field name="ca_to_invoice"/>
</page>
<page string="Stats by month">

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-04-17 04:11+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_analytic_plans

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-11-24 12:50+0000\n"
"PO-Revision-Date: 2010-03-24 17:25+0000\n"
"Last-Translator: relojero <relojero28@gmail.com>\n"
"PO-Revision-Date: 2010-04-17 21:08+0000\n"
"Last-Translator: Rodrigo Machado Laprebendere <Unknown>\n"
"Language-Team: Spanish <es@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: 2010-04-17 04:21+0000\n"
"X-Launchpad-Export-Date: 2010-04-19 03:46+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_anglo_saxon
@ -38,16 +38,29 @@ msgid ""
" when the invoice is created to transfer this amount to the debtor or "
"creditor account."
msgstr ""
"Éste módulo soportará la metodología de contabilización Anglosajona \n"
" cambiando la lógica de contabilización con transacciones de acciones. La "
"diferencia entre los países de contabilización Anglosajona \n"
" y el Rin o también llamados países de contabilización Continental es el "
"momento de tomar el Costo de Bienes Vendidos contra el Costo de Ventas. \n"
" La contabilización Anglosajona toma el costo cuando la factura de ventas "
"es creada, la contabilización Continental tomará el costo en el momento en "
"que los bienes son enviados.\n"
" Éste módulo agregará esta funcionalidad usando una cuenta provisional, "
"para almacenar el valor de los bienes enviados y devolverá esta cuenta "
"provisional \n"
" cuando la factura sea creada para transferir esta cantidad al deudor o "
"acreedor de la cuenta."
#. module: account_anglo_saxon
#: model:ir.module.module,shortdesc:account_anglo_saxon.module_meta_information
msgid "Stock Account"
msgstr ""
msgstr "Cuenta de Valores"
#. module: account_anglo_saxon
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
msgstr "¡XML Inválido para la Arquitectura de la Vista!"
#. module: account_anglo_saxon
#: field:product.category,property_account_creditor_price_difference_categ:0

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-04-17 04:09+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_balance

View File

@ -296,7 +296,7 @@
<!--Menu for project management-->
<menuitem icon="terp-project" id="base.menu_main_pm" name="Project Management" sequence="1"/>
<menuitem id="base.menu_pm_invoicing" name="Invoicing" parent="base.menu_main_pm" sequence="7"/>
<menuitem id="base.menu_pm_invoicing" name="Billing" parent="base.menu_main_pm" sequence="7"/>
<menuitem id="menu_pm_budget" name="Budgets" parent="base.menu_pm_invoicing"/>
<menuitem action="open_budget_post_form" id="menu_pm_budget_post_form" parent="menu_pm_budget"/>
<menuitem parent="menu_pm_budget"

View File

@ -0,0 +1,496 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
#
msgid ""
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: 2010-04-17 09:13+0000\n"
"Last-Translator: Cédric VALMARY (Per Tot en òc) <cvalmary@yahoo.fr>\n"
"Language-Team: Occitan (post 1500) <oc@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: 2010-04-19 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Date :"
msgstr "Data :"
#. module: account_followup
#: wizard_field:account_followup.followup.print.all,next,partner_ids:0
msgid "Partners"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Customer Ref :"
msgstr ""
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.act_account_partner_account_move_payable_all
#: model:ir.ui.menu,name:account_followup.menu_account_move_open_unreconcile_payable
msgid "All payable entries"
msgstr ""
#. module: account_followup
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nom del Modèl invalid per la definicion de l'accion."
#. module: account_followup
#: field:account_followup.followup.line,description:0
msgid "Printed Message"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Amount In Currency"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Due"
msgstr "Tèrme"
#. module: account_followup
#: view:account.move.line:0
msgid "Total debit"
msgstr "Debit total"
#. module: account_followup
#: view:account_followup.followup.line:0
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(user_signature)s: User name"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "Select partners"
msgstr ""
#. module: account_followup
#: view:account_followup.followup:0
#: field:account_followup.followup,followup_line:0
msgid "Follow-Up"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,debit:0
msgid "Debit"
msgstr "Debit"
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "Email Settings"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,account_type:0
msgid "Account Type"
msgstr "Tipe de compte"
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Ref"
msgstr "Ref."
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(followup_amount)s: Total Amount Due"
msgstr ""
#. module: account_followup
#: view:account_followup.followup.line:0
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(date)s: Current Date"
msgstr ""
#. module: account_followup
#: field:account.move.line,followup_date:0
msgid "Latest Follow-up"
msgstr ""
#. module: account_followup
#: field:account_followup.followup.line,followup_id:0
#: field:account_followup.stat,followup_id:0
msgid "Follow Ups"
msgstr ""
#. module: account_followup
#: wizard_field:account_followup.followup.print.all,init,date:0
msgid "Follow-up Sending Date"
msgstr ""
#. module: account_followup
#: view:account_followup.followup:0
#: field:account_followup.followup,description:0
#: rml:account_followup.followup.print:0
msgid "Description"
msgstr "Descripcion"
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Balance:"
msgstr "Balança :"
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "VAT:"
msgstr ""
#. module: account_followup
#: field:account_followup.followup,company_id:0
msgid "Company"
msgstr "Entrepresa"
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Invoice Date"
msgstr ""
#. module: account_followup
#: wizard_field:account_followup.followup.print.all,next,email_subject:0
msgid "Email Subject"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Paid"
msgstr "Pagat"
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(line)s: Account Move lines"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,date_followup:0
msgid "Latest followup"
msgstr ""
#. module: account_followup
#: view:account.move.line:0
msgid "Partner entries"
msgstr ""
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_followup_line
msgid "Follow-Ups Criteria"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "Partner Selection"
msgstr ""
#. module: account_followup
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML invalid per l'arquitectura de la vista"
#. module: account_followup
#: field:account_followup.followup.line,start:0
msgid "Type of Term"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,init:0
msgid "Follow-up and Date Selection"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "Select partners to remind"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Li."
msgstr "Lit."
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line1
msgid ""
"\n"
"Dear %(partner_name)s,\n"
"\n"
"Exception made if there was a mistake of ours, it seems that the following "
"amount staid unpaid. Please, take appropriate measures in order to carry out "
"this payment in the next 8 days.\n"
"\n"
"Would your payment have been carried out after this mail was sent, please "
"consider the present one as void. Do not hesitate to contact our accounting "
"department at (+32).10.68.94.39.\n"
"\n"
"Best Regards,\n"
"\t\t\t"
msgstr ""
#. module: account_followup
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"Lo nom de l'objècte deu començar amb x_ e conténer pas de caractèrs "
"especials !"
#. module: account_followup
#: wizard_button:account_followup.followup.print.all,summary,end:0
msgid "Ok"
msgstr "D'acòrdi"
#. module: account_followup
#: field:account_followup.followup,name:0
#: field:account_followup.followup.line,name:0
msgid "Name"
msgstr "Nom"
#. module: account_followup
#: field:account_followup.stat,date_move:0
msgid "First move"
msgstr ""
#. module: account_followup
#: selection:account_followup.followup.line,start:0
msgid "End of Month"
msgstr ""
#. module: account_followup
#: view:account_followup.followup.line:0
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(company_name)s: User's Company name"
msgstr ""
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.act_account_partner_account_move_all
#: model:ir.ui.menu,name:account_followup.menu_account_move_open_unreconcile
msgid "All receivable entries"
msgstr ""
#. module: account_followup
#: view:account_followup.followup:0
msgid "Lines"
msgstr "Linhas"
#. module: account_followup
#: model:ir.actions.wizard,name:account_followup.action_account_followup_all_wizard
#: model:ir.ui.menu,name:account_followup.account_followup_wizard_menu
msgid "Send followups"
msgstr ""
#. module: account_followup
#: field:account.move.line,followup_line_id:0
msgid "Follow-up Level"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,credit:0
msgid "Credit"
msgstr "Credit"
#. module: account_followup
#: model:ir.model,name:account_followup.model_account_followup_stat
msgid "Followup statistics"
msgstr ""
#. module: account_followup
#: wizard_button:account_followup.followup.print.all,init,next:0
msgid "Continue"
msgstr "Contunhar"
#. module: account_followup
#: model:ir.module.module,shortdesc:account_followup.module_meta_information
msgid "Accounting follow-ups management"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,summary:0
#: wizard_field:account_followup.followup.print.all,summary,summary:0
msgid "Summary"
msgstr "Resumit"
#. module: account_followup
#: view:account_followup.followup.line:0
msgid "Follow-Up Lines"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Document : Customer account statement"
msgstr ""
#. module: account_followup
#: view:account_followup.stat:0
msgid "Follow-Up lines"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(company_currency)s: User's Company Currency"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,balance:0
msgid "Balance"
msgstr "Balança"
#. module: account_followup
#: help:account_followup.followup.print.all,init,date:0
msgid ""
"This field allow you to select a forecast date to plan your follow-ups"
msgstr ""
#. module: account_followup
#: view:account.move.line:0
msgid "Total credit"
msgstr "Credit total"
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line2
msgid ""
"\n"
"Dear %(partner_name)s,\n"
"\n"
"We are disappointed to see that despite sending a reminder, that your "
"account is now seriously overdue.\n"
"\n"
"It is essential that immediate payment is made, otherwise we will have to "
"consider placing a stop on your account which means that we will no longer "
"be able to supply your company with (goods/services).\n"
"Please, take appropriate measures in order to carry out this payment in the "
"next 8 days\n"
"\n"
"If there is a problem with paying invoice that we are not aware of, do not "
"hesitate to contact our accounting department at (+32).10.68.94.39. so that "
"we can resolve the matter quickly.\n"
"\n"
"Details of due payments is printed below.\n"
"\n"
"Best Regards,\n"
"\t\t\t"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Sub-Total:"
msgstr ""
#. module: account_followup
#: selection:account_followup.followup.line,start:0
msgid "Net Days"
msgstr ""
#. module: account_followup
#: model:ir.actions.act_window,name:account_followup.action_account_followup_definition_form
#: model:ir.actions.act_window,name:account_followup.action_followup_stat
#: model:ir.model,name:account_followup.model_account_followup_followup
#: model:ir.ui.menu,name:account_followup.account_followup_menu
#: model:ir.ui.menu,name:account_followup.menu_action_followup_stat
msgid "Follow-Ups"
msgstr ""
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
#: wizard_field:account_followup.followup.print.all,next,email_body:0
msgid "Email body"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,date_move_last:0
msgid "Last move"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Maturity"
msgstr ""
#. module: account_followup
#: model:ir.actions.report.xml,name:account_followup.account_followup_followup_report
msgid "Followup Report"
msgstr ""
#. module: account_followup
#: model:account_followup.followup.line,description:account_followup.demo_followup_line3
msgid ""
"\n"
"Dear %(partner_name)s,\n"
"\n"
"Despite several reminders, your account is still not settled.\n"
"\n"
"Unless full payment is made in next 8 days , then legal action for the "
"recovery of the debt, will be taken without further notice.\n"
"\n"
"I trust that this action will prove unnecessary and details of due payments "
"is printed below.\n"
"\n"
"In case of any queries concerning this matter, do not hesitate to contact "
"our accounting department at (+32).10.68.94.39.\n"
"\n"
"Best Regards,\n"
"\t\t\t"
msgstr ""
#. module: account_followup
#: rml:account_followup.followup.print:0
msgid "Maturity Date"
msgstr ""
#. module: account_followup
#: view:account_followup.followup.line:0
#: wizard_view:account_followup.followup.print.all,next:0
msgid "Legend"
msgstr "Legenda"
#. module: account_followup
#: field:account_followup.followup.line,sequence:0
msgid "Sequence"
msgstr "Sequéncia"
#. module: account_followup
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(heading)s: Move line header"
msgstr ""
#. module: account_followup
#: view:account_followup.followup.line:0
#: wizard_view:account_followup.followup.print.all,next:0
msgid "%(partner_name)s: Partner name"
msgstr ""
#. module: account_followup
#: wizard_field:account_followup.followup.print.all,next,email_conf:0
msgid "Send email confirmation"
msgstr ""
#. module: account_followup
#: wizard_field:account_followup.followup.print.all,init,followup_id:0
msgid "Follow-up"
msgstr ""
#. module: account_followup
#: field:account_followup.stat,name:0
msgid "Partner"
msgstr "Partenari"
#. module: account_followup
#: wizard_button:account_followup.followup.print.all,init,end:0
#: wizard_button:account_followup.followup.print.all,next,end:0
msgid "Cancel"
msgstr "Anullar"
#. module: account_followup
#: field:account_followup.followup.line,delay:0
msgid "Days of delay"
msgstr ""
#. module: account_followup
#: wizard_button:account_followup.followup.print.all,next,print:0
msgid "Print Follow Ups & Send Mails"
msgstr ""

View File

@ -0,0 +1,313 @@
# Occitan (post 1500) translation for openobject-addons
# Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010
# This file is distributed under the same license as the openobject-addons package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
#
msgid ""
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: 2010-04-17 09:32+0000\n"
"Last-Translator: Cédric VALMARY (Per Tot en òc) <cvalmary@yahoo.fr>\n"
"Language-Team: Occitan (post 1500) <oc@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: 2010-04-19 03:46+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Sub Total"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Invoice Date:"
msgstr ""
#. module: account_invoice_layout
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"Lo nom de l'objècte deu començar amb x_ e conténer pas de caractèrs "
"especials !"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Cancelled Invoice"
msgstr ""
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
#: field:notify.message,name:0
msgid "Title"
msgstr "Títol"
#. module: account_invoice_layout
#: model:ir.actions.wizard,name:account_invoice_layout.wizard_notify_message
msgid "Invoices with Layout and Message"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Disc. (%)"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "(Incl. taxes):"
msgstr ""
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Note"
msgstr "Nòta"
#. module: account_invoice_layout
#: wizard_button:wizard.notify_message,init,print:0
msgid "Print"
msgstr "Estampar"
#. module: account_invoice_layout
#: help:notify.message,msg:0
msgid ""
"This notification will appear at the bottom of the Invoices when printed."
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Unit Price"
msgstr ""
#. module: account_invoice_layout
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nom del Modèl invalid per la definicion de l'accion."
#. module: account_invoice_layout
#: model:ir.model,name:account_invoice_layout.model_notify_message
msgid "Notify By Messages"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "PRO-FORMA"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice,abstract_line_ids:0
msgid "Invoice Lines"
msgstr ""
#. module: account_invoice_layout
#: view:account.invoice.line:0
msgid "Seq."
msgstr ""
#. module: account_invoice_layout
#: model:ir.ui.menu,name:account_invoice_layout.menu_finan_config_notify_message
msgid "Notification Message"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Customer Ref:"
msgstr "Referéncia Client :"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid ")"
msgstr ")"
#. module: account_invoice_layout
#: field:account.invoice.line,state:0
msgid "Type"
msgstr "Tipe"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Price"
msgstr "Prètz"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "/ ("
msgstr "/ ("
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Taxes:"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice.line,functional_field:0
msgid "Source Account"
msgstr "Compte d'origina"
#. module: account_invoice_layout
#: model:ir.actions.act_window,name:account_invoice_layout.notify_mesage_tree_form
msgid "Write Messages"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Base"
msgstr "Basa"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Fax :"
msgstr ""
#. module: account_invoice_layout
#: field:notify.message,msg:0
msgid "Special Message"
msgstr ""
#. module: account_invoice_layout
#: view:notify.message:0
msgid "Write a notification or a wishful message."
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Tel. :"
msgstr ""
#. module: account_invoice_layout
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML invalid per l'arquitectura de la vista"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Page Break"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Document:"
msgstr ""
#. module: account_invoice_layout
#: wizard_view:wizard.notify_message,init:0
msgid "Select Message"
msgstr "Seleccionatz lo Messatge"
#. module: account_invoice_layout
#: view:notify.message:0
msgid "Messages"
msgstr "Messatges"
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Product"
msgstr "Produch"
#. module: account_invoice_layout
#: model:ir.actions.report.xml,name:account_invoice_layout.account_invoices_1
msgid "Invoices with Layout"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Description / Taxes"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Amount"
msgstr "Soma"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Description/Taxes"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Draft Invoice"
msgstr ""
#. module: account_invoice_layout
#: field:account.invoice.line,sequence:0
msgid "Sequence Number"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Quantity"
msgstr "Quantitat"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Refund"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "VAT :"
msgstr ""
#. module: account_invoice_layout
#: selection:account.invoice.line,state:0
msgid "Separator Line"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Supplier Invoice"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Note :"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Tax"
msgstr "Impòstes e taxas"
#. module: account_invoice_layout
#: model:ir.module.module,shortdesc:account_invoice_layout.module_meta_information
msgid "account_invoice_layout"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Total (Excl. taxes):"
msgstr ""
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Invoice"
msgstr "Factura"
#. module: account_invoice_layout
#: wizard_button:wizard.notify_message,init,end:0
msgid "Cancel"
msgstr "Anullar"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Supplier Refund"
msgstr ""
#. module: account_invoice_layout
#: wizard_field:wizard.notify_message,init,message:0
msgid "Message"
msgstr "Messatge"
#. module: account_invoice_layout
#: rml:account.invoice.layout:0
msgid "Total"
msgstr "Total"
#. module: account_invoice_layout
#: model:ir.ui.menu,name:account_invoice_layout.menu_notify_mesage_tree_form
msgid "All Notification Messages"
msgstr ""

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-02-03 06:24+0000\n"
"Last-Translator: <>\n"
"PO-Revision-Date: 2010-04-17 18:14+0000\n"
"Last-Translator: Valerie Engel <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: 2010-04-17 04:05+0000\n"
"X-Launchpad-Export-Date: 2010-04-19 03:45+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_tax_include
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
msgstr "Neplatný XML pro zobrazení architektury"
#. module: account_tax_include
#: field:account.invoice,price_type:0

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-04-17 04:18+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: analytic_user_function

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: 2010-04-17 04:18+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: analytic_user_function

View File

@ -91,7 +91,7 @@ def real_id2base_calendar_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"))
time.strptime(recurrent_date, "%Y-%m-%d %H:%M:%S"))
return '%d-%s' % (real_id, recurrent_date)
return real_id
@ -253,7 +253,7 @@ class calendar_attendee(osv.osv):
result[id][name] = ''
continue
else:
result[id][name] = self._get_address(attdata.sent_by_uid.name, \
result[id][name] = self._get_address(attdata.sent_by_uid.name, \
attdata.sent_by_uid.address_id.email)
if name == 'cn':
if attdata.user_id:
@ -327,59 +327,60 @@ class calendar_attendee(osv.osv):
'cutype': fields.selection([('individual', 'Individual'), \
('group', 'Group'), ('resource', 'Resource'), \
('room', 'Room'), ('unknown', '') ], \
'Invite Type', help="Specify the type of Invitation"),
'member': fields.char('Member', size=124,
help="Indicate the groups that the attendee belongs to"),
'Invite Type', help="Specify the type of Invitation"),
'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"),
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"),
request was delegated to"),
'delegated_from': fields.function(_compute_data, method=True, string=\
'Delegated From', type="char", store=True, size=124, multi='delegated_from'),
'parent_ids': fields.many2many('calendar.attendee', 'calendar_attendee_parent_rel',\
'attendee_id', 'parent_id', 'Delegrated From'),
'child_ids': fields.many2many('calendar.attendee', 'calendar_attendee_child_rel',\
'attendee_id', 'child_id', 'Delegrated To'),
'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 User',\
type="many2one", relation="res.users", multi='sent_by_uid'),
'cn': fields.function(_compute_data, method=True, string='Common name',\
type="char", size=124, multi='cn', store=True),
'Delegated From', type="char", store=True, size=124, multi='delegated_from'),
'parent_ids': fields.many2many('calendar.attendee', 'calendar_attendee_parent_rel', \
'attendee_id', 'parent_id', 'Delegrated From'),
'child_ids': fields.many2many('calendar.attendee', 'calendar_attendee_child_rel', \
'attendee_id', 'child_id', 'Delegrated To'),
'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 User', \
type="many2one", relation="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.function(_compute_data, method=True, string='Language',\
type="selection", selection=_lang_get, multi='language',\
store=True, help="To specify the language for text values in a\
property or property parameter."),
'user_id': fields.many2one('res.users', 'User'),
'partner_address_id': fields.many2one('res.partner.address', 'Contact'),
'partner_id': fields.related('partner_address_id', 'partner_id', type='many2one',\
relation='res.partner', string='Partner', help="Partner related to contact"),
'email': fields.char('Email', size=124, help="Email of Invited Person"),
'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('Event Ref', selection=_links_get, size=128),
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
that points to the directory information corresponding to the attendee."),
'language': fields.function(_compute_data, method=True, string='Language', \
type="selection", selection=_lang_get, multi='language', \
store=True, help="To specify the language for text values in a\
property or property parameter."),
'user_id': fields.many2one('res.users', 'User'),
'partner_address_id': fields.many2one('res.partner.address', 'Contact'),
'partner_id': fields.related('partner_address_id', 'partner_id', type='many2one', \
relation='res.partner', string='Partner', help="Partner related to contact"),
'email': fields.char('Email', size=124, help="Email of Invited Person"),
'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('Event Ref', selection=_links_get, size=128),
'availability': fields.selection([('free', 'Free'), ('busy', 'Busy')], 'Free/Busy', readonly="True"),
}
_defaults = {
'state': lambda *x: 'needs-action',
'state': lambda *x: 'needs-action',
}
response_re = re.compile("Are you coming\?.*\n*.*(YES|NO|MAYBE).*", re.UNICODE)
@ -421,7 +422,7 @@ request was delegated to"),
if msg_actions['state'] in ['YES', 'NO', 'MAYBE']:
mapping = {'YES': 'accepted', 'NO': 'declined', 'MAYBE': 'tentative'}
status = mapping[msg_actions['state']]
print 'Got response for invitation id: %s as %s' % (ids, status)
print 'Got response for invitation id: %s as %s' % (ids, status)
self.write(cr, uid, ids, {'state': status})
return True
@ -440,37 +441,37 @@ request was delegated to"),
sign = att.sent_by_uid and att.sent_by_uid.signature or ''
sign = '<br>'.join(sign and sign.split('\n') or [])
res_obj = att.ref
sub = '[%s Invitation][%d] %s' % (company, att.id, res_obj.name)
sub = '[%s Invitation][%d] %s' % (company, att.id, res_obj.name)
att_infos = []
other_invitaion_ids = self.search(cr, uid, [('ref','=', att.ref._name + ',' + str(att.ref.id))])
other_invitaion_ids = self.search(cr, uid, [('ref', '=', att.ref._name + ',' + str(att.ref.id))])
for att2 in self.browse(cr, uid, other_invitaion_ids):
att_infos.append(((att2.user_id and att2.user_id.name) or \
(att2.partner_id and att2.partner_id.name) or \
att2.email) + ' - Status: ' + att2.state.title())
body_vals = {'name': res_obj.name,
'start_date': res_obj.date,
'end_date': res_obj.date_deadline or False,
'description': res_obj.description or '-',
'location': res_obj.location or '-',
'attendees': '<br>'.join(att_infos),
'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User',
'sign': sign,
'company': company
att2.email) + ' - Status: ' + att2.state.title())
body_vals = {'name': res_obj.name,
'start_date': res_obj.date,
'end_date': res_obj.date_deadline or False,
'description': res_obj.description or '-',
'location': res_obj.location or '-',
'attendees': '<br>'.join(att_infos),
'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User',
'sign': sign,
'company': company
}
body = html_invitation % body_vals
if mail_to and email_from:
tools.email_send(
email_from,
mail_to,
sub,
body,
subtype='html',
reply_to=email_from
)
email_from,
mail_to,
sub,
body,
subtype='html',
reply_to=email_from
)
return True
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
"""
Make entry on email and availbility on change of user_id field.
Make entry on email and availbility on change of user_id field.
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs.
@ -496,7 +497,7 @@ request was delegated to"),
def do_accept(self, cr, uid, ids, context=None, *args):
"""
Update state which value is accepted.
Update state which value is accepted.
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of calendar attendees IDs.
@ -512,7 +513,7 @@ request was delegated to"),
mod_obj = self.pool.get(vals.ref._name)
if vals.ref:
if vals.ref.user_id.id != user.id:
defaults = {'user_id': user.id}
defaults = {'user_id': user.id}
new_event = mod_obj.copy(cr, uid, vals.ref.id, default=defaults, context=context)
self.write(cr, uid, vals.id, {'state': 'accepted'}, context)
@ -539,7 +540,7 @@ request was delegated to"),
context = {}
if not vals.get("email") and vals.get("cn"):
cnval = vals.get("cn").split(':')
email = filter(lambda x:x.__contains__('@'), cnval)
email = filter(lambda x:x.__contains__('@'), cnval)
vals['email'] = email[0]
vals['cn'] = vals.get("cn")
res = super(calendar_attendee, self).create(cr, uid, vals, context)
@ -551,26 +552,30 @@ 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')], \
'Triggers', required=True),
'trigger_interval': fields.selection([('minutes', 'Minutes'), ('hours', 'Hours'), \
('days', 'Days')], 'Interval', required=True),
'trigger_duration': fields.integer('Duration', required=True),
'trigger_related': fields.selection([('start', 'The event starts'), ('end', \
'The event ends')], 'Related to', required=True),
'name':fields.char('Name', size=256, required=True),
'trigger_occurs': fields.selection([('before', 'Before'), \
('after', 'After')], \
'Triggers', required=True),
'trigger_interval': fields.selection([('minutes', 'Minutes'), \
('hours', 'Hours'), \
('days', 'Days')], 'Interval', \
required=True),
'trigger_duration': fields.integer('Duration', required=True),
'trigger_related': fields.selection([('start', 'The event starts'), \
('end', 'The event ends')], \
'Related to', 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'),
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,
'trigger_interval': lambda *x: 'minutes',
'trigger_duration': lambda *x: 5,
'trigger_occurs': lambda *x: 'before',
'trigger_related': lambda *x: 'start',
'active': lambda *x: 1,
}
def do_alarm_create(self, cr, uid, ids, model, date, context={}):
@ -598,20 +603,20 @@ are both optional, but if one occurs, so MUST the other"""),
self.do_alarm_unlink(cr, uid, [data.id], model)
if basic_alarm:
vals = {
'action': 'display',
'description': data.description,
'name': data.name,
'attendee_ids': [(6, 0, map(lambda x:x.id, data.attendee_ids))],
'trigger_related': basic_alarm.trigger_related,
'trigger_duration': basic_alarm.trigger_duration,
'trigger_occurs': basic_alarm.trigger_occurs,
'trigger_interval': basic_alarm.trigger_interval,
'duration': basic_alarm.duration,
'repeat': basic_alarm.repeat,
'state': 'run',
'event_date': data[date],
'res_id': data.id,
'model_id': model_id,
'action': 'display',
'description': data.description,
'name': data.name,
'attendee_ids': [(6, 0, map(lambda x:x.id, data.attendee_ids))],
'trigger_related': basic_alarm.trigger_related,
'trigger_duration': basic_alarm.trigger_duration,
'trigger_occurs': basic_alarm.trigger_occurs,
'trigger_interval': basic_alarm.trigger_interval,
'duration': basic_alarm.duration,
'repeat': basic_alarm.repeat,
'state': 'run',
'event_date': data[date],
'res_id': data.id,
'model_id': model_id,
'user_id': uid
}
alarm_id = alarm_obj.create(cr, uid, vals)
@ -640,7 +645,7 @@ are both optional, but if one occurs, so MUST the other"""),
if alarm_ids:
alarm_obj.unlink(cr, uid, alarm_ids)
cr.execute('Update %s set base_calendar_alarm_id=NULL, alarm_id=NULL\
where id=%s' % (model_obj._table, datas.id))
where id=%s' % (model_obj._table, datas.id))
cr.commit()
return True
@ -653,41 +658,40 @@ class calendar_alarm(osv.osv):
__attribute__ = {}
_columns = {
'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('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),
}
'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('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',
'state': lambda *x: 'run',
}
'action': lambda *x: 'email',
'state': lambda *x: 'run',
}
def create(self, cr, uid, vals, context={}):
"""
@ -708,7 +712,7 @@ class calendar_alarm(osv.osv):
delta = timedelta(hours=vals['trigger_duration'])
if vals['trigger_interval'] == 'minutes':
delta = timedelta(minutes=vals['trigger_duration'])
trigger_date = dtstart + (vals['trigger_occurs'] == 'after' and delta or -delta)
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
@ -738,12 +742,12 @@ class calendar_alarm(osv.osv):
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)
'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]
@ -755,7 +759,7 @@ class calendar_alarm(osv.osv):
request_obj.request_send(cr, uid, request_ids)
if alarm.action == 'email':
sub = '[Openobject Remainder] %s' % (alarm.name)
sub = '[Openobject Remainder] %s' % (alarm.name)
body = """
Name: %s
Date: %s
@ -772,9 +776,9 @@ class calendar_alarm(osv.osv):
mail_to.append(att.user_id.address_id.email)
if mail_to:
tools.email_send(
tools.config.get('email_from', False),
mail_to,
sub,
tools.config.get('email_from', False),
mail_to,
sub,
body
)
self.write(cr, uid, [alarm.id], {'state':'done'})
@ -813,7 +817,7 @@ class calendar_event(osv.osv):
if end_date and not duration:
end = datetime.strptime(end_date, "%Y-%m-%d %H:%M:%S")
diff = end - start
duration = float(diff.days)* 24 + (float(diff.seconds) / 3600)
duration = float(diff.days)* 24 + (float(diff.seconds) / 3600)
value['duration'] = round(duration, 2)
elif not end_date:
end = start + timedelta(hours=duration)
@ -825,15 +829,16 @@ class calendar_event(osv.osv):
Set rule string.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param id: List of calendar event's ids.
@param id: List of calendar event's ids.
@param context: A standard dictionary for contextual values
@return: dictionary of rrule value.
"""
cr.execute("UPDATE %s set freq='',interval=0,count=0,end_date=Null,\
cr.execute("UPDATE %s set freq='None',interval=0,count=0,end_date=Null,\
mo=False,tu=False,we=False,th=False,fr=False,sa=False,su=False,\
day=0,select1=False,month_list=0 ,byday=False where id=%s" % (self._table, id))
day=0,select1='date',month_list=Null ,byday=Null where id=%s" % (self._table, id))
if not value:
cr.execute("UPDATE %s set rrule_type='none' where id=%s" % (self._table, id))
return True
val = {}
for part in value.split(';'):
@ -846,7 +851,9 @@ class calendar_event(osv.osv):
ans = value.split(';')
for i in ans:
val[i.split('=')[0].lower()] = i.split('=')[1].lower()
if int(val.get('interval')) > 1: #If interval is other than 1 rule is custom
if not val.get('interval'):
rrule_type = 'custom'
elif int(val.get('interval')) > 1: #If interval is other than 1 rule is custom
rrule_type = 'custom'
qry = "UPDATE %(table)s set rrule_type=\'%(rule_type)s\' "
@ -873,8 +880,12 @@ class calendar_event(osv.osv):
if val.get('byday'):
d = val.get('byday')
new_val['byday'] = d[:1]
new_val['week_list'] = d[1:].upper()
if '-' in d:
new_val['byday'] = d[:2]
new_val['week_list'] = d[2:4].upper()
else:
new_val['byday'] = d[:1]
new_val['week_list'] = d[1:3].upper()
new_val['select1'] = 'day'
if val.get('bymonth'):
@ -901,92 +912,100 @@ class calendar_event(osv.osv):
Get rule string.
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param id: List of calendar event's ids.
@param id: List of calendar event's ids.
@param context: A standard dictionary for contextual values
@return: dictionary of rrule value.
"""
result = {}
for datas in self.read(cr, uid, ids):
for datas in self.read(cr, uid, ids, context=context):
event = datas['id']
if datas.get('rrule_type'):
if datas.get('rrule_type') == 'none':
result[event] = False
elif datas.get('rrule_type') == 'custom':
rrule_custom = self.compute_rule_string(cr, uid, datas)
if datas.get('interval', 0) < 0:
raise osv.except_osv('Warning!', 'Interval can not be Negative')
if datas.get('count', 0) < 0:
raise osv.except_osv('Warning!', 'Count can not be Negative')
rrule_custom = self.compute_rule_string(cr, uid, datas,\
context=context)
result[event] = rrule_custom
else:
result[event] = self.compute_rule_string(cr, uid, {'freq':\
datas.get('rrule_type').upper(), \
'interval': 1}, context=context)
result[event] = self.compute_rule_string(cr, uid, {'freq': datas.get('rrule_type').upper(), 'interval': 1}, context=context)
return result
_columns = {
'id': fields.integer('ID'),
'sequence': fields.integer('Sequence'),
'name': fields.char('Description', size=64, required=True),
'date': fields.datetime('Date'),
'date_deadline': fields.datetime('Deadline'),
'create_date': fields.datetime('Created', readonly=True),
'duration': fields.float('Duration'),
'description': fields.text('Your action'),
'id': fields.integer('ID'),
'sequence': fields.integer('Sequence'),
'name': fields.char('Description', size=64, required=True),
'date': fields.datetime('Date'),
'date_deadline': fields.datetime('Deadline'),
'create_date': fields.datetime('Created', readonly=True),
'duration': fields.float('Duration'),
'description': fields.text('Your action'),
'class': fields.selection([('public', 'Public'), ('private', 'Private'), \
('confidential', 'Confidential')], 'Mark as'),
'location': fields.char('Location', size=264, help="Location of Event"),
'show_as': fields.selection([('free', 'Free'), \
('busy', 'Busy')], 'Show as'),
'base_calendar_url': fields.char('Caldav URL', size=264),
'show_as': fields.selection([('free', 'Free'), ('busy', 'Busy')], \
'Show as'),
'base_calendar_url': fields.char('Caldav URL', size=264),
'exdate': fields.text('Exception Date/Times', help="This property \
defines the list of date/time exceptions for arecurring calendar component."),
defines the list of date/time exceptions for arecurring calendar component."),
'exrule': fields.char('Exception Rule', size=352, help="defines a \
rule or repeating pattern for anexception to a recurrence set"),
'rrule': fields.function(_get_rulestring, type='char', size=124, method=True,\
string='Recurrent Rule', store=True, fnct_inv=_set_rrulestring),
rule or repeating pattern for anexception to a recurrence set"),
'rrule': fields.function(_get_rulestring, type='char', size=124, method=True, \
string='Recurrent Rule', store=True, \
fnct_inv=_set_rrulestring, help='Defines a\
rule or repeating pattern for recurring events\n\
e.g.: Every other month on the last Sunday of the month for 10 occurrences:\
FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU'),
'rrule_type': fields.selection([('none', ''), ('daily', 'Daily'), \
('weekly', 'Weekly'), ('monthly', 'Monthly'), \
('yearly', 'Yearly'), ('custom', 'Custom')], 'Recurrency'),
'alarm_id': fields.many2one('res.alarm', 'Alarm'),
'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'),
'recurrent_uid': fields.integer('Recurrent ID'),
'recurrent_id': fields.datetime('Recurrent ID date'),
'vtimezone': fields.related('user_id', 'context_tz', type='char', size=24,\
string='Timezone', store=True),
'user_id': fields.many2one('res.users', 'Responsible'),
('weekly', 'Weekly'), ('monthly', 'Monthly'), \
('yearly', 'Yearly'), ('custom', 'Custom')], 'Recurrency'),
'alarm_id': fields.many2one('res.alarm', 'Alarm'),
'base_calendar_alarm_id': fields.many2one('calendar.alarm', 'Alarm'),
'recurrent_uid': fields.integer('Recurrent ID'),
'recurrent_id': fields.datetime('Recurrent ID date'),
'vtimezone': fields.related('user_id', 'context_tz', type='char', size=24, \
string='Timezone', store=True),
'user_id': fields.many2one('res.users', 'Responsible'),
'freq': fields.selection([('None', 'No Repeat'), \
('secondly', 'Secondly'), \
('minutely', 'Minutely'), \
('hourly', 'Hourly'), \
('daily', 'Daily'), \
('weekly', 'Weekly'), \
('monthly', 'Monthly'), \
('yearly', 'Yearly')], 'Frequency'),
'interval': fields.integer('Interval'),
'count': fields.integer('Count'),
'mo': fields.boolean('Mon'),
'tu': fields.boolean('Tue'),
'we': fields.boolean('Wed'),
'th': fields.boolean('Thu'),
'fr': fields.boolean('Fri'),
'sa': fields.boolean('Sat'),
'su': fields.boolean('Sun'),
('secondly', 'Secondly'), \
('minutely', 'Minutely'), \
('hourly', 'Hourly'), \
('daily', 'Daily'), \
('weekly', 'Weekly'), \
('monthly', 'Monthly'), \
('yearly', 'Yearly')], 'Frequency'),
'interval': fields.integer('Interval'),
'count': fields.integer('Count'),
'mo': fields.boolean('Mon'),
'tu': fields.boolean('Tue'),
'we': fields.boolean('Wed'),
'th': fields.boolean('Thu'),
'fr': fields.boolean('Fri'),
'sa': fields.boolean('Sat'),
'su': fields.boolean('Sun'),
'select1': fields.selection([('date', 'Date of month'), \
('day', 'Day of month')], 'Option'),
'day': fields.integer('Date of month'),
('day', 'Day of month')], 'Option'),
'day': fields.integer('Date of month'),
'week_list': fields.selection([('MO', 'Monday'), ('TU', 'Tuesday'), \
('WE', 'Wednesday'), ('TH', 'Thursday'), \
('FR', 'Friday'), ('SA', 'Saturday'), \
('SU', 'Sunday')], 'Weekday'),
('WE', 'Wednesday'), ('TH', 'Thursday'), \
('FR', 'Friday'), ('SA', 'Saturday'), \
('SU', 'Sunday')], 'Weekday'),
'byday': fields.selection([('1', 'First'), ('2', 'Second'), \
('3', 'Third'), ('4', 'Fourth'), \
('5', 'Fifth'), ('-1', 'Last')], 'By day'),
'month_list': fields.selection(months.items(), 'Month'),
('3', 'Third'), ('4', 'Fourth'), \
('5', 'Fifth'), ('-1', 'Last')], 'By day'),
'month_list': fields.selection(months.items(), 'Month'),
'end_date': fields.date('Repeat Until')
}
_defaults = {
'class': lambda *a: 'public',
'show_as': lambda *a: 'busy',
'freq': lambda *x: 'None',
'select1': lambda *x: 'date',
'interval': lambda *x: 1,
'class': lambda *a: 'public',
'show_as': lambda *a: 'busy',
'freq': lambda *x: 'None',
'select1': lambda *x: 'date',
'interval': lambda *x: 1,
}
def modify_this(self, cr, uid, event_id, defaults, real_date, context=None, *args):
@ -1004,11 +1023,11 @@ class calendar_event(osv.osv):
event_id = base_calendar_id2real_id(event_id)
datas = self.read(cr, uid, event_id, context=context)
defaults.update({
'recurrent_uid': base_calendar_id2real_id(datas['id']),
'recurrent_id': defaults.get('date') or real_date,
'rrule_type': 'none',
'rrule': ''
})
'recurrent_uid': base_calendar_id2real_id(datas['id']),
'recurrent_id': defaults.get('date') or real_date,
'rrule_type': 'none',
'rrule': ''
})
exdate = datas['exdate'] and datas['exdate'].split(',') or []
if real_date and defaults.get('date'):
exdate.append(real_date)
@ -1032,7 +1051,7 @@ class calendar_event(osv.osv):
defaults.update({'table': self._table})
qry = "UPDATE %(table)s set name = '%(name)s', \
date = '%(date)s', date_deadline = '%(date_deadline)s'"
date = '%(date)s', date_deadline = '%(date_deadline)s'"
if defaults.get('alarm_id'):
qry += ", alarm_id = %(alarm_id)s"
if defaults.get('location'):
@ -1060,7 +1079,7 @@ class calendar_event(osv.osv):
result = []
if ids and (base_start_date or base_until_date):
cr.execute("select m.id, m.rrule, m.date, m.date_deadline, \
m.exdate from " + self._table + \
m.exdate from " + self._table + \
" m where m.id in ("\
+ ','.join(map(lambda x: str(x), ids))+")")
@ -1129,7 +1148,7 @@ class calendar_event(osv.osv):
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param datas: dictionary of freq and interval value.
@return: string value which compute FREQILY;INTERVAL
@return: string value which compute FREQILY;INTERVAL
"""
weekdays = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su']
@ -1141,9 +1160,8 @@ class calendar_event(osv.osv):
if freq == 'None':
return ''
if datas.get('interval') < 1:
raise osv.except_osv(_('Error!'), ("Please select proper Interval"))
interval_srting = datas.get('interval') and (';INTERVAL=' + str(datas.get('interval'))) or ''
if freq == 'weekly':
byday = map(lambda x: x.upper(), filter(lambda x: datas.get(x) and x in weekdays, datas))
@ -1159,7 +1177,7 @@ class calendar_event(osv.osv):
monthstring = ';BYMONTHDAY=' + str(datas.get('day'))
elif freq == 'yearly':
if datas.get('select1')=='date' and (datas.get('day') < 1 or datas.get('day') > 31):
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"))
bymonth = ';BYMONTH=' + str(datas.get('month_list'))
if datas.get('select1')=='day':
@ -1170,19 +1188,19 @@ class calendar_event(osv.osv):
if datas.get('end_date'):
datas['end_date'] = ''.join((re.compile('\d')).findall(datas.get('end_date'))) + '235959Z'
enddate = (datas.get('count') and (';COUNT=' + str(datas.get('count'))) or '') +\
enddate = (datas.get('count') and (';COUNT=' + str(datas.get('count'))) or '') +\
((datas.get('end_date') and (';UNTIL=' + datas.get('end_date'))) or '')
rrule_string = 'FREQ=' + freq.upper() + weekstring + ';INTERVAL=' + \
str(datas.get('interval')) + enddate + monthstring + yearstring
rrule_string = 'FREQ=' + freq.upper() + weekstring + interval_srting \
+ enddate + monthstring + yearstring
return rrule_string
def search(self, cr, uid, args, offset=0, limit=100, order=None,
def search(self, cr, uid, args, offset=0, limit=100, order=None,
context=None, count=False):
"""
Overrides orm search method.
Overrides orm search method.
@param cr: the current row, from the database cursor,
@param user: the current users ID for security checks,
@param args: list of tuples of form [(name_of_the_field, operator, value), ...].
@ -1248,7 +1266,7 @@ class calendar_event(osv.osv):
def browse(self, cr, uid, ids, context=None, list_class=None, fields_process={}):
"""
Overrides orm browse method.
Overrides orm browse method.
@param self: the object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@ -1269,7 +1287,7 @@ class calendar_event(osv.osv):
def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'):
"""
Overrides orm Read method.Read List of fields for calendar event.
Overrides orm Read method.Read List of fields for calendar event.
@param cr: the current row, from the database cursor,
@param user: the current users ID for security checks,
@param ids: List of calendar event's id.
@ -1285,8 +1303,7 @@ class calendar_event(osv.osv):
if fields and 'date' not in fields:
fields.append('date')
for base_calendar_id, real_id in select:
res = super(calendar_event, self).read(cr, uid, real_id, fields=fields, context=context, \
load=load)
res = super(calendar_event, self).read(cr, uid, real_id, fields=fields, context=context, load=load)
ls = base_calendar_id2real_id(base_calendar_id, with_date=res.get('duration', 0))
if not isinstance(ls, (str, int, long)) and len(ls) >= 2:
res['date'] = ls[1]
@ -1328,7 +1345,7 @@ class calendar_event(osv.osv):
for record in self.read(cr, uid, [base_calendar_id2real_id(id)], \
['date', 'rrule', 'exdate']):
if record['rrule']:
exdate = (record['exdate'] and (record['exdate'] + ',') or '') + ''.join((re.compile('\d')).findall(date_new)) + 'Z'
exdate = (record['exdate'] and (record['exdate'] + ',') or '') + ''.join((re.compile('\d')).findall(date_new)) + 'Z'
if record['date'] == date_new:
res = self.write(cr, uid, [base_calendar_id2real_id(id)], {'exdate': exdate})
else:
@ -1396,14 +1413,14 @@ class calendar_todo(osv.osv):
"""
event = self.browse(cr, uid, id, context=context)
cr.execute("UPDATE %s set date_start='%s' where id=%s" \
% (self._table, value, id))
cr.execute("UPDATE %s set date_start='%s' where id=%s" \
% (self._table, value, id))
return True
_columns = {
'date': fields.function(_get_date, method=True, fnct_inv=_set_date, \
string='Duration', store=True, type='datetime'),
'duration': fields.integer('Duration'),
string='Duration', store=True, type='datetime'),
'duration': fields.integer('Duration'),
}
__attribute__ = {}
@ -1429,7 +1446,7 @@ class ir_attachment(osv.osv):
args1.append(map(lambda x:str(x).split('-')[0], arg))
return super(ir_attachment, self).search_count(cr, user, args1, context)
def search(self, cr, uid, args, offset=0, limit=None, order=None,
def search(self, cr, uid, args, offset=0, limit=None, order=None,
context=None, count=False):
"""
@param self: The object pointer
@ -1445,8 +1462,8 @@ class ir_attachment(osv.osv):
for i, arg in enumerate(new_args):
if arg[0] == 'res_id':
new_args[i] = (arg[0], arg[1], base_calendar_id2real_id(arg[2]))
return super(ir_attachment, self).search(cr, uid, new_args, offset=offset,
limit=limit, order=order,
return super(ir_attachment, self).search(cr, uid, new_args, offset=offset,
limit=limit, order=order,
context=context, count=False)
ir_attachment()
@ -1497,7 +1514,7 @@ class ir_model(osv.osv):
_inherit = 'ir.model'
def read(self, cr, uid, ids, fields=None, context={},
def read(self, cr, uid, ids, fields=None, context={},
load='_classic_read'):
"""
Read IR Model
@ -1557,7 +1574,7 @@ class res_users(osv.osv):
res = {}
attendee_obj = self.pool.get('calendar.attendee')
attendee_ids = attendee_obj.search(cr, uid, [
('event_date', '<=', current_datetime), ('event_end_date', '<=', current_datetime),
('event_date', '<=', current_datetime), ('event_end_date', '<=', current_datetime),
('state', '=', 'accepted'), ('user_id', 'in', ids)
])
@ -1589,8 +1606,9 @@ class res_users(osv.osv):
_columns = {
'availability': fields.function(_get_user_avail_fun, type='selection', \
selection=[('free', 'Free'), ('busy', 'Busy')], \
string='Free/Busy', method=True),
string='Free/Busy', method=True),
}
res_users()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -35,7 +35,7 @@ class calendar_event_edit_all(osv.osv_memory):
context_id = context and context.get('active_id', False) or False
if context_id:
if context.get('date'):
return context.get('date')
return context.get('date')
else:
model = context.get('model', False)
model_obj = self.pool.get(model)

View File

@ -47,7 +47,10 @@
'base_contact_view.xml',
'process/base_contact_process.xml'
],
'demo_xml': ['base_contact_demo.xml'],
'demo_xml': ['base_contact_demo.xml'],
'test': [
'test/base_contact00.yml',
],
'installable': True,
'active': False,
'certificate': '0031287885469',

View File

@ -205,12 +205,12 @@ class res_partner_job(osv.osv):
self._order = 'sequence_contact'
contact_obj = self.pool.get('res.partner.contact')
search_arg = ['|', ('first_name', 'ilike', arg[2]), ('name', 'ilike', arg[2])]
contact_ids = contact_obj.search(cr, user, search_arg, offset=offset, \
limit=limit, order=order, context=context, count=count)
contacts = contact_obj.browse(cr, user, contact_ids, context=context)
for contact in contacts:
job_ids.extend([item.id for item in contact.job_ids])
if arg[2] and not count:
search_arg = ['|', ('first_name', 'ilike', arg[2]), ('name', 'ilike', arg[2])]
contact_ids = contact_obj.search(cr, user, search_arg, offset=offset, limit=limit, order=order, context=context, count=count)
contacts = contact_obj.browse(cr, user, contact_ids, context=context)
for contact in contacts:
job_ids.extend([item.id for item in contact.job_ids])
res = super(res_partner_job,self).search(cr, user, args, offset=offset,\
limit=limit, order=order, context=context, count=count)

View File

@ -0,0 +1,96 @@
- |
I will test base_contact for following cases:
*contacts unrelated to a partner,
*contacts working at several addresses (possibly for different partners),
*contacts with possibly different functions for each of its job's addresses
- |
In order to assign language to contacts first I will create Language FR
(Remove)
-
!record {model: res.lang, id: res_lang_french0}:
code: fr_BE
date_format: '%m/%d/%Y'
decimal_point: .
direction: ltr
grouping: '[]'
name: French
time_format: '%H:%M:%S'
- |
In order to check contacts first I will create contact unrelated to a partner
-
!record {model: res.partner.contact, id: res_partner_contact_williams0}:
country_id: base.be
first_name: Laura
job_ids:
- email: lwilliams@mydomain.com
function_id: base_contact.res_partner_function_privateaddress0
phone: (+32).10.45.18.77
sequence_contact: 1
state: current
lang_id: res_lang_french0
mobile: (+32).10.45.18.77
name: Williams
title: Mss
- |
Now in order to assign this contact to partner I will create one partner assign contact laura to this partner
-
!record {model: res.partner, id: res_partner_laurascompany0}:
address:
- city: Namur
country_id: base.be
phone: (+32).10.45.18.77
street: 23, street ways
type: default
zip: '2324324'
job_ids:
- address_id: res_partner_address_1
function_id: base.function_director
contact_id: res_partner_contact_williams0
sequence_partner: 2
state: current
lang: fr_BE
name: Laura's Company
ref: LC
title: ltd
- |
Now I will check that the new job is assigned properly to contact or not
-
!assert {model: res.partner.contact, id: res_partner_contact_williams0}:
- len(job_ids) > 2
- |
In order to check contacts working at several addresses for different partners
I will create contact with 2 different addresses
-
!record {model: res.partner.contact, id: res_partner_contact_pauwels0}:
country_id: base.be
first_name: Nicolas
job_ids:
- address_id: base.main_address
function_id: base.function_it
state: current
- address_id: base.res_partner_address_3000
function_id: base.function_director
state: current
lang_id: res_lang_french0
mobile: (+32).23.44.32.12
name: Pauwels
title: M.
- |
In order to check one contact working at one partner with different functions
I will create contact with 2 different jobs with different function but the same address
-
!record {model: res.partner.contact, id: res_partner_contact_mortier0}:
country_id: base.be
first_name: Christina
job_ids:
- address_id: base.res_partner_address_1
function_id: base.function_director
state: past
- address_id: base.res_partner_address_1
function_id: base.function_it
state: current
lang_id: base_contact.res_lang_french0
mobile: (+32).10.45.18.77
name: Mortier
title: Mss

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: 2010-04-17 04:20+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_module_merge

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: 2010-04-17 03:55+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_module_publish

View File

@ -143,7 +143,7 @@ class base_module_record(osv.osv):
obj = dt.browse(cr, uid, dtids[0])
self.depends[obj.module] = True
return obj.module+'.'+obj.name, obj.noupdate
def _create_record(self, cr, uid, doc, model, data, record_id, noupdate=False):
data_pool = self.pool.get('ir.model.data')
@ -384,7 +384,7 @@ class base_module_record(osv.osv):
elif rec[3]=='create':
id = self._create_id(cr, uid, rec[2],rec[4])
record,noupdate = self._create_record(cr, uid, doc, rec[2], rec[4], id)
self.ids[(rec[3], result)] = id
self.ids[(rec[2], result)] = id
record_list += record
elif rec[3]=='copy':
@ -446,8 +446,8 @@ class base_module_record(osv.osv):
terp.appendChild(data)
wkf = doc.createElement('workflow')
data.appendChild(wkf)
wkf.setAttribute("model", rec[1][3])
wkf.setAttribute("action", rec[1][4])
wkf.setAttribute("model", rec[1][2])
wkf.setAttribute("action", rec[1][3])
if noupdate:
data.setAttribute("noupdate", "1")
wkf.setAttribute("ref", rec_id)
@ -482,10 +482,12 @@ class base_module_record(osv.osv):
continue
if self.mode == "workflow":
record= self._generate_object_yaml(cr, uid, rec[1],rec[0])
yaml_file+="!comment Performing a workflow action %s on module %s"%(record['action'], record['model']) + '''\n'''
object=yaml.load(unicode('''\n !workflow %s \n'''%record,'iso-8859-1'))
yaml_file += str(object) + '''\n'''
yaml_file += str(object) + '''\n\n'''
else:
record= self._generate_object_yaml(cr, uid, rec[1],rec[3])
yaml_file+="!comment Creating an %s record"%(record['model']) + '''\n'''
object= yaml.load(unicode('''\n !record %s \n'''%record,'iso-8859-1'))
yaml_file += str(object) + '''\n'''
attrs=yaml.dump(object.attrs, default_flow_style=False)
@ -497,7 +499,9 @@ class base_module_record(osv.osv):
if line.find('!record') == 0:
line = "- \n" + " " + line
elif line.find('!workflow') == 0:
line = "- \n" + " " + line
line = "- \n" + " " + line
elif line.find('!comment') == 0:
line=line.replace('!comment','- \n ')
elif line.find('- -') != -1:
line=line.replace('- -',' -')
line = " " + line

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: 2010-04-17 04:03+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_module_record

View File

@ -37,8 +37,8 @@
<field name="arch" type="xml">
<form string="Report Creator">
<field name="name" select="1" colspan="4"/>
<field name="type" select="2"/>
<field name="active" select="2"/>
<field name="type"/>
<field name="active"/>
<notebook colspan="4">
<page string="General Configuration">
<field name="model_ids" colspan="4"

View File

@ -17,6 +17,7 @@
string="You can start configuring the system or connect directly to the database using the default setup."/>
</group>
</group>
<separator string="" colspan="4"/>
<button name="menu" icon="gtk-ok" type="object"
string="Use Directly"/>
<button name="config" icon="gtk-go-forward" type="object"

View File

@ -50,8 +50,8 @@ If you don't think you need any of these right now, you can easily install them
</record>
<record id="base_setup_installer_todo" model="ir.actions.todo">
<field name="action_id" ref="action_base_setup_installer"/>
<field name="sequence">2</field>
<field name="action_id" ref="action_base_setup_installer"/>
<field name="sequence">2</field>
</record>
</data>
</openerp>

View File

@ -14,7 +14,7 @@
<group string="res_config_contents" position="replace">
<field name="company_id" invisible="1"/>
<separator string="Define Main Company" colspan="4"/>
<separator string="Configure Your Company" colspan="4"/>
<field name="name" colspan="4" required="True"/>
<newline/>
<field name="street"/>
@ -54,8 +54,9 @@
</record>
<record id="base_setup_company_todo" model="ir.actions.todo">
<field name="action_id" ref="action_base_setup_company"/>
<field name="sequence">1</field>
<field name="action_id" ref="action_base_setup_company"/>
<field name="sequence">1</field>
<field name="restart">onskip</field>
</record>
</data>
</openerp>

View File

@ -9,7 +9,7 @@
<field name="arch" type="xml">
<field name="property_account_payable" position="after">
<group colspan="2" col="6">
<field name="vat" on_change="vat_change(vat)" select="2" colspan="4" />
<field name="vat" on_change="vat_change(vat)" colspan="4" />
<field name="vat_subjected" colspan="1"/>
</group>
</field>

View File

@ -32,7 +32,7 @@
* Files by Month (graph)
""",
'author': 'Tiny',
'depends': ['board', 'document', 'report_document'],
'depends': ['board', 'document'],
'update_xml': ['board_document_view.xml'],
'demo_xml': ['board_document_demo.xml'],
'installable': True,

View File

@ -15,24 +15,24 @@
<child1>
<action
string="New Files"
name="%(report_document.action_view_all_document_tree1)d"
name="%(document.action_view_all_document_tree1)d"
view_mode="tree"
domain="[('name','=',time.strftime('%%Y-%%m-01'))]"/>
domain="[('name','=',time.strftime('%%Y')),('month','=',time.strftime('%%m'))]"/>
<action
string="File Size by Month"
name="%(report_document.action_view_size_month)d"
name="%(document.action_view_size_month)d"
view_mode="graph,tree"/>
</child1>
<child2>
<action
string="Files by Resource Type"
name="%(report_document.action_view_document_by_resourcetype_graph)d"
name="%(document.action_view_document_by_resourcetype_graph)d"
view_mode="graph,tree"/>
<action
string="Files by Partner"
name="%(report_document.action_view_files_by_partner)d"
name="%(document.action_view_files_by_partner)d"
view_mode="graph,tree"/>
</child2>
</hpaned>
@ -75,19 +75,19 @@
<child1>
<action
string="Wall of Shame"
name="%(report_document.action_view_wall)d"
name="%(document.action_view_wall)d"
view_mode="tree"/>
</child1>
<child2>
<action
string="Files by Users"
name="%(report_document.action_view_user_graph)d"
name="%(document.action_view_user_graph)d"
view_mode="graph,tree"/>
<action
string="Files by Month"
name="%(report_document.action_view_files_by_month_graph)d"
name="%(document.action_view_files_by_month_graph)d"
view_mode="graph,tree"/>
</child2>
</hpaned>

View File

@ -30,51 +30,51 @@ from tools.translate import _
MAX_LEVEL = 15
AVAILABLE_STATES = [
('draft', 'Draft'),
('open', 'Open'),
('cancel', 'Cancelled'),
('done', 'Closed'),
('draft', 'Draft'),
('open', 'Open'),
('cancel', 'Cancelled'),
('done', 'Closed'),
('pending', 'Pending')
]
AVAILABLE_PRIORITIES = [
('5', 'Lowest'),
('4', 'Low'),
('3', 'Normal'),
('2', 'High'),
('5', 'Lowest'),
('4', 'Low'),
('3', 'Normal'),
('2', 'High'),
('1', 'Highest')
]
class crm_case_section(osv.osv):
""" Cases Section"""
"""Sales Team"""
_name = "crm.case.section"
_description = "Sales Teams"
_order = "name"
_columns = {
'name': fields.char('Sales Team', size=64, required=True, translate=True),
'code': fields.char('Code', size=8),
'name': fields.char('Sales Team', size=64, required=True, translate=True),
'code': fields.char('Code', size=8),
'active': fields.boolean('Active', help="If the active field is set to \
true, it will allow you to hide the sales team without removing it."),
'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
'user_id': fields.many2one('res.users', 'Responsible User'),
true, it will allow you to hide the sales team without removing it."),
'allow_unlink': fields.boolean('Allow Delete', help="Allows to delete non draft cases"),
'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 sales team"),
'parent_id': fields.many2one('crm.case.section', 'Parent Section'),
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Sections'),
'parent_id': fields.many2one('crm.case.section', 'Parent Team'),
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Teams'),
'resource_calendar_id': fields.many2one('resource.calendar', "Resource's Calendar"),
'server_id':fields.many2one('email.smtpclient', 'Server ID'),
'note': fields.text('Description'),
}
_defaults = {
'active': lambda *a: 1,
'allow_unlink': lambda *a: 1,
'active': lambda *a: 1,
'allow_unlink': lambda *a: 1,
}
_sql_constraints = [
('code_uniq', 'unique (code)', 'The code of the section must be unique !')
('code_uniq', 'unique (code)', 'The code of the sales team must be unique !')
]
def _check_recursion(self, cr, uid, ids):
@ -100,18 +100,20 @@ class crm_case_section(osv.osv):
(_check_recursion, 'Error ! You cannot create recursive sections.', ['parent_id'])
]
def name_get(self, cr, uid, ids, context={}):
def name_get(self, cr, uid, ids, context=None):
"""Overrides orm name_get method
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of section ids
"""
if not context:
context = {}
if not len(ids):
return []
reads = self.read(cr, uid, ids, ['name', 'parent_id'], context)
res = []
if not ids:
return res
reads = self.read(cr, uid, ids, ['name', 'parent_id'], context)
for record in reads:
name = record['name']
@ -119,6 +121,7 @@ class crm_case_section(osv.osv):
name = record['parent_id'][1] + ' / ' + name
res.append((record['id'], name))
return res
crm_case_section()
@ -129,13 +132,13 @@ class crm_case_categ(osv.osv):
_description = "Category of case"
_columns = {
'name': fields.char('Case Category Name', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'object_id': fields.many2one('ir.model', 'Object Name'),
'name': fields.char('Case Category Name', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'object_id': fields.many2one('ir.model', 'Object Name'),
}
def _find_object_id(self, cr, uid, context=None):
"""
"""Finds id for case object
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@ -149,7 +152,7 @@ class crm_case_categ(osv.osv):
_defaults = {
'object_id' : _find_object_id
}
#
crm_case_categ()
@ -161,19 +164,17 @@ class crm_case_resource_type(osv.osv):
_rec_name = "name"
_columns = {
'name': fields.char('Case Resource Type', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'object_id': fields.many2one('ir.model', 'Object Name'),
'name': fields.char('Case Resource Type', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'object_id': fields.many2one('ir.model', 'Object Name'),
}
def _find_object_id(self, cr, uid, context=None):
"""
"""Finds id for case object
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
object_id = context and context.get('object_id', False) or False
ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
return ids and ids[0]
@ -194,46 +195,44 @@ class crm_case_stage(osv.osv):
_order = "sequence"
_columns = {
'name': fields.char('Stage Name', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'name': fields.char('Stage Name', size=64, required=True, translate=True),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'sequence': fields.integer('Sequence', help="Gives the sequence order \
when displaying a list of case stages."),
'object_id': fields.many2one('ir.model', 'Object Name'),
'probability': fields.float('Probability (%)', required=True),
'on_change': fields.boolean('Change Probability Automatically',\
help="Change Probability on next and previous stages."),
when displaying a list of case stages."),
'object_id': fields.many2one('ir.model', 'Object Name'),
'probability': fields.float('Probability (%)', required=True),
'on_change': fields.boolean('Change Probability Automatically', \
help="Change Probability on next and previous stages."),
'requirements': fields.text('Requirements')
}
def _find_object_id(self, cr, uid, context=None):
"""
"""Finds id for case object
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
object_id = context and context.get('object_id', False) or False
ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
return ids and ids[0]
_defaults = {
'sequence': lambda *args: 1,
'probability': lambda *args: 0.0,
'sequence': lambda *args: 1,
'probability': lambda *args: 0.0,
'object_id' : _find_object_id
}
crm_case_stage()
def _links_get(self, cr, uid, context={}):
def _links_get(self, cr, uid, context=None):
"""Gets links value for reference field
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
if not context:
context = {}
obj = self.pool.get('res.request.link')
ids = obj.search(cr, uid, [])
res = obj.read(cr, uid, ids, ['object', 'name'], context)
@ -246,16 +245,13 @@ class crm_case(osv.osv):
_description = "Case"
def _email_last(self, cursor, user, ids, name, arg, context=None):
"""Return History
"""Return last email from History
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of cases IDs
@param context: A standard dictionary for contextual values
"""
res = {}
for case in self.browse(cursor, user, ids):
if case.history_line:
@ -264,30 +260,31 @@ class crm_case(osv.osv):
res[case.id] = False
return res
def copy(self, cr, uid, id, default=None, context={}):
"""
def copy(self, cr, uid, id, default=None, context=None):
"""Overrides orm copy method
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of cases IDs
@param context: A standard dictionary for contextual values
"""
if not context:
context = {}
if not default:
default = {}
default.update({'state': 'draft', 'id': False})
return super(crm_case, self).copy(cr, uid, id, default, context)
def _get_log_ids(self, cr, uid, ids, field_names, arg, context={}):
"""
def _get_log_ids(self, cr, uid, ids, field_names, arg, context=None):
"""Gets id for case log from history of particular case
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case logs IDs
@param ids: List of Case IDs
@param context: A standard dictionary for contextual values
"""
if not context:
context = {}
result = {}
history_obj = False
@ -306,7 +303,7 @@ class crm_case(osv.osv):
for case in self.browse(cr, uid, ids, context):
model_ids = model_obj.search(cr, uid, [('model', '=', case._name)])
history_ids = history_obj.search(cr, uid, [('model_id', '=', model_ids[0]),\
history_ids = history_obj.search(cr, uid, [('model_id', '=', model_ids[0]), \
('res_id', '=', case.id)])
if history_ids:
result[case.id] = {name: history_ids}
@ -316,64 +313,60 @@ class crm_case(osv.osv):
return result
_columns = {
'id': fields.integer('ID', readonly=True),
'name': fields.char('Description', size=1024, required=True),
'id': fields.integer('ID', readonly=True),
'name': fields.char('Description', size=1024, required=True),
'active': fields.boolean('Active', help="If the active field is set to\
true, it will allow you to hide the case without removing it."),
'description': fields.text('Description'),
'section_id': fields.many2one('crm.case.section', 'Sales Team',\
true, it will allow you to hide the case without removing it."),
'description': fields.text('Description'),
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
select=True, help='Sales team to which Case belongs to.\
Define Responsible user and Email account for mail gateway.'),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
Define Responsible user and Email account for mail gateway.'),
'email_from': fields.char('Email', size=128, help="These people will receive email."),
'email_cc': fields.text('Watchers Emails', size=252 , help="These people\
will receive a copy of the future" \
" communication between partner and users by email"),
'probability': fields.float('Probability'),
'email_last': fields.function(_email_last, method=True,
string='Latest E-Mail', type='text'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact',\
domain="[('partner_id','=',partner_id)]"),
'create_date': fields.datetime('Creation Date' , readonly=True),
'write_date': fields.datetime('Update Date' , readonly=True),
'date_deadline': fields.date('Deadline'),
'user_id': fields.many2one('res.users', 'Responsible'),
'history_line': fields.function(_get_log_ids, method=True, type='one2many',\
multi="history_line", relation="crm.case.history", string="Communication"),
'log_ids': fields.function(_get_log_ids, method=True, type='one2many',\
multi="log_ids", relation="crm.case.log", string="Logs History"),
'stage_id': fields.many2one ('crm.case.stage', 'Stage',\
" communication between partner and users by email"),
'probability': fields.float('Probability'),
'email_last': fields.function(_email_last, method=True,
string='Latest E-Mail', type='text'),
'partner_id': fields.many2one('res.partner', 'Partner'),
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
domain="[('partner_id','=',partner_id)]"),
'create_date': fields.datetime('Creation Date' , readonly=True),
'write_date': fields.datetime('Update Date' , readonly=True),
'date_deadline': fields.date('Deadline'),
'user_id': fields.many2one('res.users', 'Responsible'),
'history_line': fields.function(_get_log_ids, method=True, type='one2many', \
multi="history_line", relation="crm.case.history", string="Communication"),
'log_ids': fields.function(_get_log_ids, method=True, type='one2many', \
multi="log_ids", relation="crm.case.log", string="Logs History"),
'stage_id': fields.many2one ('crm.case.stage', 'Stage', \
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.opportunity')]"),
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True,
('object_id.model', '=', 'crm.opportunity')]"),
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True,
help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\
\nWhen the case is over, the state is set to \'Done\'.\
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'company_id': fields.many2one('res.company', 'Company'),
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
'company_id': fields.many2one('res.company', 'Company'),
}
def _get_default_partner_address(self, cr, uid, context):
"""
"""Gives id of default address for current user
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
if not context.get('portal', False):
return False
return self.pool.get('res.users').browse(cr, uid, uid, context).address_id.id
def _get_default_partner(self, cr, uid, context):
"""
"""Gives id of partner for current user
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
if not context.get('portal', False):
return False
user = self.pool.get('res.users').browse(cr, uid, uid, context)
@ -382,14 +375,12 @@ class crm_case(osv.osv):
return user.address_id.partner_id.id
def _get_default_email(self, cr, uid, context):
"""
"""Gives default email address for current user
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
if not context.get('portal', False):
return False
user = self.pool.get('res.users').browse(cr, uid, uid, context)
@ -398,63 +389,66 @@ class crm_case(osv.osv):
return user.address_id.email
def _get_default_user(self, cr, uid, context):
"""
"""Gives current user id
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
if context.get('portal', False):
return False
return uid
def _get_section(self, cr, uid, context):
"""
"""Gives section id for current User
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
"""
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
return user.context_section_id.id or False
_defaults = {
'active': lambda *a: 1,
'user_id': _get_default_user,
'partner_id': _get_default_partner,
'partner_address_id': _get_default_partner_address,
'email_from': _get_default_email,
'state': lambda *a: 'draft',
'section_id': _get_section,
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
'active': lambda *a: 1,
'user_id': _get_default_user,
'partner_id': _get_default_partner,
'partner_address_id': _get_default_partner_address,
'email_from': _get_default_email,
'state': lambda *a: 'draft',
'section_id': _get_section,
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
}
_order = 'date_deadline desc, create_date desc,id desc'
def unlink(self, cr, uid, ids, context={}):
"""
def unlink(self, cr, uid, ids, context=None):
"""Overrides orm unlink method
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of cases IDs
@param context: A standard dictionary for contextual values"""
@param ids: List of case IDs
@param context: A standard dictionary for contextual values
"""
if not context:
context = {}
for case in self.browse(cr, uid, ids, context):
if (not case.section_id.allow_unlink) and (case.state <> 'draft'):
raise osv.except_osv(_('Warning !'),
raise osv.except_osv(_('Warning !'),
_('You can not delete this case. You should better cancel it.'))
return super(crm_case, self).unlink(cr, uid, ids, context)
def stage_next(self, cr, uid, ids, context={}):
"""
def stage_next(self, cr, uid, ids, context=None):
"""This function computes next stage for case from its current stage
using available stage for that case type
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of stage nexts IDs
@param ids: List of case IDs
@param context: A standard dictionary for contextual values"""
if not context:
context = {}
s = self.get_stage_dict(cr, uid, ids, context=context)
for case in self.browse(cr, uid, ids, context):
@ -465,15 +459,17 @@ class crm_case(osv.osv):
self.write(cr, uid, [case.id], {'stage_id': s[section][st]})
return True
def get_stage_dict(self, cr, uid, ids, context={}):
"""
def get_stage_dict(self, cr, uid, ids, context=None):
"""This function gives dictionary for stage according to stage levels
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of stage dicts IDs
@param ids: List of case IDs
@param context: A standard dictionary for contextual values"""
if not context:
context = {}
sid = self.pool.get('crm.case.stage').search(cr, uid,\
sid = self.pool.get('crm.case.stage').search(cr, uid, \
[('object_id.model', '=', self._name)], context=context)
s = {}
previous = {}
@ -484,20 +480,23 @@ class crm_case(osv.osv):
previous[section] = stage.id
return s
def stage_previous(self, cr, uid, ids, context={}):
"""
def stage_previous(self, cr, uid, ids, context=None):
"""This function computes previous stage for case from its current stage
using available stage for that case type
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of stage previouss IDs
@param ids: List of case IDs
@param context: A standard dictionary for contextual values"""
if not context:
context = {}
s = self.get_stage_dict(cr, uid, ids, context=context)
for case in self.browse(cr, uid, ids, context):
section = (case.section_id.id or False)
if section in s:
st = case.stage_id.id or False
st = case.stage_id.id or False
s[section] = dict([(v, k) for (k, v) in s[section].iteritems()])
if st in s[section]:
self.write(cr, uid, [case.id], {'stage_id': s[section][st]})
@ -508,12 +507,17 @@ class crm_case(osv.osv):
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of Historys IDs
@param ids: List of Case ids
@param keyword: Case action keyword e.g.: If case is closed "Close" keyword is used
@param history: Value True/False, If True it makes entry in case History otherwise in Case Log
@param email: Email address if any
@param details: Details of case history if any
@param context: A standard dictionary for contextual values"""
if not context:
context = {}
model_obj = self.pool.get('ir.model')
obj = self.pool.get('crm.case.log')
for case in cases:
model_ids = model_obj.search(cr, uid, [('model', '=', case._name)])
data = {
@ -526,33 +530,31 @@ class crm_case(osv.osv):
'message_id':message_id
}
obj = self.pool.get('crm.case.log')
if history:
obj = self.pool.get('crm.case.history')
data['description'] = details or case.description
data['email_to'] = email or \
(case.section_id and case.section_id.reply_to) or \
(case.user_id and case.user_id.address_id and \
case.user_id.address_id.email) or tools.config.get('email_from',False)
case.user_id.address_id.email) or tools.config.get('email_from', False)
data['email_from'] = email_from or \
(case.section_id and case.section_id.reply_to) or \
(case.user_id and case.user_id.address_id and \
case.user_id.address_id.email) or tools.config.get('email_from',False)
case.user_id.address_id.email) or tools.config.get('email_from', False)
res = obj.create(cr, uid, data, context)
return True
_history = __history
history = __history
def create(self, cr, uid, *args, **argv):
"""
"""Overrides orm create method
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param *args: Give Tuple Value
@Paran **args: Give Dictionay of Keyword Value
@param *args: Tuple Value for additional Params
@param **argv: Dictionay of Keyword Params
"""
res = super(crm_case, self).create(cr, uid, *args, **argv)
cases = self.browse(cr, uid, [res])
cases[0].state # to fill the browse record cache
@ -560,97 +562,33 @@ class crm_case(osv.osv):
return res
def add_reply(self, cursor, user, ids, context=None):
"""
"""This function finds last email and gives its description value for reply mail
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param cursor: the current row, from the database cursor,
@param user: the current users ID for security checks
@param ids: List of case IDs
@param context: A standard dictionary for contextual values
"""
for case in self.browse(cursor, user, ids, context=context):
if case.email_last:
description = case.email_last
self.write(cursor, user, case.id, {
'description': '> ' + description.replace('\n', '\n> '),
'description': '> ' + description.replace('\n', '\n> '),
}, context=context)
return True
def case_log(self, cr, uid, ids, context={}, email=False, *args):
"""
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
@param *args: Give Tuple Value
"""
cases = self.browse(cr, uid, ids)
self.__history(cr, uid, cases, _('Historize'), history=True, email=email)
return self.write(cr, uid, ids, {'description': False, 'som': False,
'canal_id': False})
def case_log_reply(self, cr, uid, ids, context={}, email=False, *args):
"""
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param context: A standard dictionary for contextual values
@param *args: Give Tuple Value
"""
cases = self.browse(cr, uid, ids)
for case in cases:
if not case.email_from:
raise osv.except_osv(_('Error!'),
_('You must put a Partner eMail to use this action!'))
if not case.user_id:
raise osv.except_osv(_('Error!'),
_('You must define a responsible user for this case in order to use this action!'))
if not case.description:
raise osv.except_osv(_('Error!'),
_('Can not send mail with empty body,you should have description in the body'))
self.__history(cr, uid, cases, _('Send'), history=True, email=False)
for case in cases:
self.write(cr, uid, [case.id], {
'description': False,
})
emails = [case.email_from] + (case.email_cc or '').split(',')
emails = filter(None, emails)
body = case.description or ''
if case.user_id.signature:
body += '\n\n%s' % (case.user_id.signature)
emailfrom = case.user_id.address_id and case.user_id.address_id.email or False
if not emailfrom:
raise osv.except_osv(_('Error!'),
_("No E-Mail ID Found for your Company address!"))
tools.email_send(
emailfrom,
emails,
'[' + str(case.id) + '] ' + case.name,
self.format_body(body),
reply_to = case.section_id.reply_to,
openobject_id = str(case.id)
)
self.__history(cr, uid, [case], _('Send'), history=True, email=emails, details=body, email_from=emailfrom)
return True
def onchange_partner_id(self, cr, uid, ids, part, email=False):
"""
"""This function returns value of partner address based on partner
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case IDs
@param part: Partner's id
@email: Partner's email ID
"""
if not part:
return {'value': {'partner_address_id': False,
'email_from': False,
return {'value': {'partner_address_id': False,
'email_from': False,
}}
addr = self.pool.get('res.partner').address_get(cr, uid, [part], ['contact'])
data = {'partner_address_id': addr['contact']}
@ -658,29 +596,27 @@ class crm_case(osv.osv):
return {'value': data}
def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
"""
"""This function returns value of partner email based on Partner Address
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case IDs
@param add: Id of Partner's address
@email: Partner's email ID
"""
data = {}
if not add:
return {'value': {'email_from': False}}
address = self.pool.get('res.partner.address').browse(cr, uid, add)
data['email_from'] = address.email
return {'value': data}
return {'value': {'email_from': address.email}}
def case_close(self, cr, uid, ids, *args):
"""
"""Closes Case
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case's Ids
@param *args: Give Tuple Value
@param ids: List of case Ids
@param *args: Tuple Value for additional Params
"""
cases = self.browse(cr, uid, ids)
cases[0].state # to fill the browse record cache
self.__history(cr, uid, cases, _('Close'))
@ -692,14 +628,13 @@ class crm_case(osv.osv):
return True
def case_escalate(self, cr, uid, ids, *args):
"""
"""Escalates case to top level
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case's Ids
@param *args: Give Tuple Value
@param ids: List of case Ids
@param *args: Tuple Value for additional Params
"""
cases = self.browse(cr, uid, ids)
for case in cases:
data = {'active': True, 'user_id': False}
@ -710,42 +645,39 @@ class crm_case(osv.osv):
data['user_id'] = case.section_id.parent_id.user_id.id
else:
raise osv.except_osv(_('Error !'), _('You can not escalate this case.\nYou are already at the top level.'))
self.write(cr, uid, ids, data)
self.write(cr, uid, [case.id], data)
cases = self.browse(cr, uid, ids)
self.__history(cr, uid, cases, _('Escalate'))
self._action(cr, uid, cases, 'escalate')
return True
def case_open(self, cr, uid, ids, *args):
"""
"""Opens Case
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case's Ids
@param *args: Give Tuple Value
@param ids: List of case Ids
@param *args: Tuple Value for additional Params
"""
cases = self.browse(cr, uid, ids)
self.__history(cr, uid, cases, _('Open'))
for case in cases:
data = {'state': 'open', 'active': True}
if not case.user_id:
data['user_id'] = uid
self.write(cr, uid, ids, data)
self.write(cr, uid, case.id, data)
self._action(cr, uid, cases, 'open')
return True
def case_cancel(self, cr, uid, ids, *args):
"""
"""Cancels Case
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case's Ids
@param *args: Give Tuple Value
@param ids: List of case Ids
@param *args: Tuple Value for additional Params
"""
cases = self.browse(cr, uid, ids)
cases[0].state # to fill the browse record cache
self.__history(cr, uid, cases, _('Cancel'))
@ -754,15 +686,13 @@ class crm_case(osv.osv):
return True
def case_pending(self, cr, uid, ids, *args):
"""
"""Marks case as pending
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case's Ids
@param *args: Give Tuple Value
@param ids: List of case Ids
@param *args: Tuple Value for additional Params
"""
cases = self.browse(cr, uid, ids)
cases[0].state # to fill the browse record cache
self.__history(cr, uid, cases, _('Pending'))
@ -771,15 +701,13 @@ class crm_case(osv.osv):
return True
def case_reset(self, cr, uid, ids, *args):
"""
"""Resets case as draft
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case's Ids
@param *args: Give Tuple Value
@param ids: List of case Ids
@param *args: Tuple Value for additional Params
"""
cases = self.browse(cr, uid, ids)
cases[0].state # to fill the browse record cache
self.__history(cr, uid, cases, _('Draft'))
@ -797,16 +725,16 @@ class crm_case_log(osv.osv):
_order = "id desc"
_columns = {
'name': fields.char('Status', size=64),
'date': fields.datetime('Date'),
'section_id': fields.many2one('crm.case.section', 'Section'),
'user_id': fields.many2one('res.users', 'User Responsible', readonly=True),
'model_id': fields.many2one('ir.model', "Model"),
'res_id': fields.integer('Resource ID'),
'name': fields.char('Status', size=64),
'date': fields.datetime('Date'),
'section_id': fields.many2one('crm.case.section', 'Section'),
'user_id': fields.many2one('res.users', 'User Responsible', readonly=True),
'model_id': fields.many2one('ir.model', "Model"),
'res_id': fields.integer('Resource ID'),
}
_defaults = {
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
}
crm_case_log()
@ -820,14 +748,13 @@ class crm_case_history(osv.osv):
_inherits = {'crm.case.log': "log_id"}
def _note_get(self, cursor, user, ids, name, arg, context=None):
""" @param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case Historys IDs
@param context: A standard dictionary for contextual values
""" Gives case History Description
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param ids: List of case Historys IDs
@param context: A standard dictionary for contextual values
"""
res = {}
for hist in self.browse(cursor, user, ids, context or {}):
res[hist.id] = (hist.email or '/') + ' (' + str(hist.date) + ')\n'
@ -850,7 +777,7 @@ class users(osv.osv):
_inherit = 'res.users'
_description = "Users"
_columns = {
'context_section_id': fields.many2one('crm.case.section', 'Sales Team'),
'context_section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
users()
@ -858,7 +785,7 @@ users()
class res_partner(osv.osv):
_inherit = 'res.partner'
_columns = {
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
'section_id': fields.many2one('crm.case.section', 'Sales Team'),
}
res_partner()

View File

@ -70,7 +70,7 @@ class case(osv.osv):
"""
for case in self.browse(cr, uid, ids):
if not case.section_id.reply_to:
raise osv.except_osv(_('Error!'), ("Reply To is not specified in Section"))
raise osv.except_osv(_('Error!'), ("Reply To is not specified in the sales team"))
if not case.email_from:
raise osv.except_osv(_('Error!'), ("Partner Email is not specified in Case"))
if case.section_id.reply_to and case.email_from:
@ -259,11 +259,11 @@ class base_action_rule_line(osv.osv):
return res + crm.AVAILABLE_PRIORITIES
_columns = {
'trg_section_id': fields.many2one('crm.case.section', 'Section'),
'trg_section_id': fields.many2one('crm.case.section', 'Sales Team'),
'trg_max_history': fields.integer('Maximum Communication History'),
'trg_categ_id': fields.many2one('crm.case.categ', 'Category'),
'regex_history' : fields.char('Regular Expression on Case History', size=128),
'act_section_id': fields.many2one('crm.case.section', 'Set section to'),
'act_section_id': fields.many2one('crm.case.section', 'Set Team to'),
'act_categ_id': fields.many2one('crm.case.categ', 'Set Category to'),
'act_mail_to_partner': fields.boolean('Mail to partner',help="Check this \
if you want the rule to send an email to the partner."),

View File

@ -1,52 +1,53 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
<data noupdate="1">
<menuitem id="base.menu_aftersale" name="After-Sale Services"
parent="base.menu_base_partner" sequence="6" />
<menuitem id="base.menu_aftersale" name="After-Sale Services"
groups="base.group_extended"
parent="base.menu_base_partner" sequence="6" />
<!-- Claims Menu -->
<!-- Claims Menu -->
<record model="ir.actions.act_window" id="crm_case_categ_claim0">
<field name="name">Claims</field>
<field name="res_model">crm.claim</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar,form,graph</field>
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="context">{"search_default_section_id":section_id,"search_default_current":1,"search_default_my_claims":1}</field>
<field name="search_view_id" ref="crm.view_crm_case_claims_filter"/>
</record>
<record model="ir.actions.act_window" id="crm_case_categ_claim0">
<field name="name">Claims</field>
<field name="res_model">crm.claim</field>
<field name="view_type">form</field>
<field name="view_mode">tree,calendar,form,graph</field>
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="context">{"search_default_section_id":section_id,"search_default_current":1,"search_default_my_claims":1}</field>
<field name="search_view_id" ref="crm.view_crm_case_claims_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_claim0">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_claim0">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="crm_case_claims_tree_view"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_calendar_claim0">
<field name="sequence" eval="2"/>
<field name="view_mode">calendar</field>
<field name="view_id" ref="crm_case_claims_calendar_view"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_calendar_claim0">
<field name="sequence" eval="2"/>
<field name="view_mode">calendar</field>
<field name="view_id" ref="crm_case_claims_calendar_view"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_form_claim0">
<field name="sequence" eval="3"/>
<field name="view_mode">form</field>
<field name="view_id" ref="crm_case_claims_form_view"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_form_claim0">
<field name="sequence" eval="3"/>
<field name="view_mode">form</field>
<field name="view_id" ref="crm_case_claims_form_view"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_sec_graph_view_act_job">
<field name="sequence" eval="4"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="crm_case_graph_view_stage_cost"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_sec_graph_view_act_job">
<field name="sequence" eval="4"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="crm_case_graph_view_stage_cost"/>
<field name="act_window_id" ref="crm_case_categ_claim0"/>
</record>
<menuitem name="Claims" id="menu_crm_case_claims"
parent="base.menu_aftersale" action="crm_case_categ_claim0" />
<menuitem name="Claims" id="menu_crm_case_claims"
parent="base.menu_aftersale" action="crm_case_categ_claim0" />
</data>
</data>
</openerp>

View File

@ -108,7 +108,7 @@
</group>
<separator colspan="4" string="Status and Categorization"/>
<group colspan="4" col="6">
<field name="user_id" string="Responsible" select="2"/>
<field name="user_id" string="Responsible"/>
<field name="section_id" widget="selection"/>
<label string="Stage: " align="1.0"/>
<group colspan="1" col="2">

View File

@ -5,7 +5,8 @@
<!-- MENU -->
<menuitem id="base.menu_fundrising" name="Fund Raising"
parent="base.menu_base_partner" sequence="7" />
groups="base.group_extended"
parent="base.menu_base_partner" sequence="7" />
<record model="ir.actions.act_window" id="crm_case_category_act_fund_all1">
<field name="name">Funds</field>

View File

@ -15,6 +15,7 @@
<menuitem action="crm_fund_categ_action"
id="menu_crm_case_fundraising-act"
groups="base.group_extended"
parent="crm.menu_crm_case_categ" />
<!-- Fund Stage Form View -->
@ -29,6 +30,7 @@
</record>
<menuitem action="crm_fundraising_stage_act"
groups="base.group_extended"
id="menu_crm_fundraising_stage_act"
parent="crm.menu_crm_case_stage" />
@ -44,6 +46,7 @@
</record>
<menuitem action="crm_fundraising_resource_act"
groups="base.group_extended"
id="menu_crm_fundraising_resource_act"
parent="crm.menu_crm_case_resource_type" />
@ -78,6 +81,7 @@
states="draft,open" type="object" icon="gtk-media-pause" />
<button name="case_escalate" string="Escalate"
states="open,draft,pending" type="object"
groups="base.group_extended"
icon="gtk-go-up" />
<button name="case_reset" string="Reset to Draft"
states="done,cancel" type="object" icon="gtk-convert" />
@ -117,7 +121,7 @@
<field name="probability"/>
<separator colspan="4" string="Categorization"/>
<group colspan="4" col="6">
<field name="user_id" select="2" string="Responsible"/>
<field name="user_id" string="Responsible"/>
<field name="section_id" colspan="1" widget="selection"/>
<field name="categ_id" select="1"
widget="selection"
@ -125,11 +129,11 @@
<field name="date"/>
<field name="duration"/>
</group>
<separator colspan="4" string="Details"/>
<separator colspan="4" string="Notes"/>
<field name="description" nolabel="1" colspan="4"/>
<separator colspan="4"/>
<group col="8" colspan="4">
<field name="state" select="2"/>
<field name="state"/>
<button name="case_close" string="Done"
states="open,draft,pending" type="object"
icon="gtk-close" />
@ -144,6 +148,7 @@
icon="gtk-media-pause" />
<button name="case_escalate" string="Escalate"
states="open,draft,pending" type="object"
groups="base.group_extended"
icon="gtk-go-up" />
<button name="case_reset"
string="Reset to Draft" states="done,cancel"
@ -277,7 +282,7 @@
domain="[('user_id','=', False)]"
help="Unassigned" />
</field>
<field name="section_id" select="1" widget="selection" string="Section">
<field name="section_id" select="1" widget="selection" string="Sales Team">
<filter icon="terp-crm"
domain="[('section_id','=',context.get('section_id',False))]"
help="My section" />

View File

@ -27,7 +27,7 @@
<group colspan="4" col="4">
<field colspan="4" name="name" select="1"/>
<field name="date" select="1"/>
<field name="date_deadline" select="2"/>
<field name="date_deadline"/>
</group>
<notebook colspan="4">
<page string="General">
@ -38,9 +38,9 @@
select="1" />
<field name="partner_address_id"
on_change="onchange_partner_address_id(partner_address_id, email_from)"
select="2" />
/>
<field name="email_from" select="2" />
<field name="email_from" />
<button name="remind_partner"
states="open,pending"
string="Send Reminder" type="object"
@ -58,7 +58,7 @@
icon="gtk-go-forward" />
</group>
<separator colspan="4" string="Details"/>
<separator colspan="4" string="Notes"/>
<field name="description" colspan="4"
nolabel="1" widget="text_tag" readonly="1" />
<separator colspan="4"/>
@ -88,9 +88,9 @@
</page>
<page string="History" groups="base.group_extended">
<field name="id" select="1"/>
<field name="active" select="2"/>
<field name="categ_id" select="2"/>
<field name="som" select="2"/>
<field name="active"/>
<field name="categ_id"/>
<field name="som"/>
<separator colspan="4" string="Dates"/>
<field name="create_date"/>
<field name="date_closed"/>
@ -103,8 +103,8 @@
<form string="Actions">
<separator colspan="4" string="Action Information"/>
<field colspan="4" name="name"/>
<field name="date" select="2"/>
<field name="user_id" select="2"/>
<field name="date"/>
<field name="user_id"/>
</form>
</field>
</page>
@ -177,6 +177,7 @@
states="draft,open" type="object"
icon="gtk-media-pause" />
<button name="case_escalate" string="Escalate"
groups="base.group_extended"
states="open,draft,pending" type="object"
icon="gtk-go-up" />
<button name="case_reset" string="Reset to Draft"
@ -226,7 +227,7 @@
<filter icon="terp-partner" name="my_hd_request"
domain="[('user_id','=',uid)]" help="My Helpdesk Requests"/>
</field>
<field name="section_id" select="1" widget="selection" string="Section">
<field name="section_id" select="1" widget="selection" string="Sales Team">
<filter icon="terp-crm"
domain="[('section_id','=',context.get('section_id',False))]"
help="My section" />

View File

@ -81,7 +81,8 @@ class crm_lead(osv.osv):
resource_id = False
if lead.user_id:
resource_ids = res_obj.search(cr, uid, [('user_id','=',lead.user_id.id)])
resource_id = len(resource_ids) or resource_ids[0]
if len(resource_ids):
resource_id = resource_ids[0]
duration = float(ans.days)
if lead.section_id.resource_calendar_id:
@ -122,7 +123,7 @@ class crm_lead(osv.osv):
'opportunity_id': fields.many2one('crm.opportunity', 'Opportunity'),
'user_id': fields.many2one('res.users', 'Salesman'),
'referred': fields.char('Referred By', size=32),
'referred': fields.char('Referred By', size=64),
'date_open': fields.datetime('Opened', readonly=True),
'day_open': fields.function(_compute_day, string='Days to Open', \
method=True, multi='day_open', type="integer", store=True),

View File

@ -25,10 +25,11 @@
</record>
<menuitem id="base.menu_sales" name="Sales"
parent="base.menu_base_partner" sequence="1" />
parent="base.menu_base_partner" sequence="1" />
<menuitem parent="base.menu_sales" name="Leads"
id="menu_crm_case_categ0_act_leads"
action="crm_case_category_act_leads_all" sequence="1" />
groups="base.group_extended"
id="menu_crm_case_categ0_act_leads"
action="crm_case_category_act_leads_all" sequence="1" />
</data>
</openerp>

View File

@ -13,6 +13,7 @@
<field name="context">{'object_id':'crm.lead'}</field>
</record>
<menuitem action="crm_lead_stage_act" id="menu_crm_lead_stage_act"
groups="base.group_extended"
parent="crm.menu_crm_case_stage" />
<!-- Resource Type Form View -->
@ -27,6 +28,7 @@
</record>
<menuitem action="crm_lead_resource_act"
id="menu_crm_lead_resource_act"
groups="base.group_extended"
parent="crm.menu_crm_case_resource_type" />
<!-- CRM Lead Form View -->
@ -42,18 +44,17 @@
<field name="priority"/>
<field name="date_deadline"/>
<button
name="convert_opportunity"
string="Convert"
help="Convert into Opportunity"
icon="gtk-index"
type="object"
attrs="{'invisible':[('opportunity_id','!=',False)]}"/>
name="convert_opportunity"
string="Convert"
help="Convert to Opportunity"
icon="gtk-index"
type="object"
attrs="{'invisible':[('opportunity_id','!=',False)]}"/>
<newline />
<field name="section_id" colspan="1"
widget="selection" />
<field name="user_id" />
<field name="stage_id" widget="selection"
readonly="1"
domain="[('object_id.model', '=', 'crm.lead')]" />
<group col="2" colspan="1">
<button name="stage_previous" string="Previous"
@ -102,7 +103,7 @@
<field name="description" nolabel="1" colspan="4"/>
<separator colspan="4"/>
<group col="8" colspan="4">
<field name="state" select="2"/>
<field name="state"/>
<button name="case_close" string="Close"
states="open,draft,pending" type="object"
icon="gtk-close" />
@ -117,6 +118,7 @@
icon="gtk-media-pause" />
<button name="case_escalate" string="Escalate"
states="open,draft,pending" type="object"
groups="base.group_extended"
icon="gtk-go-up" />
<button name="case_reset"
string="Reset to Draft" states="done,cancel"
@ -166,9 +168,9 @@
<newline/>
<field name="description" colspan="4" nolabel="1"/>
<button colspan="4"
string="Reply to Email"
string="Reply to Last Email"
name="%(action_crm_send_mail)d"
context="{'mail':'reply', 'model': 'crm.lead'}"
context="{'mail':'reply', 'model': 'crm.lead', 'include_original' : True}"
icon="gtk-undo" type="action" />
</form>
<tree string="Communication history">
@ -223,9 +225,9 @@
states="open,draft,pending" type="object"
icon="gtk-close" />
<button string="Convert to Opportunity"
name="%(action_crm_lead2opportunity)d"
name="convert_opportunity"
states="draft,open,pending" icon="gtk-index"
type="action" />
type="object" />
<button name="case_escalate" string="Escalate"
states="open,draft,pending" type="object"
icon="gtk-go-up" />

View File

@ -33,9 +33,7 @@ crm_opportunity()
class crm_phonecall(osv.osv):
""" CRM Phonecall """
_name = 'crm.phonecall'
crm_phonecall()

View File

@ -29,7 +29,9 @@
colspan="4" />
<field name="categ_id" widget="selection"
string="Meeting Type"
groups="base.group_extended"
domain="[('object_id.model', '=', 'crm.meeting')]" />
<newline/>
<field name="date" string="Start Date" required="1"
on_change="onchange_dates(date,duration,False)" />
<field name="duration" widget="float_time"
@ -99,8 +101,9 @@
<group col="6" colspan="4">
<group col="2" colspan="2">
<separator colspan="2" string="Assignment"/>
<field name="section_id" widget="selection" />
<field name="user_id" />
<field name="section_id" widget="selection"
groups="base.group_extended"/>
</group><group col="2" colspan="2">
<separator colspan="2" string="Contacts"/>
<field name="partner_id" string="Partner"
@ -111,18 +114,18 @@
<field name="email_from"/>
</group><group col="2" colspan="2">
<separator colspan="2" string="Visibility"/>
<field name="show_as" string="Show time as"/>
<field name="class" string="Privacy"/>
<field name="show_as" string="Show time as" groups="base.group_extended"/>
<field name="rrule" groups="base.group_extended" />
<field name="recurrent_id" invisible="1" />
<field name="recurrent_uid" invisible="1" />
<field name="recurrent_id" invisible="1"/>
<field name="recurrent_uid" invisible="1"/>
</group>
</group>
<separator string="Description" colspan="4" />
<field name="description" nolabel="1" colspan="4" />
<separator colspan="4"/>
<group col="8" colspan="4">
<field name="state" select="2" />
<field name="state" />
<button name="case_close" string="Done"
states="open" type="object"
icon="gtk-jump-to" />
@ -155,7 +158,7 @@
<field name="role" select="1" />
<separator colspan="4" string="" />
<group col="6" colspan="4">
<field name="state" select="2" />
<field name="state" />
<button name="do_tentative"
states="needs-action,declined,accepted"
string="Uncertain"
@ -203,14 +206,12 @@
<field name="arch" type="xml">
<tree string="Meetings"
colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
<field name="id" widget="char" />
<field name="name" string="Subject" />
<field name="partner_id" string="Partner" />
<field name="section_id" />
<field name="date" string="Meeting Date" />
<field name="categ_id" />
<field name="duration" />
<field name="user_id" />
<field name="state" />
<field name="state" invisible="1"/>
</tree>
</field>
</record>

View File

@ -39,7 +39,7 @@ class crm_opportunity(osv.osv):
_name = "crm.opportunity"
_description = "Opportunity Cases"
_order = "priority,id desc"
_order = "priority,date_action,id desc"
_inherit = 'crm.case'
def case_open(self, cr, uid, ids, *args):
@ -88,7 +88,8 @@ class crm_opportunity(osv.osv):
resource_id = False
if opportunity.user_id:
resource_ids = res_obj.search(cr, uid, [('user_id','=',opportunity.user_id.id)])
resource_id = len(resource_ids) and resource_ids[0] or False
if resource_ids and len(resource_ids):
resource_id = resource_ids[0]
duration = float(ans.days)
if opportunity.section_id.resource_calendar_id:
@ -118,9 +119,8 @@ class crm_opportunity(osv.osv):
'categ_id': fields.many2one('crm.case.categ', 'Category', \
domain="[('section_id','=',section_id), \
('object_id.model', '=', 'crm.opportunity')]"),
'type_id': fields.many2one('crm.case.resource.type', 'Resource Type',\
domain="[('section_id','=',section_id),('object_id.model', '=', 'crm.opportunity')]"),
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
'referred': fields.char('Referred By', size=64),
'probability': fields.float('Probability (%)'),
'planned_revenue': fields.float('Expected Revenue'),
'ref': fields.reference('Reference', selection=crm._links_get, size=128),
@ -129,6 +129,7 @@ class crm_opportunity(osv.osv):
'user_id': fields.many2one('res.users', 'Salesman'),
'phone': fields.char("Phone", size=64),
'date_deadline': fields.date('Expected Closing'),
'date_action': fields.date('Next Action'),
'state': fields.selection(AVAILABLE_STATES, 'State', size=16, readonly=True,
help='The state is set to \'Draft\', when a case is created.\
\nIf the case is in progress the state is set to \'Open\'.\

View File

@ -18,7 +18,6 @@
<field eval="&quot;open&quot;" name="state"/>
<field eval="85000.0" name="planned_revenue"/>
<field name="section_id" ref="crm.section_sales_department"/>
<field eval="time.strftime('%Y-%m-07 10:05:15')" name="date"/>
<field name="categ_id" ref="crm.categ_oppor1"/>
<field name="stage_id" ref="crm.stage_oppor3"/>
<field eval="&quot;CONS TRUST (AZ) 529701 - 1000 units&quot;" name="name"/>
@ -34,7 +33,6 @@
<field eval="45000.0" name="planned_revenue"/>
<field eval="50" name="probability"/>
<field name="section_id" ref="crm.section_sales_department"/>
<field eval="time.strftime('%Y-%m-05 12:25:15')" name="date"/>
<field name="categ_id" ref="crm.categ_oppor5"/>
<field name="stage_id" ref="crm.stage_oppor1"/>
<field eval="&quot;3rd Round Funding - 1000 units &quot;" name="name"/>
@ -51,7 +49,6 @@
<field eval="55000.0" name="planned_revenue"/>
<field eval="70" name="probability"/>
<field name="section_id" ref="crm.section_sales_department"/>
<field eval="time.strftime('%Y-%m-14 13:55:10')" name="date"/>
<field name="categ_id" ref="crm.categ_oppor7"/>
<field name="stage_id" ref="crm.stage_oppor5"/>
<field eval="&quot;Mediapole - 5000 units&quot;" name="name"/>
@ -68,7 +65,6 @@
<field eval="&quot;open&quot;" name="state"/>
<field eval="45000.0" name="planned_revenue"/>
<field name="section_id" ref="crm.section_sales_department"/>
<field eval="time.strftime('%Y-%m-23 16:32:23')" name="date"/>
<field name="categ_id" ref="crm.categ_oppor5"/>
<field name="stage_id" ref="crm.stage_oppor4"/>
<field eval="&quot;ABC FUEL CO 829264 - 1000 units &quot;" name="name"/>
@ -84,7 +80,6 @@
<field eval="&quot;done&quot;" name="state"/>
<field eval="42000.0" name="planned_revenue"/>
<field name="section_id" ref="crm.section_sales_department"/>
<field eval="time.strftime('%Y-%m-25 16:05:15')" name="date"/>
<field name="categ_id" ref="crm.categ_oppor2"/>
<field name="stage_id" ref="crm.stage_oppor6"/>
<field eval="&quot;Dirt Mining Ltd 271742 - 1000 units&quot;" name="name"/>

View File

@ -79,6 +79,10 @@
<field name="date_deadline" string="Expected Closing"/>
<button string="Schedule Call"
name="%(opportunity2phonecall_act)d" icon="gtk-redo" type="action" />
<newline/>
<field name="date_action"/>
<field name="priority" string="Priority"/>
</group>
<notebook colspan="4">
<page string="Opportunity">
@ -94,9 +98,7 @@
</group>
<group col="2" colspan="2">
<separator colspan="2" string="Categorization"/>
<field name="type_id" select="1" string="Campaign" groups="base.group_extended"/>
<field name="section_id" colspan="1" widget="selection"/>
<field name="priority" string="Priority"/>
<field name="categ_id" select="1"
string="Category" widget="selection"
domain="[('object_id.model', '=', 'crm.opportunity')]" />
@ -107,12 +109,13 @@
<separator colspan="4"/>
<group col="8" colspan="4">
<field name="state" select="2"/>
<field name="state"/>
<button name="case_open" string="Open"
states="draft,pending" type="object"
icon="gtk-go-forward" />
<button name="case_escalate" string="Escalate"
states="open,draft,pending" type="object"
groups="base.group_extended"
icon="gtk-go-up" />
<button name="case_pending" string="Pending"
states="draft,open" type="object"
@ -142,6 +145,7 @@
<field name="active"/>
<field name="day_open"/>
<field name="day_close"/>
<field name="referred"/>
</group>
<separator colspan="4" string="References"/>
<field name="ref"/>
@ -207,7 +211,6 @@
<field name="partner_id"/>
<field name="stage_id"/>
<field name="categ_id" invisible="1"/>
<field name="type_id" invisible="1"/>
<button name="stage_previous" string="Previous"
states="open,pending" type="object" icon="gtk-go-back" />
<button name="stage_next" string="Next"
@ -215,7 +218,7 @@
icon="gtk-go-forward" />
<field name="planned_revenue" sum="Expected Revenue"/>
<field name="probability" widget="progressbar" avg="Avg. of Probability"/>
<field name="date_deadline" string="Expected Closing"/>
<field name="date_action"/>
<field name="section_id"/>
<field name="user_id"/>
<field name="priority"/>
@ -304,8 +307,6 @@
<filter string="Category" icon="terp-crm"
domain="[]" context="{'group_by':'categ_id'}" />
<filter string="Campaign" icon="terp-crm"
domain="[]" context="{'group_by':'type_id'}" />
<separator orientation="vertical" />
<filter string="Partner" icon="terp-crm" domain="[]"
context="{'group_by':'partner_id'}" />

View File

@ -46,7 +46,8 @@
</record>
<menuitem name="Phone Calls" id="menu_crm_case_phone"
parent="base.menu_base_partner" sequence="5" />
groups="base.group_extended"
parent="base.menu_base_partner" sequence="5" />
<record model="ir.actions.act_window" id="crm_case_categ_phone_incoming0">
<field name="name">Inbound</field>
@ -81,8 +82,8 @@
</record>
<menuitem name="Inbound" id="menu_crm_case_phone_inbound"
parent="crm.menu_crm_case_phone"
action="crm_case_categ_phone_incoming0" />
parent="crm.menu_crm_case_phone"
action="crm_case_categ_phone_incoming0" />
<record model="ir.actions.act_window" id="crm_case_categ_phone_outgoing0">
<field name="name">Outbound</field>
@ -117,8 +118,8 @@
</record>
<menuitem name="Outbound" id="menu_crm_case_phone_outbound"
parent="crm.menu_crm_case_phone"
action="crm_case_categ_phone_outgoing0" />
parent="crm.menu_crm_case_phone"
action="crm_case_categ_phone_outgoing0" />
</data>
</openerp>

View File

@ -184,7 +184,7 @@
help="Unassigned Phonecalls" />
</field>
<field name="section_id"
select="1" widget="selection" string="Section">
select="1" widget="selection" string="Sales Team">
<filter icon="terp-crm"
domain="[('section_id','=',context.get('section_id',False))]"
help="My section" />

View File

@ -5,7 +5,7 @@
<!-- Cases by section and category2 of case Tree View -->
<record model="ir.ui.view" id="view_crm_case_section_categ_tree">
<field name="name">CRM Report - Sections and Type(Tree)</field>
<field name="name">CRM Report - Teams and Type(Tree)</field>
<field name="model">report.crm.case.section.categ2</field>
<field name="type">tree</field>
<field name="arch" type="xml">
@ -27,7 +27,7 @@
<!-- Cases by section and category2 of case Form View -->
<record model="ir.ui.view" id="view_crm_case_section_categ_form">
<field name="name">CRM Report - Sections and Type(Form)</field>
<field name="name">CRM Report - Teams and Type(Form)</field>
<field name="model">report.crm.case.section.categ2</field>
<field name="type">form</field>
<field name="arch" type="xml">

View File

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<menuitem id="menu_crm_configuration" name="Cases" parent="base.menu_base_config" sequence="0"/>
<menuitem id="menu_crm_configuration" name="Cases"
parent="base.menu_base_config" sequence="0"/>
<!-- Case Sections Form View -->
@ -295,6 +296,7 @@
icon="gtk-media-pause" />
<button name="case_escalate"
states="open,draft,pending" string="Escalate"
groups="base.group_extended"
type="object" icon="gtk-go-up" />
<button name="case_reset" states="done,cancel"
string="Reset to Draft" type="object"
@ -315,7 +317,7 @@
<field colspan="4" name="name" select="1"/>
<field colspan="2" name="section_id" widget="selection"/>
<field name="create_date" select="1"/>
<field name="date_deadline" select="2"/>
<field name="date_deadline"/>
<newline />
<notebook colspan="4">
<page string="General">
@ -326,10 +328,10 @@
<field colspan="3"
name="partner_address_id"
on_change="onchange_partner_address_id(partner_address_id, email_from)"
select="2" />
/>
<newline />
<field colspan="3" name="email_from"
select="2" />
/>
<button name="remind_partner"
states="open,pending"
string="Send Reminder" type="object"
@ -362,6 +364,7 @@
<button name="case_escalate"
states="open,draft,pending"
string="Escalate" type="object"
groups="base.group_extended"
icon="gtk-go-up" />
<button name="case_reset"
states="done,cancel"
@ -371,15 +374,15 @@
</page>
<page string="History" groups="base.group_extended">
<field name="id" select="1"/>
<field name="active" select="2"/>
<field name="active"/>
<separator colspan="4" string="Dates"/>
<field name="create_date"/>
<field colspan="4" name="log_ids" nolabel="1">
<form string="Actions">
<separator colspan="4" string="Action Information"/>
<field colspan="4" name="name"/>
<field name="date" select="2"/>
<field name="user_id" select="2"/>
<field name="date"/>
<field name="user_id"/>
</form>
</field>
</page>
@ -500,11 +503,11 @@
<field colspan="4" name="name" select="1"/>
<field name="date" select="1"/>
<field name="user_id" select="1"/>
<field name="model_id" select="2"/>
<field name="res_id" select="2"/>
<field name="som" select="2"/>
<field name="canal_id" select="2"/>
<field colspan="4" name="description" select="2"/>
<field name="model_id"/>
<field name="res_id"/>
<field name="som"/>
<field name="canal_id"/>
<field colspan="4" name="description"/>
</form>
</field>
</record>
@ -569,9 +572,9 @@
<form string="Partner Segmentation Lines">
<field colspan="4" name="name" select="1"/>
<group col="2" colspan="4">
<field name="expr_name" select="2"/>
<field name="expr_operator" select="2"/>
<field name="expr_value" select="2"/>
<field name="expr_name"/>
<field name="expr_operator"/>
<field name="expr_value"/>
</group>
<newline/>
<field name="operator"/>
@ -589,7 +592,7 @@
<form string="Partner Segmentation">
<group col="6" colspan="4">
<field name="name" select="1"/>
<field name="categ_id" select="2"/>
<field name="categ_id"/>
<field name="exclusif"/>
</group>
<notebook colspan="4">
@ -604,7 +607,7 @@
<field colspan="4" name="segmentation_line" widget="one2many_list" nolabel="1"/>
</page>
<page string="Description">
<field colspan="4" name="description" select="2" nolabel="1"/>
<field colspan="4" name="description" nolabel="1"/>
</page>
</notebook>
<field name="state"/>
@ -654,6 +657,7 @@
</record>
<menuitem action="crm_segmentation_tree-act"
id="menu_crm_segmentation-act"
groups="base.group_extended"
parent="crm.menu_crm_configuration" />
<record model="ir.ui.view" id="view_users_form_simple_modif_inherited1">
@ -678,7 +682,7 @@
<field eval="18" name="priority"/>
<field name="arch" type="xml">
<field name="password" position="after">
<field name="context_section_id" completion="1" widget="selection"/>
<field name="context_section_id" completion="1" widget="selection"/>
</field>
</field>
</record>
@ -693,7 +697,8 @@
<field eval="18" name="priority"/>
<field name="arch" type="xml">
<field name="parent_id" position="after">
<field name="section_id" completion="1" widget="selection"/>
<field name="section_id" completion="1" widget="selection"
groups="base.group_extended"/>
</field>
</field>
</record>
@ -706,7 +711,8 @@
<field eval="18" name="priority"/>
<field name="arch" type="xml">
<field name="lang" position="after">
<field name="section_id" completion="1" widget="selection"/>
<field name="section_id" completion="1" widget="selection"
groups="base.group_extended"/>
</field>
</field>
</record>
@ -719,7 +725,8 @@
<field eval="18" name="priority"/>
<field name="arch" type="xml">
<field name="category_id" position="after">
<field name="section_id" completion="1" widget="selection"/>
<field name="section_id" completion="1" widget="selection"
groups="base.group_extended"/>
</field>
</field>
</record>

View File

@ -10,17 +10,17 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Claims">
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="user_id" />
<field name="company_id" />
<field name="partner_id" />
<field name="nbr" string="#Claim"/>
<field name="delay_close"/>
<field name="state" invisible="1"/>
<field name="stage_id" invisible="1"/>
<field name="categ_id" invisible="1"/>
<field name="nbr" string="#Claim"/>
<field name="delay_close"/>
<field name="state" invisible="1"/>
<field name="stage_id" invisible="1"/>
<field name="categ_id" invisible="1"/>
</tree>
</field>
</record>
@ -34,7 +34,7 @@
<field name="type">form</field>
<field name="arch" type="xml">
<field name="nbr" position="after">
<field name="delay_close"/>
<field name="delay_close"/>
<field name="amount_revenue"/>
<field name="amount_costs"/>
<field name="amount_revenue_prob"/>
@ -67,10 +67,10 @@
<field name="type">search</field>
<field name="arch" type="xml">
<xpath
expr='//search[@string="Search"]/group[@string="Group By..."]/filter[@string="State"]'
position='after'>
<filter string="Stage" icon="terp-sale" domain="[]"
context="{'group_by':'stage_id'}" />
expr='//search[@string="Search"]/group[@string="Group By..."]/filter[@string="State"]'
position='after'>
<filter string="Stage" icon="terp-sale" domain="[]"
context="{'group_by':'stage_id'}" />
</xpath>
</field>
</record>
@ -81,29 +81,30 @@
<field name="name">Claims</field>
<field name="res_model">crm.claim.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="view_mode">tree,graph</field>
<field name="view_id" ref="view_report_crm_claim_tree"/>
<field name="context">{"search_default_section_id":section_id,"search_default_this_year":1,"search_default_this_month":1,"search_default_by_user":1}</field>
<field name="search_view_id" ref="view_report_crm_claim_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_claim_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_claim_tree"/>
<field name="act_window_id" ref="action_report_crm_claim"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_claim_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_claim_tree"/>
<field name="act_window_id" ref="action_report_crm_claim"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_claim_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_claim_graph"/>
<field name="act_window_id" ref="action_report_crm_claim"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_claim_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_claim_graph"/>
<field name="act_window_id" ref="action_report_crm_claim"/>
</record>
<menuitem name="Claims" id="menu_report_crm_claim_tree"
action="action_report_crm_claim" parent="base.next_id_64" />
<menuitem name="Claims" id="menu_report_crm_claim_tree"
groups="base.group_extended"
action="action_report_crm_claim" parent="base.next_id_64" />
</data>

View File

@ -9,14 +9,14 @@
<field name="model">crm.fundraising.report</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Fundraising">
<field name="name" />
<field name="month"/>
<field name="section_id" />
<tree string="Fundraising">
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="user_id" />
<field name="company_id" />
<field name="company_id" />
<field name="partner_id" />
<field name="nbr" string="#Fundraising"/>
<field name="nbr" string="#Fundraising"/>
<field name="amount_revenue" sum="Total Revenue"/>
<field name="probability"/>
<field name="amount_revenue_prob"/>
@ -36,7 +36,7 @@
<field name="type">form</field>
<field name="arch" type="xml">
<field name="nbr" position="after">
<field name="delay_close"/>
<field name="delay_close"/>
<field name="amount_revenue"/>
<field name="amount_revenue_prob"/>
<field name="probability"/>
@ -85,23 +85,24 @@
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_fundrising_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_fundraising_tree"/>
<field name="act_window_id" ref="action_report_crm_fundraising"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_fundrising_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_fundraising_tree"/>
<field name="act_window_id" ref="action_report_crm_fundraising"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_fundrising_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_fundraising_graph"/>
<field name="act_window_id" ref="action_report_crm_fundraising"/>
</record>
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_fundraising_graph"/>
<field name="act_window_id" ref="action_report_crm_fundraising"/>
</record>
<menuitem name="Fundraising"
action="action_report_crm_fundraising"
id="menu_report_crm_fundraising_tree" parent="base.next_id_64" />
action="action_report_crm_fundraising"
groups="base.group_extended"
id="menu_report_crm_fundraising_tree" parent="base.next_id_64" />
</data>
</openerp>

View File

@ -10,18 +10,18 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Helpdesk">
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="user_id" />
<field name="company_id"/>
<field name="partner_id" />
<field name="date_deadline" invisible="1"/>
<field name="priority" invisible="1"/>
<field name="nbr" string="#Helpdesk" />
<field name="delay_close"/>
<field name="nbr" string="#Helpdesk" />
<field name="delay_close"/>
<field name="state" invisible="1"/>
</tree>
</tree>
</field>
</record>
@ -34,7 +34,7 @@
<field name="type">form</field>
<field name="arch" type="xml">
<field name="nbr" position="after">
<field name="delay_close"/>
<field name="delay_close"/>
<field name="amount_revenue"/>
<field name="amount_revenue_prob"/>
<field name="probability"/>
@ -59,46 +59,46 @@
<!-- Helpdesk report after Sales Services Search View -->
<record id="view_report_crm_helpdesk_filter" model="ir.ui.view">
<record id="view_report_crm_helpdesk_filter" model="ir.ui.view">
<field name="name">crm.helpdesk.report.select</field>
<field name="model">crm.helpdesk.report</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search">
<group col="16" colspan="9">
<filter string="This Year" icon="terp-hr"
domain="[('name','=',time.localtime()[0])]"
name="this_year" />
<filter string="This Year" icon="terp-hr"
domain="[('name','=',time.localtime()[0])]"
name="this_year" />
<filter string="This Month" icon="terp-hr"
domain="[('month','=',time.strftime('%%m'))]"
name="this_month" />
<filter string="This Month" icon="terp-hr"
domain="[('month','=',time.strftime('%%m'))]"
name="this_month" />
<separator orientation="vertical" />
<filter string="Current" icon="terp-hr"
domain="[('state','in',('open','draft'))]" />
<separator orientation="vertical" />
<filter string="Current" icon="terp-hr"
domain="[('state','in',('open','draft'))]" />
<filter string="Won" icon="terp-hr"
domain="[('state','=','done')]" />
<filter string="Won" icon="terp-hr"
domain="[('state','=','done')]" />
<filter string="Lost" icon="terp-hr"
domain="[('state','=','cancel')]" />
<filter string="Lost" icon="terp-hr"
domain="[('state','=','cancel')]" />
<filter string="Deadline" icon="terp-hr"
domain="[('date_deadline','=',time.strftime('%%m/%%d/%%Y'))]" />
<filter string="Deadline" icon="terp-hr"
domain="[('date_deadline','=',time.strftime('%%m/%%d/%%Y'))]" />
<separator orientation="vertical" />
<field name="section_id"
widget="selection"
context="{'invisible_section': False}">
<separator orientation="vertical" />
<field name="section_id"
widget="selection"
context="{'invisible_section': False}">
<filter icon="terp-crm"
context="{'invisible_section': False}"
domain="[('section_id.user_id','=',uid)]"
help="My section" />
<filter icon="terp-crm"
context="{'invisible_section': False}"
domain="[('section_id.user_id','=',uid)]"
help="My section" />
</field>
<field name="company_id" widget="selection">
</field>
<field name="company_id" widget="selection">
<filter icon="terp-crm"
context="{'invisible_section': False}"
@ -111,24 +111,24 @@
<newline/>
<group expand="1" string="Extended options..." colspan="4" col="5">
<filter icon="terp-sale"
string="Lowest"
domain="[('priority','=','5')]"/>
string="Lowest"
domain="[('priority','=','5')]"/>
<filter icon="terp-sale"
string="Low"
domain="[('priority','=','4')]"/>
<filter icon="terp-sale"
string="Low"
domain="[('priority','=','4')]"/>
<filter icon="terp-sale"
string="Normal"
domain="[('priority','=','3')]"/>
<filter icon="terp-sale"
string="Normal"
domain="[('priority','=','3')]"/>
<filter icon="terp-sale"
string="High"
domain="[('priority','=','2')]"/>
<filter icon="terp-sale"
string="High"
domain="[('priority','=','2')]"/>
<filter icon="terp-sale"
string="Highest"
domain="[('priority','=','1')]"/>
<filter icon="terp-sale"
string="Highest"
domain="[('priority','=','1')]"/>
</group>
<newline/>
@ -137,30 +137,30 @@
<group expand="1" string="Group By..." colspan="4" col="8">
<filter string="User" icon="terp-sale"
domain="[]" context="{'group_by':'user_id'}" />
domain="[]" context="{'group_by':'user_id'}" />
<filter string="Company" icon="terp-sale"
domain="[]"
context="{'group_by':'company_id'}" />
domain="[]"
context="{'group_by':'company_id'}" />
<filter string="Section" icon="terp-sale"
domain="[]"
context="{'group_by':'section_id'}" />
domain="[]"
context="{'group_by':'section_id'}" />
<separator orientation="vertical" />
<filter string="State" icon="terp-sale"
domain="[]" context="{'group_by':'state'}" />
domain="[]" context="{'group_by':'state'}" />
<filter string="Partner" icon="terp-sale"
domain="[]"
context="{'group_by':'partner_id'}" />
domain="[]"
context="{'group_by':'partner_id'}" />
<separator orientation="vertical" />
<filter string="Month" icon="terp-sale"
domain="[]" context="{'group_by':'month'}" />
domain="[]" context="{'group_by':'month'}" />
<filter string="Year" icon="terp-sale"
domain="[]" context="{'group_by':'name'}" />
domain="[]" context="{'group_by':'name'}" />
</group>
</search>
@ -179,22 +179,23 @@
<field name="search_view_id" ref="view_report_crm_helpdesk_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_helpdesk_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_helpdesk_tree"/>
<field name="act_window_id" ref="action_report_crm_helpdesk"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_helpdesk_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_helpdesk_tree"/>
<field name="act_window_id" ref="action_report_crm_helpdesk"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_helpdesk_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_helpdesk_graph"/>
<field name="act_window_id" ref="action_report_crm_helpdesk"/>
</record>
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_helpdesk_graph"/>
<field name="act_window_id" ref="action_report_crm_helpdesk"/>
</record>
<menuitem name="Helpdesk" action="action_report_crm_helpdesk"
id="menu_report_crm_helpdesks_tree" parent="base.next_id_64" />
groups="base.group_extended"
id="menu_report_crm_helpdesks_tree" parent="base.next_id_64" />
</data>
</openerp>

View File

@ -10,16 +10,16 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Leads">
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="user_id" />
<field name="company_id" />
<field name="partner_id" />
<field name="nbr" string="#Leads"/>
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="user_id" />
<field name="company_id" />
<field name="partner_id" />
<field name="nbr" string="#Leads"/>
<field name="delay_close"/>
<field name="state" invisible="1"/>
<field name="stage_id" invisible="1"/>
<field name="stage_id" invisible="1"/>
<field name="categ_id" invisible="1"/>
</tree>
</field>
@ -34,8 +34,8 @@
<field name="type">form</field>
<field name="arch" type="xml">
<field name="nbr" position="after">
<field name="delay_close"/>
<field name="stage_id"/>
<field name="delay_close"/>
<field name="stage_id"/>
</field>
</field>
</record>
@ -63,12 +63,12 @@
<field name="inherit_id" ref="view_crm_case_filter"/>
<field name="type">search</field>
<field name="arch" type="xml">
<xpath
expr='//search[@string="Search"]/group[@string="Group By..."]/filter[@string="State"]'
position='after'>
<filter string="Stage" icon="terp-sale" domain="[]"
context="{'group_by':'stage_id'}" />
</xpath>
<xpath
expr='//search[@string="Search"]/group[@string="Group By..."]/filter[@string="State"]'
position='after'>
<filter string="Stage" icon="terp-sale" domain="[]"
context="{'group_by':'stage_id'}" />
</xpath>
</field>
</record>
@ -84,22 +84,23 @@
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_lead_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_lead_tree"/>
<field name="act_window_id" ref="action_report_crm_lead"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_lead_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_lead_tree"/>
<field name="act_window_id" ref="action_report_crm_lead"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_lead_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_lead_graph"/>
<field name="act_window_id" ref="action_report_crm_lead"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_lead_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_lead_graph"/>
<field name="act_window_id" ref="action_report_crm_lead"/>
</record>
<menuitem name="Leads" id="menu_report_crm_leads_tree"
parent="base.next_id_64" action="action_report_crm_lead" />
<menuitem name="Leads" id="menu_report_crm_leads_tree"
groups="base.group_extended"
parent="base.next_id_64" action="action_report_crm_lead" />
</data>
</openerp>

View File

@ -32,7 +32,8 @@ class crm_opportunity_report(osv.osv):
'probability': fields.float('Avg. Probability', readonly=True, group_operator="avg"),
'amount_revenue': fields.float('Est.Revenue', readonly=True),
'amount_revenue_prob': fields.float('Est. Rev*Prob.', readonly=True),
'delay_close': fields.float('Delay to close', digits=(16,2), readonly=True, group_operator="avg"),
'delay_close': fields.float('Days to Close', digits=(16,2), readonly=True, group_operator="avg",
help="Number of Days to close the opportunities"),
'categ_id': fields.many2one('crm.case.categ', 'Category',\
domain="[('section_id','=',section_id),\
('object_id.model', '=', 'crm.opportunity')]", readonly=True),
@ -70,7 +71,7 @@ class crm_opportunity_report(osv.osv):
sum(planned_revenue) as amount_revenue,
sum((planned_revenue*probability)/100.0)::decimal(16,2) as amount_revenue_prob,
avg(probability)::decimal(16,2) as probability,
avg(extract('epoch' from (date_closed-c.create_date)))/3600 as delay_close
avg(extract('epoch' from (date_closed-c.create_date)))/(3600*24) as delay_close
from
crm_opportunity c
group by

View File

@ -20,7 +20,7 @@
<field name="amount_revenue" sum="Total Revenue"/>
<field name="probability" widget="progressbar"/>
<field name="amount_revenue_prob"/>
<field name="delay_close" widget="float_time"/>
<field name="delay_close"/>
<field name="state" invisible="1"/>
<field name="stage_id" invisible="1"/>
<field name="categ_id" invisible="1"/>

View File

@ -10,17 +10,17 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Phone calls">
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="name" />
<field name="month"/>
<field name="section_id" />
<field name="user_id" />
<field name="company_id"/>
<field name="partner_id" />
<field name="nbr" string="#Phone calls" />
<field name="delay_close"/>
<field name="nbr" string="#Phone calls" />
<field name="delay_close"/>
<field name="state" invisible="1"/>
<field name="categ_id" invisible="1"/>
</tree>
</tree>
</field>
</record>
@ -33,7 +33,7 @@
<field name="type">form</field>
<field name="arch" type="xml">
<field name="nbr" position="after">
<field name="delay_close"/>
<field name="delay_close"/>
<field name="amount_revenue"/>
<field name="amount_revenue_prob"/>
<field name="probability"/>
@ -81,23 +81,24 @@
<field name="search_view_id" ref="view_report_crm_phonecall_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_phonecall_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_phonecall_tree"/>
<field name="act_window_id" ref="action_report_crm_phonecall"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_phonecall_tree">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_report_crm_phonecall_tree"/>
<field name="act_window_id" ref="action_report_crm_phonecall"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_phonecall_graph">
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_phonecall_graph"/>
<field name="act_window_id" ref="action_report_crm_phonecall"/>
</record>
<field name="sequence" eval="2"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="view_report_crm_phonecall_graph"/>
<field name="act_window_id" ref="action_report_crm_phonecall"/>
</record>
<menuitem name="Phone Calls"
action="action_report_crm_phonecall"
id="menu_report_crm_phonecalls_tree" parent="base.next_id_64" />
action="action_report_crm_phonecall"
groups="base.group_extended"
id="menu_report_crm_phonecalls_tree" parent="base.next_id_64" />
</data>
</openerp>

View File

@ -77,6 +77,7 @@ class crm_lead2opportunity(osv.osv_memory):
for this in self.browse(cr, uid, ids, context=context):
new_opportunity_id = opp_obj.create(cr, uid, {
'name': this.name,
'referred': this.referred,
'planned_revenue': this.planned_revenue,
'probability': this.probability,
'partner_id': lead.partner_id and lead.partner_id.id or False ,
@ -89,7 +90,6 @@ class crm_lead2opportunity(osv.osv_memory):
'phone': lead.phone,
'email_from': lead.email_from
})
new_opportunity = opp_obj.browse(cr, uid, new_opportunity_id)
vals = {
'partner_id': this.partner_id and this.partner_id.id or False,

View File

@ -1,61 +1,63 @@
<openerp>
<data>
<data>
<!-- Lead to Opportunity view -->
<!-- Lead to Opportunity view -->
<record id="view_crm_lead2opportunity_create" model="ir.ui.view">
<field name="name">crm.lead2opportunity.create</field>
<field name="model">crm.lead2opportunity</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Convert To Opportunity">
<field name="name"/>
<field name="partner_id"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
<group col="4" colspan="4">
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
<button name="action_apply" string="Create Opportunity" type="object" icon="gtk-ok"/>
</group>
</form>
</field>
</record>
<!-- Lead to Opportunity action -->
<record id="action_crm_lead2opportunity" model="ir.actions.act_window">
<field name="name">Create Opportunity</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">crm.lead2opportunity</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="view_crm_lead2opportunity_create" model="ir.ui.view">
<field name="name">crm.lead2opportunity.create</field>
<field name="model">crm.lead2opportunity</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Convert To Opportunity">
<field name="name"/>
<field name="partner_id"/>
<newline/>
<field name="planned_revenue"/>
<field name="probability"/>
<separator colspan="4"/>
<group col="4" colspan="4">
<label string="" colspan="2"/>
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
<button name="action_apply" string="Create Opportunity" type="object" icon="gtk-ok"/>
</group>
</form>
</field>
</record>
<!-- Lead to Opportunity action -->
<record id="action_crm_lead2opportunity" model="ir.actions.act_window">
<field name="name">Create Opportunity</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">crm.lead2opportunity</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="view_crm_lead2opportunity_partner" model="ir.ui.view">
<field name="name">crm.lead2opportunity.partner.form</field>
<field name="model">crm.lead2opportunity.partner</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Create a Partner">
<field name="name">crm.lead2opportunity.partner.form</field>
<field name="model">crm.lead2opportunity.partner</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Create a Partner">
<label string="Are you sure you want to create a partner based on this lead ?" colspan="4"/>
<label string="You may have to verify that this partner does not exist already." colspan="4"/>
<newline />
<field name="action"/>
<group attrs="{'invisible':[('action','!=','exist')]}">
<field name="partner_id" attrs="{'required': [('action', '=', 'exist')]}"/>
</group>
<separator string="" colspan="4" />
<group col="4" colspan="4">
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
<button special="cancel" name="action_skip" string="_Skip" type="object" icon="gtk-goto-last"/>
<button name="make_partner" string="Continue" type="object" icon="gtk-ok"/>
</group>
<field name="action"/>
<group attrs="{'invisible':[('action','!=','exist')]}">
<field name="partner_id" attrs="{'required': [('action', '=', 'exist')]}"/>
</group>
<separator string="" colspan="4" />
<group col="4" colspan="4">
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
<button special="cancel" name="action_skip" string="_Skip" type="object" icon="gtk-goto-last"/>
<button name="make_partner" string="Continue" type="object" icon="gtk-ok"/>
</group>
</form>
</field>
</record>
</field>
</record>
</data>
</data>
</openerp>

View File

@ -53,42 +53,41 @@ class crm_lead2partner(osv.osv_memory):
raise osv.except_osv(_('Warning !'),
_('A partner is already defined on this lead.'))
def _select_partner(self, cr, uid, context=None):
def default_get(self, cr, uid, fields, context=None):
"""
This function Searches for Partner from selected lead.
This function gets default values
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks,
@param fields: List of fields for default value
@param context: A standard dictionary for contextual values
@return : Partner id if any for selected lead.
@return : default values of fields.
"""
if not context:
context = {}
lead_obj = self.pool.get('crm.lead')
partner_obj = self.pool.get('res.partner')
contact_obj = self.pool.get('res.partner.address')
rec_ids = context and context.get('active_ids', [])
partner_id = False
for lead in lead_obj.browse(cr, uid, rec_ids, context=context):
data = context and context.get('active_ids', []) or []
res = super(crm_lead2partner, self).default_get(cr, uid, fields, context=context)
for lead in lead_obj.browse(cr, uid, data, context=context):
partner_ids = partner_obj.search(cr, uid, [('name', '=', lead.partner_name or lead.name)])
if not partner_ids and lead.email_from:
address_ids = contact_obj.search(cr, uid, [('email', '=', lead.email_from)])
if address_ids:
addresses = contact_obj.browse(cr, uid, address_ids)
partner_ids = addresses and [addresses[0].partner_id.id] or False
partner_id = partner_ids and partner_ids[0] or False
return partner_id
_defaults = {
'action': lambda *a:'exist',
'partner_id': _select_partner
}
if 'partner_id' in fields:
res.update({'partner_id': partner_id})
if 'action' in fields:
res.update({'action': partner_id and 'exist' or 'create'})
return res
def open_create_partner(self, cr, uid, ids, context=None):
"""
This function Opens form of create partner.

View File

@ -70,8 +70,8 @@ class crm_send_new_email(osv.osv_memory):
for data in self.read(cr, uid, ids, context=context):
attach = filter(lambda x: x, [data['doc1'], data['doc2'], data['doc3']])
attach = map(lambda x: x and ('Attachment'+str(attach.index(x)+1), base64.decodestring(x)), attach)
attach = map(lambda x: (data['doc' + str(attach.index(x) + 1) \
+ '_fname'], base64.decodestring(x)), attach)
message_id = None
case = case_pool.browse(cr, uid, res_id)
@ -177,6 +177,8 @@ class crm_send_new_email(osv.osv_memory):
"""
hist_obj = self.pool.get('crm.case.history')
res_ids = context and context.get('active_ids', []) or []
include_original = context and context.get('include_original', False) or False
res = {}
for hist in hist_obj.browse(cr, uid, res_ids):
model = hist.log_id.model_id.model
@ -188,7 +190,8 @@ class crm_send_new_email(osv.osv_memory):
res.update({'email_from': (case.section_id and case.section_id.reply_to) or \
(case.user_id and case.user_id.address_id and \
case.user_id.address_id.email) or hist.email_to or tools.config.get('email_from',False)})
if 'text' in fields:
if include_original == True and 'text' in fields:
header = '-------- Original Message --------'
sender = 'From: %s' %(hist.email_from or '')
to = 'To: %s' % (hist.email_to or '')

View File

@ -161,9 +161,9 @@
<field name="name" select="1"/>
<field name="exclusif"/>
<newline/>
<field name="categ_id" select="2" colspan="2"/>
<field name="categ_id" colspan="2"/>
<newline/>
<field name="description" select="2" colspan="4"/>
<field name="description" colspan="4"/>
<field name="state"/>
<group col="3" colspan="2">
<button name="process_start"

View File

@ -14,7 +14,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2010-04-17 04:17+0000\n"
"X-Launchpad-Export-Date: 2010-04-18 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: crm_profiling

View File

@ -124,10 +124,10 @@
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<separator string="Notes" position="before">
<group name="logistic" position="inside">
<field name="id" invisible="True"/>
<field name="carrier_id" context="{'order_id':id}"/>
</separator>
</group>
</field>
</record>

View File

@ -73,7 +73,7 @@ class document_file(osv.osv):
_columns = {
'user_id': fields.many2one('res.users', 'Owner', select=1),
'group_ids': fields.many2many('res.groups', 'document_directory_group_rel', 'item_id', 'group_id', 'Groups'),
'group_ids': fields.many2many('res.groups', 'document_group_rel', 'item_id', 'group_id', 'Groups'),
# the directory id now is mandatory. It can still be computed automatically.
'parent_id': fields.many2one('document.directory', 'Directory', select=1, required=True),
'file_size': fields.integer('File Size', required=True),

View File

@ -52,7 +52,7 @@ class document_directory(osv.osv):
'ressource_type_id': fields.many2one('ir.model', 'Directories Mapped to Objects',
help="Select an object here and Open ERP will create a mapping for each of these " \
"objects, using the given domain, when browsing through FTP."),
'resource_field': fields.char('Name field',size=32,help='Field to be used as name on resource directories. If empty, the "name" will be used.'),
'resource_field': fields.many2one('ir.model.fields', 'Name field', help='Field to be used as name on resource directories. If empty, the "name" will be used.'),
'ressource_parent_type_id': fields.many2one('ir.model', 'Parent Model',
help="If you put an object here, this directory template will appear bellow all of these objects. " \
"Don't put a parent directory if you select a parent model."),
@ -61,10 +61,12 @@ class document_directory(osv.osv):
help="Check this if you want to use the same tree structure as the object selected in the system."),
'dctx_ids': fields.one2many('document.directory.dctx', 'dir_id', 'Context fields'),
}
def _get_root_directory(self, cr,uid, context=None):
objid=self.pool.get('ir.model.data')
try:
mid = objid._get_id(cr, uid, 'document', 'dir_root')
mid = objid._get_id(cr, uid, 'document', 'dir_root')
if not mid:
return False
root_id = objid.read(cr, uid, mid, ['res_id'])['res_id']

View File

@ -103,7 +103,7 @@ class document_storage(osv.osv):
'create_date': fields.datetime('Date Created', readonly=True),
'create_uid': fields.many2one('res.users', 'Creator', readonly=True),
'user_id': fields.many2one('res.users', 'Owner'),
'group_ids': fields.many2many('res.groups', 'document_directory_group_rel', 'item_id', 'group_id', 'Groups'),
'group_ids': fields.many2many('res.groups', 'document_storage_group_rel', 'item_id', 'group_id', 'Groups'),
'dir_ids': fields.one2many('document.directory', 'parent_id', 'Directories'),
'type': fields.selection([('db', 'Database'), ('filestore', 'Internal File storage'),
('realstore', 'External file storage'), ('virtual', 'Virtual storage')], 'Type', required=True),

View File

@ -13,12 +13,16 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Storage Media">
<field name="name" select="1" colspan="4"/>
<field name="user_id"/>
<field name="type" />
<field name="online" />
<field name="readonly" />
<field name="path" />
<group colspan="4" col="4">
<field name="name" select="1" colspan="4"/>
<field name="user_id"/>
<field name="type"/>
<field name="online"/>
<field name="readonly"/>
</group>
<group colspan="2" attrs="{'invisible':[('type','!=','realstore')]}">
<field name="path"/>
</group>
</form>
</field>
</record>
@ -67,13 +71,13 @@
<newline/>
<field name="domain" attrs="{'required': [('type','=','ressource')], 'readonly': [('type','=','static')]}"/>
<field name="ressource_tree"/>
<field name="resource_field"/>
<field name="resource_field" domain="[('model_id','=',ressource_type_id), ('ttype', 'in', ('char', 'selection', 'date', 'datetime'))]"/>
<field name="ressource_id" select="2" readonly="1"/>
<field name="ressource_parent_type_id"/>
</page>
<page string="Generated Files">
<label colspan="4" string="For each entry here, virtual files will appear in this folder." />
<field name="content_ids" nolabel="1" colspan="4">
<field name="content_ids" nolabel="1" colspan="4" attrs="{'readonly': [('ressource_type_id','=',False)]}">
<form string="Contents">
<field name="name"/>
<field name="sequence"/>
@ -179,7 +183,7 @@
<field name="title" select="1"/>
<field name="partner_id"/>
<field name="user_id"/>
<field name="parent_id" select="2"/>
<field name="parent_id"/>
</group>
<notebook colspan="4">
<page string="Attachment">
@ -190,7 +194,7 @@
</group>
<group col="2" colspan="2">
<separator string="Attached To" colspan="2"/>
<field name="res_model" select="2" readonly="1"/>
<field name="res_model" readonly="1"/>
<field name="res_id" readonly="1"/>
</group>
<separator string="Preview" colspan="4"/>

View File

@ -320,7 +320,7 @@ class node_res_dir(node_class):
self.content_length = 0
self.res_model = dirr.ressource_type_id and dirr.ressource_type_id.model or False
self.resm_id = dirr.ressource_id
self.namefield = dirr.resource_field or 'name'
self.namefield = dirr.resource_field.name or 'name'
self.displayname = dirr.name
# Important: the domain is evaluated using the *parent* dctx!
self.domain = dirr.domain
@ -508,7 +508,7 @@ class node_res_obj(node_class):
where1 = where + [(obj._parent_name, '=', self.res_id)]
resids = obj.search(cr,uid, where1, context=ctx)
for bo in obj.browse(cr,uid,resids,context=ctx):
namefield = directory.resource_field or 'name'
namefield = directory.resource_field.name or 'name'
if not bo:
continue
res_name = getattr(bo, namefield)

View File

@ -23,7 +23,6 @@ import StringIO
import odt2txt
from subprocess import Popen, PIPE
from content_index import indexer, cntIndex
from subprocess import Popen, PIPE
def _to_unicode(s):
try:

Some files were not shown because too many files have changed in this diff Show More