sales.py 10.1 KB
from sqlite3 import DatabaseError

from odoo import api, fields, models, _
from psycopg2 import sql, DatabaseError
import logging

_logger = logging.getLogger(__name__)


class BphtbSales(models.Model):
    _name = 'bphtb.sales'
    _description = 'Transaksi BPHTB'
    # code = fields.Char(index=True, string='Code')
    # name = fields.Char(index=True, string='Name', size=64)
    #
    # rate = fields.Float(required=True)
    # disc = fields.Float(required=True)
    # min_omzet = fields.Integer(required=True)

    request_date = fields.Date()
    ppat_id = fields.Many2one('res.partner',
                              default=lambda self: self.env.user.partner_id.id
                              if not self.ppat_id else False)
    wp_id = fields.Many2one('res.partner')
    wp_name = fields.Char(related='wp_id.name', string="Wajib Pajak", store=True)
    wp_identity_number = fields.Char(related='wp_id.identity_number',
                                     string="No Identitas", store=True)
    wp_street = fields.Char(compute='_compute_wp', store=False)
    wp_street2 = fields.Char(compute='_compute_wp', store=False)
    wp_village_id = fields.Many2one('res.district.village', compute='_compute_wp', store=False,
                                    string="WP Desa/Kelurahan")
    wp_sub_district_id = fields.Many2one('res.district.sub', compute='_compute_wp',
                                         store=False, string="WP Kecamatan")
    wp_district_id = fields.Many2one('res.district', compute='_compute_wp',
                                     store=False, string="WP Kota/Kab")
    wp_state_id = fields.Many2one('res.country.state', compute='_compute_wp',
                                  store=False, string="WP Provinsi")
    wp_zip = fields.Char(compute='_compute_wp', string="WP ZIP", store=False)
    wp_phone = fields.Char(compute='_compute_wp', string="WP Phone", store=False)
    wp_email = fields.Char(compute='_compute_wp', string="WP Email", store=False)
    wp_website = fields.Char(compute='_compute_wp', string="WP Web Site", store=False)

    seller_id = fields.Many2one('res.partner')
    seller_name = fields.Char(related='wp_id.name', string="Wajib Pajak", store=True)
    seller_identity_number = fields.Char(related='wp_id.identity_number',
                                         string="No Identitas", store=True)
    seller_street = fields.Char(compute='_compute_seller', store=False)
    seller_street2 = fields.Char(compute='_compute_seller', store=False)
    seller_village_id = fields.Many2one('res.district.village', compute='_compute_seller', store=False,
                                        string="WP Desa/Kelurahan")
    seller_sub_district_id = fields.Many2one('res.district.sub', compute='_compute_seller',
                                             store=False, string="Penjual Kecamatan")
    seller_district_id = fields.Many2one('res.district', compute='_compute_seller',
                                         store=False, string="Penjual Kota/Kab")
    seller_state_id = fields.Many2one('res.country.state', compute='_compute_seller',
                                      store=False, string="Penjual Provinsi")
    seller_zip = fields.Char(compute='_compute_seller', string="Penjual ZIP", store=False)
    seller_phone = fields.Char(compute='_compute_seller', string="Penjual Phone", store=False)
    seller_email = fields.Char(compute='_compute_seller', string="Penjual Email", store=False)
    seller_website = fields.Char(compute='_compute_seller', string="Penjual Web Site", store=False)

    state = fields.Char(default='draft')  # 0 draft - 1 posted - 2 batal
    nop = fields.Char(size=18)
    tax_year = fields.Integer()
    # kd_propinsi = Column(String(2), nullable=False)
    # kd_dati2 = Column(String(2), nullable=False)
    # kd_kecamatan = Column(String(3), nullable=False)
    # kd_kelurahan = Column(String(3), nullable=False)
    # kd_blok = Column(String(3), nullable=False)
    # no_urut = Column(String(4), nullable=False)
    # kd_jns_op = Column(String(1), nullable=False)
    # op_alamat = Column(String(128), nullable=False)
    # op_blok_kav = Column(String(128), nullable=False)
    # op_rt = Column(String(3), nullable=False)
    # op_rw = Column(String(3), nullable=False)
    luas_bumi = fields.Float()
    luas_bng = fields.Float()
    njop_bumi = fields.Float()
    njop_bng = fields.Float()
    luas_bumi_bersama = fields.Float()
    luas_bng_bersama = fields.Float()
    njop_bumi_bersama = fields.Float()
    njop_bng_bersama = fields.Float()
    certicate_no = fields.Char(required=True)
    njop = fields.Float(compute="_compute_njop", store=True)
    jenis_id = fields.Many2one('bphtb.jenis')
    rate = fields.Float(related='jenis_id.rate', store=True, readonly=True)
    min_omzet = fields.Float(related='jenis_id.min_omzet', store=True, readonly=True)
    disc_sk = fields.Char(required=False)
    disc = fields.Float(related='jenis_id.disc', store=True, readonly=True)
    npop = fields.Float()
    basic_calc = fields.Float(compute="_compute_basic_calc")
    basic = fields.Float()
    fine = fields.Float()
    amount = fields.Float()
    disc_amount = fields.Float()
    payment = fields.Float()
    owed = fields.Float(compute="_compute_owed")
    typ = fields.Selection([
        ('sspd', 'SSPD'),
        ('kb', 'SKPD KB'),
        ('kbt', 'SKPD KBT'),
        ('lb', 'SKPD LB'),
        ('nihil', 'SKPD Nihil'),

    ])
    # file01 = Column(String(128))
    # file02 = Column(String(128))
    # file03 = Column(String(128))
    # file04 = Column(String(128))
    # file05 = Column(String(128))
    # file06 = Column(String(128))
    # file07 = Column(String(128))
    # file08 = Column(String(128))
    # file09 = Column(String(128))
    # file10 = Column(String(128))
    verification_date = fields.Date()
    verification_no = fields.Char()
    verification_uid = fields.Integer()
    company_id = fields.Many2one('res.company',
                                 default=lambda self: self.env.company.id
                                 if not self.company_id else False)

    # _sql_constraints = [
    #     ('company_code_uniq', 'unique (company_id, code)', 'Kode harus unik')
    # ]
    # Prosesing Wajib Pajak
    def _get_wp_field_names(self):
        return [
            ("wp_identity_number", "identity_number"),
            ("wp_street", "street"),
            ("wp_street2", "street2"),
            ("wp_village_id", "village_id"),
            ("wp_sub_district_id", "sub_district_id"),
            ("wp_district_id", "district_id"),
            ("wp_state_id", "state_id"),
            ("wp_phone", "phone"),
            ("wp_email", "email"),
            ("wp_website", "website"),
            ("wp_zip", "zip"),
        ]

    def _get_wp_update(self, partner):
        if partner:
            field = dict((key, partner[value])
                         for key, value in self._get_wp_field_names())
        else:
            field = dict((key, False)
                         for key, value in self._get_wp_address_field_names())
        return field

    def _compute_wp(self):
        if self.wp_id:
            for bphtb_sales in self.filtered(lambda bphtb_sales: bphtb_sales.wp_id):
                address_data = bphtb_sales.wp_id.sudo().address_get(adr_pref=['wp'])
                if address_data['wp']:
                    partner = bphtb_sales.wp_id.browse(address_data['wp']).sudo()
                    bphtb_sales.update(bphtb_sales._get_wp_update(partner))
                else:
                    bphtb_sales.update(bphtb_sales._get_wp_update(False))
        else:
            self.update(self._get_wp_update(False))

    # Seller
    def _get_seller_field_names(self):
        return [
            ("seller_identity_number", "identity_number"),
            ("seller_street", "street"),
            ("seller_street2", "street2"),
            ("seller_village_id", "village_id"),
            ("seller_sub_district_id", "sub_district_id"),
            ("seller_district_id", "district_id"),
            ("seller_state_id", "state_id"),
            ("seller_phone", "phone"),
            ("seller_email", "email"),
            ("seller_website", "website"),
            ("seller_zip", "zip"),
        ]

    def _get_seller_update(self, partner):
        if partner:
            field = dict((key, partner[value])
                         for key, value in self._get_seller_field_names())
        else:
            field = dict((key, False)
                         for key, value in self._get_seller_address_field_names())
        return field

    def _compute_seller(self):
        if self.seller_id:
            for bphtb_sales in self.filtered(lambda bphtb_sales: bphtb_sales.seller_id):
                address_data = bphtb_sales.seller_id.sudo().address_get(adr_pref=['wp'])
                if address_data['wp']:
                    partner = bphtb_sales.seller_id.browse(address_data['wp']).sudo()
                    bphtb_sales.update(bphtb_sales._get_seller_update(partner))
                else:
                    bphtb_sales.update(bphtb_sales._get_seller_update(False))
        else:
            self.update(self._get_seller_update(False))

    @api.depends('njop', 'npop', 'min_omzet')
    def _compute_basic_calc(self):
        if self.npop < self.njop and self.jenis_id.under_value:
            self.basic_calc = self.npop
        else:
            self.basic_calc = self.npop if self.npop > self.njop else self.njop

    @api.depends('disc', 'payment', 'basic_calc')
    def _compute_owed(self):
        self.basic = (self.basic_calc - self.min_omzet)* self.rate / 100
        self.amount = self.basic + self.fine
        self.disc_amount = self.disc / 100 * self.amount
        self.owed = self.amount - self.disc_amount - self.payment

    @api.depends('njop_bumi_bersama', 'njop_bng_bersama', 'njop_bumi', 'njop_bng')
    def _compute_njop(self):
        self.njop = self.njop_bng + self.njop_bumi + self.njop_bumi_bersama + \
                    self.njop_bng_bersama

    # @api.depends('njop')
    # def njop_change(self):