mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[REM] hr_payroll_commission: available in professional
H14528
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
from . import models
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
{
|
|
||||||
'name': 'Commissions in Payslips',
|
|
||||||
'author': 'Hibou Corp.',
|
|
||||||
'version': '15.0.1.0.0',
|
|
||||||
'license': 'OPL-1',
|
|
||||||
'category': 'Accounting/Commissions',
|
|
||||||
'sequence': 95,
|
|
||||||
'summary': 'Reimburse Commissions in Payslips',
|
|
||||||
'description': """
|
|
||||||
Reimburse Commissions in Payslips
|
|
||||||
""",
|
|
||||||
'depends': [
|
|
||||||
'hr_commission',
|
|
||||||
'hr_payroll_hibou',
|
|
||||||
],
|
|
||||||
'data': [
|
|
||||||
'views/hr_commission_views.xml',
|
|
||||||
'views/hr_payslip_views.xml',
|
|
||||||
'data/hr_payroll_commission_data.xml',
|
|
||||||
],
|
|
||||||
'demo': [
|
|
||||||
'data/hr_payroll_commission_demo.xml',
|
|
||||||
],
|
|
||||||
'installable': True,
|
|
||||||
'application': False,
|
|
||||||
'auto_install': True,
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
<!-- Salary Other Input -->
|
|
||||||
<record id="commission_other_input" model="hr.payslip.input.type">
|
|
||||||
<field name="name">Commissions</field>
|
|
||||||
<field name="code">COMMISSION</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
<record id="hr_salary_rule_commission" model="hr.salary.rule">
|
|
||||||
<field name="condition_select">python</field>
|
|
||||||
<field name="condition_python">
|
|
||||||
result = inputs.COMMISSION.amount > 0.0 if inputs.COMMISSION else False
|
|
||||||
</field>
|
|
||||||
<field name="amount_select">code</field>
|
|
||||||
<field name="amount_python_compute">
|
|
||||||
result = inputs.COMMISSION.amount if inputs.COMMISSION else 0
|
|
||||||
</field>
|
|
||||||
<field name="code">COMMISSION</field>
|
|
||||||
<field name="category_id" ref="hr_payroll.BASIC"/>
|
|
||||||
<field name="name">Commissions</field>
|
|
||||||
<field name="sequence" eval="190"/>
|
|
||||||
<field name="struct_id" ref="hr_payroll.structure_002"/>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
# Translation of Odoo Server.
|
|
||||||
# This file contains the translation of the following modules:
|
|
||||||
# * hr_payroll_commission
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: Odoo Server 15.0+e\n"
|
|
||||||
"Report-Msgid-Bugs-To: \n"
|
|
||||||
"POT-Creation-Date: 2021-10-12 01:26+0000\n"
|
|
||||||
"PO-Revision-Date: 2021-10-12 01:26+0000\n"
|
|
||||||
"Last-Translator: \n"
|
|
||||||
"Language-Team: \n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: \n"
|
|
||||||
"Plural-Forms: \n"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model.fields,field_description:hr_payroll_commission.field_hr_payslip__commission_count
|
|
||||||
msgid "Commission Count"
|
|
||||||
msgstr "Recuento de Comisiones"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model,name:hr_payroll_commission.model_hr_commission_payment
|
|
||||||
msgid "Commission Payment"
|
|
||||||
msgstr "Pago de comisiones"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model.fields,field_description:hr_payroll_commission.field_hr_payslip__commission_payment_ids
|
|
||||||
#: model_terms:ir.ui.view,arch_db:hr_payroll_commission.hr_payslip_view_form_inherit
|
|
||||||
msgid "Commissions"
|
|
||||||
msgstr "Comisiones"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model.fields,help:hr_payroll_commission.field_hr_payslip__commission_payment_ids
|
|
||||||
msgid "Commissions to reimburse to employee."
|
|
||||||
msgstr "Comisiones para reembolsar al empleado"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model,name:hr_payroll_commission.model_hr_payslip
|
|
||||||
msgid "Pay Slip"
|
|
||||||
msgstr "Recibo de Nómina"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model.fields,field_description:hr_payroll_commission.field_hr_commission_payment__payslip_id
|
|
||||||
msgid "Payslip"
|
|
||||||
msgstr "Recibo de Nómina"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model:ir.model.fields,field_description:hr_payroll_commission.field_hr_commission_payment__pay_in_payslip
|
|
||||||
msgid "Reimburse In Next Payslip"
|
|
||||||
msgstr "Reembolsar en el próximo recibo de nómina"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: code:addons/hr_payroll_commission/models/hr_payslip.py:0
|
|
||||||
#, python-format
|
|
||||||
msgid "Reimbursed Commissions"
|
|
||||||
msgstr "Comisiones Reembolsadas"
|
|
||||||
|
|
||||||
#. module: hr_payroll_commission
|
|
||||||
#: model_terms:ir.ui.view,arch_db:hr_payroll_commission.view_hr_commission_payment_form_inherit
|
|
||||||
msgid "Report in Next Payslip"
|
|
||||||
msgstr "Reportar en el próximo recibo de nómina"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
from . import hr_commission
|
|
||||||
from . import hr_payslip
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
from odoo import fields, models, _
|
|
||||||
|
|
||||||
|
|
||||||
class CommissionPayment(models.Model):
|
|
||||||
_inherit = 'hr.commission.payment'
|
|
||||||
|
|
||||||
pay_in_payslip = fields.Boolean(string="Reimburse In Next Payslip")
|
|
||||||
payslip_id = fields.Many2one('hr.payslip', string="Payslip", readonly=True)
|
|
||||||
|
|
||||||
def action_report_in_next_payslip(self):
|
|
||||||
self.filtered(lambda p: not p.payslip_id).write({'pay_in_payslip': True})
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
from odoo import api, Command, fields, models, _
|
|
||||||
|
|
||||||
|
|
||||||
class HrPayslip(models.Model):
|
|
||||||
_inherit = 'hr.payslip'
|
|
||||||
|
|
||||||
commission_payment_ids = fields.One2many(
|
|
||||||
'hr.commission.payment', 'payslip_id', string='Commissions',
|
|
||||||
help="Commissions to reimburse to employee.",
|
|
||||||
states={'draft': [('readonly', False)], 'verify': [('readonly', False)]})
|
|
||||||
commission_count = fields.Integer(compute='_compute_commission_count')
|
|
||||||
|
|
||||||
@api.depends('commission_payment_ids.commission_ids', 'commission_payment_ids.payslip_id')
|
|
||||||
def _compute_commission_count(self):
|
|
||||||
for payslip in self:
|
|
||||||
payslip.commission_count = len(payslip.mapped('commission_payment_ids.commission_ids'))
|
|
||||||
|
|
||||||
@api.model_create_multi
|
|
||||||
def create(self, vals_list):
|
|
||||||
payslips = super().create(vals_list)
|
|
||||||
draft_slips = payslips.filtered(lambda p: p.employee_id and p.state == 'draft')
|
|
||||||
if not draft_slips:
|
|
||||||
return payslips
|
|
||||||
|
|
||||||
commission_payments = self.env['hr.commission.payment'].search([
|
|
||||||
('employee_id', 'in', draft_slips.mapped('employee_id').ids),
|
|
||||||
('pay_in_payslip', '=', True),
|
|
||||||
('payslip_id', '=', False)])
|
|
||||||
for slip in draft_slips:
|
|
||||||
payslip_commission_payments = commission_payments.filtered(lambda c: c.employee_id == slip.employee_id)
|
|
||||||
slip.commission_payment_ids = [(5, 0, 0)] + [(4, c.id, False) for c in payslip_commission_payments]
|
|
||||||
return payslips
|
|
||||||
|
|
||||||
def write(self, vals):
|
|
||||||
res = super().write(vals)
|
|
||||||
if 'commission_payment_ids' in vals:
|
|
||||||
self._compute_commission_input_line_ids()
|
|
||||||
if 'input_line_ids' in vals:
|
|
||||||
self._update_commission()
|
|
||||||
return res
|
|
||||||
|
|
||||||
def _update_commission(self):
|
|
||||||
commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False)
|
|
||||||
for payslip in self:
|
|
||||||
if not payslip.input_line_ids.filtered(lambda line: line.input_type_id == commission_type):
|
|
||||||
payslip.commission_payment_ids.write({'payslip_id': False})
|
|
||||||
|
|
||||||
def _compute_commission_input_line_ids(self):
|
|
||||||
commission_type = self.env.ref('hr_payroll_commission.commission_other_input', raise_if_not_found=False)
|
|
||||||
if not commission_type:
|
|
||||||
return
|
|
||||||
for payslip in self:
|
|
||||||
amount = sum(self.commission_payment_ids.mapped('commission_amount'))
|
|
||||||
if not amount:
|
|
||||||
continue
|
|
||||||
lines_to_remove = payslip.input_line_ids.filtered(lambda x: x.input_type_id == commission_type)
|
|
||||||
input_lines_vals = [(2, line.id, False) for line in lines_to_remove]
|
|
||||||
input_lines_vals.append((0, 0, {
|
|
||||||
'amount': amount,
|
|
||||||
'input_type_id': commission_type.id
|
|
||||||
}))
|
|
||||||
payslip.update({'input_line_ids': input_lines_vals})
|
|
||||||
|
|
||||||
def open_commissions(self):
|
|
||||||
self.ensure_one()
|
|
||||||
return {
|
|
||||||
'type': 'ir.actions.act_window',
|
|
||||||
'name': _('Reimbursed Commissions'),
|
|
||||||
'res_model': 'hr.commission',
|
|
||||||
'view_mode': 'tree,form',
|
|
||||||
'domain': [('id', 'in', self.mapped('commission_payment_ids.commission_ids').ids)],
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 6.8 KiB |
@@ -1,3 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
from . import test_payslip_commission
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
|
|
||||||
|
|
||||||
from datetime import date, timedelta
|
|
||||||
|
|
||||||
from odoo.addons.hr_commission.tests import test_commission
|
|
||||||
|
|
||||||
|
|
||||||
class TestCommissionPayslip(test_commission.TestCommission):
|
|
||||||
|
|
||||||
def _createContract(self, employee, commission_rate, admin_commission_rate=0.0):
|
|
||||||
return self.env['hr.contract'].create({
|
|
||||||
'date_start': '2016-01-01',
|
|
||||||
'date_end': '2030-12-31',
|
|
||||||
'name': 'Contract for tests',
|
|
||||||
'wage': 1000.0,
|
|
||||||
'wage_type': 'monthly',
|
|
||||||
# 'type_id': self.ref('hr_contract.hr_contract_type_emp'),
|
|
||||||
'structure_type_id': self.ref('hr_contract.structure_type_worker'),
|
|
||||||
'employee_id': employee.id,
|
|
||||||
'resource_calendar_id': self.ref('resource.resource_calendar_std'),
|
|
||||||
'commission_rate': commission_rate,
|
|
||||||
'admin_commission_rate': admin_commission_rate,
|
|
||||||
'state': 'open', # if not "Running" then no automatic selection when Payslip is created in 11.0
|
|
||||||
})
|
|
||||||
|
|
||||||
def test_commission(self):
|
|
||||||
super().test_commission()
|
|
||||||
commission_type = self.env.ref('hr_payroll_commission.commission_other_input')
|
|
||||||
payslip = self.env['hr.payslip'].create({
|
|
||||||
'name': 'test slip',
|
|
||||||
'employee_id': self.employee.id,
|
|
||||||
'date_from': date.today() - timedelta(days=1),
|
|
||||||
'date_to': date.today() + timedelta(days=14),
|
|
||||||
})
|
|
||||||
self.assertFalse(payslip.commission_payment_ids)
|
|
||||||
payslip.action_payslip_cancel()
|
|
||||||
|
|
||||||
# find unpaid commission payments from super().test_commission()
|
|
||||||
commission_payments = self.env['hr.commission.payment'].search([
|
|
||||||
('employee_id', '=', self.employee.id),
|
|
||||||
])
|
|
||||||
self.assertTrue(commission_payments)
|
|
||||||
|
|
||||||
# press the button to pay it via payroll
|
|
||||||
commission_payments.action_report_in_next_payslip()
|
|
||||||
|
|
||||||
payslip = self.env['hr.payslip'].create({
|
|
||||||
'name': 'test slip',
|
|
||||||
'employee_id': self.employee.id,
|
|
||||||
'date_from': date.today() - timedelta(days=1),
|
|
||||||
'date_to': date.today() + timedelta(days=14),
|
|
||||||
})
|
|
||||||
# has attached commission payments
|
|
||||||
self.assertTrue(payslip.commission_payment_ids)
|
|
||||||
commission_input_lines = payslip.input_line_ids.filtered(lambda l: l.input_type_id == commission_type)
|
|
||||||
self.assertTrue(commission_input_lines)
|
|
||||||
self.assertEqual(sum(commission_input_lines.mapped('amount')),
|
|
||||||
sum(commission_payments.mapped('commission_amount')))
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
<record id="view_hr_commission_payment_form_inherit" model="ir.ui.view">
|
|
||||||
<field name="name">hr.commission.payment.form.payroll</field>
|
|
||||||
<field name="model">hr.commission.payment</field>
|
|
||||||
<field name="inherit_id" ref="hr_commission.view_hr_commission_payment_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//field[@name='employee_id']" position="after">
|
|
||||||
<field name="pay_in_payslip" attrs="{'invisible': ['|', ('pay_in_payslip', '=', False), ('payslip_id', '!=', False)]}"/>
|
|
||||||
<field name="payslip_id" attrs="{'invisible':[('payslip_id','=',False)]}"/>
|
|
||||||
</xpath>
|
|
||||||
<xpath expr="//form/header" position="inside">
|
|
||||||
<button name="action_report_in_next_payslip" type="object"
|
|
||||||
string="Report in Next Payslip"
|
|
||||||
groups="account.group_account_manager"
|
|
||||||
attrs="{'invisible': ['|', ('pay_in_payslip', '=', True), ('payslip_id', '!=', False)]}"
|
|
||||||
class="oe_highlight"/>
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="view_hr_commission_payment_tree_inherit" model="ir.ui.view">
|
|
||||||
<field name="name">hr.commission.payment.tree.payroll</field>
|
|
||||||
<field name="model">hr.commission.payment</field>
|
|
||||||
<field name="inherit_id" ref="hr_commission.view_hr_commission_payment_tree"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//field[@name='employee_id']" position="before">
|
|
||||||
<field name="pay_in_payslip" />
|
|
||||||
<field name="payslip_id" />
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
|
|
||||||
<record id="hr_payslip_view_form_inherit" model="ir.ui.view">
|
|
||||||
<field name="name">hr.payslip.view.form.inherit</field>
|
|
||||||
<field name="model">hr.payslip</field>
|
|
||||||
<field name="inherit_id" ref="hr_payroll.view_hr_payslip_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//div[@name='button_box']" position="inside">
|
|
||||||
<button class="oe_stat_button" name="open_commissions" type="object" icon="fa-dollar" attrs="{'invisible': [('commission_count', '=', 0)]}">
|
|
||||||
<field string="Commissions" name="commission_count" widget="statinfo"/>
|
|
||||||
</button>
|
|
||||||
</xpath>
|
|
||||||
<xpath expr="//field[@name='number']" position="after">
|
|
||||||
<field name="commission_payment_ids" invisible="1"/>
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
</odoo>
|
|
||||||
Reference in New Issue
Block a user