Function Bawaan Odoo untuk Mengolah Tipe Data Float

Float adalah tipe data yang berupa bilangan dengan beberapa angka di belakang koma. Odoo, sebagai aplikasi bisnis tentu saja tidak bisa lepas dari tipe data satu ini. Misal untuk menyimpan data sisa stok, harga jual dan lain-lain. Jika anda belum tahu, sebagai informasi odoo memiliki beberapa function bawaan untuk mengolah data bertipe float, yang mungkin bisa memudahkan Anda. Berikut ini adalah beberapa contohnya.

float_is_zero

Berikut ini adalah definisi dari function float_is_zero.

def float_is_zero(value, precision_digits=None, precision_rounding=None):

float_is_zero digunakan untuk mengetahui suatu variabel bertipe data float sama dengan 0 atau tidak. Kenapa tidak menggunakan operator == ? seperti ini (if var_a == 0 :) ?.

Kelebihan function float_is_zero adalah kita bisa mengatur toleransi, berapa angka di belakang koma yang akan kita hitung, dengan memanfaatkan parameter precision_digits dan parameter precision_rounding. Jika kita menggunakan operator == kode if 0.02 == 0 : tentu saja akan bernilai False. Tetapi jika menggunakan float_is_zero kita bisa menentukan jika angka dibelakang koma sampai digit kedua ada yang bukan angka 0 maka variabel tersebut != 0. Sedangkan jika sampai digit kedua tidak ada angka yang bukan 0 maka variabel tersebut == 0.

Parameter value adalah variabel dengan tipe data float dengan nilai berapa saja. Parameter ini adalah nilai yang ingin kita bandingkan. Parameter ini wajib di isi.

Parameter precision_digits adalah variabel dengan tipe data integer. Menandakan sampai berapa digit angka dibelakang koma yang ingin kita bandingkan. Berikut ini adalah beberapa contoh penggunaannya.

from odoo.tools import float_is_zero

value = 0.1
is_zero = float_is_zero(value, precision_digits=2)
print('is ' + str(value) + ' zero ? ' + str(is_zero))

Dari kode diatas variabel is_zero akan bernilai False. Karena kita menset parameter precision_digits dengan nilai 2. Artinya jika ada nilai yang bukan 0 diantara angka-angka dibelakng koma sampai digit kedua, maka function float_is_zero akan return False.

from odoo.tools import float_is_zero

value = 0.01
is_zero = float_is_zero(value, precision_digits=2)
print('is ' + str(value) + ' zero ? ' + str(is_zero))

Dari kode diatas variabel is_zero juga masih bernilai False. Karena masih ada angka yang bukan 0 dari digit pertama sampai digit kedua.

from odoo.tools import float_is_zero

value = 0.001
is_zero = float_is_zero(value, precision_digits=2)
print('is ' + str(value) + ' zero ? ' + str(is_zero))

Dari kode diatas variabel is_zero akan bernilai True. Karena semua angka dibelakang koma sampai digit kedua adalah 0. Ingat kita menggunakan precision_digits dengan nilai 2. Artinya kita hanya membaca sampai 2 digit debelakang koma saja.

from odoo.tools import float_is_zero

value = 0.006
is_zero = float_is_zero(value, precision_digits=2)
print('is ' + str(value) + ' zero ? ' + str(is_zero))

Coba tebak, dari kode diatas apa nilai variabel is_zero ?. True ? Salah. Yang benar variabel is_zero sekarang bernilai False. Kenapa ? Padahal sampai digit kedua kan nilainya 0 semua. precision_digits juga hanya membaca 2 digit saja bukan ?

Perlu Anda ketahui jika jumlah angka dibelakang koma lebih banyak dari precision_digits maka variabel tersebut akan dibulatkan sampai memiliki jumlah angka dibelakang koma sama dengan precision_digits. Jika digit ke precision_digits + 1 lebih besar atau sama dengan 5, maka variabel tersebut akan dibulatkan ke atas. Misal 0.006 akan dibulatkan menjadi 0.01. Itulah kenapa nilai variabel is_zero dari kode diatas bernilai False. Sedangkan jika digit ke precision_digits + 1 lebih kecil dari 5, maka tidak ada pembulatan. Artinya nilai digit ke precision_digits + 1 diabaikan. Misal 0.004 akan dibaca 0.00.

Agar nilai precision_digits lebih dinamis, Anda bisa mengisinya dari pengaturan Decimal Accuracy. Sehingga user bisa mengaturnya dari user interface. Berikut ini adalah contoh cara mengambil precision_digits dari Decimal Accuracy.

from odoo.tools import float_is_zero

value = 0.006
precision = self.env['decimal.precision'].precision_get('Product Unit of Measure')
is_zero = float_is_zero(value, precision_digits=precision)
print('is ' + str(value) + ' zero ? ' + str(is_zero))

Berbeda dengan precision_digits, tipe data parameter precision_rounding adalah float. Umumnya kita menggunakan angka satu sebagai batas penanda angka di belakang koma. Misal jika kita ingin membatasi sebanyak 2 digit angka di belakang koma kita bisa menggunkan nilai 0.01 pada precision_rounding. Seperti pada kode dibawah ini

from odoo.tools import float_is_zero

value = 0.004
is_zero = float_is_zero(value, precision_rounding=0.01)
print('is ' + str(value) + ' zero ? ' + str(is_zero))

precision_rounding agar bisa dinamis umumnya menggunakan rounding dari Unit of Measure atau satuan, seperti pada model stock.move berikut ini.

if not float_is_zero(taken_quantity, precision_rounding=self.product_id.uom_id.rounding):

float_round

Berikut ini adalah definisi dari function float_round.

def float_round(value, precision_digits=None, precision_rounding=None, rounding_method='HALF-UP'):

