10 Hal yang Berguna dalam Penanganan Tanggal dan Waktu
Odoo secara khusus, Python secara umum, juga SQL

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.

Cara membuat odoo terlihat seperti aplikasi standalone