[MERGE]: Merge with lp:~openerp-dev/openobject-addons/trunk-dev-addons2
bzr revid: rpa@tinyerp.com-20100610051429-qhr774didyxtvsvn
This commit is contained in:
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-06-03 20:09+0000\n"
|
||||
"PO-Revision-Date: 2010-06-09 15:10+0000\n"
|
||||
"Last-Translator: Ferdinand @ ChriCar <Unknown>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-04 03:45+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
@@ -4904,7 +4904,7 @@ msgstr "Details Finanzkonto"
|
||||
#. module: account
|
||||
#: rml:account.overdue:0
|
||||
msgid "VAT:"
|
||||
msgstr "USt.:"
|
||||
msgstr "UID:"
|
||||
|
||||
#. module: account
|
||||
#: rml:account.analytic.account.cost_ledger:0
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.6\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-05-29 11:45+0000\n"
|
||||
"Last-Translator: digitalsatori <Unknown>\n"
|
||||
"PO-Revision-Date: 2010-06-09 16:41+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-05-30 03:44+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account
|
||||
@@ -712,7 +712,7 @@ msgstr "客户欠款金额合计"
|
||||
#. module: account
|
||||
#: view:account.move.line:0
|
||||
msgid "St."
|
||||
msgstr ""
|
||||
msgstr "结单编码"
|
||||
|
||||
#. module: account
|
||||
#: model:ir.actions.act_window,name:account.action_tax_code_line_open
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-09 03:35+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_analytic_analysis
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-09 03:36+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_anglo_saxon
|
||||
|
||||
@@ -8,13 +8,13 @@ msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-06-09 03:21+0000\n"
|
||||
"PO-Revision-Date: 2010-06-09 03:36+0000\n"
|
||||
"Last-Translator: Panayiotis Konstantinidis <Unknown>\n"
|
||||
"Language-Team: Greek <el@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-09 03:35+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_balance
|
||||
@@ -117,6 +117,25 @@ msgid ""
|
||||
" 5. You have an option to print the desired report in Landscape format.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"Το κομμάτι Ισολογισμών είναι ένα επιπρόσθετο λειτουργικό κομμάτι στο κομμάτι "
|
||||
"της Οικονομικής Διαχείρισης\n"
|
||||
"\n"
|
||||
" Αυτό το κομμάτι σου δίνει διάφορες επιλογές για εκτύπωση ισολογισμών.\n"
|
||||
"\n"
|
||||
" 1. Μπορείς να συγκρίνεις τους ισολογισμούς διαφόρων ετών.\n"
|
||||
"\n"
|
||||
" 2. Μπορείς να ορίσεις την απόλυτη ή επί τοις εκατό σύγκριση μεταξύ δύο "
|
||||
"ετών.\n"
|
||||
"\n"
|
||||
" 3. Μπορείς να ορίσεις το ισολογισμό αναφοράς για την επί τοις εκατό "
|
||||
"σύγκριση συγκεκριμένων ετών.\n"
|
||||
"\n"
|
||||
" 4. Μπορείς να επιλέξεις περιόδους ως πραγματική ημερομηνία ή περιόδους "
|
||||
"ως ημέρα δημιουργίας.\n"
|
||||
"\n"
|
||||
" 5. Έχεις δυνατότητα να εκτυπώσεις την επιθυμητή αναφορά σε μορφή "
|
||||
"Landscape.\n"
|
||||
" "
|
||||
|
||||
#. module: account_balance
|
||||
#: wizard_view:account.balance.account.balance.report,backtoinit:0
|
||||
@@ -149,7 +168,7 @@ msgstr "Σύνολο:"
|
||||
#: rml:account.account.balance.landscape:0
|
||||
#: rml:account.balance.account.balance:0
|
||||
msgid "Account Balance -"
|
||||
msgstr ""
|
||||
msgstr "Ισολογισμός"
|
||||
|
||||
#. module: account_balance
|
||||
#: wizard_field:account.balance.account.balance.report,init,format_perc:0
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-09 03:36+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_coda
|
||||
|
||||
@@ -14,7 +14,7 @@ msgstr ""
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-09 03:35+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_invoice_layout
|
||||
|
||||
@@ -8,13 +8,13 @@ msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-09-08 15:11+0000\n"
|
||||
"Last-Translator: Makis Nicolaou <mark.nicolaou@gmail.com>\n"
|
||||
"PO-Revision-Date: 2010-06-09 06:03+0000\n"
|
||||
"Last-Translator: Panayiotis Konstantinidis <Unknown>\n"
|
||||
"Language-Team: Greek <el@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:11+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: account_payment
|
||||
@@ -40,7 +40,7 @@ msgstr "Επιλέξτε την Κατάσταση Πληρωμής που θα
|
||||
#. module: account_payment
|
||||
#: constraint:ir.actions.act_window:0
|
||||
msgid "Invalid model name in the action definition."
|
||||
msgstr ""
|
||||
msgstr "Λανθασμένο όνομα μοντέλου στον ορισμό ενέργειας"
|
||||
|
||||
#. module: account_payment
|
||||
#: view:payment.line:0
|
||||
|
||||
@@ -8,19 +8,19 @@ msgstr ""
|
||||
"Project-Id-Version: openobject-addons\n"
|
||||
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-03-17 14:08+0000\n"
|
||||
"Last-Translator: 英华 <wantinghard@gmail.com>\n"
|
||||
"PO-Revision-Date: 2010-06-09 16:41+0000\n"
|
||||
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n"
|
||||
"Language-Team: Simplified Chinese <zh_CN@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 04:20+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: base_module_quality
|
||||
#: field:module.quality.check,final_score:0
|
||||
msgid "Final Score (%)"
|
||||
msgstr ""
|
||||
msgstr "最终评分(%)"
|
||||
|
||||
#. module: base_module_quality
|
||||
#: constraint:ir.model:0
|
||||
|
||||
+6
-7
@@ -120,8 +120,8 @@ class crm_case(object):
|
||||
context = {}
|
||||
|
||||
s = self.get_stage_dict(cr, uid, ids, context=context)
|
||||
section = self._name
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
section = (case.section_id.id or False)
|
||||
if section in s:
|
||||
st = case.stage_id.id or False
|
||||
if st in s[section]:
|
||||
@@ -137,13 +137,13 @@ class crm_case(object):
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
sid = self.pool.get('crm.case.stage').search(cr, uid, \
|
||||
stage_obj = self.pool.get('crm.case.stage')
|
||||
sid = stage_obj.search(cr, uid, \
|
||||
[('object_id.model', '=', self._name)], context=context)
|
||||
s = {}
|
||||
previous = {}
|
||||
for stage in self.pool.get('crm.case.stage').browse(cr, uid, sid, context=context):
|
||||
section = stage.section_id.id or False
|
||||
section = self._name
|
||||
for stage in stage_obj.browse(cr, uid, sid, context=context):
|
||||
s.setdefault(section, {})
|
||||
s[section][previous.get(section, False)] = stage.id
|
||||
previous[section] = stage.id
|
||||
@@ -161,9 +161,8 @@ class crm_case(object):
|
||||
context = {}
|
||||
|
||||
s = self.get_stage_dict(cr, uid, ids, context=context)
|
||||
section = self._name
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
section = (case.section_id.id or False)
|
||||
|
||||
if section in s:
|
||||
st = case.stage_id.id or False
|
||||
s[section] = dict([(v, k) for (k, v) in s[section].iteritems()])
|
||||
|
||||
+158
-153
File diff suppressed because it is too large
Load Diff
@@ -21,5 +21,7 @@
|
||||
|
||||
import event
|
||||
import wizard
|
||||
import report
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
Note that:
|
||||
- You can define new types of events in
|
||||
Events / Configuration / Types of Events
|
||||
- You can access predefined reports about number of registration per event or per event category in :
|
||||
- You can access predefined reports about number of registration per event or per event category in:
|
||||
Events / Reporting
|
||||
""",
|
||||
'author': 'Tiny',
|
||||
@@ -43,6 +43,7 @@
|
||||
'update_xml': [
|
||||
'wizard/event_confirm_registration_view.xml',
|
||||
'event_view.xml',
|
||||
'report/report_event_registration_view.xml',
|
||||
'event_sequence.xml',
|
||||
'security/event_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
@@ -51,6 +52,7 @@
|
||||
'wizard/event_make_invoice_view.xml',
|
||||
],
|
||||
'demo_xml': ['event_demo.xml'],
|
||||
'test': ['test/test_event.yml'],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0083059161581',
|
||||
|
||||
+136
-94
@@ -19,30 +19,47 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from crm import crm
|
||||
from osv import fields, osv
|
||||
import time
|
||||
from tools.translate import _
|
||||
import netsvc
|
||||
import pooler
|
||||
import time
|
||||
import tools
|
||||
from tools.translate import _
|
||||
from crm import crm
|
||||
|
||||
|
||||
class event_type(osv.osv):
|
||||
|
||||
""" Event Type """
|
||||
|
||||
_name = 'event.type'
|
||||
_description= 'Event type'
|
||||
_description = __doc__
|
||||
_columns = {
|
||||
'name': fields.char('Event type', size=64, required=True),
|
||||
}
|
||||
|
||||
event_type()
|
||||
|
||||
class event(osv.osv):
|
||||
|
||||
"""Event"""
|
||||
|
||||
_name = 'event.event'
|
||||
_description = 'Event'
|
||||
_inherits = {'crm.case.section': 'section_id'}
|
||||
_description = __doc__
|
||||
_inherit = 'crm.case.section'
|
||||
_order = 'date_begin'
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
|
||||
"""
|
||||
Copy record of Given id
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param id: Id of Event Registration type record.
|
||||
@param context: A standard dictionary for contextual values
|
||||
"""
|
||||
|
||||
return super(event, self).copy(cr, uid, id, default={'code': self.pool.get('ir.sequence').get(cr, uid, 'event.event'), 'state': 'draft'})
|
||||
|
||||
def button_draft(self, cr, uid, ids, context={}):
|
||||
@@ -55,16 +72,32 @@ class event(osv.osv):
|
||||
return self.write(cr, uid, ids, {'state': 'done'})
|
||||
|
||||
def button_confirm(self, cr, uid, ids, context={}):
|
||||
|
||||
for eve in self.browse(cr, uid, ids):
|
||||
if eve.mail_auto_confirm:
|
||||
#send reminder that will confirm the event for all the people that were already confirmed
|
||||
reg_ids = self.pool.get('event.registration').search(cr, uid, [('event_id', '=', eve.id), ('state', 'not in', ['draft', 'cancel'])])
|
||||
reg_ids = self.pool.get('event.registration').search(cr, uid,
|
||||
[('event_id', '=', eve.id),
|
||||
('state', 'not in', ['draft', 'cancel'])])
|
||||
if reg_ids:
|
||||
self.pool.get('event.registration').mail_user_confirm(cr, uid, reg_ids)
|
||||
|
||||
return self.write(cr, uid, ids, {'state': 'confirm'})
|
||||
|
||||
def _get_register(self, cr, uid, ids, name, args, context=None):
|
||||
res={}
|
||||
|
||||
"""
|
||||
Get Confirm or uncofirm register value.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event registration type's id
|
||||
@param name: List of function fields(register_current and register_prospect).
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary of function fields value.
|
||||
"""
|
||||
|
||||
res = {}
|
||||
for event in self.browse(cr, uid, ids, context):
|
||||
res[event.id] = {}
|
||||
state = 'draft'
|
||||
@@ -74,22 +107,35 @@ class event(osv.osv):
|
||||
from event_registration r
|
||||
where state=%s and event_id=%s"""
|
||||
|
||||
cr.execute(query, (state, event.id, ))
|
||||
cr.execute(query, (state, event.id,))
|
||||
res2 = cr.fetchone()
|
||||
|
||||
if res2 and res2[0]:
|
||||
res[event.id][name[0]] = res2[0]
|
||||
else:
|
||||
res[event.id][name[0]] = 0
|
||||
|
||||
return res
|
||||
|
||||
def write(self, cr, uid, ids, vals, *args, **kwargs):
|
||||
"""
|
||||
Writes values in one or several fields.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event registration type's IDs
|
||||
@param vals: dictionary with values to update.
|
||||
@return: True
|
||||
"""
|
||||
|
||||
res = super(event, self).write(cr, uid, ids, vals, *args, **kwargs)
|
||||
if 'date_begin' in vals and vals['date_begin']:
|
||||
for eve in self.browse(cr, uid, ids):
|
||||
#change the deadlines of the registration linked to this event
|
||||
reg_ids = self.pool.get('event.registration').search(cr, uid, [('event_id', '=', eve.id)])
|
||||
reg_ids = self.pool.get('event.registration').search(cr, uid,
|
||||
[('event_id', '=', eve.id)])
|
||||
if reg_ids:
|
||||
self.pool.get('event.registration').write(cr, uid, reg_ids, {'date_deadline': vals['date_begin']})
|
||||
self.pool.get('event.registration').write(cr, uid, reg_ids,
|
||||
{'date_deadline': vals['date_begin']})
|
||||
|
||||
#change the description of the registration linked to this event
|
||||
if 'mail_auto_confirm' in vals:
|
||||
@@ -98,17 +144,18 @@ class event(osv.osv):
|
||||
for eve in self.browse(cr, uid, ids):
|
||||
vals['mail_confirm'] = eve.mail_confirm
|
||||
else:
|
||||
vals['mail_confirm']=False
|
||||
vals['mail_confirm'] = False
|
||||
if 'mail_confirm' in vals:
|
||||
for eve in self.browse(cr, uid, ids):
|
||||
reg_ids = self.pool.get('event.registration').search(cr, uid, [('event_id', '=', eve.id)])
|
||||
reg_ids = self.pool.get('event.registration').search(cr, uid,
|
||||
[('event_id', '=', eve.id)])
|
||||
if reg_ids:
|
||||
self.pool.get('event.registration').write(cr, uid, reg_ids, {'description': vals['mail_confirm']})
|
||||
self.pool.get('event.registration').write(cr, uid, reg_ids,
|
||||
{'description': vals['mail_confirm']})
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'type': fields.many2one('event.type', 'Type'),
|
||||
'section_id': fields.many2one('crm.case.section', 'Case section', required=True),
|
||||
'register_max': fields.integer('Maximum Registrations'),
|
||||
'register_min': fields.integer('Minimum Registrations'),
|
||||
'register_current': fields.function(_get_register, method=True, string='Confirmed Registrations', multi='register_current'),
|
||||
@@ -134,8 +181,20 @@ class event(osv.osv):
|
||||
event()
|
||||
|
||||
class event_registration(osv.osv):
|
||||
|
||||
"""Event Registration"""
|
||||
|
||||
def check_confirm(self, cr, uid, ids, context):
|
||||
|
||||
"""
|
||||
Check confirm event register on given id.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event registration's IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary value which open Confirm registration form.
|
||||
"""
|
||||
|
||||
mod_obj = self.pool.get('ir.model.data')
|
||||
current_registration = self.browse(cr, uid, [ids[0]])[0]
|
||||
total_confirmed = current_registration.event_id.register_current + current_registration.nb_register
|
||||
@@ -161,6 +220,16 @@ class event_registration(osv.osv):
|
||||
}
|
||||
|
||||
def _history(self, cr, uid, ids, keyword, history=False, email=False, context={}):
|
||||
|
||||
"""
|
||||
Create value in mailgateway.message model.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event registration's IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: True
|
||||
"""
|
||||
|
||||
for case in self.browse(cr, uid, ids):
|
||||
data = {
|
||||
'name': keyword,
|
||||
@@ -183,24 +252,43 @@ class event_registration(osv.osv):
|
||||
return True
|
||||
|
||||
def create(self, cr, uid, *args, **argv):
|
||||
""" Overrides orm create method.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param *args: Fields value
|
||||
@return : New created record Id.
|
||||
"""
|
||||
|
||||
event = self.pool.get('event.event').browse(cr, uid, args[0]['event_id'], None)
|
||||
args[0]['section_id']= event.section_id.id
|
||||
|
||||
args[0]['date_deadline']= event.date_begin
|
||||
args[0]['description']= event.mail_confirm
|
||||
res = super(event_registration, self).create(cr, uid, *args, **argv)
|
||||
|
||||
self._history(cr, uid, [res], 'Created', history=True)
|
||||
|
||||
return res
|
||||
|
||||
def write(self, cr, uid, *args, **argv):
|
||||
|
||||
if 'event_id' in args[1]:
|
||||
event = self.pool.get('event.event').browse(cr, uid, args[1]['event_id'], None)
|
||||
args[1]['section_id']= event.section_id.id
|
||||
|
||||
args[1]['date_deadline']= event.date_begin
|
||||
args[1]['description']= event.mail_confirm
|
||||
return super(event_registration, self).write(cr, uid, *args, **argv)
|
||||
|
||||
def mail_user_confirm(self, cr, uid, ids):
|
||||
reg_ids = self.browse(cr,uid,ids)
|
||||
"""
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event Registration's Id.
|
||||
@return : False
|
||||
"""
|
||||
|
||||
reg_ids = self.browse(cr, uid, ids)
|
||||
for reg_id in reg_ids:
|
||||
src = reg_id.event_id.reply_to or False
|
||||
dest = []
|
||||
@@ -215,7 +303,15 @@ class event_registration(osv.osv):
|
||||
return False
|
||||
|
||||
def mail_user(self, cr, uid, ids):
|
||||
"""
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event Registration's Id.
|
||||
@return : False
|
||||
"""
|
||||
reg_ids = self.browse(cr, uid, ids)
|
||||
|
||||
for reg_id in reg_ids:
|
||||
src = reg_id.event_id.reply_to or False
|
||||
dest = []
|
||||
@@ -234,16 +330,26 @@ class event_registration(osv.osv):
|
||||
return False
|
||||
|
||||
def _create_invoice_lines(self, cr, uid, ids, vals):
|
||||
|
||||
""" Create account Invoice line for Registration Id.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param Ids: List of event registration's Id
|
||||
@param vals: Create fields value
|
||||
@return : New created record Id.
|
||||
"""
|
||||
|
||||
return self.pool.get('account.invoice.line').create(cr, uid, vals)
|
||||
|
||||
_name= 'event.registration'
|
||||
_description = 'Event Registration'
|
||||
_description = __doc__
|
||||
_inherit = 'crm.meeting'
|
||||
|
||||
_columns = {
|
||||
'email_cc': fields.text('Watchers Emails', size=252 , help="These \
|
||||
people will receive a copy of the future communication between partner \
|
||||
and users by email"),
|
||||
and users by email"),
|
||||
'nb_register': fields.integer('Number of Registration', readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'event_id': fields.many2one('event.event', 'Event Related', required=True),
|
||||
"partner_invoice_id": fields.many2one('res.partner', 'Partner Invoiced'),
|
||||
@@ -272,6 +378,7 @@ and users by email"),
|
||||
}
|
||||
|
||||
def onchange_badge_name(self, cr, uid, ids, badge_name):
|
||||
|
||||
data ={}
|
||||
if not badge_name:
|
||||
return data
|
||||
@@ -279,9 +386,11 @@ and users by email"),
|
||||
return {'value': data}
|
||||
|
||||
def onchange_contact_id(self, cr, uid, ids, contact, partner):
|
||||
|
||||
data ={}
|
||||
if not contact:
|
||||
return data
|
||||
|
||||
contact_id = self.pool.get('res.partner.contact').browse(cr, uid, contact)
|
||||
data['badge_name'] = contact_id.name
|
||||
data['badge_title'] = contact_id.title
|
||||
@@ -298,20 +407,23 @@ and users by email"),
|
||||
def onchange_event(self, cr, uid, ids, event_id, partner_invoice_id):
|
||||
context={}
|
||||
if not event_id:
|
||||
return {'value': {'unit_price': False , 'invoice_label': False }}
|
||||
return {'value': {'unit_price': False, 'invoice_label': False}}
|
||||
data_event = self.pool.get('event.event').browse(cr, uid, event_id)
|
||||
|
||||
if data_event.product_id:
|
||||
if not partner_invoice_id:
|
||||
unit_price=self.pool.get('product.product').price_get(cr, uid, [data_event.product_id.id], context=context)[data_event.product_id.id]
|
||||
return {'value': {'unit_price': unit_price , 'invoice_label': data_event.product_id.name}}
|
||||
return {'value': {'unit_price': unit_price, 'invoice_label': data_event.product_id.name}}
|
||||
data_partner = self.pool.get('res.partner').browse(cr, uid, partner_invoice_id)
|
||||
context.update({'partner_id': data_partner})
|
||||
unit_price = self.pool.get('product.product')._product_price(cr, uid, [data_event.product_id.id], False, False, {'pricelist': data_partner.property_product_pricelist.id})[data_event.product_id.id]
|
||||
return {'value': {'unit_price': unit_price , 'invoice_label': data_event.product_id.name}}
|
||||
return {'value': {'unit_price': unit_price, 'invoice_label': data_event.product_id.name}}
|
||||
|
||||
return {'value': {'unit_price': False, 'invoice_label': False}}
|
||||
|
||||
|
||||
def onchange_partner_id(self, cr, uid, ids, part, event_id, email=False):
|
||||
|
||||
data={}
|
||||
data['badge_partner'] = data['contact_id'] = data['partner_invoice_id'] = data['email_from'] = data['badge_title'] = data['badge_name'] = False
|
||||
if not part:
|
||||
@@ -334,6 +446,7 @@ and users by email"),
|
||||
return {'value': data}
|
||||
|
||||
def onchange_partner_invoice_id(self, cr, uid, ids, event_id, partner_invoice_id):
|
||||
|
||||
data={}
|
||||
context={}
|
||||
data['unit_price']=False
|
||||
@@ -351,80 +464,9 @@ and users by email"),
|
||||
return {'value': data}
|
||||
return {'value': data}
|
||||
|
||||
def onchange_categ_id(self, cr, uid, ids, categ, context={}):
|
||||
if not categ:
|
||||
return {'value': {}}
|
||||
cat = self.pool.get('crm.case.categ').browse(cr, uid, categ, context).probability
|
||||
return {'value': {'probability': cat}}
|
||||
|
||||
event_registration()
|
||||
|
||||
|
||||
|
||||
class report_event_registration(osv.osv):
|
||||
_name = "report.event.registration"
|
||||
_description = "Events on registrations"
|
||||
_auto = False
|
||||
_columns = {
|
||||
'name': fields.char('Event', size=20),
|
||||
'date_begin': fields.datetime('Beginning date', required=True),
|
||||
'date_end': fields.datetime('Ending date', required=True),
|
||||
'draft_state': fields.integer('Draft Registration', size=20),
|
||||
'confirm_state': fields.integer('Confirm Registration', size=20),
|
||||
'register_max': fields.integer('Maximum Registrations'),
|
||||
}
|
||||
def init(self, cr):
|
||||
cr.execute("""
|
||||
create or replace view report_event_registration as (
|
||||
select
|
||||
e.id as id,
|
||||
c.name as name,
|
||||
e.date_begin as date_begin,
|
||||
e.date_end as date_end,
|
||||
(SELECT sum(c.nb_register) FROM event_registration c WHERE c.section_id=e.section_id and state in ('draft')) as draft_state,
|
||||
(SELECT sum(c.nb_register) FROM event_registration c WHERE c.section_id=e.section_id and state in ('open')) as confirm_state,
|
||||
e.register_max as register_max
|
||||
from
|
||||
event_event e,crm_case_section c
|
||||
where
|
||||
e.section_id=c.id
|
||||
)""")
|
||||
|
||||
report_event_registration()
|
||||
|
||||
class report_event_type_registration(osv.osv):
|
||||
_name = "report.event.type.registration"
|
||||
_description = "Event type on registration"
|
||||
_auto = False
|
||||
_columns = {
|
||||
'name': fields.char('Event Type', size=20),
|
||||
'nbevent': fields.integer('Number Of Events'),
|
||||
'draft_state': fields.integer('Draft Registrations', size=20),
|
||||
'confirm_state': fields.integer('Confirm Registrations', size=20),
|
||||
}
|
||||
|
||||
|
||||
def init(self, cr):
|
||||
cr.execute("""
|
||||
create or replace view report_event_type_registration as (
|
||||
select
|
||||
count(t.id) as id,
|
||||
t.name as name,
|
||||
(select sum(c.nb_register) from event_registration c, event_event e where c.section_id=e.section_id and c.state='draft' and e.type=t.id ) as draft_state ,
|
||||
(select sum(c.nb_register) from event_registration c, event_event e where c.section_id=e.section_id and c.state='open' and e.type=t.id ) as confirm_state,
|
||||
count(t.id) as nbevent
|
||||
from
|
||||
event_event e
|
||||
inner join
|
||||
crm_case_section c1 on (e.section_id=c1.id)
|
||||
inner join
|
||||
event_type t on (e.type=t.id)
|
||||
group by
|
||||
t.name,t.id
|
||||
|
||||
)""")
|
||||
report_event_type_registration()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
+124
-170
@@ -80,17 +80,23 @@
|
||||
<button string="Set To Draft" name="button_draft" states="confirm,cancel,done" type="object" icon="gtk-convert"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Mailing">
|
||||
<page string="Mailing">
|
||||
<field name="reply_to"/>
|
||||
<separator string="Auto Registration Email" colspan="4"/>
|
||||
<field name="mail_auto_registr"/>
|
||||
<newline/>
|
||||
<field name="mail_registr" colspan="4"/>
|
||||
<separator string="Auto Confirmation Email" colspan="4"/>
|
||||
<field name="mail_auto_confirm"/>
|
||||
<newline/>
|
||||
<field name="mail_confirm" colspan="4"/>
|
||||
<newline/>
|
||||
<group col="3" colspan="2">
|
||||
<separator string="Auto Registration Email" colspan="2"/>
|
||||
<newline/>
|
||||
<field name="mail_auto_registr"/>
|
||||
<separator string="Registration Email" colspan="2"/>
|
||||
<field name="mail_registr" colspan="2" nolabel="1"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Auto Confirmation Email" colspan="2"/>
|
||||
<field name="mail_auto_confirm"/>
|
||||
<newline/>
|
||||
<separator string="Confirmation Email" colspan="2"/>
|
||||
<field name="mail_confirm" colspan="2" nolabel="1"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Statistics">
|
||||
<separator string="Registrations" colspan="4"/>
|
||||
@@ -103,6 +109,7 @@
|
||||
</record>
|
||||
|
||||
<!-- event.event tree view -->
|
||||
|
||||
<record model="ir.ui.view" id="view_event_tree">
|
||||
<field name="name">event.event.tree</field>
|
||||
<field name="model">event.event</field>
|
||||
@@ -126,20 +133,34 @@
|
||||
<field name="arch" type="xml">
|
||||
<search string="Events">
|
||||
<group col="10" colspan="4">
|
||||
<separator orientation="vertical"/>
|
||||
<filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Events"/>
|
||||
<filter icon="terp-camera_test" string="Confirmed" domain="[('state','=','confirm')]" help="Confirmed Events"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name" string="Event" select="1"/>
|
||||
<field name="user_id" select="1"/>
|
||||
<field name="user_id" widget="selection">
|
||||
<filter icon="terp-partner"
|
||||
string="My Events"
|
||||
help="My Events"
|
||||
domain="[('user_id','=',uid)]"/>
|
||||
</field>
|
||||
<field name="date_begin" select="1"/>
|
||||
<field name="state" select="1"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By..." colspan="4" col="12">
|
||||
<filter string="Responsible" name="user" icon="terp-partner" context="{'group_by': 'user_id'}"/>
|
||||
<filter string="Event Type" icon="terp-crm" context="{'group_by':'type'}"/>
|
||||
<filter string="state" icon="terp-crm" context="{'group_by':'state'}"/>
|
||||
<separator orientation="vertical"/>
|
||||
<filter string="Creation" icon="terp-project"
|
||||
domain="[]" context="{'group_by':'date_begin'}" />
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Events Organisation/CONFIGURATION/EVENTS -->
|
||||
|
||||
<record model="ir.actions.act_window" id="action_event_view">
|
||||
<field name="name">Events</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
@@ -155,6 +176,7 @@
|
||||
<!-- EVENTS/REGISTRATIONS/EVENTS -->
|
||||
|
||||
<!-- Registration view (form) by _inherits .................. -->
|
||||
|
||||
<record model="ir.ui.view" id="event_registration_tree">
|
||||
<field name="name">event.registration.tree</field>
|
||||
<field name="model">event.registration</field>
|
||||
@@ -189,91 +211,97 @@
|
||||
<field name="unit_price"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="General">
|
||||
<field name="contact_id" on_change="onchange_contact_id(contact_id, partner_id)" /><newline/>
|
||||
<field name="email_from"/>
|
||||
<button name="remind_partner" string="Send Reminder" states="open,pending" type="object" colspan="2" icon="gtk-go-forward"/>
|
||||
<newline/>
|
||||
<separator string="Badge" colspan="4"/>
|
||||
<field name="badge_title"/>
|
||||
<field name="badge_name" on_change="onchange_badge_name(badge_name)"/>
|
||||
<field name="badge_partner"/>
|
||||
<newline/>
|
||||
<separator string="Status" colspan="4"/>
|
||||
<group col="8" colspan="4">
|
||||
<field name="state" select="1" colspan="2"/>
|
||||
<button name="button_reg_close" string="Registration Invoiced" states="open" type="object" icon="gtk-print"/>
|
||||
<button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
|
||||
<button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Extra Info">
|
||||
<field name="name" select="1" colspan="4"/>
|
||||
<field name="id" select="1"/>
|
||||
<field name="active"/>
|
||||
<field name="email_cc" colspan="4"/>
|
||||
<field name="categ_id" on_change="onchange_categ_id(categ_id)"/>
|
||||
<separator colspan="4" string="Dates"/>
|
||||
<field name="create_date"/>
|
||||
<field name="date_closed"/>
|
||||
<separator colspan="4" string="References"/>
|
||||
<field name="ref" colspan="4"/>
|
||||
<field name="ref2" colspan="4"/>
|
||||
</page>
|
||||
<page string="History">
|
||||
<field name="message_ids" colspan="4" nolabel="1" mode="tree,form">
|
||||
<form string="Communication history">
|
||||
<group col="6" colspan="4">
|
||||
<page string="General">
|
||||
<field name="contact_id" on_change="onchange_contact_id(contact_id, partner_id)" /><newline/>
|
||||
<field name="email_from"/>
|
||||
<button name="remind_partner" string="Send Reminder" states="open,pending" type="object" colspan="2" icon="gtk-go-forward"/>
|
||||
<newline/>
|
||||
<separator string="Badge" colspan="4"/>
|
||||
<field name="badge_title"/>
|
||||
<field name="badge_name" on_change="onchange_badge_name(badge_name)"/>
|
||||
<field name="badge_partner"/>
|
||||
<newline/>
|
||||
<separator string="Status" colspan="4"/>
|
||||
<group col="8" colspan="4">
|
||||
<field name="state" select="1" colspan="2"/>
|
||||
<button name="button_reg_close" string="Registration Invoiced" states="open" type="object" icon="gtk-print"/>
|
||||
<button name="check_confirm" string="Confirm Registration" states="draft" type="object" icon="gtk-apply"/>
|
||||
<button name="button_reg_cancel" string="Cancel Registration" states="draft,open" type="object" icon="gtk-cancel"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="Payments">
|
||||
<field name="invoice_label" select="1"/>
|
||||
<field name="tobe_invoiced" select="1"/>
|
||||
<field name="invoice_id"/>
|
||||
</page>
|
||||
<page string="History">
|
||||
<field name="message_ids" colspan="4" nolabel="1" mode="tree,form">
|
||||
<form string="Communication history">
|
||||
<group col="6" colspan="4">
|
||||
<field name="date"/>
|
||||
<field name="email_to"/>
|
||||
<field name="email_from"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Details">
|
||||
<field name="description" colspan="4" nolabel="1"/>
|
||||
</page>
|
||||
<page string="Attachments">
|
||||
<field name="attachment_ids" colspan="4" readonly="1" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<button colspan="4"
|
||||
string="Reply to Last Email"
|
||||
name="%(crm.action_crm_send_mail)d"
|
||||
context="{'mail':'reply', 'model': 'event.registration'}"
|
||||
icon="gtk-undo" type="action" />
|
||||
</form>
|
||||
<tree string="Communication history">
|
||||
<field name="date"/>
|
||||
<field name="email_from" />
|
||||
<field name="email_to"/>
|
||||
<field name="email_from"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Details">
|
||||
<field name="description" colspan="4" nolabel="1"/>
|
||||
</page>
|
||||
<page string="Attachments">
|
||||
<field name="attachment_ids" colspan="4" readonly="1" nolabel="1"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<button colspan="4"
|
||||
string="Reply to Last Email"
|
||||
name="%(crm.action_crm_send_mail)d"
|
||||
context="{'mail':'reply', 'model': 'event.registration'}"
|
||||
icon="gtk-undo" type="action" />
|
||||
</form>
|
||||
<tree string="Communication history">
|
||||
<field name="description"/>
|
||||
</tree>
|
||||
</field>
|
||||
<field name="log_ids" nolabel="1" colspan="4" mode="tree,form" readonly="1">
|
||||
<tree string="Actions">
|
||||
<separator string="Action Information" colspan="4"/>
|
||||
<field name="name"/>
|
||||
<field name="date"/>
|
||||
<field name="email_from" />
|
||||
<field name="email_to"/>
|
||||
<field name="description"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
<form string="Actions">
|
||||
<separator string="Action Information" colspan="4"/>
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</form>
|
||||
</field>
|
||||
<field name="log_ids" nolabel="1" colspan="4" mode="tree,form" readonly="1">
|
||||
<tree string="Actions">
|
||||
<separator string="Action Information" colspan="4"/>
|
||||
<field name="name"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
<form string="Actions">
|
||||
<separator string="Action Information" colspan="4"/>
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</form>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Payments">
|
||||
<field name="invoice_label" select="1"/>
|
||||
<field name="tobe_invoiced" select="1"/>
|
||||
<field name="invoice_id"/>
|
||||
</page>
|
||||
</page>
|
||||
<page string="Extra Info">
|
||||
<group col="6" colspan="4">
|
||||
<field name="name" select="1" colspan="6"/>
|
||||
<newline/>
|
||||
<field name="categ_id"/>
|
||||
<field name="id" select="1"/>
|
||||
<field name="active"/>
|
||||
<separator colspan="6" string="Watchers Emails" />
|
||||
<field name="email_cc" colspan="6" nolabel="1"/>
|
||||
</group>
|
||||
<separator colspan="4" string="Dates"/>
|
||||
<field name="create_date"/>
|
||||
<field name="date_closed"/>
|
||||
<separator colspan="4" string="References"/>
|
||||
<field name="ref" colspan="4"/>
|
||||
<field name="ref2" colspan="4"/>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Search view of event registration form-->
|
||||
|
||||
<record model="ir.ui.view" id="view_registration_search">
|
||||
<field name="name">Registrations</field>
|
||||
<field name="model">event.registration</field>
|
||||
@@ -285,12 +313,18 @@
|
||||
<filter icon="terp-document-new" string="Draft" domain="[('state','=','draft')]" help="Draft Registrations"/>
|
||||
<filter icon="terp-camera_test" string="Confirmed" domain="[('state','in',('open','done'))]" help="Confirmed Registrations"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="event_id" select="1"/>
|
||||
<field name="user_id" select="1"/>
|
||||
<field name="partner_id" select="1"/>
|
||||
<field name="event_id" widget="selection"/>
|
||||
<field name="user_id" widget="selection"/>
|
||||
<field name="state" select="1"/>
|
||||
<field name="invoice_label" select="1"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By...">
|
||||
<filter string="Event" icon="terp-crm" domain="[]" context="{'group_by':'event_id'}"/>
|
||||
<filter string="State" icon="terp-crm" domain="[]" context="{'group_by':'state'}"/>
|
||||
<separator orientation="vertical"/>
|
||||
<filter string="Partner" icon="terp-crm" domain="[]" context="{'group_by':'partner_id'}"/>
|
||||
<filter string="Responsible" name="uid" icon="terp-partner" domain="[]" context="{'group_by':'user_id'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
@@ -308,86 +342,6 @@
|
||||
name="Registrations"
|
||||
id="menu_action_registration" parent="menu_event_main"
|
||||
action="action_registration"/>
|
||||
|
||||
<!-- report , event on registration... start -->
|
||||
<record model="ir.ui.view" id="report_event_registration_tree">
|
||||
<field name="name">report.event.registration.tree</field>
|
||||
<field name="model">report.event.registration</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Event on Registration">
|
||||
<field name="name" select="1"/>
|
||||
<field name="date_begin" select="1"/>
|
||||
<field name="date_end"/>
|
||||
<field name="draft_state"/>
|
||||
<field name="confirm_state"/>
|
||||
<field name="register_max"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model ="ir.ui.view" id="report_event_registration_graph">
|
||||
<field name="name">report.event.registration.graph</field>
|
||||
<field name="model">report.event.registration</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Event on Registration" type="bar">
|
||||
<field name="name"/>
|
||||
<field name="draft_state" operator="+"/>
|
||||
<field name="confirm_state" operator="+"/>
|
||||
<field name="register_max" operator="+"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_event_registration">
|
||||
<field name="name">Events On Registrations</field>
|
||||
<field name="res_model">report.event.registration</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,graph</field>
|
||||
</record>
|
||||
<menuitem name="Reporting" id="menu_report_event" parent="menu_marketing_event_main" sequence="20"/>
|
||||
<!--<menuitem parent="menu_report_event" action="action_event_registration" id="menu_report_event_registration"/>-->
|
||||
<menuitem parent="menu_report_event" action="action_event_registration" id="menu_report_event_registration" />
|
||||
<!-- end... -->
|
||||
|
||||
|
||||
<!-- report , event type on registration... start -->
|
||||
<record model="ir.ui.view" id="report_event_type_registration_tree">
|
||||
<field name="name">report.event.type.registration.tree</field>
|
||||
<field name="model">report.event.type.registration</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Registration By Event Types">
|
||||
<field name="name" select="1"/>
|
||||
<field name="nbevent"/>
|
||||
<field name="draft_state"/>
|
||||
<field name="confirm_state"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="report_event_type_registration_graph">
|
||||
<field name="name">report.event.type.registration.graph</field>
|
||||
<field name="model">report.event.type.registration</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Registration By Event Types" type="bar">
|
||||
<field name="name"/>
|
||||
<field name="draft_state" operator="+"/>
|
||||
<field name="confirm_state" operator="+"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_event_type_registration">
|
||||
<field name="name">Registration By Event Types</field>
|
||||
<field name="res_model">report.event.type.registration</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">graph,tree</field>
|
||||
</record>
|
||||
<menuitem parent="menu_report_event" action="action_event_type_registration" id="menu_report_event_type_registration"/>
|
||||
|
||||
<!-- end... -->
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import report_event_registration
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,83 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
import tools
|
||||
|
||||
class report_event_registration(osv.osv):
|
||||
|
||||
_name = "report.event.registration"
|
||||
_description = "Events on registrations and Events on type"
|
||||
_auto = False
|
||||
_rec_name = 'date'
|
||||
_columns = {
|
||||
'date': fields.date('Date', readonly=True),
|
||||
'year': fields.char('Year', size=4, readonly=True),
|
||||
'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'),
|
||||
('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'),
|
||||
('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True),
|
||||
'day': fields.char('Day', size=128, readonly=True),
|
||||
'event_id': fields.many2one('event.event', 'Event Related', required=True),
|
||||
'draft_state': fields.integer(' # No of draft Registration.', size=20),
|
||||
'confirm_state': fields.integer(' # No of Confirm Registration', size=20),
|
||||
'register_max': fields.integer('Maximum Registrations'),
|
||||
'nbevent': fields.integer('Number Of Events'),
|
||||
'type': fields.many2one('event.type', 'Event Type'),
|
||||
'state': fields.selection([('draft', 'Draft'), ('confirm', 'Confirmed'), ('done', 'Done'), ('cancel', 'Cancelled')], 'State', readonly=True, required=True),
|
||||
'user_id':fields.many2one('res.users', 'Responsible', readonly=True),
|
||||
}
|
||||
_order = 'date desc'
|
||||
def init(self, cr):
|
||||
"""
|
||||
initialize the sql view for the event registration
|
||||
cr -- the cursor
|
||||
"""
|
||||
cr.execute("""
|
||||
create or replace view report_event_registration as (
|
||||
select
|
||||
e.id as id,
|
||||
c.event_id as event_id,
|
||||
e.date_begin as date,
|
||||
e.user_id as user_id,
|
||||
to_char(e.date_begin, 'YYYY') as year,
|
||||
to_char(e.date_begin, 'MM') as month,
|
||||
to_char(e.date_begin, 'YYYY-MM-DD') as day,
|
||||
count(t.id) as nbevent,
|
||||
t.id as type,
|
||||
(SELECT sum(c.nb_register) FROM event_registration c WHERE c.event_id=e.id and t.id=e.type and state in ('draft')) as draft_state,
|
||||
(SELECT sum(c.nb_register) FROM event_registration c WHERE c.event_id=e.id and t.id=e.type and state in ('open')) as confirm_state,
|
||||
e.register_max as register_max,
|
||||
e.state as state
|
||||
from
|
||||
event_event e
|
||||
inner join
|
||||
event_registration c on (e.id=c.event_id)
|
||||
inner join
|
||||
event_type t on (e.type=t.id)
|
||||
group by
|
||||
to_char(e.date_begin, 'YYYY'),
|
||||
to_char(e.date_begin, 'MM'),
|
||||
t.id, e.id, e.date_begin,
|
||||
e.register_max, e.type, e.state, c.event_id, e.user_id,
|
||||
to_char(e.date_begin, 'YYYY-MM-DD')
|
||||
)""")
|
||||
|
||||
report_event_registration()
|
||||
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<!-- report , event on registration... start -->
|
||||
<record model="ir.ui.view" id="report_event_registration_tree">
|
||||
<field name="name">report.event.registration.tree</field>
|
||||
<field name="model">report.event.registration</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Event on Registration">
|
||||
<field name="date" invisible="1"/>
|
||||
<field name="user_id" invisible="1"/>
|
||||
<field name="year" invisible="1"/>
|
||||
<field name="day" invisible="1"/>
|
||||
<field name="month" invisible="1"/>
|
||||
<field name="event_id" invisible="1"/>
|
||||
<field name="state" invisible="1"/>
|
||||
<field name="type" invisible="1"/>
|
||||
<field name="nbevent"/>
|
||||
<field name="draft_state"/>
|
||||
<field name="confirm_state"/>
|
||||
<field name="register_max"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model ="ir.ui.view" id="report_event_registration_graph">
|
||||
<field name="name">report.event.registration.graph</field>
|
||||
<field name="model">report.event.registration</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Event on Registration" type="bar">
|
||||
<field name="type"/>
|
||||
<field name="draft_state" operator="+"/>
|
||||
<field name="confirm_state" operator="+"/>
|
||||
<field name="register_max" operator="+"/>
|
||||
<field group="True" name="event_id" />
|
||||
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- Event on Registration search view -->
|
||||
|
||||
<record model="ir.ui.view" id="view_report_event_registration_search">
|
||||
<field name="name">.search</field>
|
||||
<field name="model">report.event.registration</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Event on Registration">
|
||||
<group col="8" colspan="4">
|
||||
<filter icon="gtk-media-rewind" string=" 365 Days "
|
||||
domain="[('date','<=', time.strftime('%%Y-%%m-%%d')),('date','>',(datetime.date.today()-datetime.timedelta(days=365)).strftime('%%Y-%%m-%%d'))]"
|
||||
help="Tasks performed in last 365 days"/>
|
||||
<filter icon="gtk-media-rewind" string=" 30 Days "
|
||||
name="month"
|
||||
domain="[('date','<=', time.strftime('%%Y-%%m-%%d')), ('date','>',(datetime.date.today()-datetime.timedelta(days=30)).strftime('%%Y-%%m-%%d'))]"
|
||||
help="Tasks performed in last 30 days"/>
|
||||
<filter icon="gtk-media-rewind"
|
||||
string=" 7 Days "
|
||||
separator="1"
|
||||
domain="[('date','<=', time.strftime('%%Y-%%m-%%d')), ('date','>',(datetime.date.today()-datetime.timedelta(days=7)).strftime('%%Y-%%m-%%d'))]"
|
||||
help="Tasks during last 7 days"/>
|
||||
|
||||
<separator orientation="vertical"/>
|
||||
<filter icon="terp-crm"
|
||||
string="Draft"
|
||||
domain="[('state','=','draft')]"/>
|
||||
<filter icon="terp-crm"
|
||||
string="Confirm"
|
||||
domain="[('state', '=', 'confirm')]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="event_id" widget="selection"/>
|
||||
|
||||
<field name="type" widget="selection"/>
|
||||
<field name="user_id" widget="selection">
|
||||
<filter icon="terp-partner"
|
||||
string="My Events"
|
||||
help="My Events"
|
||||
domain="[('user_id','=',uid)]"/>
|
||||
</field>
|
||||
<field name="date" />
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By..." colspan="4" col="12">
|
||||
<filter string="User" name="user" icon="terp-partner" context="{'group_by': 'user_id'}"/>
|
||||
<filter string="Event" name="event" icon="terp-crm" context="{'group_by':'event_id'}"/>
|
||||
<filter string="Event Type" icon="terp-crm" context="{'group_by':'type'}"/>
|
||||
<filter string="state" icon="terp-crm" context="{'group_by':'state'}"/>
|
||||
<separator orientation="vertical" />
|
||||
<filter string="Day" icon="terp-crm"
|
||||
domain="[]" context="{'group_by':'day'}"/>
|
||||
<filter string="Month" icon="terp-crm"
|
||||
domain="[]" context="{'group_by':'month'}"/>
|
||||
<filter string="Year" icon="terp-crm"
|
||||
domain="[]" context="{'group_by':'year'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.actions.act_window" id="action_report_event_registration">
|
||||
<field name="name">Events On Registrations</field>
|
||||
<field name="res_model">report.event.registration</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,graph</field>
|
||||
<field name="search_view_id" ref="view_report_event_registration_search"/>
|
||||
<field name="context">{"search_default_user":1,"search_default_month":1,'group_by_no_leaf':1,'group_by':[]}</field>
|
||||
</record>
|
||||
|
||||
<!--<menuitem parent="menu_report_event" action="action_event_registration" id="menu_report_event_registration"/>-->
|
||||
<menuitem parent="menu_report_event" action="action_report_event_registration" id="menu_report_event_registration" />
|
||||
|
||||
<!-- end... -->
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -4,7 +4,6 @@
|
||||
"access_event_event","event.event","model_event_event","crm.group_crm_user",1,1,1,1
|
||||
"access_event_registration","event.registration","model_event_registration","crm.group_crm_user",1,1,1,1
|
||||
"access_report_event_registration","report.event.registration","model_report_event_registration","crm.group_crm_user",1,0,0,0
|
||||
"access_report_event_type_registration","report.event.type.registration","model_report_event_type_registration","crm.group_crm_user",1,0,0,0
|
||||
"access_event_confirm_registration","event.confirm.registration","model_event_confirm_registration","crm.group_crm_user",1,0,0,0
|
||||
"access_event_confirm_registration_manager","event.confirm.registration manager","model_event_confirm_registration","crm.group_crm_manager",1,1,1,1
|
||||
"access_event_make_invoice","event.make.invoice","model_event_make_invoice","crm.group_crm_user",1,1,1,1
|
||||
|
||||
|
@@ -0,0 +1,239 @@
|
||||
- |
|
||||
In order to test the 'event' module in OpenERP, we create a new event.
|
||||
|
||||
- |
|
||||
Given that I have product "Ticket for Concert".
|
||||
-
|
||||
!record {model: product.product, id: product_product_ticketforconcert0}:
|
||||
categ_id: product.cat1
|
||||
cost_method: standard
|
||||
list_price: 68.0
|
||||
mes_type: fixed
|
||||
name: Ticket for Concert
|
||||
procure_method: make_to_stock
|
||||
standard_price: 15.0
|
||||
supply_method: buy
|
||||
type: product
|
||||
uom_id: product.product_uom_unit
|
||||
uom_po_id: product.product_uom_unit
|
||||
volume: 0.0
|
||||
warranty: 0.0
|
||||
weight: 0.0
|
||||
weight_net: 0.0
|
||||
|
||||
- |
|
||||
Given that I have also Event type "Conference".
|
||||
-
|
||||
!record {model: event.type, id: event_type_conference0}:
|
||||
name: Conference
|
||||
- |
|
||||
I create partner "Mark Johnson" and and I provide an address to this
|
||||
new customer, as well as an email "info@mycustomer.com".
|
||||
-
|
||||
!record {model: res.partner, id: res_partner_markjohnson0}:
|
||||
address:
|
||||
- city: Bruxelles
|
||||
country_id: base.be
|
||||
job_ids:
|
||||
- contact_id: base_contact.res_partner_contact_jacot0
|
||||
function: CTO
|
||||
name: base.res_partner_maxtor
|
||||
sequence_partner: 0.0
|
||||
state: current
|
||||
street: Rue des Palais 51, bte 33
|
||||
type: default
|
||||
zip: '1000'
|
||||
email: 'info@mycustomer.com'
|
||||
credit_limit: 0.0
|
||||
lang: en_US
|
||||
name: Mark Johnson
|
||||
property_account_payable: account.a_pay
|
||||
property_account_receivable: account.a_recv
|
||||
|
||||
- |
|
||||
we create it with a "Conference on ERP Buisness" event and provide "Beginning date", "Ending Date", "Product" as Concert Ticket.
|
||||
-
|
||||
!record {model: event.event, id: event_event_conference0}:
|
||||
code: C/004
|
||||
date_begin: '2010-06-07 13:39:00'
|
||||
date_end: '2010-06-10 13:39:00'
|
||||
name: Conference on ERP Buisness
|
||||
parent_id: event.case_section_event
|
||||
product_id: 'product_product_ticketforconcert0'
|
||||
register_max: 0.0
|
||||
register_min: 0.0
|
||||
state: draft
|
||||
type: 'event_type_conference0'
|
||||
|
||||
- |
|
||||
we set the limit of registrations to this event using "Minimum Registrations" 2 and "Maximum Registrations" 10
|
||||
-
|
||||
!python {model: event.event}: |
|
||||
self.write(cr, uid, [ref('event_event_conference0')], {'register_max': 10, 'register_min': 2})
|
||||
|
||||
- |
|
||||
We Check that the event is in "Draft" state.
|
||||
-
|
||||
!assert {model: event.event, id: event_event_conference0}:
|
||||
- state == 'draft'
|
||||
|
||||
- |
|
||||
Then we confirm it press on "Confirm Event" button.
|
||||
-
|
||||
!python {model: event.event}: |
|
||||
self.button_confirm(cr, uid, [ref("event_event_conference0")], {"active_ids": [ref("event.menu_event_event")]})
|
||||
|
||||
- |
|
||||
Check that Event is "confirmed" or not.
|
||||
-
|
||||
!assert {model: event.event, id: event_event_conference0}:
|
||||
- state == 'confirm'
|
||||
|
||||
- |
|
||||
person "Mark Johnson" want to confirm their registrations. for that
|
||||
I create New Registration for "Conference on ERP Buisness" event.
|
||||
-
|
||||
!record {model: event.registration, id: event_registration_registrationjacot0}:
|
||||
badge_name: Jacot
|
||||
badge_partner: Mark Johnson
|
||||
badge_title: M.
|
||||
contact_id: base_contact.res_partner_contact_jacot0
|
||||
date_deadline: '2010-06-07 13:39:00'
|
||||
event_id: event.event_event_conference0
|
||||
invoice_label: Ticket for Concert
|
||||
name: 'Registration: Jacot'
|
||||
partner_id: 'res_partner_markjohnson0'
|
||||
partner_invoice_id: 'res_partner_markjohnson0'
|
||||
unit_price: 68.0
|
||||
- |
|
||||
I check that "Number of registration" is less than "Maximum registration" defined in "Conference on ERP Buisness" event.
|
||||
if not then confirmation will fail because its greater then the Maximum registration.
|
||||
-
|
||||
!python {model: event.event}: |
|
||||
obj_register = self.pool.get('event.registration')
|
||||
event_id1 = self.browse(cr, uid, [ref('event_event_conference0')])[0]
|
||||
register_ids = obj_register.search(cr, uid, [('event_id', '=', event_id1.id)])
|
||||
register_id = obj_register.browse(cr, uid, register_ids)[0]
|
||||
assert register_id.nb_register <= event_id1.register_max
|
||||
|
||||
- |
|
||||
And Confirm that Registration by click on "Confirm Registration" button of Registraion form.
|
||||
-
|
||||
!python {model: event.registration}: |
|
||||
self.check_confirm(cr, uid, [ref("event_registration_registrationjacot0")], {"active_ids": [ref("event.menu_action_registration")]})
|
||||
|
||||
- |
|
||||
one other Person "Zen" also want to confirm their Registraions. so
|
||||
They create New registraion for This event.
|
||||
-
|
||||
!record {model: event.registration, id: event_registration_registrationzen0}:
|
||||
badge_name: Zen
|
||||
badge_partner: China Export
|
||||
contact_id: base_contact.res_partner_contact_zen0
|
||||
date_deadline: '2010-06-07 13:39:00'
|
||||
event_id: event.event_event_conference0
|
||||
invoice_label: Ticket for Concert
|
||||
name: 'Registration: Zen'
|
||||
partner_id: base.res_partner_3
|
||||
partner_invoice_id: base.res_partner_3
|
||||
unit_price: 68.0
|
||||
|
||||
- |
|
||||
And Confirm that Registration by click on "Confirm Registration" button of Registraion form.
|
||||
-
|
||||
!python {model: event.registration}: |
|
||||
self.check_confirm(cr, uid, [ref("event_registration_registrationzen0")], {"active_ids": [ref("event.menu_action_registration")]})
|
||||
|
||||
- |
|
||||
Third person create New Registration for "Conference on ERP Business" event.
|
||||
-
|
||||
!record {model: event.registration, id: event_registration_registrationpassot0}:
|
||||
badge_name: Passot
|
||||
badge_partner: Mediapole SPRL
|
||||
badge_title: M.
|
||||
contact_id: base_contact.res_partner_contact_passot0
|
||||
date_deadline: '2010-06-07 13:39:00'
|
||||
email_from: info@mediapole.net
|
||||
event_id: 'event_event_conference0'
|
||||
invoice_label: Ticket for Concert
|
||||
name: 'Registration: Passot'
|
||||
partner_id: base.res_partner_8
|
||||
partner_invoice_id: base.res_partner_8
|
||||
unit_price: 68.0
|
||||
- |
|
||||
This person cannot Confirm their registration.so I check that state is "Unconfirmed".
|
||||
-
|
||||
!assert {model: event.registration, id: event_registration_registrationpassot0}:
|
||||
- state == 'draft'
|
||||
|
||||
- |
|
||||
I Check that the total number of confirmed is 2 and unconfirmed registrations 1.
|
||||
-
|
||||
!python {model: event.event}: |
|
||||
obj_event = self.browse(cr, uid, [ref('event_event_conference0')])[0]
|
||||
assert obj_event.register_current == '2'
|
||||
assert obj_event.register_prospect == '1'
|
||||
|
||||
- |
|
||||
We check all registered partners to this event using the wizard "List Register Partners".
|
||||
-
|
||||
!record {model: event.partners.list, id: event_partners_list_0}:
|
||||
{}
|
||||
-
|
||||
I click on "Open Partners" button of "List Register Partners" wizard.
|
||||
-
|
||||
!python {model: event.partners.list}: |
|
||||
self.list_partners(cr, uid, [ref("event_partners_list_0")], {"active_ids":
|
||||
[ref("event.event_event_conference0")]})
|
||||
|
||||
- |
|
||||
We check all registrations on current event using the wizard "Registrations"
|
||||
-
|
||||
!record {model: event.registration.list, id: event_registration_list_0}:
|
||||
{}
|
||||
- |
|
||||
I click on "Open Registrations" button of "Registrations" wizard.
|
||||
-
|
||||
!python {model: event.registration.list}: |
|
||||
self.open_registration(cr, uid, [ref("event_registration_list_0")], {"active_ids": [ref("event.event_event_conference0")]})
|
||||
|
||||
- |
|
||||
This event is finished by click on "Event Done" button of this event form.
|
||||
-
|
||||
!python {model: event.event}: |
|
||||
self.button_done(cr, uid, [ref("event.event_event_conference0")], {"active_ids": [ref("event.menu_event_event")] })
|
||||
- |
|
||||
We can create invoice if the registration is in "Open" state otherwise it gives the warning to the user.
|
||||
so I check that Registration is in "Open" state before click on "Make Invoices."
|
||||
-
|
||||
!assert {model: event.registration, id: event_registration_registrationjacot0}:
|
||||
- state == 'open'
|
||||
- |
|
||||
Now, I will invoice the participant who have address using "Make Invoices". This wizard will also give the number of invoices are created and rejected.
|
||||
Create invoice will be linked to Invoice Field available on Payments tab of registrations
|
||||
-
|
||||
!record {model: event.make.invoice, id: event_make_invoice_0}:
|
||||
inv_created: '0'
|
||||
inv_rej_reason: 'ID 1: Registration already has an invoice linked. \n'
|
||||
inv_rejected: '1'
|
||||
- |
|
||||
I click on "Open" button of this "Make Invoices" wizard.
|
||||
-
|
||||
!python {model: event.make.invoice}: |
|
||||
self.confirm(cr, uid, [ref("event_make_invoice_0")], {"active_ids": [ref("event_registration_registrationjacot0")]})
|
||||
- |
|
||||
I check that Invoice for this partner is create or not.
|
||||
-
|
||||
!python {model: event.registration}: |
|
||||
obj_event_reg = self.pool.get('event.registration')
|
||||
obj_lines = self.pool.get('account.invoice.line')
|
||||
inv_obj = self.pool.get('account.invoice')
|
||||
data_event_reg = obj_event_reg.browse(cr, uid, [ref('event_registration_registrationzen0')], context=context)[0]
|
||||
invoice_ids = inv_obj.search(cr, uid, [('partner_id', '=', data_event_reg.partner_invoice_id.id)])
|
||||
invoice_id = inv_obj.browse(cr, uid, invoice_ids)
|
||||
if invoice_id:
|
||||
line_ids = obj_lines.search(cr, uid, [('product_id', '=', data_event_reg.event_id.product_id), ('invoice_id', '=', invoice_id.id), ('price_unit', '=', data_event_reg.unit_price)])
|
||||
line_id = obj_lines.browse(cr, uid, line_ids)[0]
|
||||
assert line_id.product_id == data_event_reg.product_id
|
||||
assert data_event_reg.partner_id == invoice_id.partner_id
|
||||
assert invoice_id.address_invoice_id == data_event_reg.partner_address_id
|
||||
@@ -2,32 +2,32 @@
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="view_event_confirm_registration" model="ir.ui.view">
|
||||
<record id="view_event_confirm_registration" model="ir.ui.view">
|
||||
<field name="name">Registration Confirmation</field>
|
||||
<field name="model">event.confirm.registration</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Registration Confirmation">
|
||||
<field name="msg"/>
|
||||
<separator string="" colspan="4"/>
|
||||
<field name="msg"/>
|
||||
<separator string="" colspan="4"/>
|
||||
<group colspan="4" col="6">
|
||||
<button icon="gtk-cancel" special="cancel" string="_Cancel"/>
|
||||
<button icon="gtk-ok" name="confirm" string="Confirm Anyway" type="object"/>
|
||||
<button icon="gtk-close" special="cancel" string="Close"/>
|
||||
<button icon="gtk-ok" name="confirm" string="Confirm Anyway" type="object"/>
|
||||
</group>
|
||||
</form>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record id="action_event_confirm_registration" model="ir.actions.act_window">
|
||||
<record id="action_event_confirm_registration" model="ir.actions.act_window">
|
||||
<field name="name">Registrations</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">event.confirm.registration</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="view_event_confirm_registration"/>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
|
||||
@@ -27,13 +27,21 @@ class event_make_invoice(osv.osv_memory):
|
||||
_name = "event.make.invoice"
|
||||
_description = "Event Make Invoice"
|
||||
_columns = {
|
||||
'inv_created': fields.char('Invoice Created', size=32, readonly=True),
|
||||
'inv_rejected': fields.char('Invoice Rejected', size=32, readonly=True),
|
||||
'inv_rej_reason': fields.text('Error Messages', readonly=True),
|
||||
'inv_created': fields.char('Invoice Created', size=32, readonly=True),
|
||||
'inv_rejected': fields.char('Invoice Rejected', size=32, readonly=True),
|
||||
'inv_rej_reason': fields.text('Error Messages', readonly=True),
|
||||
# 'invoice_ids': fields.char('Invoice Ids', size=128), # Improve me
|
||||
}
|
||||
|
||||
def _makeInvoices(self, cr, uid, context={}):
|
||||
"""
|
||||
Get default value for fields
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary of value
|
||||
"""
|
||||
|
||||
invoices = {}
|
||||
invoice_ids = []
|
||||
create_ids=[]
|
||||
@@ -45,7 +53,7 @@ class event_make_invoice(osv.osv_memory):
|
||||
obj_event_reg = self.pool.get('event.registration')
|
||||
obj_lines = self.pool.get('account.invoice.line')
|
||||
inv_obj = self.pool.get('account.invoice')
|
||||
data_event_reg = obj_event_reg.browse(cr,uid, context['active_ids'], context=context)
|
||||
data_event_reg = obj_event_reg.browse(cr, uid, context['active_ids'], context=context)
|
||||
|
||||
for reg in data_event_reg:
|
||||
if reg.state=='draft':
|
||||
@@ -79,27 +87,27 @@ class event_make_invoice(osv.osv_memory):
|
||||
continue
|
||||
|
||||
inv_create = inv_create + 1
|
||||
value = obj_lines.product_id_change(cr, uid, [], reg.event_id.product_id.id,uom =False, partner_id=reg.partner_invoice_id.id, fposition_id=reg.partner_invoice_id.property_account_position.id)
|
||||
data_product = self.pool.get('product.product').browse(cr,uid,[reg.event_id.product_id.id])
|
||||
value = obj_lines.product_id_change(cr, uid, [], reg.event_id.product_id.id, uom =False, partner_id=reg.partner_invoice_id.id, fposition_id=reg.partner_invoice_id.property_account_position.id)
|
||||
data_product = self.pool.get('product.product').browse(cr, uid, [reg.event_id.product_id.id])
|
||||
for tax in data_product[0].taxes_id:
|
||||
tax_ids.append(tax.id)
|
||||
|
||||
vals = value['value']
|
||||
c_name = reg.contact_id and ('-' + self.pool.get('res.partner.contact').name_get(cr, uid, [reg.contact_id.id])[0][1]) or ''
|
||||
vals.update({
|
||||
'name': reg.invoice_label + '-' + c_name,
|
||||
'price_unit': reg.unit_price,
|
||||
'quantity': reg.nb_register,
|
||||
'product_id':reg.event_id.product_id.id,
|
||||
'invoice_line_tax_id': [(6, 0, tax_ids)],
|
||||
'name': reg.invoice_label + '-' + c_name,
|
||||
'price_unit': reg.unit_price,
|
||||
'quantity': reg.nb_register,
|
||||
'product_id':reg.event_id.product_id.id,
|
||||
'invoice_line_tax_id': [(6, 0, tax_ids)],
|
||||
})
|
||||
inv_line_ids = obj_event_reg._create_invoice_lines(cr, uid, [reg.id], vals)
|
||||
|
||||
val_invoice['value'].update({
|
||||
'origin': reg.invoice_label,
|
||||
'reference': False,
|
||||
'invoice_line': [(6,0,[inv_line_ids])],
|
||||
'comment': "",
|
||||
'origin': reg.invoice_label,
|
||||
'reference': False,
|
||||
'invoice_line': [(6, 0, [inv_line_ids])],
|
||||
'comment': "",
|
||||
})
|
||||
|
||||
inv_id = inv_obj.create(cr, uid, val_invoice['value'])
|
||||
@@ -108,7 +116,7 @@ class event_make_invoice(osv.osv_memory):
|
||||
obj_event_reg._history(cr, uid, [reg.id], 'Invoiced', history=True)
|
||||
|
||||
# {'inv_created' : str(inv_create) , 'inv_rejected' : str(inv_reject), 'invoice_ids': str(list_inv), 'inv_rej_reason': inv_rej_reason}
|
||||
return {'inv_created' : str(inv_create) , 'inv_rejected' : str(inv_reject), 'inv_rej_reason': inv_rej_reason}
|
||||
return {'inv_created': str(inv_create), 'inv_rejected': str(inv_reject), 'inv_rej_reason': inv_rej_reason}
|
||||
|
||||
def default_get(self, cr, uid, fields_list, context=None):
|
||||
res = super(event_make_invoice, self).default_get(cr, uid, fields_list, context)
|
||||
@@ -116,18 +124,26 @@ class event_make_invoice(osv.osv_memory):
|
||||
return res
|
||||
|
||||
def confirm(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
Open Account invoice form.
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of event make invoice's Id.
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary of value
|
||||
"""
|
||||
obj_model = self.pool.get('ir.model.data')
|
||||
data_inv = self.read(cr, uid, ids, [], context)[0]
|
||||
model_data_ids = obj_model.search(cr,uid,[('model','=','ir.ui.view'),('name','=','invoice_form')])
|
||||
resource_id = obj_model.read(cr,uid,model_data_ids,fields=['res_id'])[0]['res_id']
|
||||
model_data_ids = obj_model.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'invoice_form')])
|
||||
resource_id = obj_model.read(cr, uid, model_data_ids, fields=['res_id'])[0]['res_id']
|
||||
return {
|
||||
# 'domain': "[('id','in', ["+','.join(map(str,data_inv['invoice_ids']))+"])]",
|
||||
'name': 'Invoices',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'account.invoice',
|
||||
'views': [(False,'tree'),(resource_id,'form')],
|
||||
'context': "{'type':'out_invoice'}",
|
||||
'name': 'Invoices',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'account.invoice',
|
||||
'views': [(False, 'tree'), (resource_id, 'form')],
|
||||
'context': "{'type':'out_invoice'}",
|
||||
'type': 'ir.actions.act_window'
|
||||
}
|
||||
|
||||
|
||||
@@ -23,10 +23,20 @@ from osv import fields, osv
|
||||
|
||||
class event_registration_list(osv.osv_memory):
|
||||
""" List Event Registration """
|
||||
|
||||
_name = "event.registration.list"
|
||||
_description = "List Event Registrations"
|
||||
|
||||
def open_registration(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
Open Event Registration form
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event registration list's IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary value which open Event registration form.
|
||||
"""
|
||||
|
||||
if not context.get('active_id', None):
|
||||
return {
|
||||
'name': 'Event Registrations',
|
||||
@@ -37,7 +47,7 @@ class event_registration_list(osv.osv_memory):
|
||||
}
|
||||
|
||||
return {
|
||||
'domain': [('section_id', '=', context['active_id'])],
|
||||
'domain': [('event_id', '=', context['active_id'])],
|
||||
'name': 'Event Registrations',
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
|
||||
@@ -2,30 +2,33 @@
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="view_event_registration" model="ir.ui.view">
|
||||
<record id="view_event_registration" model="ir.ui.view">
|
||||
<field name="name">List Event Registrations</field>
|
||||
<field name="model">event.registration.list</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="">
|
||||
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
|
||||
<button name="open_registration" string="Open Registrations" type="object" icon="gtk-open"/>
|
||||
</form>
|
||||
<form string="Event Registrations">
|
||||
<group colspan="4" col="2">
|
||||
<separator string="List Event Registrations" colspan="4"/>
|
||||
<button special="cancel" string="Close" icon="gtk-close"/>
|
||||
<button name="open_registration" string="Open Registrations" type="object" icon="gtk-open"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record id="action_event_registration" model="ir.actions.act_window">
|
||||
<record id="action_event_registration" model="ir.actions.act_window">
|
||||
<field name="name">Registrations</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">event.registration.list</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="view_event_registration"/>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record model="ir.values" id="event_registration_values">
|
||||
<record model="ir.values" id="event_registration_values">
|
||||
<field name="model_id" ref="event.model_event_event" />
|
||||
<field name="object" eval="1" />
|
||||
<field name="name">Event Registrations</field>
|
||||
@@ -36,4 +39,4 @@
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
|
||||
@@ -23,10 +23,19 @@ from tools.translate import _
|
||||
|
||||
class event_partners_list(osv.osv_memory):
|
||||
""" Event Partners """
|
||||
|
||||
_name = "event.partners.list"
|
||||
_description = "List Event Partners"
|
||||
|
||||
def list_partners(self, cr, uid, ids, context={}):
|
||||
"""
|
||||
Open Event Partner
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of Event partners list's IDs
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return: Dictionary value which open Partner form.
|
||||
"""
|
||||
obj_reg = self.pool.get('event.registration')
|
||||
mod_obj = self.pool.get('ir.model.data')
|
||||
list_partner = []
|
||||
|
||||
@@ -2,30 +2,33 @@
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="view_event_partners" model="ir.ui.view">
|
||||
<record id="view_event_partners" model="ir.ui.view">
|
||||
<field name="name">Event Partners</field>
|
||||
<field name="model">event.partners.list</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Event Partners">
|
||||
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
|
||||
<button name="list_partners" string="Open Partners" type="object" icon="gtk-open"/>
|
||||
</form>
|
||||
<form string="Event Partners">
|
||||
<group colspan="4" col="2">
|
||||
<separator string="List Registrer Partners" colspan="4"/>
|
||||
<button special="cancel" string="Close" icon="gtk-close"/>
|
||||
<button name="list_partners" string="Open Partners" type="object" icon="gtk-open"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record id="action_event_partners" model="ir.actions.act_window">
|
||||
<record id="action_event_partners" model="ir.actions.act_window">
|
||||
<field name="name">List Register Partners</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">event.partners.list</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="view_id" ref="view_event_partners"/>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="context">{'record_id' : active_id}</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
</record>
|
||||
|
||||
<record model="ir.values" id="event_partner_values">
|
||||
<record model="ir.values" id="event_partner_values">
|
||||
<field name="model_id" ref="event.model_event_event" />
|
||||
<field name="object" eval="1" />
|
||||
<field name="name">Event Partners</field>
|
||||
@@ -36,4 +39,4 @@
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
</openerp>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<form string="mailgate message">
|
||||
<group colspan="4" col="6">
|
||||
<field name="name" required="1" select="1"/>
|
||||
<field name="name" string="Subject" required="1" select="1"/>
|
||||
<field name="date" required="1" select="1"/>
|
||||
<field name="user_id" string="Responsible" select="1"/>
|
||||
<field name="partner_id" readonly="1" />
|
||||
@@ -48,7 +48,7 @@
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Mailgateway Message">
|
||||
<field name="date" />
|
||||
<field name="name" />
|
||||
<field name="name" string="Subject"/>
|
||||
<field name="email_from" string="From"/>
|
||||
<field name="user_id" string="Responsible"/>
|
||||
</tree>
|
||||
@@ -61,7 +61,7 @@
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Mailgateway Message Search">
|
||||
<field name="name" />
|
||||
<field name="name" string="Subject"/>
|
||||
<field name="date" />
|
||||
<field name="user_id" />
|
||||
<field name="message_id" />
|
||||
|
||||
@@ -21,5 +21,6 @@
|
||||
|
||||
import membership
|
||||
import wizard
|
||||
import report
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -43,10 +43,12 @@ invoice and send propositions for membership renewal.
|
||||
'security/ir.model.access.csv',
|
||||
'wizard/membership_invoice_view.xml',
|
||||
'membership_view.xml',
|
||||
'report/report_membership_view.xml',
|
||||
'wizard/membership_unpaid_invoice_view.xml',
|
||||
'process/membership_process.xml'
|
||||
],
|
||||
'demo_xml': ['membership_demo.xml'],
|
||||
'test': ['test/test_membership.yml'],
|
||||
'installable': True,
|
||||
'active': False,
|
||||
'certificate': '0042907796381',
|
||||
|
||||
+48
-208
@@ -221,6 +221,7 @@ class Partner(osv.osv):
|
||||
_inherit = 'res.partner'
|
||||
|
||||
def _get_partner_id(self, cr, uid, ids, context=None):
|
||||
|
||||
data_inv = self.pool.get('membership.membership_line').browse(cr, uid, ids, context)
|
||||
list_partner = []
|
||||
for data in data_inv:
|
||||
@@ -298,55 +299,47 @@ class Partner(osv.osv):
|
||||
res_state = self._membership_state(cr, uid, [partner_data.associate_member.id], name, args, context)
|
||||
res[id] = res_state[partner_data.associate_member.id]
|
||||
return res
|
||||
|
||||
def _membership_start(self, cr, uid, ids, name, args, context=None):
|
||||
'''Return the start date of membership'''
|
||||
|
||||
def _membership_date(self, cr, uid, ids, name, args, context=None):
|
||||
|
||||
'''Return date of membership'''
|
||||
|
||||
name = name[0]
|
||||
res = {}
|
||||
member_line_obj = self.pool.get('membership.membership_line')
|
||||
|
||||
for partner in self.browse(cr, uid, ids):
|
||||
|
||||
if partner.associate_member:
|
||||
partner_id = partner.associate_member.id
|
||||
partner_id = partner.associate_member.id
|
||||
else:
|
||||
partner_id = partner.id
|
||||
line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
|
||||
limit=1, order='date_from')
|
||||
if line_id:
|
||||
res[partner.id] = member_line_obj.read(cr, uid, line_id[0],
|
||||
['date_from'])['date_from']
|
||||
else:
|
||||
res[partner.id] = False
|
||||
return res
|
||||
|
||||
def _membership_stop(self, cr, uid, ids, name, args, context=None):
|
||||
'''Return the stop date of membership'''
|
||||
res = {}
|
||||
member_line_obj = self.pool.get('membership.membership_line')
|
||||
for partner in self.browse(cr, uid, ids):
|
||||
cr.execute('select membership_state from res_partner where id=%s', (partner.id,))
|
||||
data_state = cr.fetchall()
|
||||
if partner.associate_member:
|
||||
partner_id = partner.associate_member.id
|
||||
else:
|
||||
partner_id = partner.id
|
||||
line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
|
||||
limit=1, order='date_to desc')
|
||||
if line_id:
|
||||
res[partner.id] = member_line_obj.read(cr, uid, line_id[0],
|
||||
['date_to'])['date_to']
|
||||
else:
|
||||
res[partner.id] = False
|
||||
return res
|
||||
|
||||
def _membership_cancel(self, cr, uid, ids, name, args, context=None):
|
||||
'''Return the cancel date of membership'''
|
||||
res = {}
|
||||
member_line_obj = self.pool.get('membership.membership_line')
|
||||
for partner in self.browse(cr, uid, ids, context=context):
|
||||
res[partner.id] = False
|
||||
if partner.membership_state == 'canceled':
|
||||
line_id = member_line_obj.search(cr, uid, [('partner', '=', partner.id)],limit=1, order='date_cancel')
|
||||
partner_id = partner.id
|
||||
|
||||
res[partner.id]={
|
||||
'membership_start': False,
|
||||
'membership_stop': False,
|
||||
'membership_cancel': False
|
||||
}
|
||||
|
||||
if name == 'membership_start':
|
||||
line_id = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
|
||||
limit=1, order='date_from')
|
||||
if line_id:
|
||||
res[partner.id] = member_line_obj.read(cr, uid, line_id[0],['date_cancel'])['date_cancel']
|
||||
res[partner.id]['membership_start'] = member_line_obj.read(cr, uid, line_id[0],
|
||||
['date_from'])['date_from']
|
||||
|
||||
if name == 'membership_stop':
|
||||
line_id1 = member_line_obj.search(cr, uid, [('partner', '=', partner_id)],
|
||||
limit=1, order='date_to desc')
|
||||
if line_id1:
|
||||
res[partner.id]['membership_stop'] = member_line_obj.read(cr, uid, line_id1[0],
|
||||
['date_to'])['date_to']
|
||||
if name == 'membership_cancel':
|
||||
if partner.membership_state == 'canceled':
|
||||
line_id2 = member_line_obj.search(cr, uid, [('partner', '=', partner.id)],limit=1, order='date_cancel')
|
||||
if line_id2:
|
||||
res[partner.id]['membership_cancel'] = member_line_obj.read(cr, uid, line_id2[0],['date_cancel'])['date_cancel']
|
||||
|
||||
return res
|
||||
|
||||
def _get_partners(self, cr, uid, ids, context={}):
|
||||
@@ -358,10 +351,11 @@ class Partner(osv.osv):
|
||||
|
||||
def __get_membership_state(self, *args, **kwargs):
|
||||
return self._membership_state(*args, **kwargs)
|
||||
|
||||
|
||||
_columns = {
|
||||
'associate_member': fields.many2one('res.partner', 'Associate member'),
|
||||
'member_lines': fields.one2many('membership.membership_line', 'partner', 'Membership'),
|
||||
'member': fields.boolean('Member'),
|
||||
'free_member': fields.boolean('Free member'),
|
||||
'membership_amount': fields.float(
|
||||
'Membership amount', digits=(16, 2),
|
||||
@@ -376,17 +370,17 @@ class Partner(osv.osv):
|
||||
}
|
||||
),
|
||||
'membership_start': fields.function(
|
||||
_membership_start, method=True,
|
||||
_membership_date, method=True, multi='membeship_start',
|
||||
string = 'Start membership date', type = 'date',
|
||||
store = {
|
||||
'account.invoice':(_get_invoice_partner,['state'], 10),
|
||||
'membership.membership_line':(_get_partner_id,['state'], 10),
|
||||
'membership.membership_line':(_get_partner_id,['state'], 10, ),
|
||||
'res.partner':(lambda self,cr,uid,ids,c={}:ids, ['free_member'], 10)
|
||||
}
|
||||
),
|
||||
'membership_stop': fields.function(
|
||||
_membership_stop, method = True,
|
||||
string = 'Stop membership date', type = 'date',
|
||||
_membership_date, method = True,
|
||||
string = 'Stop membership date', type = 'date', multi='membership_stop',
|
||||
store = {
|
||||
'account.invoice':(_get_invoice_partner,['state'], 10),
|
||||
'membership.membership_line':(_get_partner_id,['state'], 10),
|
||||
@@ -395,8 +389,8 @@ class Partner(osv.osv):
|
||||
),
|
||||
|
||||
'membership_cancel': fields.function(
|
||||
_membership_cancel, method = True,
|
||||
string = 'Cancel membership date', type='date',
|
||||
_membership_date, method = True,
|
||||
string = 'Cancel membership date', type='date', multi='membership_cancel',
|
||||
store = {
|
||||
'account.invoice':(_get_invoice_partner,['state'], 11),
|
||||
'membership.membership_line':(_get_partner_id,['state'], 10),
|
||||
@@ -422,16 +416,16 @@ class Partner(osv.osv):
|
||||
_constraints = [
|
||||
(_check_recursion, 'Error ! You can not create recursive associated members.', ['associate_member'])
|
||||
]
|
||||
|
||||
|
||||
def copy(self, cr, uid, id, default=None, context=None):
|
||||
if default is None:
|
||||
default = {}
|
||||
if context is None:
|
||||
context = {}
|
||||
context = {}
|
||||
default = default.copy()
|
||||
default['member_lines'] = []
|
||||
return super(Partner, self).copy(cr, uid, id, default, context)
|
||||
|
||||
|
||||
Partner()
|
||||
|
||||
class product_template(osv.osv):
|
||||
@@ -490,163 +484,9 @@ class Invoice(osv.osv):
|
||||
return super(Invoice, self).action_cancel(cr, uid, ids, context)
|
||||
Invoice()
|
||||
|
||||
|
||||
class ReportPartnerMemberYear(osv.osv):
|
||||
'''Membership by Years'''
|
||||
|
||||
_name = 'report.partner_member.year'
|
||||
_description = __doc__
|
||||
_auto = False
|
||||
_rec_name = 'year'
|
||||
_columns = {
|
||||
'year': fields.char('Year', size='4', readonly=True, select=1),
|
||||
'canceled_number': fields.integer('Canceled', readonly=True),
|
||||
'waiting_number': fields.integer('Waiting', readonly=True),
|
||||
'invoiced_number': fields.integer('Invoiced', readonly=True),
|
||||
'paid_number': fields.integer('Paid', readonly=True),
|
||||
'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
|
||||
'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
|
||||
'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
|
||||
'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
|
||||
'currency': fields.many2one('res.currency', 'Currency', readonly=True,
|
||||
select=2),
|
||||
}
|
||||
|
||||
def init(self, cr):
|
||||
'''Create the view'''
|
||||
cr.execute("""
|
||||
CREATE OR REPLACE VIEW report_partner_member_year AS (
|
||||
SELECT
|
||||
MIN(id) AS id,
|
||||
COUNT(ncanceled) as canceled_number,
|
||||
COUNT(npaid) as paid_number,
|
||||
COUNT(ninvoiced) as invoiced_number,
|
||||
COUNT(nwaiting) as waiting_number,
|
||||
SUM(acanceled) as canceled_amount,
|
||||
SUM(apaid) as paid_amount,
|
||||
SUM(ainvoiced) as invoiced_amount,
|
||||
SUM(awaiting) as waiting_amount,
|
||||
year,
|
||||
currency
|
||||
FROM (SELECT
|
||||
CASE WHEN ai.state = 'cancel' THEN ml.id END AS ncanceled,
|
||||
CASE WHEN ai.state = 'paid' THEN ml.id END AS npaid,
|
||||
CASE WHEN ai.state = 'open' THEN ml.id END AS ninvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN ml.id END AS nwaiting,
|
||||
CASE WHEN ai.state = 'cancel'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS acanceled,
|
||||
CASE WHEN ai.state = 'paid'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS apaid,
|
||||
CASE WHEN ai.state = 'open'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS ainvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS awaiting,
|
||||
TO_CHAR(ml.date_from, 'YYYY') AS year,
|
||||
ai.currency_id AS currency,
|
||||
MIN(ml.id) AS id
|
||||
FROM membership_membership_line ml
|
||||
JOIN (account_invoice_line ail
|
||||
LEFT JOIN account_invoice ai
|
||||
ON (ail.invoice_id = ai.id))
|
||||
ON (ml.account_invoice_line = ail.id)
|
||||
JOIN res_partner p
|
||||
ON (ml.partner = p.id)
|
||||
GROUP BY TO_CHAR(ml.date_from, 'YYYY'), ai.state,
|
||||
ai.currency_id, ml.id) AS foo
|
||||
GROUP BY year, currency)
|
||||
""")
|
||||
|
||||
ReportPartnerMemberYear()
|
||||
|
||||
|
||||
class ReportPartnerMemberYearNew(osv.osv):
|
||||
'''New Membership by Years'''
|
||||
|
||||
_name = 'report.partner_member.year_new'
|
||||
_description = __doc__
|
||||
_auto = False
|
||||
_rec_name = 'year'
|
||||
_columns = {
|
||||
'year': fields.char('Year', size='4', readonly=True, select=1),
|
||||
'canceled_number': fields.integer('Canceled', readonly=True),
|
||||
'waiting_number': fields.integer('Waiting', readonly=True),
|
||||
'invoiced_number': fields.integer('Invoiced', readonly=True),
|
||||
'paid_number': fields.integer('Paid', readonly=True),
|
||||
'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
|
||||
'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
|
||||
'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
|
||||
'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
|
||||
'currency': fields.many2one('res.currency', 'Currency', readonly=True,
|
||||
select=2),
|
||||
}
|
||||
|
||||
def init(self, cursor):
|
||||
'''Create the view'''
|
||||
cursor.execute("""
|
||||
CREATE OR REPLACE VIEW report_partner_member_year_new AS (
|
||||
SELECT
|
||||
MIN(id) AS id,
|
||||
COUNT(ncanceled) AS canceled_number,
|
||||
COUNT(npaid) AS paid_number,
|
||||
COUNT(ninvoiced) AS invoiced_number,
|
||||
COUNT(nwaiting) AS waiting_number,
|
||||
SUM(acanceled) AS canceled_amount,
|
||||
SUM(apaid) AS paid_amount,
|
||||
SUM(ainvoiced) AS invoiced_amount,
|
||||
SUM(awaiting) AS waiting_amount,
|
||||
year,
|
||||
currency
|
||||
FROM (SELECT
|
||||
CASE WHEN ai.state = 'cancel' THEN ml2.id END AS ncanceled,
|
||||
CASE WHEN ai.state = 'paid' THEN ml2.id END AS npaid,
|
||||
CASE WHEN ai.state = 'open' THEN ml2.id END AS ninvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN ml2.id END AS nwaiting,
|
||||
CASE WHEN ai.state = 'cancel'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS acanceled,
|
||||
CASE WHEN ai.state = 'paid'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS apaid,
|
||||
CASE WHEN ai.state = 'open'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS ainvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS awaiting,
|
||||
TO_CHAR(ml2.date_from, 'YYYY') AS year,
|
||||
ai.currency_id AS currency,
|
||||
MIN(ml2.id) AS id
|
||||
FROM (SELECT
|
||||
partner AS id,
|
||||
MIN(date_from) AS date_from
|
||||
FROM membership_membership_line
|
||||
GROUP BY partner
|
||||
) AS ml1
|
||||
JOIN membership_membership_line ml2
|
||||
JOIN (account_invoice_line ail
|
||||
LEFT JOIN account_invoice ai
|
||||
ON (ail.invoice_id = ai.id))
|
||||
ON (ml2.account_invoice_line = ail.id)
|
||||
ON (ml1.id = ml2.partner AND ml1.date_from = ml2.date_from)
|
||||
JOIN res_partner p
|
||||
ON (ml2.partner = p.id)
|
||||
GROUP BY TO_CHAR(ml2.date_from, 'YYYY'), ai.state,
|
||||
ai.currency_id, ml2.id) AS foo
|
||||
GROUP BY year, currency
|
||||
)
|
||||
""")
|
||||
|
||||
ReportPartnerMemberYearNew()
|
||||
|
||||
class account_invoice_line(osv.osv):
|
||||
_inherit='account.invoice.line'
|
||||
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
if not context:
|
||||
context={}
|
||||
|
||||
@@ -39,7 +39,8 @@
|
||||
<field name="membership" colspan="1"/>
|
||||
<field name="active" colspan="1"/>
|
||||
<newline/>
|
||||
<field name="taxes_id" colspan="4"/>
|
||||
<separator colspan="4" string="Customer Taxes:"/>
|
||||
<field name="taxes_id" colspan="4" nolabel="1"/>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
@@ -103,27 +104,53 @@
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Members">
|
||||
<field name="name"/>
|
||||
<field name="associate_member" attrs="{'invisible':[('membership_state', '!=', 'none')]}"/>
|
||||
<field name="membership_start"/>
|
||||
<field name="membership_stop"/>
|
||||
<field name="membership_state"/>
|
||||
<field name="associate_member" attrs="{'invisible':[('membership_state', '!=', 'none')]}"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_res_partner_member_filter" model="ir.ui.view">
|
||||
<field name="name">res.partner.select</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<field name="category_id" position="after">
|
||||
<group col="4" colspan="6">
|
||||
<filter string="Members" icon="terp-personal" domain="[]" context="{'group_by':'membership_state'}"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="membership_state"/>
|
||||
</group>
|
||||
<filter icon="terp-partner" domain="[('membership_state', '=', 'paid')]" string="Paid Members" />
|
||||
<filter icon="terp-partner" domain="[('membership_state', '=', 'invoiced')]" string="Invoiced Members" />
|
||||
<filter icon="terp-partner" domain="[('membership_state', '=', 'waiting')]" string="Future Members" />
|
||||
<separator orientation="vertical"/>
|
||||
<field name="membership_state">
|
||||
<field name="membership_start"/>
|
||||
</field>
|
||||
<newline/>
|
||||
<group expand="1" string="Group By..." position="after">
|
||||
<filter string="Associate Members" icon="terp-personal" domain="[]" context="{'group_by': 'associate_member'}"/>
|
||||
</group>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record id="view_res_partner_member_filter2" model="ir.ui.view">
|
||||
<field name="name">res.partner.select2</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="inherit_id" ref="view_res_partner_member_filter"/>
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<field name="membership_state" position="after">
|
||||
<group expand="1" string="Group By" colspan="10" col="8">
|
||||
<separator orientation="vertical"/>
|
||||
<filter string="Start Date" icon="terp-go-month" domain="[]" context="{'group_by':'membership_start'}"/>
|
||||
<filter string="End Date" icon="terp-go-month" domain="[]" context="{'group_by':'membership_stop'}"/>
|
||||
<filter string="Associate Member" icon="terp-personal" domain="[]" context="{'group_by':'associate_member'}"/>
|
||||
<filter string="State" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'membership_state'}"/>
|
||||
</group>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_membership_members">
|
||||
<field name="name">Members</field>
|
||||
@@ -157,6 +184,17 @@
|
||||
/>
|
||||
-->
|
||||
|
||||
<record id="view_res_partner_member_form2" model="ir.ui.view">
|
||||
<field name="name">res.partner.form2</field>
|
||||
<field name="model">res.partner</field>
|
||||
<field name="type">form</field>
|
||||
<field name="inherit_id" ref="base.view_partner_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="supplier" position="after">
|
||||
<field name="member"/>
|
||||
</field>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_partner_tree">
|
||||
<field name="name">res.partner.tree.form.inherit</field>
|
||||
@@ -199,7 +237,6 @@
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -208,211 +245,6 @@
|
||||
sequence="2"
|
||||
id="menu_reporting"/>
|
||||
|
||||
<!-- REPORTING/MEMBERSHIP BY YEAR -->
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_tree1">
|
||||
<field name="name">report.partner_member.year.tree</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Membership by Years">
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_tree2">
|
||||
<field name="name">report.partner_member.year.tree</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Membership by Years">
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
<field name="currency"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_graph1">
|
||||
<field name="name">report.partner_member.year.graph1</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_graph2">
|
||||
<field name="name">report.partner_member.year.graph2</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_report_partner_member_year_tree">
|
||||
<field name="res_model">report.partner_member.year</field>
|
||||
<field name="view_type">form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view1">
|
||||
<field name="sequence" eval="3"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_tree1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view4">
|
||||
<field name="sequence" eval="4"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_tree2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view2">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_graph1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view3">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_graph2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem name="Membership by Years" parent="menu_reporting"
|
||||
action="action_report_partner_member_year_tree"
|
||||
id="menu_report_partner_member_year"/>
|
||||
|
||||
|
||||
<!-- REPORTING/NEW MEMBERSHIP BY YEAR -->
|
||||
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_tree1">
|
||||
<field name="name">report.partner_member.year_new.tree</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="New Membership by Years">
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_tree2">
|
||||
<field name="name">report.partner_member.year_new.tree</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="New Membership by Years">
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
<field name="currency"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_graph1">
|
||||
<field name="name">report.partner_member.year_new.graph1</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="New Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_graph2">
|
||||
<field name="name">report.partner_member.year_new.graph2</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="New Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_report_partner_member_year_new_tree">
|
||||
<field name="res_model">report.partner_member.year_new</field>
|
||||
<field name="view_type">form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view4">
|
||||
<field name="sequence" eval="4"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_tree2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view1">
|
||||
<field name="sequence" eval="3"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_tree1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view2">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_graph1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view3">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_graph2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem name="New Membership by Years" parent="menu_reporting"
|
||||
action="action_report_partner_member_year_new_tree"
|
||||
id="menu_report_partner_member_year_new"/>
|
||||
|
||||
<!-- View for product.product object inherited from product module................ -->
|
||||
<record model="ir.ui.view" id="view_product_form_inherit1">
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import report_membership
|
||||
@@ -0,0 +1,175 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
import tools
|
||||
|
||||
|
||||
class ReportPartnerMemberYear(osv.osv):
|
||||
'''Membership by Years'''
|
||||
|
||||
_name = 'report.partner_member.year'
|
||||
_description = __doc__
|
||||
_auto = False
|
||||
_rec_name = 'year'
|
||||
_columns = {
|
||||
'year': fields.char('Year', size='4', readonly=True, select=1),
|
||||
'canceled_number': fields.integer('Canceled', readonly=True),
|
||||
'waiting_number': fields.integer('Waiting', readonly=True),
|
||||
'invoiced_number': fields.integer('Invoiced', readonly=True),
|
||||
'paid_number': fields.integer('Paid', readonly=True),
|
||||
'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
|
||||
'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
|
||||
'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
|
||||
'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
|
||||
'currency': fields.many2one('res.currency', 'Currency', readonly=True,
|
||||
select=2),
|
||||
}
|
||||
|
||||
def init(self, cr):
|
||||
'''Create the view'''
|
||||
cr.execute("""
|
||||
CREATE OR REPLACE VIEW report_partner_member_year AS (
|
||||
SELECT
|
||||
MIN(id) AS id,
|
||||
COUNT(ncanceled) as canceled_number,
|
||||
COUNT(npaid) as paid_number,
|
||||
COUNT(ninvoiced) as invoiced_number,
|
||||
COUNT(nwaiting) as waiting_number,
|
||||
SUM(acanceled) as canceled_amount,
|
||||
SUM(apaid) as paid_amount,
|
||||
SUM(ainvoiced) as invoiced_amount,
|
||||
SUM(awaiting) as waiting_amount,
|
||||
year,
|
||||
currency
|
||||
FROM (SELECT
|
||||
CASE WHEN ai.state = 'cancel' THEN ml.id END AS ncanceled,
|
||||
CASE WHEN ai.state = 'paid' THEN ml.id END AS npaid,
|
||||
CASE WHEN ai.state = 'open' THEN ml.id END AS ninvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN ml.id END AS nwaiting,
|
||||
CASE WHEN ai.state = 'cancel'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS acanceled,
|
||||
CASE WHEN ai.state = 'paid'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS apaid,
|
||||
CASE WHEN ai.state = 'open'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS ainvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS awaiting,
|
||||
TO_CHAR(ml.date_from, 'YYYY') AS year,
|
||||
ai.currency_id AS currency,
|
||||
MIN(ml.id) AS id
|
||||
FROM membership_membership_line ml
|
||||
JOIN (account_invoice_line ail
|
||||
LEFT JOIN account_invoice ai
|
||||
ON (ail.invoice_id = ai.id))
|
||||
ON (ml.account_invoice_line = ail.id)
|
||||
JOIN res_partner p
|
||||
ON (ml.partner = p.id)
|
||||
GROUP BY TO_CHAR(ml.date_from, 'YYYY'), ai.state,
|
||||
ai.currency_id, ml.id) AS foo
|
||||
GROUP BY year, currency)
|
||||
""")
|
||||
ReportPartnerMemberYear()
|
||||
|
||||
class ReportPartnerMemberYearNew(osv.osv):
|
||||
'''New Membership by Years'''
|
||||
|
||||
_name = 'report.partner_member.year_new'
|
||||
_description = __doc__
|
||||
_auto = False
|
||||
_rec_name = 'year'
|
||||
_columns = {
|
||||
'year': fields.char('Year', size='4', readonly=True, select=1),
|
||||
'canceled_number': fields.integer('Canceled', readonly=True),
|
||||
'waiting_number': fields.integer('Waiting', readonly=True),
|
||||
'invoiced_number': fields.integer('Invoiced', readonly=True),
|
||||
'paid_number': fields.integer('Paid', readonly=True),
|
||||
'canceled_amount': fields.float('Canceled', digits=(16, 2), readonly=True),
|
||||
'waiting_amount': fields.float('Waiting', digits=(16, 2), readonly=True),
|
||||
'invoiced_amount': fields.float('Invoiced', digits=(16, 2), readonly=True),
|
||||
'paid_amount': fields.float('Paid', digits=(16, 2), readonly=True),
|
||||
'currency': fields.many2one('res.currency', 'Currency', readonly=True,
|
||||
select=2),
|
||||
}
|
||||
|
||||
def init(self, cursor):
|
||||
'''Create the view'''
|
||||
cursor.execute("""
|
||||
CREATE OR REPLACE VIEW report_partner_member_year_new AS (
|
||||
SELECT
|
||||
MIN(id) AS id,
|
||||
COUNT(ncanceled) AS canceled_number,
|
||||
COUNT(npaid) AS paid_number,
|
||||
COUNT(ninvoiced) AS invoiced_number,
|
||||
COUNT(nwaiting) AS waiting_number,
|
||||
SUM(acanceled) AS canceled_amount,
|
||||
SUM(apaid) AS paid_amount,
|
||||
SUM(ainvoiced) AS invoiced_amount,
|
||||
SUM(awaiting) AS waiting_amount,
|
||||
year,
|
||||
currency
|
||||
FROM (SELECT
|
||||
CASE WHEN ai.state = 'cancel' THEN ml2.id END AS ncanceled,
|
||||
CASE WHEN ai.state = 'paid' THEN ml2.id END AS npaid,
|
||||
CASE WHEN ai.state = 'open' THEN ml2.id END AS ninvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN ml2.id END AS nwaiting,
|
||||
CASE WHEN ai.state = 'cancel'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS acanceled,
|
||||
CASE WHEN ai.state = 'paid'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS apaid,
|
||||
CASE WHEN ai.state = 'open'
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS ainvoiced,
|
||||
CASE WHEN (ai.state = 'draft' OR ai.state = 'proforma')
|
||||
THEN SUM(ail.price_unit * ail.quantity * (1 - ail.discount / 100))
|
||||
ELSE 0 END AS awaiting,
|
||||
TO_CHAR(ml2.date_from, 'YYYY') AS year,
|
||||
ai.currency_id AS currency,
|
||||
MIN(ml2.id) AS id
|
||||
FROM (SELECT
|
||||
partner AS id,
|
||||
MIN(date_from) AS date_from
|
||||
FROM membership_membership_line
|
||||
GROUP BY partner
|
||||
) AS ml1
|
||||
JOIN membership_membership_line ml2
|
||||
JOIN (account_invoice_line ail
|
||||
LEFT JOIN account_invoice ai
|
||||
ON (ail.invoice_id = ai.id))
|
||||
ON (ml2.account_invoice_line = ail.id)
|
||||
ON (ml1.id = ml2.partner AND ml1.date_from = ml2.date_from)
|
||||
JOIN res_partner p
|
||||
ON (ml2.partner = p.id)
|
||||
GROUP BY TO_CHAR(ml2.date_from, 'YYYY'), ai.state,
|
||||
ai.currency_id, ml2.id) AS foo
|
||||
GROUP BY year, currency
|
||||
)
|
||||
""")
|
||||
|
||||
ReportPartnerMemberYearNew()
|
||||
@@ -0,0 +1,211 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data>
|
||||
<!-- REPORTING/MEMBERSHIP BY YEAR -->
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_tree1">
|
||||
<field name="name">report.partner_member.year.tree</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Membership by Years">
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_tree2">
|
||||
<field name="name">report.partner_member.year.tree</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Membership by Years">
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
<field name="currency"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_graph1">
|
||||
<field name="name">report.partner_member.year.graph1</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_graph2">
|
||||
<field name="name">report.partner_member.year.graph2</field>
|
||||
<field name="model">report.partner_member.year</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_report_partner_member_year_tree">
|
||||
<field name="res_model">report.partner_member.year</field>
|
||||
<field name="view_type">form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view1">
|
||||
<field name="sequence" eval="3"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_tree1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view4">
|
||||
<field name="sequence" eval="4"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_tree2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view2">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_graph1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_tree_view3">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_graph2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem name="Membership by Years" parent="menu_reporting"
|
||||
action="action_report_partner_member_year_tree"
|
||||
id="menu_report_partner_member_year"/>
|
||||
|
||||
|
||||
<!-- REPORTING/NEW MEMBERSHIP BY YEAR -->
|
||||
|
||||
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_tree1">
|
||||
<field name="name">report.partner_member.year_new.tree</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="New Membership by Years">
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_tree2">
|
||||
<field name="name">report.partner_member.year_new.tree</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="New Membership by Years">
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
<field name="currency"/>
|
||||
<field name="year"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_graph1">
|
||||
<field name="name">report.partner_member.year_new.graph1</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="New Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_number"/>
|
||||
<field name="waiting_number"/>
|
||||
<field name="invoiced_number"/>
|
||||
<field name="paid_number"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.view" id="view_report_partner_member_year_new_graph2">
|
||||
<field name="name">report.partner_member.year_new.graph2</field>
|
||||
<field name="model">report.partner_member.year_new</field>
|
||||
<field name="type">graph</field>
|
||||
<field name="arch" type="xml">
|
||||
<graph string="New Membership by Years" type="bar">
|
||||
<field name="year"/>
|
||||
<field name="canceled_amount"/>
|
||||
<field name="waiting_amount"/>
|
||||
<field name="invoiced_amount"/>
|
||||
<field name="paid_amount"/>
|
||||
</graph>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="action_report_partner_member_year_new_tree">
|
||||
<field name="res_model">report.partner_member.year_new</field>
|
||||
<field name="view_type">form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view4">
|
||||
<field name="sequence" eval="4"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_tree2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view1">
|
||||
<field name="sequence" eval="3"/>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_tree1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view2">
|
||||
<field name="sequence" eval="1"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_graph1"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window.view" id="action_report_partner_member_year_new_tree_view3">
|
||||
<field name="sequence" eval="2"/>
|
||||
<field name="view_mode">graph</field>
|
||||
<field name="view_id" ref="view_report_partner_member_year_new_graph2"/>
|
||||
<field name="act_window_id" ref="action_report_partner_member_year_new_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem name="New Membership by Years" parent="menu_reporting"
|
||||
action="action_report_partner_member_year_new_tree"
|
||||
id="menu_report_partner_member_year_new"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -0,0 +1,115 @@
|
||||
- |
|
||||
In Order to test the Membership in OpenERP, which allows us to manage all operations for managing memberships.
|
||||
- |
|
||||
We have to create "Membership Products" to make it available for partner or customer to make membership with it.
|
||||
select product type to "service" type and membership field is ticked to visible this product while creating membership for the partner.
|
||||
-
|
||||
!record {model: product.product, id: product_product_membershipproduct0}:
|
||||
categ_id: product.cat1
|
||||
membership: 1
|
||||
membership_date_from: '2009-06-01'
|
||||
membership_date_to: '2010-06-01'
|
||||
name: Membership Products
|
||||
type: service
|
||||
list_price: 80.00
|
||||
|
||||
- |
|
||||
I create new member "Mark Johnson" and I provide an address to this
|
||||
new customer, as well as an email "info@mycustomer.com".
|
||||
-
|
||||
!record {model: res.partner, id: res_partner_markjohnson0}:
|
||||
address:
|
||||
- city: paris
|
||||
country_id: base.fr
|
||||
name: Arthur Grosbonnet
|
||||
street: 1 rue Rockfeller
|
||||
title: M.
|
||||
type: default
|
||||
zip: '75016'
|
||||
credit_limit: 0.0
|
||||
membership_amount: 0.0
|
||||
name: Mark Johnson
|
||||
property_account_payable: account.a_pay
|
||||
property_account_receivable: account.a_recv
|
||||
|
||||
- |
|
||||
I check that "Current membership state" is set to "Non Member".
|
||||
-
|
||||
!assert {model: res.partner, id: res_partner_markjohnson0}:
|
||||
- membership_state == 'none'
|
||||
- |
|
||||
I can make it a Free member by selecting the "Free member" check box.
|
||||
-
|
||||
!record {model: res.partner, id: membership.res_partner_markjohnson0}:
|
||||
free_member: 1
|
||||
- |
|
||||
Now, I create Membership Invoices using wizard available on partner and Select Membership Product.
|
||||
-
|
||||
!record {model: membership.invoice, id: membership_invoice_0}:
|
||||
product_id: membership.product_product_membershipproduct0
|
||||
- |
|
||||
I check that address is defined or not for this Member.
|
||||
-
|
||||
!python {model: membership.invoice}: |
|
||||
partner_ids = [ref('res_partner_markjohnson0')]
|
||||
addre_obj = self.pool.get('res.partner.address')
|
||||
ids = addre_obj.search(cr, uid, [('partner_id', '=', partner_ids)])
|
||||
|
||||
addre_id = addre_obj.browse(cr, uid, ids)[0]
|
||||
assert addre_id.partner_id
|
||||
assert addre_id.id
|
||||
assert addre_id.type
|
||||
|
||||
- |
|
||||
I click on "Confirm" button of this wizard.
|
||||
-
|
||||
!python {model: membership.invoice}: |
|
||||
self.membership_invoice(cr, uid, [ref("membership_invoice_0")], {"active_ids": [ref("membership.res_partner_markjohnson0")]})
|
||||
|
||||
- |
|
||||
I check that Invoice is created for this members.
|
||||
-
|
||||
!python {model: res.partner}: |
|
||||
invoice_obj = self.pool.get('account.invoice')
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
product_obj = self.pool.get('product.product')
|
||||
invoice_line_obj = self.pool.get(('account.invoice.line'))
|
||||
|
||||
partner_id = self.browse(cr, uid, [ref('res_partner_markjohnson0')])[0]
|
||||
ids = invoice_obj.search(cr, uid, [('partner_id', '=', partner_id.id), ('account_id', '=', partner_id.property_account_receivable.id)])
|
||||
invoice_id = invoice_obj.browse(cr, uid, ids)[0]
|
||||
|
||||
product = product_obj.browse(cr, uid, [ref('product_product_membershipproduct0')], context=context)[0]
|
||||
line_ids = invoice_line_obj.search(cr, uid, [('product_id', '=', product.id), ('invoice_id', '=', invoice_id.id)])
|
||||
line_id = invoice_line_obj.browse(cr, uid, line_ids)[0]
|
||||
|
||||
assert line_id.product_id.id == product.id
|
||||
assert invoice_id.partner_id.id == partner_id.id
|
||||
|
||||
- |
|
||||
I check that the "Current membership state" will remain same untill opening the invoice.
|
||||
-
|
||||
!assert {model: res.partner, id: res_partner_markjohnson0}:
|
||||
- membership_state == 'free'
|
||||
|
||||
- |
|
||||
"Current membership state" of any member depends on the state of invoice.
|
||||
So, I check that invoice is in draft state then the "membership state" of a member is "Waiting member".
|
||||
-
|
||||
!python {model: membership.membership_line}: |
|
||||
partner_id = self.pool.get('res.partner').browse(cr, uid, [ref('res_partner_markjohnson0')])[0]
|
||||
ids = self.search(cr, uid, [('partner', '=', partner_id.id)])
|
||||
current_id = self.browse(cr, uid, ids)[0]
|
||||
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
inv_obj = self.pool.get('account.invoice')
|
||||
|
||||
ids = inv_obj.search(cr, uid, [('partner_id', '=', partner_id.id), ('account_id', '=', partner_id.property_account_receivable.id)])
|
||||
inv_id = inv_obj.browse(cr, uid, ids)[0]
|
||||
if inv_id.state == 'draft':
|
||||
assert current_id == 'waiting'
|
||||
- |
|
||||
When the invoice is in open state it become Invoiced Member, When the invoice is in paid state the same "Current membership state" changed to Paid Member.
|
||||
Now, If we cancel the invoice "Current membership state" changed to Cancel Member.
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ class member_unpaid_invoice(osv.osv_memory):
|
||||
'product': fields.many2one('product.product','Membership product', size=64,required=True, help='Select Membership product'),
|
||||
}
|
||||
|
||||
def _invoice_membership(self, cr, uid, ids, context):
|
||||
def invoice_membership(self, cr, uid, ids, context):
|
||||
model_obj = self.pool.get('ir.model.data')
|
||||
partners = []
|
||||
result = model_obj._get_id(cr, uid, 'base', 'view_res_partner_filter')
|
||||
@@ -56,4 +56,4 @@ class member_unpaid_invoice(osv.osv_memory):
|
||||
|
||||
member_unpaid_invoice()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -69,7 +69,7 @@ class project_issue(osv.osv, crm.crm_case):
|
||||
duration = 0
|
||||
ans = False
|
||||
hours = 0
|
||||
|
||||
|
||||
if field in ['working_hours_open','day_open']:
|
||||
if issue.date_open:
|
||||
date_create = datetime.strptime(issue.create_date, "%Y-%m-%d %H:%M:%S")
|
||||
@@ -121,38 +121,38 @@ class project_issue(osv.osv, crm.crm_case):
|
||||
return res
|
||||
|
||||
_columns = {
|
||||
'thread_id': fields.many2one('mailgate.thread', 'Thread', required=False),
|
||||
'id': fields.integer('ID'),
|
||||
'thread_id': fields.many2one('mailgate.thread', 'Thread', required=False),
|
||||
'id': fields.integer('ID'),
|
||||
'name': fields.char('Name', size=128, required=True),
|
||||
'active': fields.boolean('Active', required=False),
|
||||
'active': fields.boolean('Active', required=False),
|
||||
'create_date': fields.datetime('Creation Date' , readonly=True),
|
||||
'write_date': fields.datetime('Update Date' , readonly=True),
|
||||
'date_deadline': fields.date('Deadline'),
|
||||
'date_closed': fields.datetime('Closed', readonly=True),
|
||||
'section_id': fields.many2one('crm.case.section', 'Sales Team', \
|
||||
select=True, help='Sales team to which Case belongs to.\
|
||||
Define Responsible user and Email account for mail gateway.'),
|
||||
Define Responsible user and Email account for mail gateway.'),
|
||||
'user_id': fields.many2one('res.users', 'Responsible'),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner'),
|
||||
'partner_address_id': fields.many2one('res.partner.address', 'Partner Contact', \
|
||||
domain="[('partner_id','=',partner_id)]"),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
'description': fields.text('Description'),
|
||||
domain="[('partner_id','=',partner_id)]"),
|
||||
'company_id': fields.many2one('res.company', 'Company'),
|
||||
'description': fields.text('Description'),
|
||||
'state': fields.selection([
|
||||
('draft', 'Draft'),
|
||||
('open', 'Todo'),
|
||||
('cancel', 'Cancelled'),
|
||||
('done', 'Closed'),
|
||||
('draft', 'Draft'),
|
||||
('open', 'Todo'),
|
||||
('cancel', 'Cancelled'),
|
||||
('done', 'Closed'),
|
||||
('pending', 'Pending'),
|
||||
], 'State', size=16, readonly=True,
|
||||
], 'State', size=16, readonly=True,
|
||||
help='The state is set to \'Draft\', when a case is created.\
|
||||
\nIf the case is in progress the state is set to \'Open\'.\
|
||||
\nWhen the case is over, the state is set to \'Done\'.\
|
||||
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
|
||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
|
||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||
'email_cc': fields.text('Watchers Emails', size=252 , help="These people\
|
||||
will receive a copy of the future" \
|
||||
" communication between partner and users by email"),
|
||||
" communication between partner and users by email"),
|
||||
'date_open': fields.datetime('Opened', readonly=True),
|
||||
# Project Issue fields
|
||||
'date_closed': fields.datetime('Closed', readonly=True),
|
||||
@@ -180,7 +180,7 @@ class project_issue(osv.osv, crm.crm_case):
|
||||
'working_hours_close': fields.function(_compute_day, string='Working Hours to Close the Issue', \
|
||||
method=True, multi='working_days_close', type="float", store=True),
|
||||
}
|
||||
|
||||
|
||||
def _get_project(self, cr, uid, context):
|
||||
user = self.pool.get('res.users').browse(cr,uid,uid, context=context)
|
||||
if user.context_project_id:
|
||||
@@ -189,14 +189,14 @@ class project_issue(osv.osv, crm.crm_case):
|
||||
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
'user_id': crm.crm_case._get_default_user,
|
||||
'partner_id': crm.crm_case._get_default_partner,
|
||||
'partner_address_id': crm.crm_case._get_default_partner_address,
|
||||
'email_from': crm.crm_case. _get_default_email,
|
||||
'user_id': crm.crm_case._get_default_user,
|
||||
'partner_id': crm.crm_case._get_default_partner,
|
||||
'partner_address_id': crm.crm_case._get_default_partner_address,
|
||||
'email_from': crm.crm_case. _get_default_email,
|
||||
'state': lambda *a: 'draft',
|
||||
'section_id': crm.crm_case. _get_section,
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
|
||||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||
'section_id': crm.crm_case. _get_section,
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.helpdesk', context=c),
|
||||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||
'project_id':_get_project,
|
||||
}
|
||||
|
||||
@@ -277,7 +277,7 @@ class project_issue(osv.osv, crm.crm_case):
|
||||
if not stage.on_change:
|
||||
return {'value':{}}
|
||||
return {'value':{}}
|
||||
|
||||
|
||||
def case_escalate(self, cr, uid, ids, *args):
|
||||
"""Escalates case to top level
|
||||
@param self: The object pointer
|
||||
@@ -286,16 +286,17 @@ class project_issue(osv.osv, crm.crm_case):
|
||||
@param ids: List of case Ids
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
res = super(project_issue, self).case_escalate(cr, uid, ids, args)
|
||||
cases = self.browse(cr, uid, ids)
|
||||
for case in cases:
|
||||
data = {}
|
||||
if case.project_id.project_escalation_id:
|
||||
data['project_id'] = case.project_id.project_escalation_id.id
|
||||
if case.project_id.project_escalation_id.user_id:
|
||||
data['user_id'] = case.project_id.project_escalation_id.user_id.id
|
||||
else:
|
||||
raise osv.except_osv(_('Warning !'), _('You cannot escalate this case.\nThe relevant Project has not configured the Escalation Project!'))
|
||||
raise osv.except_osv(_('Warning !'), _('You cannot escalate this issue.\nThe relevant Project has not configured the Escalation Project!'))
|
||||
self.write(cr, uid, [case.id], data)
|
||||
return res
|
||||
return True
|
||||
|
||||
project_issue()
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<field name="view_mode">tree,calendar</field>
|
||||
<field name="view_id" ref="project_issue_tree_view"/>
|
||||
<field name="domain" eval="[('categ_id','=',ref('bug_categ'))]"/>
|
||||
<field name="context">{"search_default_user_id": uid, "search_default_my_bugs":1,"search_default_current_bugs":1,"search_default_project_id":project_id}</field>
|
||||
<field name="context">{"search_default_user_id": uid,"search_default_current":1,"search_default_project_id":project_id}</field>
|
||||
<field name="search_view_id" ref="view_project_issue_filter"/>
|
||||
</record>
|
||||
<record model="ir.actions.act_window.view" id="action_crm_tag_tree_view0">
|
||||
@@ -36,6 +36,15 @@
|
||||
<field name="act_window_id" ref="project_issue_categ_act0"/>
|
||||
</record>
|
||||
|
||||
<act_window
|
||||
domain="[('project_id', '=', active_id)]"
|
||||
id="act_project_project_2_project_issue_all"
|
||||
name="Issues"
|
||||
res_model="project.issue"
|
||||
src_model="project.project"
|
||||
view_mode="tree,form,calendar,graph"
|
||||
view_type="form"/>
|
||||
|
||||
<!--<menuitem id="menu_aftertask" name="Bug" parent="project.menu_main" visible="False"/>-->
|
||||
<menuitem name="Issues" id="menu_project_issue_track" parent="project.menu_project_management" action="project_issue_categ_act0"/>
|
||||
</data>
|
||||
|
||||
@@ -32,6 +32,8 @@
|
||||
<form string="Issue Tracker Form">
|
||||
<group colspan="4" col="6">
|
||||
<field name="name"/>
|
||||
<field name="project_id" required="True"/>
|
||||
<field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'project.issue')]"/>
|
||||
<field name="user_id"/>
|
||||
<field name="assigned_to" />
|
||||
<group colspan="2" col="4">
|
||||
@@ -39,8 +41,6 @@
|
||||
<button icon="gtk-go-back" string="" name="stage_previous" type="object"/>
|
||||
<button icon="gtk-go-forward" string="" name="stage_next" type="object"/>
|
||||
</group>
|
||||
<field name="project_id" required="True"/>
|
||||
<field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'project.issue')]"/>
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="General">
|
||||
@@ -73,40 +73,6 @@
|
||||
<button name="case_reset" string="Reset to Draft" states="done,cancel" type="object" icon="gtk-convert"/>
|
||||
</group>
|
||||
</page>
|
||||
<page string="History" groups="base.group_extended">
|
||||
<group col="2" colspan="2">
|
||||
<separator colspan="2" string="Date"/>
|
||||
<field name="create_date"/>
|
||||
<field name="write_date" />
|
||||
<field name="date_closed"/>
|
||||
<field name="date_open"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="Statistics" colspan="2" col="2"/>
|
||||
<field name="day_open"/>
|
||||
<field name="day_close"/>
|
||||
<field name="working_hours_open" widget="float_time"/>
|
||||
<field name="working_hours_close" widget="float_time"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="References" colspan="2"/>
|
||||
<field name="id"/>
|
||||
<field name="active"/>
|
||||
</group>
|
||||
<field name="log_ids" nolabel="1" colspan="4">
|
||||
<tree string="Logs">
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
<form string="Logs">
|
||||
<separator string="Action Information" colspan="4"/>
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</form>
|
||||
</field>
|
||||
</page>
|
||||
<page string="Emails" groups="base.group_extended">
|
||||
<group colspan="4">
|
||||
<field colspan="4" name="email_cc" string="CC"/>
|
||||
@@ -144,6 +110,40 @@
|
||||
context="{'mail':'new', 'model': 'project.issue'}"
|
||||
icon="gtk-go-forward" type="action" />
|
||||
</page>
|
||||
<page string="History" groups="base.group_extended">
|
||||
<group col="2" colspan="2">
|
||||
<separator colspan="2" string="Date"/>
|
||||
<field name="create_date"/>
|
||||
<field name="write_date" />
|
||||
<field name="date_closed"/>
|
||||
<field name="date_open"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="Statistics" colspan="2" col="2"/>
|
||||
<field name="day_open"/>
|
||||
<field name="day_close"/>
|
||||
<field name="working_hours_open" widget="float_time"/>
|
||||
<field name="working_hours_close" widget="float_time"/>
|
||||
</group>
|
||||
<group colspan="2" col="2">
|
||||
<separator string="References" colspan="2"/>
|
||||
<field name="id"/>
|
||||
<field name="active"/>
|
||||
</group>
|
||||
<field name="log_ids" nolabel="1" colspan="4">
|
||||
<tree string="Logs">
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</tree>
|
||||
<form string="Logs">
|
||||
<separator string="Action Information" colspan="4"/>
|
||||
<field name="name" colspan="4"/>
|
||||
<field name="date"/>
|
||||
<field name="user_id"/>
|
||||
</form>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
</form>
|
||||
</field>
|
||||
@@ -153,7 +153,7 @@
|
||||
<field name="model">project.issue</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Issue Tracker Tree" colors="red:state=='open';black:state in ('draft', 'cancel','done','pending')">
|
||||
<tree string="Issue Tracker Tree" colors="red:state=='open';blue:state=='pending';grey:state in ('cancel', 'done')">
|
||||
<field name="id"/>
|
||||
<field name="create_date"/>
|
||||
<field name="name"/>
|
||||
@@ -186,13 +186,11 @@
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Issue Tracker Search">
|
||||
<group colspan="4" col="20">
|
||||
<filter string="Current" domain="[('state','in',('open','draft'))]" help="Draft and Open Issues" icon="terp-check" default="1"/>
|
||||
<group>
|
||||
<filter string="Current" name="current" domain="[('state','in',('open','draft'))]" help="Draft and Open Issues" icon="terp-check" default="1"/>
|
||||
<filter string="In Progress" domain="[('state','=','open')]" help="Open Issues" icon="terp-camera_test"/>
|
||||
<filter string="Pending" domain="[('state','=','pending')]" help="Pending Issues" icon="terp-gtk-media-pause"/>
|
||||
|
||||
<separator orientation="vertical"/>
|
||||
|
||||
<filter icon="terp-go-today" string=" Today "
|
||||
separator="1"
|
||||
domain="[('date','=',time.strftime('%%Y-%%m-%%d'))]"
|
||||
@@ -204,21 +202,20 @@
|
||||
help="Bugs during last 7 days"
|
||||
/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="name" select='1' string="Subject"/>
|
||||
<field name="user_id" select="1" widget="selection"/>
|
||||
<field name="state" select="1">
|
||||
<filter icon="terp-check" domain="[('state','in',('open','draft'))]" help="Current Bugs" name="current_bugs"/>
|
||||
<filter icon="terp-camera_test" domain="[('state','=','open')]" help="Open Bugs"/>
|
||||
</field>
|
||||
<field name="project_id" select="1" widget="selection" string="Project"/>
|
||||
<field name="name" string="Name"/>
|
||||
<field name="user_id" widget="selection"/>
|
||||
<field name="project_id" widget="selection" string="Project"/>
|
||||
<field name="state"/>
|
||||
</group>
|
||||
<newline/>
|
||||
<group expand="0" string="Group By..." colspan="4" col="20" groups="base.group_extended">
|
||||
<group expand="0" string="Group By..." groups="base.group_extended">
|
||||
<filter string="Project" icon="terp-folder-blue" domain="[]"
|
||||
context="{'group_by':'project_id'}" />
|
||||
<filter string="Stage" icon="terp-stage" domain="[]"
|
||||
context="{'group_by':'stage_id'}" />
|
||||
<filter string="Priority" icon="terp-rating-rated" domain="[]"
|
||||
context="{'group_by':'priority'}" />
|
||||
<filter string="Campaign" icon="terp-gtk-jump-to-rtl"
|
||||
<filter string="Version" icon="terp-gtk-jump-to-rtl"
|
||||
domain="[]" context="{'group_by':'type_id'}" />
|
||||
<separator orientation="vertical" />
|
||||
<filter string="Partner" icon="terp-personal" domain="[]"
|
||||
@@ -228,7 +225,6 @@
|
||||
<separator orientation="vertical" />
|
||||
<filter string="Month" icon="terp-go-month"
|
||||
domain="[]" context="{'group_by':'create_date'}" />
|
||||
<separator orientation="vertical" />
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
|
||||
"access_project_issue","project.issue","model_project_issue","crm.group_crm_manager",1,1,1,1
|
||||
"access_project_issue_report","project.issue.report","model_project_issue_report","crm.group_crm_manager",1,0,0,0
|
||||
"access_project_issue_all","project.issue","model_project_issue","project.group_project_manager",1,1,1,1
|
||||
"access_project_issue","project.issue","model_project_issue","project_issue.group_project_supporter",1,1,1,1
|
||||
"access_project_issue_report_all","project.issue.report","model_project_issue_report","project.group_project_manager",1,1,1,1
|
||||
"access_project_issue_report","project.issue.report","model_project_issue_report","project_issue.group_project_supporter",1,1,1,1
|
||||
"access_crm_case_categ_id","crm.case.categ","crm.model_crm_case_categ","project.group_project_manager",1,1,1,1
|
||||
"access_crm_case_categ_supp","crm.case.categ","crm.model_crm_case_categ","project_issue.group_project_supporter",1,0,0,0
|
||||
"access_crm_case_resource_type_project","crm_case_resource_type manager","crm.model_crm_case_resource_type","project.group_project_manager",1,1,1,1
|
||||
"access_crm_case_resource_supp","crm_case_resource_type manager","crm.model_crm_case_resource_type","project_issue.group_project_supporter",1,0,0,0
|
||||
"access_crm_case_stage_project","crm.case.stage","crm.model_crm_case_stage","project.group_project_manager",1,1,1,1
|
||||
"access_crm_case_stage_manager_suppo","crm.case.stage","crm.model_crm_case_stage","project_issue.group_project_supporter",1,0,0,0
|
||||
|
||||
|
@@ -2,12 +2,9 @@
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="project_issue_rule" model="ir.rule">
|
||||
<field name="name">project.issue.rule.group</field>
|
||||
<field name="model_id" search="[('model','=','project.issue')]" model="ir.model"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|',('project_id','=',False),('project_id','=',user.context_project_id)]</field>
|
||||
<record id="group_project_supporter" model="res.groups">
|
||||
<field name="name">Project / Support Manager</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.4\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2009-11-18 06:10+0000\n"
|
||||
"Last-Translator: Fabien (Open ERP) <fp@tinyerp.com>\n"
|
||||
"PO-Revision-Date: 2010-06-09 22:18+0000\n"
|
||||
"Last-Translator: lyyser <logard.1961@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-04-17 03:58+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: purchase
|
||||
@@ -606,7 +606,7 @@ msgstr "Kättetoimetamine ja arved"
|
||||
#. module: purchase
|
||||
#: field:purchase.order,date_order:0
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgstr "Kuupäev"
|
||||
|
||||
#. module: purchase
|
||||
#: help:purchase.order,origin:0
|
||||
@@ -666,7 +666,7 @@ msgstr "Kui ostukorraldus on heaks kiidetud, loob see pakkimise nimekirja."
|
||||
#. module: purchase
|
||||
#: view:purchase.order.line:0
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
msgstr "Ajalugu"
|
||||
|
||||
#. module: purchase
|
||||
#: field:purchase.order,state:0
|
||||
@@ -893,4 +893,4 @@ msgstr "Peale ostukorralduse heaks kiitmist läheb see kliendiarveks"
|
||||
#. module: purchase
|
||||
#: view:purchase.order.line:0
|
||||
msgid "Stock Moves"
|
||||
msgstr ""
|
||||
msgstr "Lao liikumised"
|
||||
|
||||
@@ -7,13 +7,13 @@ msgstr ""
|
||||
"Project-Id-Version: OpenERP Server 5.0.0\n"
|
||||
"Report-Msgid-Bugs-To: support@openerp.com\n"
|
||||
"POT-Creation-Date: 2009-08-28 16:01+0000\n"
|
||||
"PO-Revision-Date: 2010-06-04 12:29+0000\n"
|
||||
"PO-Revision-Date: 2010-06-09 09:31+0000\n"
|
||||
"Last-Translator: Jonay <jonay.santana@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-09 03:36+0000\n"
|
||||
"X-Launchpad-Export-Date: 2010-06-10 03:36+0000\n"
|
||||
"X-Generator: Launchpad (build Unknown)\n"
|
||||
|
||||
#. module: report_task
|
||||
@@ -205,7 +205,7 @@ msgstr "Cancelado"
|
||||
#. module: report_task
|
||||
#: view:report.timesheet.task.user:0
|
||||
msgid "Timesheet/Task hours Report Per Month"
|
||||
msgstr ""
|
||||
msgstr "Horario / Informe de horas de trabajo por mes"
|
||||
|
||||
#. module: report_task
|
||||
#: field:report.task.user.pipeline.open,task_progress:0
|
||||
@@ -250,7 +250,7 @@ msgstr "Fecha límite"
|
||||
#. module: report_task
|
||||
#: field:report.timesheet.task.user,timesheet_hrs:0
|
||||
msgid "Timesheet Hours"
|
||||
msgstr ""
|
||||
msgstr "Horas del horario"
|
||||
|
||||
#. module: report_task
|
||||
#: view:report.closed.task:0
|
||||
@@ -265,4 +265,4 @@ msgstr "Abrir"
|
||||
#. module: report_task
|
||||
#: field:report.closed.task,planned_hours:0
|
||||
msgid "Planned Hours"
|
||||
msgstr ""
|
||||
msgstr "Horas planeadas"
|
||||
|
||||
@@ -38,7 +38,7 @@ crm modules.
|
||||
'website': 'http://www.openerp.com',
|
||||
'depends': ['sale', 'crm'],
|
||||
'init_xml': [],
|
||||
'update_xml': ['sale_crm_wizard.xml',
|
||||
'update_xml': ['wizard/crm_make_sale_view.xml',
|
||||
'sale_crm_view.xml',
|
||||
'process/sale_crm_process.xml',
|
||||
'security/sale_crm_security.xml',
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<field name="inherit_id" ref="crm.crm_case_form_view_oppor"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="priority" position="after">
|
||||
<button string="Create a Sale Order" icon="terp-sale" name="%(sale_crm_wizard)d" type="action"/>
|
||||
<button string="Create a Sale Order" icon="terp-sale" name="%(action_crm_make_sale)d" type="action"/>
|
||||
<label colspan="2" string=""/>
|
||||
</field>
|
||||
</field>
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" ?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<wizard
|
||||
string="Make Quotation"
|
||||
model="crm.opportunity"
|
||||
name="crm.opportunity.make_order"
|
||||
keyword="client_action_multi"
|
||||
multi="True"
|
||||
id="sale_crm_wizard"/>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -19,7 +19,7 @@
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
import makesale
|
||||
import crm_make_sale
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
||||
@@ -0,0 +1,180 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
from tools.translate import _
|
||||
from mx.DateTime import now
|
||||
|
||||
|
||||
class crm_make_sale(osv.osv_memory):
|
||||
""" Make sale order for crm """
|
||||
|
||||
_name = "crm.make.sale"
|
||||
_description = "Make sale"
|
||||
|
||||
def _selectPartner(self, cr, uid, context=None):
|
||||
"""
|
||||
This function gets default value for partner_id field.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return : default value of partner_id field.
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
data = context and context.get('active_ids', []) or []
|
||||
case_obj = self.pool.get('crm.lead')
|
||||
case = case_obj.read(cr, uid, data, ['partner_id'])
|
||||
return case[0]['partner_id']
|
||||
|
||||
def makeOrder(self, cr, uid, ids, context=None):
|
||||
"""
|
||||
This function create Quotation on given case.
|
||||
@param self: The object pointer
|
||||
@param cr: the current row, from the database cursor,
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of crm make sale' ids
|
||||
@param context: A standard dictionary for contextual values
|
||||
@return : Dictionary value of created sale order.
|
||||
"""
|
||||
if not context:
|
||||
context = {}
|
||||
|
||||
mod_obj = self.pool.get('ir.model.data')
|
||||
|
||||
|
||||
result = mod_obj._get_id(cr, uid, 'sale', 'view_sales_order_filter')
|
||||
id = mod_obj.read(cr, uid, result, ['res_id'])
|
||||
|
||||
case_obj = self.pool.get('crm.lead')
|
||||
sale_obj = self.pool.get('sale.order')
|
||||
partner_obj = self.pool.get('res.partner')
|
||||
sale_line_obj = self.pool.get('sale.order.line')
|
||||
|
||||
data = context and context.get('active_ids', []) or []
|
||||
|
||||
for make in self.browse(cr, uid, ids):
|
||||
default_partner_addr = partner_obj.address_get(cr, uid, [make.partner_id.id],
|
||||
['invoice', 'delivery', 'contact'])
|
||||
default_pricelist = partner_obj.browse(cr, uid, make.partner_id.id,
|
||||
context).property_product_pricelist.id
|
||||
fpos_data = partner_obj.browse(cr, uid, make.partner_id.id, context).property_account_position
|
||||
new_ids = []
|
||||
|
||||
for case in case_obj.browse(cr, uid, data):
|
||||
if case.partner_id and case.partner_id.id:
|
||||
partner_id = case.partner_id.id
|
||||
fpos = case.partner_id.property_account_position and case.partner_id.property_account_position.id or False
|
||||
partner_addr = partner_obj.address_get(cr, uid, [case.partner_id.id],
|
||||
['invoice', 'delivery', 'contact'])
|
||||
pricelist = partner_obj.browse(cr, uid, case.partner_id.id,
|
||||
context).property_product_pricelist.id
|
||||
else:
|
||||
partner_id = make.partner_id.id
|
||||
fpos = fpos_data and fpos_data.id or False
|
||||
partner_addr = default_partner_addr
|
||||
pricelist = default_pricelist
|
||||
|
||||
if False in partner_addr.values():
|
||||
raise osv.except_osv(_('Data Insufficient!'),_('Customer has no addresses defined!'))
|
||||
|
||||
vals = {
|
||||
'origin': 'CRM-Opportunity:%s' % str(case.id),
|
||||
'section_id': case.section_id and case.section_id.id or False,
|
||||
'picking_policy': make.picking_policy,
|
||||
'shop_id': make.shop_id.id,
|
||||
'partner_id': partner_id,
|
||||
'pricelist_id': pricelist,
|
||||
'partner_invoice_id': partner_addr['invoice'],
|
||||
'partner_order_id': partner_addr['contact'],
|
||||
'partner_shipping_id': partner_addr['delivery'],
|
||||
'order_policy': 'manual',
|
||||
'date_order': now(),
|
||||
'fiscal_position': fpos,
|
||||
}
|
||||
|
||||
if partner_id:
|
||||
partner = partner_obj.browse(cr, uid, partner_id, context=context)
|
||||
vals['user_id'] = partner.user_id and partner.user_id.id or uid
|
||||
|
||||
if make.analytic_account.id:
|
||||
vals['project_id'] = make.analytic_account.id
|
||||
new_id = sale_obj.create(cr, uid, vals)
|
||||
for product_id in make.product_ids:
|
||||
value = sale_line_obj.product_id_change(cr, uid, [], pricelist,
|
||||
product_id.id, qty=1, partner_id=partner_id, fiscal_position=fpos)['value']
|
||||
value['product_id'] = product_id.id
|
||||
value['order_id'] = new_id
|
||||
value['tax_id'] = [(6,0,value['tax_id'])]
|
||||
sale_line_obj.create(cr, uid, value)
|
||||
|
||||
case_obj.write(cr, uid, [case.id], {'ref': 'sale.order,%s' % new_id})
|
||||
new_ids.append(new_id)
|
||||
|
||||
if make.close:
|
||||
case_obj.case_close(cr, uid, data)
|
||||
|
||||
if not new_ids:
|
||||
return {}
|
||||
if len(new_ids)<=1:
|
||||
value = {
|
||||
'domain': str([('id', 'in', new_ids)]),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'sale.order',
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_id': new_ids and new_ids[0]
|
||||
|
||||
}
|
||||
|
||||
|
||||
else:
|
||||
value = {
|
||||
'domain': str([('id', 'in', new_ids)]),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'sale.order',
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_id':new_ids
|
||||
}
|
||||
return value
|
||||
|
||||
_columns = {
|
||||
'shop_id': fields.many2one('sale.shop', 'Shop', required = True),
|
||||
'partner_id': fields.many2one('res.partner', 'Customer', required = True, help = 'Use this partner if there is no partner on the case'),
|
||||
'picking_policy': fields.selection([('direct','Partial Delivery'),
|
||||
('one','Complete Delivery')], 'Picking Policy', required = True),
|
||||
'product_ids': fields.many2many('product.product', 'product_sale_rel',\
|
||||
'sale_id', 'product_id', 'Products'),
|
||||
'analytic_account': fields.many2one('account.analytic.account', 'Analytic Account'),
|
||||
'close': fields.boolean('Close Case', help = 'Check this to close the case after having created the sale order.'),
|
||||
}
|
||||
_defaults = {
|
||||
'partner_id': _selectPartner,
|
||||
'close': lambda *a: 1
|
||||
}
|
||||
|
||||
crm_make_sale()
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
@@ -0,0 +1,43 @@
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<!-- crm make sale's view -->
|
||||
|
||||
<record id="view_crm_make_sale" model="ir.ui.view">
|
||||
<field name="name">crm.make.sale.form</field>
|
||||
<field name="model">crm.make.sale</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Create a Sale Order" >
|
||||
<group colspan="4">
|
||||
<field name="partner_id"/>
|
||||
<field name="shop_id"/>
|
||||
<field name="analytic_account"/>
|
||||
<field name="picking_policy"/>
|
||||
<field name="close"/>
|
||||
</group>
|
||||
<separator string="Products" colspan="4"/>
|
||||
<field name="product_ids" colspan="4" nolabel="1"/>
|
||||
<separator colspan="4"/>
|
||||
<group col="4" colspan="4">
|
||||
<label string="" colspan="2"/>
|
||||
<button special="cancel" string="Cancel" icon="gtk-cancel"/>
|
||||
<button name="makeOrder" string="Create" type="object" icon='gtk-go-forward'/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<!-- crm make sale's action -->
|
||||
|
||||
<record id="action_crm_make_sale" model="ir.actions.act_window">
|
||||
<field name="name">Make Quotation</field>
|
||||
<field name="type">ir.actions.act_window</field>
|
||||
<field name="res_model">crm.make.sale</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -1,180 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from mx.DateTime import now
|
||||
|
||||
import wizard
|
||||
import netsvc
|
||||
import ir
|
||||
import pooler
|
||||
from tools.translate import _
|
||||
|
||||
sale_form = """<?xml version="1.0"?>
|
||||
<form string="Create a Sale Order">
|
||||
<field name="partner_id" required="True"/>
|
||||
<field name="shop_id" required="True"/>
|
||||
<field name="analytic_account"/>
|
||||
<field name="picking_policy" required="True"/>
|
||||
<field name="close"/>
|
||||
<newline/>
|
||||
<field name="products" colspan="4"/>
|
||||
</form>"""
|
||||
|
||||
sale_fields = {
|
||||
'shop_id': {'string': 'Shop', 'type': 'many2one', 'relation': 'sale.shop'},
|
||||
'partner_id': {'string': 'Customer', 'type': 'many2one',
|
||||
'relation': 'res.partner',
|
||||
'help': 'Use this partner if there is no partner on the case'},
|
||||
'picking_policy': {'string': 'Picking Policy', 'type': 'selection',
|
||||
'selection': [('direct', 'Partial Delivery'), ('one', 'Complete Delivery')]},
|
||||
'products': {'string': 'Products', 'type': 'many2many',
|
||||
'relation': 'product.product'},
|
||||
'analytic_account': {'string': 'Analytic Account', 'type': 'many2one',
|
||||
'relation': 'account.analytic.account'},
|
||||
'close': {'string': 'Close Case', 'type': 'boolean', 'default': lambda *a: 1,
|
||||
'help': 'Check this to close the case after having created the sale order.'},
|
||||
}
|
||||
|
||||
|
||||
class make_sale(wizard.interface):
|
||||
|
||||
def _selectPartner(self, cr, uid, data, context):
|
||||
case_obj = pooler.get_pool(cr.dbname).get('crm.lead')
|
||||
case = case_obj.read(cr, uid, data['ids'], ['partner_id'])
|
||||
return {'partner_id': case[0]['partner_id']}
|
||||
|
||||
def _makeOrder(self, cr, uid, data, context):
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
mod_obj = pool.get('ir.model.data')
|
||||
result = mod_obj._get_id(cr, uid, 'sale', 'view_sales_order_filter')
|
||||
id = mod_obj.read(cr, uid, result, ['res_id'])
|
||||
case_obj = pool.get('crm.lead')
|
||||
sale_obj = pool.get('sale.order')
|
||||
partner_obj = pool.get('res.partner')
|
||||
sale_line_obj = pool.get('sale.order.line')
|
||||
|
||||
default_partner_addr = partner_obj.address_get(cr, uid, [data['form']['partner_id']],
|
||||
['invoice', 'delivery', 'contact'])
|
||||
default_pricelist = partner_obj.browse(cr, uid, data['form']['partner_id'],
|
||||
context).property_product_pricelist.id
|
||||
fpos_data = partner_obj.browse(cr, uid, data['form']['partner_id'],context).property_account_position
|
||||
new_ids = []
|
||||
|
||||
for case in case_obj.browse(cr, uid, data['ids']):
|
||||
if case.partner_id and case.partner_id.id:
|
||||
partner_id = case.partner_id.id
|
||||
fpos = case.partner_id.property_account_position and case.partner_id.property_account_position.id or False
|
||||
partner_addr = partner_obj.address_get(cr, uid, [case.partner_id.id],
|
||||
['invoice', 'delivery', 'contact'])
|
||||
pricelist = partner_obj.browse(cr, uid, case.partner_id.id,
|
||||
context).property_product_pricelist.id
|
||||
else:
|
||||
partner_id = data['form']['partner_id']
|
||||
fpos = fpos_data and fpos_data.id or False
|
||||
partner_addr = default_partner_addr
|
||||
pricelist = default_pricelist
|
||||
|
||||
if False in partner_addr.values():
|
||||
raise wizard.except_wizard(_('Data Insufficient!'),_('Customer has no addresses defined!'))
|
||||
|
||||
vals = {
|
||||
'origin': 'CRM-Opportunity:%s' % str(case.id),
|
||||
'section_id': case.section_id and case.section_id.id or False,
|
||||
'picking_policy': data['form']['picking_policy'],
|
||||
'shop_id': data['form']['shop_id'],
|
||||
'partner_id': partner_id,
|
||||
'pricelist_id': pricelist,
|
||||
'partner_invoice_id': partner_addr['invoice'],
|
||||
'partner_order_id': partner_addr['contact'],
|
||||
'partner_shipping_id': partner_addr['delivery'],
|
||||
'order_policy': 'manual',
|
||||
'date_order': now(),
|
||||
'fiscal_position': fpos,
|
||||
}
|
||||
|
||||
if partner_id:
|
||||
partner = partner_obj.browse(cr, uid, partner_id, context=context)
|
||||
vals['user_id'] = partner.user_id and partner.user_id.id or uid
|
||||
|
||||
if data['form']['analytic_account']:
|
||||
vals['project_id'] = data['form']['analytic_account']
|
||||
|
||||
vals.update( sale_obj.onchange_partner_id(cr, uid, [], partner_id).get('value',{}) )
|
||||
new_id = sale_obj.create(cr, uid, vals)
|
||||
if data['form']['products']:
|
||||
for product_id in data['form']['products'][0][2]:
|
||||
value = {
|
||||
'price_unit': 0.0,
|
||||
'product_id': product_id,
|
||||
'order_id': new_id,
|
||||
}
|
||||
value.update( sale_line_obj.product_id_change(cr, uid, [], pricelist,product_id, qty=1, partner_id=partner_id, fiscal_position=fpos)['value'] )
|
||||
value['tax_id'] = [(6,0,value['tax_id'])]
|
||||
sale_line_obj.create(cr, uid, value)
|
||||
|
||||
case_obj.write(cr, uid, [case.id], {'ref': 'sale.order,%s' % new_id})
|
||||
case._table.log(cr, uid, case.id, "Opportunity '" + case.name + "' is converted into Sale Order: " + str(new_id) , context=context)
|
||||
new_ids.append(new_id)
|
||||
|
||||
if data['form']['close']:
|
||||
case_obj.case_close(cr, uid, data['ids'])
|
||||
|
||||
if not new_ids:
|
||||
return {}
|
||||
|
||||
if len(new_ids)<=1:
|
||||
value = {
|
||||
'domain': str([('id', 'in', new_ids)]),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'form',
|
||||
'res_model': 'sale.order',
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_id': new_ids and new_ids[0]
|
||||
}
|
||||
else:
|
||||
value = {
|
||||
'domain': str([('id', 'in', new_ids)]),
|
||||
'view_type': 'form',
|
||||
'view_mode': 'tree,form',
|
||||
'res_model': 'sale.order',
|
||||
'view_id': False,
|
||||
'type': 'ir.actions.act_window',
|
||||
'res_id':new_ids
|
||||
}
|
||||
|
||||
return value
|
||||
|
||||
states = {
|
||||
'init': {
|
||||
'actions': [_selectPartner],
|
||||
'result': {'type': 'form', 'arch': sale_form, 'fields': sale_fields,
|
||||
'state' : [('end', 'Cancel', 'gtk-cancel'),('order', 'Create', 'gtk-apply')]}
|
||||
},
|
||||
'order': {
|
||||
'actions': [],
|
||||
'result': {'type': 'action', 'action': _makeOrder, 'state': 'end'}
|
||||
}
|
||||
}
|
||||
|
||||
make_sale('crm.opportunity.make_order')
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
+22
-11
@@ -130,19 +130,23 @@
|
||||
string="Basic Wiki Editing" icon="gtk-ok" />
|
||||
</group>
|
||||
<group col="8" colspan="4">
|
||||
<field name="group_id" select="1" on_change="onchange_group_id(group_id, text_area)"/>
|
||||
<field name="group_id" string="Topic" select="1" on_change="onchange_group_id(group_id, text_area)"/>
|
||||
<field name="section" invisible="not context.get('section',False)"/>
|
||||
<field name="parent_id"/>
|
||||
<!-- <field name="parent_id"/>-->
|
||||
</group>
|
||||
<separator colspan="4" string="Informations"/>
|
||||
<field name="text_area" nolabel="1" colspan="4" select="1" widget="text_wiki"/>
|
||||
<notebook colspan="4">
|
||||
<page string="Content">
|
||||
<separator colspan="4" string="Informations"/>
|
||||
<field name="text_area" nolabel="1" colspan="4" select="1" widget="text_wiki"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<separator colspan="4" string="Modifications"/>
|
||||
<group col="6" colspan="4">
|
||||
<group col="4" colspan="4">
|
||||
<field name="write_date" readonly="1"/>
|
||||
<field name="review" select="1"/>
|
||||
<field name="toc"/>
|
||||
<field name="tags" select="1" groups="base.group_extended"/>
|
||||
<field name="summary" colspan="4" groups="base.group_extended"/>
|
||||
<field name="toc"/>
|
||||
<!-- <field name="summary" colspan="4" groups="base.group_extended"/>-->
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
@@ -156,13 +160,20 @@
|
||||
<field name="type">search</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Wiki">
|
||||
<group col='8' colspan='4'>
|
||||
<filter icon="terp-check" string="Need Review" domain="[('review','=',True)]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="section" select="1"/>
|
||||
<field name="name" select="1"/>
|
||||
<field name="group_id" select="1"/>
|
||||
<field name="text_area" select="1"/>
|
||||
<field name="write_uid" select="1"/>
|
||||
<field name="write_date" select="1"/>
|
||||
<field name="review" select="1"/>
|
||||
<field name="create_uid" widget="selection" select="1"/>
|
||||
<!-- <field name="create_uid" widget="selection" select="1"/>-->
|
||||
<newline/>
|
||||
<group expand="0" string="Group By..." colspan="8" col="6">
|
||||
<filter icon="terp-check" string="Wiki Group" domain="[]" context="{'group_by':'group_id'}"/>
|
||||
<filter icon="terp-personal" string="Author" domain="[]" context="{'group_by':'create_uid'}"/>
|
||||
<filter icon="terp-personal-" string="Last Author" domain="[]" context="{'group_by':'write_uid'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
@@ -176,7 +187,7 @@
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="view_wiki_tree"/>
|
||||
<field name="context">{'section':'1','search_default_create_uid':uid}</field>
|
||||
<!-- <field name="context">{'section':'1','search_default_create_uid':uid}</field>-->
|
||||
<field name="search_view_id" ref="view_wiki_filter"/>
|
||||
</record>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user