Approval Bertingkat Menggunakan Modul Tier Validation

Assalamualaikum warahmatullahi wabarakatuh.
Pada kesempatan kali ini saya akan membahas approval bertingkat menggunakan modul tier validation untuk modul nya bisa di download di https://apps.odoo.com/apps/modules/9.0/base_tier_validation/

oke langsung saja, pertama-tama kita install dulu modul tier validation yang sudah di download tadi di odoo yang sudah kita jalankan kemudian kita custom modul yang akan kita tambahkan approval bertingkat nya, seperti contoh disini saya akan mencustom untuk modul stock.picking masukan codingan nya

class StockPicking(models.Model):
_name = "stock.picking"
_inherit = ['stock.picking', 'tier.validation']
_state_from = ['draft']
_state_to = ['assigned', 'done']

review_status = fields.Selection(
selection=[("pending", "Pending"),
("rejected", "Rejected"),
("approved", "Approved")], default="pending", compute="compute_review_status")

revision_bool = fields.Boolean(string="Revision Bool", compute="compute_revision_button")
upload_picking_id = fields.Many2one('construction.document', string="Upload Picking")

@api.depends('review_ids')
def compute_review_status(self):
for rec in self:
if rec.review_ids:
if rec.validated:
rec.review_status = "approved"
elif rec.rejected:
rec.review_status = "rejected"
else:
rec.review_status = "pending"
else:
rec.review_status = "pending"

@api.depends('state', 'review_ids')
def compute_revision_button(self):
for rec in self:
if rec.state == 'assigned':
rec.revision_bool = True
elif rec.state == 'draft' and rec.review_ids.filtered(lambda r: r.status == 'rejected'):
rec.revision_bool = True
else:
rec.revision_bool = False


lalu kita juga inherit untuk mdoul tier validationnya, untuk codingannya :

class TierDefinition(models.Model):
_inherit = "tier.definition"

@api.model
def _get_tier_validation_model_names(self):
res = super(TierDefinition, self)._get_tier_validation_model_names()
res.append("stock.picking")
return res


kemudian untuk XML nya :

<odoo>
<data>

<record id="inherit_tree_adtek" model="ir.ui.view">
<field name="name">inherit.tree.adtek</field>
<field name="model">commercial.adtek</field>
<field name="inherit_id" ref="bmo_adtek.commercial_adtek_view_tree" />
<field name="arch" type="xml">

<field name="state" position="after">
<field name="review_status" invisible="1" />
<field name="requested_by" />
</field

<xpath expr="//tree" position="attributes">
<attribute name="decoration-danger">review_status == 'rejected'</attribute>
<attribute name="decoration-bf">review_status == 'pending'</attribute>
<attribute name="decoration-success">review_status == 'approved'</attribute>
</xpath>

</field>
</record>



<record id="stock_picking_form_inherit" model="ir.ui.view">
<field name="name">Stock Picking Form Inherit</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">

<xpath expr="/form/header/field[@name='state']" position="replace">
<field name="state" widget="statusbar"/>
</xpath>

<button name="action_confirm" position="attributes">
<attribute name="attrs">{'invisible': ['|',('show_mark_as_todo', '=', False),
('review_status', 'in', ['pending','rejected'])]}</attribute>
</button>

<button name="action_confirm" position="before">
<button name="request_validation" string="Request Validation"
attrs="{'invisible': ['|','|',('need_validation', '!=', True),('rejected','=',True),
('state', '!=', 'draft')]}" type="object"/>
<button name="restart_validation" string="Restart Validation"
attrs="{'invisible': ['|',('review_ids', '=', []), ('state', '!=', 'draft')]}" type="object"/>

</button>
<header position="after">
<field name="need_validation" invisible="1"/>
<field name="validated" invisible="1"/>
<field name="rejected" invisible="1"/>
<div class="alert alert-warning" role="alert" attrs="{'invisible': ['|', '|', '|',
('validated', '=', True), ('state', '!=', 'draft'),
('rejected', '=', True), ('review_ids', '=', [])]}" style="margin-bottom:0px;">
<p>
<i class="fa fa-info-circle"/>
This Stock Picking needs to be
validated.
<field name="can_review" invisible="1"/>
<button name="validate_tier" string="Validate"
attrs="{'invisible': [('can_review', '=', False)]}" type="object"
class="oe_inline oe_button btn-success" icon="fa-thumbs-up"/>
<button name="reject_tier" string="Reject"
attrs="{'invisible': [('can_review', '=', False)]}" type="object"
class="btn-icon btn-danger" icon="fa-thumbs-down"/>
</p>
</div>
<div class="alert alert-success" role="alert"
attrs="{'invisible': ['|', '|', ('validated', '!=', True), ('state', '!=', 'draft'),
('review_ids', '=', [])]}" style="margin-bottom:0px;">
<p>
<i class="fa fa-thumbs-up"/>
Operation has been <b>validated</b>!
</p>
</div>
<div class="alert alert-danger" role="alert" attrs="{'invisible': ['|', '|',
('rejected', '!=', True), ('state', '!=', 'draft'), ('review_ids', '=', [])]}"
style="margin-bottom:0px;">
<p>
<i class="fa fa-thumbs-down"/>
Operation has been <b>rejected</b>.
</p>
</div>
</header>
<field name="origin" position="after">
<field name="revision_bool" invisible="1"/>
<field name="review_status" invisible="1"/>
</field>
<xpath expr="//form/div[hasclass('oe_chatter')]" position="before">
<field name="review_ids" widget="tier_validation"
        attrs="{'invisible':[('review_ids', '=', [])]}"/>
</xpath>
</field>
</record>
</data>
</odoo>


kemudian kita settingkan untuk di odoo nya untuk codingan dasar dari penggunaan mdoul tier hampir sama, tinggal rubah-rubah saja untuk model nya 

kita masuk ke seetting -> Technical -> Tier Definition Kemudian kita tambahkan Name untuk nama approval yang akan kita buat lalu untuk referennced model nya kita pilih modul yang kita custom tadi contoh nya kalau stock.picking kita cari stock picking kemudian vlidated by nya mau berdasarkan user atau pun group, kalau berdasarkan user kita pilih user mana yang akn approval tinggal kita pilih definition domain, approval nya mau berdasarkan apa disitu akan banyak pilihannya yang lengkap, ketika sudah di isi semua tinggal save saja.


Setelah semua di setting. Kita bisa request untuk approval ke user yang di tuju, yang tadi di setitingan kita pilih.




Setelah tadi request untuk tampilan user yang di tuju, maka akan ada notif untuk melakukan approval



tinggal pilih notif yang di atas kemudian validasi data yang sudah di request dari user sebelum nya untuk proses approval punn selesai, bisa menggunakan banyak user tinggal menambahkan nya lagi di setting ataupun bisa menggunakan group.













Cara Membuat User Notification di Odoo 14