Function float_round digunakan untuk membulatkan suatu variabel bertipe data float sampai beberapa angka dibelakang koma, dengan mengatur parameter precision_digits dan parameter precision_rounding. Saya tidak akan membahas parameter precision_digits dan parameter precision_rounding karena penggunaannya sama dengan function float_is_zero. Saya hanya akan membahas penggunaan parameter rounding_method.

Parameter rounding_method memiliki 3 opsi, yaitu HALF-UP, UP, dan DOWN. Nilai HALF-UP adalah nilai default. Jika kita menggunakan opsi ini, jika nilai digit batas toleransi lebih besar atau sama dengan 5, maka akan dibulatkan ke atas. Jika lebih kecil maka tidak ada pembulatan.

from odoo.tools import float_round

value = 0.015
rounded_value = float_round(value, precision_digits=2, rounding_method='HALF-UP')
print(str(value) + ' is rounded to ' + str(rounded_value))

Dari kode diatas nilai dari varabel rounded_value akan menjadi 0.02. Karena nilai dari digit ketiga lebih besar atau sama dengan 5, sehingga dibulatkan ke atas. Ingat variabel value akan dibulatkan menjadi 2 digit di belakang koma, karena nilai parameter precision_digits adalah 2.

from odoo.tools import float_round

value = 0.014
rounded_value = float_round(value, precision_digits=2, rounding_method='HALF-UP')
print(str(value) + ' is rounded to ' + str(rounded_value))

Dari kode diatas nilai dari varabel rounded_value akan menjadi 0.01. Karena nilai dari digit ketiga lebih kecil dari 5. Sehingga tidak dibulatkan ke atas.

from odoo.tools import float_round

value = 0.01004
rounded_value = float_round(value, precision_digits=2, rounding_method='UP')
print(str(value) + ' is rounded to ' + str(rounded_value))

Jika kita menggunakan opsi UP nilainya akan selalu dibulatkan ke atas, jika masih ada angka diatas 0, di digit ke precision_digits + x. Dari kode di atas nilai rounded_value akan menjadi 0.02.

from odoo.tools import float_round

value = 0.068
rounded_value = float_round(value, precision_digits=2, rounding_method='DOWN')
print(str(value) + ' is rounded to ' + str(rounded_value))

Jika kita menggunakan opsi DOWN maka tidak ada pembulatan sama sekali. Hasilnya adalah value dipotong sampai beberapa digit sesuai nilai parameter precision_digits atau parameter precision_rounding. Dari kode diatas nilai rounded_value akan menjadi 0.06.

float_compare

Berikut ini adalah definisi function float_compare.

def float_compare(value1, value2, precision_digits=None, precision_rounding=None):

Function ini digunakan untuk mengetahui apakah nilai dari value1 lebih besar atau sama dengan nilai dari value2 setelah kedua variabel tersebut dibulatkan sampai beberapa digit dibelakang koma. Function ini akan return nilai 0 jika value1 dan value2 dianggap sama. Seperti pada kode dibawah ini.

from odoo.tools import float_compare

value1 = 2.342
value2 = 2.344
result = float_compare(value1, value2, precision_digits=2)
print('result is ' + str(result))

Function ini akan return nilai -1 jika nilai value1 lebih kecil dari nilai value2 setelah keduanya dibulatkan sampai beberapa digit di belakang koma.

from odoo.tools import float_compare

value1 = 2.342
value2 = 2.346
result = float_compare(value1, value2, precision_digits=2)
print('result is ' + str(result))

Sedangkan jika nilai value1 lebih besar dari nilai value2 akan return nilai 1.

float_split

Berikut ini adalah definisi function float_split

def float_split(value, precision_digits):

Function ini digunakan untuk memecah antara angka di depan koma dengan angka di belakang koma menjadi 2 variabel terpisah. Contoh penggunaannya.

from odoo.tools import float_split
value = 2.346
unit, cent = float_split(value, precision_digits=2)
print(str(value) + ' split to unit = ' + str(unit) + ', cent = ' + str(cent))

Dari kode di atas, nilai angka di depan koma (unit) adalah 2. Sedangkan nilai angka di belakang koma (cent) adalah 35, karena sudah dibulatkan 2 digit dibelakang koma.

Di atas adalah beberapa funtion bawaan odoo untuk memanipulasi tipe data float, masih ada beberapa function yang belum saya sebutkan, silakan baca source code odoo di halaman Github mereka untuk informasi lebih detail.

Tulisan Serupa

2 Replies to “Function Bawaan Odoo untuk Mengolah Tipe Data Float”

    1. Jika yang kamu maksud adalah function bawaan untuk mengolah tipe data float seperti pada tutorial diatas, caranya sama saja dengan tulisan di atas. Import function bawaan odoo layaknya import library python pada umumnya.

      Lalu gunakan function yang diimport tadi di function yang dipanggil action server milik kamu.

      Sebagai contoh kasus dari tutorial ini => https://ngasturi.id/2019/12/24/odoo-membuat-action-server/

      Jika ingin menggunakan function float_compare dari action server, kurang lebih kodenya bisa diubah jadi seperti ini.

      from odoo import models, fields, api, exceptions, _
      # import functio bawaan odoo disini
      from odoo.tools import float_compare
      
      class SalesTarget(models.Model):
          _name = 'ng.sale.target'
      
          name = fields.Char(default='Sales Target')
          target_line_id = fields.One2many('ng.sale.target.line', 'target_id')
      
          # gunakan di function yang dipanggil action server
          def open_sales_target(self):
              value1 = 2.342
              value2 = 2.344
              result = float_compare(value1, value2, precision_digits=2)
              print('result is ' + str(result))
      

Leave a Reply

Your email address will not be published. Required fields are marked *