1. Menyesuaikan value tanggal di Odoo dengan timezone user yang sedang mengakses
import pytz
...
user = self.env.user
tz = pytz.timezone(user.tz) if user.tz else pytz.utc
start = <field_tanggal>
ran = pytz.utc.localize(start).astimezone(tz)
2. Group by Month di query SQL
sql = """
SELECT
date_trunc('month', date_order) AS txn_month,
company_id,
round(sum(amount_total), 2) as monthly_sum
FROM
pos_order
GROUP BY
txn_month,
company_id
ORDER BY
txn_month,
company_id
"""
cr = self.env.cr
cr.execute(sql)
res = cr.dictfetchall()
3. Timezone UTC di query SQL
user = self.env.user
tz = pytz.timezone(user.tz) if user.tz else pytz.utc
tz_region = tz.zone
sql = """
SELECT
date_trunc('month', date_order AT TIME ZONE 'UTC' AT TIME ZONE %s) AS txn_month,
company_id,
round(sum(amount_total), 2) as monthly_sum
FROM
pos_order
GROUP BY
txn_month,
company_id
ORDER BY
txn_month,
company_id
"""
cr = self.env.cr
cr.execute(sql, [tz_region])
res = cr.dictfetchall()
4. Iterasi dari hari ke hari mulai dari tanggal sekian sampai tanggal sekian
from datetime import timedelta
...
delta = <field_tangal_awal> - <field_tanggal_akhir>
for i in range(delta.days + 1):
get_day = <field_tanggal_awal> + timedelta(days=i)
5. Konversi value dari field float dengan widget float_time
def float_time_convert(self, float_val):
factor = float_val < 0 and -1 or 1
val = abs(float_val)
return (factor * int(math.floor(val)), int(round((val % 1) * 60)))
6. Mendapatkan tanggal terakhir dari pasangan bulan dan tahun
from calendar import monthrange
...
def get_last_day(self, dt, ws=0):
num_days = monthrange(<value_tahun>, <value_bulan>)[1]
last_date = date(<value_tahun>, <value_bulan>, num_days)
return last_date
7. Mendapatkan weekstart berdasarkan apa yang ter-setting pada environment
def get_week_start(self):
user_lang = self.env.user.lang
week_start = self.env['res.lang'].search([('code', '=', user_lang)], limit=1).week_start
return week_start
8. Perhitungan hari libur secara manual
Pertama, saya membuat sebuah model baru
Lalu, saya jadikan model tersebut ke dalam field model Res Config Settings yang related dengan field yg sama modelnya di dalam model Res Company
Kemudian, saya buat view nya dengan meng-inherit view Res Config Settings
Setelah itu, saya membuat security access nya
Jika sudah siap, jalankan Odoo dan saya pilih data nya di Odoo dengan hari Sabtu dan Minggu
Ketika semua sudah, contoh saya dalam menggunakannya di dalam codingan adalah sebagai berikut:
absence_holiday_ids = self.env.company.absence_holiday_ids.mapped('code')
for ahi in absence_holiday_ids:
if ahi.lower() == 'saturday' and tj_haid_day.strftime('%A').lower() == 'saturday':
if last_day.strftime('%A').lower() in [h.lower() for h in absence_holiday_ids]:
diff = timedelta(days=1)
else:
diff = timedelta(days=2)
elif ahi.lower() == 'sunday' and tj_haid_day.strftime('%A').lower() == 'sunday':
if last_day.strftime('%A').lower() in [h.lower() for h in absence_holiday_ids]:
diff = timedelta(days=2)
else:
diff = timedelta(days=1)
9. Menggabungkan tanggal dengan waktu awal dan akhir dalam hari
from datetime import time, datetime
...
date_start = datetime.combine(<field_tanggal_awal>, time.min)
date_finish = datetime.combine(<field_tanggal_akhir>, time.max)
10. Mendapatkan jumlah hari dari pasangan bulan dan tahun
from calendar import monthrange
...
num_days = monthrange(<value_tahun>, <value_bulan>)[1]
Referensi:
Kebanyakan dari hal di atas tidak saya dapatkan dengan sendirinya, melainkan melalui hasil pencarian yang saya lakukan di Google yang sumbernya berasal dari beberapa situs terpercaya seperti forum resmi Odoo, StackOverflow, serta blog2 yang membahas soal Python dan Odoo lainnya.