diff --git a/hr_commission/__init__.py b/hr_commission/__init__.py deleted file mode 100644 index 09434554..00000000 --- a/hr_commission/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from . import models diff --git a/hr_commission/__manifest__.py b/hr_commission/__manifest__.py deleted file mode 100644 index 8db1f5a6..00000000 --- a/hr_commission/__manifest__.py +++ /dev/null @@ -1,28 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -{ - 'name': 'Hibou Commissions', - 'author': 'Hibou Corp. ', - 'version': '15.0.1.1.0', - 'category': 'Accounting/Commissions', - 'license': 'OPL-1', - 'website': 'https://hibou.io/', - 'depends': [ - # 'account_invoice_margin', # optional - 'account', - 'hr_contract', - ], - 'data': [ - 'security/commission_security.xml', - 'security/ir.model.access.csv', - 'views/account_views.xml', - 'views/commission_views.xml', - 'views/hr_views.xml', - 'views/partner_views.xml', - 'views/product_views.xml', - 'views/res_config_settings_views.xml', - ], - 'installable': True, - 'application': True, - 'auto_install': False, - } diff --git a/hr_commission/i18n/es.po b/hr_commission/i18n/es.po deleted file mode 100644 index 36b58c6d..00000000 --- a/hr_commission/i18n/es.po +++ /dev/null @@ -1,530 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * hr_commission -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 15.0+e\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-30 01:21+0000\n" -"PO-Revision-Date: 2021-10-30 01:21+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_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "" -"" -msgstr "" -"" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__rate_type__admin -msgid "Admin" -msgstr "Admin" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_contract__admin_commission_rate -msgid "Admin Commission %" -msgstr "& de Comisión de Admin" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__amount -msgid "Amount" -msgstr "Monto" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__base_amount -msgid "Base Amount" -msgstr "Monto Base" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__base_total -msgid "Base Total" -msgstr "Base Total" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_form -msgid "Cancel" -msgstr "Cancelar" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__state__cancel -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Cancelled" -msgstr "Cancelado" - -#. module: hr_commission -#: model:ir.model.fields,help:hr_commission.field_hr_commission__accounting_date -msgid "" -"Choose the accounting date at which you want to value the commission moves " -"created by the commission instead of the default one." -msgstr "" -"Elija la fecha contable en la que desea valorar los movimientos de comisión " -"creados por la comisión en lugar de la predeterminada" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_form -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_tree -msgid "Commission" -msgstr "Comisión" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__rate -#: model:ir.model.fields,field_description:hr_commission.field_hr_contract__commission_rate -msgid "Commission %" -msgstr "% de Comisión" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__commission_amount -msgid "Commission Amount" -msgstr "Monto de Comisión" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_tree -msgid "Commission Amount Total" -msgstr "Monto Total de Comisión" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_res_company__commission_amount_type -#: model:ir.model.fields,field_description:hr_commission.field_res_config_settings__commission_amount_type -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "Commission Base" -msgstr "Comisión Base" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__commission_count -msgid "Commission Count" -msgstr "Recuento de comisiones" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_tree -msgid "Commission Count Total" -msgstr "Total del Recuento de Comisiones" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_res_company__commission_journal_id -#: model:ir.model.fields,field_description:hr_commission.field_res_config_settings__commission_journal_id -msgid "Commission Journal" -msgstr "Libro Diario de Comisiones" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_res_company__commission_liability_id -#: model:ir.model.fields,field_description:hr_commission.field_res_config_settings__commission_liability_id -msgid "Commission Liability Account" -msgstr "Cuenta de Pasivo de Comisión" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_hr_commission_payment -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__payment_id -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_form -msgid "Commission Payment" -msgstr "Pago de comisiones" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_form -msgid "Commission Payment Description" -msgstr "Descripción del Pago de Comisión" - -#. module: hr_commission -#: model:ir.actions.act_window,name:hr_commission.action_hr_commission_payment -#: model:ir.ui.menu,name:hr_commission.menu_action_account_commission_payment_form -msgid "Commission Payments" -msgstr "Pagos de Comisión" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_hr_commission_structure -#: model:ir.model.fields,field_description:hr_commission.field_res_partner__commission_structure_id -#: model:ir.model.fields,field_description:hr_commission.field_res_users__commission_structure_id -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_structure_form -msgid "Commission Structure" -msgstr "Estructura de Comisión" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_hr_commission_structure_line -msgid "Commission Structure Line" -msgstr "Línea de estructura de comisión" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_tree -msgid "Commission Total" -msgstr "Total de comisión" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "" -"Commission journal default accounts can be thought of as the 'expense' side of the commission. If a Liability account\n" -" is not chosen, then the employee's home address partner's Account Payable will be used instead." -msgstr "" -"Las cuentas predeterminado del libro diario de la comision se puede " -"considerar como el 'coste' de la comision. Si no se ha definido la cuenta " -"pasiva, entonces se utilizará la cuenta a pagar del socio del la direccion " -"de casa del empleado" - -#. module: hr_commission -#: code:addons/hr_commission/models/commission.py:0 -#, python-format -msgid "" -"Commission liability account must be configured if employee's don't have AP " -"setup." -msgstr "" -"Se debe configurar la cuenta pasiva de la comisión si los empleados no tienen" -" la cuenta a pagar configurada" - -#. module: hr_commission -#: model:ir.actions.act_window,name:hr_commission.action_hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_account_bank_statement_line__commission_ids -#: model:ir.model.fields,field_description:hr_commission.field_account_move__commission_ids -#: model:ir.model.fields,field_description:hr_commission.field_account_payment__commission_ids -#: model:ir.ui.menu,name:hr_commission.menu_action_account_commission_form -#: model:ir.ui.menu,name:hr_commission.menu_action_account_commission_form2 -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_pivot -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_pivot_graph -#: model_terms:ir.ui.view,arch_db:hr_commission.view_move_form_inherit -msgid "Commissions" -msgstr "Comisiones" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_res_company -msgid "Companies" -msgstr "Compañías" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__company_id -msgid "Company" -msgstr "Compañía" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_res_config_settings -msgid "Config Settings" -msgstr "Opciones de configuración" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_form -msgid "Confirm" -msgstr "Confirmar" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__state__done -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Confirmed" -msgstr "Confirmado" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_res_partner -msgid "Contact" -msgstr "Contacto" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__contract_id -msgid "Contract" -msgstr "Contrato" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__create_uid -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__create_uid -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__create_uid -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__create_uid -msgid "Created by" -msgstr "Creado por" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__create_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__create_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__create_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__create_date -msgid "Created on" -msgstr "Creado en" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__move_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__date -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_search -msgid "Date" -msgstr "Fecha" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__display_name -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__display_name -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__display_name -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__display_name -msgid "Display Name" -msgstr "Nombre para mostrar" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__employee_id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__employee_id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__employee_id -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_search -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Employee" -msgstr "Empleado" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_hr_contract -msgid "Employee Contract" -msgstr "Contrato del empleado" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__accounting_date -msgid "Force Accounting Date" -msgstr "Forzar Fecha de Contabilidad" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_search -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Group By" -msgstr "Agrupar Por" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__id -msgid "ID" -msgstr "ID" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Invoice" -msgstr "Factura" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_tree -msgid "Invoice Total" -msgstr "Total de la Factura" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "Journal" -msgstr "Libro Diario" - -#. module: hr_commission -#: model:ir.model,name:hr_commission.model_account_move -msgid "Journal Entry" -msgstr "Asiento contable" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission____last_update -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment____last_update -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure____last_update -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line____last_update -msgid "Last Modified on" -msgstr "Última Modificación en" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__write_uid -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__write_uid -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__write_uid -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__write_uid -msgid "Last Updated by" -msgstr "Última Actualización por" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__write_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__write_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__write_date -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__write_date -msgid "Last Updated on" -msgstr "Última Actualización en" - -#. module: hr_commission -#: model:ir.model.fields,help:hr_commission.field_hr_commission_structure_line__rate -msgid "Leave 0.0 to use the employee's current contract rate." -msgstr "" -"Déjelo como 0.0 para utilizar la tarifa actual del contrato del empleado" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "Liability Account" -msgstr "Cuenta Pasiva" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__line_ids -msgid "Lines" -msgstr "Líneas" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__rate_type__manual -msgid "Manual" -msgstr "Manual" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_tree -msgid "Margin" -msgstr "Margen" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_tree -msgid "Margin Total" -msgstr "Margen Total" - -#. module: hr_commission -#: model:ir.actions.server,name:hr_commission.action_commission_mark_paid -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_form -msgid "Mark Paid" -msgstr "Marcar como Pagado" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__memo -msgid "Memo" -msgstr "Nota" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__move_id -msgid "Move" -msgstr "Movimiento" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__name -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure__name -msgid "Name" -msgstr "Nombre" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__state__draft -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "New" -msgstr "Nuevo" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__rate_type__normal -msgid "Normal" -msgstr "Normal" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_account_bank_statement_line__commission_count -#: model:ir.model.fields,field_description:hr_commission.field_account_move__commission_count -#: model:ir.model.fields,field_description:hr_commission.field_account_payment__commission_count -msgid "Number of Commissions" -msgstr "Número de Comisiones" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__res_company__commission_amount_type__on_invoice_margin -msgid "On Invoice Margin" -msgstr "En el margen de factura" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__res_company__commission_type__on_invoice_paid -msgid "On Invoice Paid" -msgstr "En factura pagada" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__res_company__commission_amount_type__on_invoice_total -msgid "On Invoice Total" -msgstr "En el total de factura" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__res_company__commission_amount_type__on_invoice_untaxed -msgid "On Invoice Total Tax Excluded" -msgstr "En total de factura con impuestos excluidos" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__res_company__commission_type__on_invoice -msgid "On Invoice Validation" -msgstr "En la validación de factura" - -#. module: hr_commission -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__state__paid -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Paid" -msgstr "Pagado" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__commission_ids -msgid "Paid Commissions" -msgstr "Comisión Pagada" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_res_company__commission_type -#: model:ir.model.fields,field_description:hr_commission.field_res_config_settings__commission_type -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "Pay Commission" -msgstr "Pagar Comisión" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__rate -msgid "Rate" -msgstr "Tarifa" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__rate_type -msgid "Rate Type" -msgstr "Tipo de Tarifa" - -#. module: hr_commission -#: model:ir.model.fields,help:hr_commission.field_hr_commission__user_id -#: model:ir.model.fields,help:hr_commission.field_hr_commission_payment__user_id -msgid "Related user name for the resource to manage its access." -msgstr "" -"Nombre del usuario relacionada para que el recurso administre su acceso." - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Search Commission" -msgstr "Buscar Comisiones" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_payment_search -msgid "Search Commission Payment" -msgstr "Buscar Pago de Comisiones" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_form -msgid "Set Draft" -msgstr "Establecer Borrador" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__source_move_id -msgid "Source Move" -msgstr "Movimiento de Origen" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__state -#: model_terms:ir.ui.view,arch_db:hr_commission.view_hr_commission_search -msgid "Status" -msgstr "Estado" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__structure_id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_structure_line__structure_id -#: model:ir.model.fields.selection,name:hr_commission.selection__hr_commission__rate_type__structure -msgid "Structure" -msgstr "Estructura" - -#. module: hr_commission -#: model_terms:ir.ui.view,arch_db:hr_commission.res_config_settings_view_form -msgid "These taxes are set in any new product created." -msgstr "Estos impuestos se establecen en cualquier producto nuevo creado" - -#. module: hr_commission -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission__user_id -#: model:ir.model.fields,field_description:hr_commission.field_hr_commission_payment__user_id -msgid "User" -msgstr "Usuario" - -#. module: hr_commission -#: code:addons/hr_commission/models/commission.py:0 -#, python-format -msgid "You cannot delete a commission when it has an accounting entry." -msgstr "No puede eliminar una comisión cuando tiene un asiento contable" - -#. module: hr_commission -#: code:addons/hr_commission/models/commission.py:0 -#, python-format -msgid "You cannot mark a commission \"paid\" if it is not already \"done\"." -msgstr "Usted no puede marcar un comisión \"pagada\" si no está ya \"completada\". - -#. module: hr_commission -#: code:addons/hr_commission/models/commission.py:0 -#, python-format -msgid "You must have at least one \"done\" commission." -msgstr "Usted debe tener al menos una comisión \"completada\"." diff --git a/hr_commission/models/__init__.py b/hr_commission/models/__init__.py deleted file mode 100755 index 7573150d..00000000 --- a/hr_commission/models/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from . import account -from . import commission -from . import hr -from . import partner -from . import product_template -from . import res_company -from . import res_config_settings diff --git a/hr_commission/models/account.py b/hr_commission/models/account.py deleted file mode 100644 index 07b39f35..00000000 --- a/hr_commission/models/account.py +++ /dev/null @@ -1,68 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo import api, fields, models - - -class AccountMove(models.Model): - _inherit = 'account.move' - - commission_ids = fields.One2many(comodel_name='hr.commission', inverse_name='source_move_id', string='Commissions') - commission_count = fields.Integer(string='Number of Commissions', compute='_compute_commission_count') - - @api.depends('state', 'commission_ids') - def _compute_commission_count(self): - for move in self: - move.commission_count = len(move.commission_ids) - return True - - def open_commissions(self): - return { - 'type': 'ir.actions.act_window', - 'name': 'Invoice Commissions', - 'res_model': 'hr.commission', - 'view_mode': 'tree,form', - 'context': {'search_default_source_move_id': self[0].id} - } - - def action_post(self): - res = super(AccountMove, self).action_post() - invoices = self.filtered(lambda m: m.is_invoice()) - if invoices: - self.env['hr.commission'].invoice_validated(invoices) - return res - - def action_invoice_paid(self): - res = super(AccountMove, self).action_invoice_paid() - self.env['hr.commission'].invoice_paid(self) - return res - - def amount_for_commission(self, commission=None): - # Override to exclude ineligible products - amount = 0.0 - invoice_lines = self.invoice_line_ids.filtered(lambda l: not l.product_id.is_commission_exempt) - sign = -1 if self.move_type in ['in_refund', 'out_refund'] else 1 - if hasattr(self, 'margin') and self.company_id.commission_amount_type == 'on_invoice_margin': - margin_threshold = float(self.env['ir.config_parameter'].sudo().get_param('commission.margin.threshold', 0.0)) - if margin_threshold: - invoice_lines = invoice_lines.filtered(lambda l: l.get_margin_percent() > margin_threshold) - amount = sum(invoice_lines.mapped('margin')) - elif self.company_id.commission_amount_type == 'on_invoice_untaxed': - amount = sum(invoice_lines.mapped('price_subtotal')) - else: - amount = sum(invoice_lines.mapped('price_total')) - return amount * sign - - def action_cancel(self): - res = super(AccountMove, self).action_cancel() - for move in self: - move.sudo().commission_ids.unlink() - return res - - -class AccountMoveLine(models.Model): - _inherit = 'account.move.line' - - def get_margin_percent(self): - if not self.price_subtotal: - return 0.0 - return ((self.margin or 0.0) / self.price_subtotal) * 100.0 diff --git a/hr_commission/models/commission.py b/hr_commission/models/commission.py deleted file mode 100644 index 4a0d9580..00000000 --- a/hr_commission/models/commission.py +++ /dev/null @@ -1,325 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo import api, fields, models, _ -from odoo.tools import float_is_zero -from odoo.exceptions import UserError - - -class Commission(models.Model): - _name = 'hr.commission' - _description = 'Commission' - _order = 'id desc' - - state = fields.Selection([ - ('draft', 'New'), - ('done', 'Confirmed'), - ('paid', 'Paid'), - ('cancel', 'Cancelled'), - ], 'Status', default='draft') - employee_id = fields.Many2one('hr.employee', required=1) - user_id = fields.Many2one('res.users', related='employee_id.user_id') - source_move_id = fields.Many2one('account.move') - contract_id = fields.Many2one('hr.contract') - structure_id = fields.Many2one('hr.commission.structure') - rate_type = fields.Selection([ - ('normal', 'Normal'), - ('structure', 'Structure'), - ('admin', 'Admin'), - ('manual', 'Manual'), - ], 'Rate Type', default='normal') - rate = fields.Float('Rate') - base_total = fields.Float('Base Total') - base_amount = fields.Float(string='Base Amount') - amount = fields.Float(string='Amount') - move_id = fields.Many2one('account.move', ondelete='set null') - move_date = fields.Date(related='move_id.date', store=True) - company_id = fields.Many2one('res.company', 'Company', required=True, - default=lambda s: s.env['res.company']._company_default_get('hr.commission')) - memo = fields.Char(string='Memo') - accounting_date = fields.Date('Force Accounting Date', - help="Choose the accounting date at which you want to value the commission " - "moves created by the commission instead of the default one.") - payment_id = fields.Many2one('hr.commission.payment', string='Commission Payment', ondelete='set null') - - @api.depends('employee_id', 'source_move_id') - def name_get(self): - res = [] - for commission in self: - name = '' - if commission.source_move_id: - name += commission.source_move_id.name - if commission.employee_id: - if name: - name += ' - ' + commission.employee_id.name - else: - name += commission.employee_id.name - res.append((commission.id, name)) - return res - - @api.onchange('rate_type') - def _onchange_rate_type(self): - for commission in self.filtered(lambda c: c.rate_type == 'manual'): - commission.rate = 100.0 - - @api.onchange('source_move_id', 'contract_id', 'rate_type', 'base_amount', 'rate') - def _compute_amount(self): - for commission in self: - # Determine rate (if needed) - if commission.structure_id and commission.rate_type == 'structure': - line = commission.structure_id.line_ids.filtered(lambda l: l.employee_id == commission.employee_id) - commission.rate = line.get_rate() - elif commission.contract_id and commission.rate_type != 'manual': - if commission.rate_type == 'normal': - commission.rate = commission.contract_id.commission_rate - elif commission.rate_type == 'admin': - commission.rate = commission.contract_id.admin_commission_rate - - rounding = 2 - if commission.source_move_id: - rounding = commission.source_move_id.company_currency_id.rounding - commission.base_total = commission.source_move_id.amount_total_signed - commission.base_amount = commission.source_move_id.amount_for_commission(commission) - - amount = (commission.base_amount * commission.rate) / 100.0 - if float_is_zero(amount, precision_rounding=rounding): - amount = 0.0 - commission.amount = amount - - @api.model - def create(self, values): - res = super(Commission, self).create(values) - res._compute_amount() - if res.amount == 0.0 and res.state == 'draft': - res.state = 'done' - return res - - def unlink(self): - if self.filtered(lambda c: c.move_id): - raise UserError(_('You cannot delete a commission when it has an accounting entry.')) - return super(Commission, self).unlink() - - def _filter_source_moves_for_creation(self, moves): - return moves.filtered(lambda i: i.is_sale_document() and not i.commission_ids) - - def _commissions_to_confirm(self, moves): - commissions = moves.mapped('commission_ids') - return commissions.filtered(lambda c: c.state != 'cancel' and not c.move_id) - - def invoice_validated(self, moves): - employee_obj = self.env['hr.employee'].sudo() - commission_obj = self.sudo() - for move in self._filter_source_moves_for_creation(moves): - move_amount = move.amount_for_commission() - - # Does the invoice have a commission structure? - partner = move.partner_id - commission_structure = partner.commission_structure_id - while not commission_structure and partner: - partner = partner.parent_id - commission_structure = partner.commission_structure_id - - if commission_structure: - commission_structure.create_for_source_move(move, move_amount) - elif move.invoice_user_id: - employee = employee_obj.search([('user_id', '=', move.invoice_user_id.id)], limit=1) - contract = employee.contract_id - if all((employee, contract, contract.commission_rate)): - move.commission_ids += commission_obj.create({ - 'employee_id': employee.id, - 'contract_id': contract.id, - 'source_move_id': move.id, - 'base_amount': move_amount, - 'rate_type': 'normal', - 'company_id': move.company_id.id, - }) - - # Admin/Coach commission. - employee = employee.coach_id - contract = employee.contract_id - if all((employee, contract, contract.admin_commission_rate)): - move.commission_ids += commission_obj.create({ - 'employee_id': employee.id, - 'contract_id': contract.id, - 'source_move_id': move.id, - 'base_amount': move_amount, - 'rate_type': 'admin', - 'company_id': move.company_id.id, - }) - - if move.commission_ids and move.company_id.commission_type == 'on_invoice': - commissions = self._commissions_to_confirm(move) - commissions.sudo().action_confirm() - - return True - - def invoice_paid(self, moves): - commissions = self._commissions_to_confirm(moves) - commissions.sudo().action_confirm() - return True - - def action_confirm(self): - move_obj = self.env['account.move'].sudo() - - for commission in self: - if commission.state == 'cancel': - continue - if commission.move_id or commission.amount == 0.0: - commission.write({'state': 'done'}) - continue - - journal = commission.company_id.commission_journal_id - if not journal or not journal.default_account_id: - raise UserError('Commission Journal not configured.') - - liability_account = commission.company_id.commission_liability_id - if not liability_account: - liability_account = commission.employee_id.address_home_id.property_account_payable_id - if not liability_account: - raise UserError(_('Commission liability account must be configured if employee\'s don\'t have AP setup.')) - - date = commission.source_move_id.date if commission.source_move_id else fields.Date.context_today(commission) - - # Already paid. - payments = commission.source_move_id._get_reconciled_payments() - if payments: - date = max(payments.mapped('date')) - if commission.accounting_date: - date = commission.accounting_date - - ref = 'Commission for ' + commission.name_get()[0][1] - if commission.memo: - ref += ' :: ' + commission.memo - - move = move_obj.create({ - 'date': date, - 'ref': ref, - 'journal_id': journal.id, - 'move_type': 'entry', - 'line_ids': [ - (0, 0, { - 'name': ref, - 'partner_id': commission.employee_id.address_home_id.id, - 'account_id': liability_account.id, - 'credit': commission.amount if commission.amount > 0.0 else 0.0, - 'debit': 0.0 if commission.amount > 0.0 else -commission.amount, - }), - (0, 0, { - 'name': ref, - 'partner_id': commission.employee_id.address_home_id.id, - 'account_id': journal.default_account_id.id, - 'credit': 0.0 if commission.amount > 0.0 else -commission.amount, - 'debit': commission.amount if commission.amount > 0.0 else 0.0, - }), - ], - }) - move._post() - commission.write({'state': 'done', 'move_id': move.id}) - return True - - def action_mark_paid(self): - if self.filtered(lambda c: c.state != 'done'): - raise UserError(_('You cannot mark a commission "paid" if it is not already "done".')) - if not self: - raise UserError(_('You must have at least one "done" commission.')) - payments = self._mark_paid() - action = self.env.ref('hr_commission.action_hr_commission_payment').read()[0] - action['res_ids'] = payments.ids - return action - - def _mark_paid(self): - employees = self.mapped('employee_id') - payments = self.env['hr.commission.payment'] - for employee in employees: - commissions = self.filtered(lambda c: c.employee_id == employee) - min_date = False - max_date = False - for commission in commissions: - if not min_date or (commission.move_date and min_date > commission.move_date): - min_date = commission.move_date - if not max_date or (commission.move_date and max_date < commission.move_date): - max_date = commission.move_date - payment = payments.create({ - 'employee_id': employee.id, - 'name': ('Commissions %s - %s' % (min_date, max_date)), - 'date': fields.Date.today(), - }) - payments += payment - commissions.write({'state': 'paid', 'payment_id': payment.id}) - return payments - - def action_cancel(self): - for commission in self: - if commission.move_id: - commission.move_id.write({'state': 'draft'}) - commission.move_id.unlink() - commission.write({'state': 'cancel'}) - return True - - def action_draft(self): - for commission in self.filtered(lambda c: c.state == 'cancel'): - commission.write({'state': 'draft'}) - - -class CommissionPayment(models.Model): - _name = 'hr.commission.payment' - _description = 'Commission Payment' - _order = 'id desc' - - name = fields.Char(string='Name') - employee_id = fields.Many2one('hr.employee', required=1) - user_id = fields.Many2one('res.users', related='employee_id.user_id') - date = fields.Date(string='Date') - commission_ids = fields.One2many('hr.commission', 'payment_id', string='Paid Commissions', readonly=True) - commission_count = fields.Integer(string='Commission Count', compute='_compute_commission_stats', store=True) - commission_amount = fields.Float(string='Commission Amount', compute='_compute_commission_stats', store=True) - - @api.depends('commission_ids') - def _compute_commission_stats(self): - for payment in self: - payment.commission_count = len(payment.commission_ids) - payment.commission_amount = sum(payment.commission_ids.mapped('amount')) - - -class CommissionStructure(models.Model): - _name = 'hr.commission.structure' - _description = 'Commission Structure' - _order = 'id desc' - - name = fields.Char(string='Name') - line_ids = fields.One2many('hr.commission.structure.line', 'structure_id', string='Lines') - - def create_for_source_move(self, move, amount): - self.ensure_one() - commission_obj = self.env['hr.commission'].sudo() - - for line in self.line_ids: - employee = line.employee_id - rate = line.get_rate() - if all((employee, rate)): - contract = False - if not line.rate: - # The rate must have come from the contract. - contract = employee.contract_id - move.commission_ids += commission_obj.create({ - 'employee_id': employee.id, - 'structure_id': self.id, - 'source_move_id': move.id, - 'base_amount': amount, - 'rate_type': 'structure', - 'contract_id': contract.id if contract else False, - 'company_id': move.company_id.id, - }) - - -class CommissionStructureLine(models.Model): - _name = 'hr.commission.structure.line' - _description = 'Commission Structure Line' - - structure_id = fields.Many2one('hr.commission.structure', string='Structure', required=True) - employee_id = fields.Many2one('hr.employee', string='Employee', required=True) - rate = fields.Float(string='Commission %', default=0.0, help='Leave 0.0 to use the employee\'s current contract rate.') - - def get_rate(self): - if not self.rate: - return self.employee_id.contract_id.commission_rate - return self.rate diff --git a/hr_commission/models/hr.py b/hr_commission/models/hr.py deleted file mode 100644 index 4047ee34..00000000 --- a/hr_commission/models/hr.py +++ /dev/null @@ -1,11 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo import api, fields, models - - -class Contract(models.Model): - _inherit = 'hr.contract' - - commission_rate = fields.Float(string='Commission %', default=0.0) - admin_commission_rate = fields.Float(string='Admin Commission %', default=0.0) - diff --git a/hr_commission/models/partner.py b/hr_commission/models/partner.py deleted file mode 100644 index b88149ad..00000000 --- a/hr_commission/models/partner.py +++ /dev/null @@ -1,9 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo import fields, models - - -class Partner(models.Model): - _inherit = 'res.partner' - - commission_structure_id = fields.Many2one('hr.commission.structure', string='Commission Structure') diff --git a/hr_commission/models/product_template.py b/hr_commission/models/product_template.py deleted file mode 100644 index 77d111c8..00000000 --- a/hr_commission/models/product_template.py +++ /dev/null @@ -1,7 +0,0 @@ -from odoo import fields, models - - -class ProductTemplate(models.Model): - _inherit = 'product.template' - - is_commission_exempt = fields.Boolean('Exclude from Commissions') diff --git a/hr_commission/models/res_company.py b/hr_commission/models/res_company.py deleted file mode 100644 index febdcaf9..00000000 --- a/hr_commission/models/res_company.py +++ /dev/null @@ -1,19 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo import fields, models - - -class ResCompany(models.Model): - _inherit = 'res.company' - - commission_journal_id = fields.Many2one('account.journal', string='Commission Journal') - commission_liability_id = fields.Many2one('account.account', string='Commission Liability Account') - commission_type = fields.Selection([ - ('on_invoice', 'On Invoice Validation'), - ('on_invoice_paid', 'On Invoice Paid'), - ], string='Pay Commission', default='on_invoice_paid') - commission_amount_type = fields.Selection([ - ('on_invoice_margin', 'On Invoice Margin'), - ('on_invoice_total', 'On Invoice Total'), - ('on_invoice_untaxed', 'On Invoice Total Tax Excluded'), - ], string='Commission Base', default='on_invoice_margin') diff --git a/hr_commission/models/res_config_settings.py b/hr_commission/models/res_config_settings.py deleted file mode 100644 index 4a8f9608..00000000 --- a/hr_commission/models/res_config_settings.py +++ /dev/null @@ -1,24 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo import api, fields, models - - -class ResConfigSettings(models.TransientModel): - _inherit = 'res.config.settings' - - commission_journal_id = fields.Many2one(related='company_id.commission_journal_id', readonly=False) - commission_liability_id = fields.Many2one(related='company_id.commission_liability_id', readonly=False) - commission_type = fields.Selection(related='company_id.commission_type', readonly=False) - commission_amount_type = fields.Selection(related='company_id.commission_amount_type', readonly=False) - commission_margin_threshold = fields.Float() - - @api.model - def get_values(self): - res = super(ResConfigSettings, self).get_values() - margin_threshold = float(self.env['ir.config_parameter'].sudo().get_param('commission.margin.threshold', default=0.0)) - res.update(commission_margin_threshold=margin_threshold) - return res - - def set_values(self): - super(ResConfigSettings, self).set_values() - self.env['ir.config_parameter'].sudo().set_param('commission.margin.threshold', self.commission_margin_threshold) diff --git a/hr_commission/security/commission_security.xml b/hr_commission/security/commission_security.xml deleted file mode 100644 index 844471ff..00000000 --- a/hr_commission/security/commission_security.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Commission User - - [('user_id', '=', user.id)] - - - - - Commission Manager - - [(1, '=', 1)] - - - - - Commission Payment User - - [('user_id', '=', user.id)] - - - - - Commission Payment Manager - - [(1, '=', 1)] - - - - - diff --git a/hr_commission/security/ir.model.access.csv b/hr_commission/security/ir.model.access.csv deleted file mode 100644 index 59b621a1..00000000 --- a/hr_commission/security/ir.model.access.csv +++ /dev/null @@ -1,9 +0,0 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_commission_user,commission user,model_hr_commission,base.group_user,1,0,0,0 -access_commission_manager,commission manager,model_hr_commission,account.group_account_manager,1,1,1,1 -access_commission_payment_user,commission payment user,model_hr_commission_payment,base.group_user,1,0,0,0 -access_commission_payment_manager,commission payment manager,model_hr_commission_payment,account.group_account_manager,1,1,1,1 -access_commission_structure_user,commission structure user,model_hr_commission_structure,base.group_user,1,0,0,0 -access_commission_structure_manager,commission structure manager,model_hr_commission_structure,account.group_account_manager,1,1,1,1 -access_commission_structure_line_user,commission structure line user,model_hr_commission_structure_line,base.group_user,1,0,0,0 -access_commission_structure_line_manager,commission structure line manager,model_hr_commission_structure_line,account.group_account_manager,1,1,1,1 diff --git a/hr_commission/static/description/icon.png b/hr_commission/static/description/icon.png deleted file mode 100644 index f4d8b501..00000000 Binary files a/hr_commission/static/description/icon.png and /dev/null differ diff --git a/hr_commission/tests/__init__.py b/hr_commission/tests/__init__.py deleted file mode 100755 index c28ae751..00000000 --- a/hr_commission/tests/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from . import test_commission -from . import test_is_commission_exempt diff --git a/hr_commission/tests/test_commission.py b/hr_commission/tests/test_commission.py deleted file mode 100644 index 021652e7..00000000 --- a/hr_commission/tests/test_commission.py +++ /dev/null @@ -1,292 +0,0 @@ -# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details. - -from odoo.tests import common -from odoo.exceptions import UserError - - -class TestCommission(common.TransactionCase): - - def setUp(self): - super().setUp() - self.user = self.browse_ref('base.user_demo') - self.employee = self.browse_ref('hr.employee_qdp') # This is the employee associated with above user. - # arcive all current contracts - self.employee.contract_ids.write({'active': False}) - - def _createUser(self): - return self.env['res.users'].create({ - 'name': 'Coach', - 'email': 'coach', - }) - - def _createEmployee(self, user): - return self.env['hr.employee'].create({ - 'birthday': '1985-03-14', - 'country_id': self.ref('base.us'), - 'department_id': self.ref('hr.dep_rd'), - 'gender': 'male', - 'name': 'Jared', - 'address_home_id': user.partner_id.id, - 'user_id': user.id, - }) - - 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, - # 'type_id': self.ref('hr_contract.hr_contract_type_emp'), - '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 _create_invoice(self, user): - # Create invoice - invoice = self.env['account.move'].create({ - 'move_type': 'out_invoice', - 'partner_id': self.env.ref("base.res_partner_2").id, - 'currency_id': self.env.ref('base.USD').id, - 'invoice_date': '2020-12-11', - 'invoice_user_id': user.id, - 'invoice_line_ids': [(0, 0, { - 'product_id': self.env.ref("product.product_product_4").id, - 'quantity': 1, - 'price_unit': 5.0, - })], - }) - - self.assertEqual(invoice.invoice_user_id.id, user.id) - self.assertEqual(invoice.payment_state, 'not_paid') - return invoice - - def test_commission(self): - # find and configure company commissions journal - commission_journal = self.env['account.journal'].search([('type', '=', 'general')], limit=1) - self.assertTrue(commission_journal) - expense_account = self.env.ref('l10n_generic_coa.1_expense') - commission_journal.default_account_id = expense_account - self.env.user.company_id.commission_journal_id = commission_journal - - coach = self._createEmployee(self.browse_ref('base.user_root')) - coach_contract = self._createContract(coach, 12.0, admin_commission_rate=2.0) - user = self.user - emp = self.employee - emp.address_home_id = user.partner_id # Important field for payables. - emp.coach_id = coach - - contract = self._createContract(emp, 5.0) - - inv = self._create_invoice(user) - - self.assertFalse(inv.commission_ids, 'Commissions exist when invoice is created.') - inv.action_post() # validate - self.assertEqual(inv.state, 'posted') - self.assertEqual(inv.payment_state, 'not_paid') - self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) - self.assertEqual(len(user_commission), 1, 'Incorrect commission count %d (expect 1)' % len(user_commission)) - self.assertEqual(user_commission.state, 'draft', 'Commission is not draft.') - self.assertFalse(user_commission.move_id, 'Commission has existing journal entry.') - - # Amounts - commission_rate = contract.commission_rate - self.assertEqual(commission_rate, 5.0) - expected = (inv.amount_for_commission() * commission_rate) / 100.0 - actual = user_commission.amount - self.assertAlmostEqual(actual, expected, int(inv.company_currency_id.rounding)) - - # Pay. - pay_journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1) - payment = self.env['account.payment'].create({ - 'payment_type': 'inbound', - 'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id, - 'partner_type': 'customer', - 'partner_id': inv.partner_id.id, - 'amount': inv.amount_residual, - 'currency_id': inv.currency_id.id, - 'journal_id': pay_journal.id, - }) - payment.action_post() - - receivable_line = payment.move_id.line_ids.filtered('credit') - - inv.js_assign_outstanding_line(receivable_line.id) - self.assertEqual(inv.payment_state, 'paid', 'Invoice is not paid.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) - self.assertEqual(user_commission.state, 'done', 'Commission is not done.') - self.assertTrue(user_commission.move_id, 'Commission didn\'t create a journal entry.') - inv.company_currency_id.rounding - - # Coach/Admin commissions - coach_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == coach.id) - self.assertEqual(len(coach_commission), 1, 'Incorrect commission count %d (expect 1)' % len(coach_commission)) - - commission_rate = coach_contract.admin_commission_rate - expected = (inv.amount_for_commission() * commission_rate) / 100.0 - actual = coach_commission.amount - self.assertAlmostEqual( - actual, - expected, - int(inv.company_currency_id.rounding)) - - # Use the "Mark Paid" button - result_action = user_commission.action_mark_paid() - self.assertEqual(user_commission.state, 'paid') - self.assertTrue(user_commission.payment_id) - - def test_commission_on_invoice(self): - # Set to be On Invoice instead of On Invoice Paid - self.env.user.company_id.commission_type = 'on_invoice' - - # find and configure company commissions journal - commission_journal = self.env['account.journal'].search([('type', '=', 'general')], limit=1) - self.assertTrue(commission_journal) - expense_account = self.env.ref('l10n_generic_coa.1_expense') - commission_journal.default_account_id = expense_account - self.env.user.company_id.commission_journal_id = commission_journal - - - coach = self._createEmployee(self.browse_ref('base.user_root')) - coach_contract = self._createContract(coach, 12.0, admin_commission_rate=2.0) - user = self.user - emp = self.employee - emp.address_home_id = user.partner_id # Important field for payables. - emp.coach_id = coach - - contract = self._createContract(emp, 5.0) - - inv = self._create_invoice(user) - self.assertFalse(inv.commission_ids, 'Commissions exist when invoice is created.') - inv.action_post() # validate - self.assertEqual(inv.state, 'posted') - self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) - self.assertEqual(len(user_commission), 1, 'Incorrect commission count %d (expect 1)' % len(user_commission)) - self.assertEqual(user_commission.state, 'done', 'Commission is not done.') - self.assertTrue(user_commission.move_id, 'Commission missing journal entry.') - - # Use the "Mark Paid" button - user_commission.action_mark_paid() - self.assertEqual(user_commission.state, 'paid') - - def test_commission_structure(self): - # Set to be On Invoice instead of On Invoice Paid - self.env.user.company_id.commission_type = 'on_invoice' - - # find and configure company commissions journal - commission_journal = self.env['account.journal'].search([('type', '=', 'general')], limit=1) - self.assertTrue(commission_journal) - expense_account = self.env.ref('l10n_generic_coa.1_expense') - commission_journal.default_account_id = expense_account - self.env.user.company_id.commission_journal_id = commission_journal - - - coach = self._createEmployee(self.browse_ref('base.user_root')) - coach_contract = self._createContract(coach, 12.0, admin_commission_rate=2.0) - user = self.user - emp = self.employee - emp.address_home_id = user.partner_id # Important field for payables. - emp.coach_id = coach - - contract = self._createContract(emp, 5.0) - - # Create and set commission structure - commission_structure = self.env['hr.commission.structure'].create({ - 'name': 'Test Structure', - 'line_ids': [ - (0, 0, {'employee_id': emp.id, 'rate': 13.0}), - (0, 0, {'employee_id': coach.id, 'rate': 0.0}), # This means it will use the coach's contract normal rate - ], - }) - - inv = self._create_invoice(user) - inv.partner_id.commission_structure_id = commission_structure - self.assertFalse(inv.commission_ids, 'Commissions exist when invoice is created.') - inv.action_post() # validate - self.assertEqual(inv.state, 'posted') - self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) - self.assertEqual(len(user_commission), 1, 'Incorrect commission count %d (expect 1)' % len(user_commission)) - self.assertEqual(user_commission.state, 'done', 'Commission is not done.') - self.assertEqual(user_commission.rate, 13.0) - - coach_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == coach.id) - self.assertEqual(len(coach_commission), 1, 'Incorrect commission count %d (expect 1)' % len(coach_commission)) - self.assertEqual(coach_commission.state, 'done', 'Commission is not done.') - self.assertEqual(coach_commission.rate, 12.0, 'Commission rate should be the contract rate.') - - def test_commission_cancel_post_journal_entry(self): - # find and configure company commissions journal - commission_journal = self.env['account.journal'].search([('type', '=', 'general')], limit=1) - self.assertTrue(commission_journal) - expense_account = self.env.ref('l10n_generic_coa.1_expense') - commission_journal.default_account_id = expense_account - self.env.user.company_id.commission_journal_id = commission_journal - - coach = self._createEmployee(self.browse_ref('base.user_root')) - coach_contract = self._createContract(coach, 12.0, admin_commission_rate=2.0) - user = self.user - emp = self.employee - emp.address_home_id = user.partner_id # Important field for payables. - emp.coach_id = coach - - contract = self._createContract(emp, 5.0) - - inv = self._create_invoice(user) - - self.assertFalse(inv.commission_ids, 'Commissions exist when invoice is created.') - inv.action_post() # validate - self.assertEqual(inv.state, 'posted') - self.assertEqual(inv.payment_state, 'not_paid') - self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) - self.assertEqual(len(user_commission), 1, 'Incorrect commission count %d (expect 1)' % len(user_commission)) - self.assertEqual(user_commission.state, 'draft', 'Commission is not draft.') - self.assertFalse(user_commission.move_id, 'Commission has existing journal entry.') - - # Amounts - commission_rate = contract.commission_rate - self.assertEqual(commission_rate, 5.0) - expected = (inv.amount_for_commission() * commission_rate) / 100.0 - actual = user_commission.amount - self.assertAlmostEqual(actual, expected, int(inv.company_currency_id.rounding)) - - # Pay. - pay_journal = self.env['account.journal'].search([('type', '=', 'bank')], limit=1) - payment = self.env['account.payment'].create({ - 'payment_type': 'inbound', - 'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id, - 'partner_type': 'customer', - 'partner_id': inv.partner_id.id, - 'amount': inv.amount_residual, - 'currency_id': inv.currency_id.id, - 'journal_id': pay_journal.id, - }) - payment.action_post() - - receivable_line = payment.move_id.line_ids.filtered('credit') - - inv.js_assign_outstanding_line(receivable_line.id) - self.assertEqual(inv.payment_state, 'paid', 'Invoice is not paid.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == emp.id) - self.assertEqual(user_commission.state, 'done', 'Commission is not done.') - self.assertTrue(user_commission.move_id, 'Commission didn\'t create a journal entry.') - - # By Default, Odoo does NOT allow you to cancel/unlink a journal entry. - with self.assertRaises(UserError): - user_commission.action_cancel() - - # Our form has the needed context to allow cancel/unlink of a journal entry. - user_commission.with_context(force_delete=True).action_cancel() - self.assertEqual(user_commission.state, 'cancel', 'Commission is not cancelled.') - self.assertFalse(user_commission.move_id, 'Commission didn\'t remove journal entry.') diff --git a/hr_commission/tests/test_is_commission_exempt.py b/hr_commission/tests/test_is_commission_exempt.py deleted file mode 100644 index 25e958e9..00000000 --- a/hr_commission/tests/test_is_commission_exempt.py +++ /dev/null @@ -1,156 +0,0 @@ -from odoo.tests import common -import logging - - -_logger = logging.getLogger(__name__) - - -class TestIsCommissionExempt(common.TransactionCase): - def setUp(self): - super().setUp() - - # find and configure company commissions journal - expense_user_type = self.env['account.account.type'].search([('name', '=', 'Expenses')], limit=1) - self.assertTrue(expense_user_type) - expense_account = self.env['account.account'].search([('user_type_id', '=', expense_user_type.id), - ('company_id', '=', self.env.user.company_id.id)], limit=1) - self.assertTrue(expense_account) - commission_journal = self.env['account.journal'].search([ - ('type', '=', 'general'), - ('company_id', '=', expense_account.company_id.id), - ], limit=1) - self.assertTrue(commission_journal) - commission_journal.default_account_id = expense_account - commission_journal.default_account_id = expense_account - self.env.user.company_id.commission_journal_id = commission_journal - self.env.user.company_id.commission_type = 'on_invoice' - - self.sales_user = self.browse_ref('base.user_demo') - self.customer_partner = self.browse_ref('base.res_partner_12') - - self.sales_employee = self.sales_user.employee_id - self.sales_employee.write({ - 'address_home_id': self.sales_user.partner_id, - 'contract_ids': [(0, 0, { - 'date_start': '2016-01-01', - 'date_end': '2030-12-31', - 'name': 'Contract for tests', - 'wage': 1000.0, - # 'type_id': self.ref('hr_contract.hr_contract_type_emp'), - 'employee_id': self.sales_employee.id, - 'resource_calendar_id': self.ref('resource.resource_calendar_std'), - 'commission_rate': 10.0, - 'state': 'open', # if not "Running" then no automatic selection when Payslip is created in 11.0 - })], - }) - - self.product = self.env['product.product'].create({ - 'name': 'Test Product', - 'invoice_policy': 'order', - 'taxes_id': [], - }) - self.product_is_commission_exempt = self.env['product.product'].create({ - 'name': 'Test Product No Commission', - 'invoice_policy': 'order', - 'is_commission_exempt': True, - 'taxes_id': [], - }) - - def _createSaleOrder(self): - order = self.env['sale.order'].create({ - 'partner_id': self.customer_partner.id, - 'user_id': self.sales_user.id, - 'order_line': [(0, 0, { - 'name': 'test product', - 'product_id': self.product.id, - 'product_uom_qty': 1.0, - 'product_uom': self.product.uom_id.id, - 'price_unit': 100.0, - 'tax_id': False, - }), (0, 0, { - 'name': 'test product no commission', - 'product_id': self.product_is_commission_exempt.id, - 'product_uom_qty': 1.0, - 'product_uom': self.product_is_commission_exempt.uom_id.id, - 'price_unit': 20.0, - 'tax_id': False, - })] - }) - self.assertEqual(order.amount_total, 120.0) - return order - - def test_00_is_commission_exempt_total(self): - # TODO: test refunds - - # New attribute - self.assertFalse(self.product.is_commission_exempt) - self.assertTrue(self.product_is_commission_exempt.is_commission_exempt) - - # Calculate commission based on invoice total - self.env.user.company_id.commission_amount_type = 'on_invoice_total' - - sale = self._createSaleOrder() - sale.action_confirm() - self.assertIn(sale.state, ('sale', 'done'), 'Could not confirm, maybe archive exception rules.') - inv = sale._create_invoices() - self.assertFalse(inv.commission_ids, 'Commissions exist when invoice is created.') - inv.action_post() - self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') - self.assertEqual(inv.amount_total, 120.0) - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == self.sales_employee.id) - self.assertEqual(len(user_commission), 1) - - # rate = 10.0, total = 120.0, commission total = 100.0 - # commmission should be 10.0 - self.assertEqual(user_commission.amount, 10.0) - - def test_10_is_commission_exempt_margin(self): - self.env['ir.config_parameter'].set_param('commission.margin.threshold', '51.0') - low_margin_product = self.env['product.product'].create({ - 'name': 'Test Low Margin Product', - 'standard_price': 100.0, - 'invoice_policy': 'order', - }) - self.env.user.company_id.commission_amount_type = 'on_invoice_margin' - self.product.standard_price = 50.0 # margin is 100%, margin = $50.0 - self.product_is_commission_exempt.standard_price = 10.0 # margin is 100% - - sale = self._createSaleOrder() - sale.write({ - 'order_line': [(0, 0, { - 'name': 'test low margin product', - 'product_id': low_margin_product.id, - 'product_uom_qty': 1.0, - 'product_uom': low_margin_product.uom_id.id, - 'price_unit': 101.0, # margin is 1.0 % - 'tax_id': False, - })], - }) - - # Total margin is now $61.0, but eligible margin should still be $50.0 - sale.action_confirm() - self.assertIn(sale.state, ('sale', 'done'), 'Could not confirm, maybe archive exception rules.') - inv = sale._create_invoices() - self.assertEqual(inv.invoice_line_ids.mapped(lambda l: l.get_margin_percent()), [100.0, 100.0, 1.0]) - self.assertFalse(inv.commission_ids, 'Commissions exist when invoice is created.') - inv.action_post() - self.assertTrue(inv.commission_ids, 'Commissions not created when invoice is validated.') - - user_commission = inv.commission_ids.filtered(lambda c: c.employee_id.id == self.sales_employee.id) - self.assertEqual(len(user_commission), 1) - - # rate = 10.0, total margin = 60.0, commission margin = 50.0 - # commission should be 5.0 - self.assertEqual(user_commission.amount, 5.0) - - def test_20_test_zero_price(self): - self.env.user.company_id.commission_amount_type = 'on_invoice_margin' - self.product.standard_price = 0.0 # margin_percent is NaN - self.product_is_commission_exempt.standard_price = 10.0 # margin is 100% - - sale = self._createSaleOrder() - sale.action_confirm() - self.assertIn(sale.state, ('sale', 'done'), 'Could not confirm, maybe archive exception rules.') - inv = sale._create_invoices() - self.assertEqual(inv.invoice_line_ids.mapped(lambda l: l.get_margin_percent()), [-1.0, 100.0]) diff --git a/hr_commission/views/account_views.xml b/hr_commission/views/account_views.xml deleted file mode 100644 index a0a100d9..00000000 --- a/hr_commission/views/account_views.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - account.move.form.inherit - account.move - - - - - - - - - - account.journal.form.inherit - account.journal - - - - - - - - - \ No newline at end of file diff --git a/hr_commission/views/commission_views.xml b/hr_commission/views/commission_views.xml deleted file mode 100644 index e5864b9e..00000000 --- a/hr_commission/views/commission_views.xml +++ /dev/null @@ -1,256 +0,0 @@ - - - - hr.commission.form - hr.commission - -
-
-
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - hr.commission.tree - hr.commission - - - - - - - - - - - - - - - - - - hr.commission.pivot - hr.commission - - - - - - - - - - - - hr.commission.graph - hr.commission - - - - - - - - - - - hr.commission.search - hr.commission - - - - - - - - - - - - - - - - - - - - - Commissions - hr.commission - tree,form,pivot,graph - - - - - - - - Mark Paid - ir.actions.server - code - - - -action = records.action_mark_paid() - - - - - - hr.commission.payment.form - hr.commission.payment - -
-
- -
-

- - - - - - - - - - - - - - - - - - - - - - - - hr.commission.payment.tree - hr.commission.payment - - - - - - - - - - - - - hr.commission.payment.search - hr.commission.payment - - - - - - - - - - - - - Commission Payments - hr.commission.payment - tree,form - - - - - - - hr.commission.structure.form - hr.commission.structure - -
-
- -
-
- -
- - - - - - - - - - - - - - - - Commission Structures - hr.commission.structure - tree,form - - - - - diff --git a/hr_commission/views/hr_views.xml b/hr_commission/views/hr_views.xml deleted file mode 100644 index 6977afa2..00000000 --- a/hr_commission/views/hr_views.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - hr.contract.form.inherit - hr.contract - - - - - - - - - - \ No newline at end of file diff --git a/hr_commission/views/partner_views.xml b/hr_commission/views/partner_views.xml deleted file mode 100644 index 23fcc43d..00000000 --- a/hr_commission/views/partner_views.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - res.parter.view.form.inherit - res.partner - - - - - - - - - \ No newline at end of file diff --git a/hr_commission/views/product_views.xml b/hr_commission/views/product_views.xml deleted file mode 100644 index 45ed86fe..00000000 --- a/hr_commission/views/product_views.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - product.template.common.form.inherit - product.template - - - - - - - - - - - - product.template.common.form.inherit.manager - product.template - - - - - 0 - - - - - diff --git a/hr_commission/views/res_config_settings_views.xml b/hr_commission/views/res_config_settings_views.xml deleted file mode 100644 index 555f5faa..00000000 --- a/hr_commission/views/res_config_settings_views.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - res.config.settings.view.form.inherit.account - res.config.settings - - - - -

Commissions

-
-
-
-
- -
- Commission journal default accounts can be thought of as the 'expense' side of the commission. If a Liability account - is not chosen, then the employee's home address partner's Account Payable will be used instead. -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - - - \ No newline at end of file