<?xml version="1.0" encoding="utf-8" ?>
<odoo>
    <record id="hr_salary_rule_view_tree_children" model="ir.ui.view">
        <field name="name">hr.salary.rule.list</field>
        <field name="model">hr.salary.rule</field>
        <field name="arch" type="xml">
            <tree>
                <field name="name" />
                <field name="code" decoration-bf="1" />
                <field name="category_id" widget="badge" />
                <field name="sequence" invisible="1" />
                <field name="register_id" />
            </tree>
        </field>
    </record>
    <record id="hr_salary_rule_view_kanban" model="ir.ui.view">
        <field name="name">hr.salary.rule.kanban</field>
        <field name="model">hr.salary.rule</field>
        <field name="arch" type="xml">
            <kanban class="o_kanban_mobile">
                <templates>
                    <t t-name="kanban-box">
                        <div t-attf-class="oe_kanban_content oe_kanban_global_click">
                            <div class="row">
                                <div class="col-8">
                                    <strong>
                                        <field name="name" />
                                    </strong>
                                </div>
                                <div class="col-4">
                                    <span class="float-right">
                                        <field name="category_id" widget="badge" />
                                    </span>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col-12">
                                    <span>
                                        Code:
                                        <field name="code" />
                                    </span>
                                </div>
                            </div>
                        </div>
                    </t>
                </templates>
            </kanban>
        </field>
    </record>
    <record id="hr_salary_rule_view_tree" model="ir.ui.view">
        <field name="name">hr.salary.rule.tree</field>
        <field name="model">hr.salary.rule</field>
        <field name="field_parent">child_ids</field>
        <field eval="20" name="priority" />
        <field name="arch" type="xml">
            <tree>
                <field name="name" />
                <field name="code" />
                <field name="category_id" invisible="True" />
                <field
                    name="company_id"
                    groups="base.group_multi_company"
                    options="{'no_create': True}"
                />
            </tree>
        </field>
    </record>
    <record id="hr_salary_rule_view_form" model="ir.ui.view">
        <field name="name">hr.salary.rule.form</field>
        <field name="model">hr.salary.rule</field>
        <field name="arch" type="xml">
            <form string="Salary Rules">
                <field name="require_code_and_category" invisible="1" />
                <div
                    class="alert alert-info oe_edit_only"
                    role="alert"
                    attrs="{'invisible':[('amount_select','!=','code')]}"
                >
            <p>
                If you have doubts about coding salary rules, check the "Help" tab in this form.
            </p>
        </div>
                <sheet>
                    <label for="name" class="oe_edit_only" />
                    <h1>
                        <field name="name" />
                    </h1>
                    <label for="category_id" class="oe_edit_only" />
                    <h2>
                        <field
                            name="category_id"
                            attrs="{'required': [('require_code_and_category','=',True)]}"
                        />
                    </h2>
                    <group name="principal">
                        <group>
                            <field
                                name="code"
                                attrs="{'required': [('require_code_and_category','=',True)]}"
                            />
                            <field name="sequence" />
                            <field name="register_id" />
                            <field
                                name="company_id"
                                options="{'no_create': True}"
                                groups="base.group_multi_company"
                            />
                        </group>
                        <group>
                            <field name="active" widget="boolean_toggle" />
                            <field name="appears_on_payslip" widget="boolean_toggle" />
                        </group>
                    </group>
                    <notebook>
                        <page string="Rule Configuration">
                            <separator string="Notes" />
                            <field
                                name="note"
                                placeholder="Write salary rule notes or observations here..."
                            />
                            <group>
                                <group string="Conditions" name="conditions">
                                    <field
                                        name="condition_select"
                                        widget="selection_badge"
                                        decoration-info="1"
                                        decoration-bf="1"
                                        nolabel="1"
                                    />
                                    <field
                                        name="condition_python"
                                        attrs="{'invisible':[('condition_select','!=','python')], 'required': [('condition_select','=','python')]}"
                                        colspan="4"
                                        widget="ace"
                                        options="{'mode': 'python'}"
                                        id="condition_python"
                                        nolabel="1"
                                    />
                                    <field
                                        name="condition_range"
                                        attrs="{'invisible':[('condition_select','!=','range')], 'required':[('condition_select','=','range')]}"
                                    />
                                    <label
                                        string="Condition Range"
                                        attrs="{'invisible':[('condition_select','!=','range')], 'required':[('condition_select','=','range')]}"
                                        for="condition_range_min"
                                    />
                                    <div
                                        attrs="{'invisible':[('condition_select','!=','range')], 'required':[('condition_select','=','range')]}"
                                    >
                                        <strong>Between </strong>
                                        <field
                                            name="condition_range_min"
                                            class="oe_inline"
                                            attrs="{'invisible':[('condition_select','!=','range')], 'required':[('condition_select','=','range')]}"
                                        />
                                        <strong> and </strong>
                                        <field
                                            name="condition_range_max"
                                            class="oe_inline"
                                            attrs="{'invisible':[('condition_select','!=','range')], 'required':[('condition_select','=','range')]}"
                                        />
                                    </div>
                                </group>
                                <group string="Computation" name="computation">
                                    <field
                                        name="amount_select"
                                        widget="selection_badge"
                                        decoration-info="1"
                                        decoration-bf="1"
                                        nolabel="1"
                                    />
                                    <field
                                        name="amount_percentage_base"
                                        attrs="{'invisible':[('amount_select','!=','percentage')], 'required': [('amount_select','=','percentage')]}"
                                    />
                                    <field
                                        name="quantity"
                                        attrs="{'invisible':[('amount_select','=','code')], 'required':[('amount_select','!=','code')]}"
                                    />
                                    <field
                                        name="amount_fix"
                                        attrs="{'invisible':[('amount_select','!=','fix')], 'required':[('amount_select','=','fix')]}"
                                    />
                                    <field
                                        colspan="4"
                                        name="amount_python_compute"
                                        attrs="{'invisible':[('amount_select','!=','code')], 'required':[('amount_select','=','code')]}"
                                        widget="ace"
                                        options="{'mode': 'python'}"
                                        id="amount_python_compute"
                                        nolabel="1"
                                    />
                                    <field
                                        name="amount_percentage"
                                        attrs="{'invisible':[('amount_select','!=','percentage')], 'required':[('amount_select','=','percentage')]}"
                                    />
                                </group>
                            </group>
                        </page>
                        <page name="rules" string="Child Rules">
                            <div class="alert alert-info" role="alert">
                                <p>
                                    Child rule functionality is useful when you need other rules to be computed before the parent one. <br
                                    />
                                    This means that all salary rules declared as childs (parent of one rule) will be added to the computation
                                    if its parent rule is included in the salary structure. So child rules will only be computed if it's parent is
                                    computed. <br />
                                    This functionality is useful for doing auxiliar calculations that are used as dependencies for the parent
                                    salary rule (e.x. rules required for complex tax computation that needs data from several modules).
                                </p>
                            </div>
                            <field name="parent_rule_id" />
                            <separator string="Children Definition" />
                            <field name="child_ids" />
                        </page>
                        <page name="inputs" string="Inputs">
                            <field name="input_ids" mode="tree">
                                <tree editable="bottom">
                                    <field name="code" />
                                    <field name="name" />
                                </tree>
                            </field>
                        </page>
                        <page name="help" string="Help">
                            <group>
                                <div style="margin-top: 4px;">
                                    <h3>Salary Rules formula definition (Python)</h3>
                                    <p>
                                        In python definition in salary rules, you can write any code like you will do
                                        in python. Any methematical operation or python function is supported.
                                    </p>
                                    <p>
                                        The following objects and variables are available to you to use it in salary rules calculations.
                                    </p>
                                    <ul>
                                        <li>
                                            <code
                                            >payslip:</code> contains current payslip object data (hr.payslip)
                                        </li>
                                        <li>
                                            <code
                                            >payslips:</code> contains payslips data (Payslips - Browsable Object)
                                        </li>
                                        <li>
                                            <code
                                            >employee:</code> contains current employee object data (hr.employee)
                                        </li>
                                        <li>
                                            <code
                                            >contract:</code> contains current contract object data (hr.contract)
                                        </li>
                                        <li>
                                            <code
                                            >rules:</code> contains the rules code (previusly computed)
                                        </li>
                                        <li>
                                            <code
                                            >categories:</code> contains the sum of amount of all rules belonging to that category
                                        </li>
                                        <li>
                                            <code
                                            >worked_days:</code> contains the computed worked days data
                                        </li>
                                        <li>
                                            <code
                                            >inputs:</code> contains the computed input data
                                        </li>
                                        <li>
                                            <code
                                            >payroll:</code> contains miscellaneous values related to payroll
                                        </li>
                                        <li>
                                            <code
                                            >current_contract:</code> contains values related/calculated for current contract
                                        </li>
                                        <li>
                                            <code
                                            >result_rules:</code> contains the values of previusly computed lines (qty, rate, amount, total)
                                        </li>
                                        <li>
                                            <code
                                            >tools:</code> contains tools and libraries which help with mathematical operations
                                        </li>
                                    </ul>
                                    <p>
                                        The calculations should be performed using the objects and variables below.
                                        Then, you have to use specific compute variables which will store the data
                                        for salary rule computation.
                                    </p>
                                    <ul>
                                        <li>
                                            <code
                                            >result:</code> the returned value should be in this variable. It matches with "amount" column.
                                        </li>
                                        <li>
                                            <code
                                            >result_rate:</code> the rate that should be applied to "result"
                                        </li>
                                        <li>
                                            <code
                                            >result_qty:</code> the quantity of units that will be multiplied to "result"
                                        </li>
                                        <li>
                                            <code
                                            >result_name:</code> overrides the current name of the rule and allows to make dynamic names
                                        </li>
                                    </ul>
                                    <h3>Examples</h3>
                                    <ul>
                                        <li>
                                            <code>result = contract.wage * 0.10</code>
                                        </li>
                                        <li>
                                            <code>
                                                result = contract.wage
                                                result_qty = worked_days.WORK100.number_of_days
                                            </code>
                                        </li>
                                        <li>
                                            <code>
                                                result = contract.wage
                                                result_rate = 10.0
                                            </code>
                                        </li>
                                    </ul>
                                </div>
                            </group>
                        </page>
                    </notebook>
                </sheet>
            </form>
        </field>
    </record>
    <record id="hr_salary_rule_view_search" model="ir.ui.view">
        <field name="name">hr.salary.rule.select</field>
        <field name="model">hr.salary.rule</field>
        <field name="arch" type="xml">
            <search string="Search Salary Rule">
                <field
                    name="name"
                    string="Salary Rules"
                    filter_domain="['|',('name','ilike',self),('code','ilike',self)]"
                />
                <field name="category_id" />
                <field name="condition_range_min" />
                <group col="8" colspan="4" expand="0" string="Group By">
                    <filter
                        string="Category"
                        name="head"
                        context="{'group_by':'category_id'}"
                    />
                </group>
            </search>
        </field>
    </record>
    <record id="action_salary_rule_form" model="ir.actions.act_window">
        <field name="name">Salary Rules</field>
        <field name="res_model">hr.salary.rule</field>
        <field name="view_mode">tree,kanban,form</field>
        <field name="domain">[('parent_rule_id','=',False)]</field>
        <field name="search_view_id" ref="hr_salary_rule_view_search" />
    </record>
    <menuitem
        id="menu_action_hr_salary_rule_form"
        action="action_salary_rule_form"
        parent="payroll_menu_configuration"
        sequence="12"
    />
    <record id="act_children_salary_rules" model="ir.actions.act_window">
        <field name="name">All Children Rules</field>
        <field name="res_model">hr.salary.rule</field>
        <field name="domain">[('parent_rule_id', '=', active_id)]</field>
        <field name="view_id" ref="hr_salary_rule_view_tree_children" />
    </record>
</odoo>
