[MERGE] merge from dev3
bzr revid: ara@tinyerp.com-20101214070607-iibxk70rfuhq0vv5
This commit is contained in:
+19
-19
@@ -289,20 +289,20 @@ class account_account(osv.osv):
|
||||
sums = {}
|
||||
while brs:
|
||||
current = brs[0]
|
||||
can_compute = True
|
||||
for child in current.child_id:
|
||||
if child.id not in sums:
|
||||
can_compute = False
|
||||
try:
|
||||
brs.insert(0, brs.pop(brs.index(child)))
|
||||
except ValueError:
|
||||
brs.insert(0, child)
|
||||
if can_compute:
|
||||
brs.pop(0)
|
||||
for fn in field_names:
|
||||
sums.setdefault(current.id, {})[fn] = accounts.get(current.id, {}).get(fn, 0.0)
|
||||
if current.child_id:
|
||||
sums[current.id][fn] += sum(sums[child.id][fn] for child in current.child_id)
|
||||
# can_compute = True
|
||||
# for child in current.child_id:
|
||||
# if child.id not in sums:
|
||||
# can_compute = False
|
||||
# try:
|
||||
# brs.insert(0, brs.pop(brs.index(child)))
|
||||
# except ValueError:
|
||||
# brs.insert(0, child)
|
||||
# if can_compute:
|
||||
brs.pop(0)
|
||||
for fn in field_names:
|
||||
sums.setdefault(current.id, {})[fn] = accounts.get(current.id, {}).get(fn, 0.0)
|
||||
if current.child_id:
|
||||
sums[current.id][fn] += sum(sums[child.id][fn] for child in current.child_id)
|
||||
res = {}
|
||||
null_result = dict((fn, 0.0) for fn in field_names)
|
||||
for id in ids:
|
||||
@@ -2678,7 +2678,8 @@ class wizard_multi_charts_accounts(osv.osv_memory):
|
||||
tax_template_ref[tax.id] = new_tax
|
||||
|
||||
#deactivate the parent_store functionnality on account_account for rapidity purpose
|
||||
self.pool._init = True
|
||||
ctx = context and context.copy() or {}
|
||||
ctx['defer_parent_store_computation'] = True
|
||||
|
||||
children_acc_template = obj_acc_template.search(cr, uid, [('parent_id','child_of',[obj_acc_root.id]),('nocreate','!=',True)])
|
||||
children_acc_template.sort()
|
||||
@@ -2706,10 +2707,9 @@ class wizard_multi_charts_accounts(osv.osv_memory):
|
||||
'tax_ids': [(6,0,tax_ids)],
|
||||
'company_id': company_id,
|
||||
}
|
||||
new_account = obj_acc.create(cr, uid, vals)
|
||||
new_account = obj_acc.create(cr, uid, vals, context=ctx)
|
||||
acc_template_ref[account_template.id] = new_account
|
||||
#reactivate the parent_store functionnality on account_account
|
||||
self.pool._init = False
|
||||
self.pool.get('account.account')._parent_store_compute(cr)
|
||||
|
||||
for key,value in todo_dict.items():
|
||||
@@ -2857,7 +2857,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
|
||||
'name': tmp,
|
||||
'currency_id': line.currency_id and line.currency_id.id or False,
|
||||
'code': new_code,
|
||||
'type': 'other',
|
||||
'type': 'liquidity',
|
||||
'user_type': account_template.user_type and account_template.user_type.id or False,
|
||||
'reconcile': True,
|
||||
'parent_id': acc_template_ref[ref_acc_bank.id] or False,
|
||||
@@ -2879,7 +2879,7 @@ class wizard_multi_charts_accounts(osv.osv_memory):
|
||||
vals_journal['name']= vals['name']
|
||||
vals_journal['code']= _('BNK') + str(current_num)
|
||||
vals_journal['sequence_id'] = seq_id
|
||||
vals_journal['type'] = 'cash'
|
||||
vals_journal['type'] = line.account_type == 'cash' and 'cash' or 'bank'
|
||||
vals_journal['company_id'] = company_id
|
||||
vals_journal['analytic_journal_id'] = analitical_journal_bank
|
||||
|
||||
|
||||
@@ -757,7 +757,7 @@ class account_move_line(osv.osv):
|
||||
if 'comment' in context and context['comment']:
|
||||
libelle = context['comment']
|
||||
else:
|
||||
libelle = 'Write-Off'
|
||||
libelle = _('Write-Off')
|
||||
writeoff_lines = [
|
||||
(0, 0, {
|
||||
'name': libelle,
|
||||
|
||||
@@ -219,7 +219,8 @@ class account_installer(osv.osv_memory):
|
||||
tax_template_ref[tax.id] = new_tax
|
||||
|
||||
#deactivate the parent_store functionnality on account_account for rapidity purpose
|
||||
self.pool._init = True
|
||||
ctx = context and context.copy() or {}
|
||||
ctx['defer_parent_store_computation'] = True
|
||||
|
||||
children_acc_template = obj_acc_template.search(cr, uid, [('parent_id', 'child_of', [obj_acc_root.id]), ('nocreate', '!=', True)], context=context)
|
||||
children_acc_template.sort()
|
||||
@@ -248,7 +249,7 @@ class account_installer(osv.osv_memory):
|
||||
'tax_ids': [(6, 0, tax_ids)],
|
||||
'company_id': company_id.id,
|
||||
}
|
||||
new_account = obj_acc.create(cr, uid, vals, context=context)
|
||||
new_account = obj_acc.create(cr, uid, vals, context=ctx)
|
||||
acc_template_ref[account_template.id] = new_account
|
||||
if account_template.name == 'Bank Current Account':
|
||||
b_vals = {
|
||||
@@ -262,8 +263,7 @@ class account_installer(osv.osv_memory):
|
||||
'tax_ids': [(6,0,tax_ids)],
|
||||
'company_id': company_id.id,
|
||||
}
|
||||
bank_account = obj_acc.create(cr, uid, b_vals, context=context)
|
||||
|
||||
bank_account = obj_acc.create(cr, uid, b_vals, context=ctx)
|
||||
|
||||
view_id_cash = obj_acc_journal_view.search(cr, uid, [('name', '=', 'Bank/Cash Journal View')], context=context)[0] #why fixed name here?
|
||||
view_id_cur = obj_acc_journal_view.search(cr, uid, [('name', '=', 'Bank/Cash Journal (Multi-Currency) View')], context=context)[0] #Why Fixed name here?
|
||||
@@ -333,7 +333,7 @@ class account_installer(osv.osv_memory):
|
||||
'parent_id': bank_account,
|
||||
'company_id': company_id.id
|
||||
}
|
||||
child_bnk_acc = obj_acc.create(cr, uid, vals_bnk, context=context)
|
||||
child_bnk_acc = obj_acc.create(cr, uid, vals_bnk, context=ctx)
|
||||
vals_seq_child = {
|
||||
'name': _(vals_bnk['name'] + ' ' + 'Journal'),
|
||||
'code': 'account.journal',
|
||||
@@ -367,7 +367,6 @@ class account_installer(osv.osv_memory):
|
||||
code_cnt += 1
|
||||
|
||||
#reactivate the parent_store functionality on account_account
|
||||
self.pool._init = False
|
||||
obj_acc._parent_store_compute(cr)
|
||||
|
||||
for key, value in todo_dict.items():
|
||||
|
||||
@@ -268,21 +268,21 @@ class account_invoice(osv.osv):
|
||||
store={
|
||||
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
|
||||
'account.invoice.tax': (_get_invoice_tax, None, 20),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 20),
|
||||
},
|
||||
multi='all'),
|
||||
'amount_tax': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'), string='Tax',
|
||||
store={
|
||||
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
|
||||
'account.invoice.tax': (_get_invoice_tax, None, 20),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 20),
|
||||
},
|
||||
multi='all'),
|
||||
'amount_total': fields.function(_amount_all, method=True, digits_compute=dp.get_precision('Account'), string='Total',
|
||||
store={
|
||||
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 20),
|
||||
'account.invoice.tax': (_get_invoice_tax, None, 20),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 20),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 20),
|
||||
},
|
||||
multi='all'),
|
||||
'currency_id': fields.many2one('res.currency', 'Currency', required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
||||
@@ -302,7 +302,7 @@ class account_invoice(osv.osv):
|
||||
store={
|
||||
'account.invoice': (lambda self, cr, uid, ids, c={}: ids, ['invoice_line'], 50),
|
||||
'account.invoice.tax': (_get_invoice_tax, None, 50),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount'], 50),
|
||||
'account.invoice.line': (_get_invoice_line, ['price_unit','invoice_line_tax_id','quantity','discount','invoice_id'], 50),
|
||||
'account.move.line': (_get_invoice_from_line, None, 50),
|
||||
'account.move.reconcile': (_get_invoice_from_reconcile, None, 50),
|
||||
},
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
domain="['|', ('type','=','out_invoice'),('type','=','out_refund')]"
|
||||
help="Customer Invoices And Refunds"/>
|
||||
<filter icon="terp-personal"
|
||||
string="supplier"
|
||||
string="Supplier"
|
||||
separator="1"
|
||||
domain="['|', ('type','=','in_invoice'),('type','=','in_refund')]"
|
||||
help="Supplier Invoices And Refunds"/>
|
||||
|
||||
@@ -23,10 +23,11 @@ import time
|
||||
from lxml import etree
|
||||
|
||||
import netsvc
|
||||
from osv import fields
|
||||
from osv import osv
|
||||
from osv import osv, fields
|
||||
import decimal_precision as dp
|
||||
from tools.translate import _
|
||||
|
||||
|
||||
class account_move_line(osv.osv):
|
||||
_inherit = 'account.move.line'
|
||||
|
||||
@@ -145,18 +146,29 @@ class account_voucher(osv.osv):
|
||||
res['arch'] = etree.tostring(doc)
|
||||
return res
|
||||
|
||||
def _compute_writeoff_amount(self, cr, uid, line_dr_ids, line_cr_ids, amount):
|
||||
debit = credit = 0.0
|
||||
for l in line_dr_ids:
|
||||
debit += l['amount']
|
||||
for l in line_cr_ids:
|
||||
credit += l['amount']
|
||||
return abs(amount - abs(credit - debit))
|
||||
|
||||
def onchange_line_ids(self, cr, uid, ids, line_dr_ids, line_cr_ids, amount):
|
||||
line_dr_ids = [x[2] for x in line_dr_ids]
|
||||
line_cr_ids = [x[2] for x in line_cr_ids]
|
||||
return {'value': {'writeoff_amount': self._compute_writeoff_amount(cr, uid, line_dr_ids, line_cr_ids, amount)}}
|
||||
|
||||
def _get_writeoff_amount(self, cr, uid, ids, name, args, context=None):
|
||||
if not ids: return {}
|
||||
res = {}
|
||||
debit = credit = 0.0
|
||||
for voucher in self.browse(cr, uid, ids, context=context):
|
||||
debit= credit = 0.0
|
||||
if voucher.line_dr_ids:
|
||||
for line in voucher.line_dr_ids:
|
||||
debit += line.amount_unreconciled
|
||||
if voucher.line_cr_ids:
|
||||
for line in voucher.line_cr_ids:
|
||||
credit += line.amount_unreconciled
|
||||
res[voucher.id] = abs(voucher.amount - abs(credit - debit))
|
||||
for l in voucher.line_dr_ids:
|
||||
debit += l.amount
|
||||
for l in voucher.line_cr_ids:
|
||||
credit += l.amount
|
||||
res[voucher.id] = abs(voucher.amount - abs(credit - debit))
|
||||
return res
|
||||
|
||||
_name = 'account.voucher'
|
||||
@@ -194,8 +206,8 @@ class account_voucher(osv.osv):
|
||||
\n* The \'Pro-forma\' when voucher is in Pro-forma state,voucher does not have an voucher number. \
|
||||
\n* The \'Posted\' state is used when user create voucher,a voucher number is generated and voucher entries are created in account \
|
||||
\n* The \'Cancelled\' state is used when user cancel voucher.'),
|
||||
'amount': fields.float('Total', digits=(16, 2), required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'tax_amount':fields.float('Tax Amount', digits=(14,2), readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'amount': fields.float('Total', digits_compute=dp.get_precision('Account'), required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'tax_amount':fields.float('Tax Amount', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'reference': fields.char('Ref #', size=64, readonly=True, states={'draft':[('readonly',False)]}, help="Transaction reference number."),
|
||||
'number': fields.char('Number', size=32, readonly=True,),
|
||||
'move_id':fields.many2one('account.move', 'Account Entry'),
|
||||
@@ -210,14 +222,13 @@ class account_voucher(osv.osv):
|
||||
'pre_line':fields.boolean('Previous Payments ?', required=False),
|
||||
'date_due': fields.date('Due Date', readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'payment_option':fields.selection([
|
||||
('without_writeoff', 'Without Write-off'),
|
||||
('with_writeoff', 'With Write-off'),
|
||||
], 'Payment Option', required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
||||
('without_writeoff', 'Keep Open'),
|
||||
('with_writeoff', 'Reconcile with Write-Off'),
|
||||
], 'Payment Difference', required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'writeoff_acc_id': fields.many2one('account.account', 'Write-Off account', readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'writeoff_journal_id': fields.many2one('account.journal', 'Write-Off journal', readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'comment': fields.char('Comment', size=64, readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'analytic_id': fields.many2one('account.analytic.account','Analytic Account', readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'writeoff_amount': fields.function(_get_writeoff_amount, method=True, string='Writeoff Amount', type='float', readonly=True),
|
||||
'comment': fields.char('Write-Off Comment', size=64, required=True, readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'analytic_id': fields.many2one('account.analytic.account','Write-Off Analytic Account', readonly=True, states={'draft': [('readonly', False)]}),
|
||||
'writeoff_amount': fields.function(_get_writeoff_amount, method=True, string='Write-Off Amount', type='float', readonly=True),
|
||||
}
|
||||
_defaults = {
|
||||
'period_id': _get_period,
|
||||
@@ -235,7 +246,7 @@ class account_voucher(osv.osv):
|
||||
'company_id': lambda self,cr,uid,c: self.pool.get('res.company')._company_default_get(cr, uid, 'account.voucher',context=c),
|
||||
'tax_id': _get_tax,
|
||||
'payment_option': 'without_writeoff',
|
||||
'comment': 'Write-Off',
|
||||
'comment': _('Write-Off'),
|
||||
}
|
||||
|
||||
def compute_tax(self, cr, uid, ids, context={}):
|
||||
@@ -390,13 +401,17 @@ class account_voucher(osv.osv):
|
||||
|
||||
@return: Returns a dict which contains new values, and context
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
if not journal_id:
|
||||
return {}
|
||||
|
||||
if context is None:
|
||||
context = {}
|
||||
currency_pool = self.pool.get('res.currency')
|
||||
line_pool = self.pool.get('account.voucher.line')
|
||||
line_ids = ids and line_pool.search(cr, uid, [('voucher_id', '=', ids[0])]) or False
|
||||
if line_ids:
|
||||
line_pool.unlink(cr, uid, line_ids)
|
||||
|
||||
currency_pool = self.pool.get('res.currency')
|
||||
move_line_pool = self.pool.get('account.move.line')
|
||||
partner_pool = self.pool.get('res.partner')
|
||||
journal_pool = self.pool.get('account.journal')
|
||||
@@ -410,13 +425,6 @@ class account_voucher(osv.osv):
|
||||
|
||||
if not partner_id:
|
||||
return default
|
||||
|
||||
if not partner_id and ids:
|
||||
line_ids = line_pool.search(cr, uid, [('voucher_id', '=', ids[0])])
|
||||
if line_ids:
|
||||
line_pool.unlink(cr, uid, line_ids)
|
||||
return default
|
||||
|
||||
journal = journal_pool.browse(cr, uid, journal_id)
|
||||
partner = partner_pool.browse(cr, uid, partner_id)
|
||||
account_id = False
|
||||
@@ -449,16 +457,6 @@ class account_voucher(osv.osv):
|
||||
ids.reverse()
|
||||
moves = move_line_pool.browse(cr, uid, ids)
|
||||
|
||||
priority_moves = []
|
||||
unpriority_moves = []
|
||||
for line in moves:
|
||||
original_amount = line.credit or line.debit or 0.0
|
||||
if original_amount == price:
|
||||
priority_moves.append(line)
|
||||
else:
|
||||
unpriority_moves.append(line)
|
||||
moves = priority_moves + unpriority_moves
|
||||
|
||||
company_currency = journal.company_id.currency_id.id
|
||||
if company_currency != currency_id and ttype == 'payment':
|
||||
total_debit = currency_pool.compute(cr, uid, currency_id, company_currency, total_debit)
|
||||
@@ -509,6 +507,8 @@ class account_voucher(osv.osv):
|
||||
default['value']['pre_line'] = 1
|
||||
elif ttype == 'receipt' and len(default['value']['line_dr_ids']) > 0:
|
||||
default['value']['pre_line'] = 1
|
||||
default['value']['writeoff_amount'] = self._compute_writeoff_amount(cr, uid, default['value']['line_dr_ids'], default['value']['line_cr_ids'], price)
|
||||
|
||||
return default
|
||||
|
||||
def onchange_date(self, cr, user, ids, date, context={}):
|
||||
@@ -734,16 +734,20 @@ class account_voucher(osv.osv):
|
||||
if line.move_line_id.id:
|
||||
rec_ids = [master_line, line.move_line_id.id]
|
||||
rec_list_ids.append(rec_ids)
|
||||
writeoff_account_id = False
|
||||
writeoff_journal_id = False
|
||||
writeoff_period_id = inv.period_id.id,
|
||||
comment = False
|
||||
|
||||
if not currency_pool.is_zero(cr, uid, inv.currency_id, line_total):
|
||||
diff = line_total
|
||||
account_id = False
|
||||
if inv.payment_option == 'with_writeoff':
|
||||
account_id = inv.writeoff_acc_id.id
|
||||
elif inv.type in ('sale', 'receipt'):
|
||||
# if inv.journal_id.type in ('sale','sale_refund', 'cash', 'bank'):
|
||||
account_id = inv.partner_id.property_account_receivable.id
|
||||
else:
|
||||
account_id = inv.partner_id.property_account_payable.id
|
||||
move_line = {
|
||||
'name': name,
|
||||
'account_id': False,
|
||||
'account_id': account_id,
|
||||
'move_id': move_id,
|
||||
'partner_id': inv.partner_id.id,
|
||||
'date': inv.date,
|
||||
@@ -752,24 +756,8 @@ class account_voucher(osv.osv):
|
||||
'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1) or 0.0,
|
||||
'currency_id': company_currency <> current_currency and current_currency or False,
|
||||
}
|
||||
account_id = False
|
||||
if inv.type in ('sale', 'receipt'):
|
||||
# if inv.journal_id.type in ('sale','sale_refund', 'cash', 'bank'):
|
||||
account_id = inv.partner_id.property_account_receivable.id
|
||||
else:
|
||||
account_id = inv.partner_id.property_account_payable.id
|
||||
move_line['account_id'] = account_id
|
||||
|
||||
move_line_pool.create(cr, uid, move_line)
|
||||
for rec_ids in rec_list_ids:
|
||||
if len(rec_ids) >= 2:
|
||||
if inv.payment_option == 'with_writeoff':
|
||||
writeoff_account_id = inv.writeoff_acc_id.id
|
||||
writeoff_journal_id = inv.writeoff_journal_id.id
|
||||
comment = inv.comment
|
||||
move_line_pool.reconcile(cr, uid, rec_ids, 'manual', writeoff_account_id, writeoff_period_id, writeoff_journal_id, context)
|
||||
else:
|
||||
move_line_pool.reconcile_partial(cr, uid, rec_ids)
|
||||
|
||||
self.write(cr, uid, [inv.id], {
|
||||
'move_id': move_id,
|
||||
@@ -777,6 +765,9 @@ class account_voucher(osv.osv):
|
||||
'number': name,
|
||||
})
|
||||
move_pool.post(cr, uid, [move_id], context={})
|
||||
for rec_ids in rec_list_ids:
|
||||
if len(rec_ids) >= 2:
|
||||
move_line_pool.reconcile_partial(cr, uid, rec_ids)
|
||||
return True
|
||||
|
||||
def copy(self, cr, uid, id, default={}, context=None):
|
||||
@@ -828,7 +819,7 @@ class account_voucher_line(osv.osv):
|
||||
'account_id':fields.many2one('account.account','Account', required=True),
|
||||
'partner_id':fields.related('voucher_id', 'partner_id', type='many2one', relation='res.partner', string='Partner'),
|
||||
'untax_amount':fields.float('Untax Amount'),
|
||||
'amount':fields.float('Amount', digits=(14,2)),
|
||||
'amount':fields.float('Amount', digits_compute=dp.get_precision('Account')),
|
||||
'type':fields.selection([('dr','Debit'),('cr','Credit')], 'Cr/Dr'),
|
||||
'account_analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
|
||||
'move_line_id': fields.many2one('account.move.line', 'Journal Item'),
|
||||
@@ -993,4 +984,4 @@ class account_bank_statement_line(osv.osv):
|
||||
|
||||
account_bank_statement_line()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -70,8 +70,21 @@
|
||||
<field name="period_id"/>
|
||||
<field name="audit"/>
|
||||
</group>
|
||||
<separator string="Journal Items" colspan="4"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1">
|
||||
<tree string="Journal Items">
|
||||
<field name="move_id"/>
|
||||
<field name="ref"/>
|
||||
<field name="date"/>
|
||||
<field name="statement_id"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="account_id"/>
|
||||
<field name="name"/>
|
||||
<field name="debit"/>
|
||||
<field name="credit"/>
|
||||
<field name="state"/>
|
||||
<field name="reconcile_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="10" colspan="4">
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Payment Information">
|
||||
<field name="line_dr_ids" attrs="{'invisible': [('type', '=', 'receipt')]}" default_get="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" colspan="4" nolabel="1" height="140">
|
||||
<field name="line_dr_ids" attrs="{'invisible': [('type', '=', 'receipt')]}" default_get="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" colspan="4" nolabel="1" height="140" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount)">
|
||||
<tree string="Open Supplier Journal Entries" editable="bottom">
|
||||
<field name="move_line_id" context="{'journal_id':parent.journal_id, 'partner_id':parent.partner_id}"
|
||||
on_change="onchange_move_line_id(move_line_id)"
|
||||
@@ -119,7 +119,7 @@
|
||||
<field name="amount" sum="Payment"/>
|
||||
</tree>
|
||||
</field>
|
||||
<field name="line_cr_ids" colspan="4" nolabel="1" attrs="{'invisible': [('type', '=', 'payment')]}" default_get="{'journal_id':journal_id, 'partner_id':partner_id}">
|
||||
<field name="line_cr_ids" colspan="4" nolabel="1" attrs="{'invisible': [('type', '=', 'payment')]}" default_get="{'journal_id':journal_id, 'partner_id':partner_id}" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount)">
|
||||
<tree string="Open Customer Journal Entries" editable="bottom">
|
||||
<field name="move_line_id"/>
|
||||
<field name="account_id" groups="base.group_extended" domain="[('type','=','receivable')]"/>
|
||||
@@ -198,22 +198,18 @@
|
||||
<group col="2" colspan="1">
|
||||
<group col="2" colspan="1">
|
||||
<separator string="Payment Options" colspan="2"/>
|
||||
<field name="payment_option" required="1"/>
|
||||
<field name="writeoff_amount"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
|
||||
<field name="payment_option" required="1"/>
|
||||
<field name="writeoff_acc_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
|
||||
domain="[('type','=','liquidity')]"/>
|
||||
<!-- should select income accounts only. Or use the journal for this ? -->
|
||||
<field name="writeoff_journal_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"/>
|
||||
domain="[('type','=','other')]"/>
|
||||
<field name="comment"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
|
||||
<field name="analytic_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"
|
||||
groups="analytic.group_analytic_accounting"/>
|
||||
</group>
|
||||
<separator string="Other Information" colspan="2"/>
|
||||
<group col="4" colspan="1">
|
||||
<field name="date" select="1" on_change="onchange_date(date)"/>
|
||||
<field name="currency_id" invisible="True"/>
|
||||
@@ -227,8 +223,21 @@
|
||||
<field name="period_id"/>
|
||||
<field name="audit"/>
|
||||
</group>
|
||||
<separator string="Journal Items" colspan="4"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1">
|
||||
<tree string="Journal Items">
|
||||
<field name="move_id"/>
|
||||
<field name="ref"/>
|
||||
<field name="date"/>
|
||||
<field name="statement_id"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="account_id"/>
|
||||
<field name="name"/>
|
||||
<field name="debit"/>
|
||||
<field name="credit"/>
|
||||
<field name="state"/>
|
||||
<field name="reconcile_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="10" colspan="4">
|
||||
@@ -295,7 +304,7 @@
|
||||
</group>
|
||||
<notebook colspan="4">
|
||||
<page string="Payment Information">
|
||||
<field name="line_cr_ids" default_get="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" colspan="4" nolabel="1" height="140">
|
||||
<field name="line_cr_ids" default_get="{'journal_id':journal_id, 'type':type, 'partner_id':partner_id}" colspan="4" nolabel="1" height="140" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount)">
|
||||
<tree string="Invoices and outstanding transactions" editable="bottom">
|
||||
<field name="move_line_id" context="{'journal_id':parent.journal_id, 'partner_id':parent.partner_id}"
|
||||
on_change="onchange_move_line_id(move_line_id)"
|
||||
@@ -309,7 +318,7 @@
|
||||
<field name="amount" sum="Payment"/>
|
||||
</tree>
|
||||
</field>
|
||||
<field name="line_dr_ids" colspan="4" nolabel="1" attrs="{'invisible': [('pre_line','=',False)]}" default_get="{'journal_id':journal_id, 'partner_id':partner_id}">
|
||||
<field name="line_dr_ids" colspan="4" nolabel="1" attrs="{'invisible': [('pre_line','=',False)]}" default_get="{'journal_id':journal_id, 'partner_id':partner_id}" on_change="onchange_line_ids(line_dr_ids, line_cr_ids, amount)">
|
||||
<tree string="Credits" editable="bottom">
|
||||
<field name="move_line_id"/>
|
||||
<field name="account_id" groups="base.group_extended" domain="[('type','=','receivable')]"/>
|
||||
@@ -330,10 +339,7 @@
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
|
||||
<field name="writeoff_acc_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"
|
||||
domain="[('type','=','liquidity')]"/>
|
||||
<!-- should select income accounts only. Or use the journal for this ? -->
|
||||
<field name="writeoff_journal_id"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')], 'required':[('payment_option','=','with_writeoff')]}"/>
|
||||
domain="[('type','=','other')]"/>
|
||||
<field name="comment"
|
||||
attrs="{'invisible':[('payment_option','!=','with_writeoff')]}"/>
|
||||
<field name="analytic_id"
|
||||
@@ -354,8 +360,21 @@
|
||||
<field name="period_id"/>
|
||||
<field name="audit"/>
|
||||
</group>
|
||||
<separator string="Journal Items" colspan="4"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1">
|
||||
<tree string="Journal Items">
|
||||
<field name="move_id"/>
|
||||
<field name="ref"/>
|
||||
<field name="date"/>
|
||||
<field name="statement_id"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="account_id"/>
|
||||
<field name="name"/>
|
||||
<field name="debit"/>
|
||||
<field name="credit"/>
|
||||
<field name="state"/>
|
||||
<field name="reconcile_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="10" colspan="4">
|
||||
|
||||
@@ -144,8 +144,21 @@
|
||||
<field name="period_id"/>
|
||||
<field name="audit"/>
|
||||
</group>
|
||||
<separator string="Journal Items" colspan="4"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1">
|
||||
<tree string="Journal Items">
|
||||
<field name="move_id"/>
|
||||
<field name="ref"/>
|
||||
<field name="date"/>
|
||||
<field name="statement_id"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="account_id"/>
|
||||
<field name="name"/>
|
||||
<field name="debit"/>
|
||||
<field name="credit"/>
|
||||
<field name="state"/>
|
||||
<field name="reconcile_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="8" colspan="4">
|
||||
@@ -251,8 +264,21 @@
|
||||
<field name="period_id"/>
|
||||
<field name="audit"/>
|
||||
</group>
|
||||
<separator string="Journal Items" colspan="4"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1"/>
|
||||
<field name="move_ids" colspan="4" nolabel="1" readonly="1">
|
||||
<tree string="Journal Items">
|
||||
<field name="move_id"/>
|
||||
<field name="ref"/>
|
||||
<field name="date"/>
|
||||
<field name="statement_id"/>
|
||||
<field name="partner_id"/>
|
||||
<field name="account_id"/>
|
||||
<field name="name"/>
|
||||
<field name="debit"/>
|
||||
<field name="credit"/>
|
||||
<field name="state"/>
|
||||
<field name="reconcile_id"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="10" colspan="4">
|
||||
|
||||
Binary file not shown.
@@ -54,11 +54,11 @@ class Change:
|
||||
def __init__(self, aVal= None, sURL=""):
|
||||
self.win=DBModalDialog(60, 50, 120, 90, "Connect to Open ERP Server")
|
||||
|
||||
self.win.addFixedText("lblVariable", 38, 12, 60, 15, "Server")
|
||||
self.win.addFixedText("lblVariable", 38, 12, 25, 15, "Server ")
|
||||
|
||||
self.win.addEdit("txtHost",-2,9,60,15,sURL[sURL.find("/")+2:sURL.rfind(":")])
|
||||
|
||||
self.win.addFixedText("lblReportName",45 , 31, 60, 15, "Port")
|
||||
self.win.addFixedText("lblReportName",45 , 31, 15, 15, "Port ")
|
||||
self.win.addEdit("txtPort",-2,28,60,15,sURL[sURL.rfind(":")+1:])
|
||||
|
||||
self.win.addFixedText("lblLoginName", 2, 51, 60, 15, "Protocol Connection")
|
||||
@@ -92,6 +92,8 @@ class Change:
|
||||
global url
|
||||
url = self.protocol[self.win.getListBoxSelectedItem("lstProtocol")]+self.win.getEditText("txtHost")+":"+self.win.getEditText("txtPort")
|
||||
self.sock=RPCSession(url)
|
||||
desktop=getDesktop()
|
||||
doc = desktop.getCurrentComponent()
|
||||
docinfo=doc.getDocumentInfo()
|
||||
docinfo.setUserFieldValue(0,url)
|
||||
res=self.sock.listdb()
|
||||
|
||||
+4
@@ -192,6 +192,10 @@ class ServerParameter( unohelper.Base, XJobExecutor ):
|
||||
Change(aVal,url)
|
||||
if aVal[1]== -1:
|
||||
self.win.getEditText("lstDatabase")
|
||||
self.win.removeListBoxItems("lstDatabase", 0, self.win.getListBoxItemCount("lstDatabase"))
|
||||
self.win.setEditText("txtHost",aVal[0])
|
||||
for i in range(len(aVal[1])):
|
||||
self.lstDatabase.addItem(aVal[1][i],i)
|
||||
elif aVal[1]==0:
|
||||
ErrorDialog(aVal[0],"")
|
||||
else:
|
||||
|
||||
+62
-60
@@ -22,6 +22,7 @@
|
||||
import time
|
||||
import base64
|
||||
import tools
|
||||
|
||||
from osv import fields
|
||||
from osv import osv
|
||||
from tools.translate import _
|
||||
@@ -135,6 +136,52 @@ class crm_case(object):
|
||||
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
|
||||
return user.context_section_id.id or False
|
||||
|
||||
def _find_next_stage(self, cr, uid, stage_list, index, current_seq, stage_pool, context=None):
|
||||
if index + 1 == len(stage_list):
|
||||
return False
|
||||
next_stage_id = stage_list[index + 1]
|
||||
next_stage = stage_pool.browse(cr, uid, next_stage_id, context=context)
|
||||
if not next_stage:
|
||||
return False
|
||||
|
||||
next_seq = next_stage.sequence
|
||||
if (abs(next_seq - current_seq)) >= 1:
|
||||
return next_stage
|
||||
else :
|
||||
return self._find_next_stage(cr, uid, stage_list, index + 1, current_seq, stage_pool)
|
||||
|
||||
def stage_change(self, cr, uid, ids, context=None, order='sequence'):
|
||||
if not context:
|
||||
context = {}
|
||||
stage_pool = self.pool.get('crm.case.stage')
|
||||
stage_type = context and context.get('stage_type','')
|
||||
current_seq = False
|
||||
next_stage_id = False
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
next_stage = False
|
||||
data = {}
|
||||
|
||||
domain = [('type', '=', stage_type),('section_ids', '=', case.section_id.id)]
|
||||
if case.section_id and case.section_id.stage_ids:
|
||||
domain.append(('id', 'in', map(lambda x: x.id, case.section_id.stage_ids)))
|
||||
|
||||
stages = stage_pool.search(cr, uid, domain, order=order)
|
||||
current_seq = case.stage_id.sequence
|
||||
index = -1
|
||||
if case.stage_id and case.stage_id.id in stages:
|
||||
index = stages.index(case.stage_id.id)
|
||||
|
||||
next_stage = self._find_next_stage(cr, uid, stages, index, current_seq, stage_pool, context=context)
|
||||
if next_stage:
|
||||
next_stage_id = next_stage.id
|
||||
data = {'stage_id': next_stage.id}
|
||||
if next_stage.on_change:
|
||||
data.update({'probability': next_stage.probability})
|
||||
self.write(cr, uid, [case.id], data, context=context)
|
||||
|
||||
return next_stage_id
|
||||
|
||||
|
||||
def stage_next(self, cr, uid, ids, context=None):
|
||||
"""This function computes next stage for case from its current stage
|
||||
using available stage for that case type
|
||||
@@ -143,32 +190,10 @@ class crm_case(object):
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
if not context:
|
||||
context = {}
|
||||
stage_pool = self.pool.get('crm.case.stage')
|
||||
model = self._name
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
next_stage = False
|
||||
data = {}
|
||||
domain = [('object_id.model', '=', model),('section_ids', '=', case.section_id.id)]
|
||||
if case.section_id and case.section_id.stage_ids:
|
||||
domain.append(('id', 'in', map(lambda x: x.id, case.section_id.stage_ids)))
|
||||
stages = stage_pool.search(cr, uid, domain, order='sequence')
|
||||
index = -1
|
||||
if case.stage_id and case.stage_id.id in stages:
|
||||
index = stages.index(case.stage_id.id)
|
||||
if index + 1 == len(stages):
|
||||
return False
|
||||
else:
|
||||
next_stage = stages[index + 1]
|
||||
if next_stage:
|
||||
data = {'stage_id': next_stage}
|
||||
stage = stage_pool.browse(cr, uid, next_stage, context=context)
|
||||
if stage.on_change:
|
||||
data.update({'probability': stage.probability})
|
||||
self.write(cr, uid, [case.id], data, context=context)
|
||||
return next_stage
|
||||
|
||||
|
||||
|
||||
return self.stage_change(cr, uid, ids, context=context, order='sequence')
|
||||
|
||||
def stage_previous(self, cr, uid, ids, context=None):
|
||||
"""This function computes previous stage for case from its current stage
|
||||
using available stage for that case type
|
||||
@@ -177,31 +202,7 @@ class crm_case(object):
|
||||
@param uid: the current user’s ID for security checks,
|
||||
@param ids: List of case IDs
|
||||
@param context: A standard dictionary for contextual values"""
|
||||
if not context:
|
||||
context = {}
|
||||
stage_pool = self.pool.get('crm.case.stage')
|
||||
model = self._name
|
||||
for case in self.browse(cr, uid, ids, context):
|
||||
prev_stage = False
|
||||
data = {}
|
||||
domain = [('object_id.model', '=', model),('section_ids', '=', case.section_id.id)]
|
||||
if case.section_id and case.section_id.stage_ids:
|
||||
domain.append(('id', 'in', map(lambda x: x.id, case.section_id.stage_ids)))
|
||||
stages = stage_pool.search(cr, uid, domain, order='sequence')
|
||||
index = 0
|
||||
if case.stage_id and case.stage_id.id in stages:
|
||||
index = stages.index(case.stage_id.id)
|
||||
if index == 0:
|
||||
return False
|
||||
else:
|
||||
prev_stage = stages[index - 1]
|
||||
if prev_stage:
|
||||
data = {'stage_id': prev_stage}
|
||||
stage = stage_pool.browse(cr, uid, prev_stage, context=context)
|
||||
if stage.on_change:
|
||||
data.update({'probability': stage.probability})
|
||||
self.write(cr, uid, [case.id], data, context=context)
|
||||
return prev_stage
|
||||
return self.stage_change(cr, uid, ids, context=context, order='sequence desc')
|
||||
|
||||
def onchange_partner_id(self, cr, uid, ids, part, email=False):
|
||||
"""This function returns value of partner address based on partner
|
||||
@@ -482,27 +483,27 @@ class crm_case_stage(osv.osv):
|
||||
_columns = {
|
||||
'name': fields.char('Stage Name', size=64, required=True, translate=True),
|
||||
'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of case stages."),
|
||||
'object_id': fields.many2one('ir.model', 'Object Name'),
|
||||
'probability': fields.float('Probability (%)', required=True, help="This percentage depicts the default/average probability of the Case for this stage to be a success"),
|
||||
'on_change': fields.boolean('Change Probability Automatically', \
|
||||
help="Change Probability on next and previous stages."),
|
||||
'requirements': fields.text('Requirements')
|
||||
'requirements': fields.text('Requirements'),
|
||||
'type': fields.selection([('lead','Lead'),('opportunity','Opportunity'),('claim','Claim'), ('fundraising','Fundraising')], 'Type'),
|
||||
}
|
||||
def _find_object_id(self, cr, uid, context=None):
|
||||
"""Finds id for case object
|
||||
|
||||
def _find_stage_type(self, cr, uid, context=None):
|
||||
"""Finds type of stage according to object.
|
||||
@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
|
||||
"""
|
||||
object_id = context and context.get('object_id', False) or False
|
||||
ids = self.pool.get('ir.model').search(cr, uid, [('model', '=', object_id)])
|
||||
return ids and ids[0]
|
||||
type = context and context.get('type', '') or ''
|
||||
return type
|
||||
|
||||
_defaults = {
|
||||
'sequence': lambda *args: 1,
|
||||
'probability': lambda *args: 0.0,
|
||||
'object_id' : _find_object_id
|
||||
'type': _find_stage_type,
|
||||
}
|
||||
|
||||
crm_case_stage()
|
||||
@@ -531,7 +532,7 @@ class crm_case_section(osv.osv):
|
||||
'reply_to': fields.char('Reply-To', size=64, help="The email address put in the 'Reply-To' of all emails sent by OpenERP about cases in this sales team"),
|
||||
'parent_id': fields.many2one('crm.case.section', 'Parent Team'),
|
||||
'child_ids': fields.one2many('crm.case.section', 'parent_id', 'Child Teams'),
|
||||
'resource_calendar_id': fields.many2one('resource.calendar', "Resource's Calendar"),
|
||||
'resource_calendar_id': fields.many2one('resource.calendar', "Working Time"),
|
||||
'note': fields.text('Description'),
|
||||
'working_hours': fields.float('Working Hours', digits=(16,2 )),
|
||||
'stage_ids': fields.many2many('crm.case.stage', 'section_stage_rel', 'section_id', 'stage_id', 'Stages'),
|
||||
@@ -629,6 +630,7 @@ class crm_case_stage(osv.osv):
|
||||
_columns = {
|
||||
'section_ids':fields.many2many('crm.case.section', 'section_stage_rel', 'stage_id', 'section_id', 'Sections'),
|
||||
}
|
||||
|
||||
crm_case_stage()
|
||||
|
||||
|
||||
|
||||
+16
-2
@@ -135,7 +135,7 @@ class crm_lead(crm_case, osv.osv):
|
||||
],'Type', help="Type is used to separate Leads and Opportunities"),
|
||||
'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'),
|
||||
'date_closed': fields.datetime('Closed', readonly=True),
|
||||
'stage_id': fields.many2one('crm.case.stage', 'Stage'),
|
||||
'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('type','=','lead')]"),
|
||||
'user_id': fields.many2one('res.users', 'Salesman',help='By Default Salesman is Administrator when create New User'),
|
||||
'referred': fields.char('Referred By', size=64),
|
||||
'date_open': fields.datetime('Opened', readonly=True),
|
||||
@@ -150,6 +150,19 @@ class crm_lead(crm_case, osv.osv):
|
||||
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
|
||||
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
|
||||
}
|
||||
|
||||
def _get_stage_id(self, cr, uid, context=None):
|
||||
"""Finds type of stage according to object.
|
||||
@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
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
type = context and context.get('stage_type', '')
|
||||
stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('type','=',type),('sequence','>=',1)])
|
||||
return stage_ids and stage_ids[0] or False
|
||||
|
||||
_defaults = {
|
||||
'active': lambda *a: 1,
|
||||
@@ -160,6 +173,7 @@ class crm_lead(crm_case, osv.osv):
|
||||
'section_id': crm_case._get_section,
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.lead', context=c),
|
||||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||
'stage_id': _get_stage_id,
|
||||
}
|
||||
|
||||
def onchange_partner_address_id(self, cr, uid, ids, add, email=False):
|
||||
@@ -297,7 +311,7 @@ class crm_lead(crm_case, osv.osv):
|
||||
return super(crm_lead,self).write(cr, uid, ids, vals, context)
|
||||
|
||||
def stage_next(self, cr, uid, ids, context=None):
|
||||
stage = super(crm_lead, self).stage_next(cr, uid, ids, context)
|
||||
stage = super(crm_lead, self).stage_next(cr, uid, ids, context=context)
|
||||
if stage:
|
||||
stage_obj = self.pool.get('crm.case.stage').browse(cr, uid, stage, context=context)
|
||||
if stage_obj.on_change:
|
||||
|
||||
@@ -2,34 +2,39 @@
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
|
||||
<record model="crm.case.stage" id="stage_lead6">
|
||||
<field name="name">Lost</field>
|
||||
<field eval="'0'" name="probability"/>
|
||||
<field eval="'0'" name="sequence"/>
|
||||
<field name="type">lead</field>
|
||||
</record>
|
||||
<!-- CASE STATUS(stage_id) -->
|
||||
<record model="crm.case.stage" id="stage_lead1">
|
||||
<field name="name">New</field>
|
||||
<field eval="'10'" name="probability"/>
|
||||
<field eval="'1'" name="sequence"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
<field name="type">lead</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_lead2">
|
||||
<field name="name">Qualification</field>
|
||||
<field eval="'20'" name="probability"/>
|
||||
<field eval="'2'" name="sequence"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
<field name="type">lead</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_lead3">
|
||||
<field name="name">Proposition</field>
|
||||
<field eval="'40'" name="probability"/>
|
||||
<field eval="'3'" name="sequence"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
<field name="type">lead</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_lead4">
|
||||
<field name="name">Negotiation</field>
|
||||
<field eval="'60'" name="probability"/>
|
||||
<field eval="'4'" name="sequence"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
<field name="type">lead</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_lead5">
|
||||
@@ -37,15 +42,10 @@
|
||||
<field eval="'100'" name="probability"/>
|
||||
<field eval="'5'" name="sequence"/>
|
||||
<field eval="1" name="on_change"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
<field name="type">lead</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_lead6">
|
||||
<field name="name">Lost</field>
|
||||
<field eval="'0'" name="probability"/>
|
||||
<field eval="'6'" name="sequence"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
|
||||
|
||||
<record model="crm.case.section" id="section_sales_department">
|
||||
<field name="name">Sales Department</field>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<field name="domain">['|', ('type','=','lead'), ('type','=',False)]</field>
|
||||
<field name="view_id" ref="crm_case_tree_view_leads"/>
|
||||
<field name="search_view_id" ref="crm.view_crm_case_leads_filter"/>
|
||||
<field name="context">{'search_default_current':1, 'default_type': 'lead', 'search_default_section_id': section_id}</field>
|
||||
<field name="context">{'search_default_current':1, 'default_type': 'lead', 'search_default_section_id': section_id, 'stage_type': 'lead'}</field>
|
||||
<field name="help">'Leads' allows you to manage and keep track of all first potential interests of a partner in one of your products or services. A lead is a first, unqualified, contact with a prospect or customer. After being qualified, a lead can be converted into a business opportunity with the creation of the related partner for further detailed tracking of any linked activities. You can use leads when you import a database of prospects or to integrate your website's contact form with OpenERP.</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
<field name="res_model">crm.case.stage</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm.crm_case_stage_tree"/>
|
||||
<field name="domain">[('object_id.model', '=', 'crm.lead')]</field>
|
||||
<field name="context">{'object_id':'crm.lead'}</field>
|
||||
<field name="domain">[('type', '=', 'lead')]</field>
|
||||
<field name="context">{'type':'lead'}</field>
|
||||
<field name="help">Create specific stages that will help your sales better organise their sales pipeline by maintaining them to their leads and sales opportunities. It will allow them to easily track how is positioned a specific lead or opportunity in the sales cycle.</field>
|
||||
</record>
|
||||
|
||||
@@ -57,14 +57,14 @@
|
||||
<newline />
|
||||
<field name="section_id" widget="selection" />
|
||||
<field name="user_id" />
|
||||
<field name="stage_id" domain="[('object_id.model', '=', 'crm.lead'), ('section_ids', '=', section_id)]"/>
|
||||
<field name="stage_id" domain="[('type','=','lead'),('section_ids', '=', section_id)]" />
|
||||
<group col="2" colspan="1">
|
||||
<button name="stage_previous" string=""
|
||||
states="open,pending,draft" type="object"
|
||||
icon="gtk-go-back" />
|
||||
icon="gtk-go-back" context="{'stage_type': 'lead'}" />
|
||||
<button name="stage_next" string=""
|
||||
states="open,pending,draft" type="object"
|
||||
icon="gtk-go-forward" />
|
||||
icon="gtk-go-forward" context="{'stage_type': 'lead'}" />
|
||||
</group>
|
||||
<field name="type" invisible="1"/>
|
||||
</group>
|
||||
@@ -329,7 +329,7 @@
|
||||
<newline/>
|
||||
|
||||
<group expand="0" string="Extended Filters..." groups="base.group_extended">
|
||||
<field name="stage_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]"/>
|
||||
<field name="stage_id" widget="selection" domain="[('type', '=', 'lead')]"/>
|
||||
<field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="country_id" context="{'invisible_country': False}">
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<field name="rrule_type" string="Recurrency"
|
||||
colspan="1" attrs="{'readonly':[('recurrent_uid','!=',False)]}"/>
|
||||
<button string="Edit All"
|
||||
help="Edit all Ourrences of recurrent Meeting"
|
||||
help="Edit all Occurrences of recurrent Meeting"
|
||||
attrs="{'invisible':[('rrule_type','in', ('none', False))]}"
|
||||
name="open_meeting" icon="gtk-edit"
|
||||
type="object" />
|
||||
|
||||
@@ -50,7 +50,9 @@ class crm_opportunity(osv.osv):
|
||||
'date_deadline': fields.date('Expected Closing'),
|
||||
'date_action': fields.date('Next Action Date'),
|
||||
'title_action': fields.char('Next Action', size=64),
|
||||
'stage_id': fields.many2one('crm.case.stage', 'Stage', domain="[('type','=','opportunity')]"),
|
||||
}
|
||||
|
||||
def case_close(self, cr, uid, ids, *args):
|
||||
"""Overrides close for crm_case for setting probability and close date
|
||||
@param self: The object pointer
|
||||
@@ -60,7 +62,13 @@ class crm_opportunity(osv.osv):
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
res = super(crm_opportunity, self).case_close(cr, uid, ids, args)
|
||||
value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
|
||||
data_obj = self.pool.get('ir.model.data')
|
||||
data_id = data_obj._get_id(cr, uid, 'crm', 'stage_lead5')
|
||||
stage_id = data_obj.browse(cr, uid, data_id).res_id
|
||||
stage_obj = self.pool.get('crm.case.stage').browse(cr, uid, stage_id)
|
||||
value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), 'stage_id': stage_id}
|
||||
if stage_obj.on_change:
|
||||
value.update({'probability': stage_obj.probability})
|
||||
|
||||
self.write(cr, uid, ids, value)
|
||||
for (id, name) in self.name_get(cr, uid, ids):
|
||||
@@ -79,16 +87,22 @@ class crm_opportunity(osv.osv):
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
res = super(crm_opportunity, self).case_close(cr, uid, ids, args)
|
||||
value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S')}
|
||||
data_obj = self.pool.get('ir.model.data')
|
||||
data_id = data_obj._get_id(cr, uid, 'crm', 'stage_lead6')
|
||||
stage_id = data_obj.browse(cr, uid, data_id).res_id
|
||||
stage_obj = self.pool.get('crm.case.stage').browse(cr, uid, stage_id)
|
||||
value = {'date_closed': time.strftime('%Y-%m-%d %H:%M:%S'), 'stage_id': stage_id}
|
||||
if stage_obj.on_change:
|
||||
value.update({'probability': stage_obj.probability})
|
||||
|
||||
res = self.write(cr, uid, ids, value)
|
||||
self.write(cr, uid, ids, value)
|
||||
for (id, name) in self.name_get(cr, uid, ids):
|
||||
opp = self.browse(cr, uid, id)
|
||||
if opp.type == 'opportunity':
|
||||
message = _("The opportunity '%s' has been marked as lost.") % name
|
||||
self.log(cr, uid, id, message)
|
||||
return res
|
||||
|
||||
|
||||
def case_cancel(self, cr, uid, ids, *args):
|
||||
"""Overrides cancel for crm_case for setting probability
|
||||
@param self: The object pointer
|
||||
@@ -110,7 +124,7 @@ class crm_opportunity(osv.osv):
|
||||
@param *args: Tuple Value for additional Params
|
||||
"""
|
||||
res = super(crm_opportunity, self).case_reset(cr, uid, ids, *args)
|
||||
self.write(cr, uid, ids, {'stage_id': False})
|
||||
self.write(cr, uid, ids, {'stage_id': False, 'probability': 0.0})
|
||||
return res
|
||||
|
||||
|
||||
|
||||
@@ -1,56 +1,109 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<record model="crm.case.categ" id="categ_oppor1">
|
||||
<field name="name">Interest in Computer</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor2">
|
||||
<field name="name">Interest in Accessories</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor3">
|
||||
<field name="name">Need Services</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor4">
|
||||
<field name="name">Need Information</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor5">
|
||||
<field name="name">Need a Website Design</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor6">
|
||||
<field name="name">Potential Reseller</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor7">
|
||||
<field name="name">Need Consulting</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor8">
|
||||
<field name="name">Other</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
|
||||
<!-- CASE STATUS(stage_id) -->
|
||||
|
||||
<record model="crm.case.stage" id="stage_opportunity6">
|
||||
<field name="name">Lost</field>
|
||||
<field eval="'0'" name="probability"/>
|
||||
<field eval="'0'" name="sequence"/>
|
||||
<field name="type">opportunity</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_opportunity1">
|
||||
<field name="name">New</field>
|
||||
<field eval="'10'" name="probability"/>
|
||||
<field eval="'1'" name="sequence"/>
|
||||
<field name="type">opportunity</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_opportunity2">
|
||||
<field name="name">Qualification</field>
|
||||
<field eval="'20'" name="probability"/>
|
||||
<field eval="'2'" name="sequence"/>
|
||||
<field name="type">opportunity</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_opportunity3">
|
||||
<field name="name">Proposition</field>
|
||||
<field eval="'40'" name="probability"/>
|
||||
<field eval="'3'" name="sequence"/>
|
||||
<field name="type">opportunity</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_opportunity4">
|
||||
<field name="name">Negotiation</field>
|
||||
<field eval="'60'" name="probability"/>
|
||||
<field eval="'4'" name="sequence"/>
|
||||
<field name="type">opportunity</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.stage" id="stage_opportunity5">
|
||||
<field name="name">Won</field>
|
||||
<field eval="'100'" name="probability"/>
|
||||
<field eval="'5'" name="sequence"/>
|
||||
<field eval="1" name="on_change"/>
|
||||
<field name="type">opportunity</field>
|
||||
</record>
|
||||
|
||||
<record model="crm.case.section" id="section_sales_department">
|
||||
<field name="name">Sales Department</field>
|
||||
<field name="code">Sales</field>
|
||||
<field name="stage_ids" eval="[(4, ref('stage_opportunity1')), (4, ref('stage_opportunity2')), (4, ref('stage_opportunity3')), (4, ref('stage_opportunity4')), (4, ref('stage_opportunity5')), (4, ref('stage_opportunity6'))]"/>
|
||||
</record>
|
||||
|
||||
<!-- CASE CATEGORY(categ_id) -->
|
||||
<record model="crm.case.categ" id="categ_oppor1">
|
||||
<field name="name">Interest in Computer</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor2">
|
||||
<field name="name">Interest in Accessories</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor3">
|
||||
<field name="name">Need Services</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor4">
|
||||
<field name="name">Need Information</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor5">
|
||||
<field name="name">Need a Website Design</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor6">
|
||||
<field name="name">Potential Reseller</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor7">
|
||||
<field name="name">Need Consulting</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
<record model="crm.case.categ" id="categ_oppor8">
|
||||
<field name="name">Other</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
<field name="object_id" search="[('model','=','crm.lead')]" model="ir.model"/>
|
||||
</record>
|
||||
|
||||
<!-- Case Resource(type_id) -->
|
||||
<record model="crm.case.resource.type" id="type_oppor1">
|
||||
<field name="name">Campaign 2</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
</record>
|
||||
<record model="crm.case.resource.type" id="type_oppor2">
|
||||
<field name="name">Campaign 1</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
</record>
|
||||
<record model="crm.case.resource.type" id="type_oppor1">
|
||||
<field name="name">Campaign 2</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
</record>
|
||||
<record model="crm.case.resource.type" id="type_oppor2">
|
||||
<field name="name">Campaign 1</field>
|
||||
<field name="section_id" ref="section_sales_department"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<field eval="85000.0" name="planned_revenue"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor1"/>
|
||||
<field name="stage_id" ref="crm.stage_lead3"/>
|
||||
<field name="stage_id" ref="crm.stage_opportunity3"/>
|
||||
<field eval=""CONS TRUST (AZ) 529701 - 1000 units"" name="name"/>
|
||||
</record>
|
||||
<record id="crm_case_rdroundfundingunits0" model="crm.lead">
|
||||
@@ -36,7 +36,7 @@
|
||||
<field eval="50" name="probability"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor5"/>
|
||||
<field name="stage_id" ref="crm.stage_lead1"/>
|
||||
<field name="stage_id" ref="crm.stage_opportunity1"/>
|
||||
<field eval=""3rd Round Funding - 1000 units "" name="name"/>
|
||||
</record>
|
||||
<record id="crm_case_mediapoleunits0" model="crm.lead">
|
||||
@@ -53,7 +53,7 @@
|
||||
<field eval="70" name="probability"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor7"/>
|
||||
<field name="stage_id" ref="crm.stage_lead5"/>
|
||||
<field name="stage_id" ref="crm.stage_opportunity5"/>
|
||||
<field eval=""Mediapole - 5000 units"" name="name"/>
|
||||
<field eval=""info@mycompany.net"" name="email_from"/>
|
||||
</record>
|
||||
@@ -70,7 +70,7 @@
|
||||
<field eval="45000.0" name="planned_revenue"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor5"/>
|
||||
<field name="stage_id" ref="crm.stage_lead4"/>
|
||||
<field name="stage_id" ref="crm.stage_opportunity4"/>
|
||||
<field eval=""ABC FUEL CO 829264 - 1000 units "" name="name"/>
|
||||
<field eval=""info@opensides.be"" name="email_from"/>
|
||||
</record>
|
||||
@@ -86,7 +86,7 @@
|
||||
<field eval="42000.0" name="planned_revenue"/>
|
||||
<field name="section_id" ref="crm.section_sales_department"/>
|
||||
<field name="categ_id" ref="crm.categ_oppor2"/>
|
||||
<field name="stage_id" ref="crm.stage_lead6"/>
|
||||
<field name="stage_id" ref="crm.stage_opportunity6"/>
|
||||
<field eval=""Dirt Mining Ltd 271742 - 1000 units"" name="name"/>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<field name="res_model">crm.lead</field>
|
||||
<field name="view_mode">tree,form,graph,calendar</field>
|
||||
<field name="domain">[('type','=','opportunity')]</field>
|
||||
<field name="context">{'search_default_user_id':uid,'search_default_current':1, 'search_default_section_id':section_id,'default_type': 'opportunity'}</field>
|
||||
<field name="context">{'search_default_user_id':uid,'search_default_current':1, 'search_default_section_id':section_id, 'stage_type': 'opportunity'}</field>
|
||||
<field name="view_id" ref="crm_case_tree_view_oppor"/>
|
||||
<field name="search_view_id" ref="crm.view_crm_case_opportunities_filter"/>
|
||||
<field name="help">Opportunities allows you to manage and keep track of your sales pipeline by creating specific customer or prospect related sales documents in order to follow up potential sales. Information such as the expected revenue, opportunity stage, expected closing date, communication history and so on can be maintained in them. Opportunities can be connected with the email gateway: new emails create opportunities, each of them automatically gets the history of the conversation with the customer.
|
||||
|
||||
@@ -1,6 +1,21 @@
|
||||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="crm_opportunity_stage_act" model="ir.actions.act_window">
|
||||
<field name="name">Stages</field>
|
||||
<field name="res_model">crm.case.stage</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm.crm_case_stage_tree"/>
|
||||
<field name="domain">[('type', '=', 'opportunity')]</field>
|
||||
<field name="context">{'type':'opportunity'}</field>
|
||||
<field name="help">Create specific stages that will help your sales better organise their sales pipeline by maintaining them to their sales opportunities. It will allow them to easily track how is positioned a specific opportunity in the sales cycle.</field>
|
||||
</record>
|
||||
|
||||
<menuitem action="crm_opportunity_stage_act" id="menu_crm_opportunity_stage_act" name="Stages"
|
||||
groups="base.group_extended" sequence="0"
|
||||
parent="base.menu_crm_config_opportunity" />
|
||||
|
||||
<!-- Opportunities Form View -->
|
||||
<record model="ir.ui.view" id="crm_case_form_view_oppor">
|
||||
<field name="name">Opportunities</field>
|
||||
@@ -15,12 +30,12 @@
|
||||
<group colspan="1" col="4">
|
||||
<field name="stage_id" nolabel="1"
|
||||
on_change="onchange_stage_id(stage_id)"
|
||||
domain="[('object_id.model', '=', 'crm.lead'), ('section_ids', '=', section_id)]"/>
|
||||
domain="[('type','=','opportunity'),('section_ids', '=', section_id)]"/>
|
||||
<button name="stage_previous"
|
||||
states="draft,open,pending" type="object"
|
||||
icon="gtk-go-back" string="" />
|
||||
<button name="stage_next" states="draft,open,pending"
|
||||
type="object" icon="gtk-go-forward" string="" />
|
||||
type="object" icon="gtk-go-forward" string="" context="{'stage_type': 'opportunity'}"/>
|
||||
</group>
|
||||
<field name="user_id"/>
|
||||
|
||||
@@ -303,7 +318,7 @@
|
||||
</field>
|
||||
<newline/>
|
||||
<group expand="0" string="Extended Filters..." groups="base.group_extended">
|
||||
<field name="stage_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]"/>
|
||||
<field name="stage_id" widget="selection" domain="[('type', '=', 'opportunity')]"/>
|
||||
<field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="country_id" context="{'invisible_country': False}">
|
||||
|
||||
@@ -3,10 +3,13 @@
|
||||
<data>
|
||||
|
||||
<menuitem icon="terp-partner" id="base.menu_base_partner" name="Sales" sequence="0"
|
||||
groups="base.group_sale_manager,base.group_sale_salesman"/>
|
||||
groups="base.group_sale_manager,base.group_sale_salesman,base.group_partner_manager"/>
|
||||
|
||||
<menuitem id="base.menu_crm_config_lead" name="Leads & Opportunities"
|
||||
parent="base.menu_base_config" sequence="1" groups="base.group_sale_manager"/>
|
||||
|
||||
<menuitem id="base.menu_crm_config_opportunity" name="Opportunities"
|
||||
parent="base.menu_base_config" sequence="1" groups="base.group_sale_manager"/>
|
||||
|
||||
<menuitem id="base.menu_sale_config_sales" name="Sales"
|
||||
parent="base.menu_base_config" sequence="0" groups="base.group_sale_manager"/>
|
||||
@@ -119,7 +122,8 @@
|
||||
<form string="Stage">
|
||||
<separator string="Stage Definition" colspan="4"/>
|
||||
<field name="name" select="1"/>
|
||||
<field name="object_id" invisible="1" />
|
||||
<field name="type" invisible="1" />
|
||||
<field name="section_ids" invisible="1" />
|
||||
<field name="sequence"/>
|
||||
<field name="probability"/>
|
||||
<field name="on_change"/>
|
||||
|
||||
@@ -63,7 +63,7 @@ class crm_lead_report(osv.osv):
|
||||
'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True),
|
||||
'categ_id': fields.many2one('crm.case.categ', 'Category',\
|
||||
domain="['|',('section_id','=',False),('section_id','=',section_id)]" , readonly=True),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True, domain="('object_id.model', '=', 'crm.lead')]"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True, domain="('type', '=', 'lead')]"),
|
||||
'partner_id': fields.many2one('res.partner', 'Partner' , readonly=True),
|
||||
'opening_date': fields.date('Opening Date', readonly=True),
|
||||
'creation_date': fields.date('Creation Date', readonly=True),
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
<group expand="0" string="Extended Filters..." groups="base.group_extended">
|
||||
<field name="partner_id"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="stage_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]" />
|
||||
<field name="stage_id" widget="selection" domain="[('type', '=', 'lead')]" />
|
||||
<field name="categ_id" widget="selection"/>
|
||||
<field name="type_id" widget="selection"/>
|
||||
<field name="channel_id" widget="selection"/>
|
||||
@@ -133,7 +133,8 @@
|
||||
<filter string="Country" icon="terp-go-home" context="{'group_by':'country_id'}" />
|
||||
<filter string="Company" icon="terp-go-home"
|
||||
domain="[]"
|
||||
context="{'group_by':'company_id'}" />
|
||||
context="{'group_by':'company_id'}"
|
||||
groups="base.group_multi_company"/>
|
||||
<separator orientation="vertical" />
|
||||
<filter string="Stage" name="Stage" icon="terp-stage" domain="[]" context="{'group_by':'stage_id'}"/>
|
||||
<filter string="Priority" icon="terp-rating-rated" domain="[]" context="{'group_by':'priority'}" />
|
||||
|
||||
@@ -42,3 +42,6 @@
|
||||
"access_res_partner_bank_type_crm_user","res.partner.bank.type.crm.user","base.model_res_partner_bank_type","base.group_sale_salesman",1,0,0,0
|
||||
"access_res_partner_bank_type_crm_manager","res.partner.bank.type.crm.manager","base.model_res_partner_bank_type","base.group_sale_manager",1,0,0,0
|
||||
"access_res_partner_canal_manager","res.partner.canal.manager","base.model_res_partner_canal","base.group_sale_manager",1,1,1,1
|
||||
"access_crm_lead_partner_manager","crm.lead.partner.manager","model_crm_lead","base.group_partner_manager",1,1,1,1
|
||||
"access_crm_phonecall_partner_manager","crm.phonecall.partner.manager","model_crm_phonecall","base.group_partner_manager",1,1,1,1
|
||||
"access_crm_meeting_partner_manager","crm.meeting.partner.manager","model_crm_meeting","base.group_partner_manager",1,1,1,1
|
||||
|
||||
|
@@ -8,7 +8,7 @@
|
||||
partner_address_id: base.res_partner_address_1
|
||||
partner_id: base.res_partner_9
|
||||
probability: 1.0
|
||||
stage_id: crm.stage_lead1
|
||||
stage_id: crm.stage_opportunity1
|
||||
categ_id: crm.categ_oppor2
|
||||
section_id: crm.section_sales_department
|
||||
|
||||
|
||||
@@ -70,6 +70,7 @@ class crm_lead2opportunity(osv.osv_memory):
|
||||
cr, uid, opportunity_view_tree, context=context).res_id
|
||||
|
||||
lead = leads.browse(cr, uid, record_id, context=context)
|
||||
stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('type','=','opportunity'),('sequence','>=',1)])
|
||||
|
||||
for this in self.browse(cr, uid, ids, context=context):
|
||||
vals ={
|
||||
@@ -78,7 +79,8 @@ class crm_lead2opportunity(osv.osv_memory):
|
||||
'name': this.name,
|
||||
'partner_id': this.partner_id.id,
|
||||
'user_id': (this.partner_id.user_id and this.partner_id.user_id.id) or (lead.user_id and lead.user_id.id),
|
||||
'type': 'opportunity'
|
||||
'type': 'opportunity',
|
||||
'stage_id': stage_ids and stage_ids[0] or False
|
||||
}
|
||||
lead.write(vals, context=context)
|
||||
leads.history(cr, uid, [lead], _('Opportunity'), details='Converted to Opportunity', context=context)
|
||||
|
||||
@@ -33,13 +33,15 @@
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<!-- partner To Opportunity wizard -->
|
||||
<!-- partner To Opportunity wizard -->
|
||||
|
||||
<act_window id="crm_partner2opportunity"
|
||||
key2="client_action_multi" name="Create Opportunity"
|
||||
res_model="crm.partner2opportunity" src_model="res.partner"
|
||||
view_mode="form" target="new" view_type="form"
|
||||
groups="base.group_extended"/>
|
||||
<act_window id="crm_partner2opportunity"
|
||||
key2="client_action_multi" name="Create Opportunity"
|
||||
res_model="crm.partner2opportunity" src_model="res.partner"
|
||||
view_id="view_crm_partner2opportunity"
|
||||
view_mode="form" target="new" view_type="form"
|
||||
groups="base.group_extended"/>
|
||||
|
||||
</data>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -63,7 +63,7 @@ class crm_claim(crm.crm_case, osv.osv):
|
||||
'email_cc': fields.text('Watchers Emails', size=252, help="These email addresses will be added to the CC field of all inbound and outbound emails for this record before being sent. Separate multiple email addresses with a comma"),
|
||||
'email_from': fields.char('Email', size=128, help="These people will receive email."),
|
||||
'partner_phone': fields.char('Phone', size=32),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="('object_id.model', '=', 'crm.claim')]"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('type','=','claim')]"),
|
||||
'cause': fields.text('Root Cause'),
|
||||
'state': fields.selection(crm.AVAILABLE_STATES, 'State', size=16, readonly=True,
|
||||
help='The state is set to \'Draft\', when a case is created.\
|
||||
@@ -72,6 +72,19 @@ class crm_claim(crm.crm_case, osv.osv):
|
||||
\nIf the case needs to be reviewed then the state is set to \'Pending\'.'),
|
||||
'message_ids': fields.one2many('mailgate.message', 'res_id', 'Messages', domain=[('model','=',_name)]),
|
||||
}
|
||||
|
||||
def _get_stage_id(self, cr, uid, context=None):
|
||||
"""Finds type of stage according to object.
|
||||
@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
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
type = context and context.get('stage_type', '')
|
||||
stage_ids = self.pool.get('crm.case.stage').search(cr, uid, [('type','=',type),('sequence','>=',1)])
|
||||
return stage_ids and stage_ids[0] or False
|
||||
|
||||
_defaults = {
|
||||
'user_id': crm.crm_case._get_default_user,
|
||||
@@ -82,7 +95,8 @@ class crm_claim(crm.crm_case, osv.osv):
|
||||
'section_id':crm.crm_case. _get_section,
|
||||
'date': lambda *a: time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'company_id': lambda s, cr, uid, c: s.pool.get('res.company')._company_default_get(cr, uid, 'crm.case', context=c),
|
||||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||
'priority': lambda *a: crm.AVAILABLE_PRIORITIES[2][0],
|
||||
'stage_id': _get_stage_id,
|
||||
}
|
||||
|
||||
def onchange_partner_id(self, cr, uid, ids, part, email=False):
|
||||
@@ -119,7 +133,6 @@ class crm_claim(crm.crm_case, osv.osv):
|
||||
address = self.pool.get('res.partner.address').browse(cr, uid, add)
|
||||
return {'value': {'email_from': address.email, 'partner_phone': address.phone, 'partner_mobile': address.mobile}}
|
||||
|
||||
|
||||
crm_claim()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
@@ -45,22 +45,22 @@
|
||||
<record model="crm.case.stage" id="stage_claim1">
|
||||
<field name="name">Accepted as Claim</field>
|
||||
<field name="sequence">1</field>
|
||||
<field name="object_id" search="[('model','=','crm.claim')]" model="ir.model"/>
|
||||
<field name="type">claim</field>
|
||||
</record>
|
||||
<record model="crm.case.stage" id="stage_claim5">
|
||||
<field name="name">Actions Defined</field>
|
||||
<field name="sequence">2</field>
|
||||
<field name="object_id" search="[('model','=','crm.claim')]" model="ir.model"/>
|
||||
<field name="type">claim</field>
|
||||
</record>
|
||||
<record model="crm.case.stage" id="stage_claim2">
|
||||
<field name="name">Actions Done</field>
|
||||
<field name="sequence">10</field>
|
||||
<field name="object_id" search="[('model','=','crm.claim')]" model="ir.model"/>
|
||||
<field name="type">claim</field>
|
||||
</record>
|
||||
<record model="crm.case.stage" id="stage_claim3">
|
||||
<field name="name">Won't fix</field>
|
||||
<field name="sequence">11</field>
|
||||
<field name="object_id" search="[('model','=','crm.claim')]" model="ir.model"/>
|
||||
<field name="sequence">0</field>
|
||||
<field name="type">claim</field>
|
||||
</record>
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,calendar,form,graph</field>
|
||||
<field name="view_id" ref="crm_case_claims_tree_view"/>
|
||||
<field name="context">{'search_default_section_id': section_id, "search_default_current":1,"search_default_user_id":uid}</field>
|
||||
<field name="context">{'search_default_section_id': section_id, "search_default_current":1,"search_default_user_id":uid, "stage_type":'claim'}</field>
|
||||
<field name="search_view_id" ref="crm_claim.view_crm_case_claims_filter"/>
|
||||
<field name="help">Record and track your customers' claims. Claims can be linked to a sales order or a lot. You can send emails with attachments and get the history of everything that happened on a specific claim (emails sent, interventions type and so on..). Claims can be automatically linked to an email address using the mail gateway module.</field>
|
||||
</record>
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
<field name="res_model">crm.case.stage</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm.crm_case_stage_tree"/>
|
||||
<field name="domain">[('object_id.model', '=', 'crm.claim')]</field>
|
||||
<field name="context">{'object_id':'crm.claim'}</field>
|
||||
<field name="domain">[('type', '=', 'claim')]</field>
|
||||
<field name="context">{'type':'claim'}</field>
|
||||
<field name="help">You can create claim stages to categorize the status of every claim entered in the system. The stages define all the steps required for the resolution of a claim.</field>
|
||||
</record>
|
||||
|
||||
@@ -78,8 +78,7 @@
|
||||
<field name="user_id"/>
|
||||
<field name="priority"/>
|
||||
<group colspan="2" col="4">
|
||||
<field name="stage_id"
|
||||
domain="[('object_id.model', '=', 'crm.claim'), ('section_ids', '=', section_id)]" />
|
||||
<field name="stage_id" domain="[('type','=','claim')]"/>
|
||||
<button name="stage_previous" string="" type="object" icon="gtk-go-back" />
|
||||
<button icon="gtk-go-forward" string="" name="stage_next" type="object"/>
|
||||
</group>
|
||||
|
||||
@@ -62,7 +62,7 @@ class crm_claim_report(osv.osv):
|
||||
'create_date': fields.datetime('Create Date', readonly=True),
|
||||
'day': fields.char('Day', size=128, readonly=True),
|
||||
'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', readonly=True, domain="[('type','=','claim')]"),
|
||||
'categ_id': fields.many2one('crm.case.categ', 'Category',\
|
||||
domain="[('section_id','=',section_id),\
|
||||
('object_id.model', '=', 'crm.claim')]", readonly=True),
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
help="My Sales Team(s)" />
|
||||
|
||||
</field>
|
||||
<field name="company_id">
|
||||
<field name="company_id" groups="base.group_multi_company">
|
||||
<filter icon="terp-go-home"
|
||||
context="{'invisible_section': False}"
|
||||
domain="[('section_id.user_id.company_id','=',uid)]"
|
||||
@@ -108,7 +108,7 @@
|
||||
<separator orientation="vertical"/>
|
||||
<field name="partner_id"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="stage_id" widget="selection" domain="[('object_id.model', '=', 'crm.claim')]"/>
|
||||
<field name="stage_id" widget="selection" domain="[('type', '=', 'claim')]"/>
|
||||
<field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'crm.claim')]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="priority" />
|
||||
|
||||
@@ -61,7 +61,7 @@ class crm_fundraising(crm.crm_case, osv.osv):
|
||||
'partner_name2': fields.char('Employee Email', size=64),
|
||||
'partner_phone': fields.char('Phone', size=32),
|
||||
'partner_mobile': fields.char('Mobile', size=32),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="('object_id.model', '=', 'crm.fundraising')]"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="[('type', '=', 'fundraising')]"),
|
||||
'type_id': fields.many2one('crm.case.resource.type', 'Campaign', \
|
||||
domain="[('section_id','=',section_id)]"),
|
||||
'duration': fields.float('Duration'),
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
<field name="res_model">crm.case.stage</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="crm.crm_case_stage_tree"/>
|
||||
<field name="domain">[('object_id.model', '=', 'crm.fundraising')]</field>
|
||||
<field name="context">{'object_id':'crm.fundraising'}</field>
|
||||
<field name="domain">[('type', '=', 'fundraising')]</field>
|
||||
<field name="context">{'type':'fundraising'}</field>
|
||||
<field name="help">Create and manage fund raising activity categories you want to be maintained in the system.</field>
|
||||
</record>
|
||||
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
domain="[('section_id.user_id','=',uid)]"
|
||||
help="My Sales Team(s)" />
|
||||
</field>
|
||||
<field name="company_id">
|
||||
<field name="company_id" groups="base.group_multi_company">
|
||||
<filter icon="terp-go-home"
|
||||
context="{'invisible_section': False}"
|
||||
domain="[('section_id.user_id.company_id','=',uid)]"
|
||||
@@ -146,8 +146,9 @@
|
||||
<separator orientation="vertical" />
|
||||
<filter string="Company" icon="terp-go-home"
|
||||
domain="[]"
|
||||
groups="base.group_multi_company"
|
||||
context="{'group_by':'company_id'}" />
|
||||
<separator orientation="vertical" />
|
||||
<separator orientation="vertical" groups="base.group_multi_company"/>
|
||||
<filter string="Day" icon="terp-go-today"
|
||||
domain="[]" context="{'group_by':'day'}"
|
||||
help="Date of fundraising"/>
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
domain="[('section_id.user_id','=',uid)]"
|
||||
help="My Sales Team(s)" />
|
||||
</field>
|
||||
<field name="company_id">
|
||||
<field name="company_id" groups="base.group_multi_company">
|
||||
<filter icon="terp-go-home"
|
||||
context="{'invisible_section': False}"
|
||||
domain="[('section_id.user_id.company_id','=',uid)]"
|
||||
@@ -115,8 +115,9 @@
|
||||
<separator orientation="vertical" />
|
||||
<filter string="Company" icon="terp-go-home"
|
||||
domain="[]"
|
||||
groups="base.group_multi_company"
|
||||
context="{'group_by':'company_id'}" />
|
||||
<separator orientation="vertical" />
|
||||
<separator orientation="vertical" groups="base.group_multi_company"/>
|
||||
<filter string="Day" icon="terp-go-today"
|
||||
domain="[]" context="{'group_by':'day'}" help="Date of helpdesk requests"/>
|
||||
<filter string="Month" icon="terp-go-month"
|
||||
|
||||
@@ -63,7 +63,7 @@ class crm_lead_report_assign(osv.osv):
|
||||
'probable_revenue': fields.float('Probable Revenue', digits=(16,2),readonly=True),
|
||||
'categ_id': fields.many2one('crm.case.categ', 'Category',\
|
||||
domain="[('section_id','=',section_id)]" , readonly=True),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="('object_id.model', '=', 'crm.lead')]"),
|
||||
'stage_id': fields.many2one ('crm.case.stage', 'Stage', domain="('type', '=', 'lead')]"),
|
||||
'partner_id': fields.many2one('res.partner', 'Customer' , readonly=True),
|
||||
'opening_date': fields.date('Opening Date', readonly=True),
|
||||
'creation_date': fields.date('Creation Date', readonly=True),
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<group expand="0" string="Extended Filters..." groups="base.group_extended">
|
||||
<field name="partner_id"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="stage_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]" />
|
||||
<field name="stage_id" widget="selection" domain="[('type', '=', 'opportunity')]" />
|
||||
<field name="categ_id" widget="selection" domain="[('object_id.model', '=', 'crm.lead')]"/>
|
||||
<separator orientation="vertical"/>
|
||||
<field name="company_id" widget="selection" groups="base.group_multi_company"/>
|
||||
|
||||
@@ -57,9 +57,8 @@ class email_server(osv.osv):
|
||||
'user' : fields.char('User Name', size=256, required=True, readonly=True, states={'draft':[('readonly', False)]}),
|
||||
'password' : fields.char('Password', size=1024, invisible=True, required=True, readonly=True, states={'draft':[('readonly', False)]}),
|
||||
'note': fields.text('Description'),
|
||||
'action_id':fields.many2one('ir.actions.server', 'Reply Email', required=False, domain="[('state','=','email')]",
|
||||
help="An Email Server Action. It will be run whenever an e-mail is fetched from server."),
|
||||
'object_id': fields.many2one('ir.model', "Model", required=True, help="OpenObject Model. Generates a record of this model."),
|
||||
'action_id':fields.many2one('ir.actions.server', 'Email Server Action', required=False, domain="[('state','=','email')]", help="An Email Server Action. It will be run whenever an e-mail is fetched from server."),
|
||||
'object_id': fields.many2one('ir.model', "Model", required=True, help="OpenObject Model. Generates a record of this model.\nSelect Object with message_new attrbutes."),
|
||||
'priority': fields.integer('Server Priority', readonly=True, states={'draft':[('readonly', False)]}, help="Priority between 0 to 10, select define the order of Processing"),
|
||||
'user_id':fields.many2one('res.users', 'User', required=False),
|
||||
'message_ids': fields.one2many('mailgate.message', 'server_id', 'Messages', readonly=True),
|
||||
@@ -73,7 +72,7 @@ class email_server(osv.osv):
|
||||
}
|
||||
|
||||
def check_duplicate(self, cr, uid, ids):
|
||||
# RFC *-* Why this limitation? why not in SQL constraint?
|
||||
# RFC *-* Why this limitation? why not in SQL constraint?
|
||||
vals = self.read(cr, uid, ids, ['user', 'password'])[0]
|
||||
cr.execute("select count(id) from email_server where user=%s and password=%s", (vals['user'], vals['password']))
|
||||
res = cr.fetchone()
|
||||
@@ -82,8 +81,19 @@ class email_server(osv.osv):
|
||||
return False
|
||||
return True
|
||||
|
||||
def check_model(self, cr, uid, ids, context = None):
|
||||
if context is None:
|
||||
context = {}
|
||||
current_rec = self.read(cr, uid, ids, context)[0]
|
||||
if current_rec:
|
||||
model = self.pool.get(current_rec.get('object_id')[1])
|
||||
if hasattr(model, 'message_new'):
|
||||
return True
|
||||
return False
|
||||
|
||||
_constraints = [
|
||||
(check_duplicate, 'Warning! Can\'t have duplicate server configuration!', ['user', 'password'])
|
||||
(check_duplicate, 'Warning! Can\'t have duplicate server configuration!', ['user', 'password']),
|
||||
(check_model, 'Warning! Record for selected Model can not be created\nPlease choose valid Model', ['object_id'])
|
||||
]
|
||||
|
||||
def onchange_server_type(self, cr, uid, ids, server_type=False, ssl=False):
|
||||
@@ -103,7 +113,6 @@ class email_server(osv.osv):
|
||||
for server in self.browse(cr, uid, ids, context):
|
||||
logger.notifyChannel('imap', netsvc.LOG_INFO, 'fetchmail start checking for new emails on %s' % (server.name))
|
||||
context.update({'server_id': server.id, 'server_type': server.type})
|
||||
count = 0
|
||||
try:
|
||||
if server.type == 'imap':
|
||||
imap_server = None
|
||||
@@ -150,6 +159,7 @@ class email_server(osv.osv):
|
||||
context.update({'get_server': True})
|
||||
for server in self.browse(cr, uid, ids, context):
|
||||
count = 0
|
||||
user = server.user_id.id or uid
|
||||
try:
|
||||
if server.type == 'imap':
|
||||
imap_server = self.button_confirm_login(cr, uid, [server.id], context=context)
|
||||
@@ -157,9 +167,9 @@ class email_server(osv.osv):
|
||||
result, data = imap_server.search(None, '(UNSEEN)')
|
||||
for num in data[0].split():
|
||||
result, data = imap_server.fetch(num, '(RFC822)')
|
||||
res_id = email_tool.process_email(cr, uid, server.object_id.model, data[0][1], attach=server.attach, context=context)
|
||||
res_id = email_tool.process_email(cr, user, server.object_id.model, data[0][1], attach=server.attach, context=context)
|
||||
if res_id and server.action_id:
|
||||
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
|
||||
action_pool.run(cr, user, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
|
||||
|
||||
imap_server.store(num, '+FLAGS', '\\Seen')
|
||||
count += 1
|
||||
@@ -174,9 +184,9 @@ class email_server(osv.osv):
|
||||
for num in range(1, numMsgs + 1):
|
||||
(header, msges, octets) = pop_server.retr(num)
|
||||
msg = '\n'.join(msges)
|
||||
res_id = email_tool.process_email(cr, uid, server.object_id.model, msg, attach=server.attach, context=context)
|
||||
res_id = email_tool.process_email(cr, user, server.object_id.model, msg, attach=server.attach, context=context)
|
||||
if res_id and server.action_id:
|
||||
action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
|
||||
action_pool.run(cr, user, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]})
|
||||
|
||||
pop_server.dele(num)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<field name="model">email.server</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree colors="blue:state in ('draft');black:state in ('wating');gray:state in('done')" string="POP/IMAP Servers">
|
||||
<tree colors="blue:state in ('draft');black:state in ('waiting');gray:state in('done')" string="POP/IMAP Servers">
|
||||
<field name="name"/>
|
||||
<field name="type"/>
|
||||
<field name="user"/>
|
||||
@@ -48,6 +48,7 @@
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Auto Reply?" colspan="2"/>
|
||||
<field name="action_id"/>
|
||||
<field name="user_id"/>
|
||||
</group>
|
||||
<group col="2" colspan="2">
|
||||
<separator string="Process Parameter" colspan="2"/>
|
||||
|
||||
+1
-1
@@ -160,7 +160,7 @@ class hr_employee(osv.osv):
|
||||
'coach_id': fields.many2one('hr.employee', 'Coach'),
|
||||
'job_id': fields.many2one('hr.job', 'Job'),
|
||||
'photo': fields.binary('Photo'),
|
||||
'passport_id':fields.char('Passport', size=64)
|
||||
'passport_id':fields.char('Passport No', size=64)
|
||||
}
|
||||
|
||||
def onchange_address_id(self, cr, uid, ids, address, context=None):
|
||||
|
||||
@@ -34,8 +34,8 @@ class hr_evaluation_plan(osv.osv):
|
||||
'name': fields.char("Evaluation Plan", size=64, required=True),
|
||||
'company_id': fields.many2one('res.company', 'Company', required=True),
|
||||
'phase_ids': fields.one2many('hr_evaluation.plan.phase', 'plan_id', 'Evaluation Phases'),
|
||||
'month_first': fields.integer('Next Evaluation After'),
|
||||
'month_next': fields.integer('After the Date of Start'),
|
||||
'month_first': fields.integer('First Evaluation in (months)', help="This number of months will be used to schedule the first evaluation date of the employee when selecting an evaluation plan. "),
|
||||
'month_next': fields.integer('Periodicity of Evaluations (months)', help="The number of month that depicts the delay between each evaluation of this plan (after the first one)."),
|
||||
'active': fields.boolean('Active')
|
||||
}
|
||||
_defaults = {
|
||||
@@ -101,7 +101,7 @@ class hr_employee(osv.osv):
|
||||
_inherit="hr.employee"
|
||||
_columns = {
|
||||
'evaluation_plan_id': fields.many2one('hr_evaluation.plan', 'Evaluation Plan'),
|
||||
'evaluation_date': fields.date('Next Evaluation', help="Date of the next evaluation"),
|
||||
'evaluation_date': fields.date('Next Evaluation Date', help="The date of the next evaluation is computed by the evaluation plan's dates (first evaluation + periodicity)."),
|
||||
}
|
||||
|
||||
def run_employee_evaluation(self, cr, uid, automatic=False, use_new_cursor=False, context=None):
|
||||
|
||||
@@ -312,7 +312,7 @@ class hr_contract(osv.osv):
|
||||
_description = 'Employee Contract'
|
||||
_columns = {
|
||||
'permit_no': fields.char('Work Permit No', size=256, required=False, readonly=False),
|
||||
'passport_id': fields.many2one('hr.passport', 'Passport', required=False),
|
||||
'passport_id': fields.many2one('hr.passport', 'Passport No', required=False),
|
||||
'visa_no': fields.char('Visa No', size=64, required=False, readonly=False),
|
||||
'visa_expire': fields.date('Visa Expire Date'),
|
||||
'struct_id': fields.many2one('hr.payroll.structure', 'Salary Structure'),
|
||||
@@ -1472,7 +1472,7 @@ class hr_employee(osv.osv):
|
||||
return vals
|
||||
|
||||
_columns = {
|
||||
'passport_id':fields.many2one('hr.passport', 'Passport', required=False, domain="[('employee_id','=',active_id), ('address_id','=',address_home_id)]", help="Employee Passport Information"),
|
||||
'passport_id':fields.many2one('hr.passport', 'Passport No', required=False, domain="[('employee_id','=',active_id), ('address_id','=',address_home_id)]", help="Employee Passport Information"),
|
||||
'line_ids':fields.one2many('hr.payslip.line', 'employee_id', 'Salary Structure', required=False),
|
||||
'slip_ids':fields.one2many('hr.payslip', 'employee_id', 'Payslips', required=False, readonly=True),
|
||||
'otherid': fields.char('Other Id', size=64),
|
||||
|
||||
@@ -7,21 +7,5 @@
|
||||
<field name="type">general</field>
|
||||
</record>
|
||||
|
||||
<record id="product_consultant" model="product.product">
|
||||
<field name="list_price">75.0</field>
|
||||
<field name="standard_price">30.0</field>
|
||||
<field name="uom_id" ref="product.uom_hour"/>
|
||||
<field name="uom_po_id" ref="product.uom_hour"/>
|
||||
<field name="name">Service on Timesheet</field>
|
||||
<field name="categ_id" ref="product.cat0"/>
|
||||
<field name="type">service</field>
|
||||
<field eval="False" name="purchase_ok"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee" model="hr.employee">
|
||||
<field name="product_id" ref="product_consultant"/>
|
||||
<field name="journal_id" ref="analytic_journal"/>
|
||||
</record>
|
||||
|
||||
</data>
|
||||
</openerp>
|
||||
|
||||
@@ -2,6 +2,21 @@
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
|
||||
<record id="product_consultant" model="product.product">
|
||||
<field name="list_price">75.0</field>
|
||||
<field name="standard_price">30.0</field>
|
||||
<field name="uom_id" ref="product.uom_hour"/>
|
||||
<field name="uom_po_id" ref="product.uom_hour"/>
|
||||
<field name="name">Service on Timesheet</field>
|
||||
<field name="categ_id" ref="product.cat0"/>
|
||||
<field name="type">service</field>
|
||||
<field eval="False" name="purchase_ok"/>
|
||||
</record>
|
||||
|
||||
<record id="hr.employee" model="hr.employee">
|
||||
<field name="product_id" ref="product_consultant"/>
|
||||
<field name="journal_id" ref="analytic_journal"/>
|
||||
</record>
|
||||
<!-- complete our example employee -->
|
||||
<record id="hr.employee1" model="hr.employee">
|
||||
<field name="product_id" ref="product_consultant"/>
|
||||
|
||||
@@ -118,6 +118,7 @@
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="domain">[]</field>
|
||||
<field name="context">{'search_default_to_invoice': 1}</field>
|
||||
<field name="search_view_id" ref="account.view_account_analytic_line_filter"/>
|
||||
<field name="help">This lists show you every task work you can invoice to the customer. Select the lines in order to generate the invoices automatically.</field>
|
||||
</record>
|
||||
<menuitem
|
||||
|
||||
@@ -132,8 +132,8 @@
|
||||
<field name="state"/>
|
||||
<button name="button_confirm" states="draft" string="Confirm" type="object" icon="terp-check"/>
|
||||
<button name="action_set_to_draft" states="done" string="Set to Draft" type="object" icon="terp-stock_effects-object-colorize"/>
|
||||
<button name="cancel" states="confirm" string="Refuse" type="workflow" icon="gtk-cancel"/>
|
||||
<button name="done" states="confirm" string="Approve" type="workflow" icon="terp-camera_test"/>
|
||||
<button name="cancel" states="confirm" string="Refuse" type="workflow" icon="gtk-cancel" groups="base.group_hr_manager"/>
|
||||
<button name="done" states="confirm" string="Approve" type="workflow" icon="terp-camera_test" groups="base.group_hr_manager"/>
|
||||
</group>
|
||||
</form>
|
||||
</field>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,3 +2,4 @@
|
||||
"mail_gateway_mailgate_message","mail_gateway.mailgate.message","model_mailgate_message","base.group_system",1,1,1,1
|
||||
"mail_gateway_mailgate_thread","mail_gateway.mailgate.thread","model_mailgate_thread","base.group_system",1,1,1,1
|
||||
"mail_gateway_message_internal_user","mail_gateway.mailgate.message.internal","model_mailgate_message","base.group_user",1,0,0,0
|
||||
"mail_gateway_mailgate_message_partner_manager","mail_gateway.mailgate.message.partner.manager","model_mailgate_message","base.group_partner_manager",1,1,1,1
|
||||
|
||||
|
@@ -8,6 +8,7 @@ Pre requirements :
|
||||
http://starship.python.net/crew/mhammond/win32/
|
||||
3.If you are using MS Outlook 2007 than you are required to install "Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (CDO 1.21)". It can be downloaded from
|
||||
http://www.microsoft.com/downloads/en/details.aspx?familyid=2714320d-c997-4de1-986f-24f081725d36&displaylang=en
|
||||
and With MS Outlook2003 Install inbuilt Collaboration Data Objects(CDO) while installing Outlook.
|
||||
|
||||
How to install openerp-outlook plug-in?
|
||||
======================================================================================
|
||||
|
||||
@@ -55,7 +55,8 @@ class outlook_installer(osv.osv_memory):
|
||||
Pre-requirements :
|
||||
1. Python 2.6+ .
|
||||
2. Python for Windows extensions - PyWin32 this module for python must be installed for appropriate version of the Python.
|
||||
3. If you are using MS Outlook 2007 than you are required to install "Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (CDO 1.21)".
|
||||
3. If With MS Outlook 2007 it is required to install externally "Microsoft Exchange Server MAPI Client and Collaboration Data Objects 1.2.1 (CDO 1.21)".
|
||||
and With MS Outlook2003 Install inbuilt Collaboration Data Objects(CDO) while installing Outlook.
|
||||
|
||||
How to install openerp-outlook plug-in?
|
||||
1. Save the executable plug-in file.
|
||||
|
||||
@@ -151,47 +151,50 @@ class OutlookAddin:
|
||||
activeExplorer = application.ActiveExplorer()
|
||||
if activeExplorer is not None:
|
||||
bars = activeExplorer.CommandBars
|
||||
new_bar = bars.Add('Open ERP',0,0,0)
|
||||
|
||||
menu_bar = bars.Item("Menu Bar")
|
||||
|
||||
tools_menu = menu_bar.Controls(5)
|
||||
tools_menu = CastTo(tools_menu, "CommandBarPopup")
|
||||
|
||||
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
|
||||
# Hook events for the item
|
||||
item = self.menu_bar_Button = DispatchWithEvents(item, Configuration)
|
||||
item.Caption="OpenERP Configuration"
|
||||
item.Caption="Configuration"
|
||||
item.TooltipText = "Click to configure OpenERP"
|
||||
item.Enabled = True
|
||||
|
||||
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
|
||||
# Hook events for the item
|
||||
item = self.menu_bar_arch_Button = DispatchWithEvents(item, ArchiveEvent)
|
||||
item.Caption="Push to OpenERP"
|
||||
item.Caption="Push"
|
||||
item.TooltipText = "Click to push to OpenERP"
|
||||
item.Enabled = True
|
||||
|
||||
toolbar = bars.Item("Standard")
|
||||
openerp_bar = bars.Item('Open ERP')
|
||||
|
||||
item = toolbar.Controls.Add(Type=constants.msoControlButton, Temporary=True)
|
||||
item = openerp_bar.Controls.Add(Type=constants.msoControlButton, Temporary=True)
|
||||
# Hook events for the item
|
||||
item = self.toolbarButton = DispatchWithEvents(item, ArchiveEvent)
|
||||
item.Caption="Push to OpenERP"
|
||||
item.Caption="Push"
|
||||
item.TooltipText = "Click to push to OpenERP"
|
||||
item.Enabled = True
|
||||
|
||||
# Adding Menu in Menu Bar to the Web Menu of the Outlook
|
||||
toolbarweb = bars.Item("Web")
|
||||
|
||||
item = toolbarweb.Controls.Add(Type = constants.msoControlButton, Temporary = True)
|
||||
item = openerp_bar.Controls.Add(Type = constants.msoControlButton, Temporary = True)
|
||||
item = self.toolbarButtonOpenPartner = DispatchWithEvents(item, OpenPartner)
|
||||
item.Caption = "Open Partners"
|
||||
item.Caption = "Partner"
|
||||
item.TooltipText = "Click to Open OpenERP Partner Contact Information."
|
||||
item.Enabled = True
|
||||
|
||||
|
||||
item = toolbarweb.Controls.Add(Type = constants.msoControlButton, Temporary = True)
|
||||
item = openerp_bar.Controls.Add(Type = constants.msoControlButton, Temporary = True)
|
||||
item = self.toolbarButtonOpenDocument = DispatchWithEvents(item, OpenDocument)
|
||||
item.Caption = "Open Document"
|
||||
item.Caption = "Document"
|
||||
item.TooltipText = "Click to Open Document that has been pushed to server."
|
||||
item.Enabled = True
|
||||
|
||||
@@ -213,22 +216,22 @@ class OutlookAddin:
|
||||
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
|
||||
# Hook events for the item
|
||||
item = self.menu_bar_openpartner_Button = DispatchWithEvents(item, OpenPartner)
|
||||
item.Caption = "Open Partner"
|
||||
item.Caption = "Partner"
|
||||
item.TooltipText = "Click to Open Partner detail"
|
||||
item.Enabled = True
|
||||
|
||||
item = tools_menu.Controls.Add(Type=constants.msoControlButton, Temporary=True)
|
||||
# Hook events for the item
|
||||
item = self.menu_bar_opendocument_Button = DispatchWithEvents(item, OpenDocument)
|
||||
item.Caption = "Open Document"
|
||||
item.Caption = "Document"
|
||||
item.TooltipText = "Click to Open Document that has been pushed to server."
|
||||
item.Enabled = True
|
||||
|
||||
def OnDisconnection(self, mode, custom):
|
||||
self.item.close()
|
||||
mngr = manager.GetManager()
|
||||
mngr.config['login'] = False
|
||||
mngr.SaveConfig()
|
||||
self.item.close()
|
||||
pass
|
||||
def OnAddInsUpdate(self, custom):
|
||||
pass
|
||||
|
||||
@@ -205,6 +205,8 @@ def resetConnAttribs(window):
|
||||
NewConn.setitem('_uname', config['uname'])
|
||||
NewConn.setitem('_pwd', config['pwd'])
|
||||
NewConn.setitem('_login', str(config['login']))
|
||||
NewConn.setitem('_webserver',manager.config['webserver'])
|
||||
NewConn.setitem('_webport',manager.config['webport'])
|
||||
return
|
||||
|
||||
def setConnAttribs(server, port, manager):
|
||||
@@ -224,6 +226,8 @@ def setConnAttribs(server, port, manager):
|
||||
NewConn.setitem('_pwd', manager.config['pwd'])
|
||||
NewConn.setitem('_login', str(manager.config['login']))
|
||||
NewConn.setitem('_obj_list', manager.config['objects'])
|
||||
NewConn.setitem('_webserver',manager.config['webserver'])
|
||||
NewConn.setitem('_webport',manager.config['webport'])
|
||||
return
|
||||
|
||||
def getConnAttributes(manager):
|
||||
@@ -235,6 +239,13 @@ def getConnAttributes(manager):
|
||||
manager.config['uname'] = NewConn.getitem('_uname')
|
||||
manager.config['pwd'] = NewConn.getitem('_pwd')
|
||||
manager.config['login'] = NewConn.getitem('_login')
|
||||
manager.config['webserver'] = NewConn.getitem('_webserver')
|
||||
manager.config['webport'] = NewConn.getitem('_webport')
|
||||
return
|
||||
def setWebConnAttribs(server, port, manager):
|
||||
manager.config = manager.LoadConfig()
|
||||
NewConn.setitem('_webserver',server)
|
||||
NewConn.setitem('_webport',port)
|
||||
return
|
||||
|
||||
def getMessage(e):
|
||||
@@ -306,6 +317,7 @@ class WEBOKButtonProcessor(ButtonProcessor):
|
||||
if server.strip() == "" or server.strip() == "http:\\\\":
|
||||
win32ui.MessageBox("Invalid web Server address.", "OpenERP Connection", flag_excl)
|
||||
return
|
||||
setWebConnAttribs(server, port, self.mngr)
|
||||
web_server = server
|
||||
web_server_port = port
|
||||
win32gui.EndDialog(self.window.hwnd, id)
|
||||
@@ -831,6 +843,7 @@ def CreateContact(btnProcessor,*args):
|
||||
win32ui.MessageBox("Contact name or Email id is Missing\nPlease fill those information", "Create Contact", flag_error)
|
||||
return
|
||||
try:
|
||||
NewConn.CreateContact(str(res))
|
||||
if not partner:
|
||||
msg="New contact created."
|
||||
else:
|
||||
@@ -848,15 +861,23 @@ def SetAllText(txtProcessor,*args):
|
||||
# Set values for url, uname, pwd from config file
|
||||
global web_server
|
||||
global web_server_port
|
||||
serverBox = txtProcessor.GetControl(txtProcessor.other_ids[2])
|
||||
win32gui.SendMessage(serverBox, win32con.WM_SETTEXT, 0, "http:\\\\"+str(web_server)+":"+str(web_server_port))
|
||||
url = NewConn.getitem('_uri')
|
||||
tbox = txtProcessor.GetControl()
|
||||
win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(url))
|
||||
|
||||
uname = NewConn.getitem('_uname')
|
||||
tbox = txtProcessor.GetControl(txtProcessor.other_ids[0])
|
||||
win32gui.SendMessage(tbox, win32con.WM_SETTEXT, 0, str(uname))
|
||||
|
||||
passbox = txtProcessor.GetControl(txtProcessor.other_ids[1])
|
||||
pwd = NewConn.getitem('_pwd')
|
||||
win32gui.SendMessage(passbox, win32con.WM_SETTEXT, 0, str(pwd))
|
||||
serverBox = txtProcessor.GetControl(txtProcessor.other_ids[2])
|
||||
web_server = NewConn.getitem('_webserver')
|
||||
web_server_port = NewConn.getitem('_webport')
|
||||
webstr = "http:\\\\"+str(web_server)+":"+str(web_server_port)
|
||||
win32gui.SendMessage(serverBox, win32con.WM_SETTEXT, 0, str(webstr))
|
||||
|
||||
def SetDefaultList(listProcessor,*args):
|
||||
import win32api
|
||||
hwndList = listProcessor.GetControl()
|
||||
@@ -956,6 +977,9 @@ def SetDefaultContact(txtProcessor,*args):
|
||||
txtProcessor.init_done = True
|
||||
|
||||
def setCheckList(groupProcessor,*args):
|
||||
b = check()
|
||||
if not b:
|
||||
return
|
||||
try:
|
||||
hinst = win32gui.dllhandle
|
||||
objs = groupProcessor.window.manager.config['objects']
|
||||
@@ -1382,8 +1406,14 @@ def OpenPartnerForm(txtProcessor,*args):
|
||||
txtProcessor.init_done=True
|
||||
return
|
||||
try:
|
||||
linktopartner = "http:\\\\"+web_server+":"+str(web_server_port)+"\\openerp\\form\\view?model=res.partner&id="+str(vals)
|
||||
win32gui.SendMessage(partner_link, win32con.WM_SETTEXT, 0, linktopartner)
|
||||
linktopartner = "http://"+web_server+":"+str(web_server_port)+"/openerp/form/view?model=res.partner&id="+str(vals)
|
||||
|
||||
win32gui.SendMessage(partner_link, win32con.WM_SETTEXT, 0, str(linktopartner))
|
||||
# import urllib
|
||||
# encode = urllib.urlencode('/openerp/form/view?model=res.partner&id='+str(vals))
|
||||
# weburl = 'http://'+web_server+':'+str(web_server_port)
|
||||
# linktopartner = weburl + "?next=" + encode
|
||||
# win32gui.SendMessage(partner_link, win32con.WM_SETTEXT, 0, linktopartner)
|
||||
except Exception,e:
|
||||
win32ui.MessageBox("Error While Opening Partner.\n"+str(e),"Open Partner", flag_error)
|
||||
webbrowser.open_new(linktopartner)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 11 KiB |
@@ -140,7 +140,7 @@ class OpenERPManager:
|
||||
def LoadConfig(self):
|
||||
import win32ui
|
||||
path = os.path.join(self.data_directory, 'tiny.ini')
|
||||
data = {'server' : 'localhost', 'port' : '8069', 'protocol' : 'http://', 'database' : '', 'objects' : self.default_objects, 'uname':'admin', 'pwd':'a', 'login':False}
|
||||
data = {'server' : 'localhost', 'port' : '8069', 'protocol' : 'http://', 'database' : '', 'objects' : self.default_objects, 'uname':'admin', 'pwd':'a', 'login':False,'webserver':'localhost','webport':'8080'}
|
||||
if os.path.exists(path):
|
||||
fp = open(path, 'r')
|
||||
data = fp.readlines()
|
||||
|
||||
@@ -64,10 +64,12 @@ class XMLRpcConn(object):
|
||||
_reg_clsid_ = "{C6399AFD-763A-400F-8191-7F9D0503CAE2}"
|
||||
_reg_progid_ = "Python.OpenERP.XMLRpcConn"
|
||||
_reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"
|
||||
def __init__(self,server='localhost',port=8069,uri='http://localhost:8069'):
|
||||
def __init__(self,server='localhost',port=8069,uri='http://localhost:8069',webserver='localhost', webport=8080):
|
||||
self._server=server
|
||||
self._port=port
|
||||
self._uri=uri
|
||||
self._webserver=webserver
|
||||
self._webport=webport
|
||||
self._obj_list=[]
|
||||
self._dbname=''
|
||||
self._uname='admin'
|
||||
@@ -79,6 +81,7 @@ class XMLRpcConn(object):
|
||||
self.partner_id_list=None
|
||||
self.protocol=None
|
||||
|
||||
|
||||
def getitem(self, attrib):
|
||||
v=self.__getattribute__(attrib)
|
||||
return str(v)
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -1309,7 +1309,7 @@ msgstr "Point Of Sale Zahlung"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr "Hauptkasse"
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -1267,7 +1267,7 @@ msgstr "Pago punto de venta"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr "Salidas de caja"
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -302,7 +302,7 @@ msgstr "Max Discount(%)"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr "Sortie de caisse"
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -318,7 +318,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -1301,7 +1301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -1258,7 +1258,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -303,7 +303,7 @@ msgstr "Max Popust(%)"
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr "Gotovina Van"
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -1265,7 +1265,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -1264,7 +1264,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -301,7 +301,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
@@ -300,7 +300,7 @@ msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
#: view:pos.box.out:0
|
||||
msgid "Sortie de caisse"
|
||||
msgid "Output Operation"
|
||||
msgstr ""
|
||||
|
||||
#. module: point_of_sale
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user