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