initial commit - l10n_sk_partner

This commit is contained in:
Tomas
2026-04-05 16:03:23 +02:00
parent 53b0d0a287
commit 8606fc3492
14 changed files with 310 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
from . import models
+33
View File
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
{
'name': 'Slovakia - Partner DIČ',
'version': '19.0.2.0.5',
'category': 'Localization',
'summary': 'Pridáva DIČ pole na kontakty a opravuje IČO label pre Slovensko',
'description': """
Modul pre slovenské daňové identifikátory:
- Pridáva pole DIČ na kontakt
- Opravuje label IČO (namiesto "ID") pre SK partnerov
- Validácia formátov SK čísel (IČO 8 číslic, DIČ 10 číslic, IČ DPH SK+10)
- Automatické vyplnenie DIČ z IČ DPH
- Oprava duplicitného IČ DPH na faktúrach (l10n_sk + natívny blok)
- Podpora importu kontaktov s DIČ
""",
'author': 'SERIGRAFIKA s.r.o.',
'website': 'https://serigrafika.sk',
'license': 'LGPL-3',
'depends': [
'contacts',
'account',
'l10n_sk',
],
'data': [
'security/ir.model.access.csv',
'views/res_partner_views.xml',
'report/report_layout_sk.xml',
],
'installable': True,
'auto_install': False,
'application': False,
'post_init_hook': 'post_init_hook',
}
+50
View File
@@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
def post_init_hook(env):
"""
Opravuje l10n_sk.vat_registry_tax_id_external_layout šablónu:
- Mení 'ID:' na 'IČO:' pre obe jazykové verzie
- Odstraňuje duplicitný IČ DPH riadok
"""
view = env['ir.ui.view'].search([
('key', '=', 'l10n_sk.vat_registry_tax_id_external_layout')
], limit=1)
if not view:
return
new_template_en = """<t t-name="l10n_sk.vat_registry_tax_id_external_layout">
<li t-if="company.company_registry and company.account_fiscal_country_id.code == 'SK'">
IČO: <span t-field="company.company_registry"/>
</li>
<li t-if="company.income_tax_id and company.account_fiscal_country_id.code == 'SK'">
DIČ: <span t-field="company.income_tax_id"/>
</li>
</t>"""
new_template_sk = """<t t-name="l10n_sk.vat_registry_tax_id_external_layout">
<li t-if="company.company_registry and company.account_fiscal_country_id.code == 'SK'">
IČO: <span t-field="company.company_registry"/>
</li>
<li t-if="company.income_tax_id and company.account_fiscal_country_id.code == 'SK'">
DIČ: <span t-field="company.income_tax_id"/>
</li>
</t>"""
env.cr.execute("""
UPDATE ir_ui_view
SET arch_db = jsonb_set(
jsonb_set(
arch_db,
'{en_US}',
%s::jsonb
),
'{sk_SK}',
%s::jsonb
)
WHERE key = 'l10n_sk.vat_registry_tax_id_external_layout'
""", (
f'"{new_template_en}"',
f'"{new_template_sk}"',
))
View File
+71
View File
@@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
"""
Migration script pre l10n_sk_partner 19.0.2.0.4
Opravuje l10n_sk šablóny:
1. vat_registry_tax_id_external_layout: ID -> IČO, DIČ
2. report_invoice_document: IČO, DIČ pre odberateľa na faktúre
"""
def migrate(cr, version):
# --- 1. Oprava dodávateľského bloku ---
layout_template = (
'<t t-name="l10n_sk.vat_registry_tax_id_external_layout">'
'\n <li t-if="company.company_registry and company.account_fiscal_country_id.code == \'SK\'">'
'\n I\u010cO: <span t-field="company.company_registry"/>'
'\n </li>'
'\n <li t-if="company.income_tax_id and company.account_fiscal_country_id.code == \'SK\'">'
'\n DI\u010c: <span t-field="company.income_tax_id"/>'
'\n </li>'
'\n </t>'
)
cr.execute("""
UPDATE ir_ui_view
SET arch_db = jsonb_build_object('en_US', %s, 'sk_SK', %s),
arch_updated = true
WHERE key = 'l10n_sk.vat_registry_tax_id_external_layout'
""", (layout_template, layout_template))
# --- 2. Oprava odberateľského bloku na faktúre ---
invoice_template = (
'<data inherit_id="account.report_invoice_document">'
'\n <xpath expr="//div[@id=\'partner_vat_address_not_same_as_shipping\']" position="before">'
'\n <div t-if="o.partner_id.company_registry and o.company_id.country_code == \'SK\'">'
'\n I\u010cO: <span t-field="o.partner_id.company_registry"/>'
'\n </div>'
'\n <div t-if="o.partner_id.dic and o.company_id.country_code == \'SK\'">'
'\n DI\u010c: <span t-field="o.partner_id.dic"/>'
'\n </div>'
'\n </xpath>'
'\n <xpath expr="//div[@id=\'partner_vat_address_same_as_shipping\']" position="before">'
'\n <div t-if="o.partner_id.company_registry and o.company_id.country_code == \'SK\'">'
'\n I\u010cO: <span t-field="o.partner_id.company_registry"/>'
'\n </div>'
'\n <div t-if="o.partner_id.dic and o.company_id.country_code == \'SK\'">'
'\n DI\u010c: <span t-field="o.partner_id.dic"/>'
'\n </div>'
'\n </xpath>'
'\n <xpath expr="//div[@id=\'partner_vat_no_shipping\']" position="before">'
'\n <div t-if="o.partner_id.company_registry and o.company_id.country_code == \'SK\'">'
'\n I\u010cO: <span t-field="o.partner_id.company_registry"/>'
'\n </div>'
'\n <div t-if="o.partner_id.dic and o.company_id.country_code == \'SK\'">'
'\n DI\u010c: <span t-field="o.partner_id.dic"/>'
'\n </div>'
'\n </xpath>'
'\n <xpath expr="//div[@name=\'comment\']" position="after">'
'\n <p t-if="o.company_id.trade_registry and o.company_id.country_code == \'SK\'" name="trade_registry">'
'\n <strong>Trade registry: </strong><t t-out="o.company_id.trade_registry"/>'
'\n </p>'
'\n </xpath>'
'\n </data>'
)
cr.execute("""
UPDATE ir_ui_view
SET arch_db = jsonb_build_object('en_US', %s, 'sk_SK', %s),
arch_updated = true
WHERE key = 'l10n_sk.report_invoice_document'
""", (invoice_template, invoice_template))
View File
+46
View File
@@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
"""
Migration script pre l10n_sk_partner 19.0.2.0.5
Opravuje natívne VAT bloky vo všetkých external_layout šablónach:
- Skryje natívny VAT blok pre SK krajinu (l10n_sk ho už zobrazuje)
- Opraví t-else blok ktorý zobrazoval US12345671 pre SK
"""
LAYOUT_KEYS = [
'web.external_layout_standard',
'web.external_layout_striped',
'web.external_layout_boxed',
'web.external_layout_bold',
'web.external_layout_folder',
'web.external_layout_wave',
'web.external_layout_bubble',
]
def migrate(cr, version):
for key in LAYOUT_KEYS:
# Skry natívny t-if VAT blok pre SK
cr.execute("""
UPDATE ir_ui_view
SET arch_db = regexp_replace(
arch_db::text,
't-if="not forced_vat"',
't-if="not forced_vat and company.account_fiscal_country_id.code != ''SK''"',
'g'
)::jsonb,
arch_updated = true
WHERE key = %s
""", (key,))
# Oprav t-else blok — zmeň na t-if aby sa nezobrazoval pre SK
cr.execute("""
UPDATE ir_ui_view
SET arch_db = regexp_replace(
arch_db::text,
'li t-else="">\s*\n\s*<t t-esc="company\.country_id\.vat_label',
'li t-if="forced_vat and company.account_fiscal_country_id.code != ''SK''">\n <t t-esc="company.country_id.vat_label',
'g'
)::jsonb,
arch_updated = true
WHERE key = %s
""", (key,))
View File
+3
View File
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import res_partner
from . import res_company
+13
View File
@@ -0,0 +1,13 @@
# -*- coding: utf-8 -*-
from odoo import api, models
class ResCompany(models.Model):
_inherit = 'res.company'
def write(self, vals):
res = super().write(vals)
for company in self:
if company.partner_id.dic and company.income_tax_id != company.partner_id.dic:
company.income_tax_id = company.partner_id.dic
return res
+68
View File
@@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
import re
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class ResPartner(models.Model):
_inherit = 'res.partner'
_description = 'Partner - Slovak Tax IDs'
dic = fields.Char(
string='DIČ',
size=10,
help='Daňové identifikačné číslo (napr. 2022538353).',
)
is_vat_payer = fields.Boolean(
string='Platca DPH',
compute='_compute_is_vat_payer',
store=True,
help='Automaticky označené ak je vyplnené IČ DPH (VAT) s SK prefixom.',
)
@api.depends('vat')
def _compute_is_vat_payer(self):
for partner in self:
partner.is_vat_payer = bool(
partner.vat and partner.vat.upper().startswith('SK')
)
@api.onchange('vat')
def _onchange_vat_fill_dic(self):
if self.vat and self.vat.upper().startswith('SK'):
dic_from_vat = self.vat[2:].strip()
if not self.dic:
self.dic = dic_from_vat
@api.constrains('dic')
def _check_dic(self):
for partner in self:
if partner.dic and not re.match(r'^\d{10}$', partner.dic):
raise ValidationError(
_('DIČ musí obsahovať presne 10 číslic (napr. 2022538353).')
)
@api.constrains('vat')
def _check_sk_vat(self):
for partner in self:
if partner.vat and partner.country_id.code == 'SK':
vat = partner.vat.upper().replace(' ', '')
if not re.match(r'^SK\d{10}$', vat):
raise ValidationError(
_('IČ DPH pre Slovensko musí byť vo formáte SK + 10 číslic '
'(napr. SK2022538353).')
)
@api.constrains('company_registry')
def _check_ico(self):
for partner in self:
if partner.company_registry and not re.match(r'^\d{8}$', partner.company_registry):
raise ValidationError(
_('IČO musí obsahovať presne 8 číslic (napr. 43963617).')
)
def _get_company_registry_labels(self):
labels = super()._get_company_registry_labels()
labels['SK'] = _('IČO')
return labels
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Oprava l10n_sk šablón sa rieši cez migration script v migrations/19.0.2.1.0/post-migrate.py -->
</odoo>
+1
View File
@@ -0,0 +1 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_partner_form_sk" model="ir.ui.view">
<field name="name">res.partner.form.sk</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='website']" position="before">
<field name="dic"
placeholder="napr. 2022538353"
invisible="not is_company"/>
<field name="is_vat_payer"
invisible="not is_company"/>
</xpath>
</field>
</record>
</odoo>