summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/voucher.py
blob: b327df6da27d1ed9ee9bf9498e4c34d227b5f690 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from odoo import models, fields
from datetime import datetime, timedelta


class Voucher(models.Model):
    _name = 'voucher'
    _rec_name = 'display_name'

    display_name = fields.Char(string='Display Name', compute='_compute_display_name')
    name = fields.Char(string='Name')
    image = fields.Binary(string='Image')
    code = fields.Char(string='Code', help='Kode voucher yang akan berlaku untuk pengguna')
    description = fields.Text(string='Description')
    discount_amount = fields.Integer(string='Discount Amount')
    discount_type = fields.Selection(
        selection=[
            ('percentage', 'Percentage'),
            ('fixed_price', 'Fixed Price'),
        ], 
        string='Discount Type', 
        help='Select the type of discount:\n'
            '- Percentage: Persentage dari total harga.\n'
            '- Fixed Price: Jumlah tetap yang dikurangi dari harga total.'
    )
    visibility = fields.Selection(
        selection=[
            ('public', 'Public'),
            ('private', 'Private')
        ], 
        string='Visibility', 
        help='Select the visibility:\n'
            '- Public: Ditampilkan kepada seluruh pengguna.\n'
            '- Private: Tidak ditampilkan kepada seluruh pengguna.'
    )
    start_time = fields.Datetime(string='Start Time')
    end_time = fields.Datetime(string='End Time')
    min_purchase_amount = fields.Integer(string='Min. Purchase Amount', help='Nominal minimum untuk dapat menggunakan voucher. Isi 0 jika tidak ada minimum purchase amount')
    max_discount_amount = fields.Integer(string='Max. Discount Amount', help='Max nominal terhadap persentase diskon')
    order_ids = fields.One2many('sale.order', 'voucher_id', string='Order')

    def _compute_display_name(self):
        for voucher in self:
            voucher.display_name = f'{voucher.name} ({voucher.code})'

    def res_format(self):
        datas = [voucher.format() for voucher in self]
        return datas
    
    def format(self):
        ir_attachment = self.env['ir.attachment']
        discount_type = self.discount_type
        max_discount_amount = self.max_discount_amount if discount_type == 'percentage' else 0
        data = {
            'id': self.id,
            'image': ir_attachment.api_image('voucher', 'image', self.id),
            'name': self.name,
            'code': self.code,
            'description': self.description,
            'discount_amount': self.discount_amount,
            'discount_type': discount_type,
            'remaining_time': self._res_remaining_time(),
            'min_purchase_amount': self.min_purchase_amount,
            'max_discount_amount': max_discount_amount,
        }
        return data
    
    def _res_remaining_time(self):
        seconds = self._get_remaining_time()
        remaining_time = timedelta(seconds=seconds)
        hours = remaining_time.seconds // 3600
        minutes = remaining_time.seconds // 60
        if remaining_time.days > 0:
            time = remaining_time.days
            unit = 'hari'
        elif hours > 0:
            time = hours
            unit = 'jam'
        else:
            time = minutes
            unit = 'menit'
        return f'{time} {unit}'
    
    def _get_remaining_time(self):
        calculate_time = self.end_time - datetime.now()
        return round(calculate_time.total_seconds())
    
    def calculate_discount(self, price):
        if price < self.min_purchase_amount:
            return 0
        
        if self.discount_type == 'fixed_price':
            return self.discount_amount
        
        if self.discount_type == 'percentage':
            discount = price * self.discount_amount / 100
            max_disc = self.max_discount_amount
            return max_disc if discount > max_disc else discount
        
        return 0
    
    def get_active_voucher(self, parameter):
        current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        parameter += [
            ('start_time', '<=', current_time),
            ('end_time', '>=', current_time),
        ]
        vouchers =  self.search(parameter, order='min_purchase_amount ASC')
        return vouchers