initial commit - l10n_sk_partner
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import models
|
||||
@@ -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',
|
||||
}
|
||||
@@ -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}"',
|
||||
))
|
||||
@@ -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))
|
||||
|
||||
@@ -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,))
|
||||
@@ -0,0 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from . import res_partner
|
||||
from . import res_company
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>
|
||||
@@ -0,0 +1 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
|
@@ -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>
|
||||
Reference in New Issue
Block a user