bzr revid: vir@tinyerp.com-20100921050654-cmsohc1ykbsnjfpy
This commit is contained in:
Vir (Open ERP)
2010-09-21 10:36:54 +05:30
93 changed files with 1084 additions and 733 deletions
-3
View File
@@ -2508,8 +2508,6 @@
<field domain="[('journal_id','=',parent.journal_id)]" name="account_id"/>
<field name="analytic_account_id" groups="base.group_extended" />
<field name="amount"/>
<field context="{'partner_id': partner_id, 'amount': amount, 'account_id': account_id, 'currency_id': parent.currency, 'journal_id': parent.journal_id, 'date':date}" name="reconcile_id"/>
<field invisible="1" name="reconcile_amount"/>
</tree>
<form string="Statement lines">
<field name="date"/>
@@ -2519,7 +2517,6 @@
<field domain="[('journal_id', '=', parent.journal_id), ('type', '&lt;&gt;', 'view')]" name="account_id"/>
<field name="analytic_account_id" groups="base.group_extended" />
<field name="amount"/>
<field context="{'partner_id':partner_id,'amount':amount,'account_id':account_id,'currency_id': parent.currency,'journal_id':parent.journal_id, 'date':date}" name="reconcile_id"/>
<field name="ref"/>
<field name="sequence"/>
<separator colspan="4" string="Notes"/>
+4 -4
View File
@@ -2668,10 +2668,10 @@ msgid ""
"partners accounts (for debit/credit computations), closed for deprecated "
"accounts."
msgstr ""
"Pogled: Sintetički zbrojni konto, ne sadrži knjiženja\r\n"
"Konsolidacija: Zbrojni konto za više poduzeća i paralelne kontne planove\r\n"
"Obveze: Salda konta partnera - dobavljači\r\n"
"Potraživanja: Salda konta partnera - kupci\r\n"
"Pogled: Sintetički zbrojni konto, ne sadrži knjiženja\n"
"Konsolidacija: Zbrojni konto za više poduzeća i paralelne kontne planove\n"
"Obveze: Salda konta partnera - dobavljači\n"
"Potraživanja: Salda konta partnera - kupci\n"
"Zatvoren: Za konta koja se više ne koriste"
#. module: account
@@ -4,11 +4,11 @@
<record id="demo_message1" model="notify.message">
<field name="name">OpenERP SA</field>
<field name="msg">ERP & CRM Solutions....</field>
<field name="msg">ERP &amp; CRM Solutions....</field>
</record>
<record id="demo_message1" model="notify.message">
<field name="name">Tiny sprl</field>
<field name="msg">Be Expert with the Experts...</field>
</record>
</data>
</openerp>
</openerp>
+3 -2
View File
@@ -388,8 +388,9 @@
string="Sold" help="Buy object"
domain="[('state','=','sold')]"/>
<separator orientation="vertical"/>
<field name="name" string="Object Name"/>
<field name="lot_type"/>
<field name="name"/>
<field name="ach_uid"/>
<field name="bord_vnd_id"/>
<field name="state"/>
<newline/>
<group expand="0" string="Group By..." colspan="16">
+37 -32
View File
@@ -398,10 +398,13 @@ property or property parameter."),
"""
res = None
def ics_datetime(idate, short=False):
if short:
return date.fromtimestamp(time.mktime(time.strptime(idate, '%Y-%m-%d')))
if idate:
if short:
return date.fromtimestamp(time.mktime(time.strptime(idate, '%Y-%m-%d')))
else:
return datetime.strptime(idate, '%Y-%m-%d %H:%M:%S')
else:
return datetime.strptime(idate, '%Y-%m-%d %H:%M:%S')
return False
try:
# FIXME: why isn't this in CalDAV?
import vobject
@@ -482,35 +485,37 @@ property or property parameter."),
sign = att.sent_by_uid and att.sent_by_uid.signature or ''
sign = '<br>'.join(sign and sign.split('\n') or [])
res_obj = att.ref
sub = res_obj.name
att_infos = []
other_invitaion_ids = self.search(cr, uid, [('ref', '=', res_obj._name + ',' + str(res_obj.id))])
for att2 in self.browse(cr, uid, other_invitaion_ids):
att_infos.append(((att2.user_id and att2.user_id.name) or \
(att2.partner_id and att2.partner_id.name) or \
att2.email) + ' - Status: ' + att2.state.title())
body_vals = {'name': res_obj.name,
'start_date': res_obj.date,
'end_date': res_obj.date_deadline or False,
'description': res_obj.description or '-',
'location': res_obj.location or '-',
'attendees': '<br>'.join(att_infos),
'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User',
'sign': sign,
'company': company
}
body = html_invitation % body_vals
if mail_to and email_from:
attach = self.get_ics_file(cr, uid, res_obj, context=context)
tools.email_send(
email_from,
mail_to,
sub,
body,
attach=attach and [('invitation.ics', attach)] or None,
subtype='html',
reply_to=email_from
)
if res_obj:
att_infos = []
sub = res_obj.name
other_invitation_ids = self.search(cr, uid, [('ref', '=', res_obj._name + ',' + str(res_obj.id))])
for att2 in self.browse(cr, uid, other_invitation_ids):
att_infos.append(((att2.user_id and att2.user_id.name) or \
(att2.partner_id and att2.partner_id.name) or \
att2.email) + ' - Status: ' + att2.state.title())
body_vals = {'name': res_obj.name,
'start_date': res_obj.date,
'end_date': res_obj.date_deadline or False,
'description': res_obj.description or '-',
'location': res_obj.location or '-',
'attendees': '<br>'.join(att_infos),
'user': res_obj.user_id and res_obj.user_id.name or 'OpenERP User',
'sign': sign,
'company': company
}
body = html_invitation % body_vals
if mail_to and email_from:
attach = self.get_ics_file(cr, uid, res_obj, context=context)
tools.email_send(
email_from,
mail_to,
sub,
body,
attach=attach and [('invitation.ics', attach)] or None,
subtype='html',
reply_to=email_from
)
return True
def onchange_user_id(self, cr, uid, ids, user_id, *args, **argv):
@@ -128,8 +128,9 @@ send an Email to Invited Person')
att = att_obj.browse(cr, uid, context_id)
att_val.update({
'parent_ids': [(4, att.id)],
'ref': att.ref._name + ',' +str(att.ref.id)
'ref': att.ref and (att.ref._name + ',' +str(att.ref.id)) or False
})
attendees.append(att_obj.create(cr, uid, att_val))
if model_field:
for attendee in attendees:
@@ -54,9 +54,8 @@ class quality_test(base_module_quality.abstract_quality_check):
flag = True
file_path = os.path.join(module_path, file_py)
try:
import pylint
res = os.popen('pylint --rcfile=' + config_file_path + ' ' + file_path).read()
except Exception, e:
except Exception:
self.error = True
self.log.exception("Cannot run pylint test for %s", file_path)
self.result += _("Error. Is pylint correctly installed? (http://pypi.python.org/pypi/pylint)")+"\n"
-1
View File
@@ -19,7 +19,6 @@
#
##############################################################################
from osv import fields, osv
import netsvc
class base_setup_installer(osv.osv_memory):
_name = 'base.setup.installer'
+4 -4
View File
@@ -83,12 +83,12 @@ class report_custom(report_int):
if benefit < minbenef:
minbenef = benefit
tuple = (proba * 100, benefit)
tuple_benefit = (proba * 100, benefit)
responsible_data.setdefault(userid, [])
responsible_data[userid].append(tuple)
responsible_data[userid].append(tuple_benefit)
tuple = (proba * 100, cost, benefit)
data.append(tuple)
tuple_benefit = (proba * 100, cost, benefit)
data.append(tuple_benefit)
responsible_names[userid] = (row['name'] or '/').replace('/','//')
@@ -21,7 +21,6 @@
from osv import fields,osv
import time
import tools
class report_document_user(osv.osv):
+2
View File
@@ -65,12 +65,14 @@
<record id="employee2" model="hr.employee">
<field name="name">Quentin Paolino</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="user_id" ref="base.user_demo"/>
<field name="category_ids" eval="[(6, 0, [ref('category_jr_exec'),ref('category_managers')])]"/>
</record>
<record id="employee3" model="hr.employee">
<field name="name">Antoine Philippe</field>
<field name="calendar_id" ref="resource.timesheet_group1"/>
<field name="user_id" ref="base.user_root"/>
<field name="category_ids" eval="[(6, 0, [ref('category_trainee')])]"/>
</record>
+2 -2
View File
@@ -220,8 +220,8 @@ msgid ""
"managers can obtain an easy view on best ideas from all the users. Once "
"installed, check the menu 'Ideas' in the 'Tools' main menu."
msgstr ""
"这模块允许你在企业创新里简单和有效地使用.\r\n"
"它允许每个人对不同注意表达构想, 其它用户能评价这些构想和对具体的构想进行投票. 每个构想根据不同投票决定得分.\r\n"
"这模块允许你在企业创新里简单和有效地使用.\n"
"它允许每个人对不同注意表达构想, 其它用户能评价这些构想和对具体的构想进行投票. 每个构想根据不同投票决定得分.\n"
"管理人员可以很容易得到所有用户对构想的评价."
#. module: idea
+3 -3
View File
@@ -136,8 +136,8 @@ class mailgate_thread(osv.osv):
'partner_id': partner_id,
'res_id': case.id,
'date': time.strftime('%Y-%m-%d %H:%M:%S'),
'message_id': message_id,
'description': details or (hasattr(case, 'description') and case.description or False),
'message_id': message_id,
'description': details or (hasattr(case, 'description') and case.description or False),
'attachment_ids': [(6, 0, attachments)]
}
@@ -283,7 +283,7 @@ class mailgate_tool(osv.osv_memory):
'description': msg.get('body', msg.get('from')),
'history': True,
'partner_id': partner_id,
'res_model': model,
'model': model,
'email_cc': msg.get('cc'),
'email_from': msg.get('from'),
'email_to': msg.get('to'),
+31 -13
View File
@@ -10,13 +10,13 @@
<group colspan="4" col="6">
<field name="name" string="Subject" required="1" select="1" widget="char" size="512"/>
<field name="date" required="1" select="1"/>
<field name="user_id" string="Responsible" select="1"/>
<field name="user_id" string="Owner" select="1"/>
<field name="partner_id" readonly="1" />
</group>
<notebook colspan="4">
<page string="Details">
<group col="2" colspan="2">
<separator string="Email Details" colspan="4"/>
<separator string="Email Followers" colspan="4"/>
<field name="email_from" />
<field name="email_to" widget="char" size="512"/>
<field name="email_cc" widget="char" size="512"/>
@@ -50,7 +50,9 @@
<field name="date" />
<field name="name" string="Subject"/>
<field name="email_from" string="From"/>
<field name="user_id" string="Responsible"/>
<field name="user_id" string="Owner"/>
<field name="message_id" string="Message" invisible="1"/>
<field name="partner_id" invisible="1"/>
</tree>
</field>
</record>
@@ -63,13 +65,21 @@
<search string="Email Search">
<field name="name" string="Subject"/>
<field name="date" />
<field name="user_id" />
<field name="message_id" />
<field name="user_id" string="Owner" default="uid"/>
<field name="description" />
<newline/>
<group expand="0" string="Group By..." groups="base.group_extended">
<filter string="Partner" icon="terp-partner" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Owner" name="User" icon="terp-personal" context="{'group_by':'user_id'}"/>
<separator orientation="vertical"/>
<filter string="Thread" icon="terp-mail-" domain="[]" context="{'group_by':'message_id'}"/>
<separator orientation="vertical"/>
<filter string="Month" help="Creation Month" icon="terp-go-month" domain="[]" context="{'group_by':'date'}"/>
</group>
</search>
</field>
</record>
<record model="ir.ui.view" id="view_mailgate_thread_form">
<field name="name">mailgate.thread.form</field>
<field name="model">mailgate.thread</field>
@@ -127,8 +137,9 @@
<field name="view_type">form</field>
<field name="domain">[('history', '=', True)]</field>
<field name="view_id" ref="view_mailgate_message_tree"/>
<field name="context">{"search_default_user_id":uid}</field>
</record>
<record model="ir.actions.act_window" id="action_view_mailgate_thread">
<field name="name">Mailgateway Threads</field>
<field name="res_model">mailgate.thread</field>
@@ -149,7 +160,7 @@
<field name="view_id" ref="view_mailgate_thread_form"/>
<field name="act_window_id" ref="action_view_mailgate_thread"/>
</record>
<!-- Emailsaction-->
<record model="ir.actions.act_window" id="action_view_mailgate_message">
<field name="name">Emails</field>
@@ -159,7 +170,7 @@
<field name="domain">[('history', '=', True)]</field>
<field name="view_id" ref="view_mailgate_message_tree"/>
</record>
<record model="ir.actions.act_window.view" id="action_view_mailgate_thread_view1">
<field name="sequence" eval="1"/>
<field name="view_mode">tree</field>
@@ -173,10 +184,6 @@
<field name="act_window_id" ref="action_view_mailgate_thread"/>
</record>
<menuitem id="base.menu_base_config_mail" name="Mail" parent="base.menu_base_config" sequence="4"/>
<menuitem id="menu_mailgate_message" name="Emails" action="action_view_mailgate_message"
parent="base.menu_base_config_mail" sequence="5" groups="base.group_system"/>
<act_window domain="[('partner_id', '=', active_id), ('history', '=', True)]"
id="act_res_partner_emails" name="Emails"
res_model="mailgate.message"
@@ -184,5 +191,16 @@
view_id="view_mailgate_message_tree"
/>
<menuitem name="Emails" id="menu_base_config_mail"
parent="base.menu_base_partner" sequence="5" />
<menuitem name="Emails" id="menu_mailgate_message"
parent="menu_base_config_mail"
action="mail_gateway.action_view_mailgate_message"
/>
</data>
</openerp>
+22 -22
View File
@@ -19,11 +19,11 @@
#
##############################################################################
from mx import DateTime
from datetime import datetime, timedelta
from itertools import groupby
from operator import itemgetter
from datetime import datetime
from osv import osv, fields
from tools.translate import _
import ir
import netsvc
import time
@@ -178,8 +178,8 @@ class mrp_bom(osv.osv):
'code': fields.char('Reference', size=16),
'active': fields.boolean('Active', help="If the active field is set to true, it will allow you to hide the bills of material without removing it."),
'type': fields.selection([('normal','Normal BoM'),('phantom','Sets / Phantom')], 'BoM Type', required=True,
help= "If a sub-product is used in several products, it can be useful to create its own BoM."\
"Though if you don't want separated production orders for this sub-product, select Set/Phantom as BoM type."\
help= "If a sub-product is used in several products, it can be useful to create its own BoM. "\
"Though if you don't want separated production orders for this sub-product, select Set/Phantom as BoM type. "\
"If a Phantom BoM is used for a root product, it will be sold and shipped as a set of components, instead of being produced."),
'method': fields.function(_compute_type, string='Method', method=True, type='selection', selection=[('',''),('stock','On Stock'),('order','On Order'),('set','Set / Pack')]),
'date_start': fields.date('Valid From', help="Validity of this BoM or component. Keep empty if it's always valid."),
@@ -250,7 +250,6 @@ class mrp_bom(osv.osv):
@param properties: List of related properties.
@return: False or BoM id.
"""
bom_result = False
cr.execute('select id from mrp_bom where product_id=%s and bom_id is null order by sequence', (product_id,))
ids = map(lambda x: x[0], cr.fetchall())
max_prop = 0
@@ -356,14 +355,16 @@ class many2many_domain(fields.many2many):
def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
if not context:
context = {}
res = {}
move_obj = obj.pool.get('stock.move')
for prod in obj.browse(cr, user, ids, context=context):
cr.execute("SELECT move_id from mrp_production_move_ids where\
production_id=%s" % (prod.id))
m_ids = map(lambda x: x[0], cr.fetchall())
final = move_obj.search(cr, user, self._domain + [('id', 'in', tuple(m_ids))])
res[prod.id] = final
res = {}.fromkeys(ids, [])
valid_move_ids = move_obj.search(cr, user, self._domain) # move ids relative to domain argument
cr.execute("SELECT production_id, move_id from mrp_production_move_ids where production_id in %s and move_id in %s",
[tuple(ids), tuple(valid_move_ids)])
related_move_map = cr.fetchall()
related_move_dict = dict((k, list(set([v[1] for v in itr]))) for k, itr in groupby(related_move_map, itemgetter(0)))
res.update(related_move_dict)
return res
class one2many_domain(fields.one2many):
@@ -374,13 +375,14 @@ class one2many_domain(fields.one2many):
def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
if not context:
context = {}
res = {}
move_obj = obj.pool.get('stock.move')
for prod in obj.browse(cr, user, ids, context=context):
cr.execute("SELECT id from stock_move where production_id=%s" % (prod.id))
m_ids = map(lambda x: x[0], cr.fetchall())
final = move_obj.search(cr, user, self._domain + [('id', 'in', tuple(m_ids))])
res[prod.id] = final
res = {}.fromkeys(ids, [])
key = operator.itemgetter(0)
move_ids = move_obj.search(cr, user, self._domain+[('production_id', 'in', tuple(ids))], context=context)
related_move_dict = dict([(o.production_id.id, [o.id]) for o in move_obj.browse(cr, user, move_ids, context=context)])
res.update(related_move_dict)
return res
class mrp_production(osv.osv):
@@ -479,7 +481,7 @@ class mrp_production(osv.osv):
'name': lambda x, y, z, c: x.pool.get('ir.sequence').get(y, z, 'mrp.production') or '/',
'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'mrp.production', context=c),
}
_order = 'date_planned asc, priority desc';
_order = 'priority desc, date_planned asc';
def _check_qty(self, cr, uid, ids):
orders = self.browse(cr, uid, ids)
@@ -681,7 +683,6 @@ class mrp_production(osv.osv):
stock_mov_obj = self.pool.get('stock.move')
production = self.browse(cr, uid, production_id)
raw_product_todo = []
final_product_todo = []
produced_qty = 0
@@ -800,7 +801,6 @@ class mrp_production(osv.osv):
""" Changes state to In Production and writes starting date.
@return: True
"""
move_ids = []
self.write(cr, uid, ids, {'state': 'in_production', 'date_start': time.strftime('%Y-%m-%d %H:%M:%S')})
return True
+47 -31
View File
@@ -33,7 +33,7 @@
</field>
</record>
<record id="mrp_property_group_action" model="ir.actions.act_window">
<field name="name">Property Categories</field>
<field name="name">Property Groups</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.property.group</field>
<field name="view_type">form</field>
@@ -64,7 +64,6 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Properties">
<separator colspan="4" string="General Information"/>
<field colspan="4" name="name" select="1"/>
<field name="group_id" select="1"/>
<field name="composition" select="1"/>
@@ -82,8 +81,8 @@
<search string="Search">
<group col='15' colspan='4'>
<field name="name"/>
<field name="group_id" widget="selection" />
<field name="composition"/>
<field name="group_id" widget="selection" />
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="20">
@@ -132,7 +131,7 @@
<field name="name"/>
<field name="resource_id"/>
<field name="resource_type"/>
<field name="company_id"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
@@ -192,9 +191,11 @@
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="20" groups="base.group_extended">
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'resource_type'}"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}"/>
<filter string="Resource" icon="terp-personal" domain="[]" context="{'group_by':'resource_id'}"/>
<separator orientation="vertical"/>
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'resource_type'}"/>
<separator orientation="vertical" groups="base.group_multi_company"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
</group>
</search>
</field>
@@ -252,15 +253,18 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Routing">
<separator colspan="4" string="General Information"/>
<field name="name" select="1"/>
<field name="active" select="1" groups="base.group_extended"/>
<field name="code" select="1"/>
<field name="name"/>
<field name="code"/>
<field name="location_id"/>
<separator colspan="4" string="Description"/>
<field colspan="4" name="note" nolabel="1"/>
<separator colspan="4" string="Work Center Operations"/>
<field colspan="4" name="workcenter_lines" nolabel="1" widget="one2many_list"/>
<field name="active" groups="base.group_extended"/>
<notebook colspan="4">
<page string="Work Center Operations">
<field colspan="4" name="workcenter_lines" nolabel="1" widget="one2many_list"/>
</page>
<page string="Notes">
<field colspan="4" name="note" nolabel="1"/>
</page>
</notebook>
</form>
</field>
</record>
@@ -276,12 +280,25 @@
</tree>
</field>
</record>
<record id="mrp_routing_search_view" model="ir.ui.view">
<field name="name">mrp.routing.search</field>
<field name="model">mrp.routing</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<search string="Routing">
<field name="code"/>
<field name="name"/>
<field name="location_id"/>
</search>
</field>
</record>
<record id="mrp_routing_action" model="ir.actions.act_window">
<field name="name">Routings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.routing</field>
<field name="view_type">form</field>
<field name="view_id" ref="mrp_routing_tree_view"/>
<field name="search_view_id" ref="mrp_routing_search_view"/>
<field name="help">Routings define the assembly operations to be done in work centers for manufacturing a certain product. They are usually attached to bills of materials which will define the assembly of products required for manufacture or for finished products.</field>
</record>
<menuitem action="mrp_workcenter_action" id="menu_mrp_workcenter_action" parent="mrp.menu_mrp_property" groups="base.group_extended" sequence="40" />
@@ -358,16 +375,14 @@
<field name="company_id" groups="base.group_multi_company"/>
</group>
<newline/>
<group expand="0" string="Group By" colspan="4" col="8" groups="base.group_extended">
<group expand="0" string="Group By..." colspan="4" col="8" groups="base.group_extended">
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
<filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
<separator orientation="vertical"/>
<filter string='Default UOM' icon="terp-mrp" domain="[]" context="{'group_by' : 'product_uom'}" />
<separator orientation="vertical"/>
<filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}"/>
<filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}" />
<separator orientation="vertical"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_start'}"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_start'}" help="Starting Date"/>
</group>
</search>
</field>
@@ -497,10 +512,10 @@
<field name="arch" type="xml">
<tree colors="blue:state in ('draft','confirmed');red:date_planned&lt;current_date and state not in ('done','cancel');black:date_planned&gt;=current_date;gray:state in ('done','cancel') " string="Manufacturing Orders">
<field name="name"/>
<field name="date_planned"/>
<field name="product_id"/>
<field name="product_qty" sum="Total Qty"/>
<field name="product_uom"/>
<field name="date_planned"/>
<field name="routing_id" groups="base.group_extended"/>
<field name="hour_total" sum="Total Hours" groups="base.group_extended"/>
<field name="cycle_total" sum="Total Cycles" groups="base.group_extended"/>
@@ -625,16 +640,16 @@
states="done,cancel"/>
</tree>
</field>
<separator colspan="4"/>
<group col="9" colspan="4">
<field name="state"/>
<button name="action_compute" states="draft" string="Compute Data" type="object" icon="gtk-execute"/>
<button name="action_compute" states="draft" string="Compute Data" type="object" icon="terp-stock_format-scientific"/>
<button name="button_confirm" states="draft" string="Confirm Production" icon="gtk-apply"/>
<button name="button_produce" states="ready" string="Start Production" icon="gtk-execute"/>
<button name="button_produce" states="ready" string="Start Production" icon="terp-gtk-jump-to-ltr"/>
<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"/>
<button name="button_cancel" states="draft,ready,confirmed,in_production,picking_except" string="Cancel" icon="gtk-stop"/>
<button name="button_recreate" states="picking_except" string="Recreate Picking" icon="terp-document-new"/>
</group>
</page>
<page string="Finished Products">
@@ -736,12 +751,13 @@
<field name="origin"/>
</group>
<newline/>
<group expand="0" string="Group By" colspan="10" col="8">
<group expand="0" string="Group By..." colspan="10" col="8">
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}" groups="base.group_extended"/>
<separator orientation="vertical"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_planned'}"/>
<filter string="Routing" icon="terp-stock_align_left_24" domain="[]" context="{'group_by':'routing_id'}" groups="base.group_extended"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_planned'}" help="Scheduled Date"/>
</group>
</search>
</field>
@@ -761,12 +777,12 @@
</record>
<menuitem action="mrp_production_action" id="menu_mrp_production_action" parent="menu_mrp_manufacturing" groups="base.group_system,mrp.group_mrp_user,mrp.group_mrp_manager" sequence="1"/>
<record id="mrp_production_action2_gantt" model="ir.actions.act_window">
<record id="mrp_production_action_planning" model="ir.actions.act_window">
<field name="name">Manufacturing Orders Planning</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.production</field>
<field name="view_type">form</field>
<field name="view_mode">gantt,tree,form,calendar,graph</field>
<field name="view_mode">tree,form,calendar,graph</field>
<field name="domain">[('state','in',('ready','confirmed','in_production'))]</field>
<field name="help">Manufacturing Orders describe the operations that need to be carried out and the raw materials usage for each stage of production. You use specifications (bills of materials or BoM) to work out the raw material requirements and the manufacturing orders needed for the finished products. Once the bills of materials have been defined, OpenERP becomes capable of automatically deciding on the manufacturing route depending on the needs of the company.</field>
</record>
+1
View File
@@ -40,6 +40,7 @@ class bom_structure(report_sxw.rml_parse):
res = {}
res['name'] = l.name
res['pname'] = l.product_id.name
res['pcode'] = l.product_id.default_code
res['pqty'] = l.product_qty
res['uname'] = l.product_uom.name
res['code'] = l.code
+10 -8
View File
@@ -67,7 +67,9 @@
<paraStyle name="terp_header_Centre" fontName="Helvetica-Bold" fontSize="15.0" leading="19" alignment="CENTER" spaceBefore="12.0" spaceAfter="6.0"/>
<paraStyle name="terp_default_address" fontName="Helvetica" fontSize="10.0" leading="13" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Centre_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_Centre_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="CENTER" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_9" fontName="Helvetica" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Bold_Right_9" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_1" fontName="Helvetica" fontSize="2.0" leading="3" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_Right_9_Bold" fontName="Helvetica-Bold" fontSize="9.0" leading="11" alignment="RIGHT" spaceBefore="0.0" spaceAfter="0.0"/>
<paraStyle name="terp_default_8_Italic" fontName="Helvetica-Oblique" fontSize="8.0" leading="10" alignment="LEFT" spaceBefore="0.0" spaceAfter="0.0"/>
@@ -82,7 +84,7 @@
<blockTable colWidths="166.0,208.0,79.0,55.0" style="Table3">
<tr>
<td>
<para style="terp_tblheader_General">BOM</para>
<para style="terp_tblheader_General">BOM Name</para>
</td>
<td>
<para style="terp_tblheader_General">Product Name</para>
@@ -91,23 +93,23 @@
<para style="terp_tblheader_General_Right">Quantity</para>
</td>
<td>
<para style="terp_tblheader_General_Centre">Code</para>
<para style="terp_tblheader_General_Centre">BOM Ref</para>
</td>
</tr>
</blockTable>
<blockTable colWidths="166.0,208.0,79.0,55.0" style="Table4">
<tr>
<td>
<para style="terp_default_9">[[ o.name ]]</para>
<para style="terp_default_Bold_9">[[ o.name ]]</para>
</td>
<td>
<para style="terp_default_9">[[ o.product_id.name ]]</para>
<para style="terp_default_Bold_9"><font> [ [[ (o.product_id.default_code) or removeParentNode('font') ]] ] </font> <font> [[ o.product_id.name ]] </font> </para>
</td>
<td>
<para style="terp_default_Right_9">[[ o.product_qty ]] [[ o.product_uom.name ]]</para>
<para style="terp_default_Bold_Right_9">[[ o.product_qty ]] [[ o.product_uom.name ]]</para>
</td>
<td>
<para style="terp_default_Centre_9">[[ o.code ]]</para>
<para style="terp_default_Bold_Centre_9">[[ o.code ]]</para>
</td>
</tr>
</blockTable>
@@ -116,10 +118,10 @@
<blockTable colWidths="166.0,208.0,79.0,55.0" style="Table1">
<tr>
<td>
<para style="P1"><font color="white">[[ '... '*(l['level']) ]]</font>-[[ l['name'] ]]</para>
<para style="P1"><font color="white">[[ '... '*2*(l['level']) ]]</font>-[[ l['name'] ]]</para>
</td>
<td>
<para style="P1">[[ l['pname'] ]]</para>
<para style="P1"><font> [ [[ (l['pcode']) or removeParentNode('font') ]] ] </font> <font> [[ l['pname'] ]] </font> </para>
</td>
<td>
<para style="P2">[[ l['pqty'] ]] [[ l['uname'] ]]</para>
+13 -11
View File
@@ -48,18 +48,18 @@
<field name="arch" type="xml">
<search string="Search">
<group col="16" colspan="6">
<filter icon="terp-go-year" string=" 365 Days "
domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')),('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="Production performed in last 365 Days"/>
<filter icon="terp-go-month" string=" 30 Days "
<filter icon="terp-go-year" string="Year"
domain="[('year','=',time.strftime('%%Y'))]"
help="Production performed during current year"/>
<filter icon="terp-go-month" string="Month"
name="month"
domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Production performed in last 30 days"/>
domain="[('month','=',time.strftime('%%m'))]"
help="Production performed during current month"/>
<filter icon="terp-go-week"
string=" 7 Days "
string="Month -1"
separator="1"
domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="Production during last 7 days"/>
domain="[('date_start','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date_start','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Production during last month"/>
<separator orientation="vertical"/>
<filter string="Current" icon="terp-check" domain="[('state','in',('open','draft'))]"/>
<filter icon="terp-check" string="In Production" domain="[('state','=','in_production')]"/>
@@ -79,10 +79,12 @@
<separator orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}"/>
<separator orientation="vertical"/>
<filter string="Company" icon="terp-go-home" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical" groups="base.group_multi_company"/>
<filter string="Day" icon="terp-go-today" context="{'group_by':'day'}"/>
<separator orientation="vertical"/>
<filter string="Month" name="terp-go-month" icon="terp-go-month" context="{'group_by':'month'}"/>
<separator orientation="vertical"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
</group>
<newline/>
+13 -15
View File
@@ -7,9 +7,9 @@
<field name="model">report.workcenter.load</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Work Ccenters load">
<field name="name" select="1"/>
<field name="workcenter_id" select="1"/>
<tree string="Work Centers load">
<field name="name"/>
<field name="workcenter_id"/>
<field name="cycle"/>
<field name="hour"/>
</tree>
@@ -22,26 +22,23 @@
<field name="type">graph</field>
<field name="arch" type="xml">
<graph string="Work Center load" type="bar">
<field name="name"/>
<field group="True" name="name"/>
<field name="cycle" operator="+"/>
<field name="hour" operator="+"/>
<field group="True" name="workcenter_id"/>
</graph>
</field>
</record>
<record id="view_workcenter_load_form" model="ir.ui.view">
<field name="name">report.workcenter.load.form</field>
<record id="view_workcenter_load_search" model="ir.ui.view">
<field name="name">report.workcenter.load.search</field>
<field name="model">report.workcenter.load</field>
<field name="type">form</field>
<field name="type">search</field>
<field name="arch" type="xml">
<form string="Work Center load" type="bar">
<field name="name" select="1"/>
<field name="workcenter_id" select="1"/>
<field name="cycle"/>
<field name="hour"/>
</form>
<search string="Work Center load">
<field name="name"/>
<field name="workcenter_id" widget="selection"/>
</search>
</field>
</record>
<record id="action_report_workcenter_load_tree" model="ir.actions.act_window">
@@ -49,6 +46,7 @@
<field name="res_model">report.workcenter.load</field>
<field name="view_type">form</field>
<field name="view_mode">graph,tree</field>
<field name="search_view_id" ref="view_workcenter_load_search"/>
<field name="help">Work Center Load is a projection of load in a work center given a period. The load is express in hour and cycle (for machines).</field>
</record>
<menuitem id="next_id_77" name="Reporting"
+1
View File
@@ -147,6 +147,7 @@ class report_custom(report_int):
FROM mrp_production_workcenter_line, mrp_production, mrp_workcenter, resource_resource \
WHERE (mrp_production_workcenter_line.production_id=mrp_production.id) \
AND (mrp_production_workcenter_line.workcenter_id=mrp_workcenter.id) \
AND (mrp_workcenter.resource_id=resource_resource.id) \
AND (mrp_workcenter.id=%s) \
AND (mrp_production.date_planned BETWEEN %s AND %s) \
GROUP BY mrp_production_workcenter_line.workcenter_id, resource_resource.name, mrp_workcenter.id \
+1 -1
View File
@@ -27,7 +27,7 @@
-
!workflow {model: mrp.production, action: button_confirm, ref: mrp_production_mo1}
-
I am checking Procurement orders.
I am checking Procurement orders for components of PC1.
-
!python {model: procurement.order}: |
from tools.translate import _
@@ -16,8 +16,8 @@
<newline/>
<separator colspan="4"/>
<group col="2" colspan="4">
<button icon='gtk-close' special="cancel"
string="Close" />
<button icon='gtk-stop' special="cancel"
string="Cancel" />
<button name="change_prod_qty" string="Approve"
colspan="1" type="object" icon="gtk-ok" />
</group>
+2 -2
View File
@@ -15,8 +15,8 @@
<newline/>
<separator string="" colspan="4"/>
<group col="2" colspan="4">
<button icon='gtk-close' special="cancel"
string="Close" />
<button icon='gtk-stop' special="cancel"
string="Cancel" />
<button name="print_report" string="Print"
colspan="1" type="object" icon="gtk-print" />
</group>
@@ -18,8 +18,8 @@
<separator string="" colspan="4" />
<label string="" colspan="2" />
<group col="2" colspan="1">
<button icon='gtk-close' special="cancel"
string="Close" />
<button icon='gtk-stop' special="cancel"
string="Cancel" />
<button name="do_produce" string="Confirm"
colspan="1" type="object" icon="gtk-ok" />
</group>
@@ -15,10 +15,10 @@
<field name="measure_unit"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-close' special="cancel"
string="Close" />
<button icon='gtk-stop' special="cancel"
string="Cancel" />
<button name="print_report" string="Print"
colspan="1" type="object" icon="gtk-ok" />
colspan="1" type="object" icon="gtk-print" />
</group>
</form>
</field>
+5 -8
View File
@@ -21,7 +21,6 @@
from osv import fields
from osv import osv
import ir
import datetime
import netsvc
import time
@@ -135,8 +134,6 @@ class mrp_production_workcenter_line(osv.osv):
result = super(mrp_production_workcenter_line, self).write(cr, uid, ids, vals, context=context)
prod_obj = self.pool.get('mrp.production')
if vals.get('date_planned', False) and update:
pids = {}
pids2 = {}
for prod in self.browse(cr, uid, ids, context=context):
if prod.production_id.workcenter_lines:
dstart = min(vals['date_planned'], prod.production_id.workcenter_lines[0]['date_planned'])
@@ -496,25 +493,25 @@ class mrp_operations_operation(osv.osv):
production_obj=self.pool.get('mrp.production').browse(cr,uid,vals['production_id'])
wc_op_id.append(self.pool.get('mrp.production.workcenter.line').create(cr,uid,{'production_id':vals['production_id'],'name':production_obj.product_id.name,'workcenter_id':vals['workcenter_id']}))
if code.start_stop=='start':
tmp=self.pool.get('mrp.production.workcenter.line').action_start_working(cr,uid,wc_op_id)
self.pool.get('mrp.production.workcenter.line').action_start_working(cr,uid,wc_op_id)
wf_service.trg_validate(uid, 'mrp.production.workcenter.line', wc_op_id[0], 'button_start_working', cr)
if code.start_stop=='done':
tmp=self.pool.get('mrp.production.workcenter.line').action_done(cr,uid,wc_op_id)
self.pool.get('mrp.production.workcenter.line').action_done(cr,uid,wc_op_id)
wf_service.trg_validate(uid, 'mrp.production.workcenter.line', wc_op_id[0], 'button_done', cr)
self.pool.get('mrp.production').write(cr,uid,vals['production_id'],{'date_finnished':DateTime.now().strftime('%Y-%m-%d %H:%M:%S')})
if code.start_stop=='pause':
tmp=self.pool.get('mrp.production.workcenter.line').action_pause(cr,uid,wc_op_id)
self.pool.get('mrp.production.workcenter.line').action_pause(cr,uid,wc_op_id)
wf_service.trg_validate(uid, 'mrp.production.workcenter.line', wc_op_id[0], 'button_pause', cr)
if code.start_stop=='resume':
tmp=self.pool.get('mrp.production.workcenter.line').action_resume(cr,uid,wc_op_id)
self.pool.get('mrp.production.workcenter.line').action_resume(cr,uid,wc_op_id)
wf_service.trg_validate(uid, 'mrp.production.workcenter.line', wc_op_id[0], 'button_resume', cr)
if code.start_stop=='cancel':
tmp=self.pool.get('mrp.production.workcenter.line').action_cancel(cr,uid,wc_op_id)
self.pool.get('mrp.production.workcenter.line').action_cancel(cr,uid,wc_op_id)
wf_service.trg_validate(uid, 'mrp.production.workcenter.line', wc_op_id[0], 'button_cancel', cr)
if not self.check_operation(cr, uid, vals):
+23 -23
View File
@@ -14,12 +14,12 @@
<xpath expr="/form/notebook/page/field[@name='workcenter_lines']/form/field[@name='hour']" position="after">
<group colspan="8" col="8">
<field name="state"/>
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert"/>
<button name="button_start_working" string="Start" states="draft" icon="gtk-go-forward"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-cancel"/>
<button name="button_pause" string="Pause" states="startworking" icon="gtk-media-pause"/>
<button name="button_done" string="Finished" states="startworking" icon="gtk-ok"/>
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert" help="Set to Draft"/>
<button name="button_start_working" string="Start" states="draft" icon="terp-gtk-jump-to-ltr" help="Start Working"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause" help="Resume Work Order"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-stop" help="Cancel Order"/>
<button name="button_pause" string="Pause" states="startworking" icon="gtk-media-pause" help="Pause Work Order"/>
<button name="button_done" string="Finished" states="startworking" icon="terp-dialog-close" help="Finish Order"/>
</group>
</xpath>
</field>
@@ -32,12 +32,12 @@
<field name="inherit_id" ref="mrp.mrp_production_form_view"/>
<field name="arch" type="xml">
<xpath expr="/form/notebook/page/field[@name='workcenter_lines']/tree/field[@name='hour']" position="after">
<button name="button_done" string="Finished" states="startworking" icon="gtk-ok"/>
<button name="button_pause" string="Pause" states="startworking" icon="gtk-media-pause"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-cancel"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause"/>
<button name="button_start_working" string="Start" states="draft" icon="gtk-go-forward"/>
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert"/>
<button name="button_start_working" string="Start" states="draft" icon="terp-gtk-jump-to-ltr"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-stop"/>
<button name="button_pause" string="Pause" states="startworking" icon="gtk-media-pause"/>
<button name="button_done" string="Finished" states="startworking" icon="terp-dialog-close"/>
<field name="state"/>
</xpath>
</field>
@@ -49,7 +49,7 @@
<field name="type">tree</field>
<field name="inherit_id" eval="False"/>
<field name="arch" type="xml">
<tree string="Work Orders" colors="gray:state in ('done','cancel');black:state in ('draft','startworking');red: state=='pause'">
<tree string="Work Orders" colors="gray:state in ('done','cancel');black:state in ('draft','startworking') and date_planned&gt;=current_date;red:date_planned&lt;current_date and state not in ('done','cancel')">
<field name="production_id"/>
<field name="date_planned"/>
<field name="product"/>
@@ -61,11 +61,11 @@
<field name="hour"/>
<field name="state" />
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert" help="Set to Draft"/>
<button name="button_start_working" string="Start" states="draft" icon="gtk-go-forward" help="Start Working"/>
<button name="button_start_working" string="Start" states="draft" icon="terp-gtk-jump-to-ltr" help="Start Working"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause" help="Resume Work Order"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-cancel" help="Cancel Order"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-stop" help="Cancel Order"/>
<button name="button_pause" string="Pause" states="startworking" icon="gtk-media-pause" help="Pause Work Order"/>
<button name="button_done" string="Finished" states="startworking" icon="gtk-ok" help="Finish Order"/>
<button name="button_done" string="Finished" states="startworking" icon="terp-dialog-close" help="Finish Order"/>
</tree>
</field>
</record>
@@ -111,15 +111,15 @@
<field name="uom"/>
</group>
<separator string="State" colspan="4"/>
<separator string="" colspan="4"/>
<group colspan="8" col="8">
<field name="state"/>
<button name="button_draft" string="Set Draft" states="cancel" icon="gtk-convert"/>
<button name="button_start_working" string="Start" states="draft" icon="gtk-go-forward"/>
<button name="button_start_working" string="Start" states="draft" icon="terp-gtk-jump-to-ltr"/>
<button name="button_resume" string="Resume" states="pause" icon="gtk-media-pause"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-cancel"/>
<button name="button_cancel" string="Cancel" states="draft,startworking" icon="gtk-stop"/>
<button name="button_pause" string="Pause" states="startworking" icon="gtk-media-pause"/>
<button name="button_done" string="Finished" states="startworking" icon="gtk-ok"/>
<button name="button_done" string="Finished" states="startworking" icon="terp-dialog-close"/>
</group>
</page>
</notebook>
@@ -153,9 +153,9 @@
<field name="date_planned" widget="date"/>
</group>
<newline/>
<group expand="0" string="Group By" colspan="10" col="8" groups="base.group_extended">
<filter string="Workcenter" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'workcenter_id'}"/>
<filter string="Production" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'production_id'}"/>
<group expand="0" string="Group By..." colspan="10" col="8" groups="base.group_extended">
<filter string="Workcenter" icon="terp-go-home" domain="[]" context="{'group_by':'workcenter_id'}"/>
<filter string="Production" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'production_id'}"/>
<separator orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
@@ -249,7 +249,7 @@
</record>
<menuitem action="mrp.mrp_production_action"
<menuitem action="mrp.mrp_production_action_planning"
id="menu_mrp_production_order_action"
parent="menu_mrp_planning" sequence="1"
groups="base.group_extended"/>
+1 -1
View File
@@ -109,7 +109,7 @@ class mrp_repair(osv.osv):
('invoice_except','Invoice Exception'),
('done','Done'),
('cancel','Cancel')
], 'Repair State', readonly=True,
], 'State', readonly=True,
help=' * The \'Draft\' state is used when a user is encoding a new and unconfirmed repair order. \
\n* The \'Confirmed\' state is used when a user confirms the repair order. \
\n* The \'Ready to Repair\' state is used to start to repairing, user can start repairing only after repair order is confirmed. \
+24 -24
View File
@@ -7,14 +7,13 @@
<field name="model">mrp.repair</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Repairs order">
<field name="name" select="1" />
<tree string="Repairs order" colors="gray:state in ('done','cancel');black:state not in ('done','cancel');blue:state=='draft'">
<field name="name" select="1" />
<field name="product_id" select="1" />
<field name="prodlot_id"/>
<field name="move_id"/>
<field name="partner_id"/>
<field name="address_id"/>
<field name="location_id"/>
<field name="move_id"/>
<field name="location_dest_id"/>
<field name="guarantee_limit"/>
<field name="state"/>
@@ -94,22 +93,22 @@
<field name="amount_untaxed" sum="Untaxed amount"/>
<field name="amount_tax"/>
<field name="amount_total" sum="Total amount"/>
<button name="button_dummy" states="draft" string="Compute" type="object"/>
<button name="button_dummy" states="draft" string="Compute" type="object" icon="terp-stock_format-scientific"/>
</group>
<newline/>
<separator string="" colspan="4"/>
<group col="13" colspan="4">
<field name="state"/>
<button name="repair_confirm" states="draft" string="Confirm Repair" icon="gtk-apply"/>
<button name="repair_ready" states="confirmed" string="Start Repair" icon="gtk-go-forward"/>
<button name="action_repair_start" states="ready" string="Start Repair" icon="gtk-go-forward"/>
<button name="action_repair_end" states="under_repair" string="End Repair" icon="gtk-ok"/>
<button name="invoice_recreate" states="invoice_except" string="Recreate Invoice" icon="gtk-convert"/>
<button name="invoice_corrected" states="invoice_except" string="Invoice Corrected" icon="gtk-apply"/>
<button name="action_invoice_create" states="2binvoiced" string="Make Invoice" icon="gtk-ok"/>
<button name="%(action_cancel_repair)d" states="invoice_except" string="Cancel Repair" type="action" icon="gtk-cancel"/>
<button name="repair_confirm" states="draft" string="Confirm Repair" icon="terp-camera_test"/>
<button name="repair_ready" states="confirmed" string="Start Repair" icon="terp-gtk-jump-to-ltr"/>
<button name="action_repair_start" states="ready" string="Start Repair" icon="terp-gtk-jump-to-ltr"/>
<button name="action_repair_end" states="under_repair" string="End Repair" icon="terp-dialog-close"/>
<button name="invoice_recreate" states="invoice_except" string="Recreate Invoice" icon="terp-dolar"/>
<button name="invoice_corrected" states="invoice_except" string="Invoice Corrected" icon="terp-emblem-important"/>
<button name="action_invoice_create" states="2binvoiced" string="Make Invoice" icon="terp-dolar"/>
<button name="%(action_cancel_repair)d" states="invoice_except" string="Cancel Repair" type="action" icon="gtk-stop"/>
<button name="action_cancel_draft" states="cancel" string="Set to Draft" type="object" icon="gtk-convert"/>
<button name="cancel" states="draft" string="Cancel Repair" icon="gtk-cancel"/>
<button name="%(action_cancel_repair)d" states="confirmed,2binvoiced,ready,under_repair" string="Cancel Repair" type="action" icon="gtk-cancel"/>
<button name="cancel" states="draft" string="Cancel Repair" icon="gtk-stop"/>
<button name="%(action_cancel_repair)d" states="confirmed,2binvoiced,ready,under_repair" string="Cancel Repair" type="action" icon="gtk-stop"/>
</group>
</page>
<page string="Invoicing">
@@ -153,18 +152,18 @@
</tree>
</field>
</page>
<page string="Quality">
<separator colspan="4" string="Internal Notes"/>
<field colspan="4" name="internal_notes" nolabel="1"/>
<separator colspan="4" string="Quotation Notes"/>
<field colspan="4" name="quotation_notes" nolabel="1"/>
</page>
<page string="Extra Info" groups="base.group_extended">
<field name="invoice_id"/>
<field name="picking_id"/>
<field name="location_id"/>
<field name="location_dest_id" attrs="{'readonly':[('deliver_bool','=', False)], 'required':[('deliver_bool','=', True)]}"/>
</page>
<page string="Notes">
<separator colspan="4" string="Internal Notes"/>
<field colspan="4" name="internal_notes" nolabel="1"/>
<separator colspan="4" string="Quotation Notes"/>
<field colspan="4" name="quotation_notes" nolabel="1"/>
</page>
</notebook>
</form>
</field>
@@ -183,7 +182,7 @@
<filter icon="terp-check" string="Confirmed" domain="[('state','=','confirmed')]" name="current" />
<filter icon="terp-emblem-important" string="Ready To Repair" domain="[('state','=','ready')]"/>
<separator orientation="vertical"/>
<filter icon="terp-dolar" string="invoiced" domain="[('state','=','2binvoiced')]"/>
<filter icon="terp-dolar" string="invoiced" domain="[('invoiced','=',True)]"/>
<separator orientation="vertical"/>
<field name="name"/>
<field name="product_id"/>
@@ -192,10 +191,11 @@
</group>
<newline/>
<group expand="0" string="Group By..." colspan="10" col="8" groups="base.group_extended">
<filter string="Partner" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
<separator orientation="vertical"/>
<filter string="Product" icon="terp-accessories-archiver" domain="[]" context="{'group_by':'product_id'}"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Partner" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'guarantee_limit'}"/>
</group>
</search>
+2 -2
View File
@@ -69,8 +69,8 @@ class repair_cancel(osv.osv_memory):
<group col="2" colspan="2">
<label string="Do you want to continue?" colspan="4"/>
<separator colspan="4"/>
<button icon="gtk-cancel" special="cancel" string="No" readonly="0"/>
<button name="cancel_repair" string="Yes" type="object" icon="gtk-ok"/>
<button icon="gtk-stop" special="cancel" string="_No" readonly="0"/>
<button name="cancel_repair" string="_Yes" type="object" icon="gtk-ok"/>
</group>
</form>
"""
@@ -13,9 +13,9 @@
<label string="This operation will cancel the Repair process, but will not cancel it's Invoice. Do you want to continue?" colspan="4"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel"
string="No" />
<button name="cancel_repair" string="Yes"
<button icon="gtk-stop" special="cancel"
string="_No" />
<button name="cancel_repair" string="_Yes"
colspan="1" type="object" icon="gtk-ok" />
</group>
</form>
@@ -14,10 +14,10 @@
<field name="group"/>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-close' special="cancel"
string="Close" />
<button name="make_invoices" string="Create Invoice"
colspan="1" type="object" icon="gtk-ok" />
<button icon="gtk-stop" special="cancel"
string="_Cancel" />
<button name="make_invoices" string="Create _Invoice"
colspan="1" type="object" icon="terp-dolar" />
</group>
</form>
</field>
+3 -4
View File
@@ -31,8 +31,7 @@ class outlook_installer(osv.osv_memory):
def default_get(self, cr, uid, fields, context={}):
data = super(outlook_installer, self).default_get(cr, uid, fields, context)
doc_file = open(config['addons_path'] + "/outlook/doc/Installation Guide to OpenERP Outlook Plug-in.doc", 'r')
data['doc_file'] = base64.encodestring(doc_file.read())
data['doc_file'] = 'http://doc.openerp.com/book/2/2_6_Comms/2_6_Comms_outlook.html'
file = open(config['addons_path'] + "/outlook/plugin/openerp-outlook-plugin.zip", 'r')
data['plugin_file'] = base64.encodestring(file.read())
return data
@@ -42,7 +41,7 @@ class outlook_installer(osv.osv_memory):
'doc_name':fields.char('File name', size=64),
'outlook':fields.boolean('Outlook Plug-in ', help="Allows you to select an object that you’d like to add to your email and its attachments."),
'plugin_file':fields.binary('Outlook Plug-in', readonly=True, help="outlook plug-in file. Save as this file and install this plug-in in outlook."),
'doc_file':fields.binary('Installation Manual', help="The documentation file :- how to install Outlook Plug-in.", readonly=True),
'doc_file':fields.char('Installation Manual',size="264",help="The documentation file :- how to install Outlook Plug-in.", readonly=True),
'description':fields.text('Description', readonly=True)
}
@@ -63,7 +62,7 @@ How to install openerp-outlook plug-in?
3. Run “Register-plugin.bat” file.
4. Run Outlook and Check addon has been registered.
5. Tools->OpenERP Configuration and test your connection.
6. See User Guide for more information.
6. See User Guide for more information.
7. Keep All extratced files in some safe places
(e.g. python installation Directory "C:\pythonXX\" or Windows installation Directory "C:\Program Files\" ).
"""
+9 -14
View File
@@ -38,7 +38,7 @@
<newline/>
<field name="plugin_file" filename="name"/>
<newline/>
<field name="doc_file" filename="doc_name"/>
<field name="doc_file" filename="doc_name" widget="url"/>
<newline/>
<separator string="Installation and Configuration Steps" colspan="4"/>
<field name="description" nolabel="1" colspan="8"/>
@@ -74,20 +74,15 @@
<field name="context">{'menu':True}</field>
</record>
<menuitem id="base.menu_base_config_mail"
name="Mail"
parent="base.menu_base_config"
sequence="10"/>
<menuitem id="base.menu_base_config_plugins"
name="Plugins"
parent="base.menu_base_config_mail"
<menuitem id="base.menu_base_config_plugins"
name="Plugins"
parent="base.menu_base_config"
sequence="10" />
<menuitem id="menu_base_config_plugins_outlook"
action="action_outlook_wizard"
name="Outlook Plug-In"
parent="base.menu_base_config_plugins"
<menuitem id="menu_base_config_plugins_outlook"
action="action_outlook_wizard"
name="Outlook Plug-In"
parent="base.menu_base_config_plugins"
sequence="10" />
</data>
</openerp>
@@ -86,7 +86,7 @@ EXSTYLE WS_EX_CONTEXTHELP
CAPTION "About"
FONT 8, "Tahoma", 400, 0, 0x0
BEGIN
GROUPBOX "About Plugin",IDC_STATIC,7,3,422,200
GROUPBOX "About OpenERP Outlook Plugin",IDC_STATIC,7,3,422,200
CONTROL 1062,IDB_OPENERPLOGO,"Static",SS_BITMAP | SS_REALSIZEIMAGE,60,30,20,20
LTEXT "",IDC_ABOUT,80,90,250,100
END
+8 -8
View File
@@ -280,8 +280,8 @@ class pos_order(osv.osv):
'date_validation': fields.function(_get_date_payment, method=True, string='Validation Date', type='date', store=True),
'date_payment': fields.function(_get_date_payment2, method=True, string='Payment Date', type='date', store=True),
'date_validity': fields.date('Validity Date', required=True),
'user_id': fields.many2one('res.users', 'Connected Salesman'),
'user_salesman_id': fields.many2one('res.users', 'Cashier', required=True),
'user_id': fields.many2one('res.users', 'Connected Salesman', help="Person who uses the the register. It could be a reliever, a student or an interim employee."),
'user_salesman_id': fields.many2one('res.users', 'Cashier', required=True, help="User who is logged into the system."),
'sale_manager': fields.many2one('res.users', 'Salesman Manager'),
'amount_tax': fields.function(_amount_all, method=True, string='Taxes', digits_compute=dp.get_precision('Point Of Sale'), multi='all'),
'amount_total': fields.function(_amount_total, method=True, string='Total'),
@@ -295,7 +295,7 @@ class pos_order(osv.osv):
'payments': fields.one2many('pos.payment', 'order_id', 'Order Payments', states={'draft': [('readonly', False)]}, readonly=True),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist', required=True, states={'draft': [('readonly', False)]}, readonly=True),
'partner_id': fields.many2one( 'res.partner', 'Customer', change_default=True, select=1, states={'draft': [('readonly', False)], 'paid': [('readonly', False)]}),
'state': fields.selection([('draft', 'Draft'), ('payment', 'Payment'),
'state': fields.selection([('draft', 'Quotation'), ('payment', 'Payment'),
('advance','Advance'),
('paid', 'Paid'), ('done', 'Done'), ('invoiced', 'Invoiced'), ('cancel', 'Cancel')],
'State', readonly=True, ),
@@ -358,7 +358,7 @@ class pos_order(osv.osv):
def test_order_lines(self, cr, uid, order, context=None):
""" Test order line is created or not for the order "
""" Test order line is created or not for the order "
@param name: Names of fields.
@return: True
"""
@@ -581,7 +581,7 @@ class pos_order(osv.osv):
account_def = property_obj.get(cr, uid, 'property_account_receivable', 'res.partner', context=context)
args['account_id'] = order.partner_id and order.partner_id.property_account_receivable and order.partner_id.property_account_receivable.id or account_def.id or curr_c.account_receivable.id
if data.get('is_acc',False):
args['is_acc']=data['is_acc']
args['is_acc'] = data['is_acc']
args['account_id']= prod_obj.browse(cr,uid, data['product_id']).property_account_income and prod_obj.browse(cr,uid, data['product_id']).property_account_income.id
if not args['account_id']:
raise osv.except_osv(_('Error'), _('Please provide an account for the product: %s')%(prod_obj.browse(cr,uid, data['product_id']).name))
@@ -631,7 +631,7 @@ class pos_order(osv.osv):
wf_service = netsvc.LocalService("workflow")
wf_service.trg_write(uid, 'pos.order', order_id, cr)
return order_line_id
return order_line_id, price
def refund(self, cr, uid, ids, context=None):
"""Create a copy of order for refund order"""
@@ -1270,9 +1270,9 @@ pos_payment()
class product_product(osv.osv):
_inherit = 'product.product'
_columns = {
'income_pdt': fields.boolean('Product for Incoming'),
'income_pdt': fields.boolean('Product for Input'),
'expense_pdt': fields.boolean('Product for expenses'),
'am_out': fields.boolean('Controle for Outgoing Operations'),
'am_out': fields.boolean('Controle for Output Operations'),
'disc_controle': fields.boolean('Discount Controle '),
}
_defaults = {
+39 -68
View File
@@ -12,12 +12,14 @@
<field name="arch" type="xml">
<form string="Sales Order POS">
<group col="6" colspan="4">
<field name="name"/>
<field name="date_order"/>
<field name="shop_id" widget="selection"/>
<field name="partner_id" on_change="onchange_partner_pricelist(partner_id)"/>
<field name="contract_number" groups="base.group_extended"/>
</group>
<notebook colspan="4">
<page string="Sale Order ">
<notebook colspan="4">
<page string="Sale Order">
<field name="lines" colspan="4" nolabel="1">
<tree string="Order lines" editable="bottom">
<field name="product_id" on_change="onchange_product_id(parent.pricelist_id,product_id,qty,parent.partner_id)" width="275" />
@@ -29,7 +31,7 @@
<field name="price_subtotal" />
<field name="price_subtotal_incl" sum="Subtotal"/>
</tree>
<form string="Order lines" >
<form string="Order lines">
<field name="product_id" on_change="onchange_product_id(parent.pricelist_id,product_id,qty,parent.partner_id)" width="275"/>
<field name="qty"/>
<field name="qty_rfd" groups="base.group_extended"/>
@@ -39,46 +41,23 @@
<field name="notice"/>
<field name="serial_number"/>
</form>
</field>
<group colspan="4" col="7">
<field name="amount_tax"/>
<field name="amount_total"/>
</group>
<separator colspan="4" string="Actions"/>
<separator colspan="4"/>
<group colspan="4" col="6">
<field name="state" />
<button name="%(action_pos_payment)d" string="Ma_ke Payment" icon="gtk-ok" type="action" states="draft,advance" />
<button name="%(action_report_pos_receipt)d" string="_Reprint" icon="gtk-print" type="action" states="paid,done,invoiced"/>
<button name="%(action_pos_payment)d" string="Make Payment" icon="terp-dolar" type="action" states="draft,advance" />
<button name="%(action_report_pos_receipt)d" string="Reprint" icon="gtk-print" type="action" states="paid,done,invoiced"/>
<button name="set_to_draft" string="Set to draft" states="paid" icon="gtk-execute" type="object" />
<button name="%(action_view_pos_return)d" string="Return Picking" type="action" icon="gtk-ok" states="paid"
attrs="{'invisible':[('state','!=','paid'),('state','!=','invoiced')]}" context="{'return':'return'}" />
</group>
</page>
<page string="Order and Payment">
<group colspan="2" col="2" name="Type">
<separator string="Order Information" colspan="4"/>
<field name="name"/>
<field name="shop_id" widget="selection"/>
<field name="user_salesman_id" />
<field name="company_id" groups="base.group_multi_company"/>
<field name="price_type" />
<field name="user_id" string="Salesman" groups="base.group_extended"/>
</group>
<group colspan="2" col="2" name="Type">
<separator string="Dates" colspan="4"/>
<field name="date_order"/>
<field name="date_validation" />
<field name="date_payment" groups="base.group_extended"/>
</group>
<group colspan="4">
<field name="partner_id" on_change="onchange_partner_pricelist(partner_id)" invisible="1"/>
<field name="sale_journal" domain="[('type','=','sale')]" widget="selection" invisible="1"/>
<field name="pricelist_id" domain="[('type','=','sale')]" widget="selection" invisible="1"/>
</group>
<page string="Payment">
<field name="statement_ids" colspan="4" nolabel="1">
<tree editable="bottom" string="Statement lines">
<field name="amount"/>
@@ -92,12 +71,28 @@
</form>
</field>
</page>
<page string="Extra Info">
<group colspan="2" col="2" name="Type">
<separator string="Other Information" colspan="4"/>
<field name="user_salesman_id" />
<field name="company_id" groups="base.group_multi_company"/>
<field name="price_type" />
<field name="user_id" string="Salesman" groups="base.group_extended"/>
</group>
<group colspan="2" col="2" name="Type">
<separator string="Dates" colspan="4"/>
<field name="date_validation" />
<field name="date_payment" groups="base.group_extended"/>
</group>
<group colspan="4">
<field name="sale_journal" domain="[('type','=','sale')]" widget="selection" invisible="1"/>
<field name="pricelist_id" domain="[('type','=','sale')]" widget="selection" invisible="1"/>
</group>
</page>
<page string="Notes" >
<field colspan="4" name="note" nolabel="1"/>
</page>
</notebook>
</form>
</field>
</record>
@@ -114,16 +109,17 @@
<field name="model">pos.order</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="POS Orders">
<tree string="POS Orders" colors="blue:state == 'draft';gray:state in ('done','cancel');black:state not in('done','cancel')">
<field name="name"/>
<field name="partner_id"/>
<field name="date_order"/>
<field name="date_validation"/>
<field name="date_payment"/>
<field name="user_id"/>
<field name="invoice_id"/>
<field name="state" />
<field name="amount_total" sum="Amount total"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="state"/>
</tree>
</field>
</record>
@@ -136,16 +132,18 @@
<filter icon="terp-document-new" string="Quotations" domain="[('state','=','draft')]"/>
<filter icon="terp-check" string="Running" domain="[('state','in',('payment','advance'))]"/>
<separator orientation="vertical"/>
<field name="name" select="1"/>
<field name="partner_id" select="1"/>
<field name="user_id" select="1"/>
<field name="date_order" select="1" string="Order date" />
<field name="name"/>
<field name="partner_id"/>
<field name="user_id"/>
<field name="date_order" string="Order date"/>
<newline/>
<group expand="0" string="Group By..." colspan="11" col="11" groups="base.group_extended">
<filter string="Customer" icon="terp-personal" domain="[]" context="{'group_by':'partner_id'}"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
<filter string="Salesman" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<separator string="" orientation="vertical"/>
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
<separator string="" orientation="vertical"/>
<filter string="Order Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_order'}"/>
</group>
</search>
</field>
@@ -788,33 +786,6 @@
action="action_box_out"
id="menu_wizard_enter_jrnl2" sequence="3" />
<record model="ir.ui.view" id="view_pos_order_tree_all_sales">
<field name="name">POS Sales</field>
<field name="model">pos.order</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="POS Orders">
<field name="name"/>
<field name="date_order" select="1"/>
<field name="partner_id" />
<field name="date_validation"/>
<field name="date_payment"/>
<field name="user_id"/>
<field name="invoice_id"/>
<field name="note" select="1" />
<field name="state" select="1"/>
<field name="amount_total" sum="Amount total"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_pos_all_sales">
<field name="name">All sales</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">pos.order</field>
<field name="view_type">form</field>
<field name="view_id" ref="view_pos_order_tree_all_sales" />
</record>
<record model="ir.ui.view" id="view_pos_order_tree_all_sales_lines">
<field name="name">POS Sales Lines</field>
<field name="model">pos.order.line</field>
@@ -37,12 +37,20 @@ class pos_payment_report_date(report_sxw.rml_parse):
dt1 = form['date_start'] + ' 00:00:00'
dt2 = form['date_end'] + ' 23:59:59'
data={}
self.cr.execute ("select pt.name,pol.qty,pol.discount,pol.price_unit, " \
"(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) as total " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id " \
"and po.state IN ('paid','invoiced') and po.date_order >= %s and po.date_order <= %s and po.user_id IN %s " \
,(dt1,dt2,tuple(form['user_id'])))
if form['user_id']:
self.cr.execute ("select pt.name,pol.qty,pol.discount,pol.price_unit, " \
"(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) as total " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id " \
"and po.state IN ('paid','invoiced') and po.date_order >= %s and po.date_order <= %s and po.user_id IN %s " \
,(dt1,dt2,tuple(form['user_id'])))
else:
self.cr.execute ("select pt.name,pol.qty,pol.discount,pol.price_unit, " \
"(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) as total " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id " \
"and po.state IN ('paid','invoiced') and po.date_order >= %s and po.date_order <= %s" \
,(dt1,dt2))
data=self.cr.dictfetchall()
return data
@@ -50,11 +58,18 @@ class pos_payment_report_date(report_sxw.rml_parse):
dt1 = form['date_start'] + ' 00:00:00'
dt2 = form['date_end'] + ' 23:59:59'
res=[]
self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id " \
"and po.state IN ('paid','invoiced') and po.date_order >= %s and po.date_order <= %s and po.user_id IN %s " \
,(dt1,dt2,tuple(form['user_id'])))
if form['user_id']:
self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id " \
"and po.state IN ('paid','invoiced') and po.date_order >= %s and po.date_order <= %s and po.user_id IN %s " \
,(dt1,dt2,tuple(form['user_id'])))
else:
self.cr.execute ("select sum(pol.price_unit * pol.qty * (1 - (pol.discount) / 100.0)) " \
"from pos_order as po,pos_order_line as pol,product_product as pp,product_template as pt " \
"where pt.id=pp.product_tmpl_id and pp.id=pol.product_id and po.id = pol.order_id " \
"and po.state IN ('paid','invoiced') and po.date_order >= %s and po.date_order <= %s" \
,(dt1,dt2))
res=self.cr.fetchone()[0] or 0.0
return res
@@ -33,7 +33,7 @@ class report_cash_register(osv.osv):
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
'day': fields.char('Day', size=128, readonly=True),
'user_id':fields.many2one('res.users', 'User', readonly=True),
'state':fields.selection([('draft', 'Draft'),('confirm', 'Confirmed')],'State'),
'state': fields.selection([('draft', 'Quotation'),('open','Open'),('confirm', 'Confirmed')],'State'),
'journal_id': fields.many2one('account.journal', 'Journal'),
'balance_start': fields.float('Opening Balance'),
'balance_end_real': fields.float('Closing Balance'),
@@ -27,17 +27,17 @@
<field name="arch" type="xml">
<search string="Point of Sale Cash Register Analysis">
<group>
<filter icon="terp-go-year" string=" 365 Days "
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="Cash Analysis created last 365 days"/>
<filter icon="terp-go-month" string=" 30 Days "
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Cash Analysis created in last 30 days"/>
<filter icon="terp-go-week"
string=" 7 Days "
<filter icon="terp-go-year" string="Year"
domain="[('year','=',time.strftime('%%Y'))]"
help="Cash Analysis created during this year"/>
<filter icon="terp-go-month" string="Month"
domain="[('month','=',time.strftime('%%m'))]"
help="Cash Analysis created in current month"/>
<filter icon="terp-go-month"
string="Month -1"
separator="1"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="Cash Analysis created last 7 days"/>
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="Cash Analysis created in last month"/>
<separator orientation="vertical"/>
<filter icon="terp-go-today"
string=" Today "
@@ -67,16 +67,16 @@
<separator orientation="vertical"/>
<filter string="state" icon="terp-stock_effects-object-colorize" context="{'group_by':'state'}"/>
<separator orientation="vertical"/>
<filter string="Day" icon="terp-go-today" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
<filter string="Day" icon="terp-go-today" context="{'group_by':'day'}" help="Day from Creation date of register"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}" help="Month from Creation date of register"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}" help="Year from Creation date of register"/>
</group>
</search>
</field>
</record>
<record id="action_report_cash_register_all" model="ir.actions.act_window">
<field name="name">Cash Register Analysis</field>
<field name="name">Register Analysis</field>
<field name="res_model">report.cash.register</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
@@ -88,6 +88,8 @@ class report_pos_order(osv.osv):
to_char(s.date_order, 'dd-MM-YYYY'),to_char(s.date_order, 'YYYY'),to_char(s.date_order, 'MM'),
to_char(s.date_order, 'YYYY-MM-DD'), s.partner_id,s.state,
s.user_id,s.shop_id,s.company_id,s.sale_journal,l.product_id,s.date_validation,
s.date_payment)""")
s.date_payment
having
sum(l.qty * u.factor) != 0)""")
report_pos_order()
@@ -38,20 +38,20 @@
<field name="arch" type="xml">
<search string="Point of Sale Analysis">
<group>
<filter icon="terp-go-year" string=" 365 Days "
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')),('date','&gt;',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created last 365 days"/>
<filter icon="terp-go-month" string=" 30 Days "
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created in last 30 days"/>
<filter icon="terp-go-week"
string=" 7 Days "
<filter icon="terp-go-year" string="Year"
domain="[('year','=',time.strftime('%%Y'))]"
help="POS ordered created during current year"/>
<filter icon="terp-go-month" string="Month"
domain="[('month','=',time.strftime('%%m'))]"
help="POS ordered created during current month"/>
<filter icon="terp-go-month"
string="Month -1"
separator="1"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created last 7 days"/>
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d')), ('date','&gt;',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
help="POS ordered created last month"/>
<separator orientation="vertical"/>
<filter icon="terp-go-today"
string=" Today "
string="Today"
name="today"
separator="1"
domain="[('date','&lt;=', time.strftime('%%Y-%%m-%%d'))]"
@@ -79,9 +79,9 @@
<separator orientation="vertical"/>
<filter string="Product" icon="terp-accessories-archiver" context="{'group_by':'product_id'}"/>
<separator orientation="vertical"/>
<filter string="Day" icon="terp-go-today" context="{'group_by':'day'}"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}"/>
<filter string="Day" icon="terp-go-today" context="{'group_by':'day'}" help="Day of order date"/>
<filter string="Month" icon="terp-go-month" context="{'group_by':'month'}" help="Month of order date"/>
<filter string="Year" icon="terp-go-year" context="{'group_by':'year'}" help="Year of order date"/>
</group>
<newline/>
<group expand="0" string="Extended Filters..." groups="base.group_extended">
@@ -25,7 +25,7 @@
"access_report_pos_order_system","report.pos.order.system","model_report_pos_order","base.group_system",1,1,1,1
"access_report_pos_order","report.pos.order","model_report_pos_order","group_pos_manager",1,1,1,1
"access_account_bank_statement","account.bank.statement","account.model_account_bank_statement","group_pos_user",1,1,1,0
"access_account_bank_statement_manager","account.bank.statement manager","account.model_account_bank_statement","group_pos_manager",1,0,0,0
"access_account_bank_statement_manager","account.bank.statement manager","account.model_account_bank_statement","group_pos_manager",1,1,1,1
"access_account_bank_statement_system","account.bank.statement system","account.model_account_bank_statement","base.group_system",1,0,0,0
"access_account_bank_statement_line","account.bank.statement.line","account.model_account_bank_statement_line","group_pos_user",1,1,1,0
"access_account_period_pos","account.period pos user","account.model_account_period","group_pos_user",1,1,1,0
@@ -35,11 +35,13 @@
"access_account_fiscalyear_pos_manager","account.fiscalyear manager","account.model_account_fiscalyear","group_pos_manager",1,0,0,0
"access_account_fiscalyear_pos_system","account.fiscalyear user","account.model_account_fiscalyear","base.group_system",1,0,0,0
"access_account_cashbox_line","account.cashbox.line","account.model_account_cashbox_line","group_pos_user",1,1,1,0
"access_account_cashbox_line_manager","account.cashbox.line manager","account.model_account_cashbox_line","group_pos_manager",1,1,1,1
"access_product_product","product.product","product.model_product_product","group_pos_user",1,0,0,0
"access_product_template_pos_user","product.template pos user","product.model_product_template","group_pos_user",1,0,0,0
"access_product_product_pos_manager","product.product.pos manager","product.model_product_product","group_pos_manager",1,0,0,0
"access_product_template_pos_manager","product.template pos manager","product.model_product_template","group_pos_manager",1,0,0,0
"access_account_move_line","account.move.line","account.model_account_move_line","group_pos_user",1,1,1,0
"access_account_move_line_manager","account.move.line manager","account.model_account_move_line","group_pos_manager",1,1,1,1
"access_account_move","account.move","account.model_account_move","group_pos_user",1,1,1,0
"access_account_journal","account.journal","account.model_account_journal","group_pos_user",1,1,1,0
"access_account_journal_manager","account.journal manager","account.model_account_journal","group_pos_manager",1,0,0,0
@@ -57,7 +59,7 @@
"access_product_template_pos","product.template pos","product.model_product_template","base.group_system",1,1,1,1
"access_pos_order_system","pos.order system","model_pos_order","base.group_system",1,0,0,0
"access_pos_order_line_system","pos.order.line system","model_pos_order_line","base.group_system",1,0,0,0
"access_account_bank_statement_line_manager","account.bank.statement.line manager","account.model_account_bank_statement_line","group_pos_manager",1,0,0,0
"access_account_bank_statement_line_manager","account.bank.statement.line manager","account.model_account_bank_statement_line","group_pos_manager",1,1,1,1
"access_account_invoice_manager","account.invoice manager","account.model_account_invoice","group_pos_manager",1,1,1,1
"access_pos_payment_manager","pos.payment manager","model_pos_payment","group_pos_manager",1,0,0,0
"access_report_transaction_pos_system","report.transaction.pos system","model_report_transaction_pos","base.group_system",1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
25 access_report_pos_order_system report.pos.order.system model_report_pos_order base.group_system 1 1 1 1
26 access_report_pos_order report.pos.order model_report_pos_order group_pos_manager 1 1 1 1
27 access_account_bank_statement account.bank.statement account.model_account_bank_statement group_pos_user 1 1 1 0
28 access_account_bank_statement_manager account.bank.statement manager account.model_account_bank_statement group_pos_manager 1 0 1 0 1 0 1
29 access_account_bank_statement_system account.bank.statement system account.model_account_bank_statement base.group_system 1 0 0 0
30 access_account_bank_statement_line account.bank.statement.line account.model_account_bank_statement_line group_pos_user 1 1 1 0
31 access_account_period_pos account.period pos user account.model_account_period group_pos_user 1 1 1 0
35 access_account_fiscalyear_pos_manager account.fiscalyear manager account.model_account_fiscalyear group_pos_manager 1 0 0 0
36 access_account_fiscalyear_pos_system account.fiscalyear user account.model_account_fiscalyear base.group_system 1 0 0 0
37 access_account_cashbox_line account.cashbox.line account.model_account_cashbox_line group_pos_user 1 1 1 0
38 access_account_cashbox_line_manager account.cashbox.line manager account.model_account_cashbox_line group_pos_manager 1 1 1 1
39 access_product_product product.product product.model_product_product group_pos_user 1 0 0 0
40 access_product_template_pos_user product.template pos user product.model_product_template group_pos_user 1 0 0 0
41 access_product_product_pos_manager product.product.pos manager product.model_product_product group_pos_manager 1 0 0 0
42 access_product_template_pos_manager product.template pos manager product.model_product_template group_pos_manager 1 0 0 0
43 access_account_move_line account.move.line account.model_account_move_line group_pos_user 1 1 1 0
44 access_account_move_line_manager account.move.line manager account.model_account_move_line group_pos_manager 1 1 1 1
45 access_account_move account.move account.model_account_move group_pos_user 1 1 1 0
46 access_account_journal account.journal account.model_account_journal group_pos_user 1 1 1 0
47 access_account_journal_manager account.journal manager account.model_account_journal group_pos_manager 1 0 0 0
59 access_product_template_pos product.template pos product.model_product_template base.group_system 1 1 1 1
60 access_pos_order_system pos.order system model_pos_order base.group_system 1 0 0 0
61 access_pos_order_line_system pos.order.line system model_pos_order_line base.group_system 1 0 0 0
62 access_account_bank_statement_line_manager account.bank.statement.line manager account.model_account_bank_statement_line group_pos_manager 1 0 1 0 1 0 1
63 access_account_invoice_manager account.invoice manager account.model_account_invoice group_pos_manager 1 1 1 1
64 access_pos_payment_manager pos.payment manager model_pos_payment group_pos_manager 1 0 0 0
65 access_report_transaction_pos_system report.transaction.pos system model_report_transaction_pos base.group_system 1 1 1 1
+70 -7
View File
@@ -32,6 +32,57 @@
id="menu_all_menu_cash_register"
sequence="4"
/>-->
<record id="view_pos_open_cash_statement_filter" model="ir.ui.view">
<field name="name">account.bank.statement.inherit</field>
<field name="model">account.bank.statement</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Cash Statements">
<group col="8" colspan="4">
<filter string="Open" domain="[('state','=','open')]" icon="terp-document-new" name="open"/>
<separator orientation="vertical"/>
<field name="date"/>
<field name="name"/>
<field name="journal_id"/>
</group>
<newline/>
<group expand="0" string="Group By...">
<filter string="Journal" context="{'group_by': 'journal_id'}" icon="terp-folder-orange"/>
<separator orientation="vertical"/>
<filter string="Period" context="{'group_by': 'period_id'}" icon="terp-go-month"/>
<separator orientation="vertical"/>
<filter string="State" context="{'group_by': 'state'}" icon="terp-stock_effects-object-colorize"/>
</group>
</search>
</field>
</record>
<record id="view_pos_confirm_cash_statement_filter" model="ir.ui.view">
<field name="name">account.bank.statement.inherit2</field>
<field name="model">account.bank.statement</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Search Cash Statements">
<group col="8" colspan="4">
<filter string="Open" domain="[('state','=','open')]" icon="terp-document-new" name="open"/>
<filter string="Confirm" domain="[('state','=','confirm')]" icon="terp-camera_test"/>
<separator orientation="vertical"/>
<field name="date"/>
<field name="name"/>
<field name="journal_id"/>
</group>
<newline/>
<group expand="0" string="Group By...">
<filter string="Journal" context="{'group_by': 'journal_id'}" icon="terp-folder-orange"/>
<separator orientation="vertical"/>
<filter string="Period" context="{'group_by': 'period_id'}" icon="terp-go-month"/>
<separator orientation="vertical"/>
<filter string="State" context="{'group_by': 'state'}" icon="terp-stock_effects-object-colorize"/>
</group>
</search>
</field>
</record>
<record id="action_new_bank_statement_tree" model="ir.actions.act_window">
<field name="name">Cash Register</field>
@@ -56,8 +107,20 @@
<field name="act_window_id" ref="action_new_bank_statement_tree"/>
</record>
<record id="view_cash_statement_pos_tree" model="ir.ui.view">
<field name="name">account.bank.statement.tree</field>
<field name="model">account.bank.statement</field>
<field name="type">tree</field>
<field name="inherit_id" ref="account.view_cash_statement_tree"/>
<field name="arch" type="xml">
<field name="journal_id" position="after">
<field name="user_id"/>
</field>
</field>
</record>
<record id="action_new_bank_statement_all_tree" model="ir.actions.act_window">
<field name="name">All Register</field>
<field name="name">Registers</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">account.bank.statement</field>
<field name="view_type">form</field>
@@ -68,7 +131,7 @@
<record model="ir.actions.act_window.view" id="act_cash_statement_all_register1">
<field name="sequence" eval="0"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="account.view_bank_statement_tree"/>
<field name="view_id" ref="view_cash_statement_pos_tree"/>
<field name="act_window_id" ref="action_new_bank_statement_all_tree"/>
</record>
<record model="ir.actions.act_window.view" id="act_cash_statement_all_register">
@@ -79,7 +142,7 @@
</record>
<menuitem
name="All Registers"
name="Registers"
parent="menu_cash_register"
action="action_new_bank_statement_all_tree"
id="menu_all_menu_all_register"
@@ -89,14 +152,14 @@
<menuitem name="Register management" parent="point_of_sale.menu_point_root"
id="menu_point_open_config" sequence="1"/>
<menuitem
name="Open my Cash Registers" parent="menu_point_open_config"
string="Open my Cash Register"
name="Open Registers" parent="menu_point_open_config"
string="Open Registers"
action="action_pos_open_statement"
id="menu_open_statement" sequence="1" />
<menuitem
name="Close my Cash Register" parent="menu_point_open_config"
string="Close my Cash Register"
name="Close Registers" parent="menu_point_open_config"
string="Close Registers"
action="action_pos_close_statement"
id="menu_close_statement" sequence="2" />
+13 -56
View File
@@ -1,48 +1,40 @@
-
In order to test the POS in module, To gives business owners a convenient way of checking out customers and of recording sales.
In order to test the POS in module, To give business owners a convenient way of checking out customers and of recording sales.
-
I configure all details for the customer,Salesman and Product ,Account.
I configure all details for the Customer, Salesman and Product, Account.
-
I create View Account Type.
I create View Account Type.
-
!record {model: account.account.type, id: account_account_type_view0}:
close_method: none
code: View
name: View
sign: 1
-
I create Income Account Type.
I create Income Account Type.
-
!record {model: account.account.type, id: account_account_type_income0}:
close_method: unreconciled
code: Income
name: Income
sign: 1
-
I create Expense Account Type.
I create Expense Account Type.
-
!record {model: account.account.type, id: account_account_type_expense0}:
close_method: unreconciled
code: Expense
name: Expense
sign: 1
-
I create Cash Account Type.
I create Cash Account Type.
-
!record {model: account.account.type, id: account_account_type_cash0}:
close_method: balance
code: Cash
name: Cash
sign: 1
-
I create Minimal Chart Account.
-
@@ -69,8 +61,6 @@
reconcile: true
type: payable
user_type: account_account_type_expense0
-
I create Receivable Account.
-
@@ -85,8 +75,6 @@
reconcile: true
type: receivable
user_type: account_account_type_income0
-
I create Cash Account.
-
@@ -100,8 +88,6 @@
parent_right: 7
type: other
user_type: account_account_type_cash0
-
I create Purchases Account.
-
@@ -116,7 +102,7 @@
type: other
user_type: account_account_type_expense0
-
I create Sales Account.
I create Sales Account.
-
!record {model: account.account, id: account_account_sales0}:
code: Sale
@@ -128,7 +114,6 @@
parent_right: 11
type: other
user_type: account_account_type_income0
-
I create Purchase Journal.
-
@@ -141,10 +126,8 @@
sequence_id: account.sequence_purchase_journal
type: purchase
view_id: account.account_journal_view
-
I create Sale Journal.
I create Sale Journal.
-
!record {model: account.journal, id: account_journal_salejournal0}:
code: SAJ
@@ -155,10 +138,8 @@
sequence_id: account.sequence_sale_journal
type: sale
view_id: account.account_journal_view
-
I create Bank Journal.
I create Bank Journal.
-
!record {model: account.journal, id: account_journal_bankjournal0}:
code: BNK
@@ -169,7 +150,6 @@
sequence_id: account.sequence_journal
type: cash
view_id: account.account_journal_bank_view
-
I create property for account payable.
-
@@ -178,10 +158,8 @@
fields_id: account.field_res_partner_property_account_payable
name: property_account_expense_categ
value_reference: account.account,5
-
I create property for account receivable.
I create property for account receivable.
-
!record {model: ir.property, id: ir_property_propertyaccountincomecateg0}:
company_id: base.main_company
@@ -200,25 +178,19 @@
category_id:
- res_partner_category_customers0
name: Cleartrail
-
I create partner address.
I create partner address.
-
!record {model: res.partner.address, id: res_partner_address_1}:
partner_id: res_partner_cleartrail0
street: onam plaza, 14 B palasia A B Road
type: contact
-
I create partner invoice address.
-
!record {model: res.partner.address, id: res_partner_address_2}:
partner_id: res_partner_cleartrail0
type: invoice
-
I create partner delivery address.
-
@@ -241,7 +213,6 @@
property_account_payable: account_account_payable1
property_account_receivable: account_account_receivable0
supplier: true
-
I create partner address .
-
@@ -270,7 +241,6 @@
type: product
uom_id: product.product_uom_unit
uom_po_id: product.product_uom_unit
-
I create product LG Viewty Smart.
-
@@ -294,7 +264,6 @@
-
!record {model: product.category, id: product_category_computer0}:
name: Computer
-
I create product HP Pavilion Desktop PCs
-
@@ -315,11 +284,9 @@
uom_po_id: product.product_uom_unit
property_account_expense: account_account_payable1
property_account_income: account_account_receivable0
-
I create New Order by adding the details of Salesman and "Product" as LG Viewty Smart Quantity as 10.
-
!record {model: pos.order, id: pos_order_pos0}:
company_id: base.main_company
date_order: '2010-05-13 15:02:48'
@@ -351,13 +318,11 @@
self.apply_discount(cr, uid, [ref("pos_discount_0")], {"lang": "en_US", "active_model":
"pos.order", "active_ids": [ref("pos_order_pos0")], "tz": False, "active_id":
ref("pos_order_pos0"), })
-
I open the register.
-
!record {model: pos.open.statement, id: pos_open_statement_0}:
{}
-
I open the statement.
-
@@ -365,19 +330,17 @@
self.open_statement(cr, uid, [ref("pos_open_statement_0")], {"lang": "en_US", "active_model":
"ir.ui.menu", "active_ids": [ref("point_of_sale.menu_open_statement")], "tz":
False, "active_id": ref("point_of_sale.menu_open_statement"), })
-
I click on the "Make Payment" wizard.
-
!record {model: pos.make.payment, id: pos_make_payment_0}:
amount: 1615.0
journal: 7
payment_date: 2010-05-13
payment_date: "2010-05-13"
payment_name: Payment
product_id: product_product_hppaviliondesktoppcs0
pricelist_id: product.list0
partner_id: base.res_partner_agrolait
-
I make the payment.
-
@@ -391,7 +354,6 @@
!python {model: pos.order}: |
order=self.browse(cr,uid,ref("pos_order_pos0"))
assert(order.statement_ids!=[]), "Statement lines not created"
-
When I click on Return picking button , I get three option.
-
@@ -412,8 +374,6 @@
self.create_returns(cr, uid, [ref("pos_return_0")], {"lang": "en_US", "active_model":
"pos.order", "active_ids": [ref("point_of_sale.pos_order_pos0")], "tz":
False, "active_id": ref("point_of_sale.pos_order_pos0"), })
-
Then it allows me to define the quantity of products, which will return to the stock.
-
@@ -432,19 +392,17 @@
self.close_action(cr, uid, [ref("pos_add_product_0")], {"lang": "en_US", "active_model":
"pos.order", "active_ids": [ref("pos_order_pos0")], "tz": False, "active_id": ref("pos_order_pos0"),
})
-
I create payment.
-
!record {model: pos.make.payment, id: pos_make_payment_1}:
amount: 680.0
journal: 7
payment_date: 2010-05-13
payment_date: "2010-05-13"
payment_name: Payment
product_id: product_product_hppaviliondesktoppcs0
pricelist_id: product.list0
partner_id: base.res_partner_agrolait
-
For payment, I click on Make Payment.
-
@@ -452,7 +410,6 @@
self.check(cr, uid, [ref("pos_make_payment_1")], {"lang": "en_US", "active_model":
"pos.order", "active_ids": [ref("pos_order_pos0")], "tz":
False, "active_id": ref("pos_order_pos0"), })
-
To check the Return without Refund . I click button "Return without Refund ".
-
@@ -36,8 +36,9 @@ def get_journal(self, cr, uid, context):
obj = self.pool.get('account.journal')
statement_obj = self.pool.get('account.bank.statement')
user = self.pool.get('res.users').browse(cr, uid, uid)
ids = obj.search(cr, uid, [('type', '=', 'cash'), ('company_id', '=', user.company_id.id)])
cr.execute("""select DISTINCT journal_id from pos_journal_users where user_id=%d order by journal_id"""%(uid))
j_ids = map(lambda x1: x1[0], cr.fetchall())
ids = obj.search(cr, uid, [('type', '=', 'cash'), ('id', 'in', j_ids)])
obj_ids= statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', 'in', ids)])
res_obj = obj.read(cr, uid, ids, ['journal_id'], context)
res_obj = [(r1['id'])for r1 in res_obj]
@@ -14,11 +14,13 @@
<field name="journal_id"/>
<field name="product_id"/>
<field name="amount"/>
<group colspan="4" col="2">
<button icon='gtk-cancel' special="cancel"
string="Close" />
<button name="get_in" string="Take Money"
colspan="1" type="object" icon="gtk-ok" />
<separator colspan="4"/>
<group colspan="4" col="4">
<group col="2" colspan="2"/>
<button icon="gtk-stop" special="cancel"
string="Cancel" />
<button name="get_in" string="Put Money"
colspan="1" type="object" icon="terp-dolar_ok!" />
</group>
</form>
</field>
+8 -6
View File
@@ -14,12 +14,14 @@
<field name="journal_id"/>
<field name="product_id"/>
<field name="amount"/>
<group colspan="4" col="2">
<button icon='gtk-cancel' special="cancel"
string="Close" />
<button name="get_out" string="Put Money"
colspan="1" type="object" icon="gtk-ok" />
</group>
<separator colspan="4"/>
<group colspan="4" col="4">
<group col="2" colspan="2"/>
<button icon="gtk-stop" special="cancel"
string="Cancel" />
<button name="get_out" string="Take Money"
colspan="1" type="object" icon="terp-dolar" />
</group>
</form>
</field>
</record>
@@ -43,28 +43,29 @@ class pos_close_statement(osv.osv_memory):
cr.execute("""select DISTINCT journal_id from pos_journal_users where user_id=%d order by journal_id"""%(uid))
j_ids = map(lambda x1: x1[0], cr.fetchall())
journal_ids = journal_obj.search(cr, uid, [('auto_cash', '=', True), ('type', '=', 'cash'), ('id', 'in', j_ids)])
ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', 'in', journal_ids)])
for journal in journal_obj.browse(cr, uid, journal_ids):
ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', '=', journal.id)])
if not ids:
raise osv.except_osv(_('Message'), _('Journals are already closed'))
raise osv.except_osv(_('Message'), _('Registers are already closed.'))
else:
list_statement.append(ids[0])
if not journal.check_dtls:
statement_obj.button_confirm_cash(cr, uid, ids, context)
data_obj = self.pool.get('ir.model.data')
id2 = data_obj._get_id(cr, uid, 'account', 'view_bank_statement_tree')
id3 = data_obj._get_id(cr, uid, 'account', 'view_bank_statement_form2')
result = data_obj._get_id(cr, uid, 'point_of_sale', 'view_pos_confirm_cash_statement_filter')
search_id = mod_obj.read(cr, uid, result, ['res_id'], context=context)
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
return {
'domain': "[('id','in'," + str(list_statement) + ")]",
'domain': "[('id','in'," + str(ids) + ")]",
'name': 'Close Statements',
'view_type': 'form',
'view_mode': 'tree,form',
'search_view_id': search_id['res_id'],
'res_model': 'account.bank.statement',
'views': [(id2, 'tree'),(id3, 'form')],
'type': 'ir.actions.act_window'
@@ -9,11 +9,15 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Close Statements">
<separator string="Are you sure you want to close the statements ?" colspan="4"/>
<button icon='gtk-cancel' special="cancel"
string="No" colspan="1" />
<button name="close_statement" string="Yes"
colspan="1" type="object" icon="gtk-ok"/>
<label string="Are you sure you want to close the statements ?"/>
<separator colspan="4"/>
<group col="4" colspan="4">
<group col="2" colspan="2"/>
<button icon='gtk-stop' special="cancel"
string="No" />
<button name="close_statement" string="Yes"
type="object" icon="gtk-ok"/>
</group>
</form>
</field>
</record>
@@ -12,6 +12,7 @@
<group col="2" colspan="4">
<field name="date_start"/>
<field name="date_end"/>
<separator colspan="4"/>
<button icon='gtk-cancel' special="cancel"
string="Close" />
<button name="print_report" string="Print Report"
@@ -49,7 +49,7 @@ class pos_open_statement(osv.osv_memory):
for journal in journal_obj.browse(cr, uid, journal_ids):
ids = statement_obj.search(cr, uid, [('state', '!=', 'confirm'), ('user_id', '=', uid), ('journal_id', '=', journal.id)])
if len(ids):
raise osv.except_osv(_('Message'), _('You can not open a Cashbox for "%s". \n Please close the cashbox related to. ' %(journal.name)))
raise osv.except_osv(_('Message'), _('You can not open a Cashbox for "%s".\nPlease close its related Register.' %(journal.name)))
statement_ids = sorted(statement_obj.search(cr, uid, [('state', '=', 'confirm'), ('user_id', '=', uid), ('journal_id', '=', journal.id)]))
if statement_ids:
@@ -83,18 +83,22 @@ class pos_open_statement(osv.osv_memory):
data_obj = self.pool.get('ir.model.data')
id2 = data_obj._get_id(cr, uid, 'account', 'view_bank_statement_tree')
id3 = data_obj._get_id(cr, uid, 'account', 'view_bank_statement_form2')
result = data_obj._get_id(cr, uid, 'point_of_sale', 'view_pos_open_cash_statement_filter')
search_id = mod_obj.read(cr, uid, result, ['res_id'], context=context)
if id2:
id2 = data_obj.browse(cr, uid, id2, context=context).res_id
if id3:
id3 = data_obj.browse(cr, uid, id3, context=context).res_id
return {
'domain': "[('state','=','open')]",
'domain': "[('state','=','open'),('user_id','=',"+ str(uid) +")]",
'name': 'Open Statement',
'view_type': 'form',
'view_mode': 'tree,form',
'search_view_id': search_id['res_id'],
'res_model': 'account.bank.statement',
'views': [(id2, 'tree'),(id3, 'form')],
'context': {'search_default_open': 1},
'type': 'ir.actions.act_window'
}
pos_open_statement()
@@ -9,11 +9,15 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Open Statements">
<separator string="Are you sure you want to open the statements ?" colspan="4"/>
<button icon='gtk-cancel' special="cancel"
string="No" />
<button name="open_statement" string="Yes"
type="object" icon="gtk-ok"/>
<label string="Are you sure you want to open the statements ?"/>
<separator colspan="4"/>
<group col="4" colspan="4">
<group col="2" colspan="2"/>
<button icon='gtk-stop' special="cancel"
string="No" />
<button name="open_statement" string="Yes"
type="object" icon="gtk-ok"/>
</group>
</form>
</field>
</record>
+26 -5
View File
@@ -47,8 +47,9 @@ class pos_make_payment(osv.osv_memory):
active_id = context and context.get('active_id',False)
if active_id:
j_obj = self.pool.get('account.journal')
company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
journal = j_obj.search(cr, uid, [('type', '=', 'cash'), ('company_id', '=', company_id)])
cr.execute("""select DISTINCT journal_id from pos_journal_users where user_id=%d order by journal_id"""%(uid))
j_ids = map(lambda x1: x1[0], cr.fetchall())
journal = j_obj.search(cr, uid, [('type', '=', 'cash'), ('id', 'in', j_ids)])
if journal:
journal = journal[0]
@@ -79,6 +80,10 @@ class pos_make_payment(osv.osv_memory):
res.update({'payment_date':current_date})
if 'payment_name' in fields:
res.update({'payment_name':'Payment'})
if 'partner_id' in fields:
res.update({'partner_id': order.partner_id.id or False})
if 'pricelist_id' in fields:
res.update({'pricelist_id': order.pricelist_id.id or False})
return res
def view_init(self, cr, uid, fields_list, context=None):
@@ -123,6 +128,18 @@ class pos_make_payment(osv.osv_memory):
"""
return result
def onchange_product_id(self, cr, uid, ids, product_id, amount):
""" Changes amount if product_id changes.
@param product_id: Changed product_id
@param amount: Amount to be paid
@return: Dictionary of changed values
"""
prod_obj = self.pool.get('product.product')
if product_id:
product = prod_obj.browse(cr, uid, product_id)
amount = amount - product.list_price
return {'value': {'amount': amount}}
def check(self, cr, uid, ids, context):
"""Check the order:
@@ -135,8 +152,12 @@ class pos_make_payment(osv.osv_memory):
amount = order.amount_total - order.amount_paid
data = self.read(cr, uid, ids)[0]
invoice_wanted = data['invoice_wanted']
is_accompte = data['is_acc']
# Todo need to check ...
if is_accompte:
line_id, price = order_obj.add_product(cr, uid, order.id, data['product_id'], -1.0, context)
amount = order.amount_total - order.amount_paid - price
if amount != 0.0:
order_obj.write(cr, uid, [active_id], {'invoice_wanted': invoice_wanted, 'partner_id': data['partner_id']})
order_obj.add_payment(cr, uid, active_id, data, context=context)
@@ -205,11 +226,11 @@ class pos_make_payment(osv.osv_memory):
_columns = {
'journal':fields.selection(pos_box_entries.get_journal, "Cash Register",required=True),
'product_id': fields.many2one('product.product', "Acompte"),
'product_id': fields.many2one('product.product', "Advance"),
'amount':fields.float('Amount', digits=(16,2) ,required= True),
'payment_name': fields.char('Payment name', size=32, required=True),
'payment_date': fields.date('Payment date', required=True),
'is_acc': fields.boolean('Accompte'),
'is_acc': fields.boolean('Advance'),
'invoice_wanted': fields.boolean('Invoice'),
'num_sale':fields.char('Num.File', size=32),
'pricelist_id': fields.many2one('product.pricelist', 'Pricelist'),
+9 -7
View File
@@ -12,26 +12,28 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Add payment :">
<group colspan="4" width="600" height="200">
<group colspan="4" width="600" height="220">
<field name="journal"/>
<field name="amount" />
<field name="payment_date" />
<!--field name="payment_name" /-->
<field name="invoice_wanted" />
<field name="num_sale" />
<field name="is_acc" />
<field name="is_acc"/>
<group attrs="{'invisible':[('is_acc','=',False)]}" colspan="4" col="2">
<field name="product_id" attrs="{'required':[('is_acc', '=', True)]}" domain="[('type','=','service')]"/>
<field name="product_id" attrs="{'required':[('is_acc', '=', True)]}" domain="[('type','=','service')]"
on_change="onchange_product_id(product_id, amount)"/>
</group>
<newline/>
<group attrs="{'invisible':[('invoice_wanted','=',False)]}" colspan="4">
<field name="partner_id" attrs="{'required':[('invoice_wanted', '=', True)]}" colspan="2"/>
<field name="pricelist_id" attrs="{'required':[('invoice_wanted', '=', True)]}" colspan="2"/>
</group>
<newline/>
<group col="2" colspan="4">
<button icon='gtk-cancel' special="cancel" string="Cancel" />
<button name="check" string="Make Payment" colspan="1" type="object" icon="gtk-ok"/>
<separator colspan="4"/>
<group col="4" colspan="4">
<group col="2" colspan="2"/>
<button icon='gtk-stop' special="cancel" string="Cancel" />
<button name="check" string="Make Payment" colspan="1" type="object" icon="terp-dolar"/>
</group>
</group>
</form>
@@ -7,15 +7,21 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Sale by Date and User">
<group col="2" colspan="4">
<group col="4" colspan="4">
<separator string="Dates" colspan="4"/>
<field name="date_start"/>
<field name="date_end"/>
<field name="user_id"/>
<button icon='gtk-cancel' special="cancel"
string="Close" />
<button name="print_report" string="Print Report"
colspan="1" type="object" icon="gtk-print" />
</group>
<separator string="User" colspan="4"/>
<field name="user_id" nolabel="1" colspan="4"/>
<separator string="" colspan="4"/>
<label string="" colspan="2"/>
<group colspan="2" col="2">
<button icon='gtk-cancel' special="cancel"
string="Close" />
<button name="print_report" string="Print Report"
colspan="1" type="object" icon="gtk-print" />
</group>
</group>
</form>
</field>
</record>
@@ -12,8 +12,8 @@
<form string="Receipt :">
<separator string="Print the receipt of the sale" colspan="4"/>
<button icon='gtk-cancel' special="cancel"
string="Close" />
<button name="print_report" string="Print Report"
string="Cancel" />
<button name="print_report" string="Print Receipt"
colspan="1" type="object" icon="gtk-print" />
</form>
</field>
-1
View File
@@ -19,7 +19,6 @@
#
##############################################################################
from mx import DateTime
from osv import osv, fields
from tools.translate import _
import netsvc
-1
View File
@@ -91,7 +91,6 @@
help="Procurement started late" />
<filter icon="terp-gtk-go-back-rtl" string="To Fix" domain="[('state', '=', 'exception'),('message','=','')]" help="Procurement Orders with exceptions and without message"/>
<separator orientation="vertical"/>
<field name="name"/>
<field name="origin"/>
<field name="product_id" />
<field name="date_planned" widget="date"/>
+1 -1
View File
@@ -421,7 +421,7 @@ msgid ""
"reception of products."
msgstr ""
"Preço Padrão: o preço é fixo e recalculado periodicamente (geralmente no "
"final do ano).\r\n"
"final do ano).\n"
"Preço Médio: o preço de custo é recalculado a cada recepção de produtos."
#. module: product
+6 -6
View File
@@ -399,7 +399,7 @@ msgid ""
"at the end of the year), Average Price: the cost price is recomputed at each "
"reception of products."
msgstr ""
"标准价格: 成本价格是定期重新计算(通常在年底).\r\n"
"标准价格: 成本价格是定期重新计算(通常在年底).\n"
"平均价格: 成本价格是在每次接收产品时重新计算."
#. module: product
@@ -557,7 +557,7 @@ msgid ""
"and the reception of goods for this product and for the default supplier. It "
"is used by the scheduler to order requests based on reordering delays."
msgstr ""
"产品供应在确认采购订单到接收产品之间的默认平均延迟. \r\n"
"产品供应在确认采购订单到接收产品之间的默认平均延迟. \n"
"用于在调度订单请求时要考虑的重订货延迟."
#. module: product
@@ -671,7 +671,7 @@ msgid ""
"supplying. 'Make to Order': When needed, purchase or produce for the "
"procurement request."
msgstr ""
"按库存生产: 在仓库或等待重新供应时得到需求.\r\n"
"按库存生产: 在仓库或等待重新供应时得到需求.\n"
" 按订单生产: 在采购或产品获得请求时得到需求."
#. module: product
@@ -1214,7 +1214,7 @@ msgid ""
"The computed quantity will be a multiple of this value. Use 1.0 for products "
"that can not be split."
msgstr ""
"这数量计算将乘于一个数值.\r\n"
"这数量计算将乘于一个数值.\n"
"产品使用1.0表示不能拆分."
#. module: product
@@ -1444,7 +1444,7 @@ msgid ""
"the delivery of the finished products. It's the time you promise to your "
"customers."
msgstr ""
"这是确认客户订单和交付的平均时间.\r\n"
"这是确认客户订单和交付的平均时间.\n"
"是承诺客户的时间."
#. module: product
@@ -1668,7 +1668,7 @@ msgid ""
"reception of the products in your warehouse. Used by the scheduler for "
"automatic computation of the purchase order planning."
msgstr ""
"延迟天数是确认采购订单到仓库接收产品之间的延迟天数.\r\n"
"延迟天数是确认采购订单到仓库接收产品之间的延迟天数.\n"
"用于制定采购订单计划时调度程序自动计算."
#. module: product
-3
View File
@@ -21,13 +21,10 @@
from osv import osv, fields
import decimal_precision as dp
import pooler
import math
import logging
from _common import rounding
from tools import config
from tools.translate import _
def is_pair(x):
+25 -21
View File
@@ -22,12 +22,14 @@
from lxml import etree
import time
from datetime import datetime, date
from operator import itemgetter
from itertools import groupby
from tools.misc import flatten
from tools.translate import _
from osv import fields, osv
from tools import email_send as email
from operator import itemgetter
class project_task_type(osv.osv):
_name = 'project.task.type'
@@ -77,20 +79,6 @@ class project(osv.osv):
pricelist_id = pricelist.get('property_product_pricelist', False) and pricelist.get('property_product_pricelist')[0] or False
return {'value':{'contact_id': addr['contact'], 'pricelist_id': pricelist_id}}
def get_all_child_projects(self, cr, uid, ids, context=None):
# Calculate child project for Given project id => For progress rate + planned time + Time spent
cr.execute('''SELECT prpc.id AS id from account_analytic_account AS p
JOIN account_analytic_account AS c ON p.id = c.parent_id
JOIN project_project AS prp ON prp.analytic_account_id = p.id
JOIN project_project AS prpc ON prpc.analytic_account_id = c.id
WHERE prp.id IN %s''',(tuple(ids),))
child_ids = cr.fetchall()
if child_ids:
child_ids = [x[0] for x in child_ids]
child_ids = self.get_all_child_projects(cr, uid, child_ids)
return ids + child_ids
def _get_user_and_default_uom_ids(self, cr, uid):
users_obj = self.pool.get('res.users')
model_data_obj = self.pool.get('ir.model.data')
@@ -102,17 +90,33 @@ class project(osv.osv):
return user_uom, default_uom
def _progress_rate(self, cr, uid, ids, names, arg, context=None):
def _get_all_child_projects(ids):
"""Recursively get child project ids"""
child_ids = flatten([project_hierarchy.get(idn, []) for idn in ids])
if child_ids:
child_ids = _get_all_child_projects(child_ids)
return ids + child_ids
# END _get_all_child_projects
res = {}.fromkeys(ids, 0.0)
progress = {}
if not ids:
return res
par_child_projects={}
par_child_projects = {}
all_projects = list(ids)
# get project hierarchy:
cr.execute('''SELECT prp.id AS pr_parent_id, prpc.id AS pr_child_id
FROM account_analytic_account AS p
JOIN account_analytic_account AS c ON p.id = c.parent_id
JOIN project_project AS prp ON prp.analytic_account_id = p.id
JOIN project_project AS prpc ON prpc.analytic_account_id = c.id''')
project_hierarchy = dict((k, list(set([v[1] for v in itr]))) for k, itr in groupby(cr.fetchall(), itemgetter(0)))
for id in ids:
child_projects = self.get_all_child_projects(cr, uid, [id], context)
child_projects = [x for x in child_projects]
child_projects = _get_all_child_projects([id])
par_child_projects[id] = child_projects
all_projects.extend(child_projects)
@@ -128,6 +132,7 @@ class project(osv.osv):
project_id''',(tuple(all_projects),))
progress = dict(map(lambda x: (x[0], (x[1], x[2], x[3])), cr.fetchall()))
user_uom, def_uom = self._get_user_and_default_uom_ids(cr, uid)
for project in self.browse(cr, uid, par_child_projects.keys(), context=context):
s = [0.0, 0.0, 0.0]
tocompute = par_child_projects[project.id]
@@ -137,7 +142,6 @@ class project(osv.osv):
s[i] += progress.get(p, (0.0, 0.0, 0.0))[i]
uom_obj = self.pool.get('product.uom')
user_uom, def_uom = self._get_user_and_default_uom_ids(cr, uid)
if user_uom != def_uom:
s[0] = uom_obj._compute_qty(cr, uid, user_uom, s[0], def_uom)
s[1] = uom_obj._compute_qty(cr, uid, user_uom, s[1], def_uom)
@@ -426,7 +430,7 @@ class task(osv.osv):
'parent_ids': fields.many2many('project.task', 'project_task_parent_rel', 'task_id', 'parent_id', 'Parent Tasks'),
'child_ids': fields.many2many('project.task', 'project_task_parent_rel', 'parent_id', 'task_id', 'Delegated Tasks'),
'notes': fields.text('Notes'),
'planned_hours': fields.float('Planned Hours', required=True, help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'),
'planned_hours': fields.float('Planned Hours', help='Estimated time to do the task, usually set by the project manager when the task is in draft state.'),
'effective_hours': fields.function(_hours_get, method=True, string='Hours Spent', multi='hours', store=True, help="Computed using the sum of the task work done."),
'remaining_hours': fields.float('Remaining Hours', digits=(16,2), help="Total remaining time, can be re-estimated periodically by the assignee of the task."),
'total_hours': fields.function(_hours_get, method=True, string='Total Hours', multi='hours', store=True, help="Computed as: Time Spent + Remaining Time."),
@@ -466,7 +470,7 @@ class task(osv.osv):
cr.execute('SELECT DISTINCT task_id '\
'FROM project_task_parent_rel '\
'WHERE parent_id IN %s', (tuple(ids),))
child_ids = map(itemgetter(0), cr.fetchall())
child_ids = map(lambda x: x[0], cr.fetchall())
c_ids = child_ids
if (list(set(parent_ids).intersection(set(c_ids)))) or (obj_task.id in c_ids):
return False
+1 -1
View File
@@ -19,7 +19,7 @@
<field name="type">form</field>
<field name="inherit_id" ref="product.product_normal_form_view"/>
<field name="arch" type="xml">
<field name="company_id" position="after">
<field name="active" position="after">
<field name="project_id" attrs="{'readonly':[('type','!=','service')]}" />
</field>
</field>
+19 -12
View File
@@ -18,9 +18,13 @@
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="20" groups="base.group_extended">
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'resource_type'}"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}"/>
<filter string="User" icon="terp-personal" domain="[]" context="{'group_by':'user_id'}"/>
<separator orientation="vertical"/>
<filter string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'resource_type'}"/>
<separator orientation="vertical"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical" groups="base.group_multi_company"/>
<filter string="Working Time" icon="terp-go-today" domain="[]" context="{'group_by':'calendar_id'}"/>
</group>
</search>
</field>
@@ -53,16 +57,17 @@
<search string="Search Working Period Leaves">
<group col='15' colspan='4'>
<field name="name" string="Name"/>
<field name="company_id" string="Company" widget="selection" />
<field name="calendar_id" string="Working Time" widget="selection"/>
<field name="resource_id" string="Resource"/>
<field name="company_id" string="Company" widget="selection" groups="base.group_multi_company"/>
<field name="calendar_id" string="Working Time" widget="selection"/>
</group>
<newline/>
<group expand="0" string="Group By..." colspan="4" col="20">
<filter string="Resource" icon="terp-personal" domain="[]" context="{'group_by':'resource_id'}"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_from'}"/>
<filter string="Company" icon="terp-go-home" domain="[]" context="{'group_by':'company_id'}" groups="base.group_multi_company"/>
<separator orientation="vertical" groups="base.group_multi_company"/>
<filter string="Date" icon="terp-go-month" domain="[]" context="{'group_by':'date_from'}" help="Starting Date of Leave"/>
</group>
</search>
</field>
@@ -74,9 +79,11 @@
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Working Period">
<field name="name" select="1"/>
<field name="manager" select="1"/>
<field name="company_id" select="1" groups="base.group_multi_company"/>
<field name="name"/>
<field name="manager"/>
<field name="company_id" groups="base.group_multi_company"/>
<separator string="" colspan="4"/>
<field name="attendance_ids" colspan="4" nolabel="1"/>
</form>
</field>
</record>
@@ -196,7 +203,7 @@
<field name="name">Resources</field>
<field name="res_model">resource.resource</field>
<field name="view_mode">tree,form</field>
<field name="context">{"search_default_user_id":uid}</field>
<field name="context">{}</field>
<field name="search_view_id" ref="view_resource_resource_search"/>
<field name="help">There you can find clusters of your resources type involved in a specific project phase as well as their workload.</field>
</record>
@@ -210,7 +217,7 @@
<field name="name"/>
<field name="resource_id" on_change="onchange_resource(resource_id)"/>
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
<field name="calendar_id"/>
<field name="calendar_id" widget="selection"/>
<newline/>
<field name="date_from"/>
<field name="date_to"/>
@@ -224,11 +231,11 @@
<field name="arch" type="xml">
<tree string="Leave Detail">
<field name="name" />
<field name="resource_id" />
<field name="company_id" groups="base.group_multi_company"/>
<field name="calendar_id" />
<field name="date_from" />
<field name="date_to" />
<field name="resource_id" />
</tree>
</field>
</record>
-1
View File
@@ -81,7 +81,6 @@ class crm_make_sale(osv.osv_memory):
sale_line_obj = self.pool.get('sale.order.line')
result = mod_obj._get_id(cr, uid, 'sale', 'view_sales_order_filter')
id = mod_obj.read(cr, uid, result, ['res_id'])
data = context and context.get('active_ids', []) or []
+4 -4
View File
@@ -2013,7 +2013,7 @@ msgid ""
"This stock location will be used, instead of the default one, as the "
"destination location for goods you send to this partner"
msgstr ""
"Koristiće se ova lokacija zaliha, umjesto podrazumjevane, kao \r\n"
"Koristiće se ova lokacija zaliha, umjesto podrazumjevane, kao \n"
"odredišna lokacija za robu koju šaljete ovom partneru"
#. module: stock
@@ -2151,8 +2151,8 @@ msgid ""
"instead of the default one, as the source location for stock moves generated "
"by production orders"
msgstr ""
"Za ovaj proizvod (šablon) biće korištena ova lokacija zaliha, \r\n"
"umjesto podrazumjevane, kao izvorna lokacija za premještanja zaliha \r\n"
"Za ovaj proizvod (šablon) biće korištena ova lokacija zaliha, \n"
"umjesto podrazumjevane, kao izvorna lokacija za premještanja zaliha \n"
"kada ga inicira nalog za proizvodnju"
#. module: stock
@@ -2238,7 +2238,7 @@ msgid ""
"by procurements"
msgstr ""
"Za ovaj proizvod (šablon) biće korištena ova lokacija zaliha, umjesto "
"podrazumjevane, kao izvorna lokacija za premještanja zaliha \r\n"
"podrazumjevane, kao izvorna lokacija za premještanja zaliha \n"
"kada ga inicira nabavka"
#. module: stock
-1
View File
@@ -67,7 +67,6 @@ class product_product(osv.osv):
stock_output_acc = datas.get('stock_output_account', False)
stock_input_acc = datas.get('stock_input_account', False)
journal_id = datas.get('stock_journal', False)
property_obj=self.pool.get('ir.property')
product_obj=self.browse(cr,uid,ids)[0]
account_variation = product_obj.categ_id.property_stock_variation
account_variation_id = account_variation and account_variation.id or False
+1 -22
View File
@@ -23,7 +23,6 @@ from dateutil.relativedelta import relativedelta
import time
from osv import fields, osv
from tools import config
from tools.translate import _
import netsvc
import tools
@@ -856,7 +855,6 @@ class stock_picking(osv.osv):
""" Gets payment term from partner.
@return: Payment term
"""
partner_obj = self.pool.get('res.partner')
partner = picking.address_id.partner_id
return partner.property_payment_term and partner.property_payment_term.id or False
@@ -1132,12 +1130,8 @@ class stock_picking(osv.osv):
price_type_obj = self.pool.get('product.price.type')
sequence_obj = self.pool.get('ir.sequence')
wf_service = netsvc.LocalService("workflow")
partner_id = partial_datas.get('partner_id', False)
address_id = partial_datas.get('address_id', False)
delivery_date = partial_datas.get('delivery_date', False)
for pick in self.browse(cr, uid, ids, context=context):
new_picking = None
new_moves = []
complete, too_many, too_few = [], [], []
move_product_qty = {}
for move in pick.move_lines:
@@ -1197,7 +1191,7 @@ class stock_picking(osv.osv):
})
if product_qty != 0:
new_obj = move_obj.copy(cr, uid, move.id,
move_obj.copy(cr, uid, move.id,
{
'product_qty' : product_qty,
'product_uos_qty': product_qty, #TODO: put correct uos_qty
@@ -1682,7 +1676,6 @@ class stock_move(osv.osv):
"""
moves = self.browse(cr, uid, ids)
self.write(cr, uid, ids, {'state': 'confirmed'})
i = 0
def create_chained_picking(self, cr, uid, moves, context=None):
new_moves = []
@@ -1815,7 +1808,6 @@ class stock_move(osv.osv):
def setlast_tracking(self, cr, uid, ids, context=None):
tracking_obj = self.pool.get('stock.tracking')
tracking = context.get('tracking', False)
picking = self.browse(cr, uid, ids)[0].picking_id
if picking:
last_track = [line.tracking_id.id for line in picking.move_lines if line.tracking_id]
@@ -1895,7 +1887,6 @@ class stock_move(osv.osv):
amount = q * move.price_unit
# Base computation on valuation price type
else:
company_id = move.company_id.id
context['currency_id'] = move.company_id.currency_id.id
pricetype = price_type_obj.browse(cr,uid,move.company_id.property_valuation_price_type.id)
amount_unit = move.product_id.price_get(pricetype.field, context)[move.product_id.id]
@@ -1906,11 +1897,7 @@ class stock_move(osv.osv):
""" Makes the move done and if all moves are done, it will finish the picking.
@return:
"""
track_flag = False
picking_ids = []
product_uom_obj = self.pool.get('product.uom')
price_type_obj = self.pool.get('product.price.type')
product_obj = self.pool.get('product.product')
move_obj = self.pool.get('account.move')
if context is None:
context = {}
@@ -2205,12 +2192,7 @@ class stock_move(osv.osv):
users_obj = self.pool.get('res.users')
uom_obj = self.pool.get('product.uom')
price_type_obj = self.pool.get('product.price.type')
sequence_obj = self.pool.get('ir.sequence')
wf_service = netsvc.LocalService("workflow")
partner_id = partial_datas.get('partner_id', False)
address_id = partial_datas.get('address_id', False)
delivery_date = partial_datas.get('delivery_date', False)
new_moves = []
if context is None:
context = {}
@@ -2303,7 +2285,6 @@ class stock_move(osv.osv):
picking_obj.action_move(cr, uid, [move.picking_id.id])
wf_service.trg_validate(uid, 'stock.picking', move.picking_id.id, 'button_done', cr)
ref = {}
done_move_ids = []
for move in complete:
done_move_ids.append(move.id)
@@ -2345,7 +2326,6 @@ class stock_inventory(osv.osv):
context = {}
for inv in self.browse(cr, uid, ids):
move_ids = []
move_line = []
for line in inv.inventory_line_id:
pid = line.product_id.id
@@ -2495,7 +2475,6 @@ class stock_picking_move_wizard(osv.osv_memory):
def action_move(self, cr, uid, ids, context=None):
move_obj = self.pool.get('stock.move')
picking_obj = self.pool.get('stock.picking')
account_move_obj = self.pool.get('account.move')
for act in self.read(cr, uid, ids):
move_lines = move_obj.browse(cr, uid, act['move_ids'])
for line in move_lines:
-2
View File
@@ -20,7 +20,6 @@
##############################################################################
from osv import fields, osv
from tools.translate import _
class stock_move_track(osv.osv_memory):
_name = "stock.move.track"
@@ -220,7 +219,6 @@ class split_in_production_lot(osv.osv_memory):
@return:
"""
prodlot_obj = self.pool.get('stock.production.lot')
ir_sequence_obj = self.pool.get('ir.sequence')
move_obj = self.pool.get('stock.move')
new_move = []
for data in self.browse(cr, uid, ids):
+2 -5
View File
@@ -36,7 +36,6 @@ class stock_partial_move(osv.osv_memory):
move_obj = self.pool.get('stock.move')
if not context:
context={}
moveids = []
for m in move_obj.browse(cr, uid, context.get('active_ids', [])):
if m.state in ('done', 'cancel'):
raise osv.except_osv(_('Invalid action !'), _('Cannot delivery products which are already delivered !'))
@@ -63,7 +62,7 @@ class stock_partial_move(osv.osv_memory):
move_ids = move_obj.search(cr, uid, [('id','in',move_ids)])
_moves_arch_lst = """<form string="Deliver Products">
<separator colspan="4" string="Delivery Information"/>
<field name="date" colspan="2"/>
<field name="date" colspan="2"/>
<separator colspan="4" string="Move Detail"/>
"""
_moves_fields = result['fields']
@@ -147,7 +146,6 @@ class stock_partial_move(osv.osv_memory):
move_obj = self.pool.get('stock.move')
if not context:
context={}
moveids = address_delivery = address_default = []
if 'date' in fields:
res.update({'date': time.strftime('%Y-%m-%d %H:%M:%S')})
move_ids = context.get('active_ids', [])
@@ -203,7 +201,6 @@ class stock_partial_move(osv.osv_memory):
@return: A dictionary which of fields with values.
"""
rec_id = context and context.get('active_id', False)
move_obj = self.pool.get('stock.move')
move_ids = context.get('active_ids', False)
partial = self.browse(cr, uid, ids[0], context)
@@ -224,7 +221,7 @@ class stock_partial_move(osv.osv_memory):
'product_price' : getattr(partial, 'move%s_product_price'%(m.id)),
'product_currency': getattr(partial, 'move%s_product_currency'%(m.id)).id
})
res = move_obj.do_partial(cr, uid, move_ids, partial_datas, context=context)
move_obj.do_partial(cr, uid, move_ids, partial_datas, context=context)
return {}
stock_partial_move()
+1 -5
View File
@@ -75,7 +75,7 @@ class stock_return_picking(osv.osv_memory):
self._columns['return%s'%(m.id)] = fields.float(string=m.name, required=True)
if 'invoice_state' not in self._columns:
self._columns['invoice_state'] = fields.selection([('2binvoiced', 'To be Invoiced'), ('none', 'None')], string='Invoice State', required=True)
except Exception, e:
except Exception:
return res
return res
@@ -117,10 +117,6 @@ class stock_return_picking(osv.osv_memory):
raise osv.except_osv(_('Warning!'),_('There is no product to return!'))
arch_lst.append('<field name="invoice_state"/>\n<newline/>')
if pick.invoice_state=='invoiced':
new_invoice_state='2binvoiced'
else:
new_invoice_state=pick.invoice_state
res['fields']['invoice_state']={'string':_('Invoice state'), 'type':'selection','required':True, 'selection':[('2binvoiced', _('To Be Invoiced')), ('none', _('None'))]}
arch_lst.append('<group col="2" colspan="4">')
arch_lst.append('<button icon="gtk-cancel" special="cancel" string="Cancel" />')
+1 -1
View File
@@ -69,7 +69,7 @@ class stock_split_into(osv.osv_memory):
'state': move.state,
'product_uos': move.product_uom.id
}
current_move = move_obj.copy(cr, uid, move.id, default_val)
move_obj.copy(cr, uid, move.id, default_val)
return {}
stock_split_into()
+3 -4
View File
@@ -25,6 +25,7 @@ from tools import config
import base64
import addons
import difflib
class thunderbird_installer(osv.osv_memory):
_name = 'thunderbird.installer'
@@ -32,8 +33,7 @@ class thunderbird_installer(osv.osv_memory):
def default_get(self, cr, uid, fields, context={}):
data = super(thunderbird_installer, self).default_get(cr, uid, fields, context)
pdf_file = open(addons.get_module_resource('thunderbird','doc', 'Installation Guide to OpenERP Thunderbid Plug-in.pdf'),'rb')
data['pdf_file'] = base64.encodestring(pdf_file.read())
data['pdf_file'] = 'http://doc.openerp.com/book/2/2_6_Comms/2_6_Comms_thunderbird.html'
file = open(addons.get_module_resource('thunderbird','plugin', 'openerp_plugin.xpi'),'rb')
data['plugin_file'] = base64.encodestring(file.read())
return data
@@ -43,14 +43,13 @@ class thunderbird_installer(osv.osv_memory):
'pdf_name':fields.char('File name', size=64),
'thunderbird':fields.boolean('Thunderbird Plug-in', help="Allows you to select an object that you’d like to add to your email and its attachments."),
'plugin_file':fields.binary('Thunderbird Plug-in', readonly=True, help="Thunderbird plug-in file. Save as this file and install this plug-in in thunderbird."),
'pdf_file':fields.binary('Installation Manual', help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True),
'pdf_file':fields.char('Installation Manual', size="264", help="The documentation file :- how to install Thunderbird Plug-in.", readonly=True),
'description':fields.text('Description', readonly=True)
}
_defaults = {
'thunderbird' : True,
'name' : 'openerp_plugin.xpi',
'pdf_name' : 'Installation Guide to OpenERP Thunderbid Plug-in.pdf',
'description' : """
* Save the Thunderbird plug-­in.
* Follow these steps to install Thunderbird plug-­in.
+54 -42
View File
@@ -30,7 +30,7 @@ import tools
import binascii
class email_server_tools(osv.osv_memory):
_inherit = "email.server.tools"
def history_message(self, cr, uid, model, res_id, message):
def history_message(self, cr, uid, model, res_id, message, context=None):
#@param message: string of mail which is read from EML File
attachment_pool = self.pool.get('ir.attachment')
msg = self.parse_message(message)
@@ -49,15 +49,15 @@ class email_server_tools(osv.osv_memory):
return self.history(cr, uid, model, res_id, msg, att_ids)
def parse_message(self, message):
#TOCHECK: put this function in mailgateway
#TOCHECK: put this function in mailgateway module
if isinstance(message, unicode):
message = message.encode('utf-8')
msg_txt = email.message_from_string(message)
message_id = msg_txt.get('message-id', False)
msg = {}
msg_txt = email.message_from_string(message)
fields = msg_txt.keys()
msg['id'] = message_id
msg['message-id'] = message_id
if 'Subject' in fields:
msg['subject'] = self._decode_header(msg_txt.get('Subject'))
@@ -152,67 +152,79 @@ class thunderbird_partner(osv.osv_memory):
dictcreate = dict(vals)
ref_ids = str(dictcreate.get('ref_ids')).split(';')
msg = dictcreate.get('message')
msg = self.pool.get('email.server.tools').parse_message(msg)
server_tools_pool = self.pool.get('email.server.tools')
message_id = msg.get('message-id', False)
msg_pool = self.pool.get('mailgate.message')
msg_ids = []
res = {}
res_ids = []
if message_id:
msg_ids = msg_pool.search(cr, uid, [('message_id','=',message_id)])
if msg_ids and len(msg_ids): return 0
for ref_id in ref_ids:
msg_new = dictcreate.get('message')
ref = ref_id.split(',')
model = ref[0]
res_id = int(ref[1])
server_tools_pool.history_message(cr, uid, model, res_id, msg)
return True
if message_id:
msg_ids = msg_pool.search(cr, uid, [('message_id','=',message_id),('res_id','=',res_id),('model','=',model)])
if msg_ids and len(msg_ids):
continue
server_tools_pool.history_message(cr, uid, model, res_id, msg_new)
res_ids.append(res_id)
return len(res_ids)
def process_email(self,cr,uid,vals):
def process_email(self, cr, uid, vals):
dictcreate = dict(vals)
model = str(dictcreate.get('model'))
message = dictcreate.get('message')
return self.pool.get('email.server.tools').process_email(cr, uid, model, message, attach=True, context=None)
def search_contact(self, cr, user, vals):
address_obj = self.pool.get('res.partner.address')
partner = address_obj.search(cr, user,[('email','=',vals)])
def search_contact(self, cr, user, email):
address_pool = self.pool.get('res.partner.address')
address_ids = address_pool.search(cr, user, [('email','=',email)])
res = {}
res1 = {}
if not partner:
res1 = {
'email': '',
}
return res1.items()
if partner:
partner=partner[0]
data = address_obj.read(cr,user, partner)
if not address_ids:
res = {
'partner_name': data['partner_id'] and data['partner_id'][1] or '',
'contactname': data['name'] or '',
'street': data['street'] or '',
'street2': data['street2'] or '',
'zip': data['zip'] or '',
'city': data['city'] or '',
'country': data['country_id'] and data['country_id'][1] or '',
'state': data['state_id'] and data['state_id'][1] or '',
'email': data['email'] or '',
'phone': data['phone'] or '',
'mobile': data['mobile'] or '',
'fax': data['fax'] or '',
'res_id': str(partner),
'email': '',
}
else:
address_id = address_ids[0]
address = address_pool.browse(cr, user, address_id)
res = {
'partner_name': address.partner_id and address.partner_id.name or '',
'contactname': address.name,
'street': address.street or '',
'street2': address.street2 or '',
'zip': address.zip or '',
'city': address.city or '',
'country': address.country_id and address.country_id.name or '',
'state': address.state_id and address.state_id.name or '',
'email': address.email or '',
'phone': address.phone or '',
'mobile': address.mobile or '',
'fax': address.fax or '',
'partner_id': address.partner_id and str(address.partner_id.id) or '',
'res_id': str(address.id),
}
return res.items()
def update_contact(self,cr,user,vals):
def update_contact(self, cr, user, vals):
dictcreate = dict(vals)
res_id = dictcreate.get('res_id',False)
result={}
if not (dictcreate.get('partner_id')):
result = {}
address_pool = self.pool.get('res.partner.address')
if not (dictcreate.get('partner_id')): # TOCHECK: It should be check res_id or not
dictcreate.update({'partner_id': False})
create_id = self.pool.get('res.partner.address').create(cr, user, dictcreate)
create_id = address_pool.create(cr, user, dictcreate)
return create_id
if res_id:
address_obj = self.pool.get('res.partner.address')
address_data = address_obj.read(cr, user, int(res_id), [])
address_data = address_pool.read(cr, user, int(res_id), [])
result = {
'partner_id': address_data['partner_id'] and address_data['partner_id'][0] or False,
'partner_id': address_data['partner_id'] and address_data['partner_id'][0] or False, #TOFIX: parter_id should take from address_data
'country_id': dictcreate['country_id'] and int(dictcreate['country_id'][0]) or False,
'state_id': dictcreate['state_id'] and int(dictcreate['state_id'][0]) or False,
'name': dictcreate['name'],
@@ -225,7 +237,7 @@ class thunderbird_partner(osv.osv_memory):
'mobile': dictcreate['mobile'],
'email': dictcreate['email'],
}
address_obj.write(cr, user,int(res_id),result )
address_pool.write(cr, user, int(res_id), result )
return True
def create_partner(self,cr,user,vals):
Binary file not shown.
@@ -26,7 +26,6 @@
<textbox id="txtselectpartner" align="right" width="270" readonly="true"/>
<spacer width="5"/>
<button label="New Partner" image="&imagecreate.value;" oncommand="CreatePartner.onMenuItemCommand(event);" width="133"/>
<button label="Search Partner" image="&imagesearch.value;" oncommand="Select.onMenuItemCommand(event);getPartnerList();" width="128"/>
</hbox>
<separator class="groove-thin" orient="horizontal" width="94"/>
</groupbox>
@@ -24,7 +24,7 @@
</groupbox>
<hbox align="right">
<button label="Cancel" image="&imagecancel.value;" oncommand="config_close();" />
<button label="Close" image="&imagecancel.value;" oncommand="config_close();" />
<button label="OK" image="&imageok.value;" oncommand="config_ok()"/>
</hbox>
@@ -14,8 +14,9 @@
<separator class="groove-thin" orient="horizontal" width="94"/>
<hbox>
<label align="right" id="partner" value="&selectpartner.value;" width="97" />
<textbox id="txtselectpartner" readonly="true" value="" width="270"/>
<button label="&bsearch.label;" oncommand="Select.onMenuItemCommand(event);" image="&imagesearch.value;"/>
<textbox id="txtselectpartner" readonly="true" value="" width="270"/>
<button label="&bsearch.label;" oncommand="Select.onMenuItemCommand(event);" image="&imagesearch.value;"/>
<button label="Create Partner" image="&imagecreate.value;" oncommand="CreatePartner.onMenuItemCommand(event);"/>
</hbox>
<hbox>
<label align="right" id="name" value="&name.value;" width="80" />
@@ -33,6 +33,7 @@ function selectPartner(){
}
}
//function for the intialization procedure //used while loading and unloading of the window
var myPrefObserver =
{
@@ -10,9 +10,9 @@ var MBstrBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"].
var mboximportbundle = MBstrBundleService.createBundle("chrome://mboximport/locale/mboximport.properties");
//function to get the required details of the selected email
function searchmail()
{
setTimeout("createConnection()",5000)
function check()
{
setTimeout("createConnection()",5000)
if (getconnect_server() == "false")
{
alert("Please Login To The Database First !")
@@ -24,7 +24,20 @@ function searchmail()
alert("Please install the thunderbird module on your '" + getDbName() +"' database and try again !");
return false
}
var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
if(GetNumSelectedMessages() < 1 || GetNumSelectedMessages() > 1){
alert("You must select only one mail to archive");
return false
}
return true
}
function searchmail()
{
if (check() == false){
return true
}
var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var version_obj = prefService.getBranch("extensions.");
version_obj.QueryInterface(Components.interfaces.nsIPrefBranch2);
version = version_obj.getCharPref("lastAppVersion");
@@ -45,11 +58,7 @@ function searchmail()
IETexported = 0;
var msguri = emlsArray[0];
if(GetNumSelectedMessages() < 1 || GetNumSelectedMessages() > 1){
alert("You must select only one mail to archive");
return false
}
//gives the selected email uri
var messageUri= gDBView.URIForFirstSelectedMessage;
@@ -83,10 +92,10 @@ function searchmail()
sendername = message.author;
}
if(message.author.indexOf('<')!=-1){
senderemail = message.author.split('<')[1].split('>')[0];
senderemail = message.author.split('<')[1].split('>')[0];
}
else{
senderemail = message.author
senderemail = message.author
}
//gives the receiver email address
@@ -157,46 +166,106 @@ function searchmail()
}
//function to read the attachment file contents
att =getAttachValue()
if (getmodule_install() == "no")
{
alert("Please install the thunderbird module on your '" + getDbName() +"' database and try again !");
return false
}
window.open("chrome://openerp_plugin/content/plugin.xul", "", "chrome, resizable=yes");
createInstance(name,test)
}
else
{
if (getmodule_install() == "no")
{
alert("Please install the thunderbird module on your '" + getDbName() +"' database and try again !");
return false
}
window.open("chrome://openerp_plugin/content/plugin.xul", "", "chrome, resizable=yes");
}
}
function open_contact()
{
setTimeout("createConnection()",5000)
if (getconnect_server() == "false")
{
alert("Please Login To The Database First !")
return false;
}
setTimeout("module_install()", 10000)
if (getmodule_install() == "no")
{
alert("Please install the thunderbird module on your '" + getDbName() +"' database and try again !");
return false
}
if(GetNumSelectedMessages() < 1 || GetNumSelectedMessages() > 1){
alert("You must select only one mail For Open Contact Detail");
return false
var openPartnerHandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
// var sendername = getSenderEmail();
var arrIdList = result.QueryInterface(Components.interfaces.nsISupportsArray);
var count = arrIdList.Count();
for (i = 0; i < count; i++) {
var strlResult = arrIdList.QueryElementAt(i, Components.interfaces.nsISupportsArray);
var strlSearchResult = strlResult.QueryElementAt(0, Components.interfaces.nsISupportsCString);
var strlSearchResultValue = strlResult.QueryElementAt(1, Components.interfaces.nsISupportsCString);
if(strlSearchResult=="email" && strlSearchResultValue=='')
{
alert("Partner is not Available.");
return;
}
if(strlSearchResult=="partner_id"){
partner_id = strlSearchResultValue;
weburl = getWebServerURL();
var branchobj = getPref();
db_name = branchobj.getCharPref("serverdbname");
if (weburl == false){
weburl = 'http://localhost:8080'
}
if (partner_id > 0){
window.open(weburl + "/model=res.partner&id=" + partner_id)
}
else{
alert("Partner is not Available.");
return;
}
}
}
},
onFault: function (client, ctxt, fault) {
},
onError: function (client, ctxt, status, errorMsg) {
}
}
function searchPartner(email)
{
var branchobj = getPref();
setServerService('xmlrpc/object');
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
arrFinalList = [];
var xmlRpcClient = getXmlRpc();
var strDbName = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strDbName.data = branchobj.getCharPref("serverdbname");
var struid = xmlRpcClient.createType(xmlRpcClient.INT,{});
struid.data = branchobj.getIntPref('userid');
var strpass = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strpass.data = branchobj.getCharPref("password");
var strobj = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strobj.data = 'thunderbird.partner';
var strmethod = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strmethod.data = 'search_contact';
var strname = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strname.data = email;
xmlRpcClient.asyncCall(openPartnerHandler,null,'execute',[ strDbName,struid,strpass,strobj,strmethod,strname ],6);
}
function open_partner()
{
if (check() == false){
return true
}
var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var version_obj = prefService.getBranch("extensions.");
version_obj.QueryInterface(Components.interfaces.nsIPrefBranch2);
version = version_obj.getCharPref("lastAppVersion");
version = parseInt(version[0])
file = getPredefinedFolder(2);
if (version > 2)
{
var emlsArray = gFolderDisplay.selectedMessages;
}
else
{
var emlsArray = GetSelectedMessages();
}
IETtotal = emlsArray.length;
IETexported = 0;
var msguri = emlsArray[0];
//gives the selected email uri
var messageUri= gDBView.URIForFirstSelectedMessage;
@@ -210,39 +279,156 @@ function open_contact()
sendername = message.author.split('"')[1].split('"')[0];
}
else if(message.author.indexOf('<')!=-1){
sendername = message.author.split('<')[0];
sendername = message.author.split('<')[0];
}
else{
sendername = message.author;
sendername = message.author;
}
if(message.author.indexOf('<')!=-1){
senderemail = message.author.split('<')[1].split('>')[0];
senderemail = message.author.split('<')[1].split('>')[0];
}
else{
senderemail = message.author
senderemail = message.author
}
searchPartner(senderemail);
}
var listDocumentHandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var res = result.QueryInterface(Components.interfaces.nsISupportsArray);
res_id = res.QueryElementAt(1, Components.interfaces.nsISupportsPRInt32);
model = res.QueryElementAt(0, Components.interfaces.nsISupportsCString);
weburl = getWebServerURL()
if (weburl == false){
weburl = 'http://localhost:8080'
}
var branchobj = getPref();
db_name = branchobj.getCharPref("serverdbname");
window.open(weburl + "/model=" + model +"&id=" + res_id)
},
onFault: function (client, ctxt, fault) {
//set the initial information for the selected email
setSenderEmail(senderemail);
setSenderName(sendername);
setPartnerName("");
setStreet("");
setStreet2("");
setZipCode("");
setCity("");
setOfficenumber("");
setFax("");
setMobilenumber("");
if (getmodule_install() == "no")
},
onError: function (client, ctxt, status, errorMsg) {
}
}
function open_document()
{
if (check() == false){
return true
}
var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var version_obj = prefService.getBranch("extensions.");
version_obj.QueryInterface(Components.interfaces.nsIPrefBranch2);
version = version_obj.getCharPref("lastAppVersion");
version = parseInt(version[0])
file = getPredefinedFolder(2);
if (version > 2)
{
alert("Please install the thunderbird module on your '" + getDbName() +"' database and try again !");
return false
var emlsArray = gFolderDisplay.selectedMessages;
}
else
{
var emlsArray = GetSelectedMessages();
}
IETtotal = emlsArray.length;
IETexported = 0;
var msguri = emlsArray[0];
var branchobj = getPref();
setServerService('xmlrpc/object');
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var xmlRpcClient = getXmlRpc();
var strDbName = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strDbName.data = branchobj.getCharPref("serverdbname");
var struids = xmlRpcClient.createType(xmlRpcClient.INT,{});
struids.data = branchobj.getIntPref('userid');
var strpass = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strpass.data = branchobj.getCharPref("password");
var strmethod = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strmethod.data = 'search_message';
var strobj = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strobj.data = 'thunderbird.partner';
var eml_string = parse_eml()
var a = ['model', 'message'];
var b = [object, eml_string];
var arrofarr = dictcontact(a,b);
xmlRpcClient.asyncCall(listDocumentHandler,null,'execute',[strDbName,struids,strpass,strobj,strmethod,arrofarr],6);
}
function open_contact()
{
if (check() == false){
return true
}
var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
var version_obj = prefService.getBranch("extensions.");
version_obj.QueryInterface(Components.interfaces.nsIPrefBranch2);
version = version_obj.getCharPref("lastAppVersion");
version = parseInt(version[0])
file = getPredefinedFolder(2);
if (version > 2)
{
var emlsArray = gFolderDisplay.selectedMessages;
}
else
{
var emlsArray = GetSelectedMessages();
}
IETtotal = emlsArray.length;
IETexported = 0;
var msguri = emlsArray[0];
//gives the selected email uri
var messageUri= gDBView.URIForFirstSelectedMessage;
var messenger = Components.classes['@mozilla.org/messenger;1'].createInstance(Components.interfaces.nsIMessenger);
//gives the selected email object
var message = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri);
//functionality to split the author name and email
if(message.author.charAt(0) == '"'){
sendername = message.author.split('"')[1].split('"')[0];
}
else if(message.author.indexOf('<')!=-1){
sendername = message.author.split('<')[0];
}
else{
sendername = message.author;
}
if(message.author.indexOf('<')!=-1){
senderemail = message.author.split('<')[1].split('>')[0];
}
else{
senderemail = message.author
}
//set the initial information for the selected email
setSenderEmail(senderemail);
setSenderName(sendername);
setPartnerName("");
setStreet("");
setStreet2("");
setZipCode("");
setCity("");
setOfficenumber("");
setFax("");
setMobilenumber("");
searchContact();
}
//function to open the configuration window
var Config = {
onLoad: function() {
@@ -279,18 +465,18 @@ var Create = {
}
};
window.addEventListener("load", function(e) { Create.onLoad(e); }, false);
var Address = {
onLoad: function(){
this.initialized=true;
},
onMenuItemCommand: function(){
onMenuItemCommand: function(){
open_contact();
searchContact();
}
};
//function to open the window for selecting the partner for a new contact creation
var Select = {
@@ -298,11 +484,12 @@ var Select = {
this.initialized=true;
},
onMenuItemCommand: function(){
//document.getElementById("txtselectpartner").value="";
onMenuItemCommand: function(){
// document.getElementById("txtselectpartner").value="";
window.open("chrome://openerp_plugin/content/selectpartner.xul", "", "chrome");
}
};
};
var CreatePartner = {
onLoad: function(){
@@ -310,7 +497,7 @@ var CreatePartner = {
},
onMenuItemCommand: function(){
window.open("chrome://openerp_plugin/content/createpartner.xul", "", "chrome");
window.open("chrome://openerp_plugin/content/createpartner.xul", "", "chrome");
}
};
window.addEventListener("load", function(e) { CreatePartner.onLoad(e); }, false);
@@ -14,7 +14,7 @@
image="&menuicon.value;"
class="menuitem-iconic"
tooltiptext="&pluginconfig.value;"/>
</menupopup>
</menupopup>
<menupopup id="taskPopup">
<menuitem id="tiny-plugin1" label="&tinypluginconfig;"
@@ -49,13 +49,20 @@
label= "Open Contact"
oncommand="Address.onMenuItemCommand(event);" />
</toolbarpalette>
<toolbarpalette id="MailToolbarPalette">
<toolbarbutton id="GA-button2"
class="toolbarbutton-1"
image="&partnericon.value;"
label= "Open Partner"
oncommand="open_partner();"
/>
</toolbarpalette>
<toolbarpalette id="MailToolbarPalette">
<toolbarbutton id="GA-button3"
class="toolbarbutton-1"
image="&imagearchive.value;"
label= "Open Document"
oncommand="archivemail();" />
oncommand="open_document();" />
</toolbarpalette>
@@ -1,8 +1,7 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://openerp_plugin/locale/selectpartner.dtd">
<window id="partnerwindowsid" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml" onload="getPartnerList()"
<window id="partnerwindowsid" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml" onload="getPartnerList()"
title="&title.label;" height="500" width="375">
<script type="text/javascript" src="chrome://openerp_plugin/content/tiny_xmlrpc.js"></script>
<script type="text/javascript" src="chrome://openerp_plugin/content/config.js"></script>
@@ -29,7 +28,7 @@
<button label="Create Partner" image="&imagecreate.value;" oncommand="CreatePartner.onMenuItemCommand(event);"/>
<spacer width="45"/>
<button label="&cancel.label;" image="&imagecancel.value;" oncommand="close();" />
<button label="&select.label;" image="&imageok.value;" oncommand="selectPartner();close()"/>
<button label="&select.label;" image="&imageok.value;" oncommand="selectPartner();close();"/>
</hbox>
</window>
@@ -201,6 +201,10 @@ function setDbName(argDbName){
getPref().setCharPref('serverdbname',argDbName);
}
//set webserver url
function setWebServerURL(argWebServerURL){
getPref().setCharPref('webserverurl',argWebServerURL);
}
//set preference value of username for login
function setUsername(argUsername){
getPref().setCharPref('username',argUsername);
@@ -399,6 +403,11 @@ function getDbName(){
return getPref().getCharPref('serverdbname');
}
//get webserver url
function getWebServerURL(){
return getPref().getCharPref('webserverurl');
}
//get username from config settings
function getUsername(){
return getPref().getCharPref('username');
@@ -459,7 +468,8 @@ function getSenderName(){
}
}
//ger partner name
//get partner name
function getPartnerName(){
return getPref().getCharPref('partnername');
}
@@ -909,31 +919,46 @@ function createMenuItem(aLabel) {
}
function listinstallmodule( result ) {
if ( rpc.onfault( result ) )
{
setmodule_install('no')
var listinstallmodulehandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var arrIdList = result.QueryInterface(Components.interfaces.nsISupportsArray);
var count = arrIdList.Count();
if (count > 0)
{
setmodule_install('yes')
}
},
onFault: function (client, ctxt, fault) {
setmodule_install('no')
},
onError: function (client, ctxt, status, errorMsg) {
setmodule_install('no')
}
}
function module_install()
{
setmodule_install("yes")
setmodule_install("no")
var branchobj = getPref();
setServerService('xmlrpc/object');
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var xmlRpcClient = getXmlRpc();
strDbName = branchobj.getCharPref("serverdbname");
struid = branchobj.getIntPref('userid');
strpass = branchobj.getCharPref("password");
strmethod = 'search';
strobj = 'thunderbird.partner'; // TOFIX: Find module 'thunderbird' into 'module.module' model.
var temp = new Array()
server=getServer()
port=getPort()
basicList=getBasicList()
rpc.addserver('object',basicList[3] , basicList[4],'/xmlrpc/object');
srcids=rpc.ask( 'object', 'execute', [basicList[0],basicList[1],basicList[2],strobj,strmethod,[]],listinstallmodule)
var strDbName = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strDbName.data = branchobj.getCharPref("serverdbname");
var struid = xmlRpcClient.createType(xmlRpcClient.INT,{});
struid.data = branchobj.getIntPref('userid');
var strpass = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strpass.data = branchobj.getCharPref("password");
var strmethod = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strmethod.data = 'name_search';
var strobj = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strobj.data = 'ir.model';
var strvalue = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strvalue.data = 'thunderbird.partner';
xmlRpcClient.asyncCall(listinstallmodulehandler,null,'execute',[ strDbName,struid,strpass,strobj,strmethod, strvalue],6);
}
@@ -951,7 +976,7 @@ var listSearchContactHandler = {
setPartnerName(strlSearchResultValue);
var t = getPartnerName();}
if(strlSearchResult=="contactname"){
if(strlSearchResult=="contactname"){
setSenderName(strlSearchResultValue);
var t = getSenderName();}
@@ -1048,6 +1073,7 @@ var listSearchContactdetailHandler = {
document.getElementById("txtmobile").value =strlSearchResultValue;}
if(strlSearchResult=="email"&& strlSearchResultValue!=''){
alert("Contact is Available.")
document.getElementById("txtemail").value =strlSearchResultValue;}
if(strlSearchResult=="res_id"){
@@ -1195,7 +1221,7 @@ var listSearchCheckboxHandler = {
listcell.setAttribute("label",arrFinalList[i][j][1]); //stores the name ofthe record
listItem.appendChild(listcell);
listItem.value = arrFinalList[i][j][0]; //stores the id of the record
listItem.label = arr1[i]; // stores the value of the object
listItem.label = arr1[i]; // stores the value of the object
cmbSearchList.appendChild(listItem);
}
}
@@ -1303,7 +1329,9 @@ var listPartnerHandler = {
listItem.value = arrPartnerList[i][0];
cmdPartnerList.appendChild(listItem);
}
}
},
onFault: function (client, ctxt, fault) {
@@ -1362,7 +1390,24 @@ function dictcontact(a,b){
var listArchiveHandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
list_documents = document.getElementById('listSearchBox')
var createId = result.QueryInterface(Components.interfaces.nsISupportsPRInt32);
createId = parseInt(createId);
if(createId==0)
{
alert("Mail is Already Archived Successfully.");
}
else if (createId<0)
{
alert("sorry Mail is not Archived");
}
else if (createId>=1)
{
alert("Mail Archived Successfully");
}
window.close();
},
onFault: function (client, ctxt, fault) {
@@ -1402,6 +1447,7 @@ function parse_eml(){
var output = sis.read( sis.available() );
return output
}
}
function upload_archivemail()
{
@@ -1438,14 +1484,34 @@ function upload_archivemail()
var a = ['ref_ids','message'];
var b = [ref_ids, eml_string];
var arrofarr = dictcontact(a,b);
xmlRpcClient.asyncCall(listArchiveHandler,null,'execute',[strDbName,struids,strpass,strobj,strmethod,arrofarr],6);
alert("Mail Archived Successfully.");
window.close();
// alert("Mail Archived Successfully to" +" " + ":" + " "+ list_documents.value);
//window.close();
}
var listArchiveDocumentHandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
var createId = result.QueryInterface(Components.interfaces.nsISupportsPRInt32);
var popup = document.getElementById("section").selectedItem;
alert("Document Created Successfully For " +" " + ":" + " "+ popup.label);
window.close();
},
onFault: function (client, ctxt, fault) {
},
onError: function (client, ctxt, status, errorMsg) {
}
}
function create_archivemail(){
var popup = document.getElementById("section").selectedItem; // a <menupopup> element
var popup = document.getElementById("section").selectedItem;
// a <menupopup> element
if (String(popup) != "null"){
object=popup.value;
@@ -1469,10 +1535,10 @@ function create_archivemail(){
var a = ['model', 'message'];
var b = [object, eml_string];
var arrofarr = dictcontact(a,b);
xmlRpcClient.asyncCall(listArchiveHandler,null,'execute',[strDbName,struids,strpass,strobj,strmethod,arrofarr],6);
alert("Document Created Successfully.");
xmlRpcClient.asyncCall(listArchiveDocumentHandler,null,'execute',[strDbName,struids,strpass,strobj,strmethod,arrofarr],6);
//alert("Document Created Successfully For " +" " + ":" + " "+ popup.label);
}
window.close();
//window.close();
}
else
{
@@ -1679,6 +1745,16 @@ function createInstance(name,test){
}
//xmlrpc request handler for handling the login information
function check_module_install(count){
if (getmodule_install() == "no")
{
if (count <= 0){ return false; }
count = count - 1;
return check_module_install(count)
}
return true
}
var listLoginHandler = {
onResult: function(client, context, result) {
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect UniversalBrowserAccess');
@@ -1686,8 +1762,14 @@ var listLoginHandler = {
if(login.type == 12){
login = result.QueryInterface(Components.interfaces.nsISupportsPRInt32)
setUserId(login.data);
alert('Successfully Login To OpenERP.');
window.close();
module_install();
alert('Successfully Login To OpenERP.');
if (check_module_install(5) == false){
alert("Please install the thunderbird module on your '" + getDbName() +"' database and try again !");
}
else{
window.close();
}
}
else{
alert("Login Failed");
@@ -1744,6 +1826,7 @@ function testConnection(){
var strpass = xmlRpcClient.createType(xmlRpcClient.STRING,{});
strpass.data = getPref().getCharPref('password');
xmlRpcClient.asyncCall(listLoginHandler,null,'login',[strDbName,strusername,strpass],3);
}
@@ -1944,7 +2027,7 @@ var listsearchAttachmentHandler = {
count += 1
var hbox = document.createElement("vbox");
var checkbox1 = document.createElement("checkbox");
checkbox1.setAttribute("label",object[i]);
checkbox1.setAttribute("id","cbx"+(i+1));
checkbox1.setAttribute("width",150)
@@ -17,7 +17,7 @@
<!ENTITY ok.label "Save">
<!ENTITY partner.label "Create New Contact :">
<!ENTITY create.label "New Contact">
<!ENTITY cancel.label "Cancel">
<!ENTITY cancel.label "Close">
<!ENTITY newpartner.label "New Partner">
<!ENTITY bsearch.label "Search Contact">
<!ENTITY imagecancel.value "chrome://openerp_plugin/skin/Error.gif">
@@ -1,6 +1,6 @@
<!ENTITY title.label "OpenERP Configuration">
<!ENTITY separate.label "Configuration Login for OpenERP!">
<!ENTITY close.label "Cancel">
<!ENTITY close.label "Close">
<!ENTITY database.label "Database:">
<!ENTITY ok.label "OK">
<!ENTITY connection.label "Connect">
@@ -21,7 +21,7 @@
<!ENTITY imageicon.value "chrome://openerp_plugin/skin/NEWT1.png">
<!ENTITY cbxarchive.label "Archive">
<!ENTITY ok.label "Save">
<!ENTITY cancel.label "Cancel">
<!ENTITY cancel.label "Close">
<!ENTITY imagesearch.value "chrome://openerp_plugin/skin/Search.gif">
<!ENTITY imagecancel.value "chrome://openerp_plugin/skin/Error.gif">
<!ENTITY imageok.value "chrome://openerp_plugin/skin/Success.gif">
@@ -31,7 +31,7 @@
<!ENTITY bsearch.label "Search">
<!ENTITY create.label "Create">
<!ENTITY select.label "Select">
<!ENTITY cancel.label "Cancel">
<!ENTITY cancel.label "Close">
<!ENTITY reload.label "Reload">
<!ENTITY imagecreate.value "chrome://openerp_plugin/skin/Create.png">
<!ENTITY imagereload.value "chrome://openerp_plugin/skin/Archive.png">
@@ -2,6 +2,6 @@
<!ENTITY name.value "Name:">
<!ENTITY imageicon.value "chrome://openerp_plugin/skin/NEWT1.png">
<!ENTITY ok.label "Save">
<!ENTITY cancel.label "Cancel">
<!ENTITY cancel.label "Close">
<!ENTITY imagecancel.value "chrome://openerp_plugin/skin/Error.gif">
<!ENTITY imageok.value "chrome://openerp_plugin/skin/Success.gif">
@@ -3,7 +3,7 @@
<!ENTITY tinyarchive "Archive to OpenERP">
<!ENTITY imageicon.value "chrome://openerp_plugin/skin/NEWT1.png">
<!ENTITY menuicon.value "chrome://openerp_plugin/skin/openerp-icon.png">
<!ENTITY partnericon.value "chrome://openerp_plugin/skin/Partner.png">
<!ENTITY partnericon.value "chrome://openerp_plugin/skin/partner.png">
<!ENTITY imagearchive.value "chrome://openerp_plugin/skin/document-new.png">
<!ENTITY tooltip.value "Add To Archive">
<!ENTITY pluginconfig.value "OpenERP Configuration Settings">
@@ -5,7 +5,7 @@
<!ENTITY create.label "Create">
<!ENTITY imageicon.value "chrome://openerp_plugin/skin/NEWT1.png">
<!ENTITY select.label "Select">
<!ENTITY cancel.label "Cancel">
<!ENTITY cancel.label "Close">
<!ENTITY imagesearch.value "chrome://openerp_plugin/skin/Search.gif">
<!ENTITY imagecancel.value "chrome://openerp_plugin/skin/Error.gif">
<!ENTITY imageok.value "chrome://openerp_plugin/skin/Success.gif">
+2 -3
View File
@@ -39,7 +39,7 @@
<field name="plugin_file" filename="name"/>
<newline/>
<field name="pdf_file" filename="pdf_name"/>
<field name="pdf_file" filename="pdf_name" widget="url"/>
<newline/>
<separator string="Installation and Configuration Steps" colspan="4"/>
<field name="description" nolabel="1" colspan="8"/>
@@ -76,8 +76,7 @@
<field name="context">{'menu':True}</field>
</record>
<menuitem id="base.menu_base_config_mail" name="Mail" parent="base.menu_base_config" sequence="10"/>
<menuitem id="base.menu_base_config_plugins" name="Plugins" parent="base.menu_base_config_mail" sequence="10" />
<menuitem id="base.menu_base_config_plugins" name="Plugins" parent="base.menu_base_config" sequence="10" />
<menuitem id="menu_base_config_plugins_thunderbird" action="action_thunderbird_wizard" name="Thunderbird Plug-In" parent="base.menu_base_config_plugins" sequence="10" />
</data>