[Merge]: lp:openobject-addons

bzr revid: sbh@tinyerp.com-20100416044236-ztzke56zfdp8iyra
This commit is contained in:
sbh (Open ERP) 2010-04-16 10:12:36 +05:30
commit 60b45a3049
138 changed files with 8649 additions and 1691 deletions

View File

@ -11,8 +11,8 @@
<page string="Accounting">
<separator string="Sales Properties" colspan="2"/>
<separator string="Purchase Properties" colspan="2"/>
<field name="property_account_income" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}" />
<field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" />
<field name="property_account_income" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('sale_ok','=',0)]}" groups="base.group_extended"/>
<field name="property_account_expense" domain="[('type','&lt;&gt;','view'),('type','&lt;&gt;','consolidation')]" attrs="{'readonly':[('purchase_ok','=',0)]}" groups="base.group_extended"/>
<separator string="Sale Taxes" colspan="2"/>
<separator string="Purchase Taxes" colspan="2"/>

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-09-08 14:29+0000\n"
"Last-Translator: ekodaq <ceo@ekosdaq.com>\n"
"PO-Revision-Date: 2010-04-15 00:46+0000\n"
"Last-Translator: Bundo <bundo@bundo.biz>\n"
"Language-Team: Korean <ko@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-03-30 04:07+0000\n"
"X-Launchpad-Export-Date: 2010-04-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: account_analytic_plans
@ -106,7 +106,7 @@ msgstr "배분 코드"
#. module: account_analytic_plans
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "액션 정의에서 유효하지 않은 모델 이름"
#. module: account_analytic_plans
#: field:account.analytic.plan.line,name:0
@ -116,7 +116,7 @@ msgstr "플랜 이름"
#. module: account_analytic_plans
#: rml:account.analytic.account.crossovered.analytic:0
msgid "Printing date"
msgstr ""
msgstr "인쇄 날짜"
#. module: account_analytic_plans
#: rml:account.analytic.account.crossovered.analytic:0
@ -147,7 +147,7 @@ msgstr "분석 저널"
#. module: account_analytic_plans
#: rml:account.analytic.account.crossovered.analytic:0
msgid "100.00%"
msgstr ""
msgstr "100.00%"
#. module: account_analytic_plans
#: wizard_field:wizard.crossovered.analytic,init,ref:0
@ -157,7 +157,7 @@ msgstr "분석 계정 참조"
#. module: account_analytic_plans
#: rml:account.analytic.account.crossovered.analytic:0
msgid "Analytic Account :"
msgstr ""
msgstr "분석 계정:"
#. module: account_analytic_plans
#: view:account.analytic.plan.line:0

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-09-08 16:01+0000\n"
"Last-Translator: ekodaq <ceo@ekosdaq.com>\n"
"PO-Revision-Date: 2010-04-15 01:01+0000\n"
"Last-Translator: Bundo <bundo@bundo.biz>\n"
"Language-Team: Korean <ko@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-03-30 04:14+0000\n"
"X-Launchpad-Export-Date: 2010-04-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: analytic_user_function
@ -35,7 +35,7 @@ msgstr "상품"
#. module: analytic_user_function
#: field:analytic_user_funct_grid,account_id:0
msgid "Analytic Account"
msgstr ""
msgstr "분석 계정"
#. module: analytic_user_function
#: view:account.analytic.account:0
@ -57,7 +57,7 @@ msgstr "오브젝트 이름은 x_로 시작해야 하며, 특수 문자를 포
#. module: analytic_user_function
#: model:ir.module.module,shortdesc:analytic_user_function.module_meta_information
msgid "Analytic User Function"
msgstr ""
msgstr "사용자 함수 분석"
#. module: analytic_user_function
#: view:analytic_user_funct_grid:0

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-09-16 13:34+0000\n"
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"PO-Revision-Date: 2010-04-13 07:22+0000\n"
"Last-Translator: grisha <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-03-30 03:59+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: base_contact
@ -266,7 +266,7 @@ msgstr ""
#. module: base_contact
#: field:res.partner.contact,partner_id:0
msgid "Main Employer"
msgstr ""
msgstr "Основной работодатель"
#. module: base_contact
#: model:process.transition,name:base_contact.process_transition_functiontoaddress0
@ -286,7 +286,7 @@ msgstr "Контакт партнера"
#. module: base_contact
#: model:process.node,name:base_contact.process_node_partners0
msgid "Partners"
msgstr ""
msgstr "Контрагенты"
#. module: base_contact
#: model:process.node,name:base_contact.process_node_addresses0

View File

@ -15,7 +15,7 @@
<child1>
<action colspan="4" height="200" name="%(mrp.mrp_production_action2)d" string="Next production orders" width="510"/>
<action colspan="4" name="%(stock.action_picking_all)d" string="Deliveries (Out picking)" domain="[('state','=','assigned'),('type','=','out')]"/>
<action colspan="4" name="%(mrp.mrp_procurement_action4)d" string=" Requisition in Exception"/>
<action colspan="4" name="%(mrp.mrp_procurement_action4)d" string="Procurements in Exception"/>
</child1>
@ -37,7 +37,7 @@
<field name="view_id" ref="board_mrp_manager_form"/>
</record>
<menuitem icon="terp-graph" id="base.dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>
<menuitem icon="terp-graph" id="base.dashboard" name="Dashboards" sequence="2" parent="base.reporting_menu"/>
<menuitem
id="next_id_87"
name="Production"

View File

