Commit 1d42c411 by aa.gusti

penambahan id_accounting dan dashboard

1 parent 86c89c5a
Showing 56 changed files with 6790 additions and 6 deletions
import csv
import glob
NOUPDATE = 1
BOOLEAN = ('True', 'False')
ERP_HEADER = """<?xml version="1.0"?>
<odoo>
<data noupdate="%s">"""
ERP_FOOTER = """
</data>
</odoo>
"""
FILES_WITH_UPDATE = ('product.product.csv')
def convert_relationnal_field2xml(tag, value):
mytag = tag
for elm in ['/ids', '/id', ':id']:
mytag = mytag.replace(elm, '')
if tag[-6:] == 'ids/id':
# many2many
line = '%s" eval="[(6, 0, [%s])]"/>\n' % (mytag, value)
else:
# many2one
line = '%s" ref="%s"/>\n' % (mytag, row[i])
return line
for csv_file in glob.glob('*.csv'):
no_update = NOUPDATE
if csv_file in FILES_WITH_UPDATE:
no_update = 0
xml_file = csv_file.replace('.', '_').replace('_csv', '_data.xml')
csv_data = csv.reader(open(csv_file))
xml_data = open(xml_file, 'w')
xml_data.write(ERP_HEADER % NOUPDATE + "\n\n\n")
row_num = 0
print(csv_file)
for row in csv_data:
tags = row
if row_num == 0:
for i in range(len(tags)):
tags[i] = tags[i].replace(' ', '_')
else:
for i in range(len(tags)):
char = False
numeric = True
# ambiguous column (char type but contains float string)
# should be mark by suffix |char
if tags[i][-5:] == '|char':
char = True
numeric = False
begin = ' <field name="'
try:
float(row[i])
numeric = True
except Exception:
pass
if tags[i] == 'id':
# 'id' column is supposed to be the first left
line = ('<record id="%s" model="%s">\n'
% (row[i], csv_file[:-4]))
elif '/' in tags[i] or ':' in tags[i]:
# relationnal fields
xml_suffix = convert_relationnal_field2xml(tags[i], row[i])
line = '%s%s' % (begin, xml_suffix)
elif char:
# numeric ghar field
line = '%s%s">%s</field>\n' % (begin, tags[i][:-5], row[i])
elif numeric or row[i] in BOOLEAN:
line = '%s%s" eval="%s"/>\n' % (begin, tags[i], row[i])
else:
# basic fields
line = '%s%s">%s</field>\n' % (begin, tags[i], row[i])
if row[i] or tags[i] == 'id':
xml_data.write(line)
xml_data.write('</record>' + "\n\n")
row_num += 1
xml_data.write(ERP_FOOTER)
xml_data.close()
......@@ -75,8 +75,8 @@ class District(models.Model):
limit=limit, access_rights_uid=name_get_uid)
if district_id not in first_district_ids
]
_logger.info(self.env.context.get('country_id'))
_logger.info(first_ids)
# _logger.info(self.env.context.get('country_id'))
# _logger.info(first_ids)
return first_ids
# @api.depends('code')
......@@ -200,8 +200,8 @@ class Village(models.Model):
args = args or []
if self.env.context.get('sub_district_id'):
args = expression.AND([args, [('sub_district_id', '=', self.env.context.get('sub_district_id'))]])
_logger.info(self.env.context.get('sub_district_id'))
_logger.info(args)
# _logger.info(self.env.context.get('sub_district_id'))
# _logger.info(args)
if operator == 'ilike' and not (name or '').strip():
first_domain = []
......@@ -218,8 +218,8 @@ class Village(models.Model):
limit=limit, access_rights_uid=name_get_uid)
if sub_district_id not in first_village_ids
]
_logger.info(first_ids)
_logger.info(first_village_ids)
# _logger.info(first_ids)
# _logger.info(first_village_ids)
return first_ids
def code_get(self):
......
# -*- coding: utf-8 -*-
import logging
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
from odoo.tools.misc import format_date
import re
from psycopg2 import sql
_logger = logging.getLogger(__name__)
class SequenceMixin(models.AbstractModel):
"""Mechanism used to have an editable sequence number.
Be careful of how you use this regarding the prefixes. More info in the
docstring of _get_last_sequence.
"""
_name = 'sequence.mixin'
_description = "Automatic sequence"
_sequence_field = "name"
_sequence_date_field = "date"
_sequence_index = False
_sequence_monthly_regex = r'^(?P<prefix1>.*?)(?P<year>((?<=\D)|(?<=^))((19|20|21)\d{2}|(\d{2}(?=\D))))(' \
r'?P<prefix2>\D*?)(?P<month>(0[1-9]|1[0-2]))(?P<prefix3>\D+?)(?P<seq>\d*)(' \
r'?P<suffix>\D*?)$'
_sequence_yearly_regex = r'^(?P<prefix1>.*?)(?P<year>((?<=\D)|(?<=^))((19|20|21)?\d{2}))(?P<prefix2>\D+?)(' \
r'?P<seq>\d*)(?P<suffix>\D*?)$'
_sequence_fixed_regex = r'^(?P<prefix1>.*?)(?P<seq>\d{0,9})(?P<suffix>\D*?)$'
sequence_prefix = fields.Char(compute='_compute_split_sequence', store=True)
sequence_number = fields.Integer(compute='_compute_split_sequence', store=True)
def init(self):
# Add an index to optimise the query searching for the highest sequence number
if not self._abstract and self._sequence_index:
index_name = self._table + '_sequence_index'
self.env.cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', (index_name,))
if not self.env.cr.fetchone():
self.env.cr.execute(sql.SQL("""
CREATE INDEX {index_name} ON {table} ({sequence_index}, sequence_prefix desc, sequence_number
desc, {field});
CREATE INDEX {index2_name} ON {table} ({sequence_index}, id desc, sequence_prefix);
""").format(
sequence_index=sql.Identifier(self._sequence_index),
index_name=sql.Identifier(index_name),
index2_name=sql.Identifier(index_name + "2"),
table=sql.Identifier(self._table),
field=sql.Identifier(self._sequence_field),
))
def __init__(self, pool, cr):
api.constrains(self._sequence_field,
self._sequence_date_field)(type(self)._constrains_date_sequence)
return super().__init__(pool, cr)
def _constrains_date_sequence(self):
# Make it possible to bypass the constraint to allow edition of already messed up documents.
# /!\ Do not use this to completely disable the constraint as it will make this mixin unreliable.
constraint_date = fields.Date.to_date(self.env['ir.config_parameter'].sudo().get_param(
'sequence.mixin.constraint_start_date',
'1970-01-01'
))
for record in self:
date = fields.Date.to_date(record[record._sequence_date_field])
sequence = record[record._sequence_field]
if sequence and date and date > constraint_date:
format_values = record._get_sequence_format_param(sequence)[1]
if (
format_values['year'] and format_values['year'] != date.year % 10 ** len(
str(format_values['year']))
or format_values['month'] and format_values['month'] != date.month
):
raise ValidationError(_(
"The %(date_field)s (%(date)s) doesn't match the %(sequence_field)s (%(sequence)s).\n"
"You might want to clear the field %(sequence_field)s before proceeding with the change of "
"the date.",
date=format_date(self.env, date),
sequence=sequence,
date_field=record._fields[record._sequence_date_field]._description_string(self.env),
sequence_field=record._fields[record._sequence_field]._description_string(self.env),
))
@api.depends(lambda self: [self._sequence_field])
def _compute_split_sequence(self):
for record in self:
sequence = record[record._sequence_field] or ''
regex = re.sub(r"\?P<\w+>", "?:",
record._sequence_fixed_regex.replace(r"?P<seq>", "")) # make the seq the only matching group
matching = re.match(regex, sequence)
record.sequence_prefix = sequence[:matching.start(1)]
record.sequence_number = int(matching.group(1) or 0)
@api.model
def _deduce_sequence_number_reset(self, name):
"""Detect if the used sequence resets yearly, montly or never.
:param name: the sequence that is used as a reference to detect the resetting
periodicity. Typically, it is the last before the one you want to give a
sequence.
"""
for regex, ret_val, requirements in [
(self._sequence_monthly_regex, 'month', ['seq', 'month', 'year']),
(self._sequence_yearly_regex, 'year', ['seq', 'year']),
(self._sequence_fixed_regex, 'never', ['seq']),
]:
match = re.match(regex, name or '')
if match:
groupdict = match.groupdict()
if all(req in groupdict for req in requirements):
return ret_val
raise ValidationError(_(
'The sequence regex should at least contain the seq grouping keys. For instance:\n'
'^(?P<prefix1>.*?)(?P<seq>\d*)(?P<suffix>\D*?)$'
))
def _get_last_sequence_domain(self, relaxed=False):
"""Get the sql domain to retreive the previous sequence number.
This function should be overriden by models heriting from this mixin.
:param relaxed: see _get_last_sequence.
:returns: tuple(where_string, where_params): with
where_string: the entire SQL WHERE clause as a string.
where_params: a dictionary containing the parameters to substitute
at the execution of the query.
"""
self.ensure_one()
return "", {}
def _get_starting_sequence(self):
"""Get a default sequence number.
This function should be overriden by models heriting from this mixin
This number will be incremented so you probably want to start the sequence at 0.
:return: string to use as the default sequence to increment
"""
self.ensure_one()
return "00000000"
def _get_last_sequence(self, relaxed=False):
"""Retrieve the previous sequence.
This is done by taking the number with the greatest alphabetical value within
the domain of _get_last_sequence_domain. This means that the prefix has a
huge importance.
For instance, if you have INV/2019/0001 and INV/2019/0002, when you rename the
last one to FACT/2019/0001, one might expect the next number to be
FACT/2019/0002 but it will be INV/2019/0002 (again) because INV > FACT.
Therefore, changing the prefix might not be convenient during a period, and
would only work when the numbering makes a new start (domain returns by
_get_last_sequence_domain is [], i.e: a new year).
:param field_name: the field that contains the sequence.
:param relaxed: this should be set to True when a previous request didn't find
something without. This allows to find a pattern from a previous period, and
try to adapt it for the new period.
:return: the string of the previous sequence or None if there wasn't any.
"""
self.ensure_one()
if self._sequence_field not in self._fields or not self._fields[self._sequence_field].store:
raise ValidationError(_('%s is not a stored field', self._sequence_field))
where_string, param = self._get_last_sequence_domain(relaxed)
if self.id or self.id.origin:
where_string += " AND id != %(id)s "
param['id'] = self.id or self.id.origin
query = """
UPDATE {table} SET write_date = write_date WHERE id = (
SELECT id FROM {table}
{where_string}
AND sequence_prefix = (SELECT sequence_prefix FROM {table} {where_string} ORDER BY id DESC LIMIT 1)
ORDER BY sequence_number DESC
LIMIT 1
)
RETURNING {field};
""".format(
table=self._table,
where_string=where_string,
field=self._sequence_field,
)
self.flush([self._sequence_field, 'sequence_number', 'sequence_prefix'])
self.env.cr.execute(query, param)
return (self.env.cr.fetchone() or [None])[0]
def _get_sequence_format_param(self, previous):
"""Get the python format and format values for the sequence.
:param previous: the sequence we want to extract the format from
:return tuple(format, format_values):
format is the format string on which we should call .format()
format_values is the dict of values to format the `format` string
``format.format(**format_values)`` should be equal to ``previous``
"""
sequence_number_reset = self._deduce_sequence_number_reset(previous)
regex = self._sequence_fixed_regex
if sequence_number_reset == 'year':
regex = self._sequence_yearly_regex
elif sequence_number_reset == 'month':
regex = self._sequence_monthly_regex
format_values = re.match(regex, previous).groupdict()
format_values['seq_length'] = len(format_values['seq'])
format_values['year_length'] = len(format_values.get('year', ''))
if not format_values.get('seq') and 'prefix1' in format_values and 'suffix' in format_values:
# if we don't have a seq, consider we only have a prefix and not a suffix
format_values['prefix1'] = format_values['suffix']
format_values['suffix'] = ''
for field in ('seq', 'year', 'month'):
format_values[field] = int(format_values.get(field) or 0)
placeholders = re.findall(r'(prefix\d|seq|suffix\d?|year|month)', regex)
format = ''.join(
"{seq:0{seq_length}d}" if s == 'seq' else
"{month:02d}" if s == 'month' else
"{year:0{year_length}d}" if s == 'year' else
"{%s}" % s
for s in placeholders
)
return format, format_values
def _set_next_sequence(self):
"""Set the next sequence.
This method ensures that the field is set both in the ORM and in the database.
This is necessary because we use a database query to get the previous sequence,
and we need that query to always be executed on the latest data.
:param field_name: the field that contains the sequence.
"""
self.ensure_one()
last_sequence = self._get_last_sequence()
new = not last_sequence
if new:
last_sequence = self._get_last_sequence(relaxed=True) or self._get_starting_sequence()
format, format_values = self._get_sequence_format_param(last_sequence)
if new:
format_values['seq'] = 0
format_values['year'] = self[self._sequence_date_field].year % (10 ** format_values['year_length'])
format_values['month'] = self[self._sequence_date_field].month
format_values['seq'] = format_values['seq'] + 1
self[self._sequence_field] = format.format(**format_values)
self._compute_split_sequence()
#Indonesia Goverment Accounting
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import controllers
from . import models
from . import wizard
from . import report
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Indonesia Goverment Accounting',
'version': '0.1',
'summary': 'Indonesia Goverment Accounting',
'sequence': 10,
'description': """
Indonesia Goverment Accounting
""",
'category': 'Indonesia Goverment',
'website': 'https://opensipkd.com',
'images': [],
'depends': ['id_gov','portal'],
'data': [
# 'security/account_security.xml',
'security/ir.model.access.csv',
# 'security/ir_rule.xml',
'data/account_data.xml',
'data/data_account_type.xml',
'data/account_group.xml',
'data/account.account.csv',
# 'views/menus.xml',
],
'demo': [
],
'qweb': [],
'installable': True,
'application': True,
'auto_install': False,
'license': 'LGPL-3',
'module': 'id region accounting'
}
This diff could not be displayed because it is too large.
id,"code_prefix_start",name,help
id_acc_4,4,PENDAPATAN DAERAH,"Digunakan untuk mencatat penerimaan oleh bendahara umum daerah atau oleh entitas pemerintah lainnya yang menambah saldo anggaran lebih dalam periode tahun anggaran yang bersangkutan yang menjadi hak pemerintah, dan tidak perlu dibayarembali oleh p sarang burung walet, pajak mineral bukan logam dan batuan, pajak bumi dan bangunan perdesaan dan perkotaan, serta bea perolehan hak atas tanah dan bangunan."
id_acc_41,41,PENDAPATAN ASLI DAERAH (PAD),
id_acc_4101,4101,Pajak Daerah,
id_acc_410101,410101,Pajak Kendaraan Bermotor (PKB),"Digunakan untuk mencatat pendapatan pajak atas kepemilikan dan/atau penguasaan kendaraan bermotor berupa PKB-mobil penumpang-sedan, PKB-mobil penumpang-jeep, PKB-mobil penumpangminibus, PKB-mobil bus-microbus, PKBmobil bus-bus, PKB-mobil barang/bebanpick up, PKB-mobil barang/beban-light truck, PKB-mobil barang/beban-truck, PKB-mobil barang/beban-blind van, PKB-sepeda motorsepeda motor roda dua, PKB-sepeda motorsepeda motor roda tiga, PKB-kendaraan bermotor yang dioperasikan di air, PKBkendaraan khusus alat berat/alat besar, dan PKB-mobil roda tiga."
id_acc_41010101,41010101,PKB-Mobil Penumpang-Sedan,
id_acc_41010102,41010102,PKB-Mobil Penumpang-Jeep,
id_acc_41010103,41010103,PKB-Mobil Penumpang-Minibus,
id_acc_41010104,41010104,PKB-Mobil Bus-Microbus 1229 -,
id_acc_41010105,41010105,PKB-Mobil Bus-Bus,
id_acc_41010106,41010106,PKB-Mobil Barang/Beban-Pick Up,
id_acc_41010107,41010107,PKB-Mobil Barang/Beban-Light Truck,
id_acc_41010108,41010108,PKB-Mobil Barang/Beban-Truck,
id_acc_41010109,41010109,PKB-Mobil Barang/Beban-Blind Van,
id_acc_41010110,41010110,PKB-Sepeda Motor-Sepeda Motor Roda Dua,
id_acc_41010111,41010111,PKB-Sepeda Motor-Sepeda Motor Roda Tiga,
id_acc_41010112,41010112,PKB-Kendaraan Bermotor yang Dioperasikani Air,
id_acc_41010113,41010113,PKB-Kendaraan Khusus Alat Berat/Alatesar,
id_acc_41010114,41010114,PKB-Mobil Roda Tiga,
id_acc_410102,410102,Bea Balik Nama Kendaraan BermotorBBNKB),"Digunakan untuk mencatat BBNKB-mobilenumpang-sedan, BBNKB-mobilenumpang-jeep, BBNKB-mobil penumpangminibus, BBNKB-mobil bus-microbus,BNKB-mobil bus-bus, BBNKB-mobil 1235 -arang/beban-pick up, BBNKB-mobilarang/beban-light truck, BBNKB-mobilarang/beban-truck, BBNKB-mobil barang/eban-blind van, BBNKB-sepeda motorsepeda motor roda dua, BBNKB-sepedaotor-sepeda motor roda tiga, BBNKBkendaraan bermotor yang dioperasikan diir, BBNKB-kendaraan khusus alat berat,an BBNKB-mobil roda tiga."
id_acc_41010201,41010201,BBNKB-Mobil Penumpang-Sedan,
id_acc_41010202,41010202,BBNKB-Mobil Penumpang-Jeep,
id_acc_41010203,41010203,BBNKB-Mobil Penumpang-Minibus,
id_acc_41010204,41010204,BBNKB-Mobil Bus-Microbus,
id_acc_41010205,41010205,BBNKB-Mobil Bus-Bus,
id_acc_41010206,41010206,BBNKB-Mobil Barang/Beban-Pick Up,
id_acc_41010207,41010207,BBNKB-Mobil Barang/Beban-Light Truck,
id_acc_41010208,41010208,BBNKB-Mobil Barang/Beban-Truck,
id_acc_41010209,41010209,BBNKB-Mobil Barang/Beban-Blind Van,
id_acc_41010210,41010210,BBNKB-Sepeda Motor-Sepeda Motor Rodaua,
id_acc_41010211,41010211,BBNKB-Sepeda Motor-Sepeda Motor Rodaiga,
id_acc_41010212,41010212,BBNKB-Kendaraan Bermotor yangioperasikan di Air,
id_acc_41010213,41010213,BBNKB-Kendaraan Khusus Alat Berat,
id_acc_41010214,41010214,BBNKB-Mobil Roda Tiga,
id_acc_410103,410103,Pajak Bahan Bakar Kendaraan BermotorPBBKB),"Digunakan untuk mencatat PBBKB-bahan bakar bensin, PBBKB-bahan bakar solar,BBKB-bahan bakar gas, dan PBBKB-bahan bakar lainnya."
id_acc_41010301,41010301,PBBKB-Bahan Bakar Bensin,
id_acc_41010302,41010302,PBBKB-Bahan Bakar Solar,
id_acc_41010303,41010303,PBBKB-Bahan Bakar Gas,
id_acc_41010304,41010304,PBBKB-Bahan Bakar Lainnya,
id_acc_410104,410104,Pajak Air Permukaan,
id_acc_41010401,41010401,Pajak Air Permukaan,
id_acc_410105,410105,Pajak Rokok,
id_acc_41010501,41010501,Pajak Rokok,
id_acc_410106,410106,Pajak Hotel,"Digunakan untuk mencatat pendapatan pajak atas fasilitas penyedia jasa penginapan/peristirahatan termasuk jasaerkait lainnya dengan dipungut bayaran,ang mencakup juga motel, losmen, gubukariwisata, wisma pariwisata, pesanggrahan,umah penginapan dan sejenisnya, sertaumah kos dengan jumlah kamar lebih dari 10 (sepuluh). Pe"
id_acc_41010601,41010601,PajPajak Hotel,
id_acc_41010602,41010602,Pajak Motel,
id_acc_41010603,41010603,Pajak Losmen,
id_acc_41010604,41010604,Pajak Gubuk Pariwisata,
id_acc_41010605,41010605,Pajak Wisma Pariwisata,
id_acc_41010606,41010606,Pajak Pesanggrahan,
id_acc_41010607,41010607,Pajak Rumah Penginapan dan Sejenisnya,
id_acc_41010608,41010608,Pajak Rumah Kos dengan Jumlah Kamarebih dari 10 (Sepuluh),
id_acc_410107,410107,Pajak Restoran 1241 -,"Digunakan untuk mencatat pendapatan pajak atas fasilitas penyedia makananan/atau minuman dengan dipungutayaran, yang mencakup juga rumah makan,afetaria, kantin, warung, bar, danejenisnya termasuk jasa boga/katering.encatatan tersebut berupa pajak restoranan sejenisnya, pajak rumah makan danejenisnya, pajak kafetaria dan sejenisnya,ajak kantin dan sejenisnya, pajak warungan sejenisnya, pajak bar dan sejenisnya,erta pajak jasa boga/katering danejenisnya."
id_acc_41010701,41010701,Pajak Restoran dan Sejenisnya,
id_acc_41010702,41010702,Pajak Rumah Makan dan Sejenisnya,
id_acc_41010703,41010703,Pajak Kafetaria dan Sejenisnya,
id_acc_41010704,41010704,Pajak Kantin dan Sejenisnya,
id_acc_41010705,41010705,Pajak Warung dan Sejenisnya,
id_acc_41010706,41010706,Pajak Bar dan Sejenisnya 1242 -,
id_acc_41010707,41010707,Pajak Jasa Boga/Katering dan Sejenisnya,
id_acc_410108,410108,Pajak Hiburan,"Digunakan untuk mencatat pendapatan pajak atas semua jenis tontonan,ertunjukan, permainan, dan/ataueramaian yang dinikmati dengan dipungutayaran. Pencatatan tersebut berupa pajakontonan film, pajak pagelaranesenian/musik/tari/busana, pajak kontesecantikan, binaraga, dan sejenisnya, pajakameran, pajak diskotik, karaoke, klubalam dan sejenisnya, pajakirkus/akrobat/sulap, pajak permainaniliar dan bowling, pajak pacuan kuda,endaraan bermotor, dan permainanetangkasan, pajak panti pijat, refleksi,andi uap/spa dan pusat kebugaran (fitnessenter), serta pajak pertandingan olahraga."
id_acc_41010801,41010801,Pajak Tontonan Film,
id_acc_41010802,41010802,Pajak Pagelaran Kesenian/Musik/Tari/usana,
id_acc_41010803,41010803,"Pajak Kontes Kecantikan, Binaraga, danejenisnya",
id_acc_41010804,41010804,Pajak Pameran,
id_acc_41010805,41010805,"Pajak Diskotik, Karaoke, Klub Malam, danejenisnya",
id_acc_41010806,41010806,Pajak Sirkus/Akrobat/Sulap,
id_acc_41010807,41010807,Pajak Permainan Biliar dan Bowling,
id_acc_41010808,41010808,"Pajak Pacuan Kuda, Kendaraan Bermotor,an Permainan Ketangkasan",
id_acc_41010809,41010809,"Pajak Panti Pijat, Refleksi, Mandi Uap/Spaan Pusat Kebugaran (Fitness Center)",
id_acc_41010810,41010810,Pajak Pertandingan Olahraga,
id_acc_410109,410109,Pajak Reklame,"Digunakan untuk mencatat pendapatan pajak reklameapan/billboard/videotron/megatron, pajakeklame kain, pajak reklame melekat/stiker,ajak reklame selebaran, pajak reklameerjalan, pajak reklame udara, pajak reklamepung, pajak reklame suara, pajak reklameilm/slide, dan pajak reklame peragaan."
id_acc_41010901,41010901,Pajak Reklame Papan/Billboard/Videotron/egatron,
id_acc_41010902,41010902,Pajak Reklame Kain,
id_acc_41010903,41010903,Pajak Reklame Melekat/Stiker,
id_acc_41010904,41010904,Pajak Reklame Selebaran,
id_acc_41010905,41010905,Pajak Reklame Berjalan,
id_acc_41010906,41010906,Pajak Reklame Udara,
id_acc_41010907,41010907,Pajak Reklame Apung,
id_acc_41010908,41010908,Pajak Reklame Suara,
id_acc_41010909,41010909,Pajak Reklame Film/Slide,
id_acc_41010910,41010910,Pajak Reklame Peragaan,
id_acc_410110,410110,Pajak Penerangan Jalan,Digunakan untuk mencatat pajakenerangan jalan dihasilkan sendiri danajak penerangan jalan sumber lain.
id_acc_41011001,41011001,Pajak Penerangan Jalan Dihasilkan Sendiri,
id_acc_41011002,41011002,Pajak Penerangan Jalan Sumber Lain,
id_acc_410111,410111,Pajak Parkir,
id_acc_41011101,41011101,Pajak Parkir,
id_acc_410112,410112,Pajak Air Tanah,
id_acc_41011201,41011201,Pajak Air Tanah,
id_acc_410113,410113,Pajak Sarang Burung Walet,
id_acc_41011301,41011301,Pajak Sarang Burung Walet,
id_acc_410114,410114,Pajak Mineral Bukan Logam dan Batuan,"Digunakan untuk mencatat pendapatan pajak atas kegiatan pengambilan mineralukan logam dan batuan, baik dari sumberlam di dalam dan/atau permukaan bumintuk dimanfaatkan. Pencatatan tersebuterupa pajak asbes, pajak batu tulis, pajakatu setengah permata, pajak batu kapur,ajak batu apung, pajak batu permata, pajakentonit, pajak dolomit, pajak felspar, pajakaram batu (halite), pajak grafit, pajakranit/andesit, pajak gips, pajak kalsit, pajakaolin, pajak leusit, pajak magnesit, pajak 1248 -ika, pajak marmer, pajak nitrat, pajakpsidien, pajak oker, pajak pasir dan kerikil,ajak pasir kuarsa, pajak perlit, pajakhospat, pajak talk, pajak tanah serapfullers earth), pajak tanah diatome, pajakanah liat, pajak tawas (alum), pajak tras,ajak yarosif, pajak zeolit, pajak basal, pajakrakit, dan pajak mineral bukan logam danatuan lainnya."
id_acc_41011401,41011401,Pajak Asbes,
id_acc_41011402,41011402,Pajak Batu Tulis,
id_acc_41011403,41011403,Pajak Batu Setengah Permata,
id_acc_41011404,41011404,Pajak Batu Kapur,
id_acc_41011405,41011405,Pajak Batu Apung,
id_acc_41011406,41011406,Pajak Batu Permata 1249 -,
id_acc_41011407,41011407,Pajak Bentonit,
id_acc_41011408,41011408,Pajak Dolomit,
id_acc_41011409,41011409,Pajak Felspar,
id_acc_41011410,41011410,Pajak Garam Batu (Halite),
id_acc_41011411,41011411,Pajak Grafit,
id_acc_41011412,41011412,Pajak Granit/Andesit,
id_acc_41011413,41011413,Pajak Gips,
id_acc_41011414,41011414,Pajak Kalsit,
id_acc_41011415,41011415,Pajak Kaolin,
id_acc_41011416,41011416,Pajak Leusit,
id_acc_41011417,41011417,Pajak Magnesit,
id_acc_41011418,41011418,Pajak Mika,
id_acc_41011419,41011419,Pajak Marmer,
id_acc_41011420,41011420,Pajak Nitrat,
id_acc_41011421,41011421,Pajak Opsidien,
id_acc_41011422,41011422,Pajak Oker,
id_acc_41011423,41011423,Pajak Pasir dan Kerikil,
id_acc_41011424,41011424,Pajak Pasir Kuarsa,
id_acc_41011425,41011425,Pajak Perlit,
id_acc_41011426,41011426,Pajak Phospat 1252 -,
id_acc_41011427,41011427,Pajak Talk,
id_acc_41011428,41011428,Pajak Tanah Serap (Fullers Earth),
id_acc_41011429,41011429,Pajak Tanah Diatome,
id_acc_41011430,41011430,Pajak Tanah Liat,
id_acc_41011431,41011431,Pajak Tawas (Alum),
id_acc_41011432,41011432,Pajak Tras,
id_acc_41011433,41011433,Pajak Yarosif,
id_acc_41011434,41011434,Pajak Zeolit,
id_acc_41011435,41011435,Pajak Basal,
id_acc_41011436,41011436,Pajak Trakit,
id_acc_41011437,41011437,Pajak Mineral bukan Logam dan Batuanainnya,
id_acc_410115,410115,Pajak Bumi dan Bangunan Perdesaan danerkotaan (PBBP2),
id_acc_41011501,41011501,PBB P2,
id_acc_410116,410116,Bea Perolehan Hak Atas Tanah danangunan (BPHTB),Digunakan untuk mencatat pendapatan pajak atas perolehan hak atas tanahan/atau bangunan. Pencatatan tersebuterupa BPHTB-pemindahan hak dan BPHTBpemberian hak baru.
id_acc_41011601,41011601,BPHTB-Pemindahan Hak,
id_acc_41011602,41011602,BPHTB-Pemberian Hak Baru,
id_acc_4102,4102,Retribusi Daerah,Digunakan untuk mencatat pendapatan atasungutan daerah otonom sebagaiembayaran atas jasa atau pemberian izinertentu yang khusus disediakan dan/atauiberikan oleh pemerintah daerah untukepentingan orang pribadi atau badan.
id_acc_410201,410201,Retribusi Jasa Umum,"Digunakan untuk mencatat pendapatan ataselayanan yang disediakan atau diberikan pemerintah daerah otonom untuk tujuanepentingan dan kemanfaatan umum sertaapat dinikmati oleh orang pribadi atauadan. Pencatatan tersebut berupa retribusielayanan kesehatan, retribusi pelayananersampahan/kebersihan, retribusielayanan pemakaman dan pengabuan 1255 -ayat, retribusi pelayanan parkir di tepialan umum, retribusi pelayanan pasar,etribusi pengujian kendaraan bermotor,etribusi pemeriksaan alat pemadamebakaran, retribusi penggantian biaya cetaketa, retribusi penyediaan dan/atauenyedotan kakus, retribusi pengolahanimbah cair, retribusi pelayanan tera/teralang, retribusi pelayanan pendidikan, sertaetribusi pengawasan dan pengendalianenara telekomunikasi."
id_acc_41020101,41020101,Retribusi Pelayanan Kesehatan,"Digunakan untuk mencatat pelayananesehatan di puskesmas, puskesmas keliling,uskesmas pembantu, balai pengobatan,umah sakit umum daerah, dan tempatelayanan kesehatan lainnya yang sejenisang dimiliki dan/atau dikelola olehemerintah daerah, kecuali pelayananendaftaran."
id_acc_41020102,41020102,Retribusi Pelayanan Persampahan/ebersihan,
id_acc_41020103,41020103,Retribusi Pelayanan Pemakaman danengabuan Mayat,
id_acc_41020104,41020104,Retribusi Pelayanan Parkir di Tepi Jalan 1257 -mum,
id_acc_41020105,41020105,Retribusi Pelayanan Pasar,"Digunakan untuk mencatat pendapatan atasungutan daerah otonom sebagaiembayaran atas jasa penyediaan fasilitasasar tradisional/sederhana, berupaelataran, los, kios yang dikelola pemerintahaerah, dan khusus disediakan untukedagang."
id_acc_41020106,41020106,Retribusi Pengujian Kendaraan Bermotor,
id_acc_41020107,41020107,Retribusi Pemeriksaan Alat Pemadamebakaran,
id_acc_41020108,41020108,Retribusi Penggantian Biaya Cetak Peta,
id_acc_41020109,41020109,Retribusi Penyediaan dan/atau Penyedotanakus,
id_acc_41020110,41020110,Retribusi Pengolahan Limbah Cair,
id_acc_41020111,41020111,Retribusi Pelayanan Tera/Tera Ulang,
id_acc_41020112,41020112,Retribusi Pelayanan Pendidikan,
id_acc_41020113,41020113,Retribusi Pengawasan dan Pengendalianenara Telekomunikasi,
id_acc_410202,410202,Retribusi Jasa Usaha 1261 -,"Digunakan untuk mencatat pendapatan atasasa yang disediakan oleh pemerintah daerahengan menganut prinsip-prinsip komersialarena pada dasarnya dapat pula disediakanleh sektor swasta. Pencatatan tersebuterupa retribusi pemakaian kekayaanaerah, retribusi pasar grosir dan/atauertokoan, retribusi penyediaan tempatelelangan, retribusi terminal, retribusiempat khusus parkir, retribusi tempatenginapan/pesanggrahan/ vila, retribusiumah potong hewan, retribusi pelayananepelabuhanan, retribusi tempat rekreasian olahraga, retribusi penyeberangan air,an retribusi penjualan produksi usahaaerah."
id_acc_41020201,41020201,Retribusi Pemakaian Kekayaan Daerah,
id_acc_41020202,41020202,Retribusi Pasar Grosir dan/atau Pertokoan,
id_acc_41020203,41020203,Retribusi Tempat Pelelangan,
id_acc_41020204,41020204,Retribusi Terminal,
id_acc_41020205,41020205,Retribusi Tempat Khusus Parkir,
id_acc_41020206,41020206,Retribusi Tempatenginapan/Pesanggrahan/ Vila,
id_acc_41020207,41020207,Retribusi Rumah Potong Hewan,
id_acc_41020208,41020208,Retribusi Pelayanan Kepelabuhanan 1264 -,
id_acc_41020209,41020209,Retribusi Tempat Rekreasi dan Olahraga,
id_acc_41020210,41020210,Retribusi Penyeberangan di Air,
id_acc_41020211,41020211,Retribusi Penjualan Produksi Usaha Daerah,
id_acc_410203,410203,Retribusi Perizinan Tertentu,"Digunakan untuk mencatat pendapatan ataselayanan perizinan tertentu olehemerintah daerah dalam rangka pemberianzin kepada orang pribadi atau badan yangimaksudkan untuk pembinaan,engaturan, pengendalian dan pengawasantas kegiatan, pemanfaatan ruang, sertaenggunaan sumber daya alam, barang,rasarana, sarana atau fasilitas tertentuuna melindungi kepentingan umum danenjaga kelestarian lingkungan. Pencatatanersebut berupa retribusi izin mendirikanangunan, retribusi izin tempat penjualaninuman beralkohol, retribusi izin trayekntuk menyediakan pelayanan angkutanmum, retribusi izin usaha perikanan,etribusi pengendalian lalu lintas, danetribusi perpanjangan Izin Mempekerjakanenaga Kerja Asing (IMTA)."
id_acc_41020301,41020301,Retribusi Izin Mendirikan Bangunan,
id_acc_41020302,41020302,Retribusi Izin Tempat Penjualan Minumaneralkohol,
id_acc_41020303,41020303,Retribusi Izin Trayek untuk Menyediakanelayanan Angkutan Umum,
id_acc_41020304,41020304,Retribusi Izin Usaha Perikanan,
id_acc_41020305,41020305,Retribusi Pengendalian Lalu Lintas,
id_acc_41020306,41020306,Retribusi Perpanjangan Izin Mempekerjakanenaga Kerja Asing (IMTA),
id_acc_4103,4103,Hasil Pengelolaan Kekayaan Daerah yangipisahkan,
id_acc_410301,410301,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMN,
id_acc_41030101,41030101,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMN,
id_acc_410302,410302,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD,"Digunakan untuk mencatat bagian laba yangibagikan kepada pemerintah daerahdividen) atas penyertaan modal pada BUMDlembaga keuangan), bagian laba yangibagikan kepada pemerintah daerahdividen) atas penyertaan modal pada BUMDaneka usaha), bagian laba yang dibagikanepada pemerintah daerah (dividen) atasenyertaan modal pada BUMD (bidang airinum), bagian laba yang dibagikan kepadaemerintah daerah (dividen) atas penyertaanodal pada BUMD (bidang limbah), danagian laba yang dibagikan kepadaemerintah daerah (dividen) atas penyertaan 1268 -odal pada BUMD (bidang sanitasi)."
id_acc_41030201,41030201,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD (Lembaga Keuangan),
id_acc_41030202,41030202,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD (Aneka Usaha),
id_acc_41030203,41030203,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD (Bidang Air Minum),
id_acc_41030204,41030204,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD (Bidang Limbah),
id_acc_41030205,41030205,Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD (Bidang Sanitasi),
id_acc_4104,4104,Lain-lain PAD yang Sah 1270 -,"Digunakan untuk mencatat pendapatanaerah yang tidak termasuk dalam jenisajak daerah, retribusi daerah danendapatan hasil pengelolaan kekayaanaerah yang dipisahkan."
id_acc_410401,410401,Hasil Penjualan BMD yang Tidak Dipisahkan,"Digunakan untuk mencatat hasil penjualananah, hasil penjualan peralatan dan mesin,asil penjualan gedung dan bangunan, hasilenjualan jalan, jaringan, dan irigasi, hasilenjualan aset tetap lainnya, hasil penjualanset lainnya-tagihan jangka panjang, sertaasil penjualan aset lainnya-aset tidakerwujud."
id_acc_41040101,41040101,Hasil Penjualan Tanah,
id_acc_41040102,41040102,Hasil Penjualan Peralatan dan Mesin,
id_acc_41040103,41040103,Hasil Penjualan Gedung dan Bangunan,
id_acc_41040104,41040104,"Hasil Penjualan Jalan, Jaringan, dan Irigasi",
id_acc_41040105,41040105,Hasil Penjualan Aset Tetap Lainnya,
id_acc_41040106,41040106,Hasil Penjualan Aset Lainnya,
id_acc_410402,410402,Hasil Selisih Lebih Tukar Menukar BMDang Tidak Dipisahkan,"Digunakan untuk mencatat pendapatan yang berasal dari hasil selisih lebih tukar menukaranah, hasil selisih lebih tukar menukareralatan dan mesin, hasil selisih lebih tukarenukar gedung dan bangunan, hasil selisihebih tukar menukar jalan, jaringan danrigasi, hasil selisih lebih tukar menukar asetetap lainnya, serta hasil selisih lebih tukarenukar aset lainnya-aset tidak berwujud."
id_acc_41040201,41040201,Hasil Selisih Lebih Tukar Menukar Tanah,
id_acc_41040202,41040202,Hasil Selisih Lebih Tukar Menukar Peralatanan Mesin,
id_acc_41040203,41040203,Hasil Selisih Lebih Tukar Menukar Gedungan Bangunan,
id_acc_41040204,41040204,"Hasil Selisih Lebih Tukar Menukar Jalan,aringan, dan Irigasi",
id_acc_41040205,41040205,Hasil Selisih Lebih Tukar Menukar Asetetap Lainnya,
id_acc_41040206,41040206,Hasil Selisih Lebih Tukar Menukar Asetainnya,
id_acc_410403,410403,Hasil Pemanfaatan BMD yang Tidakipisahkan,"Digunakan untuk mencatat pendapatan hasilewa BMD, hasil kerja sama pemanfaatanMD, hasil dari bangun guna serah, hasilari bangun serah guna, dan hasil dari kerjaama penyediaan infrastruktur."
id_acc_41040301,41040301,Hasil Sewa BMD,
id_acc_41040302,41040302,Hasil Kerja Sama Pemanfaatan BMD,
id_acc_41040303,41040303,Hasil dari Bangun Guna Serah 1282 -,
id_acc_41040304,41040304,Hasil dari Bangun Serah Guna,
id_acc_41040305,41040305,Hasil dari Kerja Sama Penyediaannfrastruktur,
id_acc_410404,410404,Hasil Kerja Sama Daerah,
id_acc_41040401,41040401,Hasil Kerja Sama Daerah,
id_acc_410405,410405,JasaGiro,"Digunakan untuk mencatat pendapatan jasairo pada kas daerah, jasa giro pada kas diendahara, jasa giro pada rekening danaadangan, jasa giro pada BLUD, jasa giroada rekening dana BOS, dan jasa giro dana 1283 -apitasi pada FKTP."
id_acc_41040501,41040501,Jasa Giro pada Kas Daerah,
id_acc_41040502,41040502,Jasa Giro pada Kas di Bendahara,
id_acc_41040503,41040503,Jasa Giro pada Rekening Dana Cadangan,
id_acc_41040504,41040504,Jasa Giro pada BLUD,
id_acc_41040505,41040505,Jasa Giro pada Rekening Dana BOS,
id_acc_41040506,41040506,Jasa Giro Dana Kapitasi pada FKTP,
id_acc_410406,410406,Hasil Pengelolaan Dana Bergulir,
id_acc_41040601,41040601,Hasil Pengelolaan Dana Bergulir,
id_acc_410407,410407,Pendapatan Bunga,Digunakan untuk mencatat pendapatanunga atas penempatan uang pemerintahaerah.
id_acc_41040701,41040701,Pendapatan Bunga atas Penempatan Uangemerintah Daerah,
id_acc_410408,410408,Penerimaan atas Tuntutan Ganti Kerugianeuangan Daerah,Digunakan untuk mencatat penerimaan yang berasal dari tuntutan ganti kerugian daeraherhadap bendahara dan tuntutan gantierugian daerah terhadap pegawai negeriukan bendahara atau pejabat lain.
id_acc_41040801,41040801,Tuntutan Ganti Kerugian Daerah terhadapendahara 1285 -,
id_acc_41040802,41040802,Tuntutan Ganti Kerugian Daerah terhadapegawai Negeri Bukan Bendahara atauejabat Lain,
id_acc_410409,410409,"Penerimaan Komisi, Potongan, atau Bentukain",
id_acc_41040901,41040901,"Penerimaan Komisi, Potongan, atau Bentukain",
id_acc_410410,410410,Penerimaan Keuntungan dari Selisih Nilaiukar Rupiah terhadap Mata Uang Asing,
id_acc_41041001,41041001,Penerimaan Keuntungan dari Selisih Nilaiukar Rupiah terhadap Mata Uang Asing,
id_acc_410411,410411,Pendapatan Denda atas Keterlambatanelaksanaan Pekerjaan,
id_acc_41041101,41041101,Pendapatan Denda atas Keterlambatanelaksanaan Pekerjaan,
id_acc_410412,410412,Pendapatan Denda Pajak Daerah,"Digunakan untuk mencatat pendapatanenda pajak kendaraan bermotor,endapatan denda bea balik namaendaraan bermotor, pendapatan dendaajak bahan bakar kendaraan bermotor,endapatan denda pajak air permukaan,endapatan denda pajak rokok, pendapatanenda pajak hotel, pendapatan denda pajakestoran, pendapatan denda pajak hiburan,endapatan denda pajak reklame,endapatan denda pajak penerangan jalan,endapatan denda pajak parkir, pendapatanenda pajak air tanah, pendapatan dendaajak sarang burung walet, pendapatanenda pajak mineral bukan logam danatuan, pendapatan denda pajak bumi danangunan perdesaan dan perkotaan, sertaendapatan denda bea perolehan hak atasanah dan bangunan."
id_acc_41041201,41041201,Pendapatan Denda Pajak Kendaraanermotor (PKB),
id_acc_41041202,41041202,Pendapatan Denda Bea Balik Namaendaraan Bermotor (BBNKB),
id_acc_41041203,41041203,Pendapatan Denda Pajak Bahan Bakarendaraan Bermotor (PBBKB),
id_acc_41041204,41041204,Pendapatan Denda Pajak Air Permukaan,
id_acc_41041205,41041205,Pendapatan Denda Pajak Rokok,
id_acc_41041206,41041206,Pendapatan Denda Pajak Hotel,
id_acc_41041207,41041207,Pendapatan Denda Pajak Restoran,
id_acc_41041208,41041208,Pendapatan Denda Pajak Hiburan,
id_acc_41041209,41041209,Pendapatan Denda Pajak Reklame,
id_acc_41041210,41041210,Pendapatan Denda Pajak Penerangan Jalan,
id_acc_41041211,41041211,Pendapatan Denda Pajak Parkir,
id_acc_41041212,41041212,Pendapatan Denda Pajak Air Tanah,
id_acc_41041213,41041213,Pendapatan Denda Pajak Sarang Burungalet,
id_acc_41041214,41041214,Pendapatan Denda Pajak Mineral Bukanogam dan Batuan,
id_acc_41041215,41041215,Pendapatan Denda Pajak Bumi danangunan Perdesaan dan Perkotaan (PBBP2),
id_acc_41041216,41041216,Pendapatan Denda Bea Perolehan Hak atasanah dan Bangunan (BPHTB),Digunakan untuk mencatat pendapatanenda BPHTB-pemindahan hak dan BPHTBpemberian hak baru.
id_acc_410413,410413,Pendapatan Denda Retribusi Daerah,"Digunakan untuk mencatat pendapatanenda retribusi jasa umum, pendapatanenda retribusi jasa usaha, dan pendapatanenda retribusi perizinan tertentu."
id_acc_41041301,41041301,Pendapatan Denda Retribusi Jasa Umum,
id_acc_41041302,41041302,Pendapatan Denda Retribusi Jasa Usaha,
id_acc_41041303,41041303,Pendapatan Denda Retribusi Perizinanertentu,
id_acc_410414,410414,Pendapatan Hasil Eksekusi atas Jaminan,
id_acc_41041401,41041401,Hasil Eksekusi atas Jaminan atas Pengadaanarang/Jasa,
id_acc_410415,410415,Pendapatan dari Pengembalian,"Digunakan untuk mencatat pendapatan dariengembalian kelebihan pembayaran pajakenghasilan Pasal 21, pendapatan dariengembalian kelebihan pembayaranaminan kesehatan, pendapatan dariengembalian kelebihan pembayaran gajian tunjangan, pendapatan dariengembalian kelebihan pembayaranerjalanan dinas, pendapatan dariengembalian kelebihan pembayaranaminan kecelakaan kerja, pendapatan dariengembalian kelebihan pembayaranaminan kematian, dan pendapatan dariengembalian kelebihan pembayaranaminan kesehatan nasional."
id_acc_41041501,41041501,Pendapatan dari Pengembalian Kelebihanembayaran Pajak Penghasilan Pasal 21,
id_acc_41041502,41041502,Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kesehatan,
id_acc_41041503,41041503,Pendapatan dari Pengembalian Kelebihanembayaran Gaji dan Tunjangan,
id_acc_41041504,41041504,Pendapatan dari Pengembalian Kelebihanembayaran Perjalanan Dinas,
id_acc_41041505,41041505,Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kecelakaan Kerja (JKK),
id_acc_41041506,41041506,Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kematian (JKM),
id_acc_41041507,41041507,Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kesehatan NasionalJKN),
id_acc_410416,410416,Pendapatan BLUD,
id_acc_41041601,41041601,Pendapatan BLUD,
id_acc_410417,410417,Pendapatan Denda Pemanfaatan BMD yangidak Dipisahkan,Digunakan untuk mencatat pendapatanenda sewa pengakhiran sewa barang milikaerah dan denda hasil dari kerja samaenyediaan infrastruktur.
id_acc_41041701,41041701,Pendapatan Denda Pengakhiran Sewa BMD,
id_acc_41041702,41041702,Pendapatan Denda Hasil dari Kerja Samaenyediaan Infrastruktur,
id_acc_410418,410418,Pendapatan Dana Kapitasi Jaminanesehatan Nasional (JKN) pada Fasilitasesehatan Tingkat Pertama (FKTP),
id_acc_41041801,41041801,Pendapatan Dana Kapitasi JKN pada FKTP,
id_acc_410419,410419,Pendapatan Hasil Pengelolaan Dana Bergulir,
id_acc_41041901,41041901,Pendapatan Hasil Pengelolaan Dana Bergulir 1307 -,
id_acc_410420,410420,Pendapatan Berdasarkan Putusanengadilan (Inkracht),
id_acc_41042001,41042001,Pendapatan Berdasarkan Putusanengadilan (Inkracht),
id_acc_410421,410421,Pendapatan Denda atas Pelanggaraneraturan Daerah,
id_acc_41042101,41042101,Pendapatan Denda atas Pelanggaraneraturan Daerah ...,
id_acc_410422,410422,Pendapatan Zakat,
id_acc_41042201,41042201,Pendapatan Zakat,
id_acc_42,42,PENDAPATAN TRANSFER,
id_acc_4201,4201,Pendapatan Transfer Pemerintah Pusat,
id_acc_420101,420101,Dana Perimbangan,"Digunakan untuk mencatat pendapatan yang bersumber dari APBN yang dialokasikanepada daerah untuk mendanai kebutuhanaerah dalam rangka pelaksanaanesentralisasi. Pencatatan tersebut berupa 1308 -ana transfer umum-dana bagi hasil, danaransfer umum-dana alokasi umum, danaransfer khusus-dana alokasi khusus fisik,an dana transfer khusus-dana alokasihusus non fisik."
id_acc_42010101,42010101,Dana Transfer Umum-Dana Bagi Hasil (DBH),
id_acc_42010102,42010102,Dana Transfer Umum-Dana Alokasi Umum 1310 -DAU),
id_acc_42010103,42010103,Dana Transfer Khusus-Dana Alokasi KhususDAK) Fisik,
id_acc_42010104,42010104,Dana Transfer Khusus-Dana Alokasi KhususDAK) Non Fisik,
id_acc_420102,420102,Dana Insentif Daerah (DID),
id_acc_42010201,42010201,DID,
id_acc_420103,420103,Dana Otonomi Khusus,"Digunakan untuk mencatat Dana Otonomihusus-Provinsi Papua, Dana Otonomi 1322 -husus-Provinsi Papua Barat, Dana Otonomihusus-Provinsi Aceh, Dana Tambahannfrastruktur dalam rangka Otonomi Khususrovinsi Papua, dan Dana Tambahannfrastruktur dalam rangka Otonomi Khususrovinsi Papua Barat."
id_acc_42010301,42010301,Dana Otonomi Khusus-Provinsi Papua,
id_acc_42010302,42010302,Dana Otonomi Khusus-Provinsi Papua Barat,
id_acc_42010303,42010303,Dana Otonomi Khusus-Provinsi Aceh,
id_acc_42010304,42010304,Dana Tambahan Infrastruktur dalam rangkatonomi Khusus Provinsi Papua,
id_acc_42010305,42010305,Dana Tambahan Infrastruktur dalam rangkatonomi Khusus Provinsi Papua Barat,
id_acc_420104,420104,Dana Keistimewaan,
id_acc_42010401,42010401,Dana Keistimewaan Daerah Istimewa Jogyakarta,
id_acc_420105,420105,Dana Desa,
id_acc_42010501,42010501,Dana Desa,
id_acc_4202,4202,Pendapatan Transfer Antar Daerah,
id_acc_420201,420201,Pendapatan Bagi,Hasil Digunakan untuk mencatat pendapatan bagiasil pajak dan bantuan keuangan.
id_acc_42020101,42020101,Pendapatan Bagi Hasil Pajak,
id_acc_420202,420202,Bantuan Keuangan,
id_acc_42020201,42020201,Bantuan Keuangan Umum dari Pemerintahrovinsi,
id_acc_42020202,42020202,Bantuan Keuangan Khusus dari Pemerintahrovinsi,
id_acc_42020203,42020203,Bantuan Keuangan Umum dari Pemerintahabupaten/Kota,
id_acc_42020204,42020204,Bantuan Keuangan Khusus dari Pemerintahabupaten/Kota,
id_acc_43,43,LAIN-LAIN PENDAPATAN DAERAH YANGAH,
id_acc_4301,4301,Pendapatan Hibah,"Digunakan untuk mencatat pendapatanibah termasuk sumbangan pihaketiga/sejenis yang tidak mengikat, tidakerdasarkan perhitungan tertentu, dan tidakempunyai konsekuensi pengeluaran atauengurangan kewajiban kepada penerimaaupun pemberi serta tidak menyebabkankonomi biaya tinggi."
id_acc_430101,430101,Pendapatan Hibah dari Pemerintah Pusat,
id_acc_43010101,43010101,Pendapatan Hibah dari Pemerintah Pusat,
id_acc_430102,430102,Pendapatan Hibah dari Pemerintah Daerahainnya,
id_acc_43010201,43010201,Pendapatan Hibah dari Pemerintah Daerahainnya,
id_acc_430103,430103,Pendapatan Hibah dari Kelompokasyarakat/Perorangan Dalam Negeri,
id_acc_43010301,43010301,Pendapatan Hibah dari Kelompokasyarakat/Perorangan Dalam Negeri,
id_acc_430104,430104,Pendapatan Hibah dari Badan/Lembaga/rganisasi Dalam Negeri/Luar Negeri,"Digunakan untuk mencatat pendapatanibah dari badan/lembaga/ organisasi dalamegeri, pendapatan hibah dariadan/lembaga/ organisasi luar negeri,endapatan hibah dari lembaga/organisasiwasta dalam negeri, dan pendapatan hibahari lembaga/organisasi swasta luar negeri."
id_acc_43010401,43010401,Pendapatan Hibah dari Badan/Lembaga/rganisasi Dalam Negeri,
id_acc_43010402,43010402,Pendapatan Hibah dari Badan/Lembaga/rganisasi Luar Negeri,
id_acc_43010403,43010403,Pendapatan Hibah dari Lembaga/Organisasiwasta Dalam Negeri,
id_acc_43010404,43010404,Pendapatan Hibah dari Lembaga/Organisasiwasta Luar Negeri 1329 -,
id_acc_430105,430105,Sumbangan Pihak Ketiga/Sejenis,
id_acc_43010501,43010501,Sumbangan Pihak Ketiga/Sejenis,
id_acc_4302,4302,Dana Darurat,
id_acc_430201,430201,Dana Darurat,
id_acc_43020101,43020101,Dana Darurat,
id_acc_4303,4303,Lain-lain Pendapatan Sesuai denganetentuan Peraturan Perundang-Undangan,
id_acc_430301,430301,Lain-lain Pendapatan,Digunakan untuk mencatat pendapatanibah dana BOS dan pendapatan atas pengembalian hibah.
id_acc_43030101,43030101,Pendapatan Hibah Dana BOS,
id_acc_43030102,43030102,Pendapatan atas Pengembalian Hibah,
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- <record forcecreate="True" id="decimal_payment" model="decimal.precision">-->
<!-- <field name="name">Payment Terms</field>-->
<!-- <field name="digits">6</field>-->
<!-- </record>-->
<!-- &lt;!&ndash; Open Settings from Purchase Journal to configure mail servers &ndash;&gt;-->
<!-- <record id="action_open_settings" model="ir.actions.act_window">-->
<!-- <field name="name">Settings</field>-->
<!-- <field name="res_model">res.config.settings</field>-->
<!-- <field name="view_mode">form</field>-->
<!-- <field name="target">inline</field>-->
<!-- <field name="context" eval="{'module': 'general_settings', 'bin_size': False}"/>-->
<!-- </record>-->
<!-- TAGS FOR CASH FLOW STATEMENT DIRECT METHOD -->
<record id="account_tag_operating" model="account.account.tag">
<field name="name">Operating Activities</field>
<field name="applicability">accounts</field>
</record>
<record id="account_tag_financing" model="account.account.tag">
<field name="name">Financing Activities</field>
<field name="applicability">accounts</field>
</record>
<record id="account_tag_investing" model="account.account.tag">
<field name="name">Investing &amp; Extraordinary Activities</field>
<field name="applicability">accounts</field>
</record>
<!--
Payment terms
-->
<!-- <record id="account_payment_term_immediate" model="account.payment.term">-->
<!-- <field name="name">Immediate Payment</field>-->
<!-- <field name="note">Payment terms: Immediate Payment</field>-->
<!-- </record>-->
<!-- <record id="account_payment_term_15days" model="account.payment.term">-->
<!-- <field name="name">15 Days</field>-->
<!-- <field name="note">Payment terms: 15 Days</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 15, 'option': 'day_after_invoice_date'})]"/>-->
<!-- </record>-->
<!-- <record id="account_payment_term_21days" model="account.payment.term">-->
<!-- <field name="name">21 Days</field>-->
<!-- <field name="note">Payment terms: 21 Days</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 21, 'option': 'day_after_invoice_date'})]"/>-->
<!-- </record>-->
<!-- <record id="account_payment_term_30days" model="account.payment.term">-->
<!-- <field name="name">30 Days</field>-->
<!-- <field name="note">Payment terms: 30 Days</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 30, 'option': 'day_after_invoice_date'})]"/>-->
<!-- </record>-->
<!-- <record id="account_payment_term_45days" model="account.payment.term">-->
<!-- <field name="name">45 Days</field>-->
<!-- <field name="note">Payment terms: 45 Days</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 45, 'option': 'day_after_invoice_date'})]"/>-->
<!-- </record>-->
<!-- <record id="account_payment_term_2months" model="account.payment.term">-->
<!-- <field name="name">2 Months</field>-->
<!-- <field name="note">Payment terms: 2 Months</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 60, 'option': 'day_after_invoice_date'})]"/>-->
<!-- </record>-->
<!-- <record id="account_payment_term_end_following_month" model="account.payment.term">-->
<!-- <field name="name">End of Following Month</field>-->
<!-- <field name="note">Payment terms: End of Following Month</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 31, 'option': 'day_following_month'})]"/>-->
<!-- </record>-->
<!-- <record id="account_payment_term_advance_60days" model="account.payment.term">-->
<!-- <field name="name">30% Now, Balance 60 Days</field>-->
<!-- <field name="note">Payment terms: 30% Now, Balance 60 Days</field>-->
<!-- <field name="line_ids" eval="[(5, 0), (0, 0, {'value': 'percent', 'value_amount': 30.0, 'sequence': 400, 'days': 0, 'option': 'day_after_invoice_date'}),-->
<!-- (0, 0, {'value': 'balance', 'value_amount': 0.0, 'sequence': 500, 'days': 60, 'option': 'day_after_invoice_date'})]"/>-->
<!-- </record>-->
<!--
Account Statement Sequences
-->
<!-- <record id="sequence_reconcile_seq" model="ir.sequence">-->
<!-- <field name="name">Account reconcile sequence</field>-->
<!-- <field name="code">account.reconcile</field>-->
<!-- <field name="prefix">A</field>-->
<!-- <field eval="1" name="number_next"/>-->
<!-- <field eval="1" name="number_increment"/>-->
<!-- <field eval="False" name="company_id"/>-->
<!-- </record>-->
<!-- Account-related subtypes for messaging / Chatter -->
<!-- <record id="mt_invoice_validated" model="mail.message.subtype">-->
<!-- <field name="name">Validated</field>-->
<!-- <field name="res_model">account.move</field>-->
<!-- <field name="default" eval="False"/>-->
<!-- <field name="description">Invoice validated</field>-->
<!-- </record>-->
<!-- <record id="mt_invoice_paid" model="mail.message.subtype">-->
<!-- <field name="name">Paid</field>-->
<!-- <field name="res_model">account.move</field>-->
<!-- <field name="default" eval="False"/>-->
<!-- <field name="description">Invoice paid</field>-->
<!-- </record>-->
<!-- <record id="mt_invoice_created" model="mail.message.subtype">-->
<!-- <field name="name">Invoice Created</field>-->
<!-- <field name="res_model">account.move</field>-->
<!-- <field name="default" eval="False"/>-->
<!-- <field name="hidden" eval="True"/>-->
<!-- <field name="description">Invoice Created</field>-->
<!-- </record>-->
<!-- Payment methods -->
<!-- <record id="account_payment_method_manual_in" model="account.payment.method">-->
<!-- <field name="name">Manual</field>-->
<!-- <field name="code">manual</field>-->
<!-- <field name="payment_type">inbound</field>-->
<!-- </record>-->
<!-- <record id="account_payment_method_manual_out" model="account.payment.method">-->
<!-- <field name="name">Manual</field>-->
<!-- <field name="code">manual</field>-->
<!-- <field name="payment_type">outbound</field>-->
<!-- </record>-->
<!-- Account Tax Group -->
<!-- <record id="tax_group_taxes" model="account.tax.group">-->
<!-- <field name="name">Taxes</field>-->
<!-- <field name="sequence">0</field>-->
<!-- </record>-->
<!-- Partner Trust Property -->
<!-- <record forcecreate="True" id="default_followup_trust" model="ir.property">-->
<!-- <field name="name">Followup Trust Property</field>-->
<!-- <field name="fields_id" search="[('model', '=', 'res.partner'), ('name', '=', 'trust')]"/>-->
<!-- <field name="value">normal</field>-->
<!-- <field name="type">selection</field>-->
<!-- </record>-->
<!-- Share Button in action menu -->
<!-- <record id="model_account_move_action_share" model="ir.actions.server">-->
<!-- <field name="name">Share</field>-->
<!-- <field name="model_id" ref="account.model_account_move"/>-->
<!-- <field name="binding_model_id" ref="account.model_account_move"/>-->
<!-- <field name="binding_view_types">form</field>-->
<!-- <field name="state">code</field>-->
<!-- <field name="code">action = records.action_share()</field>-->
<!-- </record>-->
</data>
</odoo>
<?xml version="1.0"?>
<odoo>
<!-- <?xml version="1.0"?>{br}<odoo>{br}<data noupdate="1">{br}-->
<!-- </data>{br}</odoo>-->
<!-- <record model="account.group" id="{f1}">-->
<!-- <field name="{h2}">{f2}</field>-->
<!-- <field name="{h3}">{f3}</field>-->
<!-- <field name="{h4}">{f4}</field>-->
<!--</record>{br}-->
<data noupdate="1">
<record model="account.group" id="id_acc_4">
<field name="code_prefix_start">4</field>
<field name="name">PENDAPATAN DAERAH</field>
<field name="help">Digunakan untuk mencatat penerimaan oleh bendahara umum daerah atau oleh entitas
pemerintah lainnya yang menambah saldo anggaran lebih dalam periode tahun anggaran yang bersangkutan
yang menjadi hak pemerintah, dan tidak perlu dibayarembali oleh p sarang burung walet, pajak mineral
bukan logam dan batuan, pajak bumi dan bangunan perdesaan dan perkotaan, serta bea perolehan hak atas
tanah dan bangunan.
</field>
</record>
<record model="account.group" id="id_acc_41">
<field name="code_prefix_start">41</field>
<field name="name">PENDAPATAN ASLI DAERAH (PAD)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4101">
<field name="code_prefix_start">4101</field>
<field name="name">Pajak Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410101">
<field name="code_prefix_start">410101</field>
<field name="name">Pajak Kendaraan Bermotor (PKB)</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak atas kepemilikan dan/atau penguasaan kendaraan
bermotor berupa PKB-mobil penumpang-sedan, PKB-mobil penumpang-jeep, PKB-mobil penumpangminibus,
PKB-mobil bus-microbus, PKBmobil bus-bus, PKB-mobil barang/bebanpick up, PKB-mobil barang/beban-light
truck, PKB-mobil barang/beban-truck, PKB-mobil barang/beban-blind van, PKB-sepeda motorsepeda motor roda
dua, PKB-sepeda motorsepeda motor roda tiga, PKB-kendaraan bermotor yang dioperasikan di air,
PKBkendaraan khusus alat berat/alat besar, dan PKB-mobil roda tiga.
</field>
</record>
<record model="account.group" id="id_acc_41010101">
<field name="code_prefix_start">41010101</field>
<field name="name">PKB-Mobil Penumpang-Sedan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010102">
<field name="code_prefix_start">41010102</field>
<field name="name">PKB-Mobil Penumpang-Jeep</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010103">
<field name="code_prefix_start">41010103</field>
<field name="name">PKB-Mobil Penumpang-Minibus</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010104">
<field name="code_prefix_start">41010104</field>
<field name="name">PKB-Mobil Bus-Microbus 1229 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010105">
<field name="code_prefix_start">41010105</field>
<field name="name">PKB-Mobil Bus-Bus</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010106">
<field name="code_prefix_start">41010106</field>
<field name="name">PKB-Mobil Barang/Beban-Pick Up</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010107">
<field name="code_prefix_start">41010107</field>
<field name="name">PKB-Mobil Barang/Beban-Light Truck</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010108">
<field name="code_prefix_start">41010108</field>
<field name="name">PKB-Mobil Barang/Beban-Truck</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010109">
<field name="code_prefix_start">41010109</field>
<field name="name">PKB-Mobil Barang/Beban-Blind Van</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010110">
<field name="code_prefix_start">41010110</field>
<field name="name">PKB-Sepeda Motor-Sepeda Motor Roda Dua</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010111">
<field name="code_prefix_start">41010111</field>
<field name="name">PKB-Sepeda Motor-Sepeda Motor Roda Tiga</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010112">
<field name="code_prefix_start">41010112</field>
<field name="name">PKB-Kendaraan Bermotor yang Dioperasikani Air</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010113">
<field name="code_prefix_start">41010113</field>
<field name="name">PKB-Kendaraan Khusus Alat Berat/Alatesar</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010114">
<field name="code_prefix_start">41010114</field>
<field name="name">PKB-Mobil Roda Tiga</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410102">
<field name="code_prefix_start">410102</field>
<field name="name">Bea Balik Nama Kendaraan BermotorBBNKB)</field>
<field name="help">Digunakan untuk mencatat BBNKB-mobilenumpang-sedan, BBNKB-mobilenumpang-jeep, BBNKB-mobil
penumpangminibus, BBNKB-mobil bus-microbus,BNKB-mobil bus-bus, BBNKB-mobil 1235 -arang/beban-pick up,
BBNKB-mobilarang/beban-light truck, BBNKB-mobilarang/beban-truck, BBNKB-mobil barang/eban-blind van,
BBNKB-sepeda motorsepeda motor roda dua, BBNKB-sepedaotor-sepeda motor roda tiga, BBNKBkendaraan
bermotor yang dioperasikan diir, BBNKB-kendaraan khusus alat berat,an BBNKB-mobil roda tiga.
</field>
</record>
<record model="account.group" id="id_acc_41010201">
<field name="code_prefix_start">41010201</field>
<field name="name">BBNKB-Mobil Penumpang-Sedan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010202">
<field name="code_prefix_start">41010202</field>
<field name="name">BBNKB-Mobil Penumpang-Jeep</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010203">
<field name="code_prefix_start">41010203</field>
<field name="name">BBNKB-Mobil Penumpang-Minibus</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010204">
<field name="code_prefix_start">41010204</field>
<field name="name">BBNKB-Mobil Bus-Microbus</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010205">
<field name="code_prefix_start">41010205</field>
<field name="name">BBNKB-Mobil Bus-Bus</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010206">
<field name="code_prefix_start">41010206</field>
<field name="name">BBNKB-Mobil Barang/Beban-Pick Up</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010207">
<field name="code_prefix_start">41010207</field>
<field name="name">BBNKB-Mobil Barang/Beban-Light Truck</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010208">
<field name="code_prefix_start">41010208</field>
<field name="name">BBNKB-Mobil Barang/Beban-Truck</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010209">
<field name="code_prefix_start">41010209</field>
<field name="name">BBNKB-Mobil Barang/Beban-Blind Van</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010210">
<field name="code_prefix_start">41010210</field>
<field name="name">BBNKB-Sepeda Motor-Sepeda Motor Rodaua</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010211">
<field name="code_prefix_start">41010211</field>
<field name="name">BBNKB-Sepeda Motor-Sepeda Motor Rodaiga</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010212">
<field name="code_prefix_start">41010212</field>
<field name="name">BBNKB-Kendaraan Bermotor yangioperasikan di Air</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010213">
<field name="code_prefix_start">41010213</field>
<field name="name">BBNKB-Kendaraan Khusus Alat Berat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010214">
<field name="code_prefix_start">41010214</field>
<field name="name">BBNKB-Mobil Roda Tiga</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410103">
<field name="code_prefix_start">410103</field>
<field name="name">Pajak Bahan Bakar Kendaraan BermotorPBBKB)</field>
<field name="help">Digunakan untuk mencatat PBBKB-bahan bakar bensin, PBBKB-bahan bakar solar,BBKB-bahan
bakar gas, dan PBBKB-bahan bakar lainnya.
</field>
</record>
<record model="account.group" id="id_acc_41010301">
<field name="code_prefix_start">41010301</field>
<field name="name">PBBKB-Bahan Bakar Bensin</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010302">
<field name="code_prefix_start">41010302</field>
<field name="name">PBBKB-Bahan Bakar Solar</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010303">
<field name="code_prefix_start">41010303</field>
<field name="name">PBBKB-Bahan Bakar Gas</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010304">
<field name="code_prefix_start">41010304</field>
<field name="name">PBBKB-Bahan Bakar Lainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410104">
<field name="code_prefix_start">410104</field>
<field name="name">Pajak Air Permukaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010401">
<field name="code_prefix_start">41010401</field>
<field name="name">Pajak Air Permukaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410105">
<field name="code_prefix_start">410105</field>
<field name="name">Pajak Rokok</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010501">
<field name="code_prefix_start">41010501</field>
<field name="name">Pajak Rokok</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410106">
<field name="code_prefix_start">410106</field>
<field name="name">Pajak Hotel</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak atas fasilitas penyedia jasa
penginapan/peristirahatan termasuk jasaerkait lainnya dengan dipungut bayaran,ang mencakup juga motel,
losmen, gubukariwisata, wisma pariwisata, pesanggrahan,umah penginapan dan sejenisnya, sertaumah kos
dengan jumlah kamar lebih dari 10 (sepuluh). Pe
</field>
</record>
<record model="account.group" id="id_acc_41010601">
<field name="code_prefix_start">41010601</field>
<field name="name">PajPajak Hotel</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010602">
<field name="code_prefix_start">41010602</field>
<field name="name">Pajak Motel</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010603">
<field name="code_prefix_start">41010603</field>
<field name="name">Pajak Losmen</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010604">
<field name="code_prefix_start">41010604</field>
<field name="name">Pajak Gubuk Pariwisata</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010605">
<field name="code_prefix_start">41010605</field>
<field name="name">Pajak Wisma Pariwisata</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010606">
<field name="code_prefix_start">41010606</field>
<field name="name">Pajak Pesanggrahan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010607">
<field name="code_prefix_start">41010607</field>
<field name="name">Pajak Rumah Penginapan dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010608">
<field name="code_prefix_start">41010608</field>
<field name="name">Pajak Rumah Kos dengan Jumlah Kamarebih dari 10 (Sepuluh)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410107">
<field name="code_prefix_start">410107</field>
<field name="name">Pajak Restoran 1241 -</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak atas fasilitas penyedia makananan/atau minuman
dengan dipungutayaran, yang mencakup juga rumah makan,afetaria, kantin, warung, bar, danejenisnya
termasuk jasa boga/katering.encatatan tersebut berupa pajak restoranan sejenisnya, pajak rumah makan
danejenisnya, pajak kafetaria dan sejenisnya,ajak kantin dan sejenisnya, pajak warungan sejenisnya,
pajak bar dan sejenisnya,erta pajak jasa boga/katering danejenisnya.
</field>
</record>
<record model="account.group" id="id_acc_41010701">
<field name="code_prefix_start">41010701</field>
<field name="name">Pajak Restoran dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010702">
<field name="code_prefix_start">41010702</field>
<field name="name">Pajak Rumah Makan dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010703">
<field name="code_prefix_start">41010703</field>
<field name="name">Pajak Kafetaria dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010704">
<field name="code_prefix_start">41010704</field>
<field name="name">Pajak Kantin dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010705">
<field name="code_prefix_start">41010705</field>
<field name="name">Pajak Warung dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010706">
<field name="code_prefix_start">41010706</field>
<field name="name">Pajak Bar dan Sejenisnya 1242 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010707">
<field name="code_prefix_start">41010707</field>
<field name="name">Pajak Jasa Boga/Katering dan Sejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410108">
<field name="code_prefix_start">410108</field>
<field name="name">Pajak Hiburan</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak atas semua jenis tontonan,ertunjukan,
permainan, dan/ataueramaian yang dinikmati dengan dipungutayaran. Pencatatan tersebut berupa
pajakontonan film, pajak pagelaranesenian/musik/tari/busana, pajak kontesecantikan, binaraga, dan
sejenisnya, pajakameran, pajak diskotik, karaoke, klubalam dan sejenisnya, pajakirkus/akrobat/sulap,
pajak permainaniliar dan bowling, pajak pacuan kuda,endaraan bermotor, dan permainanetangkasan, pajak
panti pijat, refleksi,andi uap/spa dan pusat kebugaran (fitnessenter), serta pajak pertandingan
olahraga.
</field>
</record>
<record model="account.group" id="id_acc_41010801">
<field name="code_prefix_start">41010801</field>
<field name="name">Pajak Tontonan Film</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010802">
<field name="code_prefix_start">41010802</field>
<field name="name">Pajak Pagelaran Kesenian/Musik/Tari/usana</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010803">
<field name="code_prefix_start">41010803</field>
<field name="name">Pajak Kontes Kecantikan, Binaraga, danejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010804">
<field name="code_prefix_start">41010804</field>
<field name="name">Pajak Pameran</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010805">
<field name="code_prefix_start">41010805</field>
<field name="name">Pajak Diskotik, Karaoke, Klub Malam, danejenisnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010806">
<field name="code_prefix_start">41010806</field>
<field name="name">Pajak Sirkus/Akrobat/Sulap</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010807">
<field name="code_prefix_start">41010807</field>
<field name="name">Pajak Permainan Biliar dan Bowling</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010808">
<field name="code_prefix_start">41010808</field>
<field name="name">Pajak Pacuan Kuda, Kendaraan Bermotor,an Permainan Ketangkasan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010809">
<field name="code_prefix_start">41010809</field>
<field name="name">Pajak Panti Pijat, Refleksi, Mandi Uap/Spaan Pusat Kebugaran (Fitness Center)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010810">
<field name="code_prefix_start">41010810</field>
<field name="name">Pajak Pertandingan Olahraga</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410109">
<field name="code_prefix_start">410109</field>
<field name="name">Pajak Reklame</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak reklameapan/billboard/videotron/megatron,
pajakeklame kain, pajak reklame melekat/stiker,ajak reklame selebaran, pajak reklameerjalan, pajak
reklame udara, pajak reklamepung, pajak reklame suara, pajak reklameilm/slide, dan pajak reklame
peragaan.
</field>
</record>
<record model="account.group" id="id_acc_41010901">
<field name="code_prefix_start">41010901</field>
<field name="name">Pajak Reklame Papan/Billboard/Videotron/egatron</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010902">
<field name="code_prefix_start">41010902</field>
<field name="name">Pajak Reklame Kain</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010903">
<field name="code_prefix_start">41010903</field>
<field name="name">Pajak Reklame Melekat/Stiker</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010904">
<field name="code_prefix_start">41010904</field>
<field name="name">Pajak Reklame Selebaran</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010905">
<field name="code_prefix_start">41010905</field>
<field name="name">Pajak Reklame Berjalan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010906">
<field name="code_prefix_start">41010906</field>
<field name="name">Pajak Reklame Udara</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010907">
<field name="code_prefix_start">41010907</field>
<field name="name">Pajak Reklame Apung</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010908">
<field name="code_prefix_start">41010908</field>
<field name="name">Pajak Reklame Suara</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010909">
<field name="code_prefix_start">41010909</field>
<field name="name">Pajak Reklame Film/Slide</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41010910">
<field name="code_prefix_start">41010910</field>
<field name="name">Pajak Reklame Peragaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410110">
<field name="code_prefix_start">410110</field>
<field name="name">Pajak Penerangan Jalan</field>
<field name="help">Digunakan untuk mencatat pajakenerangan jalan dihasilkan sendiri danajak penerangan jalan
sumber lain.
</field>
</record>
<record model="account.group" id="id_acc_41011001">
<field name="code_prefix_start">41011001</field>
<field name="name">Pajak Penerangan Jalan Dihasilkan Sendiri</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011002">
<field name="code_prefix_start">41011002</field>
<field name="name">Pajak Penerangan Jalan Sumber Lain</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410111">
<field name="code_prefix_start">410111</field>
<field name="name">Pajak Parkir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011101">
<field name="code_prefix_start">41011101</field>
<field name="name">Pajak Parkir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410112">
<field name="code_prefix_start">410112</field>
<field name="name">Pajak Air Tanah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011201">
<field name="code_prefix_start">41011201</field>
<field name="name">Pajak Air Tanah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410113">
<field name="code_prefix_start">410113</field>
<field name="name">Pajak Sarang Burung Walet</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011301">
<field name="code_prefix_start">41011301</field>
<field name="name">Pajak Sarang Burung Walet</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410114">
<field name="code_prefix_start">410114</field>
<field name="name">Pajak Mineral Bukan Logam dan Batuan</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak atas kegiatan pengambilan mineralukan logam dan
batuan, baik dari sumberlam di dalam dan/atau permukaan bumintuk dimanfaatkan. Pencatatan tersebuterupa
pajak asbes, pajak batu tulis, pajakatu setengah permata, pajak batu kapur,ajak batu apung, pajak batu
permata, pajakentonit, pajak dolomit, pajak felspar, pajakaram batu (halite), pajak grafit,
pajakranit/andesit, pajak gips, pajak kalsit, pajakaolin, pajak leusit, pajak magnesit, pajak 1248 -ika,
pajak marmer, pajak nitrat, pajakpsidien, pajak oker, pajak pasir dan kerikil,ajak pasir kuarsa, pajak
perlit, pajakhospat, pajak talk, pajak tanah serapfullers earth), pajak tanah diatome, pajakanah liat,
pajak tawas (alum), pajak tras,ajak yarosif, pajak zeolit, pajak basal, pajakrakit, dan pajak mineral
bukan logam danatuan lainnya.
</field>
</record>
<record model="account.group" id="id_acc_41011401">
<field name="code_prefix_start">41011401</field>
<field name="name">Pajak Asbes</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011402">
<field name="code_prefix_start">41011402</field>
<field name="name">Pajak Batu Tulis</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011403">
<field name="code_prefix_start">41011403</field>
<field name="name">Pajak Batu Setengah Permata</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011404">
<field name="code_prefix_start">41011404</field>
<field name="name">Pajak Batu Kapur</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011405">
<field name="code_prefix_start">41011405</field>
<field name="name">Pajak Batu Apung</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011406">
<field name="code_prefix_start">41011406</field>
<field name="name">Pajak Batu Permata 1249 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011407">
<field name="code_prefix_start">41011407</field>
<field name="name">Pajak Bentonit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011408">
<field name="code_prefix_start">41011408</field>
<field name="name">Pajak Dolomit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011409">
<field name="code_prefix_start">41011409</field>
<field name="name">Pajak Felspar</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011410">
<field name="code_prefix_start">41011410</field>
<field name="name">Pajak Garam Batu (Halite)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011411">
<field name="code_prefix_start">41011411</field>
<field name="name">Pajak Grafit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011412">
<field name="code_prefix_start">41011412</field>
<field name="name">Pajak Granit/Andesit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011413">
<field name="code_prefix_start">41011413</field>
<field name="name">Pajak Gips</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011414">
<field name="code_prefix_start">41011414</field>
<field name="name">Pajak Kalsit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011415">
<field name="code_prefix_start">41011415</field>
<field name="name">Pajak Kaolin</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011416">
<field name="code_prefix_start">41011416</field>
<field name="name">Pajak Leusit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011417">
<field name="code_prefix_start">41011417</field>
<field name="name">Pajak Magnesit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011418">
<field name="code_prefix_start">41011418</field>
<field name="name">Pajak Mika</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011419">
<field name="code_prefix_start">41011419</field>
<field name="name">Pajak Marmer</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011420">
<field name="code_prefix_start">41011420</field>
<field name="name">Pajak Nitrat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011421">
<field name="code_prefix_start">41011421</field>
<field name="name">Pajak Opsidien</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011422">
<field name="code_prefix_start">41011422</field>
<field name="name">Pajak Oker</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011423">
<field name="code_prefix_start">41011423</field>
<field name="name">Pajak Pasir dan Kerikil</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011424">
<field name="code_prefix_start">41011424</field>
<field name="name">Pajak Pasir Kuarsa</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011425">
<field name="code_prefix_start">41011425</field>
<field name="name">Pajak Perlit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011426">
<field name="code_prefix_start">41011426</field>
<field name="name">Pajak Phospat 1252 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011427">
<field name="code_prefix_start">41011427</field>
<field name="name">Pajak Talk</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011428">
<field name="code_prefix_start">41011428</field>
<field name="name">Pajak Tanah Serap (Fullers Earth)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011429">
<field name="code_prefix_start">41011429</field>
<field name="name">Pajak Tanah Diatome</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011430">
<field name="code_prefix_start">41011430</field>
<field name="name">Pajak Tanah Liat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011431">
<field name="code_prefix_start">41011431</field>
<field name="name">Pajak Tawas (Alum)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011432">
<field name="code_prefix_start">41011432</field>
<field name="name">Pajak Tras</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011433">
<field name="code_prefix_start">41011433</field>
<field name="name">Pajak Yarosif</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011434">
<field name="code_prefix_start">41011434</field>
<field name="name">Pajak Zeolit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011435">
<field name="code_prefix_start">41011435</field>
<field name="name">Pajak Basal</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011436">
<field name="code_prefix_start">41011436</field>
<field name="name">Pajak Trakit</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011437">
<field name="code_prefix_start">41011437</field>
<field name="name">Pajak Mineral bukan Logam dan Batuanainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410115">
<field name="code_prefix_start">410115</field>
<field name="name">Pajak Bumi dan Bangunan Perdesaan danerkotaan (PBBP2)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011501">
<field name="code_prefix_start">41011501</field>
<field name="name">PBB P2</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410116">
<field name="code_prefix_start">410116</field>
<field name="name">Bea Perolehan Hak Atas Tanah danangunan (BPHTB)</field>
<field name="help">Digunakan untuk mencatat pendapatan pajak atas perolehan hak atas tanahan/atau bangunan.
Pencatatan tersebuterupa BPHTB-pemindahan hak dan BPHTBpemberian hak baru.
</field>
</record>
<record model="account.group" id="id_acc_41011601">
<field name="code_prefix_start">41011601</field>
<field name="name">BPHTB-Pemindahan Hak</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41011602">
<field name="code_prefix_start">41011602</field>
<field name="name">BPHTB-Pemberian Hak Baru</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4102">
<field name="code_prefix_start">4102</field>
<field name="name">Retribusi Daerah</field>
<field name="help">Digunakan untuk mencatat pendapatan atasungutan daerah otonom sebagaiembayaran atas jasa
atau pemberian izinertentu yang khusus disediakan dan/atauiberikan oleh pemerintah daerah
untukepentingan orang pribadi atau badan.
</field>
</record>
<record model="account.group" id="id_acc_410201">
<field name="code_prefix_start">410201</field>
<field name="name">Retribusi Jasa Umum</field>
<field name="help">Digunakan untuk mencatat pendapatan ataselayanan yang disediakan atau diberikan
pemerintah daerah otonom untuk tujuanepentingan dan kemanfaatan umum sertaapat dinikmati oleh orang
pribadi atauadan. Pencatatan tersebut berupa retribusielayanan kesehatan, retribusi
pelayananersampahan/kebersihan, retribusielayanan pemakaman dan pengabuan 1255 -ayat, retribusi
pelayanan parkir di tepialan umum, retribusi pelayanan pasar,etribusi pengujian kendaraan
bermotor,etribusi pemeriksaan alat pemadamebakaran, retribusi penggantian biaya cetaketa, retribusi
penyediaan dan/atauenyedotan kakus, retribusi pengolahanimbah cair, retribusi pelayanan tera/teralang,
retribusi pelayanan pendidikan, sertaetribusi pengawasan dan pengendalianenara telekomunikasi.
</field>
</record>
<record model="account.group" id="id_acc_41020101">
<field name="code_prefix_start">41020101</field>
<field name="name">Retribusi Pelayanan Kesehatan</field>
<field name="help">Digunakan untuk mencatat pelayananesehatan di puskesmas, puskesmas keliling,uskesmas
pembantu, balai pengobatan,umah sakit umum daerah, dan tempatelayanan kesehatan lainnya yang sejenisang
dimiliki dan/atau dikelola olehemerintah daerah, kecuali pelayananendaftaran.
</field>
</record>
<record model="account.group" id="id_acc_41020102">
<field name="code_prefix_start">41020102</field>
<field name="name">Retribusi Pelayanan Persampahan/ebersihan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020103">
<field name="code_prefix_start">41020103</field>
<field name="name">Retribusi Pelayanan Pemakaman danengabuan Mayat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020104">
<field name="code_prefix_start">41020104</field>
<field name="name">Retribusi Pelayanan Parkir di Tepi Jalan 1257 -mum</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020105">
<field name="code_prefix_start">41020105</field>
<field name="name">Retribusi Pelayanan Pasar</field>
<field name="help">Digunakan untuk mencatat pendapatan atasungutan daerah otonom sebagaiembayaran atas jasa
penyediaan fasilitasasar tradisional/sederhana, berupaelataran, los, kios yang dikelola pemerintahaerah,
dan khusus disediakan untukedagang.
</field>
</record>
<record model="account.group" id="id_acc_41020106">
<field name="code_prefix_start">41020106</field>
<field name="name">Retribusi Pengujian Kendaraan Bermotor</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020107">
<field name="code_prefix_start">41020107</field>
<field name="name">Retribusi Pemeriksaan Alat Pemadamebakaran</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020108">
<field name="code_prefix_start">41020108</field>
<field name="name">Retribusi Penggantian Biaya Cetak Peta</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020109">
<field name="code_prefix_start">41020109</field>
<field name="name">Retribusi Penyediaan dan/atau Penyedotanakus</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020110">
<field name="code_prefix_start">41020110</field>
<field name="name">Retribusi Pengolahan Limbah Cair</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020111">
<field name="code_prefix_start">41020111</field>
<field name="name">Retribusi Pelayanan Tera/Tera Ulang</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020112">
<field name="code_prefix_start">41020112</field>
<field name="name">Retribusi Pelayanan Pendidikan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020113">
<field name="code_prefix_start">41020113</field>
<field name="name">Retribusi Pengawasan dan Pengendalianenara Telekomunikasi</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410202">
<field name="code_prefix_start">410202</field>
<field name="name">Retribusi Jasa Usaha 1261 -</field>
<field name="help">Digunakan untuk mencatat pendapatan atasasa yang disediakan oleh pemerintah daerahengan
menganut prinsip-prinsip komersialarena pada dasarnya dapat pula disediakanleh sektor swasta. Pencatatan
tersebuterupa retribusi pemakaian kekayaanaerah, retribusi pasar grosir dan/atauertokoan, retribusi
penyediaan tempatelelangan, retribusi terminal, retribusiempat khusus parkir, retribusi
tempatenginapan/pesanggrahan/ vila, retribusiumah potong hewan, retribusi pelayananepelabuhanan,
retribusi tempat rekreasian olahraga, retribusi penyeberangan air,an retribusi penjualan produksi
usahaaerah.
</field>
</record>
<record model="account.group" id="id_acc_41020201">
<field name="code_prefix_start">41020201</field>
<field name="name">Retribusi Pemakaian Kekayaan Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020202">
<field name="code_prefix_start">41020202</field>
<field name="name">Retribusi Pasar Grosir dan/atau Pertokoan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020203">
<field name="code_prefix_start">41020203</field>
<field name="name">Retribusi Tempat Pelelangan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020204">
<field name="code_prefix_start">41020204</field>
<field name="name">Retribusi Terminal</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020205">
<field name="code_prefix_start">41020205</field>
<field name="name">Retribusi Tempat Khusus Parkir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020206">
<field name="code_prefix_start">41020206</field>
<field name="name">Retribusi Tempatenginapan/Pesanggrahan/ Vila</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020207">
<field name="code_prefix_start">41020207</field>
<field name="name">Retribusi Rumah Potong Hewan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020208">
<field name="code_prefix_start">41020208</field>
<field name="name">Retribusi Pelayanan Kepelabuhanan 1264 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020209">
<field name="code_prefix_start">41020209</field>
<field name="name">Retribusi Tempat Rekreasi dan Olahraga</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020210">
<field name="code_prefix_start">41020210</field>
<field name="name">Retribusi Penyeberangan di Air</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020211">
<field name="code_prefix_start">41020211</field>
<field name="name">Retribusi Penjualan Produksi Usaha Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410203">
<field name="code_prefix_start">410203</field>
<field name="name">Retribusi Perizinan Tertentu</field>
<field name="help">Digunakan untuk mencatat pendapatan ataselayanan perizinan tertentu olehemerintah daerah
dalam rangka pemberianzin kepada orang pribadi atau badan yangimaksudkan untuk pembinaan,engaturan,
pengendalian dan pengawasantas kegiatan, pemanfaatan ruang, sertaenggunaan sumber daya alam,
barang,rasarana, sarana atau fasilitas tertentuuna melindungi kepentingan umum danenjaga kelestarian
lingkungan. Pencatatanersebut berupa retribusi izin mendirikanangunan, retribusi izin tempat
penjualaninuman beralkohol, retribusi izin trayekntuk menyediakan pelayanan angkutanmum, retribusi izin
usaha perikanan,etribusi pengendalian lalu lintas, danetribusi perpanjangan Izin Mempekerjakanenaga
Kerja Asing (IMTA).
</field>
</record>
<record model="account.group" id="id_acc_41020301">
<field name="code_prefix_start">41020301</field>
<field name="name">Retribusi Izin Mendirikan Bangunan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020302">
<field name="code_prefix_start">41020302</field>
<field name="name">Retribusi Izin Tempat Penjualan Minumaneralkohol</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020303">
<field name="code_prefix_start">41020303</field>
<field name="name">Retribusi Izin Trayek untuk Menyediakanelayanan Angkutan Umum</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020304">
<field name="code_prefix_start">41020304</field>
<field name="name">Retribusi Izin Usaha Perikanan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020305">
<field name="code_prefix_start">41020305</field>
<field name="name">Retribusi Pengendalian Lalu Lintas</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41020306">
<field name="code_prefix_start">41020306</field>
<field name="name">Retribusi Perpanjangan Izin Mempekerjakanenaga Kerja Asing (IMTA)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4103">
<field name="code_prefix_start">4103</field>
<field name="name">Hasil Pengelolaan Kekayaan Daerah yangipisahkan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410301">
<field name="code_prefix_start">410301</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada
BUMN
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41030101">
<field name="code_prefix_start">41030101</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada
BUMN
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410302">
<field name="code_prefix_start">410302</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada
BUMD
</field>
<field name="help">Digunakan untuk mencatat bagian laba yangibagikan kepada pemerintah daerahdividen) atas
penyertaan modal pada BUMDlembaga keuangan), bagian laba yangibagikan kepada pemerintah daerahdividen)
atas penyertaan modal pada BUMDaneka usaha), bagian laba yang dibagikanepada pemerintah daerah (dividen)
atasenyertaan modal pada BUMD (bidang airinum), bagian laba yang dibagikan kepadaemerintah daerah
(dividen) atas penyertaanodal pada BUMD (bidang limbah), danagian laba yang dibagikan kepadaemerintah
daerah (dividen) atas penyertaan 1268 -odal pada BUMD (bidang sanitasi).
</field>
</record>
<record model="account.group" id="id_acc_41030201">
<field name="code_prefix_start">41030201</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD
(Lembaga Keuangan)
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41030202">
<field name="code_prefix_start">41030202</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD
(Aneka Usaha)
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41030203">
<field name="code_prefix_start">41030203</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD
(Bidang Air Minum)
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41030204">
<field name="code_prefix_start">41030204</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD
(Bidang Limbah)
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41030205">
<field name="code_prefix_start">41030205</field>
<field name="name">Bagian Laba yang Dibagikan kepadaemerintah Daerah (Dividen) atas Penyertaanodal pada BUMD
(Bidang Sanitasi)
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4104">
<field name="code_prefix_start">4104</field>
<field name="name">Lain-lain PAD yang Sah 1270 -</field>
<field name="help">Digunakan untuk mencatat pendapatanaerah yang tidak termasuk dalam jenisajak daerah,
retribusi daerah danendapatan hasil pengelolaan kekayaanaerah yang dipisahkan.
</field>
</record>
<record model="account.group" id="id_acc_410401">
<field name="code_prefix_start">410401</field>
<field name="name">Hasil Penjualan BMD yang Tidak Dipisahkan</field>
<field name="help">Digunakan untuk mencatat hasil penjualananah, hasil penjualan peralatan dan mesin,asil
penjualan gedung dan bangunan, hasilenjualan jalan, jaringan, dan irigasi, hasilenjualan aset tetap
lainnya, hasil penjualanset lainnya-tagihan jangka panjang, sertaasil penjualan aset lainnya-aset
tidakerwujud.
</field>
</record>
<record model="account.group" id="id_acc_41040101">
<field name="code_prefix_start">41040101</field>
<field name="name">Hasil Penjualan Tanah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040102">
<field name="code_prefix_start">41040102</field>
<field name="name">Hasil Penjualan Peralatan dan Mesin</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040103">
<field name="code_prefix_start">41040103</field>
<field name="name">Hasil Penjualan Gedung dan Bangunan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040104">
<field name="code_prefix_start">41040104</field>
<field name="name">Hasil Penjualan Jalan, Jaringan, dan Irigasi</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040105">
<field name="code_prefix_start">41040105</field>
<field name="name">Hasil Penjualan Aset Tetap Lainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040106">
<field name="code_prefix_start">41040106</field>
<field name="name">Hasil Penjualan Aset Lainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410402">
<field name="code_prefix_start">410402</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar BMDang Tidak Dipisahkan</field>
<field name="help">Digunakan untuk mencatat pendapatan yang berasal dari hasil selisih lebih tukar
menukaranah, hasil selisih lebih tukar menukareralatan dan mesin, hasil selisih lebih tukarenukar gedung
dan bangunan, hasil selisihebih tukar menukar jalan, jaringan danrigasi, hasil selisih lebih tukar
menukar asetetap lainnya, serta hasil selisih lebih tukarenukar aset lainnya-aset tidak berwujud.
</field>
</record>
<record model="account.group" id="id_acc_41040201">
<field name="code_prefix_start">41040201</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar Tanah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040202">
<field name="code_prefix_start">41040202</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar Peralatanan Mesin</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040203">
<field name="code_prefix_start">41040203</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar Gedungan Bangunan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040204">
<field name="code_prefix_start">41040204</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar Jalan,aringan, dan Irigasi</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040205">
<field name="code_prefix_start">41040205</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar Asetetap Lainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040206">
<field name="code_prefix_start">41040206</field>
<field name="name">Hasil Selisih Lebih Tukar Menukar Asetainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410403">
<field name="code_prefix_start">410403</field>
<field name="name">Hasil Pemanfaatan BMD yang Tidakipisahkan</field>
<field name="help">Digunakan untuk mencatat pendapatan hasilewa BMD, hasil kerja sama pemanfaatanMD, hasil
dari bangun guna serah, hasilari bangun serah guna, dan hasil dari kerjaama penyediaan infrastruktur.
</field>
</record>
<record model="account.group" id="id_acc_41040301">
<field name="code_prefix_start">41040301</field>
<field name="name">Hasil Sewa BMD</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040302">
<field name="code_prefix_start">41040302</field>
<field name="name">Hasil Kerja Sama Pemanfaatan BMD</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040303">
<field name="code_prefix_start">41040303</field>
<field name="name">Hasil dari Bangun Guna Serah 1282 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040304">
<field name="code_prefix_start">41040304</field>
<field name="name">Hasil dari Bangun Serah Guna</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040305">
<field name="code_prefix_start">41040305</field>
<field name="name">Hasil dari Kerja Sama Penyediaannfrastruktur</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410404">
<field name="code_prefix_start">410404</field>
<field name="name">Hasil Kerja Sama Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040401">
<field name="code_prefix_start">41040401</field>
<field name="name">Hasil Kerja Sama Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410405">
<field name="code_prefix_start">410405</field>
<field name="name">JasaGiro</field>
<field name="help">Digunakan untuk mencatat pendapatan jasairo pada kas daerah, jasa giro pada kas
diendahara, jasa giro pada rekening danaadangan, jasa giro pada BLUD, jasa giroada rekening dana BOS,
dan jasa giro dana 1283 -apitasi pada FKTP.
</field>
</record>
<record model="account.group" id="id_acc_41040501">
<field name="code_prefix_start">41040501</field>
<field name="name">Jasa Giro pada Kas Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040502">
<field name="code_prefix_start">41040502</field>
<field name="name">Jasa Giro pada Kas di Bendahara</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040503">
<field name="code_prefix_start">41040503</field>
<field name="name">Jasa Giro pada Rekening Dana Cadangan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040504">
<field name="code_prefix_start">41040504</field>
<field name="name">Jasa Giro pada BLUD</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040505">
<field name="code_prefix_start">41040505</field>
<field name="name">Jasa Giro pada Rekening Dana BOS</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040506">
<field name="code_prefix_start">41040506</field>
<field name="name">Jasa Giro Dana Kapitasi pada FKTP</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410406">
<field name="code_prefix_start">410406</field>
<field name="name">Hasil Pengelolaan Dana Bergulir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040601">
<field name="code_prefix_start">41040601</field>
<field name="name">Hasil Pengelolaan Dana Bergulir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410407">
<field name="code_prefix_start">410407</field>
<field name="name">Pendapatan Bunga</field>
<field name="help">Digunakan untuk mencatat pendapatanunga atas penempatan uang pemerintahaerah.</field>
</record>
<record model="account.group" id="id_acc_41040701">
<field name="code_prefix_start">41040701</field>
<field name="name">Pendapatan Bunga atas Penempatan Uangemerintah Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410408">
<field name="code_prefix_start">410408</field>
<field name="name">Penerimaan atas Tuntutan Ganti Kerugianeuangan Daerah</field>
<field name="help">Digunakan untuk mencatat penerimaan yang berasal dari tuntutan ganti kerugian
daeraherhadap bendahara dan tuntutan gantierugian daerah terhadap pegawai negeriukan bendahara atau
pejabat lain.
</field>
</record>
<record model="account.group" id="id_acc_41040801">
<field name="code_prefix_start">41040801</field>
<field name="name">Tuntutan Ganti Kerugian Daerah terhadapendahara 1285 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040802">
<field name="code_prefix_start">41040802</field>
<field name="name">Tuntutan Ganti Kerugian Daerah terhadapegawai Negeri Bukan Bendahara atauejabat Lain
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410409">
<field name="code_prefix_start">410409</field>
<field name="name">Penerimaan Komisi, Potongan, atau Bentukain</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41040901">
<field name="code_prefix_start">41040901</field>
<field name="name">Penerimaan Komisi, Potongan, atau Bentukain</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410410">
<field name="code_prefix_start">410410</field>
<field name="name">Penerimaan Keuntungan dari Selisih Nilaiukar Rupiah terhadap Mata Uang Asing</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041001">
<field name="code_prefix_start">41041001</field>
<field name="name">Penerimaan Keuntungan dari Selisih Nilaiukar Rupiah terhadap Mata Uang Asing</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410411">
<field name="code_prefix_start">410411</field>
<field name="name">Pendapatan Denda atas Keterlambatanelaksanaan Pekerjaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041101">
<field name="code_prefix_start">41041101</field>
<field name="name">Pendapatan Denda atas Keterlambatanelaksanaan Pekerjaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410412">
<field name="code_prefix_start">410412</field>
<field name="name">Pendapatan Denda Pajak Daerah</field>
<field name="help">Digunakan untuk mencatat pendapatanenda pajak kendaraan bermotor,endapatan denda bea
balik namaendaraan bermotor, pendapatan dendaajak bahan bakar kendaraan bermotor,endapatan denda pajak
air permukaan,endapatan denda pajak rokok, pendapatanenda pajak hotel, pendapatan denda pajakestoran,
pendapatan denda pajak hiburan,endapatan denda pajak reklame,endapatan denda pajak penerangan
jalan,endapatan denda pajak parkir, pendapatanenda pajak air tanah, pendapatan dendaajak sarang burung
walet, pendapatanenda pajak mineral bukan logam danatuan, pendapatan denda pajak bumi danangunan
perdesaan dan perkotaan, sertaendapatan denda bea perolehan hak atasanah dan bangunan.
</field>
</record>
<record model="account.group" id="id_acc_41041201">
<field name="code_prefix_start">41041201</field>
<field name="name">Pendapatan Denda Pajak Kendaraanermotor (PKB)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041202">
<field name="code_prefix_start">41041202</field>
<field name="name">Pendapatan Denda Bea Balik Namaendaraan Bermotor (BBNKB)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041203">
<field name="code_prefix_start">41041203</field>
<field name="name">Pendapatan Denda Pajak Bahan Bakarendaraan Bermotor (PBBKB)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041204">
<field name="code_prefix_start">41041204</field>
<field name="name">Pendapatan Denda Pajak Air Permukaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041205">
<field name="code_prefix_start">41041205</field>
<field name="name">Pendapatan Denda Pajak Rokok</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041206">
<field name="code_prefix_start">41041206</field>
<field name="name">Pendapatan Denda Pajak Hotel</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041207">
<field name="code_prefix_start">41041207</field>
<field name="name">Pendapatan Denda Pajak Restoran</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041208">
<field name="code_prefix_start">41041208</field>
<field name="name">Pendapatan Denda Pajak Hiburan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041209">
<field name="code_prefix_start">41041209</field>
<field name="name">Pendapatan Denda Pajak Reklame</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041210">
<field name="code_prefix_start">41041210</field>
<field name="name">Pendapatan Denda Pajak Penerangan Jalan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041211">
<field name="code_prefix_start">41041211</field>
<field name="name">Pendapatan Denda Pajak Parkir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041212">
<field name="code_prefix_start">41041212</field>
<field name="name">Pendapatan Denda Pajak Air Tanah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041213">
<field name="code_prefix_start">41041213</field>
<field name="name">Pendapatan Denda Pajak Sarang Burungalet</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041214">
<field name="code_prefix_start">41041214</field>
<field name="name">Pendapatan Denda Pajak Mineral Bukanogam dan Batuan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041215">
<field name="code_prefix_start">41041215</field>
<field name="name">Pendapatan Denda Pajak Bumi danangunan Perdesaan dan Perkotaan (PBBP2)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041216">
<field name="code_prefix_start">41041216</field>
<field name="name">Pendapatan Denda Bea Perolehan Hak atasanah dan Bangunan (BPHTB)</field>
<field name="help">Digunakan untuk mencatat pendapatanenda BPHTB-pemindahan hak dan BPHTBpemberian hak
baru.
</field>
</record>
<record model="account.group" id="id_acc_410413">
<field name="code_prefix_start">410413</field>
<field name="name">Pendapatan Denda Retribusi Daerah</field>
<field name="help">Digunakan untuk mencatat pendapatanenda retribusi jasa umum, pendapatanenda retribusi
jasa usaha, dan pendapatanenda retribusi perizinan tertentu.
</field>
</record>
<record model="account.group" id="id_acc_41041301">
<field name="code_prefix_start">41041301</field>
<field name="name">Pendapatan Denda Retribusi Jasa Umum</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041302">
<field name="code_prefix_start">41041302</field>
<field name="name">Pendapatan Denda Retribusi Jasa Usaha</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041303">
<field name="code_prefix_start">41041303</field>
<field name="name">Pendapatan Denda Retribusi Perizinanertentu</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410414">
<field name="code_prefix_start">410414</field>
<field name="name">Pendapatan Hasil Eksekusi atas Jaminan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041401">
<field name="code_prefix_start">41041401</field>
<field name="name">Hasil Eksekusi atas Jaminan atas Pengadaanarang/Jasa</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410415">
<field name="code_prefix_start">410415</field>
<field name="name">Pendapatan dari Pengembalian</field>
<field name="help">Digunakan untuk mencatat pendapatan dariengembalian kelebihan pembayaran pajakenghasilan
Pasal 21, pendapatan dariengembalian kelebihan pembayaranaminan kesehatan, pendapatan dariengembalian
kelebihan pembayaran gajian tunjangan, pendapatan dariengembalian kelebihan pembayaranerjalanan dinas,
pendapatan dariengembalian kelebihan pembayaranaminan kecelakaan kerja, pendapatan dariengembalian
kelebihan pembayaranaminan kematian, dan pendapatan dariengembalian kelebihan pembayaranaminan kesehatan
nasional.
</field>
</record>
<record model="account.group" id="id_acc_41041501">
<field name="code_prefix_start">41041501</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Pajak Penghasilan Pasal 21</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041502">
<field name="code_prefix_start">41041502</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kesehatan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041503">
<field name="code_prefix_start">41041503</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Gaji dan Tunjangan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041504">
<field name="code_prefix_start">41041504</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Perjalanan Dinas</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041505">
<field name="code_prefix_start">41041505</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kecelakaan Kerja (JKK)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041506">
<field name="code_prefix_start">41041506</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kematian (JKM)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041507">
<field name="code_prefix_start">41041507</field>
<field name="name">Pendapatan dari Pengembalian Kelebihanembayaran Jaminan Kesehatan NasionalJKN)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410416">
<field name="code_prefix_start">410416</field>
<field name="name">Pendapatan BLUD</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041601">
<field name="code_prefix_start">41041601</field>
<field name="name">Pendapatan BLUD</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410417">
<field name="code_prefix_start">410417</field>
<field name="name">Pendapatan Denda Pemanfaatan BMD yangidak Dipisahkan</field>
<field name="help">Digunakan untuk mencatat pendapatanenda sewa pengakhiran sewa barang milikaerah dan denda
hasil dari kerja samaenyediaan infrastruktur.
</field>
</record>
<record model="account.group" id="id_acc_41041701">
<field name="code_prefix_start">41041701</field>
<field name="name">Pendapatan Denda Pengakhiran Sewa BMD</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041702">
<field name="code_prefix_start">41041702</field>
<field name="name">Pendapatan Denda Hasil dari Kerja Samaenyediaan Infrastruktur</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410418">
<field name="code_prefix_start">410418</field>
<field name="name">Pendapatan Dana Kapitasi Jaminanesehatan Nasional (JKN) pada Fasilitasesehatan Tingkat
Pertama (FKTP)
</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041801">
<field name="code_prefix_start">41041801</field>
<field name="name">Pendapatan Dana Kapitasi JKN pada FKTP</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410419">
<field name="code_prefix_start">410419</field>
<field name="name">Pendapatan Hasil Pengelolaan Dana Bergulir</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41041901">
<field name="code_prefix_start">41041901</field>
<field name="name">Pendapatan Hasil Pengelolaan Dana Bergulir 1307 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410420">
<field name="code_prefix_start">410420</field>
<field name="name">Pendapatan Berdasarkan Putusanengadilan (Inkracht)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41042001">
<field name="code_prefix_start">41042001</field>
<field name="name">Pendapatan Berdasarkan Putusanengadilan (Inkracht)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410421">
<field name="code_prefix_start">410421</field>
<field name="name">Pendapatan Denda atas Pelanggaraneraturan Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41042101">
<field name="code_prefix_start">41042101</field>
<field name="name">Pendapatan Denda atas Pelanggaraneraturan Daerah ...</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_410422">
<field name="code_prefix_start">410422</field>
<field name="name">Pendapatan Zakat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_41042201">
<field name="code_prefix_start">41042201</field>
<field name="name">Pendapatan Zakat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42">
<field name="code_prefix_start">42</field>
<field name="name">PENDAPATAN TRANSFER</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4201">
<field name="code_prefix_start">4201</field>
<field name="name">Pendapatan Transfer Pemerintah Pusat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420101">
<field name="code_prefix_start">420101</field>
<field name="name">Dana Perimbangan</field>
<field name="help">Digunakan untuk mencatat pendapatan yang bersumber dari APBN yang dialokasikanepada
daerah untuk mendanai kebutuhanaerah dalam rangka pelaksanaanesentralisasi. Pencatatan tersebut berupa
1308 -ana transfer umum-dana bagi hasil, danaransfer umum-dana alokasi umum, danaransfer khusus-dana
alokasi khusus fisik,an dana transfer khusus-dana alokasihusus non fisik.
</field>
</record>
<record model="account.group" id="id_acc_42010101">
<field name="code_prefix_start">42010101</field>
<field name="name">Dana Transfer Umum-Dana Bagi Hasil (DBH)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010102">
<field name="code_prefix_start">42010102</field>
<field name="name">Dana Transfer Umum-Dana Alokasi Umum 1310 -DAU)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010103">
<field name="code_prefix_start">42010103</field>
<field name="name">Dana Transfer Khusus-Dana Alokasi KhususDAK) Fisik</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010104">
<field name="code_prefix_start">42010104</field>
<field name="name">Dana Transfer Khusus-Dana Alokasi KhususDAK) Non Fisik</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420102">
<field name="code_prefix_start">420102</field>
<field name="name">Dana Insentif Daerah (DID)</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010201">
<field name="code_prefix_start">42010201</field>
<field name="name">DID</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420103">
<field name="code_prefix_start">420103</field>
<field name="name">Dana Otonomi Khusus</field>
<field name="help">Digunakan untuk mencatat Dana Otonomihusus-Provinsi Papua, Dana Otonomi 1322
-husus-Provinsi Papua Barat, Dana Otonomihusus-Provinsi Aceh, Dana Tambahannfrastruktur dalam rangka
Otonomi Khususrovinsi Papua, dan Dana Tambahannfrastruktur dalam rangka Otonomi Khususrovinsi Papua
Barat.
</field>
</record>
<record model="account.group" id="id_acc_42010301">
<field name="code_prefix_start">42010301</field>
<field name="name">Dana Otonomi Khusus-Provinsi Papua</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010302">
<field name="code_prefix_start">42010302</field>
<field name="name">Dana Otonomi Khusus-Provinsi Papua Barat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010303">
<field name="code_prefix_start">42010303</field>
<field name="name">Dana Otonomi Khusus-Provinsi Aceh</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010304">
<field name="code_prefix_start">42010304</field>
<field name="name">Dana Tambahan Infrastruktur dalam rangkatonomi Khusus Provinsi Papua</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010305">
<field name="code_prefix_start">42010305</field>
<field name="name">Dana Tambahan Infrastruktur dalam rangkatonomi Khusus Provinsi Papua Barat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420104">
<field name="code_prefix_start">420104</field>
<field name="name">Dana Keistimewaan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010401">
<field name="code_prefix_start">42010401</field>
<field name="name">Dana Keistimewaan Daerah Istimewa Jogyakarta</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420105">
<field name="code_prefix_start">420105</field>
<field name="name">Dana Desa</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42010501">
<field name="code_prefix_start">42010501</field>
<field name="name">Dana Desa</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4202">
<field name="code_prefix_start">4202</field>
<field name="name">Pendapatan Transfer Antar Daerah</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420201">
<field name="code_prefix_start">420201</field>
<field name="name">Pendapatan Bagi</field>
<field name="help">Hasil Digunakan untuk mencatat pendapatan bagiasil pajak dan bantuan keuangan.</field>
</record>
<record model="account.group" id="id_acc_42020101">
<field name="code_prefix_start">42020101</field>
<field name="name">Pendapatan Bagi Hasil Pajak</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_420202">
<field name="code_prefix_start">420202</field>
<field name="name">Bantuan Keuangan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42020201">
<field name="code_prefix_start">42020201</field>
<field name="name">Bantuan Keuangan Umum dari Pemerintahrovinsi</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42020202">
<field name="code_prefix_start">42020202</field>
<field name="name">Bantuan Keuangan Khusus dari Pemerintahrovinsi</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42020203">
<field name="code_prefix_start">42020203</field>
<field name="name">Bantuan Keuangan Umum dari Pemerintahabupaten/Kota</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_42020204">
<field name="code_prefix_start">42020204</field>
<field name="name">Bantuan Keuangan Khusus dari Pemerintahabupaten/Kota</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43">
<field name="code_prefix_start">43</field>
<field name="name">LAIN-LAIN PENDAPATAN DAERAH YANGAH</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4301">
<field name="code_prefix_start">4301</field>
<field name="name">Pendapatan Hibah</field>
<field name="help">Digunakan untuk mencatat pendapatanibah termasuk sumbangan pihaketiga/sejenis yang tidak
mengikat, tidakerdasarkan perhitungan tertentu, dan tidakempunyai konsekuensi pengeluaran atauengurangan
kewajiban kepada penerimaaupun pemberi serta tidak menyebabkankonomi biaya tinggi.
</field>
</record>
<record model="account.group" id="id_acc_430101">
<field name="code_prefix_start">430101</field>
<field name="name">Pendapatan Hibah dari Pemerintah Pusat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010101">
<field name="code_prefix_start">43010101</field>
<field name="name">Pendapatan Hibah dari Pemerintah Pusat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_430102">
<field name="code_prefix_start">430102</field>
<field name="name">Pendapatan Hibah dari Pemerintah Daerahainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010201">
<field name="code_prefix_start">43010201</field>
<field name="name">Pendapatan Hibah dari Pemerintah Daerahainnya</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_430103">
<field name="code_prefix_start">430103</field>
<field name="name">Pendapatan Hibah dari Kelompokasyarakat/Perorangan Dalam Negeri</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010301">
<field name="code_prefix_start">43010301</field>
<field name="name">Pendapatan Hibah dari Kelompokasyarakat/Perorangan Dalam Negeri</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_430104">
<field name="code_prefix_start">430104</field>
<field name="name">Pendapatan Hibah dari Badan/Lembaga/rganisasi Dalam Negeri/Luar Negeri</field>
<field name="help">Digunakan untuk mencatat pendapatanibah dari badan/lembaga/ organisasi dalamegeri,
pendapatan hibah dariadan/lembaga/ organisasi luar negeri,endapatan hibah dari lembaga/organisasiwasta
dalam negeri, dan pendapatan hibahari lembaga/organisasi swasta luar negeri.
</field>
</record>
<record model="account.group" id="id_acc_43010401">
<field name="code_prefix_start">43010401</field>
<field name="name">Pendapatan Hibah dari Badan/Lembaga/rganisasi Dalam Negeri</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010402">
<field name="code_prefix_start">43010402</field>
<field name="name">Pendapatan Hibah dari Badan/Lembaga/rganisasi Luar Negeri</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010403">
<field name="code_prefix_start">43010403</field>
<field name="name">Pendapatan Hibah dari Lembaga/Organisasiwasta Dalam Negeri</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010404">
<field name="code_prefix_start">43010404</field>
<field name="name">Pendapatan Hibah dari Lembaga/Organisasiwasta Luar Negeri 1329 -</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_430105">
<field name="code_prefix_start">430105</field>
<field name="name">Sumbangan Pihak Ketiga/Sejenis</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43010501">
<field name="code_prefix_start">43010501</field>
<field name="name">Sumbangan Pihak Ketiga/Sejenis</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4302">
<field name="code_prefix_start">4302</field>
<field name="name">Dana Darurat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_430201">
<field name="code_prefix_start">430201</field>
<field name="name">Dana Darurat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43020101">
<field name="code_prefix_start">43020101</field>
<field name="name">Dana Darurat</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_4303">
<field name="code_prefix_start">4303</field>
<field name="name">Lain-lain Pendapatan Sesuai denganetentuan Peraturan Perundang-Undangan</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_430301">
<field name="code_prefix_start">430301</field>
<field name="name">Lain-lain Pendapatan</field>
<field name="help">Digunakan untuk mencatat pendapatanibah dana BOS dan pendapatan atas pengembalian
hibah.
</field>
</record>
<record model="account.group" id="id_acc_43030101">
<field name="code_prefix_start">43030101</field>
<field name="name">Pendapatan Hibah Dana BOS</field>
<field name="help"></field>
</record>
<record model="account.group" id="id_acc_43030102">
<field name="code_prefix_start">43030102</field>
<field name="name">Pendapatan atas Pengembalian Hibah</field>
<field name="help"></field>
</record>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- account.account.type -->
<record model="account.account.type" id="data_account_type_receivable">
<field name="name">Receivable</field>
<field name="type">receivable</field>
<field name="internal_group">asset</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_payable">
<field name="name">Payable</field>
<field name="type">payable</field>
<field name="internal_group">liability</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_liquidity">
<field name="name">Bank and Cash</field>
<field name="type">liquidity</field>
<field name="internal_group">asset</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_credit_card">
<field name="name">Credit Card</field>
<field name="type">liquidity</field>
<field name="internal_group">liability</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_current_assets">
<field name="name">Current Assets</field>
<field name="type">other</field>
<field name="internal_group">asset</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_non_current_assets">
<field name="name">Non-current Assets</field>
<field name="type">other</field>
<field name="internal_group">asset</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_prepayments">
<field name="name">Prepayments</field>
<field name="type">other</field>
<field name="internal_group">asset</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_fixed_assets">
<field name="name">Fixed Assets</field>
<field name="type">other</field>
<field name="internal_group">asset</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_current_liabilities">
<field name="name">Current Liabilities</field>
<field name="type">other</field>
<field name="internal_group">liability</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_non_current_liabilities">
<field name="name">Non-current Liabilities</field>
<field name="type">other</field>
<field name="internal_group">liability</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_equity">
<field name="name">Equity</field>
<field name="internal_group">equity</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_unaffected_earnings">
<field name="name">Current Year Earnings</field>
<field name="internal_group">equity</field>
<field name="include_initial_balance" eval="True"/>
</record>
<record model="account.account.type" id="data_account_type_revenue">
<field name="name">Income</field>
<field name="type">other</field>
<field name="internal_group">income</field>
</record>
<record model="account.account.type" id="data_account_type_other_income">
<field name="name">Other Income</field>
<field name="type">other</field>
<field name="internal_group">income</field>
</record>
<record model="account.account.type" id="data_account_type_expenses">
<field name="name">Expenses</field>
<field name="type">other</field>
<field name="internal_group">expense</field>
</record>
<record model="account.account.type" id="data_account_type_depreciation">
<field name="name">Depreciation</field>
<field name="type">other</field>
<field name="internal_group">expense</field>
</record>
<record model="account.account.type" id="data_account_type_direct_costs">
<field name="name">Cost of Revenue</field>
<field name="type">other</field>
<field name="internal_group">expense</field>
</record>
<record model="account.account.type" id="data_account_off_sheet">
<field name="name">Off-Balance Sheet</field>
<field name="type">other</field>
<field name="internal_group">off_balance</field>
</record>
</data>
</odoo>
No preview for this file type
from . import account_account_tag
from . import account_account
from . import account_tax
# -*- coding: utf-8 -*-
import logging
from odoo import api, fields, models, _, tools
from odoo.osv import expression
from odoo.exceptions import UserError, ValidationError
_logger = logging.getLogger(__name__)
class AccountAccountType(models.Model):
_name = "account.account.type"
_description = "Account Type"
name = fields.Char(string='Account Type', required=True, translate=True)
include_initial_balance = fields.Boolean(
string="Bring Accounts Balance Forward",
help="Used in reports to know if we should consider journal items from the beginning of time instead of from "
"the fiscal year only. Account types that should be reset to zero at each new fiscal year (like "
"expenses, revenue..) should not have this option set.")
type = fields.Selection([
('other', 'Regular'),
('receivable', 'Receivable'),
('payable', 'Payable'),
('liquidity', 'Liquidity'),
], required=True, default='other',
help="The 'Internal Type' is used for features available on " \
"different types of accounts: liquidity type is for cash or bank accounts" \
", payable/receivable is for vendor/customer accounts.")
internal_group = fields.Selection([
('equity', 'Equity'),
('asset', 'Asset'),
('liability', 'Liability'),
('income', 'Income'),
('expense', 'Expense'),
('off_balance', 'Off Balance'),
], string="Internal Group",
required=True,
help="The 'Internal Group' is used to filter accounts based on the internal group set on the account type.")
note = fields.Text(string='Description')
class AccountAccount(models.Model):
_name = "account.account"
_description = "Account"
_order = "is_off_balance, code"
_check_company_auto = True
@api.constrains('internal_type', 'reconcile')
def _check_reconcile(self):
for account in self:
if account.internal_type in ('receivable', 'payable') and account.reconcile == False:
raise ValidationError(
_('You cannot have a receivable/payable account that is not reconcilable. (account code: %s)',
account.code))
# @api.constrains('user_type_id')
# def _check_user_type_id_unique_current_year_earning(self):
# data_unaffected_earnings = self.env.ref('account.data_unaffected_earnings')
# result = self.read_group([('user_type_id', '=', data_unaffected_earnings.id)], ['company_id'], ['company_id'])
# for res in result:
# if res.get('company_id_count', 0) >= 2:
# account_unaffected_earnings = self.search([('company_id', '=', res['company_id'][0]),
# ('user_type_id', '=', data_unaffected_earnings.id)])
# raise ValidationError(
# _('You cannot have more than one account with "Current Year Earnings" as type. (accounts: %s)',
# [a.code for a in account_unaffected_earnings]))
name = fields.Char(string="Account Name", required=True, index=True)
currency_id = fields.Many2one('res.currency', string='Account Currency',
help="Forces all moves for this account to have this account currency.")
code = fields.Char(size=64, required=True, index=True)
deprecated = fields.Boolean(index=True, default=False)
used = fields.Boolean(compute='_compute_used', search='_search_used')
user_type_id = fields.Many2one('account.account.type', string='Type', required=True,
help="Account Type is used for information purpose, to generate country-specific "
"legal reports, and set the rules to close a fiscal year and generate opening "
"entries.")
internal_type = fields.Selection(related='user_type_id.type', string="Internal Type", store=True, readonly=True)
internal_group = fields.Selection(related='user_type_id.internal_group', string="Internal Group", store=True,
readonly=True)
help = fields.Char()
# has_unreconciled_entries = fields.Boolean(compute='_compute_has_unreconciled_entries',
# help="The account has at least one unreconciled debit and credit since last time the invoices & payments
# matching was performed.")
reconcile = fields.Boolean(string='Allow Reconciliation', default=False,
help="Check this box if this account allows invoices & payments matching of journal "
"items.")
tax_ids = fields.Many2many('account.tax', 'account_account_tax_default_rel',
'account_id', 'tax_id', string='Default Taxes',
check_company=True,
context={'append_type_to_tax_name': True})
note = fields.Text('Internal Notes')
# company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True,
# default=lambda self: self.env.company)
tag_ids = fields.Many2many('account.account.tag', 'account_account_account_tag', string='Tags',
help="Optional tags you may want to assign for custom reporting")
group_id = fields.Many2one('account.group', compute='_compute_account_group', store=True, readonly=True)
root_id = fields.Many2one('account.root', compute='_compute_account_root', store=True)
# allowed_journal_ids = fields.Many2many('account.journal', string="Allowed Journals",
# help="Define in which journals this account can be used. If empty, "
# "can be used in all journals.")
opening_debit = fields.Monetary(string="Opening Debit", compute='_compute_opening_debit_credit',
inverse='_set_opening_debit', help="Opening debit value for this account.")
opening_credit = fields.Monetary(string="Opening Credit", compute='_compute_opening_debit_credit',
inverse='_set_opening_credit', help="Opening credit value for this account.")
opening_balance = fields.Monetary(string="Opening Balance", compute='_compute_opening_debit_credit',
help="Opening balance value for this account.")
is_off_balance = fields.Boolean(compute='_compute_is_off_balance', default=False, store=True, readonly=True)
_sql_constraints = [
('code_uniq', 'unique (code)', 'The code of the account must be unique per company !') # ,company_id
]
@api.constrains('reconcile', 'internal_group', 'tax_ids')
def _constrains_reconcile(self):
for record in self:
if record.internal_group == 'off_balance':
if record.reconcile:
raise UserError(_('An Off-Balance account can not be reconcilable'))
if record.tax_ids:
raise UserError(_('An Off-Balance account can not have taxes'))
# @api.constrains('allowed_journal_ids')
# def _constrains_allowed_journal_ids(self):
# self.env['account.move.line'].flush(['account_id', 'journal_id'])
# self.flush(['allowed_journal_ids'])
# self._cr.execute("""
# SELECT aml.id
# FROM account_move_line aml
# WHERE aml.account_id in %s
# AND EXISTS (SELECT 1 FROM account_account_account_journal_rel WHERE account_account_id = aml.account_id)
# AND NOT EXISTS (SELECT 1 FROM account_account_account_journal_rel WHERE account_account_id =
# aml.account_id AND account_journal_id = aml.journal_id)
# """, [tuple(self.ids)])
# ids = self._cr.fetchall()
# if ids:
# raise ValidationError(
# _('Some journal items already exist with this account but in other journals than the allowed ones.'))
# @api.constrains('currency_id')
# def _check_journal_consistency(self):
# ''' Ensure the currency set on the journal is the same as the currency set on the
# linked accounts.
# '''
# if not self:
# return
#
# self.env['account.account'].flush(['currency_id'])
# self.env['account.journal'].flush([
# 'currency_id',
# 'default_account_id',
# 'payment_debit_account_id',
# 'payment_credit_account_id',
# 'suspense_account_id',
# ])
# self._cr.execute('''
# SELECT account.id, journal.id
# FROM account_account account
# JOIN res_company company ON company.id = account.company_id
# JOIN account_journal journal ON
# journal.default_account_id = account.id
# WHERE account.id IN %s
# AND journal.type IN ('bank', 'cash')
# AND journal.currency_id IS NOT NULL
# AND journal.currency_id != company.currency_id
# AND account.currency_id != journal.currency_id
# ''', [tuple(self.ids)])
# res = self._cr.fetchone()
# if res:
# account = self.env['account.account'].browse(res[0])
# journal = self.env['account.journal'].browse(res[1])
# raise ValidationError(_(
# "The foreign currency set on the journal '%(journal)s' and the account '%(account)s' must be the
# same.",
# journal=journal.display_name,
# account=account.display_name
# ))
# @api.constrains('company_id')
# def _check_company_consistency(self):
# if not self:
# return
#
# self.flush(['company_id'])
# self._cr.execute('''
# SELECT line.id
# FROM account_move_line line
# JOIN account_account account ON account.id = line.account_id
# WHERE line.account_id IN %s
# AND line.company_id != account.company_id
# ''', [tuple(self.ids)])
# if self._cr.fetchone():
# raise UserError(
# _("You can't change the company of your account since there are some journal items linked to it."))
# @api.constrains('user_type_id')
# def _check_user_type_id_sales_purchase_journal(self):
# if not self:
# return
#
# self.flush(['user_type_id'])
# self._cr.execute('''
# SELECT account.id
# FROM account_account account
# JOIN account_account_type acc_type ON account.user_type_id = acc_type.id
# JOIN account_journal journal ON journal.default_account_id = account.id
# WHERE account.id IN %s
# AND acc_type.type IN ('receivable', 'payable')
# AND journal.type IN ('sale', 'purchase')
# LIMIT 1;
# ''', [tuple(self.ids)])
#
# if self._cr.fetchone():
# raise ValidationError(
# _("The account is already in use in a 'sale' or 'purchase' journal. This means that the account's "
# "type couldn't be 'receivable' or 'payable'."))
# @api.constrains('reconcile')
# def _check_used_as_journal_default_debit_credit_account(self):
# accounts = self.filtered(lambda a: not a.reconcile)
# if not accounts:
# return
#
# self.flush(['reconcile'])
# self._cr.execute('''
# SELECT journal.id
# FROM account_journal journal
# WHERE journal.payment_credit_account_id in %(credit_account)s
# OR journal.payment_debit_account_id in %(debit_account)s ;
# ''', {
# 'credit_account': tuple(accounts.ids),
# 'debit_account': tuple(accounts.ids)
# })
#
# rows = self._cr.fetchall()
# if rows:
# journals = self.env['account.journal'].browse([r[0] for r in rows])
# raise ValidationError(_(
# "This account is configured in %(journal_names)s journal(s) (ids %(journal_ids)s) as payment debit
# or "
# "credit account. This means that this account's type should be reconcilable.",
# journal_names=journals.mapped('display_name'),
# journal_ids=journals.ids
# ))
@api.depends('code')
def _compute_account_root(self):
# this computes the first 2 digits of the account.
# This field should have been a char, but the aim is to use it in a side panel view with hierarchy,
# and it's only supported by many2one fields so far.
# So instead, we make it a many2one to a psql view with what we need as records.
for record in self:
record.root_id = (ord(record.code[0]) * 1000 + ord(record.code[1:2] or '\x00')) if record.code else False
@api.depends('code')
def _compute_account_group(self):
pass
if self.ids:
self.env['account.group']._adapt_accounts_for_account_groups(self)
else:
self.group_id = False
def _search_used(self, operator, value):
if operator not in ['=', '!='] or not isinstance(value, bool):
raise UserError(_('Operation not supported'))
if operator != '=':
value = not value
self._cr.execute("""
SELECT id FROM account_account account
WHERE EXISTS (SELECT * FROM account_move_line aml WHERE aml.account_id = account.id LIMIT 1)
""")
return [('id', 'in' if value else 'not in', [r[0] for r in self._cr.fetchall()])]
def _compute_used(self):
ids = set(self._search_used('=', True)[0][2])
for record in self:
record.used = record.id in ids
@api.model
def _search_new_account_code(self, company, digits, prefix):
for num in range(1, 10000):
new_code = str(prefix.ljust(digits - 1, '0')) + str(num)
rec = self.search([('code', '=', new_code), ], limit=1) # ('company_id', '=', company.id)
if not rec:
return new_code
raise UserError(_('Cannot generate an unused account code.'))
# def _compute_opening_debit_credit(self):
# self.opening_debit = 0
# self.opening_credit = 0
# self.opening_balance = 0
# if not self.ids:
# return
# self.env.cr.execute("""
# SELECT line.account_id,
# SUM(line.balance) AS balance,
# SUM(line.debit) AS debit,
# SUM(line.credit) AS credit
# FROM account_move_line line
# JOIN res_company comp ON comp.id = line.company_id
# WHERE line.move_id = comp.account_opening_move_id
# AND line.account_id IN %s
# GROUP BY line.account_id
# """, [tuple(self.ids)])
# result = {r['account_id']: r for r in self.env.cr.dictfetchall()}
# for record in self:
# res = result.get(record.id) or {'debit': 0, 'credit': 0, 'balance': 0}
# record.opening_debit = res['debit']
# record.opening_credit = res['credit']
# record.opening_balance = res['balance']
@api.depends('internal_group')
def _compute_is_off_balance(self):
for account in self:
account.is_off_balance = account.internal_group == "off_balance"
def _set_opening_debit(self):
for record in self:
record._set_opening_debit_credit(record.opening_debit, 'debit')
def _set_opening_credit(self):
for record in self:
record._set_opening_debit_credit(record.opening_credit, 'credit')
# def _set_opening_debit_credit(self, amount, field):
# """ Generic function called by both opening_debit and opening_credit's
# inverse function. 'Amount' parameter is the value to be set, and field
# either 'debit' or 'credit', depending on which one of these two fields
# got assigned.
# """
# self.company_id.create_op_move_if_non_existant()
# opening_move = self.company_id.account_opening_move_id
#
# if opening_move.state == 'draft':
# # check whether we should create a new move line or modify an existing one
# account_op_lines = self.env['account.move.line'].search([('account_id', '=', self.id),
# ('move_id', '=', opening_move.id),
# (field, '!=', False),
# (field, '!=',
# 0.0)]) # 0.0 condition important for import
#
# if account_op_lines:
# op_aml_debit = sum(account_op_lines.mapped('debit'))
# op_aml_credit = sum(account_op_lines.mapped('credit'))
#
# # There might be more than one line on this account if the opening entry was manually edited
# # If so, we need to merge all those lines into one before modifying its balance
# opening_move_line = account_op_lines[0]
# if len(account_op_lines) > 1:
# merge_write_cmd = [(1, opening_move_line.id, {
# 'debit': op_aml_debit, 'credit': op_aml_credit, 'partner_id': None, 'name': _("Opening
# balance")
# })]
# unlink_write_cmd = [(2, line.id) for line in account_op_lines[1:]]
# opening_move.write({'line_ids': merge_write_cmd + unlink_write_cmd})
#
# if amount:
# # modify the line
# opening_move_line.with_context(check_move_validity=False)[field] = amount
# else:
# # delete the line (no need to keep a line with value = 0)
# opening_move_line.with_context(check_move_validity=False).unlink()
#
# elif amount:
# # create a new line, as none existed before
# self.env['account.move.line'].with_context(check_move_validity=False).create({
# 'name': _('Opening balance'),
# field: amount,
# 'move_id': opening_move.id,
# 'account_id': self.id,
# })
#
# # Then, we automatically balance the opening move, to make sure it stays valid
# if not 'import_file' in self.env.context:
# # When importing a file, avoid recomputing the opening move for each account and do it at the end,
# # for better performances
# self.company_id._auto_balance_opening_move()
@api.model
def default_get(self, default_fields):
"""If we're creating a new account through a many2one, there are chances that we typed the account code
instead of its name. In that case, switch both fields values.
"""
if 'name' not in default_fields and 'code' not in default_fields:
return super().default_get(default_fields)
default_name = self._context.get('default_name')
default_code = self._context.get('default_code')
if default_name and not default_code:
try:
default_code = int(default_name)
except ValueError:
pass
if default_code:
default_name = False
contextual_self = self.with_context(default_name=default_name, default_code=default_code)
return super(AccountAccount, contextual_self).default_get(default_fields)
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
args = args or []
domain = []
if name:
domain = ['|', ('code', '=ilike', name.split(' ')[0] + '%'), ('name', operator, name)]
if operator in expression.NEGATIVE_TERM_OPERATORS:
domain = ['&', '!'] + domain[1:]
return self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
# @api.onchange('user_type_id')
# def _onchange_user_type_id(self):
# self.reconcile = self.internal_type in ('receivable', 'payable')
# if self.internal_type == 'liquidity':
# self.reconcile = False
# elif self.internal_group == 'off_balance':
# self.reconcile = False
# self.tax_ids = False
# elif self.internal_group == 'income' and not self.tax_ids:
# self.tax_ids = self.company_id.account_sale_tax_id
# elif self.internal_group == 'expense' and not self.tax_ids:
# self.tax_ids = self.company_id.account_purchase_tax_id
def name_get(self):
result = []
for account in self:
name = account.code + ' ' + account.name
result.append((account.id, name))
return result
@api.returns('self', lambda value: value.id)
def copy(self, default=None):
default = dict(default or {})
if default.get('code', False):
return super(AccountAccount, self).copy(default)
try:
default['code'] = (str(int(self.code) + 10) or '').zfill(len(self.code))
default.setdefault('name', _("%s (copy)") % (self.name or ''))
while self.env['account.account'].search([('code', '=', default['code']), ],
limit=1):
# ('company_id', '=',
# default.get('company_id', False)
# or self.company_id.id)
#
default['code'] = (str(int(default['code']) + 10) or '')
default['name'] = _("%s (copy)") % (self.name or '')
except ValueError:
default['code'] = _("%s (copy)") % (self.code or '')
default['name'] = self.name
return super(AccountAccount, self).copy(default)
@api.model
def load(self, fields, data):
""" Overridden for better performances when importing a list of account
with opening debit/credit. In that case, the auto-balance is postpone
until the whole file has been imported.
"""
# _logger.info(f"fields,data")
rslt = super(AccountAccount, self).load(fields, data)
# if 'import_file' in self.env.context:
# companies = self.search([('id', 'in', rslt['ids'])]).mapped('company_id')
# for company in companies:
# company._auto_balance_opening_move()
return rslt
def _toggle_reconcile_to_true(self):
'''Toggle the `reconcile´ boolean from False -> True
Note that: lines with debit = credit = amount_currency = 0 are set to `reconciled´ = True
'''
if not self.ids:
return None
query = """
UPDATE account_move_line SET
reconciled = CASE WHEN debit = 0 AND credit = 0 AND amount_currency = 0
THEN true ELSE false END,
amount_residual = (debit-credit),
amount_residual_currency = amount_currency
WHERE full_reconcile_id IS NULL and account_id IN %s
"""
self.env.cr.execute(query, [tuple(self.ids)])
def _toggle_reconcile_to_false(self):
'''Toggle the `reconcile´ boolean from True -> False
Note that it is disallowed if some lines are partially reconciled.
'''
if not self.ids:
return None
partial_lines_count = self.env['account.move.line'].search_count([
('account_id', 'in', self.ids),
('full_reconcile_id', '=', False),
('|'),
('matched_debit_ids', '!=', False),
('matched_credit_ids', '!=', False),
])
if partial_lines_count > 0:
raise UserError(_('You cannot switch an account to prevent the reconciliation '
'if some partial reconciliations are still pending.'))
query = """
UPDATE account_move_line
SET amount_residual = 0, amount_residual_currency = 0
WHERE full_reconcile_id IS NULL AND account_id IN %s
"""
self.env.cr.execute(query, [tuple(self.ids)])
def write(self, vals):
# Do not allow changing the company_id when account_move_line already exist
# if vals.get('company_id', False):
# move_lines = self.env['account.move.line'].search([('account_id', 'in', self.ids)], limit=1)
# for account in self:
# if (account.company_id.id != vals['company_id']) and move_lines:
# raise UserError(
# _('You cannot change the owner company of an account that already contains journal items.'))
if 'reconcile' in vals:
if vals['reconcile']:
self.filtered(lambda r: not r.reconcile)._toggle_reconcile_to_true()
else:
self.filtered(lambda r: r.reconcile)._toggle_reconcile_to_false()
if vals.get('currency_id'):
for account in self:
if self.env['account.move.line'].search_count(
[('account_id', '=', account.id), ('currency_id', 'not in', (False, vals['currency_id']))]):
raise UserError(
_('You cannot set a currency on this account as it already has some journal entries having a '
'different foreign currency.'))
return super(AccountAccount, self).write(vals)
def unlink(self):
# if self.env['account.move.line'].search([('account_id', 'in', self.ids)], limit=1):
# raise UserError(_('You cannot perform this action on an account that contains journal items.'))
# Checking whether the account is set as a property to any Partner or not
values = ['account.account,%s' % (account_id,) for account_id in self.ids]
partner_prop_acc = self.env['ir.property'].sudo().search([('value_reference', 'in', values)], limit=1)
if partner_prop_acc:
account_name = partner_prop_acc.get_by_record().display_name
raise UserError(
_('You cannot remove/deactivate the account %s which is set on a customer or vendor.', account_name)
)
return super(AccountAccount, self).unlink()
def action_read_account(self):
self.ensure_one()
return {
'name': self.display_name,
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'account.account',
'res_id': self.id,
}
def action_duplicate_accounts(self):
for account in self.browse(self.env.context['active_ids']):
account.copy()
class AccountGroup(models.Model):
_name = "account.group"
_description = 'Account Group'
_parent_store = True
_order = 'code_prefix_start'
parent_id = fields.Many2one('account.group', index=True, ondelete='cascade', readonly=True)
parent_path = fields.Char(index=True)
name = fields.Char(required=True)
# code = fields.Char(required=True)
code_prefix_start = fields.Char()
code_prefix_end = fields.Char()
help = fields.Char()
# company_id = fields.Many2one('res.company', required=True, readonly=True, default=lambda self: self.env.company)
_sql_constraints = [
(
'check_length_prefix',
'CHECK(char_length(COALESCE(code_prefix_start, \'\')) = char_length(COALESCE(code_prefix_end, \'\')))',
'The length of the starting and the ending code prefix must be the same'
),
]
@api.onchange('code_prefix_start')
def _onchange_code_prefix_start(self):
if not self.code_prefix_end or self.code_prefix_end < self.code_prefix_start:
self.code_prefix_end = self.code_prefix_start
@api.onchange('code_prefix_end')
def _onchange_code_prefix_end(self):
if not self.code_prefix_start or self.code_prefix_start > self.code_prefix_end:
self.code_prefix_start = self.code_prefix_end
def name_get(self):
result = []
for group in self:
prefix = group.code_prefix_start and str(group.code_prefix_start)
if prefix and group.code_prefix_end != group.code_prefix_start:
prefix += '-' + str(group.code_prefix_end)
name = (prefix and (prefix + ' ') or '') + group.name
result.append((group.id, name))
return result
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
args = args or []
if operator == 'ilike' and not (name or '').strip():
domain = []
else:
criteria_operator = ['|'] if operator not in expression.NEGATIVE_TERM_OPERATORS else ['&', '!']
domain = criteria_operator + [('code_prefix_start', '=ilike', name + '%'), ('name', operator, name)]
return self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
# @api.constrains('code_prefix_start', 'code_prefix_end')
# def _constraint_prefix_overlap(self):
# self.env['account.group'].flush()
# query = """
# SELECT other.id FROM account_group this
# JOIN account_group other
# ON char_length(other.code_prefix_start) = char_length(this.code_prefix_start)
# AND other.id != this.id
# AND other.company_id = this.company_id
# AND (
# other.code_prefix_start <= this.code_prefix_start AND this.code_prefix_start <= other.code_prefix_end
# OR
# other.code_prefix_start >= this.code_prefix_start AND this.code_prefix_end >= other.code_prefix_start
# )
# WHERE this.id IN %(ids)s
# """
# self.env.cr.execute(query, {'ids': tuple(self.ids)})
# res = self.env.cr.fetchall()
# if res:
# raise ValidationError(_('Account Groups with the same granularity can\'t overlap'))
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
if 'code_prefix_start' in vals and not vals.get('code_prefix_end'):
vals['code_prefix_end'] = vals['code_prefix_start']
res_ids = super(AccountGroup, self).create(vals_list)
res_ids._adapt_accounts_for_account_groups()
res_ids._adapt_parent_account_group()
return res_ids
def write(self, vals):
res = super(AccountGroup, self).write(vals)
if 'code_prefix_start' in vals or 'code_prefix_end' in vals:
self._adapt_accounts_for_account_groups()
self._adapt_parent_account_group()
return res
def unlink(self):
for record in self:
account_ids = self.env['account.account'].search([('group_id', '=', record.id)])
account_ids.write({'group_id': record.parent_id.id})
children_ids = self.env['account.group'].search([('parent_id', '=', record.id)])
children_ids.write({'parent_id': record.parent_id.id})
super(AccountGroup, self).unlink()
def _adapt_accounts_for_account_groups(self, account_ids=None):
"""Ensure consistency between accounts and account groups.
Find and set the most specific group matching the code of the account.
The most specific is the one with the longest prefixes and with the starting
prefix being smaller than the account code and the ending prefix being greater.
"""
if not self and not account_ids:
return
self.env['account.group'].flush(self.env['account.group']._fields)
self.env['account.account'].flush(self.env['account.account']._fields)
query = """
WITH relation AS (
SELECT DISTINCT FIRST_VALUE(agroup.id) OVER (PARTITION BY account.id ORDER BY char_length(
agroup.code_prefix_start) DESC, agroup.id) AS group_id,
account.id AS account_id
FROM account_group agroup
JOIN account_account account
ON agroup.code_prefix_start <= LEFT(account.code, char_length(agroup.code_prefix_start))
AND agroup.code_prefix_end >= LEFT(account.code, char_length(agroup.code_prefix_end))
WHERE (1 = 1){where_account}
)
UPDATE account_account account
SET group_id = relation.group_id
FROM relation
WHERE relation.account_id = account.id;
""".format(
where_account=account_ids and 'AND account.id IN %(account_ids)s' or ''
# """ -- AND
# agroup.company_id = account.company_id
# --WHERE
# account.company_id
# IN %(company_ids)s
# {where_account}
# """
)
self.env.cr.execute(query, {
# 'company_ids': tuple((self.company_id or account_ids.company_id).ids),
'account_ids': account_ids and tuple(account_ids.ids)
})
self.env['account.account'].invalidate_cache(fnames=['group_id'])
def _adapt_parent_account_group(self):
"""Ensure consistency of the hierarchy of account groups.
Find and set the most specific parent for each group.
The most specific is the one with the longest prefixes and with the starting
prefix being smaller than the child prefixes and the ending prefix being greater.
"""
if not self:
return
self.env['account.group'].flush(self.env['account.group']._fields)
query = """
WITH relation AS (
SELECT DISTINCT FIRST_VALUE(parent.id) OVER (PARTITION BY child.id ORDER BY child.id, char_length(
parent.code_prefix_start) DESC) AS parent_id,
child.id AS child_id
FROM account_group parent
JOIN account_group child
ON char_length(parent.code_prefix_start) < char_length(child.code_prefix_start)
AND parent.code_prefix_start <= LEFT(child.code_prefix_start, char_length(
parent.code_prefix_start))
AND parent.code_prefix_end >= LEFT(child.code_prefix_end, char_length(parent.code_prefix_end))
AND parent.id != child.id
)
UPDATE account_group child
SET parent_id = relation.parent_id
FROM relation
WHERE child.id = relation.child_id;
"""
# """
# AND parent.company_id = child.company_id
# WHERE child.company_id IN %(company_ids)s
# """
self.env.cr.execute(query) # , {'company_ids': tuple(self.company_id.ids)}
self.env['account.group'].invalidate_cache(fnames=['parent_id'])
# self.env['account.group'].search([('company_id', 'in', self.company_id.ids)])._parent_store_update()
class AccountRoot(models.Model):
_name = 'account.root'
_description = 'Account codes first 2 digits'
_auto = False
name = fields.Char()
parent_id = fields.Many2one('account.root')
# company_id = fields.Many2one('res.company')
def init(self):
tools.drop_view_if_exists(self.env.cr, self._table)
self.env.cr.execute('''
CREATE OR REPLACE VIEW %s AS (
SELECT DISTINCT ASCII(code) * 1000 + ASCII(SUBSTRING(code,2,1)) AS id,
LEFT(code,2) AS name,
ASCII(code) AS parent_id
FROM account_account WHERE code IS NOT NULL
UNION ALL
SELECT DISTINCT ASCII(code) AS id,
LEFT(code,1) AS name,
NULL::int AS parent_id
FROM account_account WHERE code IS NOT NULL
)''' % (self._table,)
)
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class AccountAccountTag(models.Model):
_name = 'account.account.tag'
_description = 'Account Tag'
name = fields.Char('Tag Name', required=True)
applicability = fields.Selection([('accounts', 'Accounts'), ('taxes', 'Taxes')],
required=True, default='accounts')
color = fields.Integer('Color Index')
active = fields.Boolean(default=True,
help="Set active to false to hide the Account Tag without removing it.")
# tax_report_line_ids = fields.Many2many(string="Tax Report Lines",
# comodel_name='account.tax.report.line',
# relation='account_tax_report_line_tags_rel',
# help="The tax report lines using this tag")
tax_negate = fields.Boolean(string="Negate Tax Balance",
help="Check this box to negate the absolute value of the balance of the lines associated with this tag in tax report computation.")
country_id = fields.Many2one(string="Country", comodel_name='res.country',
help="Country for which this tag is available, when applied on taxes.")
@api.model
def _get_tax_tags(self, tag_name, country_id):
""" Returns all the tax tags corresponding to the tag name given in parameter
in the specified country.
"""
escaped_tag_name = tag_name.replace('\\', '\\\\').replace('%', '\%').replace('_', '\_')
return self.env['account.account.tag'].search([('name', '=like', '_' + escaped_tag_name),
('country_id', '=', country_id),
('applicability', '=', 'taxes')])
@api.constrains('country_id', 'applicability')
def _validate_tag_country(self):
for record in self:
if record.applicability == 'taxes' and not record.country_id:
raise ValidationError(_("A tag defined to be used on taxes must always have a country set."))
# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo.osv import expression
from odoo.tools.float_utils import float_round as round
from odoo.exceptions import UserError, ValidationError
import math
import logging
TYPE_TAX_USE = [
('sale', 'Sales'),
('purchase', 'Purchases'),
('none', 'None'),
]
class AccountTaxGroup(models.Model):
_name = 'account.tax.group'
_description = 'Tax Group'
_order = 'sequence asc'
name = fields.Char(required=True, translate=True)
sequence = fields.Integer(default=10)
property_tax_payable_account_id = fields.Many2one('account.account', company_dependent=True,
string='Tax current account (payable)')
property_tax_receivable_account_id = fields.Many2one('account.account', company_dependent=True,
string='Tax current account (receivable)')
property_advance_tax_payment_account_id = fields.Many2one('account.account', company_dependent=True,
string='Advance Tax payment account')
# def _any_is_configured(self, company_id):
# domain = expression.OR([[('property_tax_payable_account_id', '!=', False)],
# [('property_tax_receivable_account_id', '!=', False)],
# [('property_advance_tax_payment_account_id', '!=', False)]])
# group_with_config = self.with_company(company_id).search_count(domain)
# return group_with_config > 0
class AccountTax(models.Model):
_name = 'account.tax'
_description = 'Tax'
_order = 'sequence,id'
_check_company_auto = True
@api.model
def _default_tax_group(self):
return self.env['account.tax.group'].search([], limit=1)
name = fields.Char(string='Tax Name', required=True)
type_tax_use = fields.Selection(TYPE_TAX_USE, string='Tax Type', required=True, default="sale",
help="Determines where the tax is selectable. Note : 'None' means a tax can't be "
"used by itself, however it can still be used in a group. 'adjustment' is "
"used to perform tax adjustment.")
tax_scope = fields.Selection([('service', 'Services'), ('consu', 'Goods')], string="Tax Scope",
help="Restrict the use of taxes to a type of product.")
amount_type = fields.Selection(default='percent', string="Tax Computation", required=True,
selection=[('group', 'Group of Taxes'), ('fixed', 'Fixed'),
('percent', 'Percentage of Price'),
('division', 'Percentage of Price Tax Included')],
help="""
- Group of Taxes: The tax is a set of sub taxes.
- Fixed: The tax amount stays the same whatever the price.
- Percentage of Price: The tax amount is a % of the price:
e.g 100 * (1 + 10%) = 110 (not price included)
e.g 110 / (1 + 10%) = 100 (price included)
- Percentage of Price Tax Included: The tax amount is a division of the price:
e.g 180 / (1 - 10%) = 200 (not price included)
e.g 200 * (1 - 10%) = 180 (price included)
""")
active = fields.Boolean(default=True, help="Set active to false to hide the tax without removing it.")
# company_id = fields.Many2one('res.company', string='Company', required=True, readonly=True, default=lambda
# self: self.env.company)
children_tax_ids = fields.Many2many('account.tax',
'account_tax_filiation_rel', 'parent_tax', 'child_tax',
check_company=True,
string='Children Taxes')
sequence = fields.Integer(required=True, default=1,
help="The sequence field is used to define order in which the tax lines are applied.")
amount = fields.Float(required=True, digits=(16, 4), default=0.0)
description = fields.Char(string='Label on Invoices')
price_include = fields.Boolean(string='Included in Price', default=False,
help="Check this if the price you use on the product and invoices includes this "
"tax.")
include_base_amount = fields.Boolean(string='Affect Base of Subsequent Taxes', default=False,
help="If set, taxes which are computed after this one will be computed based "
"on the price tax included.")
analytic = fields.Boolean(string="Include in Analytic Cost",
help="If set, the amount computed by this tax will be assigned to the same analytic "
"account as the invoice line (if any)")
tax_group_id = fields.Many2one('account.tax.group', string="Tax Group", default=_default_tax_group, required=True)
# Technical field to make the 'tax_exigibility' field invisible if the same named field is set to false in
# 'res.company' model
# hide_tax_exigibility = fields.Boolean(string='Hide Use Cash Basis Option',
# related='company_id.tax_exigibility', readonly=True)
tax_exigibility = fields.Selection(
[('on_invoice', 'Based on Invoice'),
('on_payment', 'Based on Payment'),
], string='Tax Due', default='on_invoice',
help="Based on Invoice: the tax is due as soon as the invoice is validated.\n"
"Based on Payment: the tax is due as soon as the payment of the invoice is received.")
cash_basis_transition_account_id = fields.Many2one(string="Cash Basis Transition Account",
check_company=True,
domain="[('deprecated', '=', False), ]",
# ('company_id', '=', company_id)
comodel_name='account.account',
help="Account used to transition the tax amount for cash basis "
"taxes. It will contain the tax amount as long as the "
"original invoice has not been reconciled ; at "
"reconciliation, this amount cancelled on this account "
"and put on the regular tax account.")
invoice_repartition_line_ids = fields.One2many(string="Distribution for Invoices",
comodel_name="account.tax.repartition.line",
inverse_name="invoice_tax_id", copy=True,
help="Distribution when the tax is used on an invoice")
refund_repartition_line_ids = fields.One2many(string="Distribution for Refund Invoices",
comodel_name="account.tax.repartition.line",
inverse_name="refund_tax_id", copy=True,
help="Distribution when the tax is used on a refund")
# tax_fiscal_country_id = fields.Many2one(string='Fiscal Country', comodel_name='res.country',
# related='company_id.account_tax_fiscal_country_id',
# help="Technical field used to restrict the domain of account tags for
# tax repartition lines created for this tax.")
# country_code = fields.Char(related='company_id.country_id.code', readonly=True)
_sql_constraints = [
('name_uniq', 'unique(name, type_tax_use, tax_scope)', 'Tax names must be unique !'), # company_id, company_
]
# @api.model
# def default_get(self, fields_list):
# company_id is added so that we are sure to fetch a default value from it to use in repartition lines, below
# rslt = super(AccountTax, self).default_get(fields_list ) #+ ['company_id']
# company_id = rslt.get('company_id')
# company = self.env['res.company'].browse(company_id)
# if 'refund_repartition_line_ids' in fields_list:
# We write on the related country_id field so that the field is recomputed. Without that, it will stay
# empty until we save the record.
# rslt['refund_repartition_line_ids'] = [
# (0, 0, {
# 'repartition_type': 'base', 'factor_percent': 100.0, 'tag_ids': [], 'company_id': company_id,
# 'tax_fiscal_country_id': company.country_id.id
# }),
# (0, 0, {
# 'repartition_type': 'tax', 'factor_percent': 100.0, 'tag_ids': [], 'company_id': company_id,
# 'tax_fiscal_country_id': company.country_id.id
# }),
# ]
# if 'invoice_repartition_line_ids' in fields_list:
# We write on the related country_id field so that the field is recomputed. Without that, it will stay
# empty until we save the record.
# rslt['invoice_repartition_line_ids'] = [
# (0, 0, {
# 'repartition_type': 'base', 'factor_percent': 100.0, 'tag_ids': [], 'company_id': company_id,
# 'tax_fiscal_country_id': company.country_id.id
# }),
# (0, 0, {
# 'repartition_type': 'tax', 'factor_percent': 100.0, 'tag_ids': [], 'company_id': company_id,
# 'tax_fiscal_country_id': company.country_id.id
# }),
# ]
# return rslt
def _check_repartition_lines(self, lines):
self.ensure_one()
base_line = lines.filtered(lambda x: x.repartition_type == 'base')
if len(base_line) != 1:
raise ValidationError(
_("Invoice and credit note distribution should each contain exactly one line for the base."))
@api.constrains('invoice_repartition_line_ids', 'refund_repartition_line_ids')
def _validate_repartition_lines(self):
for record in self:
invoice_repartition_line_ids = record.invoice_repartition_line_ids.sorted()
refund_repartition_line_ids = record.refund_repartition_line_ids.sorted()
record._check_repartition_lines(invoice_repartition_line_ids)
record._check_repartition_lines(refund_repartition_line_ids)
if len(invoice_repartition_line_ids) != len(refund_repartition_line_ids):
raise ValidationError(_("Invoice and credit note distribution should have the same number of lines."))
index = 0
while index < len(invoice_repartition_line_ids):
inv_rep_ln = invoice_repartition_line_ids[index]
ref_rep_ln = refund_repartition_line_ids[index]
if inv_rep_ln.repartition_type != ref_rep_ln.repartition_type or inv_rep_ln.factor_percent != \
ref_rep_ln.factor_percent:
raise ValidationError(
_("Invoice and credit note distribution should match (same percentages, in the same order)."))
index += 1
@api.constrains('children_tax_ids', 'type_tax_use')
def _check_children_scope(self):
for tax in self:
if not tax._check_m2m_recursion('children_tax_ids'):
raise ValidationError(_("Recursion found for tax '%s'.") % (tax.name,))
if any(child.type_tax_use not in ('none', tax.type_tax_use) or child.tax_scope != tax.tax_scope for child in
tax.children_tax_ids):
raise ValidationError(
_('The application scope of taxes in a group must be either the same as the group or left empty.'))
# @api.constrains('company_id')
# def _check_company_consistency(self):
# if not self:
# return
#
# self.flush(['company_id'])
# self._cr.execute('''
# SELECT line.id
# FROM account_move_line line
# JOIN account_tax tax ON tax.id = line.tax_line_id
# WHERE line.tax_line_id IN %s
# AND line.company_id != tax.company_id
#
# UNION ALL
#
# SELECT line.id
# FROM account_move_line_account_tax_rel tax_rel
# JOIN account_tax tax ON tax.id = tax_rel.account_tax_id
# JOIN account_move_line line ON line.id = tax_rel.account_move_line_id
# WHERE tax_rel.account_tax_id IN %s
# AND line.company_id != tax.company_id
# ''', [tuple(self.ids)] * 2)
# if self._cr.fetchone():
# raise UserError(
# _("You can't change the company of your tax since there are some journal items linked to it."))
@api.returns('self', lambda value: value.id)
def copy(self, default=None):
default = dict(default or {})
if 'name' not in default:
default['name'] = _("%s (Copy)") % self.name
return super(AccountTax, self).copy(default=default)
def name_get(self):
name_list = []
type_tax_use = dict(self._fields['type_tax_use']._description_selection(self.env))
tax_scope = dict(self._fields['tax_scope']._description_selection(self.env))
for record in self:
name = record.name
if self._context.get('append_type_to_tax_name'):
name += ' (%s)' % type_tax_use.get(record.type_tax_use)
if record.tax_scope:
name += ' (%s)' % tax_scope.get(record.tax_scope)
name_list += [(record.id, name)]
return name_list
@api.model
def _name_search(self, name, args=None, operator='ilike', limit=100, name_get_uid=None):
""" Returns a list of tuples containing id, name, as internally it is called {def name_get}
result format: {[(id, name), (id, name), ...]}
"""
args = args or []
if operator == 'ilike' and not (name or '').strip():
domain = []
else:
connector = '&' if operator in expression.NEGATIVE_TERM_OPERATORS else '|'
domain = [connector, ('description', operator, name), ('name', operator, name)]
return self._search(expression.AND([domain, args]), limit=limit, access_rights_uid=name_get_uid)
@api.model
def _search(self, args, offset=0, limit=None, order=None, count=False, access_rights_uid=None):
context = self._context or {}
if context.get('move_type'):
if context.get('move_type') in ('out_invoice', 'out_refund'):
args += [('type_tax_use', '=', 'sale')]
elif context.get('move_type') in ('in_invoice', 'in_refund'):
args += [('type_tax_use', '=', 'purchase')]
if context.get('journal_id'):
journal = self.env['account.journal'].browse(context.get('journal_id'))
if journal.type in ('sale', 'purchase'):
args += [('type_tax_use', '=', journal.type)]
return super(AccountTax, self)._search(args, offset, limit, order, count=count,
access_rights_uid=access_rights_uid)
@api.onchange('amount')
def onchange_amount(self):
if self.amount_type in ('percent', 'division') and self.amount != 0.0 and not self.description:
self.description = "{0:.4g}%".format(self.amount)
@api.onchange('amount_type')
def onchange_amount_type(self):
if self.amount_type != 'group':
self.children_tax_ids = [(5,)]
if self.amount_type == 'group':
self.description = None
@api.onchange('price_include')
def onchange_price_include(self):
if self.price_include:
self.include_base_amount = True
def _compute_amount(self, base_amount, price_unit, quantity=1.0, product=None, partner=None):
""" Returns the amount of a single tax. base_amount is the actual amount on which the tax is applied, which is
price_unit * quantity eventually affected by previous taxes (if tax is include_base_amount XOR
price_include)
"""
self.ensure_one()
if self.amount_type == 'fixed':
# Use copysign to take into account the sign of the base amount which includes the sign
# of the quantity and the sign of the price_unit
# Amount is the fixed price for the tax, it can be negative
# Base amount included the sign of the quantity and the sign of the unit price and when
# a product is returned, it can be done either by changing the sign of quantity or by changing the
# sign of the price unit.
# When the price unit is equal to 0, the sign of the quantity is absorbed in base_amount then
# a "else" case is needed.
if base_amount:
return math.copysign(quantity, base_amount) * self.amount
else:
return quantity * self.amount
price_include = self._context.get('force_price_include', self.price_include)
# base * (1 + tax_amount) = new_base
if self.amount_type == 'percent' and not price_include:
return base_amount * self.amount / 100
# <=> new_base = base / (1 + tax_amount)
if self.amount_type == 'percent' and price_include:
return base_amount - (base_amount / (1 + self.amount / 100))
# base / (1 - tax_amount) = new_base
if self.amount_type == 'division' and not price_include:
return base_amount / (1 - self.amount / 100) - base_amount if (1 - self.amount / 100) else 0.0
# <=> new_base * (1 - tax_amount) = base
if self.amount_type == 'division' and price_include:
return base_amount - (base_amount * (self.amount / 100))
def json_friendly_compute_all(self, price_unit, currency_id=None, quantity=1.0, product_id=None, partner_id=None,
is_refund=False):
""" Called by the reconciliation to compute taxes on writeoff during bank reconciliation
"""
if currency_id:
currency_id = self.env['res.currency'].browse(currency_id)
if product_id:
product_id = self.env['product.product'].browse(product_id)
if partner_id:
partner_id = self.env['res.partner'].browse(partner_id)
# We first need to find out whether this tax computation is made for a refund
tax_type = self and self[0].type_tax_use
is_refund = is_refund or (tax_type == 'sale' and price_unit < 0) or (tax_type == 'purchase' and price_unit > 0)
rslt = self.compute_all(price_unit, currency=currency_id, quantity=quantity, product=product_id,
partner=partner_id, is_refund=is_refund)
# The reconciliation widget calls this function to generate writeoffs on bank journals,
# so the sign of the tags might need to be inverted, so that the tax report
# computation can treat them as any other miscellaneous operations, while
# keeping a computation in line with the effect the tax would have had on an invoice.
if (tax_type == 'sale' and not is_refund) or (tax_type == 'purchase' and is_refund):
base_tags = self.env['account.account.tag'].browse(rslt['base_tags'])
rslt['base_tags'] = self.env['account.move.line']._revert_signed_tags(base_tags).ids
for tax_result in rslt['taxes']:
tax_tags = self.env['account.account.tag'].browse(tax_result['tag_ids'])
tax_result['tag_ids'] = self.env['account.move.line']._revert_signed_tags(tax_tags).ids
return rslt
def flatten_taxes_hierarchy(self, create_map=False):
# Flattens the taxes contained in this recordset, returning all the
# children at the bottom of the hierarchy, in a recordset, ordered by sequence.
# Eg. considering letters as taxes and alphabetic order as sequence :
# [G, B([A, D, F]), E, C] will be computed as [A, D, F, C, E, G]
# If create_map is True, an additional value is returned, a dictionary
# mapping each child tax to its parent group
all_taxes = self.env['account.tax']
groups_map = {}
for tax in self.sorted(key=lambda r: r.sequence):
if tax.amount_type == 'group':
flattened_children = tax.children_tax_ids.flatten_taxes_hierarchy()
all_taxes += flattened_children
for flat_child in flattened_children:
groups_map[flat_child] = tax
else:
all_taxes += tax
if create_map:
return all_taxes, groups_map
return all_taxes
def get_tax_tags(self, is_refund, repartition_type):
rep_lines = self.mapped(is_refund and 'refund_repartition_line_ids' or 'invoice_repartition_line_ids')
return rep_lines.filtered(lambda x: x.repartition_type == repartition_type).mapped('tag_ids')
def compute_all(self, price_unit, currency=None, quantity=1.0, product=None, partner=None, is_refund=False,
handle_price_include=True):
""" Returns all information required to apply taxes (in self + their children in case of a tax group).
We consider the sequence of the parent for group of taxes.
Eg. considering letters as taxes and alphabetic order as sequence :
[G, B([A, D, F]), E, C] will be computed as [A, D, F, C, E, G]
'handle_price_include' is used when we need to ignore all tax included in price. If False, it means the
amount passed to this method will be considered as the base of all computations.
RETURN: {
'total_excluded': 0.0, # Total without taxes
'total_included': 0.0, # Total with taxes
'total_void' : 0.0, # Total with those taxes, that don't have an account set
'taxes': [{ # One dict for each tax in self and their children
'id': int,
'name': str,
'amount': float,
'sequence': int,
'account_id': int,
'refund_account_id': int,
'analytic': boolean,
}],
} """
# if not self:
# company = self.env.company
# else:
# company = self[0].company_id
# 1) Flatten the taxes.
taxes, groups_map = self.flatten_taxes_hierarchy(create_map=True)
# 2) Deal with the rounding methods
# if not currency:
# currency = company.currency_id
# By default, for each tax, tax amount will first be computed
# and rounded at the 'Account' decimal precision for each
# PO/SO/invoice line and then these rounded amounts will be
# summed, leading to the total amount for that tax. But, if the
# company has tax_calculation_rounding_method = round_globally,
# we still follow the same method, but we use a much larger
# precision when we round the tax amount for each line (we use
# the 'Account' decimal precision + 5), and that way it's like
# rounding after the sum of the tax amounts of each line
prec = currency.rounding
# In some cases, it is necessary to force/prevent the rounding of the tax and the total
# amounts. For example, in SO/PO line, we don't want to round the price unit at the
# precision of the currency.
# The context key 'round' allows to force the standard behavior.
# round_tax = False if company.tax_calculation_rounding_method == 'round_globally' else True
if 'round' in self.env.context:
round_tax = bool(self.env.context['round'])
if not round_tax:
prec *= 1e-5
# 3) Iterate the taxes in the reversed sequence order to retrieve the initial base of the computation.
# tax | base | amount |
# /\ ----------------------------
# || tax_1 | XXXX | | <- we are looking for that, it's the total_excluded
# || tax_2 | .. | |
# || tax_3 | .. | |
# || ... | .. | .. |
# ----------------------------
def recompute_base(base_amount, fixed_amount, percent_amount, division_amount):
# Recompute the new base amount based on included fixed/percent amounts and the current base amount.
# Example:
# tax | amount | type | price_include |
# -----------------------------------------------
# tax_1 | 10% | percent | t
# tax_2 | 15 | fix | t
# tax_3 | 20% | percent | t
# tax_4 | 10% | division | t
# -----------------------------------------------
# if base_amount = 145, the new base is computed as:
# (145 - 15) / (1.0 + 30%) * 90% = 130 / 1.3 * 90% = 90
return (base_amount - fixed_amount) / (1.0 + percent_amount / 100.0) * (100 - division_amount) / 100
# The first/last base must absolutely be rounded to work in round globally.
# Indeed, the sum of all taxes ('taxes' key in the result dictionary) must be strictly equals to
# 'price_included' - 'price_excluded' whatever the rounding method.
#
# Example using the global rounding without any decimals:
# Suppose two invoice lines: 27000 and 10920, both having a 19% price included tax.
#
# Line 1 Line 2
# -----------------------------------------------------------------------
# total_included: 27000 10920
# tax: 27000 / 1.19 = 4310.924 10920 / 1.19 = 1743.529
# total_excluded: 22689.076 9176.471
#
# If the rounding of the total_excluded isn't made at the end, it could lead to some rounding issues
# when summing the tax amounts, e.g. on invoices.
# In that case:
# - amount_untaxed will be 22689 + 9176 = 31865
# - amount_tax will be 4310.924 + 1743.529 = 6054.453 ~ 6054
# - amount_total will be 31865 + 6054 = 37919 != 37920 = 27000 + 10920
#
# By performing a rounding at the end to compute the price_excluded amount, the amount_tax will be strictly
# equals to 'price_included' - 'price_excluded' after rounding and then:
# Line 1: sum(taxes) = 27000 - 22689 = 4311
# Line 2: sum(taxes) = 10920 - 2176 = 8744
# amount_tax = 4311 + 8744 = 13055
# amount_total = 31865 + 13055 = 37920
base = currency.round(price_unit * quantity)
# For the computation of move lines, we could have a negative base value.
# In this case, compute all with positive values and negate them at the end.
sign = 1
if currency.is_zero(base):
sign = self._context.get('force_sign', 1)
elif base < 0:
sign = -1
if base < 0:
base = -base
# Store the totals to reach when using price_include taxes (only the last price included in row)
total_included_checkpoints = {}
i = len(taxes) - 1
store_included_tax_total = True
# Keep track of the accumulated included fixed/percent amount.
incl_fixed_amount = incl_percent_amount = incl_division_amount = 0
# Store the tax amounts we compute while searching for the total_excluded
cached_tax_amounts = {}
if handle_price_include:
for tax in reversed(taxes):
tax_repartition_lines = (
is_refund
and tax.refund_repartition_line_ids
or tax.invoice_repartition_line_ids
).filtered(lambda x: x.repartition_type == "tax")
sum_repartition_factor = sum(tax_repartition_lines.mapped("factor"))
if tax.include_base_amount:
base = recompute_base(base, incl_fixed_amount, incl_percent_amount, incl_division_amount)
incl_fixed_amount = incl_percent_amount = incl_division_amount = 0
store_included_tax_total = True
if tax.price_include or self._context.get('force_price_include'):
if tax.amount_type == 'percent':
incl_percent_amount += tax.amount * sum_repartition_factor
elif tax.amount_type == 'division':
incl_division_amount += tax.amount * sum_repartition_factor
elif tax.amount_type == 'fixed':
incl_fixed_amount += abs(quantity) * tax.amount * sum_repartition_factor
else:
# tax.amount_type == other (python)
tax_amount = tax._compute_amount(base, sign * price_unit, quantity, product,
partner) * sum_repartition_factor
incl_fixed_amount += tax_amount
# Avoid unecessary re-computation
cached_tax_amounts[i] = tax_amount
# In case of a zero tax, do not store the base amount since the tax amount will
# be zero anyway. Group and Python taxes have an amount of zero, so do not take
# them into account.
if store_included_tax_total and (
tax.amount or tax.amount_type not in ("percent", "division", "fixed")
):
total_included_checkpoints[i] = base
store_included_tax_total = False
i -= 1
total_excluded = currency.round(
recompute_base(base, incl_fixed_amount, incl_percent_amount, incl_division_amount))
# 4) Iterate the taxes in the sequence order to compute missing tax amounts.
# Start the computation of accumulated amounts at the total_excluded value.
base = total_included = total_void = total_excluded
# Flag indicating the checkpoint used in price_include to avoid rounding issue must be skipped since the base
# amount has changed because we are currently mixing price-included and price-excluded include_base_amount
# taxes.
skip_checkpoint = False
taxes_vals = []
i = 0
cumulated_tax_included_amount = 0
for tax in taxes:
tax_repartition_lines = (
is_refund and tax.refund_repartition_line_ids or tax.invoice_repartition_line_ids).filtered(
lambda x: x.repartition_type == 'tax')
sum_repartition_factor = sum(tax_repartition_lines.mapped('factor'))
price_include = self._context.get('force_price_include', tax.price_include)
# compute the tax_amount
if not skip_checkpoint and price_include and total_included_checkpoints.get(i):
# We know the total to reach for that tax, so we make a substraction to avoid any rounding issues
tax_amount = total_included_checkpoints[i] - (base + cumulated_tax_included_amount)
cumulated_tax_included_amount = 0
else:
tax_amount = tax.with_context(force_price_include=False)._compute_amount(
base, sign * price_unit, quantity, product, partner)
# Round the tax_amount multiplied by the computed repartition lines factor.
tax_amount = round(tax_amount, precision_rounding=prec)
factorized_tax_amount = round(tax_amount * sum_repartition_factor, precision_rounding=prec)
if price_include and not total_included_checkpoints.get(i):
cumulated_tax_included_amount += factorized_tax_amount
# If the tax affects the base of subsequent taxes, its tax move lines must
# receive the base tags and tag_ids of these taxes, so that the tax report computes
# the right total
subsequent_taxes = self.env['account.tax']
subsequent_tags = self.env['account.account.tag']
if tax.include_base_amount:
subsequent_taxes = taxes[i + 1:]
subsequent_tags = subsequent_taxes.get_tax_tags(is_refund, 'base')
# Compute the tax line amounts by multiplying each factor with the tax amount.
# Then, spread the tax rounding to ensure the consistency of each line independently with the factorized
# amount. E.g:
#
# Suppose a tax having 4 x 50% repartition line applied on a tax amount of 0.03 with 2 decimal places.
# The factorized_tax_amount will be 0.06 (200% x 0.03). However, each line taken independently will compute
# 50% * 0.03 = 0.01 with rounding. It means there is 0.06 - 0.04 = 0.02 as total_rounding_error to dispatch
# in lines as 2 x 0.01.
repartition_line_amounts = [round(tax_amount * line.factor, precision_rounding=prec) for line in
tax_repartition_lines]
total_rounding_error = round(factorized_tax_amount - sum(repartition_line_amounts), precision_rounding=prec)
nber_rounding_steps = int(abs(total_rounding_error / currency.rounding))
rounding_error = round(nber_rounding_steps and total_rounding_error / nber_rounding_steps or 0.0,
precision_rounding=prec)
for repartition_line, line_amount in zip(tax_repartition_lines, repartition_line_amounts):
if nber_rounding_steps:
line_amount += rounding_error
nber_rounding_steps -= 1
taxes_vals.append({
'id': tax.id,
'name': partner and tax.with_context(lang=partner.lang).name or tax.name,
'amount': sign * line_amount,
'base': round(sign * base, precision_rounding=prec),
'sequence': tax.sequence,
'account_id': tax.cash_basis_transition_account_id.id if tax.tax_exigibility == 'on_payment' else
repartition_line.account_id.id,
'analytic': tax.analytic,
'price_include': price_include,
'tax_exigibility': tax.tax_exigibility,
'tax_repartition_line_id': repartition_line.id,
'group': groups_map.get(tax),
'tag_ids': (repartition_line.tag_ids + subsequent_tags).ids,
'tax_ids': subsequent_taxes.ids,
})
if not repartition_line.account_id:
total_void += line_amount
# Affect subsequent taxes
if tax.include_base_amount:
base += factorized_tax_amount
if not price_include:
skip_checkpoint = True
total_included += factorized_tax_amount
i += 1
return {
'base_tags': taxes.mapped(
is_refund and 'refund_repartition_line_ids' or 'invoice_repartition_line_ids').filtered(
lambda x: x.repartition_type == 'base').mapped('tag_ids').ids,
'taxes': taxes_vals,
'total_excluded': sign * total_excluded,
'total_included': sign * currency.round(total_included),
'total_void': sign * currency.round(total_void),
}
@api.model
def _fix_tax_included_price(self, price, prod_taxes, line_taxes):
"""Subtract tax amount from price when corresponding "price included" taxes do not apply"""
# FIXME get currency in param?
prod_taxes = prod_taxes._origin
line_taxes = line_taxes._origin
incl_tax = prod_taxes.filtered(lambda tax: tax not in line_taxes and tax.price_include)
if incl_tax:
return incl_tax.compute_all(price)['total_excluded']
return price
@api.model
def _fix_tax_included_price_company(self, price, prod_taxes, line_taxes, company_id):
# if company_id:
# To keep the same behavior as in _compute_tax_id
# prod_taxes = prod_taxes.filtered(lambda tax: tax.company_id == company_id)
# line_taxes = line_taxes.filtered(lambda tax: tax.company_id == company_id)
return self._fix_tax_included_price(price, prod_taxes, line_taxes)
class AccountTaxRepartitionLine(models.Model):
_name = "account.tax.repartition.line"
_description = "Tax Repartition Line"
_order = 'sequence, repartition_type, id'
_check_company_auto = True
factor_percent = fields.Float(string="%", required=True,
help="Factor to apply on the account move lines generated from this distribution "
"line, in percents")
factor = fields.Float(string="Factor Ratio", compute="_compute_factor",
help="Factor to apply on the account move lines generated from this distribution line")
repartition_type = fields.Selection(string="Based On", selection=[('base', 'Base'), ('tax', 'of tax')],
required=True, default='tax', help="Base on which the factor will be applied.")
account_id = fields.Many2one(string="Account",
comodel_name='account.account',
domain="[('deprecated', '=', False), " # ('company_id', '=', company_id),
"('internal_type', 'not in', ('receivable', 'payable'))]",
# check_company=True,
help="Account on which to post the tax amount")
tag_ids = fields.Many2many(string="Tax Grids", comodel_name='account.account.tag',
domain=[('applicability', '=', 'taxes')], copy=True)
invoice_tax_id = fields.Many2one(comodel_name='account.tax',
ondelete='cascade',
check_company=True,
help="The tax set to apply this distribution on invoices. Mutually exclusive "
"with refund_tax_id")
refund_tax_id = fields.Many2one(comodel_name='account.tax',
ondelete='cascade',
check_company=True,
help="The tax set to apply this distribution on refund invoices. Mutually "
"exclusive with invoice_tax_id")
tax_id = fields.Many2one(comodel_name='account.tax', compute='_compute_tax_id')
# tax_fiscal_country_id = fields.Many2one(string="Fiscal Country", comodel_name='res.country',
# related='company_id.account_tax_fiscal_country_id',
# help="Technical field used to restrict tags domain in form view.")
# company_id = fields.Many2one(string="Company", comodel_name='res.company', compute="_compute_company",
# store=True, help="The company this distribution line belongs to.")
sequence = fields.Integer(string="Sequence", default=1,
help="The order in which distribution lines are displayed and matched. For refunds to "
"work properly, invoice distribution lines should be arranged in the same order as "
"the credit note distribution lines they correspond to.")
use_in_tax_closing = fields.Boolean(string="Tax Closing Entry")
@api.onchange('account_id', 'repartition_type')
def _on_change_account_id(self):
if not self.account_id or self.repartition_type == 'base':
self.use_in_tax_closing = False
else:
self.use_in_tax_closing = self.account_id.internal_group not in ('income', 'expense')
@api.constrains('invoice_tax_id', 'refund_tax_id')
def validate_tax_template_link(self):
for record in self:
if record.invoice_tax_id and record.refund_tax_id:
raise ValidationError(
_("Tax distribution lines should apply to either invoices or refunds, not both at the same time. "
"invoice_tax_id and refund_tax_id should not be set together."))
@api.depends('factor_percent')
def _compute_factor(self):
for record in self:
record.factor = record.factor_percent / 100.0
# @api.depends('invoice_tax_id.company_id', 'refund_tax_id.company_id')
# def _compute_company(self):
# for record in self:
# record.company_id = record.invoice_tax_id and record.invoice_tax_id.company_id.id or \
# record.refund_tax_id.company_id.id
@api.depends('invoice_tax_id', 'refund_tax_id')
def _compute_tax_id(self):
for record in self:
record.tax_id = record.invoice_tax_id or record.refund_tax_id
@api.onchange('repartition_type')
def _onchange_repartition_type(self):
if self.repartition_type == 'base':
self.account_id = None
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_account_account_admin","access.account.account.admin","model_account_account","base.group_system",1,1,1,1
"access_account_account_type_admin","access.account.account.type.admin","model_account_account_type","base.group_system",1,1,1,1
#Dashboard Pajak
Module ini digunakan untuk membuat dashboard pajak
\ No newline at end of file
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import controllers
from . import models
from . import wizard
from . import report
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Indonesia Goverment Dashboard',
'version': '0.1',
'summary': 'Indonesia Goverment Dashboard',
'sequence': 10,
'description': """
RI Goverment Dashboard
""",
'category': 'Indonesia Goverment',
'website': 'https://opensipkd.com',
'images': [],
'depends': ['id_gov', 'idg_account', 'portal'],
'data': [
# 'security/account_security.xml',
'security/ir.model.access.csv',
# 'security/ir_rule.xml',
'views/region_tax_potency.xml',
'views/region_tax_plan.xml',
'views/region_tax_actual.xml',
'views/menus.xml',
# 'views/portal_templates.xml',
"demo/idg.region.tax.potency.csv",
"demo/idg.region.tax.plan.csv",
"demo/idg.region.tax.actual.csv",
],
'demo': [
# "demo/idg.region.tax.potency.csv"
],
'qweb': [],
'installable': True,
'application': True,
'auto_install': False,
'license': 'LGPL-3',
'module': 'pajak'
}
"id","account_id",amount,country_id,state_id,district_id
"id_acc_41010101001_p","41010101001",10000000,id,JB,
"id_acc_41010101002_p","41010101002",10000000,id,JB,
"id_acc_41010101003_p","41010101003",10000000,id,JB,
"id_acc_41010101004_p","41010101004",10000000,id,JB,
"id_acc_41010102001_p","41010102001",10000000,id,JB,
"id_acc_41010102002_p","41010102002",10000000,id,JB,
"id_acc_41010102003_p","41010102003",10000000,id,JB,
"id_acc_41010102004_p","41010102004",10000000,id,JB,
"id_acc_41010103001_p","41010103001",10000000,id,JB,
"id_acc_41010103002_p","41010103002",10000000,id,JB,
"id_acc_41010103003_p","41010103003",10000000,id,JB,
"id_acc_41010103004_p","41010103004",10000000,id,JB,
"id_acc_41010104001_p","41010104001",10000000,id,JB,
"id_acc_41010104002_p","41010104002",10000000,id,JB,
"id_acc_41010104003_p","41010104003",10000000,id,JB,
"id_acc_41010104004_p","41010104004",10000000,id,JB,
"id_acc_41010105001_p","41010105001",10000000,id,JB,
"id_acc_41010105002_p","41010105002",10000000,id,JB,
"id_acc_41010105003_p","41010105003",10000000,id,JB,
"id_acc_41010105004_p","41010105004",10000000,id,JB,
"id_acc_41010106001_p","41010106001",10000000,id,JB,
"id_acc_41010106002_p","41010106002",10000000,id,JB,
"id_acc_41010106003_p","41010106003",10000000,id,JB,
"id_acc_41010106004_p","41010106004",10000000,id,JB,
"id_acc_41010107001_p","41010107001",10000000,id,JB,
"id_acc_41010107002_p","41010107002",10000000,id,JB,
"id_acc_41010107003_p","41010107003",10000000,id,JB,
"id_acc_41010107004_p","41010107004",10000000,id,JB,
"id_acc_41010108001_p","41010108001",10000000,id,JB,
"id_acc_41010108002_p","41010108002",10000000,id,JB,
"id_acc_41010108003_p","41010108003",10000000,id,JB,
"id_acc_41010108004_p","41010108004",10000000,id,JB,
"id_acc_41010109001_p","41010109001",10000000,id,JB,
"id_acc_41010109002_p","41010109002",10000000,id,JB,
"id_acc_41010109003_p","41010109003",10000000,id,JB,
"id_acc_41010109004_p","41010109004",10000000,id,JB,
"id_acc_41010110001_p","41010110001",10000000,id,JB,
"id_acc_41010110002_p","41010110002",10000000,id,JB,
"id_acc_41010110003_p","41010110003",10000000,id,JB,
"id_acc_41010110004_p","41010110004",10000000,id,JB,
"id_acc_41010111001_p","41010111001",10000000,id,JB,
"id_acc_41010111002_p","41010111002",10000000,id,JB,
"id_acc_41010111003_p","41010111003",10000000,id,JB,
"id_acc_41010111004_p","41010111004",10000000,id,JB,
"id_acc_41010112001_p","41010112001",10000000,id,JB,
"id_acc_41010112002_p","41010112002",10000000,id,JB,
"id_acc_41010112003_p","41010112003",10000000,id,JB,
"id_acc_41010112004_p","41010112004",10000000,id,JB,
"id_acc_41010113001_p","41010113001",10000000,id,JB,
"id_acc_41010113002_p","41010113002",10000000,id,JB,
"id_acc_41010113003_p","41010113003",10000000,id,JB,
"id_acc_41010113004_p","41010113004",10000000,id,JB,
"id_acc_41010114001_p","41010114001",10000000,id,JB,
"id_acc_41010114002_p","41010114002",10000000,id,JB,
"id_acc_41010114003_p","41010114003",10000000,id,JB,
"id_acc_41010114004_p","41010114004",10000000,id,JB,
"id_acc_41010201001_p","41010201001",10000000,id,JB,
"id_acc_41010202001_p","41010202001",10000000,id,JB,
"id_acc_41010203001_p","41010203001",10000000,id,JB,
"id_acc_41010204001_p","41010204001",10000000,id,JB,
"id_acc_41010205001_p","41010205001",10000000,id,JB,
"id_acc_41010206001_p","41010206001",10000000,id,JB,
"id_acc_41010207001_p","41010207001",10000000,id,JB,
"id_acc_41010208001_p","41010208001",10000000,id,JB,
"id_acc_41010209001_p","41010209001",10000000,id,JB,
"id_acc_41010210001_p","41010210001",10000000,id,JB,
"id_acc_41010211001_p","41010211001",10000000,id,JB,
"id_acc_41010212001_p","41010212001",10000000,id,JB,
"id_acc_41010213001_p","41010213001",10000000,id,JB,
"id_acc_41010214001_p","41010214001",10000000,id,JB,
"id_acc_41010301001_p","41010301001",10000000,id,JB,
"id_acc_41010302001_p","41010302001",10000000,id,JB,
"id_acc_41010303001_p","41010303001",10000000,id,JB,
"id_acc_41010304001_p","41010304001",10000000,id,JB,
"id_acc_41010401001_p","41010401001",10000000,id,JB,
"id_acc_41010501001_p","41010501001",10000000,id,JB,
"id_acc_41010601001_p","41010601001",10000000,id,JB,71
"id_acc_41010602001_p","41010602001",10000000,id,JB,71
"id_acc_41010603001_p","41010603001",10000000,id,JB,71
"id_acc_41010604001_p","41010604001",10000000,id,JB,71
"id_acc_41010605001_p","41010605001",10000000,id,JB,71
"id_acc_41010606001_p","41010606001",10000000,id,JB,71
"id_acc_41010607001_p","41010607001",10000000,id,JB,71
"id_acc_41010608001_p","41010608001",10000000,id,JB,71
"id_acc_41010701001_p","41010701001",10000000,id,JB,71
"id_acc_41010702001_p","41010702001",10000000,id,JB,71
"id_acc_41010703001_p","41010703001",10000000,id,JB,71
"id_acc_41010704001_p","41010704001",10000000,id,JB,71
"id_acc_41010705001_p","41010705001",10000000,id,JB,71
"id_acc_41010706001_p","41010706001",10000000,id,JB,71
"id_acc_41010707001_p","41010707001",10000000,id,JB,71
"id_acc_41010801001_p","41010801001",10000000,id,JB,71
"id_acc_41010802001_p","41010802001",10000000,id,JB,71
"id_acc_41010803001_p","41010803001",10000000,id,JB,71
"id_acc_41010804001_p","41010804001",10000000,id,JB,71
"id_acc_41010805001_p","41010805001",10000000,id,JB,71
"id_acc_41010806001_p","41010806001",10000000,id,JB,71
"id_acc_41010807001_p","41010807001",10000000,id,JB,71
"id_acc_41010808001_p","41010808001",10000000,id,JB,71
"id_acc_41010809001_p","41010809001",10000000,id,JB,71
"id_acc_41010810001_p","41010810001",10000000,id,JB,71
"id_acc_41010901001_p","41010901001",10000000,id,JB,71
"id_acc_41010902001_p","41010902001",10000000,id,JB,71
"id_acc_41010903001_p","41010903001",10000000,id,JB,71
"id_acc_41010904001_p","41010904001",10000000,id,JB,71
"id_acc_41010905001_p","41010905001",10000000,id,JB,71
"id_acc_41010906001_p","41010906001",10000000,id,JB,71
"id_acc_41010907001_p","41010907001",10000000,id,JB,71
"id_acc_41010908001_p","41010908001",10000000,id,JB,71
"id_acc_41010909001_p","41010909001",10000000,id,JB,71
"id_acc_41010910001_p","41010910001",10000000,id,JB,71
"id_acc_41011001001_p","41011001001",10000000,id,JB,71
"id_acc_41011002001_p","41011002001",10000000,id,JB,71
"id_acc_41011101001_p","41011101001",10000000,id,JB,71
"id_acc_41011201001_p","41011201001",10000000,id,JB,71
"id_acc_41011301001_p","41011301001",10000000,id,JB,71
"id_acc_41011401001_p","41011401001",10000000,id,JB,71
"id_acc_41011402001_p","41011402001",10000000,id,JB,71
"id_acc_41011403001_p","41011403001",10000000,id,JB,71
"id_acc_41011404001_p","41011404001",10000000,id,JB,71
"id_acc_41011405001_p","41011405001",10000000,id,JB,71
"id_acc_41011406001_p","41011406001",10000000,id,JB,71
"id_acc_41011407001_p","41011407001",10000000,id,JB,71
"id_acc_41011408001_p","41011408001",10000000,id,JB,71
"id_acc_41011409001_p","41011409001",10000000,id,JB,71
"id_acc_41011410001_p","41011410001",10000000,id,JB,71
"id_acc_41011411001_p","41011411001",10000000,id,JB,71
"id_acc_41011412001_p","41011412001",10000000,id,JB,71
"id_acc_41011413001_p","41011413001",10000000,id,JB,71
"id_acc_41011414001_p","41011414001",10000000,id,JB,71
"id_acc_41011415001_p","41011415001",10000000,id,JB,71
"id_acc_41011416001_p","41011416001",10000000,id,JB,71
"id_acc_41011417001_p","41011417001",10000000,id,JB,71
"id_acc_41011418001_p","41011418001",10000000,id,JB,71
"id_acc_41011419001_p","41011419001",10000000,id,JB,71
"id_acc_41011420001_p","41011420001",10000000,id,JB,71
"id_acc_41011421001_p","41011421001",10000000,id,JB,71
"id_acc_41011422001_p","41011422001",10000000,id,JB,71
"id_acc_41011423001_p","41011423001",10000000,id,JB,71
"id_acc_41011424001_p","41011424001",10000000,id,JB,71
"id_acc_41011425001_p","41011425001",10000000,id,JB,71
"id_acc_41011426001_p","41011426001",10000000,id,JB,71
"id_acc_41011427001_p","41011427001",10000000,id,JB,71
"id_acc_41011428001_p","41011428001",10000000,id,JB,71
"id_acc_41011429001_p","41011429001",10000000,id,JB,71
"id_acc_41011430001_p","41011430001",10000000,id,JB,71
"id_acc_41011431001_p","41011431001",10000000,id,JB,71
"id_acc_41011432001_p","41011432001",10000000,id,JB,71
"id_acc_41011433001_p","41011433001",10000000,id,JB,71
"id_acc_41011434001_p","41011434001",10000000,id,JB,71
"id_acc_41011435001_p","41011435001",10000000,id,JB,71
"id_acc_41011436001_p","41011436001",10000000,id,JB,71
"id_acc_41011437001_p","41011437001",10000000,id,JB,71
"id_acc_41011501001_p","41011501001",10000000,id,JB,71
"id_acc_41011601001_p","41011601001",10000000,id,JB,71
"id_acc_41011602001_p","41011602001",10000000,id,JB,71
\ No newline at end of file
"id","account_id",amount,country_id,state_id,district_id
"id_acc_41010101001_p","41010101001",10000000,id,JB,
"id_acc_41010101002_p","41010101002",10000000,id,JB,
"id_acc_41010101003_p","41010101003",10000000,id,JB,
"id_acc_41010101004_p","41010101004",10000000,id,JB,
"id_acc_41010102001_p","41010102001",10000000,id,JB,
"id_acc_41010102002_p","41010102002",10000000,id,JB,
"id_acc_41010102003_p","41010102003",10000000,id,JB,
"id_acc_41010102004_p","41010102004",10000000,id,JB,
"id_acc_41010103001_p","41010103001",10000000,id,JB,
"id_acc_41010103002_p","41010103002",10000000,id,JB,
"id_acc_41010103003_p","41010103003",10000000,id,JB,
"id_acc_41010103004_p","41010103004",10000000,id,JB,
"id_acc_41010104001_p","41010104001",10000000,id,JB,
"id_acc_41010104002_p","41010104002",10000000,id,JB,
"id_acc_41010104003_p","41010104003",10000000,id,JB,
"id_acc_41010104004_p","41010104004",10000000,id,JB,
"id_acc_41010105001_p","41010105001",10000000,id,JB,
"id_acc_41010105002_p","41010105002",10000000,id,JB,
"id_acc_41010105003_p","41010105003",10000000,id,JB,
"id_acc_41010105004_p","41010105004",10000000,id,JB,
"id_acc_41010106001_p","41010106001",10000000,id,JB,
"id_acc_41010106002_p","41010106002",10000000,id,JB,
"id_acc_41010106003_p","41010106003",10000000,id,JB,
"id_acc_41010106004_p","41010106004",10000000,id,JB,
"id_acc_41010107001_p","41010107001",10000000,id,JB,
"id_acc_41010107002_p","41010107002",10000000,id,JB,
"id_acc_41010107003_p","41010107003",10000000,id,JB,
"id_acc_41010107004_p","41010107004",10000000,id,JB,
"id_acc_41010108001_p","41010108001",10000000,id,JB,
"id_acc_41010108002_p","41010108002",10000000,id,JB,
"id_acc_41010108003_p","41010108003",10000000,id,JB,
"id_acc_41010108004_p","41010108004",10000000,id,JB,
"id_acc_41010109001_p","41010109001",10000000,id,JB,
"id_acc_41010109002_p","41010109002",10000000,id,JB,
"id_acc_41010109003_p","41010109003",10000000,id,JB,
"id_acc_41010109004_p","41010109004",10000000,id,JB,
"id_acc_41010110001_p","41010110001",10000000,id,JB,
"id_acc_41010110002_p","41010110002",10000000,id,JB,
"id_acc_41010110003_p","41010110003",10000000,id,JB,
"id_acc_41010110004_p","41010110004",10000000,id,JB,
"id_acc_41010111001_p","41010111001",10000000,id,JB,
"id_acc_41010111002_p","41010111002",10000000,id,JB,
"id_acc_41010111003_p","41010111003",10000000,id,JB,
"id_acc_41010111004_p","41010111004",10000000,id,JB,
"id_acc_41010112001_p","41010112001",10000000,id,JB,
"id_acc_41010112002_p","41010112002",10000000,id,JB,
"id_acc_41010112003_p","41010112003",10000000,id,JB,
"id_acc_41010112004_p","41010112004",10000000,id,JB,
"id_acc_41010113001_p","41010113001",10000000,id,JB,
"id_acc_41010113002_p","41010113002",10000000,id,JB,
"id_acc_41010113003_p","41010113003",10000000,id,JB,
"id_acc_41010113004_p","41010113004",10000000,id,JB,
"id_acc_41010114001_p","41010114001",10000000,id,JB,
"id_acc_41010114002_p","41010114002",10000000,id,JB,
"id_acc_41010114003_p","41010114003",10000000,id,JB,
"id_acc_41010114004_p","41010114004",10000000,id,JB,
"id_acc_41010201001_p","41010201001",10000000,id,JB,
"id_acc_41010202001_p","41010202001",10000000,id,JB,
"id_acc_41010203001_p","41010203001",10000000,id,JB,
"id_acc_41010204001_p","41010204001",10000000,id,JB,
"id_acc_41010205001_p","41010205001",10000000,id,JB,
"id_acc_41010206001_p","41010206001",10000000,id,JB,
"id_acc_41010207001_p","41010207001",10000000,id,JB,
"id_acc_41010208001_p","41010208001",10000000,id,JB,
"id_acc_41010209001_p","41010209001",10000000,id,JB,
"id_acc_41010210001_p","41010210001",10000000,id,JB,
"id_acc_41010211001_p","41010211001",10000000,id,JB,
"id_acc_41010212001_p","41010212001",10000000,id,JB,
"id_acc_41010213001_p","41010213001",10000000,id,JB,
"id_acc_41010214001_p","41010214001",10000000,id,JB,
"id_acc_41010301001_p","41010301001",10000000,id,JB,
"id_acc_41010302001_p","41010302001",10000000,id,JB,
"id_acc_41010303001_p","41010303001",10000000,id,JB,
"id_acc_41010304001_p","41010304001",10000000,id,JB,
"id_acc_41010401001_p","41010401001",10000000,id,JB,
"id_acc_41010501001_p","41010501001",10000000,id,JB,
"id_acc_41010601001_p","41010601001",10000000,id,JB,71
"id_acc_41010602001_p","41010602001",10000000,id,JB,71
"id_acc_41010603001_p","41010603001",10000000,id,JB,71
"id_acc_41010604001_p","41010604001",10000000,id,JB,71
"id_acc_41010605001_p","41010605001",10000000,id,JB,71
"id_acc_41010606001_p","41010606001",10000000,id,JB,71
"id_acc_41010607001_p","41010607001",10000000,id,JB,71
"id_acc_41010608001_p","41010608001",10000000,id,JB,71
"id_acc_41010701001_p","41010701001",10000000,id,JB,71
"id_acc_41010702001_p","41010702001",10000000,id,JB,71
"id_acc_41010703001_p","41010703001",10000000,id,JB,71
"id_acc_41010704001_p","41010704001",10000000,id,JB,71
"id_acc_41010705001_p","41010705001",10000000,id,JB,71
"id_acc_41010706001_p","41010706001",10000000,id,JB,71
"id_acc_41010707001_p","41010707001",10000000,id,JB,71
"id_acc_41010801001_p","41010801001",10000000,id,JB,71
"id_acc_41010802001_p","41010802001",10000000,id,JB,71
"id_acc_41010803001_p","41010803001",10000000,id,JB,71
"id_acc_41010804001_p","41010804001",10000000,id,JB,71
"id_acc_41010805001_p","41010805001",10000000,id,JB,71
"id_acc_41010806001_p","41010806001",10000000,id,JB,71
"id_acc_41010807001_p","41010807001",10000000,id,JB,71
"id_acc_41010808001_p","41010808001",10000000,id,JB,71
"id_acc_41010809001_p","41010809001",10000000,id,JB,71
"id_acc_41010810001_p","41010810001",10000000,id,JB,71
"id_acc_41010901001_p","41010901001",10000000,id,JB,71
"id_acc_41010902001_p","41010902001",10000000,id,JB,71
"id_acc_41010903001_p","41010903001",10000000,id,JB,71
"id_acc_41010904001_p","41010904001",10000000,id,JB,71
"id_acc_41010905001_p","41010905001",10000000,id,JB,71
"id_acc_41010906001_p","41010906001",10000000,id,JB,71
"id_acc_41010907001_p","41010907001",10000000,id,JB,71
"id_acc_41010908001_p","41010908001",10000000,id,JB,71
"id_acc_41010909001_p","41010909001",10000000,id,JB,71
"id_acc_41010910001_p","41010910001",10000000,id,JB,71
"id_acc_41011001001_p","41011001001",10000000,id,JB,71
"id_acc_41011002001_p","41011002001",10000000,id,JB,71
"id_acc_41011101001_p","41011101001",10000000,id,JB,71
"id_acc_41011201001_p","41011201001",10000000,id,JB,71
"id_acc_41011301001_p","41011301001",10000000,id,JB,71
"id_acc_41011401001_p","41011401001",10000000,id,JB,71
"id_acc_41011402001_p","41011402001",10000000,id,JB,71
"id_acc_41011403001_p","41011403001",10000000,id,JB,71
"id_acc_41011404001_p","41011404001",10000000,id,JB,71
"id_acc_41011405001_p","41011405001",10000000,id,JB,71
"id_acc_41011406001_p","41011406001",10000000,id,JB,71
"id_acc_41011407001_p","41011407001",10000000,id,JB,71
"id_acc_41011408001_p","41011408001",10000000,id,JB,71
"id_acc_41011409001_p","41011409001",10000000,id,JB,71
"id_acc_41011410001_p","41011410001",10000000,id,JB,71
"id_acc_41011411001_p","41011411001",10000000,id,JB,71
"id_acc_41011412001_p","41011412001",10000000,id,JB,71
"id_acc_41011413001_p","41011413001",10000000,id,JB,71
"id_acc_41011414001_p","41011414001",10000000,id,JB,71
"id_acc_41011415001_p","41011415001",10000000,id,JB,71
"id_acc_41011416001_p","41011416001",10000000,id,JB,71
"id_acc_41011417001_p","41011417001",10000000,id,JB,71
"id_acc_41011418001_p","41011418001",10000000,id,JB,71
"id_acc_41011419001_p","41011419001",10000000,id,JB,71
"id_acc_41011420001_p","41011420001",10000000,id,JB,71
"id_acc_41011421001_p","41011421001",10000000,id,JB,71
"id_acc_41011422001_p","41011422001",10000000,id,JB,71
"id_acc_41011423001_p","41011423001",10000000,id,JB,71
"id_acc_41011424001_p","41011424001",10000000,id,JB,71
"id_acc_41011425001_p","41011425001",10000000,id,JB,71
"id_acc_41011426001_p","41011426001",10000000,id,JB,71
"id_acc_41011427001_p","41011427001",10000000,id,JB,71
"id_acc_41011428001_p","41011428001",10000000,id,JB,71
"id_acc_41011429001_p","41011429001",10000000,id,JB,71
"id_acc_41011430001_p","41011430001",10000000,id,JB,71
"id_acc_41011431001_p","41011431001",10000000,id,JB,71
"id_acc_41011432001_p","41011432001",10000000,id,JB,71
"id_acc_41011433001_p","41011433001",10000000,id,JB,71
"id_acc_41011434001_p","41011434001",10000000,id,JB,71
"id_acc_41011435001_p","41011435001",10000000,id,JB,71
"id_acc_41011436001_p","41011436001",10000000,id,JB,71
"id_acc_41011437001_p","41011437001",10000000,id,JB,71
"id_acc_41011501001_p","41011501001",10000000,id,JB,71
"id_acc_41011601001_p","41011601001",10000000,id,JB,71
"id_acc_41011602001_p","41011602001",10000000,id,JB,71
\ No newline at end of file
"id","account_id",amount,country_id,state_id,district_id
"id_acc_41010101001_p","41010101001",10000000,id,JB,
"id_acc_41010101002_p","41010101002",10000000,id,JB,
"id_acc_41010101003_p","41010101003",10000000,id,JB,
"id_acc_41010101004_p","41010101004",10000000,id,JB,
"id_acc_41010102001_p","41010102001",10000000,id,JB,
"id_acc_41010102002_p","41010102002",10000000,id,JB,
"id_acc_41010102003_p","41010102003",10000000,id,JB,
"id_acc_41010102004_p","41010102004",10000000,id,JB,
"id_acc_41010103001_p","41010103001",10000000,id,JB,
"id_acc_41010103002_p","41010103002",10000000,id,JB,
"id_acc_41010103003_p","41010103003",10000000,id,JB,
"id_acc_41010103004_p","41010103004",10000000,id,JB,
"id_acc_41010104001_p","41010104001",10000000,id,JB,
"id_acc_41010104002_p","41010104002",10000000,id,JB,
"id_acc_41010104003_p","41010104003",10000000,id,JB,
"id_acc_41010104004_p","41010104004",10000000,id,JB,
"id_acc_41010105001_p","41010105001",10000000,id,JB,
"id_acc_41010105002_p","41010105002",10000000,id,JB,
"id_acc_41010105003_p","41010105003",10000000,id,JB,
"id_acc_41010105004_p","41010105004",10000000,id,JB,
"id_acc_41010106001_p","41010106001",10000000,id,JB,
"id_acc_41010106002_p","41010106002",10000000,id,JB,
"id_acc_41010106003_p","41010106003",10000000,id,JB,
"id_acc_41010106004_p","41010106004",10000000,id,JB,
"id_acc_41010107001_p","41010107001",10000000,id,JB,
"id_acc_41010107002_p","41010107002",10000000,id,JB,
"id_acc_41010107003_p","41010107003",10000000,id,JB,
"id_acc_41010107004_p","41010107004",10000000,id,JB,
"id_acc_41010108001_p","41010108001",10000000,id,JB,
"id_acc_41010108002_p","41010108002",10000000,id,JB,
"id_acc_41010108003_p","41010108003",10000000,id,JB,
"id_acc_41010108004_p","41010108004",10000000,id,JB,
"id_acc_41010109001_p","41010109001",10000000,id,JB,
"id_acc_41010109002_p","41010109002",10000000,id,JB,
"id_acc_41010109003_p","41010109003",10000000,id,JB,
"id_acc_41010109004_p","41010109004",10000000,id,JB,
"id_acc_41010110001_p","41010110001",10000000,id,JB,
"id_acc_41010110002_p","41010110002",10000000,id,JB,
"id_acc_41010110003_p","41010110003",10000000,id,JB,
"id_acc_41010110004_p","41010110004",10000000,id,JB,
"id_acc_41010111001_p","41010111001",10000000,id,JB,
"id_acc_41010111002_p","41010111002",10000000,id,JB,
"id_acc_41010111003_p","41010111003",10000000,id,JB,
"id_acc_41010111004_p","41010111004",10000000,id,JB,
"id_acc_41010112001_p","41010112001",10000000,id,JB,
"id_acc_41010112002_p","41010112002",10000000,id,JB,
"id_acc_41010112003_p","41010112003",10000000,id,JB,
"id_acc_41010112004_p","41010112004",10000000,id,JB,
"id_acc_41010113001_p","41010113001",10000000,id,JB,
"id_acc_41010113002_p","41010113002",10000000,id,JB,
"id_acc_41010113003_p","41010113003",10000000,id,JB,
"id_acc_41010113004_p","41010113004",10000000,id,JB,
"id_acc_41010114001_p","41010114001",10000000,id,JB,
"id_acc_41010114002_p","41010114002",10000000,id,JB,
"id_acc_41010114003_p","41010114003",10000000,id,JB,
"id_acc_41010114004_p","41010114004",10000000,id,JB,
"id_acc_41010201001_p","41010201001",10000000,id,JB,
"id_acc_41010202001_p","41010202001",10000000,id,JB,
"id_acc_41010203001_p","41010203001",10000000,id,JB,
"id_acc_41010204001_p","41010204001",10000000,id,JB,
"id_acc_41010205001_p","41010205001",10000000,id,JB,
"id_acc_41010206001_p","41010206001",10000000,id,JB,
"id_acc_41010207001_p","41010207001",10000000,id,JB,
"id_acc_41010208001_p","41010208001",10000000,id,JB,
"id_acc_41010209001_p","41010209001",10000000,id,JB,
"id_acc_41010210001_p","41010210001",10000000,id,JB,
"id_acc_41010211001_p","41010211001",10000000,id,JB,
"id_acc_41010212001_p","41010212001",10000000,id,JB,
"id_acc_41010213001_p","41010213001",10000000,id,JB,
"id_acc_41010214001_p","41010214001",10000000,id,JB,
"id_acc_41010301001_p","41010301001",10000000,id,JB,
"id_acc_41010302001_p","41010302001",10000000,id,JB,
"id_acc_41010303001_p","41010303001",10000000,id,JB,
"id_acc_41010304001_p","41010304001",10000000,id,JB,
"id_acc_41010401001_p","41010401001",10000000,id,JB,
"id_acc_41010501001_p","41010501001",10000000,id,JB,
"id_acc_41010601001_p","41010601001",10000000,id,JB,71
"id_acc_41010602001_p","41010602001",10000000,id,JB,71
"id_acc_41010603001_p","41010603001",10000000,id,JB,71
"id_acc_41010604001_p","41010604001",10000000,id,JB,71
"id_acc_41010605001_p","41010605001",10000000,id,JB,71
"id_acc_41010606001_p","41010606001",10000000,id,JB,71
"id_acc_41010607001_p","41010607001",10000000,id,JB,71
"id_acc_41010608001_p","41010608001",10000000,id,JB,71
"id_acc_41010701001_p","41010701001",10000000,id,JB,71
"id_acc_41010702001_p","41010702001",10000000,id,JB,71
"id_acc_41010703001_p","41010703001",10000000,id,JB,71
"id_acc_41010704001_p","41010704001",10000000,id,JB,71
"id_acc_41010705001_p","41010705001",10000000,id,JB,71
"id_acc_41010706001_p","41010706001",10000000,id,JB,71
"id_acc_41010707001_p","41010707001",10000000,id,JB,71
"id_acc_41010801001_p","41010801001",10000000,id,JB,71
"id_acc_41010802001_p","41010802001",10000000,id,JB,71
"id_acc_41010803001_p","41010803001",10000000,id,JB,71
"id_acc_41010804001_p","41010804001",10000000,id,JB,71
"id_acc_41010805001_p","41010805001",10000000,id,JB,71
"id_acc_41010806001_p","41010806001",10000000,id,JB,71
"id_acc_41010807001_p","41010807001",10000000,id,JB,71
"id_acc_41010808001_p","41010808001",10000000,id,JB,71
"id_acc_41010809001_p","41010809001",10000000,id,JB,71
"id_acc_41010810001_p","41010810001",10000000,id,JB,71
"id_acc_41010901001_p","41010901001",10000000,id,JB,71
"id_acc_41010902001_p","41010902001",10000000,id,JB,71
"id_acc_41010903001_p","41010903001",10000000,id,JB,71
"id_acc_41010904001_p","41010904001",10000000,id,JB,71
"id_acc_41010905001_p","41010905001",10000000,id,JB,71
"id_acc_41010906001_p","41010906001",10000000,id,JB,71
"id_acc_41010907001_p","41010907001",10000000,id,JB,71
"id_acc_41010908001_p","41010908001",10000000,id,JB,71
"id_acc_41010909001_p","41010909001",10000000,id,JB,71
"id_acc_41010910001_p","41010910001",10000000,id,JB,71
"id_acc_41011001001_p","41011001001",10000000,id,JB,71
"id_acc_41011002001_p","41011002001",10000000,id,JB,71
"id_acc_41011101001_p","41011101001",10000000,id,JB,71
"id_acc_41011201001_p","41011201001",10000000,id,JB,71
"id_acc_41011301001_p","41011301001",10000000,id,JB,71
"id_acc_41011401001_p","41011401001",10000000,id,JB,71
"id_acc_41011402001_p","41011402001",10000000,id,JB,71
"id_acc_41011403001_p","41011403001",10000000,id,JB,71
"id_acc_41011404001_p","41011404001",10000000,id,JB,71
"id_acc_41011405001_p","41011405001",10000000,id,JB,71
"id_acc_41011406001_p","41011406001",10000000,id,JB,71
"id_acc_41011407001_p","41011407001",10000000,id,JB,71
"id_acc_41011408001_p","41011408001",10000000,id,JB,71
"id_acc_41011409001_p","41011409001",10000000,id,JB,71
"id_acc_41011410001_p","41011410001",10000000,id,JB,71
"id_acc_41011411001_p","41011411001",10000000,id,JB,71
"id_acc_41011412001_p","41011412001",10000000,id,JB,71
"id_acc_41011413001_p","41011413001",10000000,id,JB,71
"id_acc_41011414001_p","41011414001",10000000,id,JB,71
"id_acc_41011415001_p","41011415001",10000000,id,JB,71
"id_acc_41011416001_p","41011416001",10000000,id,JB,71
"id_acc_41011417001_p","41011417001",10000000,id,JB,71
"id_acc_41011418001_p","41011418001",10000000,id,JB,71
"id_acc_41011419001_p","41011419001",10000000,id,JB,71
"id_acc_41011420001_p","41011420001",10000000,id,JB,71
"id_acc_41011421001_p","41011421001",10000000,id,JB,71
"id_acc_41011422001_p","41011422001",10000000,id,JB,71
"id_acc_41011423001_p","41011423001",10000000,id,JB,71
"id_acc_41011424001_p","41011424001",10000000,id,JB,71
"id_acc_41011425001_p","41011425001",10000000,id,JB,71
"id_acc_41011426001_p","41011426001",10000000,id,JB,71
"id_acc_41011427001_p","41011427001",10000000,id,JB,71
"id_acc_41011428001_p","41011428001",10000000,id,JB,71
"id_acc_41011429001_p","41011429001",10000000,id,JB,71
"id_acc_41011430001_p","41011430001",10000000,id,JB,71
"id_acc_41011431001_p","41011431001",10000000,id,JB,71
"id_acc_41011432001_p","41011432001",10000000,id,JB,71
"id_acc_41011433001_p","41011433001",10000000,id,JB,71
"id_acc_41011434001_p","41011434001",10000000,id,JB,71
"id_acc_41011435001_p","41011435001",10000000,id,JB,71
"id_acc_41011436001_p","41011436001",10000000,id,JB,71
"id_acc_41011437001_p","41011437001",10000000,id,JB,71
"id_acc_41011501001_p","41011501001",10000000,id,JB,71
"id_acc_41011601001_p","41011601001",10000000,id,JB,71
"id_acc_41011602001_p","41011602001",10000000,id,JB,71
from . import idg_region_tax_plan
from . import idg_region_tax_potency
from . import idg_region_tax_actual
import logging
from datetime import datetime
from psycopg2 import DatabaseError, sql
from odoo import fields, models, api, _
from odoo.exceptions import UserError
# from odoo.tools import sql
_logger = logging.getLogger(__name__)
class IdgRegionTaxPlan(models.Model):
_name = 'idg.region.tax.actual'
_description = 'Region Tax Actual'
country_id = fields.Many2one('res.country', required=True)
state_id = fields.Many2one('res.country.state', required=True,
domain="[('country_id', '=?', country_id)]")
district_id = fields.Many2one('res.district', required=False,
domain="[('state_id', '=?', state_id)]")
account_id = fields.Many2one('account.account', required=True)
year = fields.Integer(compute='_compute_day', store=True)
month = fields.Integer(compute='_compute_day', store=True)
day = fields.Integer(compute='_compute_day', store=True)
date = fields.Date(default=datetime.now().date(), required=True)
qty = fields.Integer(required=True, default=0)
amount = fields.Integer(required=True, default=0)
def _compute_date(self):
for row in self:
row.year = row.date.year
row.month = row.date.month
row.day = row.date.day
import logging
from datetime import datetime
from psycopg2 import DatabaseError, sql
from odoo import fields, models, api, _
from odoo.exceptions import UserError
# from odoo.tools import sql
_logger = logging.getLogger(__name__)
class IdgRegionTaxPlan(models.Model):
_name = 'idg.region.tax.plan'
_description = 'Region Tax Planning'
country_id = fields.Many2one('res.country', required=True)
state_id = fields.Many2one('res.country.state', required=True,
domain="[('country_id', '=?', country_id)]")
district_id = fields.Many2one('res.district', required=False,
domain="[('state_id', '=?', state_id)]")
account_id = fields.Many2one('account.account', required=True)
year = fields.Integer(required=True, default=datetime.now().year)
month = fields.Integer(required=True, default=datetime.now().month)
qty = fields.Integer(required=True, default=0)
amount = fields.Integer(required=True, default=0)
import logging
from datetime import datetime
from psycopg2 import DatabaseError, sql
from odoo import fields, models, api, _
from odoo.exceptions import UserError
# from odoo.tools import sql
_logger = logging.getLogger(__name__)
class IdgRegionTaxPotency(models.Model):
_name = 'idg.region.tax.potency'
_description = 'Region Tax Potency'
country_id = fields.Many2one('res.country', required=True)
state_id = fields.Many2one('res.country.state', required=True,
domain="[('country_id', '=?', country_id)]")
district_id = fields.Many2one('res.district',
domain="[('state_id', '=?', state_id)]")
account_id = fields.Many2one('account.account', required=True)
year = fields.Integer(required=True, default=datetime.now().year)
qty = fields.Integer(required=True, default=0)
amount = fields.Integer(required=True, default=0)
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_idg_region_tax_potency_admin","access.idg.region.tax.potency.admin","model_idg_region_tax_potency","base.group_system",1,1,1,1
"access_idg_region_tax_plan_admin","access.idg.region.tax.plan.admin","model_idg_region_tax_plan","base.group_system",1,1,1,1
"access_idg_region_tax_actual_admin","access.idg.region.tax.actual.admin","model_idg_region_tax_actual","base.group_system",1,1,1,1
odoo.define('account.payment', function (require) {
"use strict";
var AbstractField = require('web.AbstractField');
var core = require('web.core');
var field_registry = require('web.field_registry');
var field_utils = require('web.field_utils');
var QWeb = core.qweb;
var _t = core._t;
var ShowPaymentLineWidget = AbstractField.extend({
events: _.extend({
'click .outstanding_credit_assign': '_onOutstandingCreditAssign',
}, AbstractField.prototype.events),
supportedFieldTypes: ['char'],
//--------------------------------------------------------------------------
// Public
//--------------------------------------------------------------------------
/**
* @override
* @returns {boolean}
*/
isSet: function () {
return true;
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* @private
* @override
*/
_render: function () {
var self = this;
var info = JSON.parse(this.value);
if (!info) {
this.$el.html('');
return;
}
_.each(info.content, function (k, v) {
k.index = v;
k.amount = field_utils.format.float(k.amount, {digits: k.digits});
if (k.date) {
k.date = field_utils.format.date(field_utils.parse.date(k.date, {}, {isUTC: true}));
}
});
this.$el.html(QWeb.render('ShowPaymentInfo', {
lines: info.content,
outstanding: info.outstanding,
title: info.title
}));
_.each(this.$('.js_payment_info'), function (k, v) {
var isRTL = _t.database.parameters.direction === "rtl";
var content = info.content[v];
var options = {
content: function () {
var $content = $(QWeb.render('PaymentPopOver', content));
var unreconcile_button = $content.filter('.js_unreconcile_payment').on('click', self._onRemoveMoveReconcile.bind(self));
$content.filter('.js_open_payment').on('click', self._onOpenPayment.bind(self));
return $content;
},
html: true,
placement: isRTL ? 'bottom' : 'left',
title: 'Payment Information',
trigger: 'focus',
delay: {"show": 0, "hide": 100},
container: $(k).parent(), // FIXME Ugly, should use the default body container but system & tests to adapt to properly destroy the popover
};
$(k).popover(options);
});
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* @private
* @override
* @param {MouseEvent} event
*/
_onOpenPayment: function (event) {
var paymentId = parseInt($(event.target).attr('payment-id'));
var moveId = parseInt($(event.target).attr('move-id'));
var res_model;
var id;
if (paymentId !== undefined && !isNaN(paymentId)) {
res_model = "account.payment";
id = paymentId;
} else if (moveId !== undefined && !isNaN(moveId)) {
res_model = "account.move";
id = moveId;
}
//Open form view of account.move with id = move_id
if (res_model && id) {
this.do_action({
type: 'ir.actions.act_window',
res_model: res_model,
res_id: id,
views: [[false, 'form']],
target: 'current'
});
}
},
/**
* @private
* @override
* @param {MouseEvent} event
*/
_onOutstandingCreditAssign: function (event) {
event.stopPropagation();
event.preventDefault();
var self = this;
var id = $(event.target).data('id') || false;
this._rpc({
model: 'account.move',
method: 'js_assign_outstanding_line',
args: [JSON.parse(this.value).move_id, id],
}).then(function () {
self.trigger_up('reload');
});
},
/**
* @private
* @override
* @param {MouseEvent} event
*/
_onRemoveMoveReconcile: function (event) {
var self = this;
var moveId = parseInt($(event.target).attr('move-id'));
var partialId = parseInt($(event.target).attr('partial-id'));
if (partialId !== undefined && !isNaN(partialId)) {
this._rpc({
model: 'account.move',
method: 'js_remove_outstanding_partial',
args: [moveId, partialId],
}).then(function () {
self.trigger_up('reload');
});
}
},
});
field_registry.add('payment', ShowPaymentLineWidget);
return {
ShowPaymentLineWidget: ShowPaymentLineWidget
};
});
odoo.define('account.AccountPortalSidebar', function (require) {
'use strict';
const dom = require('web.dom');
var publicWidget = require('web.public.widget');
var PortalSidebar = require('portal.PortalSidebar');
var utils = require('web.utils');
publicWidget.registry.AccountPortalSidebar = PortalSidebar.extend({
selector: '.o_portal_invoice_sidebar',
events: {
'click .o_portal_invoice_print': '_onPrintInvoice',
},
/**
* @override
*/
start: function () {
var def = this._super.apply(this, arguments);
var $invoiceHtml = this.$el.find('iframe#invoice_html');
var updateIframeSize = this._updateIframeSize.bind(this, $invoiceHtml);
$(window).on('resize', updateIframeSize);
var iframeDoc = $invoiceHtml[0].contentDocument || $invoiceHtml[0].contentWindow.document;
if (iframeDoc.readyState === 'complete') {
updateIframeSize();
} else {
$invoiceHtml.on('load', updateIframeSize);
}
return def;
},
//--------------------------------------------------------------------------
// Handlers
//--------------------------------------------------------------------------
/**
* Called when the iframe is loaded or the window is resized on customer portal.
* The goal is to expand the iframe height to display the full report without scrollbar.
*
* @private
* @param {object} $el: the iframe
*/
_updateIframeSize: function ($el) {
var $wrapwrap = $el.contents().find('div#wrapwrap');
// Set it to 0 first to handle the case where scrollHeight is too big for its content.
$el.height(0);
$el.height($wrapwrap[0].scrollHeight);
// scroll to the right place after iframe resize
if (!utils.isValidAnchor(window.location.hash)) {
return;
}
var $target = $(window.location.hash);
if (!$target.length) {
return;
}
dom.scrollTo($target[0], {duration: 0});
},
/**
* @private
* @param {MouseEvent} ev
*/
_onPrintInvoice: function (ev) {
ev.preventDefault();
var href = $(ev.currentTarget).attr('href');
this._printIframeContent(href);
},
});
});
odoo.define('account.ShowResequenceRenderer', function (require) {
"use strict";
const {Component} = owl;
const {useState} = owl.hooks;
const AbstractFieldOwl = require('web.AbstractFieldOwl');
const field_registry = require('web.field_registry_owl');
class ChangeLine extends Component {
}
ChangeLine.template = 'account.ResequenceChangeLine';
ChangeLine.props = ["changeLine", 'ordering'];
class ShowResequenceRenderer extends AbstractFieldOwl {
constructor(...args) {
super(...args);
this.data = this.value ? JSON.parse(this.value) : {
changeLines: [],
ordering: 'date',
};
}
async willUpdateProps(nextProps) {
await super.willUpdateProps(nextProps);
Object.assign(this.data, JSON.parse(this.value));
}
}
ShowResequenceRenderer.template = 'account.ResequenceRenderer';
ShowResequenceRenderer.components = {ChangeLine}
field_registry.add('account_resequence_widget', ShowResequenceRenderer);
return ShowResequenceRenderer;
});
odoo.define('account.hierarchy.selection', function (require) {
"use strict";
var core = require('web.core');
var relational_fields = require('web.relational_fields');
var _t = core._t;
var registry = require('web.field_registry');
var FieldSelection = relational_fields.FieldSelection;
var qweb = core.qweb;
var HierarchySelection = FieldSelection.extend({
_renderEdit: function () {
var self = this;
var prom = Promise.resolve()
if (!self.hierarchy_groups) {
prom = this._rpc({
model: 'account.account.type',
method: 'search_read',
kwargs: {
domain: [],
fields: ['id', 'internal_group', 'display_name'],
},
}).then(function (arg) {
self.values = _.map(arg, v => [v['id'], v['display_name']])
self.hierarchy_groups = [
{
'name': _t('Balance Sheet'),
'children': [
{
'name': _t('Assets'),
'ids': _.map(_.filter(arg, v => v['internal_group'] == 'asset'), v => v['id'])
},
{
'name': _t('Liabilities'),
'ids': _.map(_.filter(arg, v => v['internal_group'] == 'liability'), v => v['id'])
},
{
'name': _t('Equity'),
'ids': _.map(_.filter(arg, v => v['internal_group'] == 'equity'), v => v['id'])
},
],
},
{
'name': _t('Profit & Loss'),
'children': [
{
'name': _t('Income'),
'ids': _.map(_.filter(arg, v => v['internal_group'] == 'income'), v => v['id'])
},
{
'name': _t('Expense'),
'ids': _.map(_.filter(arg, v => v['internal_group'] == 'expense'), v => v['id'])
},
],
},
{
'name': _t('Other'),
'ids': _.map(_.filter(arg, v => !['asset', 'liability', 'equity', 'income', 'expense'].includes(v['internal_group'])), v => v['id'])
},
]
});
}
Promise.resolve(prom).then(function () {
self.$el.empty();
self._addHierarchy(self.$el, self.hierarchy_groups, 0);
var value = self.value;
if (self.field.type === 'many2one' && value) {
value = value.data.id;
}
self.$el.val(JSON.stringify(value));
});
},
_addHierarchy: function (el, group, level) {
var self = this;
_.each(group, function (item) {
var optgroup = $('<optgroup/>').attr(({
'label': $('<div/>').html('&nbsp;'.repeat(6 * level) + item['name']).text(),
}))
_.each(item['ids'], function (id) {
var value = _.find(self.values, v => v[0] == id)
optgroup.append($('<option/>', {
value: JSON.stringify(value[0]),
text: value[1],
}));
})
el.append(optgroup)
if (item['children']) {
self._addHierarchy(el, item['children'], level + 1);
}
})
}
});
registry.add("account_hierarchy_selection", HierarchySelection);
});
odoo.define('account.bank_statement', function (require) {
"use strict";
var KanbanController = require("web.KanbanController");
var ListController = require("web.ListController");
var includeDict = {
renderButtons: function () {
this._super.apply(this, arguments);
if (this.modelName === "account.bank.statement") {
var data = this.model.get(this.handle);
if (data.context.journal_type !== 'cash') {
this.$buttons.find('button.o_button_import').hide();
}
}
}
};
KanbanController.include(includeDict);
ListController.include(includeDict);
});
\ No newline at end of file
odoo.define('account.upload.bill.mixin', function (require) {
"use strict";
var core = require('web.core');
var _t = core._t;
var qweb = core.qweb;
var UploadBillMixin = {
start: function () {
// define a unique uploadId and a callback method
this.fileUploadID = _.uniqueId('account_bill_file_upload');
$(window).on(this.fileUploadID, this._onFileUploaded.bind(this));
return this._super.apply(this, arguments);
},
_onAddAttachment: function (ev) {
// Auto submit form once we've selected an attachment
var $input = $(ev.currentTarget).find('input.o_input_file');
if ($input.val() !== '') {
var $binaryForm = this.$('.o_vendor_bill_upload form.o_form_binary_form');
$binaryForm.submit();
}
},
_onFileUploaded: function () {
// Callback once attachment have been created, create a bill with attachment ids
var self = this;
var attachments = Array.prototype.slice.call(arguments, 1);
// Get id from result
var attachent_ids = attachments.reduce(function (filtered, record) {
if (record.id) {
filtered.push(record.id);
}
return filtered;
}, []);
return this._rpc({
model: 'account.journal',
method: 'create_invoice_from_attachment',
args: ["", attachent_ids],
context: this.initialState.context,
}).then(function (result) {
self.do_action(result);
});
},
_onUpload: function (event) {
var self = this;
// If hidden upload form don't exists, create it
var $formContainer = this.$('.o_content').find('.o_vendor_bill_upload');
if (!$formContainer.length) {
$formContainer = $(qweb.render('account.BillsHiddenUploadForm', {widget: this}));
$formContainer.appendTo(this.$('.o_content'));
}
// Trigger the input to select a file
this.$('.o_vendor_bill_upload .o_input_file').click();
},
}
return UploadBillMixin;
});
odoo.define('account.bills.tree', function (require) {
"use strict";
var core = require('web.core');
var ListController = require('web.ListController');
var ListView = require('web.ListView');
var UploadBillMixin = require('account.upload.bill.mixin');
var viewRegistry = require('web.view_registry');
var BillsListController = ListController.extend(UploadBillMixin, {
buttons_template: 'BillsListView.buttons',
events: _.extend({}, ListController.prototype.events, {
'click .o_button_upload_bill': '_onUpload',
'change .o_vendor_bill_upload .o_form_binary_form': '_onAddAttachment',
}),
});
var BillsListView = ListView.extend({
config: _.extend({}, ListView.prototype.config, {
Controller: BillsListController,
}),
});
viewRegistry.add('account_tree', BillsListView);
});
odoo.define('account.dashboard.kanban', function (require) {
"use strict";
var core = require('web.core');
var KanbanController = require('web.KanbanController');
var KanbanView = require('web.KanbanView');
var UploadBillMixin = require('account.upload.bill.mixin');
var viewRegistry = require('web.view_registry');
var DashboardKanbanController = KanbanController.extend(UploadBillMixin, {
events: _.extend({}, KanbanController.prototype.events, {
'click .o_button_upload_bill': '_onUpload',
'change .o_vendor_bill_upload .o_form_binary_form': '_onAddAttachment',
}),
/**
* We override _onUpload (from the upload bill mixin) to pass default_journal_id
* and default_move_type in context.
*
* @override
*/
_onUpload: function (event) {
var kanbanRecord = $(event.currentTarget).closest('.o_kanban_record').data('record');
this.initialState.context['default_journal_id'] = kanbanRecord.id;
if ($(event.currentTarget).attr('journal_type') == 'sale') {
this.initialState.context['default_move_type'] = 'out_invoice'
} else if ($(event.currentTarget).attr('journal_type') == 'purchase') {
this.initialState.context['default_move_type'] = 'in_invoice'
}
UploadBillMixin._onUpload.apply(this, arguments);
}
});
var DashboardKanbanView = KanbanView.extend({
config: _.extend({}, KanbanView.prototype.config, {
Controller: DashboardKanbanController,
}),
});
viewRegistry.add('account_dashboard_kanban', DashboardKanbanView);
});
odoo.define('account.ShowGroupedList', function (require) {
"use strict";
const {Component} = owl;
const {useState} = owl.hooks;
const AbstractFieldOwl = require('web.AbstractFieldOwl');
const field_registry = require('web.field_registry_owl');
class ListItem extends Component {
}
ListItem.template = 'account.GroupedItemTemplate';
ListItem.props = ["item_vals", "options"];
class ListGroup extends Component {
}
ListGroup.template = 'account.GroupedItemsTemplate';
ListGroup.components = {ListItem}
ListGroup.props = ["group_vals", "options"];
class ShowGroupedList extends AbstractFieldOwl {
constructor(...args) {
super(...args);
this.data = this.value ? JSON.parse(this.value) : {
groups_vals: [],
options: {
discarded_number: '',
columns: [],
},
};
}
async willUpdateProps(nextProps) {
await super.willUpdateProps(nextProps);
Object.assign(this.data, JSON.parse(this.value));
}
}
ShowGroupedList.template = 'account.GroupedListTemplate';
ShowGroupedList.components = {ListGroup}
field_registry.add('grouped_view_widget', ShowGroupedList);
return ShowGroupedList;
});
odoo.define('account.activity', function (require) {
"use strict";
var AbstractField = require('web.AbstractField');
var core = require('web.core');
var field_registry = require('web.field_registry');
var QWeb = core.qweb;
var _t = core._t;
var VatActivity = AbstractField.extend({
className: 'o_journal_activity_kanban',
events: {
'click .see_all_activities': '_onOpenAll',
'click .see_activity': '_onOpenActivity',
},
init: function () {
this.MAX_ACTIVITY_DISPLAY = 5;
this._super.apply(this, arguments);
},
//------------------------------------------------------------
// Private
//------------------------------------------------------------
_render: function () {
var self = this;
var info = JSON.parse(this.value);
if (!info) {
this.$el.html('');
return;
}
info.more_activities = false;
if (info.activities.length > this.MAX_ACTIVITY_DISPLAY) {
info.more_activities = true;
info.activities = info.activities.slice(0, this.MAX_ACTIVITY_DISPLAY);
}
this.$el.html(QWeb.render('accountJournalDashboardActivity', info));
},
_onOpenActivity: function (e) {
e.preventDefault();
var self = this;
self.do_action({
type: 'ir.actions.act_window',
name: _t('Journal Entry'),
target: 'current',
res_id: $(e.target).data('resId'),
res_model: 'account.move',
views: [[false, 'form']],
});
},
_onOpenAll: function (e) {
e.preventDefault();
var self = this;
self.do_action({
type: 'ir.actions.act_window',
name: _t('Journal Entries'),
res_model: 'account.move',
views: [[false, 'kanban'], [false, 'form']],
search_view_id: [false],
domain: [['journal_id', '=', self.res_id], ['activity_ids', '!=', false]],
});
}
})
field_registry.add('kanban_vat_activity', VatActivity);
return VatActivity;
});
odoo.define('account.section_and_note_backend', function (require) {
// The goal of this file is to contain JS hacks related to allowing
// section and note on sale order and invoice.
// [UPDATED] now also allows configuring products on sale order.
"use strict";
var FieldChar = require('web.basic_fields').FieldChar;
var FieldOne2Many = require('web.relational_fields').FieldOne2Many;
var fieldRegistry = require('web.field_registry');
var ListFieldText = require('web.basic_fields').ListFieldText;
var ListRenderer = require('web.ListRenderer');
var SectionAndNoteListRenderer = ListRenderer.extend({
/**
* We want section and note to take the whole line (except handle and trash)
* to look better and to hide the unnecessary fields.
*
* @override
*/
_renderBodyCell: function (record, node, index, options) {
var $cell = this._super.apply(this, arguments);
var isSection = record.data.display_type === 'line_section';
var isNote = record.data.display_type === 'line_note';
if (isSection || isNote) {
if (node.attrs.widget === "handle") {
return $cell;
} else if (node.attrs.name === "name") {
var nbrColumns = this._getNumberOfCols();
if (this.handleField) {
nbrColumns--;
}
if (this.addTrashIcon) {
nbrColumns--;
}
$cell.attr('colspan', nbrColumns);
} else {
$cell.removeClass('o_invisible_modifier');
return $cell.addClass('o_hidden');
}
}
return $cell;
},
/**
* We add the o_is_{display_type} class to allow custom behaviour both in JS and CSS.
*
* @override
*/
_renderRow: function (record, index) {
var $row = this._super.apply(this, arguments);
if (record.data.display_type) {
$row.addClass('o_is_' + record.data.display_type);
}
return $row;
},
/**
* We want to add .o_section_and_note_list_view on the table to have stronger CSS.
*
* @override
* @private
*/
_renderView: function () {
var self = this;
return this._super.apply(this, arguments).then(function () {
self.$('.o_list_table').addClass('o_section_and_note_list_view');
});
}
});
// We create a custom widget because this is the cleanest way to do it:
// to be sure this custom code will only impact selected fields having the widget
// and not applied to any other existing ListRenderer.
var SectionAndNoteFieldOne2Many = FieldOne2Many.extend({
/**
* We want to use our custom renderer for the list.
*
* @override
*/
_getRenderer: function () {
if (this.view.arch.tag === 'tree') {
return SectionAndNoteListRenderer;
}
return this._super.apply(this, arguments);
},
});
// This is a merge between a FieldText and a FieldChar.
// We want a FieldChar for section,
// and a FieldText for the rest (product and note).
var SectionAndNoteFieldText = function (parent, name, record, options) {
var isSection = record.data.display_type === 'line_section';
var Constructor = isSection ? FieldChar : ListFieldText;
return new Constructor(parent, name, record, options);
};
fieldRegistry.add('section_and_note_one2many', SectionAndNoteFieldOne2Many);
fieldRegistry.add('section_and_note_text', SectionAndNoteFieldText);
return SectionAndNoteListRenderer;
});
odoo.define('account.tax_group', function (require) {
"use strict";
var core = require('web.core');
var session = require('web.session');
var fieldRegistry = require('web.field_registry');
var AbstractField = require('web.AbstractField');
var fieldUtils = require('web.field_utils');
var QWeb = core.qweb;
var TaxGroupCustomField = AbstractField.extend({
events: {
'click .tax_group_edit': '_onClick',
'keydown .oe_tax_group_editable .tax_group_edit_input input': '_onKeydown',
'blur .oe_tax_group_editable .tax_group_edit_input input': '_onBlur',
},
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
/**
* This method is called by "_setTaxGroups". It is
* responsible for calculating taxes based on
* tax groups and triggering an event to
* notify the ORM of a change.
*
* @param {Id} taxGroupId
* @param {Float} deltaAmount
*/
_changeTaxValueByTaxGroup: function (taxGroupId, deltaAmount) {
const self = this;
// Search for the first tax line with the same tax group and modify its value
function applyChange(line_id) {
let debitAmount = 0;
let creditAmount = 0;
let amount_currency = 0;
if (line_id.data.currency_id) { // If multi currency enable
if (self.record.data.move_type === "in_invoice") {
amount_currency = line_id.data.amount_currency - deltaAmount;
} else {
amount_currency = line_id.data.amount_currency + deltaAmount;
}
} else {
let balance = line_id.data.price_subtotal;
balance -= deltaAmount;
if (self.record.data.move_type === "in_invoice") { // For vendor bill
if (balance > 0) {
debitAmount = balance;
} else if (balance < 0) {
creditAmount = -balance;
}
} else { // For refund
if (balance > 0) {
creditAmount = balance;
} else if (balance < 0) {
debitAmount = -balance;
}
}
}
// Trigger ORM
self.trigger_up('field_changed', {
dataPointID: self.record.id,
changes: {
line_ids: {
operation: "UPDATE",
id: line_id.id,
data: {amount_currency: amount_currency, debit: debitAmount, credit: creditAmount}
}
}, // account.move change
initialEvent: {
dataPointID: line_id.id,
changes: {amount_currency: amount_currency, debit: debitAmount, credit: creditAmount},
}, // account.move.line change
});
}
let line_id = self.record.data.line_ids.data.find(elem => elem.data.tax_group_id && elem.data.tax_group_id.data.id === taxGroupId);
if (line_id) {
applyChange(line_id);
} else {
const {limit, id, count} = self.record.data.line_ids;
let offset = count - limit;
self.trigger_up('load', {
id,
limit,
offset,
on_success: value => {
line_id = value.data.find(elem => elem.data.tax_group_id && elem.data.tax_group_id.data.id === taxGroupId);
applyChange(line_id);
},
});
}
},
/**
* This method checks that the document where the widget
* is located is of the "in_invoice" or "in_refund" type.
* This makes it possible to know if it is a purchase
* document.
*
* @returns boolean (true if the invoice is a purchase document)
*/
_isPurchaseDocument: function () {
return this.record.data.move_type === "in_invoice" || this.record.data.move_type === 'in_refund';
},
/**
* This method is part of the widget life cycle and allows you to render
* the widget.
*
* @private
* @override
*/
_render: function () {
var self = this;
// Display the pencil and allow the event to click and edit only on purchase that are not posted and in edit mode.
// since the field is readonly its mode will always be readonly. Therefore we have to use a trick by checking the
// formRenderer (the parent) and check if it is in edit in order to know the correct mode.
var displayEditWidget = self._isPurchaseDocument() && this.record.data.state === 'draft' && this.getParent().mode === 'edit';
this.$el.html($(QWeb.render('AccountTaxGroupTemplate', {
lines: self.value,
displayEditWidget: displayEditWidget,
})));
},
//--------------------------------------------------------------------------
// Handler
//--------------------------------------------------------------------------
/**
* This method is called when the user is in edit mode and
* leaves the <input> field. Then, we execute the code that
* modifies the information.
*
* @param {event} ev
*/
_onBlur: function (ev) {
ev.preventDefault();
var $input = $(ev.target);
var newValue = $input.val();
var currency = session.get_currency(this.record.data.currency_id.data.id);
try {
newValue = fieldUtils.parse.float(newValue); // Need a float for format the value.
newValue = fieldUtils.format.float(newValue, null, {digits: currency.digits}); // return a string rounded to currency precision
newValue = fieldUtils.parse.float(newValue); // convert back to Float to compare with oldValue to know if value has changed
} catch (err) {
$input.addClass('o_field_invalid');
return;
}
var oldValue = $input.data('originalValue');
if (newValue === oldValue || newValue === 0) {
return this._render();
}
var taxGroupId = $input.parents('.oe_tax_group_editable').data('taxGroupId');
this._changeTaxValueByTaxGroup(taxGroupId, oldValue - newValue);
},
/**
* This method is called when the user clicks on a specific <td>.
* it will hide the edit button and display the field to be edited.
*
* @param {event} ev
*/
_onClick: function (ev) {
ev.preventDefault();
var $taxGroupElement = $(ev.target).parents('.oe_tax_group_editable');
// Show input and hide previous element
$taxGroupElement.find('.tax_group_edit').addClass('d-none');
$taxGroupElement.find('.tax_group_edit_input').removeClass('d-none');
var $input = $taxGroupElement.find('.tax_group_edit_input input');
// Get original value and display it in user locale in the input
var formatedOriginalValue = fieldUtils.format.float($input.data('originalValue'), {}, {});
$input.focus(); // Focus the input
$input.val(formatedOriginalValue); //add value in user locale to the input
},
/**
* This method is called when the user is in edit mode and pressing
* a key on his keyboard. If this key corresponds to ENTER or TAB,
* the code that modifies the information is executed.
*
* @param {event} ev
*/
_onKeydown: function (ev) {
switch (ev.which) {
// Trigger only if the user clicks on ENTER or on TAB.
case $.ui.keyCode.ENTER:
case $.ui.keyCode.TAB:
// trigger blur to prevent the code being executed twice
$(ev.target).blur();
}
},
});
fieldRegistry.add('tax-group-custom-field', TaxGroupCustomField)
});
odoo.define('account.tour', function (require) {
"use strict";
var core = require('web.core');
var tour = require('web_tour.tour');
var _t = core._t;
tour.register('account_tour', {
url: "/web",
sequence: 60,
}, [
...tour.stepUtils.goToAppSteps('account.menu_finance', _t('Send invoices to your customers in no time with the <b>Invoicing app</b>.')),
{
trigger: "a.o_onboarding_step_action[data-method=action_open_base_onboarding_company]",
content: _t("Start by checking your company's data."),
position: "bottom",
}, {
trigger: "button[name=action_save_onboarding_company_step]",
extra_trigger: "a.o_onboarding_step_action[data-method=action_open_base_onboarding_company]",
content: _t("Looks good. Let's continue."),
position: "bottom",
}, {
trigger: "a.o_onboarding_step_action[data-method=action_open_base_document_layout]",
content: _t("Customize your layout."),
position: "bottom",
}, {
trigger: "button[name=document_layout_save]",
extra_trigger: "a.o_onboarding_step_action[data-method=action_open_base_document_layout]",
content: _t("Once everything is as you want it, validate."),
position: "top",
}, {
trigger: "a.o_onboarding_step_action[data-method=action_open_account_onboarding_create_invoice]",
content: _t("Now, we'll create your first invoice."),
position: "bottom",
}, {
trigger: "div[name=partner_id] input",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Write a company name to <b>create one</b> or <b>see suggestions</b>."),
position: "bottom",
}, {
trigger: ".o_m2o_dropdown_option a:contains('Create')",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Select first partner"),
auto: true,
}, {
trigger: ".modal-content button.btn-primary",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Once everything is set, you are good to continue. You will be able to edit this later in the <b>Customers</b> menu."),
auto: true,
}, {
trigger: "div[name=invoice_line_ids] .o_field_x2many_list_row_add a:not([data-context])",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Add a line to your invoice"),
}, {
trigger: "div[name=invoice_line_ids] textarea[name=name]",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Fill in the details of the line."),
position: "bottom",
}, {
trigger: "div[name=invoice_line_ids] input[name=price_unit]",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Set a price"),
position: "bottom",
run: 'text 100',
}, {
trigger: "button[name=action_post]",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Once your invoice is ready, press CONFIRM."),
}, {
trigger: "button[name=action_invoice_sent]",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Send the invoice and check what the customer will receive."),
}, {
trigger: "input[name=email]",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Write here <b>your own email address</b> to test the flow."),
run: 'text customer@example.com',
auto: true,
}, {
trigger: ".modal-content button.btn-primary",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Validate."),
auto: true,
}, {
trigger: "button[name=send_and_print_action]",
extra_trigger: "[name=move_type][raw-value=out_invoice]",
content: _t("Let's send the invoice."),
position: "top"
}
]);
});
.o_journal_activity_kanban {
display: block;
.align_activity_center {
width: 100%;
align-items: center;
margin-bottom: 5px;
}
}
\ No newline at end of file
.o_kanban_view.o_kanban_dashboard.o_account_kanban {
&.o_kanban_ungrouped .o_account_dashboard_header {
margin: (0 - $o-kanban-record-margin) ($o-kanban-record-margin - $o-horizontal-padding) $o-kanban-record-margin;
}
.o_account_dashboard_header {
flex: 1 0 100%;
flex-flow: column nowrap;
align-self: flex-start;
width: 100%;
height: auto; // cancel o_form_view height 100%, which hides the help tip message at the bottom of the screen
min-height: 0%; // cancel o_form_view min-height 100%, which hides the help tip message at the bottom of the screen
background-color: $o-view-background-color;
.o_form_statusbar {
padding-right: $o-horizontal-padding;
}
h4 {
font-size: $font-size-base;
font-weight: 500;
}
.fa-gift {
color: #eeeeee;
&:hover {
color: #555555;
}
}
.o_arrow_button.btn-secondary {
color: $text-muted;
text-transform: none;
font-weight: 500;
.o_account_dashboard_index {
color: gray('900');
}
&.o_action_done {
color: gray('900');
background-color: gray('200');
&:after {
border-left-color: gray('200');
}
.fa-check {
color: theme-color('success');
}
}
&:last-of-type {
margin-left: $o-horizontal-padding;
padding-left: $o-horizontal-padding*.5;
border-left: 1px solid gray('300');
}
}
}
}
.o_kanban_view.o_kanban_dashboard.o_account_kanban {
.o_kanban_record {
@include media-breakpoint-up(sm) {
.oe_kanban_action_button {
display: block;
margin-bottom: 5px;
}
}
.o_kanban_card_settings {
padding-top: $o-horizontal-padding/2;
padding-bottom: $o-horizontal-padding/2;
border-top: 1px solid;
border-color: $o-brand-lightsecondary;
}
.o_dashboard_star {
font-size: 12px;
&.fa-star-o {
color: $o-main-color-muted;
&:hover {
color: gold;
}
}
&.fa-star {
color: gold;
}
}
.o_dashboard_graph {
margin-bottom: -$o-horizontal-padding/2;
}
}
&.o_kanban_ungrouped {
.o_kanban_record {
width: 450px;
}
}
.o_kanban_group {
&:not(.o_column_folded) {
width: 450px + 2*$o-kanban-group-padding;
@include media-breakpoint-down(sm) {
width: 100%;
}
}
}
}
// Style for the widget "dashboard_graph"
.o_dashboard_graph {
position: relative;
margin: 16px -16px;
canvas {
height: 75px;
}
}
.o_sample_data .o_dashboard_graph.o_graph_linechart > svg g.nv-linesWrap g.nv-group.nv-series-0 {
fill: gray !important;
opacity: 0.1;
}
.progress-reconciliation {
.progress-bar {
font-size: 1.08333333rem;
height: 14px;
background-color: $o-enterprise-color;
span {
display: contents;
}
}
}
.o_reconciliation {
.o_filter_input_wrapper {
position: relative;
width: 150px;
margin: 0.5rem !important;
.searchIcon {
position: absolute;
right: 10px;
}
.o_filter_input {
border: none;
border-bottom: 1px black solid;
}
}
.import_to_suspense {
margin: 0.5rem !important;
}
.notification_area {
clear: both;
}
.o_view_noreconciliation {
max-width: none;
padding: 0 10%;
color: $o-main-color-muted;
font-size: 125%;
}
.accounting_view {
width: 100%;
.cell_left {
border-right: 1px solid #333;
padding-right: 5px;
}
.edit_amount {
margin-left: 20px;
color: #bbb;
}
.cell:hover .edit_amount {
color: #00A09D;
}
.strike_amount {
text-decoration: line-through;
}
tbody tr:hover .cell_account_code::before {
content: "\f068";
font-family: FontAwesome;
position: relative;
margin-left: -17px;
left: -4px;
line-height: 0;
padding: 3px 2px 5px 5px;
}
}
.o_multi_currency {
margin-right: 5px;
&.o_multi_currency_color_0 {
color: #dd6666;
}
&.o_multi_currency_color_1 {
color: #aaaaaa;
}
&.o_multi_currency_color_2 {
color: #66dd66;
}
&.o_multi_currency_color_3 {
color: #6666dd;
}
&.o_multi_currency_color_4 {
color: #dddd66;
}
&.o_multi_currency_color_5 {
color: #dd66dd;
}
&.o_multi_currency_color_6 {
color: #66dddd;
}
&.o_multi_currency_color_7 {
color: #aaa333;
}
}
.o_reconciliation_line {
margin-bottom: 30px;
table {
width: 100%;
vertical-align: top;
}
tbody tr {
cursor: pointer;
}
tr.already_reconciled {
color: $o-account-info-color;
}
tr.invalid {
text-decoration: line-through;
}
td {
padding: 1px 2px;
}
thead td {
border-top: $o-account-light-border;
padding-top: 4px;
padding-bottom: 5px;
background-color: $o-account-initial-line-background;
}
tfoot td {
color: #bbb;
}
/* columns */
.cell_action {
width: 15px;
color: gray('700');
background: #fff;
border: 0;
text-align: center;
.fa-add-remove:before {
content: "";
}
}
tr:hover .cell_action .fa-add-remove:before {
content: "\f068";
}
.is_tax .cell_action .fa-add-remove:before {
position: relative;
top: -18px;
}
.cell_account_code {
width: 80px;
padding-left: 5px;
}
.cell_due_date {
width: 100px;
}
.cell_label {
width: auto;
}
.cell_left {
padding-right: 5px;
}
.cell_right, .cell_left {
text-align: right;
width: 120px;
}
.cell_info_popover {
text-align: right;
width: 15px;
color: #ccc;
&:empty {
padding: 0;
width: 0;
}
}
table.accounting_view {
.cell_right, .cell_left, .cell_label, .cell_due_date, .cell_account_code, .cell_info_popover {
box-shadow: 0 1px 0 #EAEAEA;
}
}
/* info popover */
.popover {
max-width: none;
}
table.details {
vertical-align: top;
td:first-child {
vertical-align: top;
padding-right: 10px;
font-weight: bold;
}
}
tr.one_line_info {
td {
padding-top: 10px;
text-align: center;
color: $o-account-info-color;
}
}
/* Icons */
.toggle_match, .toggle_create {
transform: rotate(0deg);
transition: transform 300ms ease 0s;
}
.visible_toggle, &[data-mode="match"] .toggle_match, &[data-mode="create"] .toggle_create {
visibility: visible !important;
transform: rotate(90deg);
}
.toggle_create {
font-size: 10px;
}
/* Match view & Create view */
> .o_notebook {
display: none;
> .o_notebook_headers {
margin-right: 0;
margin-left: 0;
}
}
> .o_notebook > .tab-content > div {
border: 1px solid #ddd;
border-top: 0;
}
> .o_notebook .match table tr:hover {
background-color: #eee;
}
&:not([data-mode="inactive"]) > .o_notebook {
display: block;
}
&:not(:focus-within) .o_web_accesskey_overlay {
display: none;
}
&:focus caption .o_buttons button {
outline: none;
box-shadow: 4px 4px 4px 0px $o-enterprise-color;
}
&:focus {
outline: none;
box-shadow: 0 0 0 0;
}
}
.o_reconcile_models .btn-primary {
margin: 0 2px 3px 0;
}
/* Match view */
.match {
.cell_action .fa-add-remove:before {
content: "";
}
tr:hover .cell_action .fa-add-remove:before {
content: "\f067";
}
.match_controls {
padding: 5px 0 5px ($o-account-action-col-width+$o-account-main-table-borders-padding);
.filter {
width: 240px;
display: inline-block;
}
.fa-chevron-left, .fa-chevron-right {
display: inline-block;
cursor: pointer;
}
.fa-chevron-left {
margin-right: 10px;
}
.fa-chevron-left.disabled, .fa-chevron-right.disabled {
color: #ddd;
cursor: default;
}
}
.show_more {
display: inline-block;
margin-left: ($o-account-action-col-width+$o-account-main-table-borders-padding);
margin-top: 5px;
}
}
/* Create view */
.create {
> div > div.quick_add > .o_reconcile_models {
max-width: 100%;
max-height: 70px;
flex-wrap: wrap;
overflow: auto;
& > * {
flex-grow: 0;
}
}
.quick_add {
margin-bottom: 7px;
padding: 0 8px;
}
.o_group table.o_group_col_6 {
width: 49%;
margin: 0;
vertical-align: top;
}
.o_group table.o_group_col_6:first-child {
margin-left: 8px;
}
.btn {
padding-top: 0;
padding-bottom: 0;
}
.add_line_container {
text-align: center;
clear: both;
color: $o-enterprise-primary-color;
cursor: pointer;
}
}
.o_notebook .tab-content > .tab-pane {
padding: 5px 0;
}
}
/*Manual Reconciliation*/
.o_manual_statement {
.accounting_view {
td[colspan="3"] span:first-child {
width: 100%;
display: inline-block;
}
td[colspan="2"] {
border-bottom: 1px solid #333;
text-align: center;
width: 240px;
}
.do_partial_reconcile_true {
display: none;
}
}
}
// This is rtl language specific fix
// It will flip the fa-fa play icon in left direction
.o_rtl {
.o_reconciliation {
.o_reconciliation_line {
.toggle_match, .toggle_create {
transform: rotate(180deg);
transition: transform 300ms;
}
.visible_toggle, &[data-mode="match"] .toggle_match, &[data-mode="create"] .toggle_create {
transform: rotate(270deg);
}
}
}
}
.o_search_panel.account_root {
flex: 0 0 50px;
padding: 6px;
scrollbar-width: thin;
.o_search_panel_section_header {
display: none;
}
.list-group-item span.o_search_panel_label_title {
display: contents;
}
.o_search_panel_category_value {
header {
margin-left: 0;
padding-left: 0;
}
.o_search_panel_category_value .o_toggle_fold {
width: 0.3rem;
}
}
&::-webkit-scrollbar {
width: 4px;
}
&::-webkit-scrollbar-thumb {
background: lightgray;
}
}
// The goal of this file is to contain CSS hacks related to allowing
// section and note on sale order and invoice.
table.o_section_and_note_list_view tr.o_data_row.o_is_line_note,
table.o_section_and_note_list_view tr.o_data_row.o_is_line_note textarea[name="name"],
div.oe_kanban_card.o_is_line_note {
font-style: italic;
}
table.o_section_and_note_list_view tr.o_data_row.o_is_line_section,
div.oe_kanban_card.o_is_line_section {
font-weight: bold;
background-color: #DDDDDD;
}
table.o_section_and_note_list_view tr.o_data_row.o_is_line_section {
border-top: 1px solid #BBB;
border-bottom: 1px solid #BBB;
}
table.o_section_and_note_list_view tr.o_data_row {
&.o_is_line_note,
&.o_is_line_section {
td {
// There is an undeterministic CSS behaviour in Chrome related to
// the combination of the row's and its children's borders.
border: none !important;
}
}
}
$o-account-action-col-width: 15px;
$o-account-main-table-borders-padding: 3px;
$o-account-light-border: 1px solid #bbb;
$o-account-initial-line-background: #f0f0f0;
$o-account-info-color: #44c;
@keyframes animate-red {
0% {
color: red;
}
100% {
color: inherit;
}
}
.animate {
animation: animate-red 1s ease;
}
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Top menu item -->
<menuitem id="idgd_menu_root"
name="ID Dashboard"
web_icon="id_dashboard_icon,static/description/icon.png"
active="True"
sequence="400"/>
<!-- Konfigurasi-->
<menuitem id="config_idgd_menu"
name="Konfigurasi"
parent="idgd_menu_root"
sequence="7"/>
<menuitem id="wilayah_config_idgd_menu"
name="Wilayah"
parent="config_idgd_menu"
sequence="2"/>
<menuitem id="state_config_idgd_menu"
name="Provinsi"
parent="wilayah_config_idgd_menu"
action="id_gov.action_state_config_id"
sequence="2"/>
<menuitem id="district_config_idgd_menu"
name="Kabupaten/Kota"
parent="wilayah_config_idgd_menu"
action="id_gov.action_district_config_id"
sequence="2"/>
<menuitem id="sub_district_config_idgd_menu"
name="Kecamatan"
parent="wilayah_config_idgd_menu"
action="id_gov.action_sub_district_config_id"
sequence="2"/>
<menuitem id="village_config_idgd_menu"
name="Desa/Kelurahan"
parent="wilayah_config_idgd_menu"
action="id_gov.action_village_config_id"
sequence="2"/>
<menuitem id="company_config_idgd_menu"
name="Pemerintah Daerah/Organisasi"
parent="config_idgd_menu"
action="id_gov.action_company_config_id"
sequence="4"/>
<!-- Transaksi-->
<menuitem id="transaksi_idgd_menu"
name="Transaksi"
parent="idgd_menu_root"
sequence="6"/>
<menuitem id="potency_idgd_menu"
name="Region Tax Potency"
parent="transaksi_idgd_menu"
action="action_idg_region_tax_potency"
sequence="4"/>
<menuitem id="plan_idgd_menu"
name="Region Tax Planned"
parent="transaksi_idgd_menu"
action="action_idg_region_tax_plan"
sequence="5"/>
<menuitem id="actual_idgd_menu"
name="Region Tax Actual"
parent="transaksi_idgd_menu"
action="action_idg_region_tax_actual"
sequence="6"/>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="idg_region_tax_actual_tree" model="ir.ui.view">
<field name="name">idg.region.tax.actual.tree</field>
<field name="model">idg.region.tax.actual</field>
<field name="arch" type="xml">
<tree string="Region Tax Actual" sample="1" create="1" delete="1" multi_edit="0">
<field name="state_id"/>
<field name="district_id"/>
<field name="account_id"/>
<field name="date"/>
<field name="qty"/>
<field name="amount"/>
</tree>
</field>
</record>
<record id="idg_region_tax_actual_form" model="ir.ui.view">
<field name="name">idg.region.tax.actual.form</field>
<field name="model">idg.region.tax.actual</field>
<field name="arch" type="xml">
<form string="Region Tax Actual" sample="1">
<sheet>
<h1>
<field name="state_id"/>
</h1>
<h2>
<field name="district_id"/>
</h2>
<group>
<field name="country_id" invisible="1"/>
<field name="account_id"/>
<field name="date"/>
<field name="qty"/>
<field name="amount"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_idg_region_tax_actual" model="ir.actions.act_window">
<field name="name">Region Tax Actual</field>
<field name="res_model">idg.region.tax.actual</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="idg_region_tax_actual_tree"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Region Tax Actual
</p>
</field>
</record>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="idg_region_tax_plan_tree" model="ir.ui.view">
<field name="name">idg.region.tax.plan.tree</field>
<field name="model">idg.region.tax.plan</field>
<field name="arch" type="xml">
<tree string="Region Tax Planned" sample="1" create="1" delete="1" multi_edit="0">
<field name="state_id"/>
<field name="district_id"/>
<field name="account_id"/>
<field name="year"/>
<field name="month"/>
<field name="qty"/>
<field name="amount"/>
</tree>
</field>
</record>
<record id="idg_region_tax_plan_form" model="ir.ui.view">
<field name="name">idg.region.tax.plan.form</field>
<field name="model">idg.region.tax.plan</field>
<field name="arch" type="xml">
<form string="Region Tax Planned" sample="1">
<sheet>
<h1>
<field name="state_id"/>
</h1>
<h2>
<field name="district_id"/>
</h2>
<group>
<field name="country_id" invisible="1"/>
<field name="account_id"/>
<field name="year"/>
<field name="month"/>
<field name="qty"/>
<field name="amount"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_idg_region_tax_plan" model="ir.actions.act_window">
<field name="name">Region Tax Planned</field>
<field name="res_model">idg.region.tax.plan</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="idg_region_tax_plan_tree"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Region Tax Planned
</p>
</field>
</record>
</data>
</odoo>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="idg_region_tax_potency_tree" model="ir.ui.view">
<field name="name">idg.region.tax.potency.tree</field>
<field name="model">idg.region.tax.potency</field>
<field name="arch" type="xml">
<tree string="Region Tax Potency" sample="1" create="1" delete="1" multi_edit="0">
<field name="state_id"/>
<field name="district_id"/>
<field name="account_id"/>
<field name="year"/>
<field name="qty"/>
<field name="amount"/>
</tree>
</field>
</record>
<record id="idg_region_tax_potency_form" model="ir.ui.view">
<field name="name">idg.region.tax.potency.form</field>
<field name="model">idg.region.tax.potency</field>
<field name="arch" type="xml">
<form string="Region Tax Potency" sample="1">
<sheet>
<h1>
<field name="state_id"/>
</h1>
<h2>
<field name="district_id"/>
</h2>
<group>
<field name="country_id" invisible="1"/>
<field name="account_id"/>
<field name="year"/>
<field name="qty"/>
<field name="amount"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_idg_region_tax_potency" model="ir.actions.act_window">
<field name="name">Region Tax Potency</field>
<field name="res_model">idg.region.tax.potency</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="idg_region_tax_potency_tree"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Region Tax Potency
</p>
</field>
</record>
</data>
</odoo>
\ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!