[CHG] hr_expense_usability: improve inheritance (#40)
This commit is contained in:
committed by
Alexis de Lattre
parent
080e3decbc
commit
987e753a54
@@ -240,6 +240,58 @@ class HrExpense(models.Model):
|
|||||||
"The method 'action_move_create' is blocked by the module "
|
"The method 'action_move_create' is blocked by the module "
|
||||||
"'hr_expense_usability'"))
|
"'hr_expense_usability'"))
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def _get_expense_move_lines_values(self, partner):
|
||||||
|
self.ensure_one()
|
||||||
|
if self.account_id:
|
||||||
|
account = self.account_id
|
||||||
|
else:
|
||||||
|
account = self.product_id.product_tmpl_id. \
|
||||||
|
_get_product_accounts()['expense']
|
||||||
|
if not account:
|
||||||
|
raise UserError(_(
|
||||||
|
"No expense account found for product '%s' nor "
|
||||||
|
"for it's related product category.") % (
|
||||||
|
self.product_id.display_name,
|
||||||
|
self.product_id.categ_id.display_name))
|
||||||
|
return {
|
||||||
|
'type': 'expense',
|
||||||
|
'partner_id': partner.id,
|
||||||
|
'account_id': account.id,
|
||||||
|
'analytic_account_id': self.analytic_account_id.id or False,
|
||||||
|
'amount': self.untaxed_amount_company_currency,
|
||||||
|
'name': self.employee_id.name + ': ' +
|
||||||
|
self.name.split('\n')[0][:64],
|
||||||
|
'product_id': self.product_id.id,
|
||||||
|
'product_uom_id': self.product_uom_id.id,
|
||||||
|
'quantity': self.quantity,
|
||||||
|
}
|
||||||
|
|
||||||
|
@api.multi
|
||||||
|
def _get_expense_move_lines_tax_values(self, partner, dp):
|
||||||
|
vals = {}
|
||||||
|
tax_cmp = float_compare(
|
||||||
|
self.tax_amount_company_currency, 0, precision_rounding=dp)
|
||||||
|
if tax_cmp:
|
||||||
|
tax = self.tax_ids[0] # there is a constrain on this
|
||||||
|
if tax_cmp > 0:
|
||||||
|
tax_account_id = tax.account_id.id
|
||||||
|
else:
|
||||||
|
tax_account_id = tax.refund_account_id.id
|
||||||
|
if tax.analytic:
|
||||||
|
analytic_account_id = self.analytic_account_id.id or False
|
||||||
|
else:
|
||||||
|
analytic_account_id = False
|
||||||
|
vals = {
|
||||||
|
'type': 'tax',
|
||||||
|
'partner_id': partner.id,
|
||||||
|
'account_id': tax_account_id,
|
||||||
|
'analytic_account_id': analytic_account_id,
|
||||||
|
'amount': self.tax_amount_company_currency,
|
||||||
|
'name': self.name.split('\n')[0][:64],
|
||||||
|
}
|
||||||
|
return vals
|
||||||
|
|
||||||
|
|
||||||
class HrExpenseSheet(models.Model):
|
class HrExpenseSheet(models.Model):
|
||||||
_inherit = 'hr.expense.sheet'
|
_inherit = 'hr.expense.sheet'
|
||||||
@@ -323,6 +375,41 @@ class HrExpenseSheet(models.Model):
|
|||||||
}
|
}
|
||||||
return vals
|
return vals
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_group_key(self, mline, group, i):
|
||||||
|
if group:
|
||||||
|
key = [
|
||||||
|
mline['type'],
|
||||||
|
mline['account_id'],
|
||||||
|
mline['analytic_account_id'],
|
||||||
|
False]
|
||||||
|
else:
|
||||||
|
key = [False, False, False, i]
|
||||||
|
return key
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _prepare_expense_move_lines_values(self, gmlines, dp):
|
||||||
|
credit = debit = False
|
||||||
|
cmp_amount = float_compare(
|
||||||
|
gmlines['amount'], 0, precision_rounding=dp)
|
||||||
|
if cmp_amount > 0:
|
||||||
|
debit = gmlines['amount']
|
||||||
|
elif cmp_amount < 0:
|
||||||
|
credit = gmlines['amount'] * -1
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
return {
|
||||||
|
'partner_id': gmlines['partner_id'],
|
||||||
|
'account_id': gmlines['account_id'],
|
||||||
|
'analytic_account_id': gmlines['analytic_account_id'],
|
||||||
|
'product_id': gmlines.get('product_id', False),
|
||||||
|
'product_uom_id': gmlines.get('product_uom_id', False),
|
||||||
|
'quantity': gmlines.get('quantity', 1),
|
||||||
|
'name': gmlines['name'],
|
||||||
|
'debit': debit,
|
||||||
|
'credit': credit,
|
||||||
|
}
|
||||||
|
|
||||||
def _prepare_expense_move_lines(self):
|
def _prepare_expense_move_lines(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
mlines = []
|
mlines = []
|
||||||
@@ -330,63 +417,20 @@ class HrExpenseSheet(models.Model):
|
|||||||
prec = self.company_id.currency_id.rounding
|
prec = self.company_id.currency_id.rounding
|
||||||
for exp in self.expense_line_ids:
|
for exp in self.expense_line_ids:
|
||||||
# Expense
|
# Expense
|
||||||
if exp.account_id:
|
vals = exp._get_expense_move_lines_values(partner)
|
||||||
account = exp.account_id
|
mlines.append(vals)
|
||||||
else:
|
|
||||||
account = exp.product_id.product_tmpl_id.\
|
|
||||||
_get_product_accounts()['expense']
|
|
||||||
if not account:
|
|
||||||
raise UserError(_(
|
|
||||||
"No expense account found for product '%s' nor "
|
|
||||||
"for it's related product category.") % (
|
|
||||||
exp.product_id.display_name,
|
|
||||||
exp.product_id.categ_id.display_name))
|
|
||||||
mlines.append({
|
|
||||||
'type': 'expense',
|
|
||||||
'partner_id': partner.id,
|
|
||||||
'account_id': account.id,
|
|
||||||
'analytic_account_id': exp.analytic_account_id.id or False,
|
|
||||||
'amount': exp.untaxed_amount_company_currency,
|
|
||||||
'name': exp.employee_id.name + ': ' + exp.name.split('\n')[0][:64],
|
|
||||||
'product_id': exp.product_id.id,
|
|
||||||
'product_uom_id': exp.product_uom_id.id,
|
|
||||||
'quantity': exp.quantity,
|
|
||||||
})
|
|
||||||
# TAX
|
# TAX
|
||||||
tax_cmp = float_compare(
|
tax_line_values = exp._get_expense_move_lines_tax_values(
|
||||||
exp.tax_amount_company_currency, 0, precision_rounding=prec)
|
partner, prec)
|
||||||
if tax_cmp:
|
if tax_line_values:
|
||||||
tax = exp.tax_ids[0] # there is a constrain on this
|
mlines.append(tax_line_values)
|
||||||
if tax_cmp > 0:
|
|
||||||
tax_account_id = tax.account_id.id
|
|
||||||
else:
|
|
||||||
tax_account_id = tax.refund_account_id.id
|
|
||||||
if tax.analytic:
|
|
||||||
analytic_account_id = exp.analytic_account_id.id or False
|
|
||||||
else:
|
|
||||||
analytic_account_id = False
|
|
||||||
mlines.append({
|
|
||||||
'type': 'tax',
|
|
||||||
'partner_id': partner.id,
|
|
||||||
'account_id': tax_account_id,
|
|
||||||
'analytic_account_id': analytic_account_id,
|
|
||||||
'amount': exp.tax_amount_company_currency,
|
|
||||||
'name': exp.name.split('\n')[0][:64],
|
|
||||||
})
|
|
||||||
# grouping
|
# grouping
|
||||||
group_mlines = {}
|
group_mlines = {}
|
||||||
group = self.journal_id.group_invoice_lines
|
group = self.journal_id.group_invoice_lines
|
||||||
i = 0
|
i = 0
|
||||||
for mline in mlines:
|
for mline in mlines:
|
||||||
i += 1
|
i += 1
|
||||||
if group:
|
key = tuple(self._get_group_key(mline, group, i))
|
||||||
key = (
|
|
||||||
mline['type'],
|
|
||||||
mline['account_id'],
|
|
||||||
mline['analytic_account_id'],
|
|
||||||
False)
|
|
||||||
else:
|
|
||||||
key = (False, False, False, i)
|
|
||||||
if key in group_mlines:
|
if key in group_mlines:
|
||||||
group_mlines[key]['amount'] += mline['amount']
|
group_mlines[key]['amount'] += mline['amount']
|
||||||
group_mlines[key]['name'] = self.name[:64]
|
group_mlines[key]['name'] = self.name[:64]
|
||||||
@@ -405,26 +449,9 @@ class HrExpenseSheet(models.Model):
|
|||||||
total_cc = 0.0
|
total_cc = 0.0
|
||||||
for gmlines in group_mlines.itervalues():
|
for gmlines in group_mlines.itervalues():
|
||||||
total_cc += gmlines['amount']
|
total_cc += gmlines['amount']
|
||||||
credit = debit = False
|
vals = self._prepare_expense_move_lines_values(gmlines, prec)
|
||||||
cmp_amount = float_compare(
|
if vals:
|
||||||
gmlines['amount'], 0, precision_rounding=prec)
|
res_mlines.append((0, 0, vals))
|
||||||
if cmp_amount > 0:
|
|
||||||
debit = gmlines['amount']
|
|
||||||
elif cmp_amount < 0:
|
|
||||||
credit = gmlines['amount'] * -1
|
|
||||||
else:
|
|
||||||
continue
|
|
||||||
res_mlines.append((0, 0, {
|
|
||||||
'partner_id': gmlines['partner_id'],
|
|
||||||
'account_id': gmlines['account_id'],
|
|
||||||
'analytic_account_id': gmlines['analytic_account_id'],
|
|
||||||
'product_id': gmlines.get('product_id', False),
|
|
||||||
'product_uom_id': gmlines.get('product_uom_id', False),
|
|
||||||
'quantity': gmlines.get('quantity', 1),
|
|
||||||
'name': gmlines['name'],
|
|
||||||
'debit': debit,
|
|
||||||
'credit': credit,
|
|
||||||
}))
|
|
||||||
return res_mlines, total_cc
|
return res_mlines, total_cc
|
||||||
|
|
||||||
def action_sheet_move_create(self):
|
def action_sheet_move_create(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user