summaryrefslogtreecommitdiff
path: root/indoteknik_custom/models/voucher.py
blob: 839a5d4760fad9710fa37f4e49ef07012ed9d358 (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
109
110
111
112
113
114
115
116
117
118
119
from odoo import models, fields, api
from datetime import datetime, timedelta
from odoo.exceptions import ValidationError


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')
    limit = fields.Integer(string='Limit', help='Voucher limit by sale order. Masukan 0 untuk tanpa limit')
    manufacture_ids = fields.Many2many('x_manufactures', string='Brands', help='Voucher appplied only for brand')

    @api.constrains('description')
    def _check_description_length(self):
        for record in self:
            if len(record.description) > 120:
                raise ValidationError('Description cannot exceed 120 characters')

    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,
            'manufacture_names': ", ".join([x.x_name for x in self.manufacture_ids]),
            'manufacture_ids': [x.id for x in self.manufacture_ids]
        }
        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