@ -501,20 +501,7 @@ class crm_case(osv.osv):
self.write(cr, uid, [case.id], {'stage_id': s[section][st]})
return True
def history(self, cr, uid, ids, keyword, history=False, email=False, details=None, context={}):
"""
@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 context: A standard dictionary for contextual values"""
cases = self.browse(cr, uid, ids, context=context)
return self.__history(cr, uid, cases, keyword=keyword, \
history=history, email=email, details=details, \
context=context)
def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, context={}):
def __history(self, cr, uid, cases, keyword, history=False, email=False, details=None, email_from=False, message_id=False, context={}):
"""
@param self: The object pointer
@param cr: the current row, from the database cursor,
@ -533,7 +520,8 @@ class crm_case(osv.osv):
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
'model_id' : model_ids and model_ids[0] or False,
'res_id': case.id,
'section_id': case.section_id.id
'section_id': case.section_id.id,
'message_id':message_id
}
obj = self.pool.get('crm.case.log')
@ -551,6 +539,7 @@ class crm_case(osv.osv):
res = obj.create(cr, uid, data, context)
return True
_history = __history
history = __history
def create(self, cr, uid, *args, **argv):
@ -849,6 +838,7 @@ class crm_case_history(osv.osv):
'email_to': fields.char('Email TO', size=84),
'email_from' : fields.char('Email From', size=84),
'log_id': fields.many2one('crm.case.log','Log',ondelete='cascade'),
'message_id': fields.char('Message Id', size=1024, readonly=True, help="Message Id on Email Server.", select=True),
}
crm_case_history()

View File

@ -13,7 +13,7 @@
<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="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>

View File

@ -245,7 +245,7 @@
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Claims">
<filter icon="gtk-new" string="Current"
<filter icon="gtk-new" string="Current" name="current"
domain="[('state','in',('draft', 'open'))]"
separator="1" help="Current Claims"
/>
@ -263,7 +263,7 @@
<field name="name" select='1'/>
<field name="partner_id" select="1"/>
<field name="user_id" select="1" widget="selection">
<filter icon="terp-partner" string="My Claims"
<filter icon="terp-partner" name="my_claims"
domain="[('user_id','=',uid)]" help="My Claims"/>
<filter icon="terp-partner"
domain="[('user_id','=', False)]"

View File

@ -12,7 +12,7 @@
<field name="res_model">crm.fundraising</field>
<field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="crm.crm_case_tree_view_fund"/>
<field name="context">{"search_default_My Funds":1,"search_default_section_id":section_id}</field>
<field name="context">{"search_default_my_funds":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="crm.view_crm_case_fund_filter"/>
</record>

View File

@ -252,7 +252,7 @@
<search string="Search Funds">
<group col='6' colspan='4'>
<filter icon="terp-partner" string="My Funds"
domain="[('user_id','=',uid)]"
name="my_funds" domain="[('user_id','=',uid)]"
separator="1"
help="Funds Related to Current User"
/>

View File

@ -11,7 +11,7 @@
<field name="res_model">crm.helpdesk</field>
<field name="view_mode">tree,calendar,form</field>
<field name="view_id" ref="crm_case_tree_view_helpdesk"/>
<field name="context">{"search_default_My Request":1,"search_default_section_id":section_id}</field>
<field name="context">{"search_default_my_hd_request":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="crm.view_crm_case_helpdesk_filter"/>
</record>

View File

@ -104,7 +104,7 @@
<separator colspan="4" string="Action Information"/>
<field colspan="4" name="name"/>
<field name="date" select="2"/>
<field name="user_id" select="2"/>
<field name="user_id" select="2"/>
</form>
</field>
</page>
@ -223,7 +223,7 @@
<field name="name" select='1' string="Query"/>
<field name="partner_id" />
<field name="user_id" select="1" widget="selection">
<filter icon="terp-partner" string="My Request"
<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">

View File

@ -7,7 +7,8 @@
<field name="res_model">crm.lead</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="crm_case_tree_view_leads"/>
<field name="context">{"search_default_Current":1,"search_default_My Lead":1,"search_default_section_id":section_id}</field>
<field name="context">{"search_default_current":1,"search_default_my_lead":1,"search_default_section_id":section_id}</field>
<field name="context">{"search_default_current":1,"search_default_my_lead":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_leads_all">

View File

@ -45,8 +45,8 @@
name="convert_opportunity"
string="Convert"
help="Convert into Opportunity"
icon="gtk-index"
type="object"
icon="gtk-index"
type="object"
attrs="{'invisible':[('opportunity_id','!=',False)]}"/>
<newline />
<field name="section_id" colspan="1"
@ -262,7 +262,7 @@
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Leads">
<filter icon="terp-project"
<filter icon="terp-project" name="current"
string="Current"
domain="[('state','in',('draft','open'))]"/>
<filter icon="terp-project"
@ -288,7 +288,7 @@
<field name="user_id" widget="selection">
<filter icon="terp-partner"
domain="[('user_id','=',uid)]"
help="My Leads" string="My Lead"
help="My Leads" name="my_lead"
/>
<filter icon="terp-partner"
domain="[('user_id','=', False)]"

View File

@ -38,81 +38,84 @@ class crm_cases(osv.osv):
_name = "crm.case"
_inherit = "crm.case"
def msg_new(self, cr, uid, msg):
""" @param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks
def message_new(self, cr, uid, msg, context):
"""
Automatically calls when new email message arrives
@param self: The object pointer
@param cr: the current row, from the database cursor,
@param uid: the current users ID for security checks
"""
mailgate_obj = self.pool.get('mail.gateway')
msg_body = mailgate_obj.msg_body_get(msg)
msg_subject = mailgate_obj._decode_header(msg['Subject'])
msg_from = mailgate_obj._decode_header(msg['From'])
msg_cc = mailgate_obj._decode_header(msg['Cc'])
body = self.format_body(msg_body['body'])
data = {
'name': msg_subject,
mailgate_pool = self.pool.get('email.server.tools')
subject = msg.get('subject')
body = msg.get('body')
msg_from = msg.get('from')
priority = msg.get('priority')
vals = {
'name': subject,
'email_from': msg_from,
'email_cc': msg_cc,
'email_cc': msg.get('cc'),
'description': body,
'user_id': False,
'description': body,
}
res = mailgate_obj.partner_get(cr, uid, msg_from)
if msg.get('priority', False):
vals['priority'] = priority
res = mailgate_pool.get_partner(cr, uid, msg.get('from'))
if res:
data.update(res)
res = self.create(cr, uid, data)
cases = self.browse(cr, uid, [res])
self._history(cr, uid, cases, _('Receive'), history=True, details=body, email_from=msg_from)
vals.update(res)
res = self.create(cr, uid, vals, context)
cases = self.browse(cr, uid, [res])
self._history(cr, uid, cases, _('Receive'), history=True, details=body, email_from=msg_from, message_id=msg.get('id'))
return res
def msg_update(self, cr, uid, ids, msg, data={}, default_act='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 update mails IDs """
def message_update(self, cr, uid, ids, msg, default_act='pending', context={}):
"""
@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 update mails IDs
"""
vals = { }
if isinstance(ids, (str, int, long)):
select = [ids]
else:
select = ids
mailgate_obj = self.pool.get('mail.gateway')
msg_actions, body_data = mailgate_obj.msg_act_get(msg)
data.update({
'description': body_data,
ids = [ids]
msg_from = msg['from']
vals.update({
'description': msg['body']
})
act = 'case_'+default_act
if 'state' in msg_actions:
if msg_actions['state'] in ['draft','close','cancel','open','pending']:
act = 'case_' + msg_actions['state']
if msg.get('priority', False):
vals['priority'] = msg.get('priority')
for k1,k2 in [('cost','planned_cost'),('revenue','planned_revenue'),('probability','probability')]:
if k1 in msg_actions:
data[k2] = float(msg_actions[k1])
# act = 'case_'+default_act
# if 'state' in msg_actions:
# if msg_actions['state'] in ['draft','close','cancel','open','pending']:
# act = 'case_' + msg_actions['state']
if 'priority' in msg_actions:
if msg_actions['priority'] in ('1','2','3','4','5'):
data['priority'] = msg_actions['priority']
# for k1,k2 in [('cost','planned_cost'),('revenue','planned_revenue'),('probability','probability')]:
# if k1 in msg_actions:
# data[k2] = float(msg_actions[k1])
if 'partner' in msg_actions:
data['email_from'] = msg_actions['partner'][:128]
msg_from = self._decode_header(msg['From'])
res = self.write(cr, uid, select, data)
cases = self.browse(cr, uid, select)
self._history(cr, uid, cases, _('Receive'), history=True, details=body_data, email_from=msg['From'])
getattr(self,act)(cr, uid, select)
res = self.write(cr, uid, ids, vals)
cases = self.browse(cr, uid, ids)
message_id = context.get('message_id', False)
self._history(cr, uid, cases, _('Receive'), history=True, details=msg['body'], email_from=msg_from, message_id=message_id)
#getattr(self, act)(cr, uid, select)
return res
def emails_get(self, cr, uid, ids, context={}):
""" Get Emails
@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 emails IDs
@param context: A standard dictionary for contextual values
"""
Get Emails
@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 emails IDs
@param context: A standard dictionary for contextual values
"""
res = []
if isinstance(ids, (str, int, long)):

View File

@ -85,7 +85,7 @@
<field name="res_model">crm.meeting</field>
<field name="view_mode">calendar,tree,form,gantt</field>
<field name="view_id" ref="crm_case_calendar_view_meet"/>
<field name="context">{"search_default_Current":1,"search_default_section_id":section_id}</field>
<field name="context">{"search_default_current":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="view_crm_case_meetings_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_calendar_meet">

View File

@ -259,9 +259,9 @@
<filter icon="terp-crm" string="My Meetings"
domain="[('user_id','=',uid)]"
help="My Meetings" />
<filter icon="terp-crm" string="Current"
domain="[('state','in',('draft', 'open'))]"
help="Current Meetings"/>
<filter icon="terp-crm" name="current" string="Current"
domain="[('state','in',('draft', 'open'))]"
help="Current Meetings"/>
<separator orientation="vertical"/>
<field name="name" select="1" string="Subject"/>
<field name="partner_id" select="1" />

View File

@ -27,7 +27,7 @@
<field name="res_model">crm.opportunity</field>
<field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="crm_case_tree_view_oppor"/>
<field name="context">{"search_default_My Oprtnit":1,"search_default_Current":1,"search_default_section_id":section_id}</field>
<field name="context">{"search_default_my_oprtnit":1,"search_default_new_oprtnit":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view_oppor11">

View File

@ -281,7 +281,7 @@
<field name="name" string="Opportunity"/>
<field name="partner_id"/>
<field name="user_id" widget="selection">
<filter icon="terp-partner" string="My Oprtnit"
<filter icon="terp-partner" name="my_oprtnit"
domain="[('user_id','=',uid)]"
help="My Opportunities" />
<filter icon="terp-partner"

View File

@ -20,7 +20,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_phone_tree_view"/>
<field name="context">{"set_editable":True,"default_state":'open',"search_default_my_calls":1,"search_default_section_id":section_id}</field>
<field name="context">{"set_editable":True,"default_state":'open',"search_default_my_calls":1,"search_default_state":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
</record>
@ -55,7 +55,7 @@
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="crm_case_phone_tree_view"/>
<field name="domain" eval="'[(\'categ_id\',\'=\','+str(ref('categ_phone1'))+')]'"/>
<field name="context">{"default_state":'open',"search_default_My Calls":1,"search_default_section_id":section_id}</field>
<field name="context">{"default_state":'open',"search_default_my_calls":1,"search_default_state":1,"search_default_section_id":section_id}</field>
<field name="search_view_id" ref="crm.view_crm_case_phonecalls_filter"/>
</record>

View File

@ -161,7 +161,6 @@
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Phonecalls">
<group>
<filter icon="gtk-home" string="Today"
domain="[('date','&lt;', time.strftime('%%Y-%%m-%%d 23:59:59')),\
('date','&gt;=',datetime.strftime('%%Y-%%m-%%d 00:00:00'))]"
@ -177,9 +176,9 @@
<field name="name" string="Call Summary"/>
<field name="partner_id"/>
<field name="user_id" widget="selection">
<filter icon="terp-partner" string="My Calls"
domain="[('user_id','=',uid)]"
help="My Phonecalls"/>
<filter icon="terp-partner" name="my_calls"
domain="[('user_id','=',uid)]"
help="My Phonecalls"/>
<filter icon="terp-partner"
domain="[('user_id','=',False)]"
help="Unassigned Phonecalls" />
@ -190,7 +189,6 @@
domain="[('section_id','=',context.get('section_id',False))]"
help="My section" />
</field>
</group>
<newline/>
<group expand="1" string="Group By..." colspan="4">
<filter string="Partner" icon="terp-crm" domain="[]"

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.7\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-05 05:59+0000\n"
"PO-Revision-Date: 2010-02-09 23:36+0000\n"
"Last-Translator: Sebastien LANGE - http://www.Syleam.fr <Unknown>\n"
"PO-Revision-Date: 2010-04-14 15:48+0000\n"
"Last-Translator: Olivier Dony (OpenERP) <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-03-30 03:58+0000\n"
"X-Launchpad-Export-Date: 2010-04-15 03:58+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: crm
@ -1753,7 +1753,7 @@ msgstr "Planifier un appel téléphonique"
#. module: crm
#: field:crm.case,ref:0
msgid "Reference"
msgstr ""
msgstr "Référence"
#. module: crm
#: field:crm.meeting,exrule:0
@ -2408,6 +2408,8 @@ msgstr "Historique"
msgid ""
"This may help associations in their fund raising process and tracking."
msgstr ""
"Ceci peut aider les associations dans leur procédure de collecte de fonds et "
"de suivi."
#. module: crm
#: view:crm.meeting:0

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2010-01-05 05:59+0000\n"
"PO-Revision-Date: 2009-12-16 08:44+0000\n"
"Last-Translator: Casufi <Unknown>\n"
"PO-Revision-Date: 2010-04-14 03:53+0000\n"
"Last-Translator: grisha <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-03-30 03:58+0000\n"
"X-Launchpad-Export-Date: 2010-04-15 03:58+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: crm
@ -107,7 +107,7 @@ msgstr ""
#. module: crm
#: model:ir.ui.menu,name:crm.menu_hr
msgid "Human Resources"
msgstr ""
msgstr "Кадры"
#. module: crm
#: model:ir.ui.menu,name:crm.menu_action_report_crm_case_oppor_categ_categ2
@ -129,7 +129,7 @@ msgstr ""
#. module: crm
#: model:process.transition,note:crm.process_transition_opportunitymeeting0
msgid "Normal or phone meeting for opportunity"
msgstr ""
msgstr "Обычное или селекторное совещание по поводу"
#. module: crm
#: model:crm.case.stage,name:crm.stage_claim2
@ -144,7 +144,7 @@ msgstr ""
#: code:addons/crm/wizard/crm_phonecall_wizard.py:0
#, python-format
msgid "Warning !"
msgstr ""
msgstr "Внимание!"
#. module: crm
#: code:addons/crm/wizard/wizard_crm_new_send_email.py:0
@ -172,7 +172,7 @@ msgstr ""
#: wizard_field:crm.job.meeting_set,init,duration:0
#: wizard_field:crm.phonecall.meeting_set,init,duration:0
msgid "Duration (Hours)"
msgstr ""
msgstr "Длительность(в часах)"
#. module: crm
#: selection:crm.meeting,transparent:0

View File

@ -83,7 +83,7 @@
<field name="view_type">form</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_User":1}</field>
<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>

View File

@ -80,7 +80,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="view_id" ref="view_report_crm_fundraising_tree"/>
<field name="context">{"search_default_section_id":section_id,"search_default_This Year":1,"search_default_This Month":1,"search_default_User":1}</field>
<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_fundraising_filter"/>
</record>

View File

@ -79,7 +79,7 @@
<field name="res_model">crm.lead.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_section_id":section_id,"search_default_This Year":1,"search_default_This Month":1,"search_default_User":1}</field>
<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_lead_filter"/>
</record>

View File

@ -88,7 +88,7 @@
<field name="res_model">crm.opportunity.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_section_id":section_id,"search_default_This Year":1,"search_default_This Month":1,"search_default_User":1}</field>
<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_opportunity_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_report_crm_opportunity_tree">

View File

@ -77,7 +77,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="view_id" ref="view_report_crm_phonecall_tree"/>
<field name="context">{"search_default_section_id":section_id,"search_default_This Year":1,"search_default_This Month":1,"search_default_User":1}</field>
<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_phonecall_filter"/>
</record>

View File

@ -64,10 +64,12 @@
<search string="Search">
<group col="16" colspan="8">
<filter string="This Year" icon="terp-hr"
domain="[('name','=',time.localtime()[0])]" />
domain="[('name','=',time.localtime()[0])]"
name="this_year" />
<filter string="This Month" icon="terp-hr"
domain="[('month','=',time.strftime('%%m'))]" />
domain="[('month','=',time.strftime('%%m'))]"
name="this_month" />
<separator orientation="vertical" />
<filter string="Current" icon="terp-hr"
@ -104,7 +106,8 @@
<newline/>
<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'}"
name="by_user" />
<filter string="Company" icon="terp-sale"
domain="[]"
@ -142,7 +145,7 @@
<field name="res_model">crm.case.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_section_id":section_id,"search_default_This Year":1,"search_default_This Month":1}</field>
<field name="context">{"search_default_section_id":section_id,"search_default_this_year":1,"search_default_this_month":1}</field>
<field name="search_view_id" ref="view_crm_case_filter"/>
</record>

View File

@ -67,9 +67,9 @@ def html2plaintext(html, body_id=None, encoding='utf-8'):
soup = BeautifulSoup(html, parseOnlyThese=strainer, fromEncoding=encoding)
for link in soup.findAll('a'):
title = link.renderContents()
title = unicode(link)
for url in [x[1] for x in link.attrs if x[0]=='href']:
urls.append(dict(url=url, tag=str(link), title=title))
urls.append(dict(url=url, tag=unicode(link), title=title))
html = unicode(soup)
@ -162,12 +162,9 @@ class email_parser(object):
if charset:
try:
return s.decode(charset)
except UnicodeError:
pass
try:
return s.decode('ascii')
except UnicodeError:
return s
except UnicodeError:
pass
return s.decode('latin1')
def _decode_header(self, s):
from email.Header import decode_header

View File

@ -71,10 +71,14 @@ class crm_send_new_email(osv.osv_memory):
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)
message_id = None
if context.get('mail', 'new') == 'new':
case = case_pool.browse(cr, uid, res_id)
message_id = case.history_line[0].message_id
else:
hist = hist_obj.browse(cr, uid, res_id)
message_id = hist.message_id
model = hist.log_id.model_id.model
model_pool = self.pool.get(model)
case = model_pool.browse(cr, uid, hist.log_id.res_id)
@ -84,7 +88,11 @@ class crm_send_new_email(osv.osv_memory):
body = case_pool.format_body(body)
email_from = data.get('email_from', False)
case_pool._history(cr, uid, [case], _('Send'), history=True, email=data['email_to'], details=body, email_from=email_from)
case_pool._history(cr, uid, [case], _('Send'), history=True, email=data['email_to'], details=body, email_from=email_from, message_id=message_id)
x_headers = {
'References':"%s" % (message_id)
}
flag = tools.email_send(
email_from,
@ -94,6 +102,7 @@ class crm_send_new_email(osv.osv_memory):
attach=attach,
reply_to=case.section_id.reply_to,
openobject_id=str(case.id),
x_headers=x_headers
)
if flag:
if data['state'] == 'unchanged':
@ -111,7 +120,7 @@ class crm_send_new_email(osv.osv_memory):
# raise osv.except_osv(_('Email!'), ("Email Successfully Sent"))
# else:
# raise osv.except_osv(_('Warning!'), _("Email not sent !"))
return {}
def default_get(self, cr, uid, fields, context=None):

View File

@ -8,20 +8,20 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-09-08 16:32+0000\n"
"Last-Translator: ekodaq <ceo@ekosdaq.com>\n"
"PO-Revision-Date: 2010-04-15 00:44+0000\n"
"Last-Translator: Bundo <bundo@bundo.biz>\n"
"Language-Team: Korean <ko@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-03-30 04:13+0000\n"
"X-Launchpad-Export-Date: 2010-04-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: crm_profiling
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
msgstr "오브젝트 이름은 x_로 시작해야 하며, 특수 문자를 포함하면 안 됩니다 !"
#. module: crm_profiling
#: field:crm_profiling.answer,question_id:0
@ -43,12 +43,12 @@ msgstr "자식 프로파일"
#. module: crm_profiling
#: model:ir.module.module,shortdesc:crm_profiling.module_meta_information
msgid "crm_profiling management"
msgstr ""
msgstr "crm 프로파일링 관리자(_P)"
#. module: crm_profiling
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "액션 정의에서 유효하지 않은 모델 이름"
#. module: crm_profiling
#: field:crm_profiling.answer,name:0
@ -91,7 +91,7 @@ msgstr "질의서 이용"
#. module: crm_profiling
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
msgstr "유효하지 않은 아키텍처를 위한 XML 보기!"
#. module: crm_profiling
#: view:crm_profiling.questionnaire:0

View File

@ -7,24 +7,24 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-02-04 06:28+0000\n"
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"PO-Revision-Date: 2010-04-13 05:32+0000\n"
"Last-Translator: grisha <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-03-30 04:15+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: document
#: field:document.directory,create_date:0
msgid "Date Created"
msgstr ""
msgstr "Дата создания"
#. module: document
#: field:document.directory,ressource_id:0
msgid "Resource ID"
msgstr ""
msgstr "ID объекта"
#. module: document
#: field:document.directory.content,include_name:0
@ -47,7 +47,7 @@ msgstr ""
#. module: document
#: constraint:document.directory:0
msgid "Error! You can not create recursive Directories."
msgstr ""
msgstr "Ошибка! Вы не можете созадавать вложенные друг в друга директории."
#. module: document
#: model:ir.ui.menu,name:document.menu_document_configuration
@ -57,7 +57,7 @@ msgstr ""
#. module: document
#: view:ir.attachment:0
msgid "Preview"
msgstr ""
msgstr "Предпросмотр"
#. module: document
#: field:ir.attachment,store_method:0
@ -72,7 +72,7 @@ msgstr ""
#. module: document
#: field:ir.attachment,file_size:0
msgid "File Size"
msgstr ""
msgstr "Размер файла"
#. module: document
#: help:document.directory.content,include_name:0

View File

@ -0,0 +1,24 @@
#!/usr/bin/env python
#-*- coding:utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# mga@tinyerp.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import fetchmail

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
#-*- coding:utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# mga@tinyerp.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
"name" : "Fetchmail Server",
"version" : "1.0",
"depends" : ["base", "smtpclient"],
"author" : "Tiny",
"description": """Fetchail:
* Fetch email from Pop / IMAP server
* Support SSL
* Integrated with all Modules
* Automatic Email Receive
* Email based Records (Add, Update)
""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
'init_xml': [],
'update_xml': [
"fetchmail_view.xml",
"fetchmail_data.xml"
],
'demo_xml': [
],
'installable': True,
'active': False,
}

View File

@ -0,0 +1,405 @@
#!/usr/bin/env python
#-*- coding:utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# mga@tinyerp.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import os
import re
import time
import email
import binascii
import mimetypes
from imaplib import IMAP4
from imaplib import IMAP4_SSL
from email.header import Header
from email.header import decode_header
import netsvc
from osv import osv
from osv import fields
from tools.translate import _
command_re = re.compile("^Set-([a-z]+) *: *(.+)$", re.I + re.UNICODE)
logger = netsvc.Logger()
def html2plaintext(html, body_id=None, encoding='utf-8'):
## (c) Fry-IT, www.fry-it.com, 2007
## <peter@fry-it.com>
## download here: http://www.peterbe.com/plog/html2plaintext
""" from an HTML text, convert the HTML to plain text.
If @body_id is provided then this is the tag where the
body (not necessarily <body>) starts.
"""
try:
from BeautifulSoup import BeautifulSoup, SoupStrainer, Comment
except:
return html
urls = []
if body_id is not None:
strainer = SoupStrainer(id=body_id)
else:
strainer = SoupStrainer('body')
soup = BeautifulSoup(html, parseOnlyThese=strainer, fromEncoding=encoding)
for link in soup.findAll('a'):
title = link.renderContents()
for url in [x[1] for x in link.attrs if x[0]=='href']:
urls.append(dict(url=url, tag=str(link), title=title))
html = soup.__str__()
url_index = []
i = 0
for d in urls:
if d['title'] == d['url'] or 'http://'+d['title'] == d['url']:
html = html.replace(d['tag'], d['url'])
else:
i += 1
html = html.replace(d['tag'], '%s [%s]' % (d['title'], i))
url_index.append(d['url'])
html = html.replace('<strong>','*').replace('</strong>','*')
html = html.replace('<b>','*').replace('</b>','*')
html = html.replace('<h3>','*').replace('</h3>','*')
html = html.replace('<h2>','**').replace('</h2>','**')
html = html.replace('<h1>','**').replace('</h1>','**')
html = html.replace('<em>','/').replace('</em>','/')
# the only line breaks we respect is those of ending tags and
# breaks
html = html.replace('\n',' ')
html = html.replace('<br>', '\n')
html = html.replace('<tr>', '\n')
html = html.replace('</p>', '\n\n')
html = re.sub('<br\s*/>', '\n', html)
html = html.replace(' ' * 2, ' ')
# for all other tags we failed to clean up, just remove then and
# complain about them on the stderr
def desperate_fixer(g):
#print >>sys.stderr, "failed to clean up %s" % str(g.group())
return ' '
html = re.sub('<.*?>', desperate_fixer, html)
# lstrip all lines
html = '\n'.join([x.lstrip() for x in html.splitlines()])
for i, url in enumerate(url_index):
if i == 0:
html += '\n\n'
html += '[%s] %s\n' % (i+1, url)
return html
class mail_server(osv.osv):
_name = 'email.server'
_description = "POP/IMAP Server"
_columns = {
'name':fields.char('Name', size=256, required=True, readonly=False),
'active':fields.boolean('Active', required=False),
'state':fields.selection([
('draft','Not Confirme'),
('wating','Waiting for Verification'),
('done','Confirmed'),
],'State', select=True, readonly=True),
'server' : fields.char('SMTP Server', size=256, required=True, readonly=True, states={'draft':[('readonly',False)]}),
'port' : fields.integer('SMTP Port', required=True, readonly=True, states={'draft':[('readonly',False)]}),
'type':fields.selection([
('pop','POP Server'),
('imap','IMAP Server'),
],'State', select=True, readonly=True),
'is_ssl':fields.boolean('SSL ?', required=False),
'date': fields.date('Date'),
'user' : fields.char('User Name', size=256, required=True, readonly=True, states={'draft':[('readonly',False)]}),
'password' : fields.char('Password', size=1024, invisible=True, required=True, readonly=True, states={'draft':[('readonly',False)]}),
'note': fields.text('Description'),
'action_id':fields.many2one('ir.actions.server', 'Reply Email', required=False, domain="[('state','=','email')]"),
'object_id': fields.many2one('ir.model',"Model", required=True),
'priority': fields.integer('Server Priority', readonly=True, states={'draft':[('readonly',False)]}, help="Priority between 0 to 10, select define the order of Processing"),
}
_defaults = {
'type': lambda *a: "imap",
'state': lambda *a: "draft",
'active': lambda *a: True,
'priority': lambda *a: 5,
'date': lambda *a: time.strftime('%Y-%m-%d'),
}
def check_duplicate(self, cr, uid, ids):
vals = self.read(cr, uid, ids, ['user', 'password'])[0]
cr.execute("select count(id) from email_server where user='%s' and password='%s'" % (vals['user'], vals['password']))
res = cr.fetchone()
if res:
if res[0] > 1:
return False
return True
_constraints = [
(check_duplicate, 'Warning! Can\'t have duplicate server configuration!', ['user', 'password'])
]
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False):
port = 0
if server_type == 'pop':
port = ssl and 995 or 110
elif server_type == 'imap':
port = ssl and 993 or 143
return {'value':{'port':port}}
def _process_email(self, cr, uid, server, message, context={}):
history_pool = self.pool.get('mail.server.history')
msg_txt = email.message_from_string(message)
message_id = msg_txt.get('Message-ID', False)
msg = {}
if not message_id:
return False
fields = msg_txt.keys()
msg['id'] = message_id
msg['message-id'] = message_id
if 'Subject' in fields:
msg['subject'] = msg_txt.get('Subject')
if 'Content-Type' in fields:
msg['content-type'] = msg_txt.get('Content-Type')
if 'From' in fields:
msg['from'] = msg_txt.get('From')
if 'Delivered-To' in fields:
msg['to'] = msg_txt.get('Delivered-To')
if 'Cc' in fields:
msg['cc'] = msg_txt.get('Cc')
if 'Reply-To' in fields:
msg['reply'] = msg_txt.get('Reply-To')
if 'Date' in fields:
msg['date'] = msg_txt.get('Date')
if 'Content-Transfer-Encoding' in fields:
msg['encoding'] = msg_txt.get('Content-Transfer-Encoding')
if 'References' in fields:
msg['references'] = msg_txt.get('References')
if 'X-openerp-caseid' in fields:
msg['caseid'] = msg_txt.get('X-openerp-caseid')
if 'X-Priority' in fields:
msg['priority'] = msg_txt.get('X-priority', '3 (Normal)').split(' ')[0]
if not msg_txt.is_multipart() or 'text/plain' in msg.get('content-type', None):
msg['body'] = msg_txt.get_payload(decode=True)
attachents = {}
if msg_txt.is_multipart() or 'multipart/alternative' in msg.get('content-type', None):
body = ""
counter = 1
for part in msg_txt.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get_content_maintype()=='text':
content = part.get_payload(decode=True)
if part.get_content_subtype() == 'html':
body = html2plaintext(content)
elif part.get_content_subtype() == 'plain':
body = content
filename = part.get_filename()
if filename :
attachents[filename] = part.get_payload(decode=True)
elif part.get_content_maintype()=='application' or part.get_content_maintype()=='image' or part.get_content_maintype()=='text':
filename = part.get_filename();
if filename :
attachents[filename] = part.get_payload(decode=True)
else:
body += part.get_payload(decode=True)
msg['body'] = body
msg['attachments'] = attachents
if msg.get('references', False):
id = False
ref = msg.get('references').split('\r\n')
if ref:
hids = history_pool.search(cr, uid, [('name','=',ref[0])])
if hids:
id = hids[0]
history = history_pool.browse(cr, uid, id)
model_pool = self.pool.get(server.object_id.model)
context.update({
'message_id':ref[0]
})
model_pool.message_update(cr, uid, [history.res_id], msg, context=context)
res_id = id
else:
model_pool = self.pool.get(server.object_id.model)
res_id = model_pool.message_new(cr, uid, msg, context)
for attactment in attachents or []:
data_attach = {
'name': attactment,
'datas':binascii.b2a_base64(str(attachents.get(attactment))),
'datas_fname': attactment,
'description': 'Mail attachment',
'res_model': server.object_id.model,
'res_id': res_id,
}
self.pool.get('ir.attachment').create(cr, uid, data_attach)
if server.action_id:
action_pool = self.pool.get('ir.actions.server')
action_pool.run(cr, uid, [server.action_id.id], {'active_id':res_id, 'active_ids':[res_id]})
res = {
'name': message_id,
'res_id': res_id,
'server_id': server.id,
'note': msg.get('body', msg.get('from')),
'ref_id':msg.get('references', msg.get('id')),
'type':server.type
}
his_id = history_pool.create(cr, uid, res)
return res_id
def _fetch_mails(self, cr, uid, ids=False, context={}):
if not ids:
ids = self.search(cr, uid, [])
return self.fetch_mail(cr, uid, ids, context)
def fetch_mail(self, cr, uid, ids, context={}):
fp = os.popen('ping www.google.com -c 1 -w 5',"r")
if not fp.read():
logger.notifyChannel('imap', netsvc.LOG_WARNING, 'No address associated with hostname !')
for server in self.browse(cr, uid, ids, context):
logger.notifyChannel('imap', netsvc.LOG_INFO, 'fetchmail start checking for new emails on %s' % (server.name))
try:
if server.type == 'imap':
imap_server = None
if server.is_ssl:
imap_server = IMAP4_SSL(server.server, int(server.port))
else:
imap_server = IMAP4(server.server, int(server.port))
imap_server.login(server.user, server.password)
imap_server.select()
result, data = imap_server.search(None, '(UNSEEN)')
count = 0
for num in data[0].split():
result, data = imap_server.fetch(num, '(RFC822)')
self._process_email(cr, uid, server, data[0][1], context)
imap_server.store(num, '+FLAGS', '\\Seen')
count += 1
logger.notifyChannel('imap', netsvc.LOG_INFO, 'fetchmail fetch %s email(s) from %s' % (count, server.name))
imap_server.close()
imap_server.logout()
except Exception, e:
logger.notifyChannel('IMAP', netsvc.LOG_WARNING, '%s' % (e))
return True
mail_server()
class mail_server_history(osv.osv):
_name = "mail.server.history"
_description = "Mail Server History"
_columns = {
'name': fields.char('Message Id', size=256, readonly=True, help="Message Id in Email Server.", select=True),
'ref_id': fields.char('Referance Id', size=256, readonly=True, help="Message Id in Email Server.", select=True),
'res_id': fields.integer("Resource ID", readonly=True, select=True),
'server_id': fields.many2one('email.server',"Mail Server", readonly=True, select=True),
'model_id':fields.related('server_id', 'object_id', type='many2one', relation='ir.model', string='Model', readonly=True, select=True),
'note': fields.text('Notes', readonly=True),
'create_date': fields.datetime('Created Date', readonly=True),
'type':fields.selection([
('pop','POP Server'),
('imap','IMAP Server'),
],'State', select=True, readonly=True),
}
_order = 'id desc'
mail_server_history()
class fetchmail_tool(osv.osv):
"""
OpenERP Model : fetchmail_tool
"""
_name = 'email.server.tools'
_description = "Email Tools"
_auto = False
def to_email(self, text):
_email = re.compile(r'.*<.*@.*\..*>', re.UNICODE)
def record(path):
eml = path.group()
index = eml.index('<')
eml = eml[index:-1].replace('<','').replace('>','')
return eml
bits = _email.sub(record, text)
return bits
def get_partner(self, cr, uid, from_email, 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 from_email: email address based on that function will search for the correct
"""
res = {
'partner_address_id': False,
'partner_id': False
}
from_email = self.to_email(from_email)
address_ids = self.pool.get('res.partner.address').search(cr, uid, [('email', '=', from_email)])
if address_ids:
address = self.pool.get('res.partner.address').browse(cr, uid, address_ids[0])
res['partner_address_id'] = address_ids[0]
res['partner_id'] = address.partner_id.id
return res
fetchmail_tool()

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<data noupdate="1">
<record id="ir_cron_mail_gateway_action" model="ir.cron">
<field name="name">Check Email (Fetchmail)</field>
<field name="name">Fetchmail Service</field>
<field name="interval_number">5</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field eval="False" name="doall"/>
<field eval="'mail.gateway'" name="model"/>
<field eval="'email.server'" name="model"/>
<field eval="'_fetch_mails'" name="function"/>
<field eval="'()'" name="args"/>
</record>

View File

@ -0,0 +1,177 @@
<?xml version="1.0"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_email_server_tree">
<field name="name">email.server.tree</field>
<field name="model">email.server</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="POP/IMAP Servers">
<field name="name" select="1"/>
<field name="type" select="1"/>
<field name="user" select="1"/>
<field name="is_ssl" select="1"/>
<field name="state" select="1"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_email_server_form">
<field name="name">email.server.form</field>
<field name="model">email.server</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="POP/IMAP Server">
<group col="6" colspan="4">
<field name="name" select="1" colspan="4"/>
<field name="type" select="1" on_change="onchange_server_type(type, is_ssl)"/>
<field name="date" select="1"/>
<field name="is_ssl" select="1" on_change="onchange_server_type(type, is_ssl)"/>
<field name="active" select="1"/>
</group>
<notebook colspan="4">
<page string="Server &amp; Login">
<group col="2" colspan="2">
<separator string="Server Information" colspan="2"/>
<field name="server" />
<field name="port" />
</group>
<group col="2" colspan="2">
<separator string="Login Information" colspan="2"/>
<field name="user" />
<field name="password" password="True" />
</group>
<group col="2" colspan="2">
<separator string="Auto Reply?" colspan="2"/>
<field name="action_id"/>
</group>
<group col="2" colspan="2">
<separator string="Process Parameter" colspan="2"/>
<field name="object_id"/>
<field name="priority"/>
</group>
<separator string="Description" colspan="4"/>
<field name="note" colspan="4" nolabel="1"/>
</page>
</notebook>
<group col="6" colspan="4">
<field name="state" select="1"/>
<button string="Verify Server" type="object" name="fetch_mail"/>
<button string="Schedule"/>
</group>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_email_server_tree">
<field name="name">POP Servers</field>
<field name="res_model">email.server</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_email_server_tree"/>
<field name="context">{'type':'pop'}</field>
<field name="domain">[('type','=','pop')]</field>
</record>
<menuitem
parent="smtpclient.menu_smtpclient_administration_server"
id="menu_action_email_server_tree"
action="action_email_server_tree"
/>
<record model="ir.actions.act_window" id="action_email_server_tree_imap">
<field name="name">IMAP Servers</field>
<field name="res_model">email.server</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_email_server_tree"/>
<field name="context">{'type':'imap'}</field>
<field name="domain">[('type','=','imap')]</field>
</record>
<menuitem
parent="smtpclient.menu_smtpclient_administration_server"
id="menu_action_email_server_tree_imap"
action="action_email_server_tree_imap"
/>
<record model="ir.ui.view" id="view_mail_server_history_tree">
<field name="name">mail.server.history.tree</field>
<field name="model">mail.server.history</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Received Mail History">
<field name="server_id" select="1"/>
<field name="create_date" select="1"/>
<field name="model_id"/>
<field name="name" select="1"/>
<field name="ref_id"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_email_server_history_form">
<field name="name">mail.server.history.form</field>
<field name="model">mail.server.history</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Email History">
<group col="6" colspan="4">
<field name="server_id" select="1"/>
<field name="create_date" select="1"/>
</group>
<group col="2" colspan="2">
<separator string="Resource Information" colspan="2"/>
<field name="model_id" select="1"/>
<field name="res_id"/>
</group>
<group col="2" colspan="2">
<separator string="Meta Information" colspan="2"/>
<field name="name" select="1"/>
<field name="ref_id"/>
</group>
<newline/>
<separator string="Description" colspan="4"/>
<field name="note" colspan="4" nolabel="1"/>
</form>
</field>
</record>
<act_window
context="{'server_id': active_id}"
domain="[('server_id', '=', active_id)]"
id="act_server_history" name="Email History"
res_model="mail.server.history" src_model="email.server"/>
<record model="ir.actions.act_window" id="action_email_server_history_tree">
<field name="name">Receive Email History</field>
<field name="res_model">mail.server.history</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_mail_server_history_tree"/>
<field name="context">{'type':'imap'}</field>
<field name="domain">[('type','=','imap')]</field>
</record>
<menuitem
parent="menu_action_email_server_tree_imap"
id="menu_action_email_server_history_tree"
action="action_email_server_history_tree"/>
<record model="ir.actions.act_window" id="action_email_server_history_tree_pop">
<field name="name">Receive Email History</field>
<field name="res_model">mail.server.history</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_mail_server_history_tree"/>
<field name="context">{'type':'pop'}</field>
<field name="domain">[('type','=','pop')]</field>
</record>
<menuitem
parent="menu_action_email_server_tree"
id="menu_action_email_server_history_tree_pop"
action="action_email_server_history_tree_pop"/>
</data>
</openerp>

View File

@ -8,13 +8,13 @@ msgstr ""
"Project-Id-Version: openobject-addons\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-09-08 13:55+0000\n"
"Last-Translator: ekodaq <ceo@ekosdaq.com>\n"
"PO-Revision-Date: 2010-04-15 00:59+0000\n"
"Last-Translator: Bundo <bundo@bundo.biz>\n"
"Language-Team: Korean <ko@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-03-30 04:12+0000\n"
"X-Launchpad-Export-Date: 2010-04-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: hr
@ -58,7 +58,7 @@ msgstr "페어런트"
#. module: hr
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "액션 정의에 잘못된 모델 이름이 있습니다."
#. module: hr
#: view:hr.department:0

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-11-10 14:44+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
"PO-Revision-Date: 2010-04-13 07:40+0000\n"
"Last-Translator: grisha <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-03-30 04:12+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: hr
@ -36,7 +36,7 @@ msgstr "Ошибка! Невозможно создать рекурсивные
#. module: hr
#: field:hr.employee,sinid:0
msgid "SIN No"
msgstr ""
msgstr "Карта социальной защиты(ИНН)"
#. module: hr
#: model:ir.module.module,shortdesc:hr.module_meta_information
@ -57,7 +57,7 @@ msgstr ""
#. module: hr
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Недопустимое имя модели в определении действия"
#. module: hr
#: view:hr.department:0
@ -67,7 +67,7 @@ msgstr "Отдел"
#. module: hr
#: model:process.transition,name:hr.process_transition_contactofemployee0
msgid "Contact of employee"
msgstr ""
msgstr "Контакты сотрудника"
#. module: hr
#: field:hr.employee,work_email:0
@ -93,7 +93,7 @@ msgstr "Пятница"
#. module: hr
#: field:hr.department,parent_id:0
msgid "Parent Department"
msgstr ""
msgstr "Вышестоящее подразделение"
#. module: hr
#: view:hr.department:0
@ -110,7 +110,7 @@ msgstr "Работа с"
#. module: hr
#: model:ir.actions.act_window,name:hr.action2
msgid "Employee Hierarchy"
msgstr ""
msgstr "Структура подчинения (сотрудников)"
#. module: hr
#: model:ir.ui.menu,name:hr.menu_hr_configuration
@ -141,7 +141,7 @@ msgstr "Структура сотрудников"
#. module: hr
#: view:hr.employee:0
msgid "Social IDs"
msgstr ""
msgstr "Страховое удостоверение"
#. module: hr
#: field:hr.employee,work_phone:0
@ -189,12 +189,12 @@ msgstr "Участники"
#. module: hr
#: field:hr.employee,ssnid:0
msgid "SSN No"
msgstr ""
msgstr "Карта социальной защиты (ИНН)"
#. module: hr
#: model:process.transition,note:hr.process_transition_contactofemployee0
msgid "Fill up contact information"
msgstr ""
msgstr "Заполните контактную информацию"
#. module: hr
#: constraint:ir.ui.view:0
@ -222,7 +222,7 @@ msgstr "Отделы"
#. module: hr
#: model:process.node,name:hr.process_node_employeecontact0
msgid "Employee Contact"
msgstr ""
msgstr "Контакты сотрудника"
#. module: hr
#: selection:hr.employee,marital:0
@ -242,7 +242,7 @@ msgstr "Мужской"
#. module: hr
#: model:process.transition,note:hr.process_transition_employeeuser0
msgid "Create openerp user"
msgstr ""
msgstr "Создать пользователя OpenERP"
#. module: hr
#: view:hr.employee.category:0
@ -305,7 +305,7 @@ msgstr "День недели"
#. module: hr
#: field:hr.employee,birthday:0
msgid "Birthday"
msgstr ""
msgstr "Дата рождения"
#. module: hr
#: field:hr.employee,active:0
@ -325,7 +325,7 @@ msgstr ""
#. module: hr
#: model:process.node,note:hr.process_node_openerpuser0
msgid "Create OpenERP User"
msgstr ""
msgstr "Создать пользователя OpenERP"
#. module: hr
#: model:process.node,note:hr.process_node_employee0
@ -361,7 +361,7 @@ msgstr ""
#. module: hr
#: field:hr.employee,address_id:0
msgid "Working Address"
msgstr ""
msgstr "Рабочий адрес"
#. module: hr
#: field:hr.employee,marital:0
@ -416,7 +416,7 @@ msgstr "Категории сотрудников"
#. module: hr
#: field:hr.employee,address_home_id:0
msgid "Home Address"
msgstr ""
msgstr "Домашний адрес"
#. module: hr
#: view:hr.department:0
@ -458,7 +458,7 @@ msgstr "Название отдела"
#. module: hr
#: field:hr.department,child_ids:0
msgid "Child Departments"
msgstr ""
msgstr "Подчиненные подразделения"
#. module: hr
#: view:hr.employee:0
@ -468,7 +468,7 @@ msgstr ""
#. module: hr
#: model:process.node,note:hr.process_node_employeecontact0
msgid "Fill up employee's contact information"
msgstr ""
msgstr "Заполните контактную информацию о сотруднике"
#. module: hr
#: field:hr.department,manager_id:0
@ -480,7 +480,7 @@ msgstr "Менеджер"
#: model:ir.actions.act_window,name:hr.open_view_employee_list_my
#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my
msgid "All Employees"
msgstr ""
msgstr "Все сотрудники"
#. module: hr
#: selection:hr.timesheet,dayofweek:0

View File

@ -311,9 +311,9 @@
<field name="arch" type="xml">
<search string="Search Evaluation">
<group col='10' colspan='4'>
<filter icon="terp-crm" string="To Do" domain="[('state','=','waiting_answer')]"/>
<filter icon="terp-crm" string="To Do" name="todo" domain="[('state','=','waiting_answer')]"/>
<separator orientation="vertical"/>
<filter string="My" icon="terp-partner" domain="[('user_id','=',uid)]"/>
<filter string="My" icon="terp-partner" name="my" domain="[('user_id','=',uid)]"/>
<separator orientation="vertical"/>
<filter icon="terp-stock" string="Late" domain="[('date_deadline','&lt;',current_date)]"/>
<separator orientation="vertical"/>
@ -329,7 +329,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="domain">[('is_evaluation' ,'=', True)]</field>
<field name="context">{"search_default_To Do":1,"search_default_My":1}</field>
<field name="context">{"search_default_todo":1,"search_default_my":1}</field>
<field name="search_view_id" ref="view_hr_evaluation_interview_search"/>
</record>

View File

@ -148,7 +148,7 @@
<field name="date" select='1'/>
<field name="user_id" select="1" widget="selection">
<filter
icon="gtk-execute" string="My Expns"
icon="gtk-execute" name="my_expns"
help="My Expenses"
domain="[('user_id','=',uid)]"/>
<filter icon="terp-hr"
@ -172,7 +172,7 @@
<field name="name">Expenses</field>
<field name="res_model">hr.expense.expense</field>
<field name="view_type">form</field>
<field name="context">{"search_default_My Expns":1}</field>
<field name="context">{"search_default_my_expns":1}</field>
<field name="search_view_id" ref="view_hr_expense_filter"/>
</record>

View File

@ -56,7 +56,8 @@
<filter icon="terp-hr"
string="Draft"
domain="[('state','=','draft')]"/>
<filter icon="terp-hr" string="Expenses"
<filter icon="terp-hr" name="expenses"
string="Expenses"
domain="[('state','&lt;&gt;','draft'),('state','&lt;&gt;','cancelled')]"/>
<separator orientation="vertical"/>
<field name="product_id"/>
@ -70,7 +71,7 @@
<newline/>
<group expand="1" string="Group By...">
<filter string="Company" icon="terp-hr" context="{'group_by':'company_id'}"/>
<filter string="User" icon="terp-hr" context="{'group_by':'user_id'}"/>
<filter string="User" name="by_user" icon="terp-hr" context="{'group_by':'user_id'}"/>
<filter string="Employee" icon="terp-hr" context="{'group_by':'employee_id'}"/>
<filter string="Department" icon="terp-hr" context="{'group_by':'department_id'}"/>
<separator orientation="vertical"/>
@ -89,7 +90,7 @@
<field name="res_model">hr.expense.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_Expenses":1,"search_default_User":1}</field>
<field name="context">{"search_default_expenses":1,"search_default_by_user":1}</field>
<field name="search_view_id" ref="view_hr_expense_report_search"/>
</record>

View File

@ -9,7 +9,7 @@
<field name="res_model">hr.applicant</field>
<field name="view_mode">tree,form,graph</field>
<field name="view_id" ref="crm_case_tree_view_job"/>
<field name="context">{"search_default_Current":1,"search_default_My Recrui":1}</field>
<field name="context">{"search_default_current":1,"search_default_my_recrui":1}</field>
<field name="search_view_id" ref="view_crm_case_jobs_filter"/>
</record>

View File

@ -202,7 +202,7 @@
<field name="arch" type="xml">
<search string="Search Jobs">
<group>
<filter icon="gtk-new" string="Current"
<filter icon="gtk-new" string="Current" name="current"
domain="[('state','in',('draft','open'))]"
help="All new and in progress jobs"
/>
@ -224,7 +224,7 @@
<field name="job_id" widget="selection"/>
<newline/>
<field name="user_id" widget="selection">
<filter domain="[('user_id','=',uid)]" string="My Recrui" help="My Recruitements" icon="gtk-execute"/>
<filter domain="[('user_id','=',uid)]" name="my_recrui" help="My Recruitements" icon="gtk-execute"/>
<filter domain="[('user_id','=',False)]" help="Unassigned Recruitements" icon="gtk-execute" separator="1"/>
</field>
<field name="department_id" widget="selection" string="Department" context="{'invisible_department': False}">

View File

@ -39,7 +39,6 @@
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Recruitments">
<group>
<filter icon="terp-hr"
string="This Year"
domain="[('year','=',time.strftime('%%Y'))]"
@ -59,9 +58,8 @@
string="My Recruitments"
domain="[('user_id','=',uid)]"/>
</field>
</group>
<newline/>
<group expand="1" string="Extended options...">
<group expand="1" string="Extended options..." colspan="10" col="12">
<filter icon="terp-hr"
string="Not Good"
domain="[('priority','=','5')]"/>
@ -78,9 +76,10 @@
string="Excellent"
domain="[('priority','=','1')]"/>
</group>
<newline/>
<group expand="1" string="Group By...">
<filter string="User" icon="terp-hr" domain="[]" context="{'group_by':'user_id'}" />
<group expand="1" string="Group By..." colspan="10" col="12">
<filter string="User" name="by_user" icon="terp-hr" domain="[]" context="{'group_by':'user_id'}" />
<filter string="Company" icon="terp-hr" domain="[]" context="{'group_by':'company_id'}"/>
<filter string="Stage" icon="terp-hr" domain="[]" context="{'group_by':'stage_id'}"/>
<separator orientation="vertical"/>
@ -101,7 +100,7 @@
<field name="res_model">hr.recruitment.report</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_User":1}</field>
<field name="context">{"search_default_user_id":1,"search_default_by_user":1}</field>
<field name="search_view_id" ref="view_hr_recruitment_report_search"/>
</record>
<menuitem id="hr.menu_hr_reporting" name="Reporting" parent="hr.menu_hr_root"/>

View File

@ -19,11 +19,5 @@
#
##############################################################################
import mail_gateway
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -19,23 +19,23 @@
#
##############################################################################
{
'name': 'eMail Gateway',
'name': 'Email Gateway System',
'version': '1.0',
'category': 'Generic Modules/eMail Gate',
'description': """
The generic email gateway system for the synchronisation interface
between mails and Open Objects.
""",
'category': 'Generic Modules/Mail Service',
'description': """The generic email gateway system allows to send and receive emails
* IMAP / IMAP with SSL
* POP / POP with SSL
* SMTP / SMTP with TLS
* ACL basd access polocy
* Queing and History for Emails
* Easy Integration with any Module""",
'author': 'Tiny',
'website': 'http://www.openerp.com',
'depends': ['base', 'process'],
'init_xml': ['mail_gateway_data.xml',],
'depends': ['smtpclient', 'fetchmail'],
'init_xml': [],
'update_xml': [
'mail_gateway_wizard.xml',
'mail_gateway_view.xml',
'security/ir.model.access.csv',
],
'demo_xml': [],
'installable': True,

View File

@ -1,409 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
###########################################################################################
import re
import email, mimetypes
from email.Header import decode_header
from email.MIMEText import MIMEText
import xmlrpclib
import os
import binascii
import time, socket
from tools.translate import _
import tools
from osv import fields,osv,orm
from osv.orm import except_orm
import email
import netsvc
from poplib import POP3, POP3_SSL
from imaplib import IMAP4, IMAP4_SSL
class mail_gateway_server(osv.osv):
_name = "mail.gateway.server"
_description = "Email Gateway Server"
_columns = {
'name': fields.char('Server Address',size=64,required=True ,help="IMAP/POP Address Of Email gateway Server"),
'login': fields.char('User',size=64,required=True,help="User Login Id of Email gateway"),
'password': fields.char('Password',size=64,required=True,help="User Password Of Email gateway"),
'server_type': fields.selection([("pop","POP"),("imap","Imap")],"Type of Server", required=True, help="Type of Email gateway Server"),
'port': fields.integer("Port" , help="Port Of Email gateway Server. If port is omitted, the standard POP3 port (110) is used for POP EMail Server and the standard IMAP4 port (143) is used for IMAP Sever."),
'ssl': fields.boolean('SSL',help ="Use Secure Authentication"),
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the email gateway server without removing it."),
}
_defaults = {
'server_type':lambda * a:'pop',
'active':lambda * a:True,
}
def check_duplicate(self, cr, uid, ids):
vals = self.read(cr, uid, ids, ['name', 'login'])[0]
cr.execute("select count(id) from mail_gateway_server \
where name='%s' and login='%s'" % \
(vals['name'], vals['login']))
res = cr.fetchone()
if res:
if res[0] > 1:
return False
return True
_constraints = [
(check_duplicate, 'Warning! Can\'t have duplicate server configuration!', ['name', 'login'])
]
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False):
port = 0
if server_type == 'pop':
port = ssl and 995 or 110
elif server_type == 'imap':
port = ssl and 993 or 143
return {'value':{'port':port}}
mail_gateway_server()
class mail_gateway(osv.osv):
_name = "mail.gateway"
_description = "Email Gateway"
_columns = {
'name': fields.char('Name',size=64,help="Name of Mail Gateway."),
'server_id': fields.many2one('mail.gateway.server',"Gateway Server", required=True),
'object_id': fields.many2one('ir.model',"Model", required=True),
'reply_to': fields.char('TO', size=64, help="Email address used in reply to/from of outgoing messages"),
'email_default': fields.char('Default eMail',size=64,help="Default eMail in case of any trouble."),
'mail_history': fields.one2many("mail.gateway.history","gateway_id","History", readonly=True)
}
_defaults = {
'reply_to': lambda * a:tools.config.get('email_from',False)
}
def _fetch_mails(self, cr, uid, ids=False, context={}):
'''
Function called by the scheduler to fetch mails
'''
cr.execute('select * from mail_gateway gateway \
inner join mail_gateway_server server \
on server.id = gateway.server_id where server.active = True')
ids2 = map(lambda x: x[0], cr.fetchall() or [])
return self.fetch_mails(cr, uid, ids=ids2, context=context)
def parse_mail(self, cr, uid, gateway_id, email_message, context={}):
msg_id, res_id, note = (False, False, False)
mail_history_obj = self.pool.get('mail.gateway.history')
mailgateway = self.browse(cr, uid, gateway_id, context=context)
try :
msg_txt = email.message_from_string(email_message)
msg_id = msg_txt['Message-ID']
res_id = self.msg_parse(cr, uid, gateway_id, msg_txt)
except Exception, e:
import traceback
note = "Error in Parsing Mail: %s " %(str(e))
netsvc.Logger().notifyChannel('Emailgate: Parsing mail:%s' % (mailgateway and (mailgateway.name or
'%s (%s)'%(mailgateway.server_id.login, mailgateway.server_id.name))) or ''
, netsvc.LOG_ERROR, traceback.format_exc())
mail_history_obj.create(cr, uid, {'name': msg_id, 'res_id': res_id, 'gateway_id': mailgateway.id, 'note': note})
return res_id, note
def fetch_mails(self, cr, uid, ids=[], context={}):
log_messages = []
mailgate_server = False
new_messages = []
for mailgateway in self.browse(cr, uid, ids):
try :
mailgate_server = mailgateway.server_id
if not mailgate_server.active:
continue
mailgate_name = mailgateway.name or "%s (%s)" % (mailgate_server.login, mailgate_server.name)
res_model = mailgateway.object_id.name
log_messages.append("Mail Server : %s" % mailgate_name)
log_messages.append("="*40)
new_messages = []
if mailgate_server.server_type == 'pop':
if mailgate_server.ssl:
pop_server = POP3_SSL(mailgate_server.name or 'localhost', mailgate_server.port or 995)
else:
pop_server = POP3(mailgate_server.name or 'localhost', mailgate_server.port or 110)
pop_server.user(mailgate_server.login)
pop_server.pass_(mailgate_server.password)
pop_server.list()
(numMsgs, totalSize) = pop_server.stat()
for i in range(1, numMsgs + 1):
(header, msges, octets) = pop_server.retr(i)
res_id, note = self.parse_mail(cr, uid, mailgateway.id, '\n'.join(msges))
log = ''
if res_id:
log = _('Object Successfully Created : %d of %s'% (res_id, res_model))
if note:
log = note
log_messages.append(log)
new_messages.append(i)
pop_server.quit()
elif mailgate_server.server_type == 'imap':
if mailgate_server.ssl:
imap_server = IMAP4_SSL(mailgate_server.name or 'localhost', mailgate_server.port or 993)
else:
imap_server = IMAP4(mailgate_server.name or 'localhost', mailgate_server.port or 143)
imap_server.login(mailgate_server.login, mailgate_server.password)
imap_server.select()
typ, data = imap_server.search(None, '(UNSEEN)')
for num in data[0].split():
typ, data = imap_server.fetch(num, '(RFC822)')
res_id, note = self.parse_mail(cr, uid, mailgateway.id, data[0][1])
log = ''
if res_id:
log = _('Object Successfully Created/Modified: %d of %s'% (res_id, res_model))
if note:
log = note
log_messages.append(log)
new_messages.append(num)
imap_server.close()
imap_server.logout()
except Exception, e:
import traceback
log_messages.append("Error in Fetching Mail: %s " %(str(e)))
netsvc.Logger().notifyChannel('Emailgate: Fetching mail:[%d]%s' %
(mailgate_server and mailgate_server.id or 0, mailgate_server and mailgate_server.name or ''),
netsvc.LOG_ERROR, traceback.format_exc())
log_messages.append("-"*25)
log_messages.append("Total Read Mail: %d\n\n" %(len(new_messages)))
return log_messages
def emails_get(self, email_from):
res = tools.email_re.search(email_from)
return res and res.group(1)
def partner_get(self, cr, uid, email):
mail = self.emails_get(email)
adr_ids = self.pool.get('res.partner.address').search(cr, uid, [('email', '=', mail)])
if not adr_ids:
return {}
adr = self.pool.get('res.partner.address').read(cr, uid, adr_ids, ['partner_id'])
res = {}
if len(adr):
res = {
'partner_address_id': adr[0]['id'],
'partner_id': adr[0].get('partner_id',False) and adr[0]['partner_id'][0] or False
}
return res
def _to_decode(self, s, charsets):
for charset in charsets:
if charset:
try:
return s.decode(charset)
except UnicodeError:
pass
try:
return s.decode('ascii')
except UnicodeError:
return s
def _decode_header(self, s):
from email.Header import decode_header
s = decode_header(s)
return ''.join(map(lambda x:self._to_decode(x[0], x[1]), s))
def msg_new(self, cr, uid, msg, model):
message = self.msg_body_get(msg)
res_model = self.pool.get(model)
res_id = res_model.msg_new(cr, uid, msg)
if res_id:
attachments = message['attachment']
for attach in attachments or []:
data_attach = {
'name': str(attach),
'datas':binascii.b2a_base64(str(attachments[attach])),
'datas_fname': str(attach),
'description': 'Mail attachment',
'res_model': model,
'res_id': res_id
}
self.pool.get('ir.attachment').create(cr, uid, data_attach)
return res_id
def msg_body_get(self, msg):
message = {};
message['body'] = '';
message['attachment'] = {};
attachment = message['attachment'];
counter = 1;
def replace(match):
return ''
for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get_content_maintype()=='text':
buf = part.get_payload(decode=True)
if buf:
txt = self._to_decode(buf, part.get_charsets())
txt = re.sub("<(\w)>", replace, txt)
txt = re.sub("<\/(\w)>", replace, txt)
if txt and part.get_content_subtype() == 'plain':
message['body'] += txt
elif txt and part.get_content_subtype() == 'html':
message['body'] += tools.html2plaintext(txt)
filename = part.get_filename();
if filename :
attachment[filename] = part.get_payload(decode=True);
elif part.get_content_maintype()=='application' or part.get_content_maintype()=='image' or part.get_content_maintype()=='text':
filename = part.get_filename();
if filename :
attachment[filename] = part.get_payload(decode=True);
else:
filename = 'attach_file'+str(counter);
counter += 1;
attachment[filename] = part.get_payload(decode=True);
#end if
#end if
message['attachment'] = attachment
#end for
return message
#end def
def msg_update(self, cr, uid, msg, res_id, res_model, user_email):
if user_email and self.emails_get(user_email)==self.emails_get(self._decode_header(msg['From'])):
return self.msg_user(cr, uid, msg, res_id, res_model)
else:
return self.msg_partner(cr, uid, msg, res_id, res_model)
def msg_act_get(self, msg):
body = self.msg_body_get(msg)
# handle email body commands (ex: Set-State: Draft)
actions = {}
body_data = ''
for line in body['body'].split('\n'):
res = tools.command_re.match(line)
if res:
actions[res.group(1).lower()] = res.group(2).lower()
else:
body_data += line+'\n'
return actions, body_data
def msg_user(self, cr, uid, msg, res_id, res_model):
actions, body_data = self.msg_act_get(msg)
data = {}
if 'user' in actions:
uids = self.pool.get('res.users').name_search(cr, uid, actions['user'])
if uids:
data['user_id'] = uids[0][0]
res_model = self.pool.get(res_model)
return res_model.msg_update(cr, uid, res_id, msg, data=data, default_act='pending')
def msg_send(self, msg, reply_to, emails, priority=None, res_id=False):
if not emails:
return False
msg_to = [emails[0]]
msg_subject = msg['Subject']
msg_cc = []
msg_body = self.msg_body_get(msg)
if len(emails)>1:
msg_cc = emails[1:]
msg_attachment = map(lambda x: (x[0], x[1]), msg_body['attachment'].items())
return tools.email_send(reply_to, msg_to, msg_subject , msg_body['body'], email_cc=msg_cc,
reply_to=reply_to, attach=msg_attachment, openobject_id=res_id, priority=priority)
def msg_partner(self, cr, uid, msg, res_id, res_model):
res_model = self.pool.get(res_model)
return res_model.msg_update(cr, uid, res_id, msg, data={}, default_act='open')
def msg_parse(self, cr, uid, mailgateway_id, msg):
mailgateway = self.browse(cr, uid, mailgateway_id)
res_model = mailgateway.object_id.model
res_str = tools.reference_re.search(msg.get('References', ''))
if res_str:
res_str = res_str.group(1)
else:
res_str = tools.res_re.search(msg.get('Subject', ''))
if res_str:
res_str = res_str.group(1)
def msg_test(res_str):
emails = ('', '', '', '')
if not res_str:
return (False, emails)
res_str = int(res_str)
if hasattr(self.pool.get(res_model), 'emails_get'):
emails = self.pool.get(res_model).emails_get(cr, uid, [res_str])[0]
return (res_str, emails)
(res_id, emails) = msg_test(res_str)
user_email, from_email, cc_email, priority = emails
if res_id:
self.msg_update(cr, uid, msg, res_id, res_model, user_email)
else:
res_id = self.msg_new(cr, uid, msg, res_model)
(res_id, emails) = msg_test(res_id)
user_email, from_email, cc_email, priority = emails
subject = self._decode_header(msg['subject'])
if msg.get('Subject', ''):
del msg['Subject']
msg['Subject'] = '[%s] %s' %(str(res_id), subject)
em = [user_email or '', from_email] + (cc_email or '').split(',')
emails = map(self.emails_get, filter(None, em))
mm = [self._decode_header(msg['From']), self._decode_header(msg['To'])]+self._decode_header(msg.get('Cc','')).split(',')
msg_mails = map(self.emails_get, filter(None, mm))
emails = filter(lambda m: m and m not in msg_mails, emails)
try:
self.msg_send(msg, mailgateway.reply_to, emails, priority, res_id)
if hasattr(self.pool.get(res_model), 'msg_send'):
emails = self.pool.get(res_model).msg_send(cr, uid, res_id)
except Exception, e:
if mailgateway.email_default:
a = self._decode_header(msg['Subject'])
del msg['Subject']
msg['Subject'] = '[OpenERP-Error] ' + a
self.msg_send(msg, mailgateway.reply_to, mailgateway.email_default.split(','), res_id)
raise e
return res_id
mail_gateway()
class mail_gateway_history(osv.osv):
_name = "mail.gateway.history"
_description = "Mail Gateway History"
_columns = {
'name': fields.char('Message Id', size=64, help="Message Id in Email Server."),
'res_id': fields.integer("Resource ID"),
'gateway_id': fields.many2one('mail.gateway',"Mail Gateway", required=True),
'model_id':fields.related('gateway_id', 'object_id', type='many2one', relation='ir.model', string='Model'),
'note': fields.text('Notes'),
'create_date': fields.datetime('Created Date'),
}
_order = 'id desc'
mail_gateway_history()

View File

@ -1,129 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="mail_gateway_history_form" model="ir.ui.view">
<field name="name">mail.gateway.history.form</field>
<field name="model">mail.gateway.history</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Gateway History">
<field name="name"/>
<field name="create_date"/>
<field name="gateway_id"/>
<field name="model_id"/>
<field name="res_id"/>
<separator string="Note" colspan="4"/>
<field name="note" nolabel="1" colspan="4"/>
</form>
</field>
</record>
<record id="mail_gateway_history_tree" model="ir.ui.view">
<field name="name">mail.gateway.history.tree</field>
<field name="model">mail.gateway.history</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Gateway History">
<field name="name" select="1"/>
<field name="create_date"/>
<field name="model_id"/>
<field name="res_id"/>
<field name="gateway_id"/>
</tree>
</field>
</record>
<record id="mail_gateway_act" model="ir.actions.act_window">
<field name="name">Gateway History</field>
<field name="res_model">mail.gateway.history</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="mail_gateway_history_tree"/>
</record>
<act_window context="{'gateway_id': active_id}"
domain="[('gateway_id', '=', active_id)]"
id="act_gateway_history" name="Email History"
res_model="mail.gateway.history" src_model="mail.gateway" />
<record id="mail_gateway_form" model="ir.ui.view">
<field name="name">mail.gateway.form</field>
<field name="model">mail.gateway</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Email Gateway">
<field name="name"/>
<field name="object_id"/>
<field name="server_id" />
<field name="reply_to"/>
<field name="email_default" />
</form>
</field>
</record>
<record id="mail_gateway_tree" model="ir.ui.view">
<field name="name">mail.gateway.tree</field>
<field name="model">mail.gateway</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Email Gateway">
<field name="name"/>
<field name="object_id"/>
<field name="server_id" />
</tree>
</field>
</record>
<record id="mail_gateway_act" model="ir.actions.act_window">
<field name="name">Email Gateway</field>
<field name="res_model">mail.gateway</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="mail_gateway_tree"/>
</record>
<record id="mail_gateway_server_form" model="ir.ui.view">
<field name="name">mail.gateway.server.form</field>
<field name="model">mail.gateway.server</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Email Gateway Server">
<field name="server_type" colspan="4" on_change="onchange_server_type(server_type,ssl)"/>
<field name="name"/>
<field name="port" />
<field name="login" />
<field name="password" password="True"/>
<field name="ssl" on_change="onchange_server_type(server_type,ssl)"/>
<field name="active" />
</form>
</field>
</record>
<record id="mail_gateway_server_tree" model="ir.ui.view">
<field name="name">mail.gateway.server.tree</field>
<field name="model">mail.gateway.server</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Email Gateway Server">
<field name="name"/>
<field name="port" />
<field name="server_type"/>
<field name="ssl" />
</tree>
</field>
</record>
<record id="mail_gateway_server_act" model="ir.actions.act_window">
<field name="name">Email Gateway Server</field>
<field name="res_model">mail.gateway.server</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="mail_gateway_server_tree"/>
</record>
<menuitem id="email_gateway_menu_parent" name="Email Gateway" parent="base.menu_config" />
<menuitem id="email_gateway_menu" parent="email_gateway_menu_parent" action="mail_gateway_act"/>
<menuitem id="email_gateway_server_menu" parent="email_gateway_menu_parent" action="mail_gateway_server_act"/>
</data>
</openerp>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<wizard string="Fetch Mail"
model="mail.gateway"
name="mail_gateway.fetchmail"
id="wizard_mailgateway_fetchmail"/>
</data>
</openerp>

View File

@ -1,7 +0,0 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_mail_gateway_server","mail.gateway.server","model_mail_gateway_server","base.group_user",1,0,0,0
"access_mail_gateway","mail.gateway","model_mail_gateway","base.group_user",1,0,0,0
"access_mail_gateway_history","mail.gateway.history","model_mail_gateway_history","base.group_user",1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_mail_gateway_server mail.gateway.server model_mail_gateway_server base.group_user 1 0 0 0
3 access_mail_gateway mail.gateway model_mail_gateway base.group_user 1 0 0 0
4 access_mail_gateway_history mail.gateway.history model_mail_gateway_history base.group_user 1 0 0 0

View File

@ -1,82 +0,0 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import wizard
import time
import pooler
import tools
import os
_email_form = '''<?xml version="1.0"?>
<form string="Email Gateway">
<separator string="Fetching Emails : " />
<field name="server" colspan="4" nolabel="1" />
</form>'''
_email_done_form = '''<?xml version="1.0"?>
<form string="Email Gateway">
<separator string="Log Detail" />
<newline/>
<field name="message" colspan="4" nolabel="1"/>
</form>'''
_email_fields = {
'server': {'string':"Server", 'type':'text', 'readonly':True},
}
_email_done_fields = {
'message': {'string':"Log Detail", 'type':'text', 'readonly':True},
}
def _default(self , cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
gateway_pool=pool.get('mail.gateway')
server = []
for mail_gateway in gateway_pool.browse(cr, uid, data['ids'], context=context):
if mail_gateway.server_id.active:
server.append(mail_gateway.name or '%s (%s)'%(mail_gateway.server_id.login, mail_gateway.server_id.name) )
data['form']['server'] = '\n'.join(server)
return data['form']
def section_fetch_mail(self , cr, uid, data, context):
pool = pooler.get_pool(cr.dbname)
gateway_pool=pool.get('mail.gateway')
messages = gateway_pool.fetch_mails(cr, uid, ids=data['ids'], context=context)
data['form']['message'] = '\n'.join(messages)
return data['form']
class wiz_mailgateway_fetch_mail(wizard.interface):
states = {
'init': {
'actions': [_default],
'result': {'type': 'form', 'arch':_email_form, 'fields':_email_fields, 'state':[('end','Cancel','gtk-cancel'), ('fetch','Fetch','gtk-execute')]}
},
'fetch': {
'actions': [section_fetch_mail],
'result': {'type': 'form', 'arch': _email_done_form,
'fields': _email_done_fields,
'state': (
('end', 'Close'),
)
},
},
}
wiz_mailgateway_fetch_mail('mail_gateway.fetchmail')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -26,7 +26,7 @@ class company(osv.osv):
_columns = {
'schedule_range': fields.float('Scheduler Range', required=True,
help="This is the time frame analysed by the scheduler when "\
"computing Requisitions. All Requisition that are not between "\
"computing procurements. All procurements that are not between "\
"today and today+range are skipped for futur computation."),
'po_lead': fields.float('Purchase Lead Time', required=True,
help="This is the leads/security time for each purchase order."),

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: 2010-03-30 10:42+0000\n"
"Last-Translator: Nikolay Chesnokov <chesnokov_n@msn.com>\n"
"PO-Revision-Date: 2010-04-13 05:41+0000\n"
"Last-Translator: grisha <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-01 03:41+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: mrp
@ -69,7 +69,7 @@ msgstr "Используемые мощности маршрута"
#. module: mrp
#: help:mrp.property,composition:0
msgid "Not used in computations, for information purpose only."
msgstr ""
msgstr "Не используется в расчётах, только для справки"
#. module: mrp
#: model:ir.actions.act_window,name:mrp.mrp_routing_action
@ -157,6 +157,8 @@ msgid ""
"Number of operation this workcenter can do in parallel. If this workcenter "
"represent a team of 5 workers, the capacity per cycle is 5."
msgstr ""
"Количество одновременно выполняемых рабочим центром операций. Если рабочиё "
"центр представлен пятью рабочими, этот показатель равен 5"
#. module: mrp
#: wizard_button:product.product.procurement,init,create:0
@ -204,7 +206,7 @@ msgstr ""
#. module: mrp
#: rml:mrp.production.order:0
msgid "Destination Location"
msgstr ""
msgstr "Место назначения"
#. module: mrp
#: view:mrp.workcenter:0
@ -214,7 +216,7 @@ msgstr "Бухг. аналитика"
#. module: mrp
#: model:process.node,note:mrp.process_node_servicemts0
msgid "Do nothing"
msgstr ""
msgstr "Ничего не делать"
#. module: mrp
#: rml:mrp.production.order:0
@ -341,7 +343,7 @@ msgstr "Запланированная к производству продук
#. module: mrp
#: field:mrp.workcenter,timesheet_id:0
msgid "Working Time"
msgstr ""
msgstr "Рабочее время"
#. module: mrp
#: view:mrp.procurement:0

View File

@ -995,16 +995,16 @@ mrp_production_product_line()
#
class mrp_procurement(osv.osv):
"""
Procument Orders / Requisitions
Procument Orders
"""
_name = "mrp.procurement"
_description = "Procurement"
_order = 'priority,date_planned'
_columns = {
'name': fields.char('Reason', size=64, required=True, help='Requisition name.'),
'name': fields.char('Reason', size=64, required=True, help='Procurement name.'),
'origin': fields.char('Source Document', size=64,
help="Reference of the document that created this Requisition.\n"
help="Reference of the document that created this Procurement.\n"
"This is automatically completed by Open ERP."),
'priority': fields.selection([('0','Not urgent'),('1','Normal'),('2','Urgent'),('3','Very Urgent')], 'Priority', required=True),
'date_planned': fields.datetime('Scheduled date', required=True),
@ -1060,7 +1060,7 @@ class mrp_procurement(osv.osv):
if s['state'] in ['draft','cancel']:
unlink_ids.append(s['id'])
else:
raise osv.except_osv(_('Invalid action !'), _('Cannot delete Requisition Order(s) which are in %s State!' % s['state']))
raise osv.except_osv(_('Invalid action !'), _('Cannot delete Procurement Order(s) which are in %s State!' % s['state']))
return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
def onchange_product_id(self, cr, uid, ids, product_id, context={}):
@ -1254,7 +1254,7 @@ class mrp_procurement(osv.osv):
move_obj = self.pool.get('stock.move')
for procurement in self.browse(cr, uid, ids):
if procurement.product_qty <= 0.00:
raise osv.except_osv(_('Data Insufficient !'), _('Please check the Quantity of Requisition Order(s), it should not be less than 1!'))
raise osv.except_osv(_('Data Insufficient !'), _('Please check the Quantity of Procurement Order(s), it should not be less than 1!'))
if procurement.product_id.type in ('product', 'consu'):
if not procurement.move_id:
source = procurement.location_id.id

View File

@ -441,7 +441,7 @@
<field name="cycle_total" operator="+"/>
</graph>
</field>
</record>
</record>
<record id="mrp_production_form_view" model="ir.ui.view">
<field name="name">mrp.production.form</field>
@ -493,7 +493,7 @@
<button name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" />
states="draft,waiting,confirmed,assigned" />
</tree>
</field>
@ -502,7 +502,7 @@
<tree string="Consumed Products" editable="bottom" colors="red:scraped==True">
<field name="product_id" readonly="1"/>
<field name="product_qty" readonly="1" string="Qty"/>
<field name="product_uom" readonly="1" string="UOM"/>
<field name="product_uom" readonly="1" string="UOM"/>
<field name="location_dest_id" readonly="1" string="Destination Loc."/>
<field name="prodlot_id" />
<field name="state" invisible="1"/>
@ -516,8 +516,8 @@
name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
icon="gtk-convert"
states="done,cancel" />
states="done,cancel" />
</tree>
</field>
@ -525,13 +525,13 @@
<field name="state" select="2"/>
<button name="action_compute" states="draft" string="Compute Data" type="object" icon="gtk-execute"/>
<button name="button_confirm" states="draft" string="Confirm Production" icon="gtk-apply"/>
<button name="button_produce" states="ready" string="Mark as Started" icon="gtk-execute"/>
<button name="button_produce" states="ready" string="Mark as Started" icon="gtk-execute"/>
<button name="%(act_mrp_product_produce)d" states="in_production" string="Produce" icon="gtk-ok" type="action"/>
<button name="force_production" states="confirmed,picking_except" string="Force Reservation" type="object" icon="gtk-jump-to"/>
<button name="button_cancel" states="draft,ready,confirmed,in_production,picking_except" string="Cancel" icon="gtk-cancel"/>
<button name="button_recreate" states="picking_except" string="Recreate Picking" icon="gtk-convert"/>
</group>
</page>
</page>
<page string="Finished Products">
<field colspan="2" name="move_created_ids" nolabel="1" widget="one2many_list"
mode="tree,form" height="275" domain="[('state','&lt;&gt;', ('done', 'cancel'))]">
@ -548,7 +548,7 @@
<button name="%(stock.move_scrap)d"
string="Scrap Products" type="action"
icon="gtk-convert" context="{'scrap': True}"
states="draft,waiting,confirmed,assigned" />
states="draft,waiting,confirmed,assigned" />
</tree>
</field>
@ -618,7 +618,7 @@
<filter icon="terp-mrp" string="Draft"
domain="[('state','=','draft')]"
help="Non confirmed manufacturing orders"/>
<filter icon="terp-mrp" string="Current"
<filter icon="terp-mrp" string="Current" name="current"
domain="[('state','in',('confirmed','ready'))]"
help="Manufacturing Orders which are waiting for raw materials"/>
<filter icon="terp-mrp" string="Ready"
@ -656,7 +656,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,graph,gantt</field>
<field name="view_id" eval="False"/>
<field name="context">{"search_default_Current":1}</field>
<field name="context">{"search_default_current":1}</field>
<field name="search_view_id" ref="view_mrp_production_filter"/>
</record>
<menuitem action="mrp_production_action" id="menu_mrp_production_action" parent="menu_mrp_manufacturing" sequence="1"/>
@ -852,7 +852,7 @@
<field name="arch" type="xml">
<search string="Search Procurement">
<group col='10' colspan='4'>
<filter icon="terp-mrp" string="Current" domain="[('state','in',('draft','confirmed'))]" help="Procurement Orders in draft or open state."/>
<filter icon="terp-mrp" string="Current" domain="[('state','in',('draft','confirmed'))]" name="current" help="Procurement Orders in draft or open state."/>
<filter icon="terp-mrp" string="Exceptions" domain="[('state','=','exception')]" help="Procurement Orders with exceptions"/>
<filter icon="terp-mrp" string="Late"
domain="['&amp;', ('date_planned::date','&lt;', current_date), ('state', 'in', ('draft', 'confirmed'))]"
@ -879,14 +879,14 @@
<field name="res_model">mrp.procurement</field>
<field name="view_type">form</field>
<field name="view_id" eval="False"/>
<field name="context">{"search_default_Current":1}</field>
<field name="context">{"search_default_current":1}</field>
<field name="search_view_id" ref="view_mrp_procurement_filter"/>
</record>
<menuitem action="mrp_procurement_action" id="menu_mrp_procurement_action" parent="mrp.menu_mrp_manufacturing"
sequence="2" />
<record id="mrp_procurement_action3" model="ir.actions.act_window">
<field name="name">Requisitions</field>
<field name="name">Procurements</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.procurement</field>
<field name="view_type">form</field>
@ -896,9 +896,6 @@
<field name="context">{}</field>
</record>
<menuitem action="mrp_procurement_action3" id="menu_procurement_requisitions" parent="purchase.menu_procurement_management"
sequence="5" />
<record id="mrp_procurement_action5" model="ir.actions.act_window">
<field name="name">Procurement Exceptions</field>
<field name="type">ir.actions.act_window</field>

View File

@ -1,102 +1,102 @@
<?xml version="1.0" ?>
<openerp>
<data>
<data>
<!--
Process
-->
<!--
Process
-->
<record id="process_process_procurementprocess0" model="process.process">
<field eval="&quot;&quot;&quot;Requisition&quot;&quot;&quot;" name="name"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="1" name="active"/>
</record>
<record id="process_process_procurementprocess0" model="process.process">
<field eval="&quot;&quot;&quot;Procurement&quot;&quot;&quot;" name="name"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="1" name="active"/>
</record>
<!--
Process Node
-->
<!--
Process Node
-->
<record id="process_node_stockproduct1" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;For stockable products and consumables&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Stockable Product&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="mrp.process_process_stockableproductprocess0"/>
<field name="subflow_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_stockproduct1" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;For stockable products and consumables&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Stockable Product&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="mrp.process_process_stockableproductprocess0"/>
<field name="subflow_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_serviceproduct1" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;For Services.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Service&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="mrp.process_process_serviceproductprocess0"/>
<field name="subflow_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_serviceproduct1" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;For Services.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Service&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="mrp.process_process_serviceproductprocess0"/>
<field name="subflow_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_productionorder0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_production_action"/>
<field name="model_id" ref="mrp.model_mrp_production"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Drives the requisition orders for raw material.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Production Order&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'picking_except', 'confirmed', 'ready', 'in_production', 'cancel', 'done')&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_productionorder0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_production_action"/>
<field name="model_id" ref="mrp.model_mrp_production"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Drives the procurement orders for raw material.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Production Order&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'picking_except', 'confirmed', 'ready', 'in_production', 'cancel', 'done')&quot;&quot;&quot;" name="model_states"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_minimumstockrule0" model="process.node">
<field name="menu_id" ref="mrp.menu_action_orderpoint_form"/>
<field name="model_id" ref="mrp.model_stock_warehouse_orderpoint"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Linked to the 'Minimum stock rule' supplying method.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Minimum Stock&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_minimumstockrule0" model="process.node">
<field name="menu_id" ref="mrp.menu_action_orderpoint_form"/>
<field name="model_id" ref="mrp.model_stock_warehouse_orderpoint"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Linked to the 'Minimum stock rule' supplying method.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Minimum Stock&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="1" name="flow_start"/>
</record>
<record id="process_node_procureproducts0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;The way to requisition depends on the product type.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Procure Products&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="0" name="flow_start"/>
</record>
<record id="process_node_procureproducts0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;state&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;The way to procurement depends on the product type.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Procure Products&quot;&quot;&quot;" name="name"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="0" name="flow_start"/>
</record>
<record id="process_node_stockproduct0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Product type is Stockable or Consumable.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Stockable Product&quot;&quot;&quot;" name="name"/>
<field name="subflow_id" ref="process_process_stockableproductprocess0"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="0" name="flow_start"/>
</record>
<record id="process_node_stockproduct0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Product type is Stockable or Consumable.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Stockable Product&quot;&quot;&quot;" name="name"/>
<field name="subflow_id" ref="process_process_stockableproductprocess0"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="0" name="flow_start"/>
</record>
<record id="process_node_serviceproduct0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Product type is service&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Service&quot;&quot;&quot;" name="name"/>
<field name="subflow_id" ref="process_process_serviceproductprocess0"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="0" name="flow_start"/>
</record>
<record id="process_node_serviceproduct0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Product type is service&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Service&quot;&quot;&quot;" name="name"/>
<field name="subflow_id" ref="process_process_serviceproductprocess0"/>
<field name="process_id" ref="process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'confirmed', 'cancel', 'exception', 'running', 'done', 'waiting')&quot;&quot;&quot;" name="model_states"/>
<field eval="0" name="flow_start"/>
</record>
<record id="process_node_purchaseprocure0" model="process.node">
<record id="process_node_purchaseprocure0" model="process.node">
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
@ -137,83 +137,83 @@
<field eval="0" name="flow_start"/>
</record>
<!--
Process Transition
-->
<!--
Process Transition
-->
<record id="process_transition_servicemto0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;If the service has a 'Produce' supply method, this creates a task in the project management module of OpenERP.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_serviceonorder0"/>
<field model="process.node" name="source_node_id" ref="process_node_serviceproduct1"/>
</record>
<record id="process_transition_servicemto0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;If the service has a 'Produce' supply method, this creates a task in the project management module of OpenERP.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_serviceonorder0"/>
<field model="process.node" name="source_node_id" ref="process_node_serviceproduct1"/>
</record>
<record id="process_transition_servicemts0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Stock&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;This is used in case of a service without any impact in the system, a training session for instance.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_servicemts0"/>
<field model="process.node" name="source_node_id" ref="process_node_serviceproduct1"/>
</record>
<record id="process_transition_servicemts0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Stock&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;This is used in case of a service without any impact in the system, a training session for instance.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_servicemts0"/>
<field model="process.node" name="source_node_id" ref="process_node_serviceproduct1"/>
</record>
<record id="process_transition_stockmts0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Stock&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The system waits for the products to be available in the stock. These products are typically procured manually or through a minimum stock rule.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_mts0"/>
<field model="process.node" name="source_node_id" ref="process_node_stockproduct1"/>
</record>
<record id="process_transition_stockmts0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Stock&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The system waits for the products to be available in the stock. These products are typically procured manually or through a minimum stock rule.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_mts0"/>
<field model="process.node" name="source_node_id" ref="process_node_stockproduct1"/>
</record>
<record id="process_transition_stockproduct0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The system creates an order (production or purchased) depending on the sold quantity and the products parameters.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_stock0"/>
<field model="process.node" name="source_node_id" ref="process_node_stockproduct1"/>
</record>
<record id="process_transition_stockproduct0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Make to Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The system creates an order (production or purchased) depending on the sold quantity and the products parameters.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_stock0"/>
<field model="process.node" name="source_node_id" ref="process_node_stockproduct1"/>
</record>
<record id="process_transition_productionprocureproducts0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Requisition of raw material&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;In order to supply raw material (to be purchased or produced), the production order creates as much requisition orders as components listed in the BOM, through a run of the schedulers (MRP).&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_procureproducts0"/>
<field model="process.node" name="source_node_id" ref="process_node_productionorder0"/>
</record>
<record id="process_transition_productionprocureproducts0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Procurement of raw material&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;In order to supply raw material (to be purchased or produced), the production order creates as much procurement orders as components listed in the BOM, through a run of the schedulers (MRP).&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_procureproducts0"/>
<field model="process.node" name="source_node_id" ref="process_node_productionorder0"/>
</record>
<record id="process_transition_minimumstockprocure0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;'Minimum stock rule' material&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The 'Minimum stock rule' allows the system to create procurement orders automatically as soon as the minimum stock is reached.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_procureproducts0"/>
<field model="process.node" name="source_node_id" ref="process_node_minimumstockrule0"/>
</record>
<record id="process_transition_minimumstockprocure0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;'Minimum stock rule' material&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The 'Minimum stock rule' allows the system to create procurement orders automatically as soon as the minimum stock is reached.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_procureproducts0"/>
<field model="process.node" name="source_node_id" ref="process_node_minimumstockrule0"/>
</record>
<record id="process_transition_procurestockableproduct0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Procurement of stockable Products&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Depending on the chosen method to supply the stockable products, the procurement order creates a RFQ, a production order, ... &quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_stockproduct0"/>
<field model="process.node" name="source_node_id" ref="process_node_procureproducts0"/>
</record>
<record id="process_transition_procurestockableproduct0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Procurement of stockable Products&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Depending on the chosen method to supply the stockable products, the procurement order creates a RFQ, a production order, ... &quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_stockproduct0"/>
<field model="process.node" name="source_node_id" ref="process_node_procureproducts0"/>
</record>
<record id="process_transition_procureserviceproduct0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Requisition of services&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Depending on the chosen method to 'supply' the service, the requisition order creates a RFQ for a subcontracting purchase order or waits until the service is done (= the delivery of the products).&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_serviceproduct0"/>
<field model="process.node" name="source_node_id" ref="process_node_procureproducts0"/>
</record>
<record id="process_transition_procureserviceproduct0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Procurement of services&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Depending on the chosen method to 'supply' the service, the procurement order creates a RFQ for a subcontracting purchase order or waits until the service is done (= the delivery of the products).&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_serviceproduct0"/>
<field model="process.node" name="source_node_id" ref="process_node_procureproducts0"/>
</record>
<record id="process_transition_purchaseprocure0" model="process.transition">
<record id="process_transition_purchaseprocure0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Automatic RFQ&quot;&quot;&quot;" name="name"/>
@ -240,7 +240,7 @@
<field model="process.node" name="source_node_id" ref="process_node_billofmaterial0"/>
</record>
<record id="process_transition_bom0" model="process.transition">
<record id="process_transition_bom0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Manufacturing decomposition&quot;&quot;&quot;" name="name"/>
@ -249,5 +249,5 @@
<field model="process.node" name="source_node_id" ref="product.process_node_product0"/>
</record>
</data>
</openerp>
</data>
</openerp>

View File

@ -59,8 +59,8 @@
<field name="arch" type="xml">
<search string="Search">
<group col="16" colspan="6">
<filter string="This Year" icon="terp-hr" domain="[('name','=',time.localtime()[0])]"/>
<filter string="This Month" icon="terp-hr" domain="[('month','=',time.strftime('%%m'))]"/>
<filter string="This Year" name="this_year" icon="terp-hr" domain="[('name','=',time.localtime()[0])]"/>
<filter string="This Month" name="this_month" icon="terp-hr" domain="[('month','=',time.strftime('%%m'))]"/>
<separator orientation="vertical"/>
<filter string="Current" icon="terp-hr" domain="[('state','in',('open','draft'))]"/>
<filter string="Scheduled Date" icon="terp-hr" domain="[('scheduled_date',=,time.strftime('%%m/%%d/%%Y'))]"/>
@ -90,7 +90,7 @@
<field name="res_model">mrp.production.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_This Year":1,"search_default_This Month":1}</field>
<field name="context">{"search_default_this_year":1,"search_default_this_month":1}</field>
<field name="view_id" ref="view_report_mrp_production_order_tree"/>
<field name="search_view_id" ref="view_report_mrp_production_order_filter"/>
</record>

View File

@ -115,7 +115,7 @@ class mrp_procurement(osv.osv):
'''% (start_date, end_date, report_total, report_except, report_later)
summary += '\n'.join(report)
request.create(cr, uid,
{'name': "Requisition calculation report.",
{'name': "Procurement calculation report.",
'act_from': uid,
'act_to': uid,
'body': summary,

View File

@ -45,13 +45,13 @@ class stock_warehouse_orderpoint(osv.osv):
'product_uom': fields.many2one('product.uom', 'Product UOM', required=True ),
'product_min_qty': fields.float('Min Quantity', required=True,
help="When the virtual stock goes belong the Min Quantity, Open ERP generates "\
"a requisition to bring the virtual stock to the Max Quantity."),
"a procurement to bring the virtual stock to the Max Quantity."),
'product_max_qty': fields.float('Max Quantity', required=True,
help="When the virtual stock goes belong the Min Quantity, Open ERP generates "\
"a requisition to bring the virtual stock to the Max Quantity."),
"a procurement to bring the virtual stock to the Max Quantity."),
'qty_multiple': fields.integer('Qty Multiple', required=True,
help="The requisition quantity will by rounded up to this multiple."),
'procurement_id': fields.many2one('mrp.procurement', 'Latest Requisition'),
help="The procurement quantity will by rounded up to this multiple."),
'procurement_id': fields.many2one('mrp.procurement', 'Latest procurement'),
'company_id': fields.many2one('res.company','Company',required=True),
}
_defaults = {
@ -100,7 +100,7 @@ class StockMove(osv.osv):
_columns = {
'production_id': fields.many2one('mrp.production', 'Production', select=True),
'procurements': fields.one2many('mrp.procurement', 'move_id', 'Requisitions'),
'procurements': fields.one2many('mrp.procurement', 'move_id', 'Procurements'),
}
def copy(self, cr, uid, id, default=None, context=None):

View File

@ -1,39 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Make Procurement -->
<record id="view_make_procurment_wizard" model="ir.ui.view">
<field name="name">Requisition Request</field>
<record id="view_make_procurment_wizard" model="ir.ui.view">
<field name="name">Procurement Request</field>
<field name="model">make.procurement</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Requisition Request">
<label string="This wizard will plan the procurement for this product. This procurement may generate task, production orders or purchase orders." colspan="4"/>
<field name="product_id" on_change="onchange_product_id(product_id)"/>
<field name="qty"/>
<field name="uom_id"/>
<field name="date_planned"/>
<field name="warehouse_id" colspan="4"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel"
string="Cancel" />
<button name="make_procurement" string="Ask New Products"
colspan="1" type="object" icon="gtk-ok" />
</group>
<form string="Procurement Request">
<label string="This wizard will plan the procurement for this product. This procurement may generate task, production orders or purchase orders." colspan="4"/>
<field name="product_id" on_change="onchange_product_id(product_id)"/>
<field name="qty"/>
<field name="uom_id"/>
<field name="date_planned"/>
<field name="warehouse_id" colspan="4"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel"
string="Cancel" />
<button name="make_procurement" string="Ask New Products"
colspan="1" type="object" icon="gtk-ok" />
</group>
</form>
</field>
</record>
<act_window name="Requisition Request"
res_model="make.procurement"
src_model="product.product"
view_mode="form"
target="new"
key2="client_action_multi"
id="act_make_procurement"/>
</data>
</openerp>
<act_window name="Procurement Request"
res_model="make.procurement"
src_model="product.product"
view_mode="form"
target="new"
key2="client_action_multi"
id="act_make_procurement"/>
</data>
</openerp>

View File

@ -1,34 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!-- Compute Procurement -->
<record id="view_compute_procurment_wizard" model="ir.ui.view">
<record id="view_compute_procurment_wizard" model="ir.ui.view">
<field name="name">Compute Procurements</field>
<field name="model">mrp.procurement.compute</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Parameters">
<label string="This wizard will schedule procurements." colspan="4" align="0.0"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel"
string="Cancel" />
<button name="procure_calculation" string="Compute Requisitions"
colspan="1" type="object" icon="gtk-ok" />
</group>
<label string="This wizard will schedule procurements." colspan="4" align="0.0"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel"
string="Cancel" />
<button name="procure_calculation" string="Compute Procurements"
colspan="1" type="object" icon="gtk-ok" />
</group>
</form>
</field>
</record>
<!-- <act_window name="Compute Procurements" -->
<!-- res_model="mrp.procurement.compute"-->
<!-- src_model="mrp.procurement"-->
<!-- view_mode="form"-->
<!-- target="new" -->
<!-- <act_window name="Compute Procurements" -->
<!-- res_model="mrp.procurement.compute"-->
<!-- src_model="mrp.procurement"-->
<!-- view_mode="form"-->
<!-- target="new" -->
<!-- key2="client_action_multi" -->
<!-- id="act_compute_procurement"/> -->
</data>
</openerp>
<!-- id="act_compute_procurement"/> -->
</data>
</openerp>

View File

@ -3,7 +3,7 @@
<data>
# -----------------------------------------------------------
# Requisition - Automatic schedule
# Procurements - Automatic schedule
# -----------------------------------------------------------
<record model="workflow.transition" id="mrp.trans_confirm_confirm_wait">

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-02-04 05:52+0000\n"
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
"PO-Revision-Date: 2010-04-13 06:10+0000\n"
"Last-Translator: grisha <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-03-30 04:12+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: mrp_operations
@ -128,7 +128,7 @@ msgstr ""
#. module: mrp_operations
#: model:ir.ui.menu,name:mrp_operations.menu_mrp_production_code_action
msgid "Start - Stop Codes"
msgstr ""
msgstr "Штрих-коды Старт/Стоп"
#. module: mrp_operations
#: field:mrp.production.workcenter.line,uom:0

View File

@ -0,0 +1,31 @@
# Polish 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-11-26 05:29+0000\n"
"PO-Revision-Date: 2010-04-14 10:45+0000\n"
"Last-Translator: Krystian Twardowski <Unknown>\n"
"Language-Team: Polish <pl@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-15 03:59+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: olap_crm
#: model:ir.module.module,description:olap_crm.module_meta_information
msgid ""
"\n"
" Sale module will load the data in olap tables\n"
" "
msgstr ""
#. module: olap_crm
#: model:ir.module.module,shortdesc:olap_crm.module_meta_information
msgid "olap_crm"
msgstr "olap_crm"

View File

@ -0,0 +1,34 @@
# Romanian 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-11-26 05:29+0000\n"
"PO-Revision-Date: 2010-04-15 10:48+0000\n"
"Last-Translator: geopop65 <Unknown>\n"
"Language-Team: Romanian <ro@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-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: olap_sale
#: model:ir.module.module,description:olap_sale.module_meta_information
msgid ""
"\n"
" Sale module will load the data in olap tables\n"
" "
msgstr ""
"\n"
" Modulul de vânzări va încărca datele în tabelele olap\n"
" "
#. module: olap_sale
#: model:ir.module.module,shortdesc:olap_sale.module_meta_information
msgid "olap_sale"
msgstr "olap_sale"

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2010-02-24 10:54+0000\n"
"Last-Translator: Auduf <5097@mail.ru>\n"
"PO-Revision-Date: 2010-04-13 05:28+0000\n"
"Last-Translator: grisha <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-03-30 04:06+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: product
@ -44,6 +44,7 @@ msgid ""
"Determine if the product is visible in the list of products within a "
"selection from a purchase order line."
msgstr ""
"Должно ли изделие быть видимым при выборе из списка изделий в форме заказа"
#. module: product
#: help:product.supplierinfo,name:0
@ -123,7 +124,7 @@ msgstr ""
#. module: product
#: help:product.price.type,field:0
msgid "Associated field in the product form."
msgstr ""
msgstr "Связанные поля в форме изделия"
#. module: product
#: selection:product.template,cost_method:0
@ -143,12 +144,12 @@ msgstr "Каталог продукции"
#. module: product
#: model:product.category,name:product.cat1
msgid "Sellable"
msgstr ""
msgstr "Для продажи"
#. module: product
#: model:product.template,name:product.product_product_26_product_template
msgid "Kit Keyboard + Mouse"
msgstr ""
msgstr "Комплект мыши и клавиатуры"
#. module: product
#: field:product.price.type,name:0
@ -168,7 +169,7 @@ msgstr "Компания"
#. module: product
#: field:product.template,rental:0
msgid "Rentable Product"
msgstr ""
msgstr "Изделие для аренды"
#. module: product
#: field:product.product,lst_price:0
@ -197,6 +198,7 @@ msgid ""
"Base price for computing the customer price. Sometimes called the catalog "
"price."
msgstr ""
"Базовая цена для расчёта цены продажи. Иногда называется справочой ценой."
#. module: product
#: field:pricelist.partnerinfo,min_quantity:0
@ -211,12 +213,12 @@ msgstr "Процессор AMD Athlon XP 2200+"
#. module: product
#: help:product.price.type,name:0
msgid "Name of this kind of price."
msgstr ""
msgstr "Наименование типа цены"
#. module: product
#: help:product.pricelist.version,date_start:0
msgid "Starting date for this pricelist version to be valid."
msgstr ""
msgstr "Каталог действителен, начиная с даты"
#. module: product
#: field:product.product,incoming_qty:0
@ -265,7 +267,7 @@ msgstr "Каталог продаж"
#. module: product
#: field:product.pricelist.item,base_pricelist_id:0
msgid "If Other Pricelist"
msgstr ""
msgstr "В другом каталоге"
#. module: product
#: model:ir.actions.act_window,name:product.product_normal_action
@ -283,6 +285,10 @@ msgid ""
"Rounding is applied after the discount and before the surcharge.\n"
"To have prices that end in 9.99, set rounding 10, surcharge -0.01"
msgstr ""
"Устанавливает цену кратной данному значению.\n"
"Округление применяется после скидки, но перед надбавкой.\n"
"Так, чтобы цена заканчивалась на 9,99, установите округление 10, надбавку -"
"0,01."
#. module: product
#: view:product.pricelist.item:0
@ -328,7 +334,7 @@ msgstr "Базовае цены"
#. module: product
#: model:ir.ui.menu,name:product.menu_price
msgid "Prices Computations"
msgstr ""
msgstr "Вычисление цен"
#. module: product
#: field:product.pricelist.item,name:0
@ -353,7 +359,7 @@ msgstr "Ошибка ! Невозможно создать рекурсивну
#. module: product
#: field:product.template,uom_id:0
msgid "Default UoM"
msgstr ""
msgstr "Единица измерения по умолчанию"
#. module: product
#: field:product.template,produce_delay:0
@ -516,7 +522,7 @@ msgstr "Каталоги"
#. module: product
#: field:product.supplierinfo,product_name:0
msgid "Partner Product Name"
msgstr ""
msgstr "Наименование изделия партнёра"
#. module: product
#: view:product.product:0
@ -563,7 +569,7 @@ msgstr ""
#. module: product
#: field:product.template,seller_delay:0
msgid "Supplier Lead Time"
msgstr ""
msgstr "Время поставки"
#. module: product
#: model:product.pricelist.version,name:product.ver0
@ -608,7 +614,7 @@ msgstr "Расходные"
#. module: product
#: help:product.price.type,currency_id:0
msgid "The currency the field is expressed in."
msgstr ""
msgstr "Валюта"
#. module: product
#: help:product.template,weight:0
@ -725,7 +731,7 @@ msgstr "Стеллаж"
#. module: product
#: field:product.uom,category_id:0
msgid "UoM Category"
msgstr ""
msgstr "Категория единиц измерения"
#. module: product
#: selection:product.ul,type:0
@ -817,7 +823,7 @@ msgstr "Валюта"
#. module: product
#: model:product.template,name:product.product_product_cpu_gen_product_template
msgid "Regular processor config"
msgstr ""
msgstr "Типовая конфигурация процессора"
#. module: product
#: view:product.product:0
@ -828,7 +834,7 @@ msgstr "Описания"
#. module: product
#: model:process.transition,name:product.process_transition_supplierofproduct0
msgid "Suppliers of Product"
msgstr ""
msgstr "Поставщики изделия"
#. module: product
#: field:product.pricelist.version,date_start:0
@ -838,7 +844,7 @@ msgstr "Дата начала"
#. module: product
#: view:res.partner:0
msgid "Sales Properties"
msgstr ""
msgstr "Свойства продажи"
#. module: product
#: help:product.product,qty_available:0
@ -846,6 +852,8 @@ msgid ""
"Current quantities of products in selected locations or all internal if none "
"have been selected."
msgstr ""
"Текуще количество продукции в выбранных складах или общее количество, если "
"ничего не выбрано."
#. module: product
#: model:product.template,name:product.product_product_pc1_product_template
@ -891,6 +899,8 @@ msgid ""
"Unit of Measure of a category can be converted between each others in the "
"same category."
msgstr ""
"Единицы измерения могут быть приведены друг к другу в пределах одной "
"категории."
#. module: product
#: model:ir.model,name:product.model_product_uom
@ -905,7 +915,7 @@ msgstr "Можно продавать"
#. module: product
#: model:product.template,name:product.product_product_23_product_template
msgid "Complete PC With Peripherals"
msgstr ""
msgstr "Комплектовать ПК периферией"
#. module: product
#: constraint:product.template:0
@ -994,7 +1004,7 @@ msgstr ""
#. module: product
#: field:product.pricelist.item,price_max_margin:0
msgid "Max. Price Margin"
msgstr ""
msgstr "Максимальная маржа цены"
#. module: product
#: view:res.partner:0
@ -1113,12 +1123,12 @@ msgstr "Длина пакета"
#. module: product
#: field:product.pricelist.item,price_min_margin:0
msgid "Min. Price Margin"
msgstr ""
msgstr "Минимальная маржа цены"
#. module: product
#: help:product.packaging,ean:0
msgid "The EAN code of the package unit."
msgstr ""
msgstr "Штрих-код EAN упаковки"
#. module: product
#: field:product.template,weight:0
@ -1233,7 +1243,7 @@ msgstr ""
#. module: product
#: help:product.pricelist.version,date_end:0
msgid "Ending date for this pricelist version to be valid."
msgstr ""
msgstr "Конечная дата, до которой каталог действителен"
#. module: product
#: field:pricelist.partnerinfo,suppinfo_id:0
@ -1303,7 +1313,7 @@ msgstr "Жесткий диск Seagate 7200.8 120GB"
#. module: product
#: wizard_field:product.price_list,init,qty2:0
msgid "Quantity-2"
msgstr ""
msgstr "Количество-2"
#. module: product
#: view:product.product:0
@ -1327,12 +1337,12 @@ msgstr ""
#. module: product
#: wizard_field:product.price_list,init,qty4:0
msgid "Quantity-4"
msgstr ""
msgstr "Количество-4"
#. module: product
#: wizard_field:product.price_list,init,qty5:0
msgid "Quantity-5"
msgstr ""
msgstr "Количество-5"
#. module: product
#: view:product.packaging:0
@ -1394,7 +1404,7 @@ msgstr ""
#. module: product
#: model:process.node,note:product.process_node_supplier0
msgid "Product suppliers, with their product name, price, etc."
msgstr ""
msgstr "Поставщики изделия, с названиями и ценами"
#. module: product
#: model:ir.model,name:product.model_product_price_type
@ -1449,6 +1459,8 @@ msgid ""
"the delivery of the finished products. It's the time you promise to your "
"customers."
msgstr ""
"Среднее время между подтверждением заказа и доставкой товара. Это время вы "
"сообщаете заказчикам."
#. module: product
#: model:ir.model,name:product.model_product_uom_categ
@ -1458,7 +1470,7 @@ msgstr "Категория ед. изм. продукции"
#. module: product
#: wizard_field:product.price_list,init,qty3:0
msgid "Quantity-3"
msgstr ""
msgstr "Количество-3"
#. module: product
#: model:product.ul,name:product.product_ul_box
@ -1595,7 +1607,7 @@ msgstr "Конец жизненного цикла"
#. module: product
#: model:ir.module.module,shortdesc:product.module_meta_information
msgid "Products & Pricelists"
msgstr ""
msgstr "Изделия и каталоги"
#. module: product
#: help:product.uom,factor:0
@ -1648,7 +1660,7 @@ msgstr ""
#. module: product
#: wizard_field:product.price_list,init,qty1:0
msgid "Quantity-1"
msgstr ""
msgstr "Количество-1"
#. module: product
#: field:product.packaging,length:0
@ -1667,6 +1679,8 @@ msgid ""
"reception of the products in your warehouse. Used by the scheduler for "
"automatic computation of the purchase order planning."
msgstr ""
"Задержка в днях между подтверждением заказа и поступлением изделия на склад. "
"Используется планировщиком для автоматического планирования заказов."
#. module: product
#: help:product.template,uom_po_id:0
@ -1695,12 +1709,12 @@ msgstr ""
#. module: product
#: model:ir.actions.report.xml,name:product.report_product_label
msgid "Products Labels"
msgstr ""
msgstr "Этикетки изделия"
#. module: product
#: help:product.template,volume:0
msgid "The volume in m3."
msgstr ""
msgstr "Объём в метрах куб."
#. module: product
#: model:product.ul,name:product.product_ul_big_box

View File

@ -256,11 +256,11 @@ class product_template(osv.osv):
'description': fields.text('Description',translate=True),
'description_purchase': fields.text('Purchase Description',translate=True),
'description_sale': fields.text('Sale Description',translate=True),
'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way requisitions are processed. Consumables are stockable products with infinite stock, or for use when you have no inventory management in the system."),
'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way procurements are processed. Consumables are stockable products with infinite stock, or for use when you have no inventory management in the system."),
'supply_method': fields.selection([('produce','Produce'),('buy','Buy')], 'Supply method', required=True, help="Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested."),
'sale_delay': fields.float('Customer Lead Time', help="This is the average time between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers."),
'produce_delay': fields.float('Manufacturing Lead Time', help="Average time to produce this product. This is only for the production order and, if it is a multi-level bill of material, it's only for the level of this product. Different lead times will be summed for all levels and purchase orders."),
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Requisition Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the requisition request."),
'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the procurement request."),
'rental': fields.boolean('Can be Rent'),
'categ_id': fields.many2one('product.category','Category', required=True, change_default=True, domain="[('type','=','normal')]"),
'list_price': fields.float('Sale Price', digits_compute=dp.get_precision('Sale Price'), help="Base price for computing the customer price. Sometimes called the catalog price."),

View File

@ -84,7 +84,7 @@
<notebook colspan="4">
<page string="Information">
<group colspan="2" col="2">
<separator string=" Requisition" colspan="2"/>
<separator string="Procurement" colspan="2"/>
<field name="type" select="2"/>
<field name="procure_method"/>
<field name="supply_method"/>
@ -118,7 +118,7 @@
</group>
</page>
<page string="Requisition &amp; Locations">
<page string="Procurement &amp; Locations">
<group colspan="2" col="2" name="delay">
<separator string="Delays" colspan="2"/>
<field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/>
@ -144,8 +144,8 @@
<field name="standard_price" attrs="{'readonly':[('cost_method','=','average')]}"/>
<field name="list_price"/>
<newline/>
<field name="price_margin" select="1"/>
<field name="price_extra" select="1"/>
<field name="price_margin" groups="base.group_extended"/>
<field name="price_extra" groups="base.group_extended"/>
<newline/>
<field groups="base.group_extended" name="cost_method"/>
<newline/>
@ -428,8 +428,8 @@
<form string="Supplier Information">
<field name="name"/>
<field name="sequence"/>
<field name="product_name"/>
<field name="product_code"/>
<field name="product_name" groups="base.group_extended"/>
<field name="product_code" groups="base.group_extended"/>
<field name="delay"/>
<field name="qty"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
@ -456,7 +456,6 @@
<field name="name"/>
<field name="delay"/>
<field name="qty"/>
<field name="product_code"/>
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
</tree>
</field>
@ -528,7 +527,7 @@
<notebook colspan="4">
<page string="Information">
<group colspan="2" col="2">
<separator string="Requisition" colspan="2"/>
<separator string="Procurement" colspan="2"/>
<field name="type" select="2"/>
<field name="procure_method"/>
<field name="supply_method"/>
@ -562,7 +561,7 @@
</group>
</page>
<page string="Requisition &amp; Locations">
<page string="Procurement &amp; Locations" groups="base.group_extended">
<group colspan="2" col="2" name="delay">
<separator string="Delays" colspan="2"/>
<field name="sale_delay" attrs="{'readonly':[('sale_ok','=',0)]}"/>
@ -575,7 +574,6 @@
<field name="loc_row"/>
<field name="loc_case"/>
</group>
<group colspan="2" col="2" name="misc">
<separator string="Miscelleanous" colspan="2"/>
</group>

View File

@ -70,6 +70,7 @@
</td>
</tr><tr>
<td>
<barCode><xsl:value-of select="code"/></barCode>
</td><td>
<para style="nospace"><xsl:value-of select="product"/></para><xsl:text>, </xsl:text>
<para style="nospace"><xsl:value-of select="variant"/></para>

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-09-08 12:04+0000\n"
"Last-Translator: Freerk Kalsbeek (Mindswitch BV) <f.kalsbeek@mindswitch.nl>\n"
"PO-Revision-Date: 2010-04-15 09:57+0000\n"
"Last-Translator: The Loeki <the.loeki@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-03-30 04:11+0000\n"
"X-Launchpad-Export-Date: 2010-04-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: profile_manufacturing
@ -110,7 +110,7 @@ msgstr ""
#. module: profile_manufacturing
#: view:profile.manufacturing.config.install_modules_wizard:0
msgid "Stock & Manufacturing"
msgstr ""
msgstr "Voorraad en productie"
#. module: profile_manufacturing
#: help:profile.manufacturing.config.install_modules_wizard,mrp_repair:0
@ -158,7 +158,7 @@ msgstr ""
#. module: profile_manufacturing
#: view:profile.manufacturing.config.install_modules_wizard:0
msgid "Install"
msgstr ""
msgstr "Installeren"
#. module: profile_manufacturing
#: field:profile.manufacturing.config.install_modules_wizard,sale_crm:0
@ -168,7 +168,7 @@ msgstr ""
#. module: profile_manufacturing
#: field:profile.manufacturing.config.install_modules_wizard,mrp_repair:0
msgid "Repair"
msgstr ""
msgstr "Reparatie"
#. module: profile_manufacturing
#: help:profile.manufacturing.config.install_modules_wizard,sale_margin:0
@ -197,12 +197,12 @@ msgstr ""
#. module: profile_manufacturing
#: field:profile.manufacturing.config.install_modules_wizard,warning:0
msgid "Warning"
msgstr ""
msgstr "Waarschuwing"
#. module: profile_manufacturing
#: field:profile.manufacturing.config.install_modules_wizard,sale_margin:0
msgid "Margins on Sales Order"
msgstr ""
msgstr "Marges op verkooporder"
#. module: profile_manufacturing
#: help:profile.manufacturing.config.install_modules_wizard,stock_location:0
@ -217,14 +217,14 @@ msgstr ""
#. module: profile_manufacturing
#: view:profile.manufacturing.config.install_modules_wizard:0
msgid "Cancel"
msgstr ""
msgstr "Annuleren"
#. module: profile_manufacturing
#: field:profile.manufacturing.config.install_modules_wizard,point_of_sale:0
msgid "Point of Sale"
msgstr ""
msgstr "Verkooppunt"
#. module: profile_manufacturing
#: field:profile.manufacturing.config.install_modules_wizard,stock_location:0
msgid "Advanced Locations"
msgstr ""
msgstr "Uitgebreide locaties"

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: 2010-01-25 21:17+0000\n"
"Last-Translator: marath <Unknown>\n"
"PO-Revision-Date: 2010-04-13 05:53+0000\n"
"Last-Translator: grisha <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-03-30 03:52+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:49+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: project
@ -24,12 +24,12 @@ msgstr "Назначенные задания"
#. module: project
#: model:process.process,name:project.process_process_tasksprocess0
msgid "Tasks Process"
msgstr ""
msgstr "Ход заданий"
#. module: project
#: help:project.task.delegate,init,name:0
msgid "New title of the task delegated to the user."
msgstr "Новое название задания, порученного пользователю."
msgstr "Новый заголовок задания, назначенного пользователю"
#. module: project
#: view:config.compute.remaining:0
@ -44,17 +44,17 @@ msgstr "Закрыть задание"
#. module: project
#: view:project.task:0
msgid "Project Tasks"
msgstr ""
msgstr "Задания проекта"
#. module: project
#: model:process.transition,name:project.process_transition_opendonetask0
msgid "Open Done Task"
msgstr ""
msgstr "Открыть выполненные задания"
#. module: project
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Недопустимое имя модели в определении действия"
#. module: project
#: wizard_field:project.task.delegate,init,planned_hours_me:0
@ -108,6 +108,8 @@ msgid ""
"Header added at the beginning of the email for the warning message sent to "
"the customer when a task is closed."
msgstr ""
"Заголовок, добавляемый в начало электронного письма для предупреждения, "
"отправляемого заказчику при закрытии задачи."
#. module: project
#: field:project.task,priority:0
@ -182,7 +184,7 @@ msgstr "Мои выполняемые задания"
#. module: project
#: view:project.project:0
msgid "Set as Template"
msgstr ""
msgstr "Установить как Шаблон"
#. module: project
#: model:process.node,name:project.process_node_drafttask0
@ -246,6 +248,8 @@ msgstr "Мои Черновики заданий"
msgid ""
"Automatic variables for headers and footer. Use exactly the same notation."
msgstr ""
"Автоматические переменные для колонтитулов. Используйте в точности то же "
"самое написание."
#. module: project
#: selection:project.project,state:0
@ -262,7 +266,7 @@ msgstr "Заголовок письма"
#. module: project
#: model:process.node,name:project.process_node_donetask0
msgid "Done task"
msgstr ""
msgstr "Выполненное задание"
#. module: project
#: model:process.node,note:project.process_node_donetask0
@ -272,7 +276,7 @@ msgstr "Задание завершено"
#. module: project
#: model:process.transition,note:project.process_transition_delegate0
msgid "Delegates tasks to the other user"
msgstr ""
msgstr "Поручить задания другому пользователю"
#. module: project
#: help:project.task,effective_hours:0
@ -412,7 +416,7 @@ msgstr "Тип"
#. module: project
#: selection:res.company,project_time_mode:0
msgid "Weeks"
msgstr ""
msgstr "Нед"
#. module: project
#: model:ir.actions.act_window,name:project.action_view_task5_prog
@ -523,7 +527,7 @@ msgstr "Проекты"
#. module: project
#: view:project.task:0
msgid "Dates"
msgstr ""
msgstr "Даты"
#. module: project
#: field:project.task,history:0
@ -650,7 +654,7 @@ msgstr "Информация"
#. module: project
#: view:project.task:0
msgid "Review"
msgstr ""
msgstr "Обзор"
#. module: project
#: view:project.project:0
@ -682,7 +686,7 @@ msgstr "Низкий"
#. module: project
#: field:project.project,manager:0
msgid "Project Manager"
msgstr ""
msgstr "Руководитель проекта"
#. module: project
#: view:project.project:0
@ -714,7 +718,7 @@ msgstr ""
#: field:project.project,complete_name:0
#: field:project.project,name:0
msgid "Project Name"
msgstr ""
msgstr "Наименование проекта"
#. module: project
#: wizard_button:project.task.close,mail_ask,mail_send:0
@ -724,7 +728,7 @@ msgstr "Отправить сообщение"
#. module: project
#: field:project.project,total_hours:0
msgid "Total Time"
msgstr ""
msgstr "Всего времени"
#. module: project
#: field:project.task,active:0
@ -734,7 +738,7 @@ msgstr "Активен"
#. module: project
#: model:project.task.type,name:project.project_tt_bug
msgid "Bug"
msgstr ""
msgstr "Ошибка"
#. module: project
#: model:project.task.type,name:project.project_tt_quote
@ -765,12 +769,12 @@ msgstr "Открыть задание"
#. module: project
#: field:project.project,timesheet_id:0
msgid "Working Time"
msgstr ""
msgstr "Рабочее время"
#. module: project
#: selection:res.company,project_time_mode:0
msgid "Months"
msgstr ""
msgstr "Мес"
#. module: project
#: model:process.transition,note:project.process_transition_opendonetask0
@ -798,7 +802,7 @@ msgstr "Проекты пользователя"
#. module: project
#: view:project.project:0
msgid "Reactivate Project"
msgstr ""
msgstr "Возобновить проект"
#. module: project
#: selection:project.task,priority:0
@ -813,7 +817,7 @@ msgstr "Делегировать данное задание пользоват
#. module: project
#: field:project.task,delegated_user_id:0
msgid "Delegated To"
msgstr ""
msgstr "Поручено"
#. module: project
#: field:project.task,date_close:0

View File

@ -110,11 +110,11 @@
<field name="arch" type="xml">
<search string="Search Project">
<group col='15' colspan='4'>
<filter icon="terp-project" string="Current" domain="[('state', 'in',('open','draft'))]" help="Open and Draft Projects"/>
<filter icon="terp-project" string="Current" domain="[('state', 'in',('open','draft'))]" help="Open and Draft Projects" name="open"/>
<filter icon="terp-project" string="Pending" domain="[('state', '=', 'pending')]" help="Pending Projects"/>
<separator orientation="vertical"/>
<filter icon="terp-project" string="Manager" domain="[('user_id', '=', uid)]" help="Projects in which I am a manager."/>
<filter icon="terp-project" string="Member" domain="['|',('user_id', '=', uid),('members', '=', uid)]" help="Projects in which I am a member."/>
<filter icon="terp-project" string="Member" domain="['|',('user_id', '=', uid),('members', '=', uid)]" help="Projects in which I am a member." name="member"/>
<separator orientation="vertical"/>
<filter icon="terp-project" string="Templates" domain="[('state','=','template')]" help="Template Projects"/>
<separator orientation="vertical"/>
@ -152,7 +152,7 @@
<field name="view_type">form</field>
<field name="domain">[]</field>
<field name="view_id" ref="view_project"/>
<field name="context">{"search_default_Current":1,"search_default_Member":1}</field>
<field name="context">{"search_default_open":1,"search_default_member":1}</field>
<field name="search_view_id" ref="view_project_project_filter"/>
</record>
<menuitem action="open_view_project_all" id="menu_open_view_project_all" parent="menu_project_management" sequence="1"/>
@ -403,7 +403,7 @@
<field name="arch" type="xml">
<search string="Task Edition">
<group col="20" colspan="4">
<filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Tasks" icon="terp-project"/>
<filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Tasks" icon="terp-project" name="current"/>
<filter string="In Progress" domain="[('state','=','open')]" help="Open Tasks" icon="terp-project"/>
<filter string="Pending" domain="[('state','=','pending')]" context="{'show_delegated':False}" help="Pending Tasks" icon="terp-project"/>
<separator orientation="vertical"/>
@ -414,7 +414,7 @@
<filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
</field>
<field name="user_id" select="1" widget="selection">
<filter domain="[('user_id','=',uid)]" help="My Tasks" icon="gtk-execute" string="My Task"/>
<filter domain="[('user_id','=',uid)]" help="My Tasks" icon="gtk-execute" name="my_task"/>
<filter domain="[('user_id','=',False)]" help="Unassigned Tasks" icon="gtk-execute" separator="1"/>
</field>
</group>
@ -440,7 +440,7 @@
<field name="view_mode">tree,form,calendar,gantt,graph</field>
<field eval="False" name="filter"/>
<field name="view_id" ref="view_task_tree2"/>
<field name="context">{"search_default_Current":1,"search_default_My Task":1}</field>
<field name="context">{"search_default_current":1,"search_default_my_task":1}</field>
<field name="search_view_id" ref="view_task_search_form"/>
</record>
<menuitem action="action_view_task" id="menu_action_view_task" parent="project.menu_project_management" sequence="2"/>
@ -607,7 +607,7 @@
<field name="subject"/>
<field name="project_id" select="1" widget="selection"/>
<field name="user_id" select="1" widget="selection">
<filter domain="[('user_id','=',uid)]" help="My Message" icon="gtk-execute" string="My Msg"/>
<filter domain="[('user_id','=',uid)]" help="My Message" icon="gtk-execute" name="my_msg"/>
</field>
</group>
<newline/>
@ -626,7 +626,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_project_message_tree"/>
<field name="context">{"search_default_My Msg":1}</field>
<field name="context">{"search_default_my_msg":1}</field>
<field name="search_view_id" ref="view_project_message_search"/>
</record>

View File

@ -42,9 +42,9 @@
<separator orientation="vertical"/>
<field name="project_id"/>
<field name="user_id" widget="selection">
<filter icon="terp-project" string="My Task" domain="[('user_id','=',uid)]"/>
<filter icon="terp-project" string="My Task" domain="[('user_id','=',uid)]" name="my_task"/>
</field>
</group>
</group>
<newline/>
<group expand="1" string="Group By...">
<filter string="User" icon="terp-project" context="{'group_by':'user_id'}" />
@ -64,7 +64,7 @@
<field name="res_model">report.project.task.user</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="context">{"search_default_My Task":1}</field>
<field name="context">{"search_default_my_task":1}</field>
<field name="search_view_id" ref="view_task_project_user_search"/>
</record>
<menuitem action="action_project_task_user_tree" id="menu_project_task_user_tree" parent="base.menu_project_report"/>

View File

@ -14,7 +14,7 @@
<field name="view_mode">tree,calendar</field>
<field name="view_id" ref="project_issue_tree_view"/>
<field name="domain" eval="[('categ_id','=',ref('bug_categ'))]"/>
<field name="context">{"search_default_My Bugs":1,"search_default_Current Bugs":1,"search_default_project_id":project_id}</field>
<field name="context">{"search_default_my_bugs":1,"search_default_current_bugs":1,"search_default_project_id":project_id}</field>
<field name="search_view_id" ref="view_project_issue_filter"/>
</record>
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view0">

View File

@ -207,10 +207,10 @@
<group>
<field name="name" select='1' string="Subject"/>
<field name="user_id" select="1" widget="selection">
<filter icon="terp-partner" domain="[('user_id','=',uid)]" help="My Bugs" string="My Bugs"/>
<filter icon="terp-partner" domain="[('user_id','=',uid)]" help="My Bugs" name="my_bugs"/>
</field>
<field name="state" select="1">
<filter icon="gtk-new" domain="[('state','in',('open','draft'))]" help="Current Bugs" string="Current Bugs"/>
<filter icon="gtk-new" domain="[('state','in',('open','draft'))]" help="Current Bugs" name="current_bugs"/>
<filter icon="gtk-yes" domain="[('state','=','open')]" help="Open Bugs"/>
</field>
<field name="project_id" select="1" widget="selection" string="Project">
@ -293,10 +293,10 @@
<group>
<field name="name" select='1' string="Feature description"/>
<field name="user_id" select="1" widget="selection">
<filter icon="terp-partner" domain="[('user_id','=',uid)]" help="My Features" string="My Feature"/>
<filter icon="terp-partner" domain="[('user_id','=',uid)]" help="My Features" name="my_feature"/>
</field>
<field name="state" select="1">
<filter icon="gtk-new" domain="[('state','in',('open','draft'))]" help="Current Features" string="Current Feature"/>
<filter icon="gtk-new" domain="[('state','in',('open','draft'))]" help="Current Features" name="current_feature"/>
<filter icon="gtk-yes" domain="[('state','=','open')]" help="Open Features"/>
</field>
<field name="project_id" select="1" widget="selection" string="Project">

View File

@ -196,7 +196,7 @@
<field name="arch" type="xml">
<search string="Project Phases">
<group colspan="4" col="20">
<filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Phases" icon="terp-project" />
<filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft, Open and Pending Phases" icon="terp-project" name="current"/>
<filter string="In Progress" domain="[('state','=','open')]" help="Open Phases" icon="terp-project"/>
<filter string="Pending" domain="[('state','=','pending')]" help="Pending Phases" icon="terp-project"/>
<separator orientation="vertical"/>
@ -205,7 +205,7 @@
<filter domain="[('project_id.user_id','=',uid)]" help="My Projects" icon="terp-project"/>
</field>
<field name="responsible_id" widget="selection">
<filter domain="[('responsible_id','=',uid)]" help="My Phase" icon="gtk-execute" string="My Phase"/>
<filter domain="[('responsible_id','=',uid)]" help="My Phase" icon="gtk-execute" name="my_phase"/>
</field>
<field name="date_start"/>
</group>
@ -225,7 +225,7 @@
<field name="res_model">project.phase</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,calendar,gantt</field>
<field name="context">{"search_default_Current":1,"search_default_My Phase":1}</field>
<field name="context">{"search_default_current":1,"search_default_my_phase":1}</field>
<field name="search_view_id" ref="view_project_phase_search"/>
</record>

View File

@ -7,13 +7,13 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
"PO-Revision-Date: 2009-02-03 06:25+0000\n"
"Last-Translator: <>\n"
"PO-Revision-Date: 2010-04-13 06:03+0000\n"
"Last-Translator: grisha <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-03-30 04:08+0000\n"
"X-Launchpad-Export-Date: 2010-04-14 03:50+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: project_mrp
@ -25,7 +25,7 @@ msgstr ""
#: model:process.node,name:project_mrp.process_node_mrptask0
#: model:process.node,name:project_mrp.process_node_procuretasktask0
msgid "Task"
msgstr ""
msgstr "Задание"
#. module: project_mrp
#: model:process.transition,note:project_mrp.process_transition_ordertask0

View File

@ -6,7 +6,7 @@
Process Node
-->
<record id="process_node_procuretasktask0" model="process.node">
<record id="process_node_procuretasktask0" model="process.node">
<field name="menu_id" ref="project.menu_action_view_task"/>
<field name="model_id" ref="project.model_project_task"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
@ -46,9 +46,9 @@
Process Transition
-->
<record id="process_transition_procuretask0" model="process.transition">
<record id="process_transition_procuretask0" model="process.transition">
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot; Requisition Task&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Procurement Task&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;if product type is 'service' then it creates the task.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_procuretasktask0"/>
<field model="process.node" name="source_node_id" ref="sale.process_node_saleprocurement0"/>
@ -65,35 +65,10 @@
<record id="process_transition_ordertask0" model="process.transition">
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Order Task&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;If Requisition method is Make to order and supply method is produce&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;If procurement method is Make to order and supply method is produce&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_mrptask0"/>
<field model="process.node" name="source_node_id" ref="mrp.process_node_serviceonorder0"/>
</record>
<!--
Process Action
-->
<!-- <record id="process_transition_action_orderconfirmtask0" model="process.transition.action">-->
<!-- <field eval="&quot;&quot;&quot;action_confirm&quot;&quot;&quot;" name="action"/>-->
<!-- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>-->
<!-- <field eval="&quot;&quot;&quot;Confirm&quot;&quot;&quot;" name="name"/>-->
<!-- <field name="transition_id" ref="process_transition_ordertask0"/>-->
<!-- </record>-->
<!-- -->
<!-- <record id="process_transition_action_ordercanceltask0" model="process.transition.action">-->
<!-- <field eval="&quot;&quot;&quot;action_cancel&quot;&quot;&quot;" name="action"/>-->
<!-- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>-->
<!-- <field eval="&quot;&quot;&quot;Cancel&quot;&quot;&quot;" name="name"/>-->
<!-- <field name="transition_id" ref="process_transition_ordertask0"/>-->
<!-- </record>-->
<!-- -->
<!-- <record id="process_transition_action_taskrunprocurement0" model="process.transition.action">-->
<!-- <field eval="&quot;&quot;&quot;write({'state':'exception'})&quot;&quot;&quot;" name="action"/>-->
<!-- <field eval="&quot;&quot;&quot;object&quot;&quot;&quot;" name="state"/>-->
<!-- <field eval="&quot;&quot;&quot;Run Requisition&quot;&quot;&quot;" name="name"/>-->
<!-- <field name="transition_id" ref="process_transition_ordertask0"/>-->
<!-- </record>-->
</data>
</openerp>

View File

@ -26,7 +26,7 @@ class project_task(osv.osv):
_name = "project.task"
_inherit = "project.task"
_columns = {
'procurement_id': fields.many2one('mrp.procurement', 'Requisition', ondelete='set null')
'procurement_id': fields.many2one('mrp.procurement', 'Procurement', ondelete='set null')
}
def do_close(self, cr, uid, ids, *args):
res = super(project_task, self).do_close(cr, uid, ids, *args)

View File

@ -163,7 +163,7 @@
</group>
<newline/>
<group expand="1" string="Group By..." colspan="4" col="3">
<filter string="User" icon="terp-project" context="{'group_by':'user_id'}" />
<filter string="User" name="by_user" icon="terp-project" context="{'group_by':'user_id'}" />
<filter string="Year" icon="terp-project" context="{'group_by':'year'}" />
<filter string="Month" icon="terp-project" context="{'group_by':'month'}" />
</group>
@ -175,7 +175,7 @@
<field name="res_model">report.timesheet.task.user</field>
<field name="view_type">form</field>
<field name="view_mode">tree</field>
<field name="context">{"search_default_User":1}</field>
<field name="context">{"search_default_by_user":1}</field>
<field name="search_view_id" ref="view_report_timesheet_task_user_search"/>
</record>
<menuitem id="menu_timesheet_task_user" parent="hr.menu_hr_reporting" action="action_report_timesheet_task_user"/>

View File

@ -46,11 +46,11 @@
<search string="Purchase Orders">
<group>
<filter icon="terp-purchase"
string="This Year"
string="This Year" name="this_year"
domain="[('name','=',time.strftime('%%Y'))]"
help="Purchase orders of the year"/>
<filter icon="terp-purchase"
string="This Month"
string="This Month" name="this_month"
domain="[('month','=',time.strftime('%%m'))]"
help="Purchase orders of this month"/>
<separator orientation="vertical"/>
@ -58,7 +58,7 @@
string="Quotations"
domain="[('state','=','draft')]"/>
<filter icon="terp-purchase"
string="Purchase"
string="Purchase" name="purchase"
domain="[('state','&lt;&gt;','draft'),('state','&lt;&gt;','cancel')]"/>
<separator orientation="vertical"/>
<field name="product_id"/>
@ -74,7 +74,7 @@
<group expand="1" string="Group By...">
<filter string="Company" icon="terp-purchase" context="{'group_by':'company_id'}"/>
<filter string="Warehouse" icon="terp-purchase" context="{'group_by':'warehouse_id'}"/>
<filter string="Responsible" icon="terp-purchase" context="{'group_by':'user_id'}"/>
<filter string="Responsible" name="by_user" icon="terp-purchase" context="{'group_by':'user_id'}"/>
<separator orientation="vertical"/>
<filter string="Product" icon="terp-purchase" context="{'group_by':'product_id'}"/>
<filter string="Product Category" icon="terp-purchase" context="{'group_by':'category_id'}"/>
@ -93,7 +93,7 @@
<field name="res_model">report.purchase.order</field>
<field name="view_type">form</field>
<field name="view_mode">tree,graph</field>
<field name="context">{"search_default_This Year":1,"search_default_This Month":1,"search_default_Purchase":1,"search_default_Responsible":1}</field>
<field name="context">{"search_default_this_year":1,"search_default_this_month":1,"search_default_purchase":1,"search_default_by_user":1}</field>
<field name="search_view_id" ref="view_purchase_order_search"/>
</record>

View File

@ -17,7 +17,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import purchase_tender
import purchase_requisition
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -18,27 +18,23 @@
#
##############################################################################
{
"name" : "Purchase - Purchase Tender",
"name" : "Purchase - Purchase Requisition",
"version" : "0.1",
"author" : "Tiny",
"category" : "Generic Modules/Sales & Purchases",
"website" : "http://www.openerp.com",
"description": """
This module allows you to manage your Purchase Tenders.
When a purchase order is created, you now have the opportunity to save the related tender.
This module allows you to manage your Purchase Requisition.
When a purchase order is created, you now have the opportunity to save the related requisition.
This new object will regroup and will allow you to easily keep track and order all your purchase orders.
""",
"depends" : ["purchase","mrp"],
"init_xml" : [],
"demo_xml" : [],
"update_xml" : [
"wizard//purchase_tender_partner.xml",
"purchase_tender_view.xml",
"security/purchase_tender.xml",
"security/ir.model.access.csv",
"purchase_tender_sequence.xml",
],
"update_xml" : [ "wizard//purchase_tender_partner.xml",
"purchase_requisition_view.xml",
"security/ir.model.access.csv","purchase_requisition_sequence.xml"],
"active": False,
"installable": True
}

View File

@ -0,0 +1,134 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * purchase_requisition
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.6\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-11-25 14:07:40+0000\n"
"PO-Revision-Date: 2009-11-25 14:07:40+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: purchase_requisition
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML incorrect pour l'Architecture des Vues!"
#. module: purchase_requisition
#: field:purchase.requisition,date_end:0
msgid "Date End"
msgstr "Date de fin"
#. module: purchase_requisition
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr "Le nom de l'Objet doit commencer par x_ et ne pas comporter de caractères spéciaux !"
#. module: purchase_requisition
#: view:purchase.requisition:0
#: field:purchase.requisition,description:0
msgid "Description"
msgstr "Description"
#. module: purchase_requisition
#: model:ir.model,name:purchase_requisition.model_purchase_requisition
#: field:purchase.order,requisition_id:0
#: view:purchase.requisition:0
msgid "Purchase requisition"
msgstr "Appel d'Offre"
#. module: purchase_requisition
#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition
#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition1
#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition
msgid "Purchase requisitions"
msgstr "Appels d'offre"
#. module: purchase_requisition
#: selection:purchase.requisition,state:0
msgid "Open"
msgstr "Ouvert"
#. module: purchase_requisition
#: field:purchase.requisition,user_id:0
msgid "Responsible"
msgstr "Responsable"
#. module: purchase_requisition
#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition_draft
#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition1_draft
msgid "Draft Purchase requisitions"
msgstr "Appels d'Offre brouillons"
#. module: purchase_requisition
#: field:purchase.requisition,state:0
msgid "State"
msgstr "Etat"
#. module: purchase_requisition
#: selection:purchase.requisition,state:0
msgid "Draft"
msgstr "Brouillon"
#. module: purchase_requisition
#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition_open
#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition1_open
msgid "Open Purchase requisitions"
msgstr "Appels d'offre ouverts"
#. module: purchase_requisition
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nom de modèle incorrect pour la définition de l'action"
#. module: purchase_requisition
#: model:ir.module.module,shortdesc:purchase_requisition.module_meta_information
msgid "Purchase - Purchase requisition"
msgstr "Achat - Appel d'offre"
#. module: purchase_requisition
#: field:purchase.requisition,name:0
msgid "requisition Reference"
msgstr "Référence"
#. module: purchase_requisition
#: selection:purchase.requisition,state:0
msgid "Close"
msgstr "Clôturé"
#. module: purchase_requisition
#: field:purchase.requisition,date_start:0
msgid "Date Start"
msgstr "Date de début"
#. module: purchase_requisition
#: view:purchase.requisition:0
msgid "Quotations"
msgstr ""
#. module: purchase_requisition
#: model:ir.module.module,description:purchase_requisition.module_meta_information
msgid " This module allows you to manage your Purchase requisitions. When a purchase order is created, you now have the opportunity to save the related requisition. \n"
" This new object will regroup and will allow you to easily keep track and order all your purchase orders.\n"
""
msgstr "Ce module vous permet de gérer des appels d'offre. Quand un appel d'offre est créé, vous avez maintenant l'opportunité de conserver une trace. \n"
" Ce nouvel objet regroupe et conserve la trace de tous vos appels d'offre.\n"
""
#. module: purchase_requisition
#: model:ir.actions.act_window,name:purchase_requisition.action_purchase_requisition_new
#: model:ir.ui.menu,name:purchase_requisition.menu_purchase_requisition1_new
msgid "New Purchase requisitions"
msgstr "Nouveaux Appels d'Offre"
#. module: purchase_requisition
#: field:purchase.requisition,purchase_ids:0
msgid "Purchase Orders"
msgstr "Bons d'achat"

View File

@ -25,28 +25,28 @@ from osv import orm
import netsvc
import time
class purchase_tender(osv.osv):
_name = "purchase.tender"
_description="Purchase Tender"
class purchase_requisition(osv.osv):
_name = "purchase.requisition"
_description="Purchase requisition"
_columns = {
'name': fields.char('Tender Reference', size=32,required=True),
'date_start': fields.datetime('Date Start'),
'date_end': fields.datetime('Date End',readonly=True),
'name': fields.char('Requisition Reference', size=32,required=True),
'origin': fields.char('Origin', size=32),
'date_start': fields.datetime('Requisition Date'),
'date_end': fields.datetime('Requisition Deadline'),
'user_id': fields.many2one('res.users', 'Responsible'),
'exclusive': fields.boolean('Exclusive', help="If the tender is exclusive, it will cancel all purchase orders when you confirm one of them"),
'exclusive': fields.selection([('exclusive','Purchase Tender (exclusive)'),('multiple','Multiple Requisitions')],'Requisition Type', help="If the requisition is exclusive, it will cancel all purchase orders when you confirm one of them", required=True),
'description': fields.text('Description'),
'purchase_ids' : fields.one2many('purchase.order','tender_id','Purchase Orders'),
'line_ids' : fields.one2many('purchase.tender.line','tender_id','Products to Purchase'),
'company_id': fields.many2one('res.company', 'Company', required=True),
'state': fields.selection([('draft','Draft'),('open','Open'),('cancel','Cancel'),('close','Close'),('in_progress','In progress'),('done','Done')], 'State', required=True)
'purchase_ids' : fields.one2many('purchase.order','requisition_id','Purchase Orders'),
'line_ids' : fields.one2many('purchase.requisition.line','requisition_id','Products to Purchase'),
'state': fields.selection([('draft','Draft'),('open','Open'),('cancel','Cancelled'),('close','Close')], 'State', required=True)
}
_defaults = {
'date_start': lambda *args: time.strftime('%Y-%m-%d %H:%M:%S'),
'user_id': lambda obj, cr, uid, context: uid,
'state': lambda *args: 'open',
'name': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'purchase.order.tender'),
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
'exclusive': lambda *args: 'multiple',
'name': lambda obj, cr, uid, context: obj.pool.get('ir.sequence').get(cr, uid, 'purchase.order.requisition'),
}
def tender_close(self, cr, uid, ids, context={}):
self.write(cr, uid, ids, {'state': 'done', 'date_end': time.strftime('%Y-%m-%d %H:%M:%S')})
return True
@ -73,18 +73,22 @@ class purchase_tender(osv.osv):
return True
purchase_tender()
class purchase_tender_line(osv.osv):
_name = "purchase.tender.line"
_description="Purchase Tender Line"
purchase_requisition()
class purchase_requisition_line(osv.osv):
_name = "purchase.requisition.line"
_description="Purchase Requisition Line"
_rec_name = 'product_id'
_columns = {
'product_id': fields.many2one('product.product', 'Product'),
'product_uom_id': fields.many2one('product.uom', 'Product UoM'),
'product_qty': fields.float('Quantity', digits=(16,2)),
'tender_id' : fields.many2one('purchase.tender','Purchase Tender', ondelete='cascade'),
'company_id': fields.many2one('res.company', 'Company', required=True),
'product_qty': fields.float('Date End', digits=(16,2)),
'requisition_id' : fields.many2one('purchase.requisition','Purchase Requisition', ondelete='cascade')
}
def onchange_product_id(self, cr, uid, ids, product_id, context={}):
@ -105,23 +109,26 @@ class purchase_tender_line(osv.osv):
_defaults = {
'company_id': lambda self,cr,uid,c: self.pool.get('res.users').browse(cr, uid, uid, c).company_id.id,
}
purchase_tender_line()
purchase_requisition_line()
class purchase_order(osv.osv):
_inherit = "purchase.order"
_description = "purchase order"
_columns = {
'tender_id' : fields.many2one('purchase.tender','Purchase Tender')
'requisition_id' : fields.many2one('purchase.requisition','Purchase Requisition')
}
def wkf_confirm_order(self, cr, uid, ids, context={}):
res = super(purchase_order, self).wkf_confirm_order(cr, uid, ids, context)
for po in self.browse(cr, uid, ids, context):
if po.tender_id and po.tender_id.exclusive:
for order in po.tender_id.purchase_ids:
if po.requisition_id and (po.requisition_id.exclusive=='exclusive'):
for order in po.requisition_id.purchase_ids:
if order.id<>po.id:
wf_service = netsvc.LocalService("workflow")
wf_service.trg_validate(uid, 'purchase.order', order.id, 'purchase_cancel', cr)
self.pool.get('purchase.tender').write(cr, uid, [po.tender_id.id], {'state':'close','date_end':time.strftime('%Y-%m-%d %H:%M:%S')})
self.pool.get('purchase.requisition').write(cr, uid, [po.requisition_id.id], {'state':'close','date_end':time.strftime('%Y-%m-%d %H:%M:%S')})
return res
@ -131,10 +138,10 @@ purchase_order()
class product_product(osv.osv):
_inherit = 'product.product'
_columns = {
'purchase_tender': fields.boolean('Purchase Tender', help="Check this box so that requisitions generates purchase tenders instead of directly requests for quotations.")
'purchase_requisition': fields.boolean('Purchase Requisition', help="Check this box so that requisitions generates purchase requisitions instead of directly requests for quotations.")
}
_defaults = {
'purchase_tender': lambda *args: False
'purchase_requisition': lambda *args: False
}
product_product()
@ -146,9 +153,11 @@ class mrp_procurement(osv.osv):
res = super(mrp_procurement, self).make_po(cr, uid, ids, context)
for proc_id,po_id in res.items():
procurement = self.browse(cr, uid, proc_id)
if procurement.product_id.purchase_tender:
self.pool.get('purchase.tender').create(cr, uid, {
'name': sequence_obj.get(cr, uid, 'purchase.order.tender'),
if procurement.product_id.purchase_requisition:
self.pool.get('purchase.requisition').create(cr, uid, {
'name': procurement.name,
'origin': procurement.name,
'date_end': procurement.date_planned,
'lines_ids': [(0,0,{
'product_id': procurement.product_id.id,
'product_uom_id': procurement.product_uom.id,
@ -157,4 +166,5 @@ class mrp_procurement(osv.osv):
})],
'purchase_ids': [(6,0,[po_id])]
})
return res
mrp_procurement()

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- Sequences for purchase.order -->
<record id="seq_type_purchase_requisition" model="ir.sequence.type">
<field name="name">Purchase Requisition Order</field>
<field name="code">purchase.order.requisition</field>
</record>
<record id="seq_purchase_requisition" model="ir.sequence">
<field name="name">Purchase Requisition Order</field>
<field name="code">purchase.order.requisition</field>
<field name="prefix">TE</field>
<field name="padding">5</field>
</record>
</data>
</openerp>

View File

@ -9,7 +9,7 @@
<field name="inherit_id" ref="purchase.purchase_order_tree"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="tender_id"/>
<field name="requisition_id"/>
</field>
</field>
</record>
@ -21,23 +21,27 @@
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<field name="partner_ref" position="after">
<field name="tender_id"/>
<field name="requisition_id"/>
</field>
</field>
</record>
<record model="ir.ui.view" id="view_purchase_tender_form">
<field name="name">purchase.tender.form</field>
<record model="ir.ui.view" id="view_purchase_requisition_form">
<field name="name">purchase.requisition.form</field>
<field name="type">form</field>
<field name="model">purchase.tender</field>
<field name="model">purchase.requisition</field>
<field name="arch" type="xml">
<form string="Purchase Tender">
<field name="name" select="1"/>
<field name="user_id" select="1"/>
<field name="date_start"/>
<field name="date_end"/>
<field name="exclusive"/>
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
<form string="Purchase Requisition">
<group colspan="4" col="6">
<field name="name" select="1"/>
<field name="user_id" select="1"/>
<field name="exclusive" select="1"/>
<field name="date_start"/>
<field name="date_end"/>
<field name="origin"/>
<field name="company_id" select="1" groups="base.group_multi_company" widget="selection"/>
</group>
<notebook colspan="4">
<page string="Products">
<field name="line_ids" colspan="4" nolabel="1">
@ -80,19 +84,22 @@
</form>
</field>
</record>
<record model="ir.ui.view" id="view_purchase_tender_tree">
<field name="name">purchase.tender.tree</field>
<record model="ir.ui.view" id="view_purchase_requisition_tree">
<field name="name">purchase.requisition.tree</field>
<field name="type">tree</field>
<field name="model">purchase.requisition</field>
<field name="arch" type="xml">
<tree string="Purchase Tender">
<tree string="Purchase Requisition">
<field name="name"/>
<field name="user_id"/>
<field name="date_start"/>
<field name="date_end"/>
<field name="origin"/>
<field name="state"/>
</tree>
</field>
</record>
<record id="view_purchase_tender_filter" model="ir.ui.view">
<field name="name">purchase.tender.list.select</field>
<field name="model">purchase.tender</field>
@ -120,16 +127,21 @@
</field>
</record>
<record model="ir.actions.act_window" id="action_purchase_tender">
<field name="name">Purchase Tenders</field>
<record model="ir.actions.act_window" id="action_purchase_requisition">
<field name="name">Purchase Requisitions</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.tender</field>
<field name="res_model">purchase.requisition</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="view_purchase_tender_filter"/>
</record>
<menuitem id="menu_purchase_Tender_pro_mgt" parent="purchase.menu_procurement_management" action="action_purchase_tender"/>
<menuitem
id="menu_purchase_requisition_pro_mgt"
sequence="0"
parent="purchase.menu_procurement_management"
action="action_purchase_requisition"/>
<record model="ir.ui.view" id="product_normal_form_view_inherit">
<field name="name">product.form.inherit</field>
@ -139,7 +151,7 @@
<field name="arch" type="xml">
<field name="supply_method" position="after">
<group colspan="2" col="2" attrs="{'invisible': [('supply_method','&lt;&gt;','buy')]}">
<field name="purchase_tender"/>
<field name="purchase_requisition"/>
</group>
</field>
</field>

View File

@ -0,0 +1,3 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_purchase_requisition","purchase.requisition","model_purchase_requisition","purchase.group_purchase_user",1,1,1,1
"access_purchase_requisition_line","purchase.requisition.line","model_purchase_requisition_line","purchase.group_purchase_user",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_purchase_requisition purchase.requisition model_purchase_requisition purchase.group_purchase_user 1 1 1 1
3 access_purchase_requisition_line purchase.requisition.line model_purchase_requisition_line purchase.group_purchase_user 1 1 1 1

View File

@ -1,134 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
# * purchase_tender
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 5.0.6\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2009-11-25 14:07:40+0000\n"
"PO-Revision-Date: 2009-11-25 14:07:40+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: purchase_tender
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr "XML incorrect pour l'Architecture des Vues!"
#. module: purchase_tender
#: field:purchase.tender,date_end:0
msgid "Date End"
msgstr "Date de fin"
#. module: purchase_tender
#: constraint:ir.model:0
msgid "The Object name must start with x_ and not contain any special character !"
msgstr "Le nom de l'Objet doit commencer par x_ et ne pas comporter de caractères spéciaux !"
#. module: purchase_tender
#: view:purchase.tender:0
#: field:purchase.tender,description:0
msgid "Description"
msgstr "Description"
#. module: purchase_tender
#: model:ir.model,name:purchase_tender.model_purchase_tender
#: field:purchase.order,tender_id:0
#: view:purchase.tender:0
msgid "Purchase Tender"
msgstr "Appel d'Offre"
#. module: purchase_tender
#: model:ir.actions.act_window,name:purchase_tender.action_purchase_tender
#: model:ir.ui.menu,name:purchase_tender.menu_purchase_Tender1
#: model:ir.ui.menu,name:purchase_tender.menu_purchase_tender
msgid "Purchase Tenders"
msgstr "Appels d'offre"
#. module: purchase_tender
#: selection:purchase.tender,state:0
msgid "Open"
msgstr "Ouvert"
#. module: purchase_tender
#: field:purchase.tender,user_id:0
msgid "Responsible"
msgstr "Responsable"
#. module: purchase_tender
#: model:ir.actions.act_window,name:purchase_tender.action_purchase_tender_draft
#: model:ir.ui.menu,name:purchase_tender.menu_purchase_Tender1_draft
msgid "Draft Purchase Tenders"
msgstr "Appels d'Offre brouillons"
#. module: purchase_tender
#: field:purchase.tender,state:0
msgid "State"
msgstr "Etat"
#. module: purchase_tender
#: selection:purchase.tender,state:0
msgid "Draft"
msgstr "Brouillon"
#. module: purchase_tender
#: model:ir.actions.act_window,name:purchase_tender.action_purchase_tender_open
#: model:ir.ui.menu,name:purchase_tender.menu_purchase_Tender1_open
msgid "Open Purchase Tenders"
msgstr "Appels d'offre ouverts"
#. module: purchase_tender
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr "Nom de modèle incorrect pour la définition de l'action"
#. module: purchase_tender
#: model:ir.module.module,shortdesc:purchase_tender.module_meta_information
msgid "Purchase - Purchase Tender"
msgstr "Achat - Appel d'offre"
#. module: purchase_tender
#: field:purchase.tender,name:0
msgid "Tender Reference"
msgstr "Référence"
#. module: purchase_tender
#: selection:purchase.tender,state:0
msgid "Close"
msgstr "Clôturé"
#. module: purchase_tender
#: field:purchase.tender,date_start:0
msgid "Date Start"
msgstr "Date de début"
#. module: purchase_tender
#: view:purchase.tender:0
msgid "Quotations"
msgstr ""
#. module: purchase_tender
#: model:ir.module.module,description:purchase_tender.module_meta_information
msgid " This module allows you to manage your Purchase Tenders. When a purchase order is created, you now have the opportunity to save the related tender. \n"
" This new object will regroup and will allow you to easily keep track and order all your purchase orders.\n"
""
msgstr "Ce module vous permet de gérer des appels d'offre. Quand un appel d'offre est créé, vous avez maintenant l'opportunité de conserver une trace. \n"
" Ce nouvel objet regroupe et conserve la trace de tous vos appels d'offre.\n"
""
#. module: purchase_tender
#: model:ir.actions.act_window,name:purchase_tender.action_purchase_tender_new
#: model:ir.ui.menu,name:purchase_tender.menu_purchase_Tender1_new
msgid "New Purchase Tenders"
msgstr "Nouveaux Appels d'Offre"
#. module: purchase_tender
#: field:purchase.tender,purchase_ids:0
msgid "Purchase Orders"
msgstr "Bons d'achat"

View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="1">
<!-- Sequences for purchase.order -->
<record id="seq_type_purchase_tender_order" model="ir.sequence.type">
<field name="name">Purchase Tender Order</field>
<field name="code">purchase.order.tender</field>
</record>
<record id="seq_purchase_tender_order" model="ir.sequence">
<field name="name">Purchase Tender Order</field>
<field name="code">purchase.order.tender</field>
<field name="prefix">TE</field>
<field name="padding">5</field>
</record>
</data>
</openerp>

View File

@ -1,3 +0,0 @@
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_purchase_tender_manager","purchase.tender","model_purchase_tender","group_purchase_tender_manager",1,1,1,1
"access_purchase_tender_user","purchase.tender","model_purchase_tender","group_purchase_tender_user",1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_purchase_tender_manager purchase.tender model_purchase_tender group_purchase_tender_manager 1 1 1 1
3 access_purchase_tender_user purchase.tender model_purchase_tender group_purchase_tender_user 1 0 0 0

View File

@ -7,206 +7,208 @@ 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:25+0000\n"
"Last-Translator: <>\n"
"PO-Revision-Date: 2010-04-15 10:57+0000\n"
"Last-Translator: geopop65 <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-03-30 04:13+0000\n"
"X-Launchpad-Export-Date: 2010-04-16 03:54+0000\n"
"X-Generator: Launchpad (build Unknown)\n"
#. module: report_document
#: field:report.document.user,create_date:0
#: field:report.files.partner,create_date:0
msgid "Date Created"
msgstr ""
msgstr "Data creării"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_files_by_partner
msgid "Files Per Month"
msgstr ""
msgstr "Fişiere pe lună"
#. module: report_document
#: constraint:ir.model:0
msgid ""
"The Object name must start with x_ and not contain any special character !"
msgstr ""
"Numele obiectului trebuie să înceapă cu x_ şi să nu conţină nici un caracter "
"special !"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_wall
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_shame
#: view:report.document.wall:0
msgid "Wall of Shame"
msgstr ""
msgstr "Panoul ruşinii"
#. module: report_document
#: model:ir.model,name:report_document.model_report_files_partner
msgid "Files details by Partners"
msgstr ""
msgstr "Detalii fişier după parteneri"
#. module: report_document
#: field:report.document.file,file_size:0
#: field:report.document.user,file_size:0
#: field:report.files.partner,file_size:0
msgid "File Size"
msgstr ""
msgstr "Mărime fişier"
#. module: report_document
#: constraint:ir.actions.act_window:0
msgid "Invalid model name in the action definition."
msgstr ""
msgstr "Nume invalid de model în definirea acțiunii"
#. module: report_document
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_all
msgid "All Months"
msgstr ""
msgstr "Toate lunile"
#. module: report_document
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_all_myfile
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_this_myfile
msgid "My files"
msgstr ""
msgstr "Fişierele mele"
#. module: report_document
#: view:report.document.user:0
msgid "Files by users"
msgstr ""
msgstr "Fişiere după utilizatori"
#. module: report_document
#: view:report.document.user:0
msgid "Files"
msgstr ""
msgstr "Fişiere"
#. module: report_document
#: view:report.files.partner:0
msgid "Files per Month"
msgstr ""
msgstr "Fişiere pe lună"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_my_document_tree1
msgid "My files (All months)"
msgstr ""
msgstr "Fişierele mele (toale lunile)"
#. module: report_document
#: field:report.document.wall,file_name:0
msgid "Last Posted File Name"
msgstr ""
msgstr "Numele ultimului fişier postat"
#. module: report_document
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report
msgid "Reporting"
msgstr ""
msgstr "Raportare"
#. module: report_document
#: model:ir.model,name:report_document.model_report_document_wall
msgid "Users that did not inserted documents since one month"
msgstr ""
msgstr "Utilizatori care nu au inserat documente în ultima lună"
#. module: report_document
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document
msgid "Document Management"
msgstr ""
msgstr "Managementul documentelor"
#. module: report_document
#: field:report.document.user,type:0
#: field:report.files.partner,type:0
msgid "Directory Type"
msgstr ""
msgstr "Tip de director"
#. module: report_document
#: view:report.files.partner:0
msgid "Files By Partner"
msgstr ""
msgstr "Fişiere după parteneri"
#. module: report_document
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_this
msgid "This Month"
msgstr ""
msgstr "Luna curentă"
#. module: report_document
#: field:report.document.user,user:0
#: field:report.document.wall,user:0
msgid "User"
msgstr ""
msgstr "Utilizator"
#. module: report_document
#: constraint:ir.ui.view:0
msgid "Invalid XML for View Architecture!"
msgstr ""
msgstr "XML invalid pentru arhitectura machetei de afișare !"
#. module: report_document
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_all_userfile
#: model:ir.ui.menu,name:report_document.menu_action_view_my_document_report_this_userfile
msgid "All Users files"
msgstr ""
msgstr "Fişierele tuturor utilizatorilor"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_my_document_tree
msgid "My files (This months)"
msgstr ""
msgstr "Fişierele mele (luna curentă)"
#. module: report_document
#: model:ir.model,name:report_document.model_report_document_user
msgid "Files details by Users"
msgstr ""
msgstr "Detalii fişiere după utilizator"
#. module: report_document
#: field:report.document.user,user_id:0
#: field:report.document.wall,user_id:0
msgid "Owner"
msgstr ""
msgstr "Deținător"
#. module: report_document
#: field:report.document.file,nbr:0
#: field:report.document.user,nbr:0
#: field:report.files.partner,nbr:0
msgid "# of Files"
msgstr ""
msgstr "Număr de fişiere"
#. module: report_document
#: field:report.document.user,directory:0
#: field:report.files.partner,directory:0
msgid "Directory"
msgstr ""
msgstr "Director"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_user_graph
msgid "Files By Users"
msgstr ""
msgstr "Fişiere după utilizatori"
#. module: report_document
#: model:ir.module.module,shortdesc:report_document.module_meta_information
msgid "Document Management - Reporting"
msgstr ""
msgstr "Management documente - Raportări"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_all_document_tree1
msgid "All Users files (All months)"
msgstr ""
msgstr "Toate fişierele utilizatorilor (toate lunile)"
#. module: report_document
#: model:ir.model,name:report_document.model_report_document_file
msgid "Files details by Directory"
msgstr ""
msgstr "Detalii fişiere după directoare"
#. module: report_document
#: field:report.document.user,change_date:0
#: field:report.files.partner,change_date:0
msgid "Modified Date"
msgstr ""
msgstr "Data modificării"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_size_month
#: view:report.document.file:0
msgid "File Size by Month"
msgstr ""
msgstr "Mărime fişiere pe luni"
#. module: report_document
#: field:report.document.user,file_title:0
#: field:report.files.partner,file_title:0
msgid "File Name"
msgstr ""
msgstr "Nume fișier"
#. module: report_document
#: field:report.document.file,month:0
@ -216,32 +218,32 @@ msgstr ""
#: field:report.document.wall,name:0
#: field:report.files.partner,name:0
msgid "Month"
msgstr ""
msgstr "Luna"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_files_by_month_graph
#: view:report.document.user:0
msgid "Files by Month"
msgstr ""
msgstr "Fişiere pe luni"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_document_by_resourcetype_graph
#: view:report.document.user:0
msgid "Files by Resource Type"
msgstr ""
msgstr "Fişiere pe tipuri de resursă"
#. module: report_document
#: model:ir.actions.act_window,name:report_document.action_view_all_document_tree
msgid "All Users files (This month)"
msgstr ""
msgstr "Fişierele tuturor utilizatorilor (luna curentă)"
#. module: report_document
#: field:report.document.wall,last:0
msgid "Last Posted Time"
msgstr ""
msgstr "Ora ultimei postări"
#. module: report_document
#: field:report.document.user,partner:0
#: field:report.files.partner,partner:0
msgid "Partner"
msgstr ""
msgstr "Partener"

View File

@ -13,7 +13,7 @@
<group>
<field name="name"/>
<field name="user_id" string="User" widget="selection">
<filter domain="[('user_id','=',uid)]" help="My Resouces" icon="gtk-execute" string="My Resources"/>
<filter domain="[('user_id','=',uid)]" help="My Resouces" icon="gtk-execute" name="my_resources"/>
</field>
<field name="resource_type"/>
<field name="company_id" widget="selection"/>
@ -98,7 +98,7 @@
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" eval="False"/>
<field name="context">{"search_default_My Resources":1}</field>
<field name="context">{"search_default_my_resources":1}</field>
<field name="search_view_id" ref="view_resource_calendar_search"/>
</record>

View File

@ -33,7 +33,7 @@
<field name="model_id" ref="sale.model_sale_order"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Sale Order Requisition&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;Drives requisition orders for every sale order line.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Drives procurement orders for every sale order line.&quot;&quot;&quot;" name="note"/>
<field name="subflow_id" ref="process_process_salesprocess0"/>
<field name="process_id" ref="mrp.process_process_procurementprocess0"/>
<field eval="&quot;&quot;&quot;object.state in ('draft', 'waiting_date', 'manual', 'progress', 'shipping_except', 'invoice_except', 'done', 'cancel')&quot;&quot;&quot;" name="model_states"/>
@ -66,8 +66,8 @@
<field name="menu_id" ref="mrp.menu_mrp_procurement_action"/>
<field name="model_id" ref="mrp.model_mrp_procurement"/>
<field eval="&quot;&quot;&quot;subflow&quot;&quot;&quot;" name="kind"/>
<field eval="&quot;&quot;&quot;Requisition Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;One requisition order for each sale order line and for each of the components.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Procurement Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;One Procurement order for each sale order line and for each of the components.&quot;&quot;&quot;" name="note"/>
<field name="subflow_id" ref="mrp.process_process_procurementprocess0"/>
<field name="process_id" ref="process_process_salesprocess0"/>
<field eval="&quot;&quot;&quot;object.state=='confirmed'&quot;&quot;&quot;" name="model_states"/>
@ -158,8 +158,8 @@
<record id="process_transition_saleprocurement0" model="process.transition">
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Create Requisition Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;A requisition order is automatically created as soon as a sale order is confirmed or as the invoice is paid. It drives the purchasing and the production of products regarding to the rules and to the sale order's parameters. &quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Create Procurement Order&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;A procurement order is automatically created as soon as a sale order is confirmed or as the invoice is paid. It drives the purchasing and the production of products regarding to the rules and to the sale order's parameters. &quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_saleprocurement0"/>
<field model="process.node" name="source_node_id" ref="process_node_saleorder0"/>
</record>
@ -167,7 +167,7 @@
<record id="process_transition_packing0" model="process.transition">
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Create Pick List&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;The Pick List form is created as soon as the sale order is confirmed, in the same time as the requisition order. It represents the assignment of parts to the sale order. There is 1 pick list by sale order line which evolves with the availability of parts.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;The Pick List form is created as soon as the sale order is confirmed, in the same time as the procurement order. It represents the assignment of parts to the sale order. There is 1 pick list by sale order line which evolves with the availability of parts.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="process_node_packinglist0"/>
<field model="process.node" name="source_node_id" ref="process_node_saleprocurement0"/>
</record>
@ -200,8 +200,8 @@
<record id="process_transition_saleorderprocurement0" model="process.transition">
<field eval="[(6,0,[])]" name="role_ids"/>
<field eval="[(6,0,[])]" name="transition_ids"/>
<field eval="&quot;&quot;&quot;Requisition of sold material&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;For every sale order line, a requisition order is created to supply the sold product.&quot;&quot;&quot;" name="note"/>
<field eval="&quot;&quot;&quot;Procurement of sold material&quot;&quot;&quot;" name="name"/>
<field eval="&quot;&quot;&quot;For every sale order line, a procurement order is created to supply the sold product.&quot;&quot;&quot;" name="note"/>
<field model="process.node" name="target_node_id" ref="mrp.process_node_procureproducts0"/>
<field model="process.node" name="source_node_id" ref="process_node_saleorderprocurement0"/>
</record>

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