sales.py 13.7 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(readonly=True,
                               states={'draft': [('readonly', False)]}, )
    ppat_id = fields.Many2one('res.partner',
                              readonly=True,
                              states={'draft': [('readonly', False)]},
                              default=lambda self: self.env.user.partner_id.id
                              if not self.ppat_id else False)
    wp_id = fields.Many2one('res.partner', required=True, readonly=True,
                            states={'draft': [('readonly', False)]}, )
    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', readonly=True,
                                states={'draft': [('readonly', False)]}, required=True)
    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.Selection([('draft', 'Draft'),
                              ('confirmed', 'Confirmed'),
                              ('canceled', 'Canceled'),
                              ], default='draft')

    nop = fields.Char(size=18, readonly=True,
                      states={'draft': [('readonly', False)]}, )
    tax_year = fields.Integer(readonly=True,
                              states={'draft': [('readonly', False)]}, )
    # 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(readonly=True,
                             states={'draft': [('readonly', False)]}, )
    luas_bng = fields.Float(readonly=True,
                            states={'draft': [('readonly', False)]}, )
    njop_bumi = fields.Float(readonly=True,
                             states={'draft': [('readonly', False)]}, )
    njop_bng = fields.Float(readonly=True,
                            states={'draft': [('readonly', False)]}, )
    luas_bumi_bersama = fields.Float(readonly=True,
                                     states={'draft': [('readonly', False)]}, )
    luas_bng_bersama = fields.Float(readonly=True,
                                    states={'draft': [('readonly', False)]}, )
    njop_bumi_bersama = fields.Float(readonly=True,
                                     states={'draft': [('readonly', False)]}, )
    njop_bng_bersama = fields.Float(readonly=True,
                                    states={'draft': [('readonly', False)]}, )
    certicate_no = fields.Char(readonly=True,
                               states={'draft': [('readonly', False)]}, )
    njop = fields.Float(compute="_compute_njop", store=True)
    jenis_id = fields.Many2one('bphtb.jenis', readonly=True,
                               states={'draft': [('readonly', False)]},)
    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, readonly=True,
                               states={'draft': [('readonly', False)]},)
    disc = fields.Float(related='jenis_id.disc', store=True, readonly=True)
    npop = fields.Float( readonly=True,
                               states={'draft': [('readonly', False)]},)
    basic_calc = fields.Float(compute="_compute_basic_calc")
    npopkp = fields.Float( readonly=True,
                               states={'draft': [('readonly', False)]},)
    basic = fields.Float()
    fine = fields.Float()
    amount = fields.Float()
    disc_amount = fields.Float()
    payment = fields.Float( readonly=True,
                               states={'draft': [('readonly', False)]},)
    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()
    printed = fields.Boolean(default=False)
    company_id = fields.Many2one('res.company',
                                 default=lambda self: self.env.company.id
                                 if not self.company_id else False)

    def _my_check_method(self, cr, uid, ids, context=None):
        # Your code goes here
        return True or 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_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_field_names())
        return field

    def _compute_seller(self):
        for rec in self:
            if rec.seller_id:
                for bphtb_sales in rec.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:
                rec.update(rec._get_seller_update(False))

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

    @api.depends('disc', 'payment', 'basic_calc')
    def _compute_owed(self):
        for rec in self:
            rec.npopkp = rec.basic_calc - rec.min_omzet
            rec.npopkp = 0 if rec.npopkp < 0 else rec.npopkp
            rec.basic = rec.npopkp * rec.rate / 100
            rec.amount = rec.basic + rec.fine
            rec.disc_amount = rec.disc / 100 * rec.amount
            rec.owed = rec.amount - rec.disc_amount - rec.payment

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

    # @api.depends('njop')
    # def njop_change(self):
    def action_confirm(self):
        self.state = 'confirmed'

    def action_cancel(self):
        self.state = 'canceled'

    def action_draft(self):
        self.state = 'draft'

    def action_print(self):
        if not self.printed:
            self.printed = True
        data = {
            # 'from_date': self.wp_name,
            # 'to_date': self.wp_street
        }
        # docids = self.env['sale.order'].search([]).ids
        return self.env.ref('bphtb_kab.action_report_bphtb_sspd').report_action(self)  # None, data=data

    def name_get(self):
        result = []
        for record in self:
            result.append((record.id, "{} ({})".format(record.wp_name, record.nop)))
        return result

    def _validate_wp_seller(self):
        if self.wp_id == self.seller_id:
            raise ValueError("Pembeli dan penjual harus berbeda")

    # def create(self, vals, context=None):
    #     # Your code goes here
    #     res = super().create(vals, context=context)  # 'uid', 'ids', and 'vals'
    #     self._validate_wp_seller()
    #     return res
    #
    # def write(self, vals, context=None):
    #     # Your code goes here
    #     res = super().write(vals, context=None)
    #     # Your code goes here
    #     self._validate_wp_seller()
    #     return res