[IMP] l10n_in: Simplify GST invoice

GST Treatment:
   * Is show that how This invoice or partner is treated in GST
   * Set default value in customer
   * This is help in GST retrun filing.
   * Value of treamtmnet as below
	- Registered Business - Regular
	- Registered Business - Composition
	- Unregistered Business
	- Consumer
	- Overseas
	- Special Economic Zone
	- Deemed Export
   * GSTIN is required in
	- Registered Business - Regular
	- Registered Business - Composition
	- Special Economic Zone
	- Deemed Export

GSTIN:
   * GST identification number or GST number
   * There can be multiple GSTIN for a single person, being an assessee under the Income Tax Act for every State or Union Territory in which such person operates from
   * Add Validate of this number using regular expression

remove field l10n_in_export_type and l10n_in_import_export becouse it's covered by GST Treatment
remove field l10n_in_partner_vat becouse not use anyware.
This commit is contained in:
Jigar Vaghela
2020-04-30 07:20:06 +00:00
parent 42c430a539
commit 205430ffb5
12 changed files with 173 additions and 77 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ Sheet, now only Vertical format has been permitted Which is Supported By Odoo.
""",
'category': 'Accounting/Localizations',
'depends': [
'account_tax_python',
'account_tax_python', 'base_vat',
],
'data': [
'security/l10n_in_security.xml',
+1 -2
View File
@@ -9,8 +9,7 @@ class AccountJournal(models.Model):
_inherit = "account.journal"
# Use for filter import and export type.
l10n_in_import_export = fields.Boolean("Import/Export", help="Tick this if this journal is use for Import/Export Under Indian GST.")
l10n_in_gstin_partner_id = fields.Many2one('res.partner', string="GSTIN", ondelete="restrict", help="GSTIN related to this journal. If empty then consider as company GSTIN.")
l10n_in_gstin_partner_id = fields.Many2one('res.partner', string="GSTIN Unit", ondelete="restrict", help="GSTIN related to this journal. If empty then consider as company GSTIN.")
def name_get(self):
"""
+70 -11
View File
@@ -2,6 +2,7 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class AccountMove(models.Model):
@@ -13,21 +14,43 @@ class AccountMove(models.Model):
invoice.amount_total_words = invoice.currency_id.amount_to_text(invoice.amount_total)
amount_total_words = fields.Char("Total (In Words)", compute="_compute_amount_total_words")
# Use for invisible fields in form views.
l10n_in_import_export = fields.Boolean(related='journal_id.l10n_in_import_export', readonly=True)
l10n_in_gst_treatment = fields.Selection([
('regular', 'Registered Business - Regular'),
('composition', 'Registered Business - Composition'),
('unregistered', 'Unregistered Business'),
('consumer', 'Consumer'),
('overseas', 'Overseas'),
('special_economic_zone', 'Special Economic Zone'),
('deemed_export', 'Deemed Export')
], string="GST Treatment", readonly=True, states={'draft': [('readonly', False)]})
l10n_in_state_id = fields.Many2one('res.country.state', string="Location of supply")
l10n_in_company_country_code = fields.Char(related='company_id.country_id.code', string="Country code")
l10n_in_gstin = fields.Char(string="GSTIN")
# For Export invoice this data is need in GSTR report
l10n_in_export_type = fields.Selection([
('regular', 'Regular'), ('deemed', 'Deemed'),
('sale_from_bonded_wh', 'Sale from Bonded WH'),
('export_with_igst', 'Export with IGST'),
('sez_with_igst', 'SEZ with IGST payment'),
('sez_without_igst', 'SEZ without IGST payment')],
string='Export Type', default='regular', required=True)
l10n_in_shipping_bill_number = fields.Char('Shipping bill number', readonly=True, states={'draft': [('readonly', False)]})
l10n_in_shipping_bill_date = fields.Date('Shipping bill date', readonly=True, states={'draft': [('readonly', False)]})
l10n_in_shipping_port_code_id = fields.Many2one('l10n_in.port.code', 'Shipping port code', states={'draft': [('readonly', False)]})
l10n_in_shipping_port_code_id = fields.Many2one('l10n_in.port.code', 'Port code', states={'draft': [('readonly', False)]})
l10n_in_reseller_partner_id = fields.Many2one('res.partner', 'Reseller', domain=[('vat', '!=', False)], help="Only Registered Reseller", readonly=True, states={'draft': [('readonly', False)]})
l10n_in_partner_vat = fields.Char(related="partner_id.vat", readonly=True)
@api.onchange('partner_id')
def _onchange_partner_id(self):
"""Use journal type to define document type because not miss state in any entry including POS entry"""
if self.l10n_in_company_country_code == 'IN':
self.l10n_in_gst_treatment = self.partner_id.l10n_in_gst_treatment
return super()._onchange_partner_id()
@api.model
def _l10n_in_get_indian_state(self, partner):
"""In tax return filing, If customer is not Indian in that case place of supply is must set to Other Territory.
So we set Other Territory in l10n_in_state_id when customer(partner) is not Indian
Also we raise if state is not set in Indian customer.
State is big role under GST because tax type is depend on.for more information check this https://www.cbic.gov.in/resources//htdocs-cbec/gst/Integrated%20goods%20&%20Services.pdf"""
if partner.country_id and partner.country_id.code == 'IN' and not partner.state_id:
raise ValidationError(_("State is missing from address in '%s'. First set state after post this invoice again." %(partner.name)))
elif partner.country_id and partner.country_id.code != 'IN':
return self.env.ref('l10n_in.state_in_ot')
return partner.state_id
@api.model
def _get_tax_grouping_key_from_tax_line(self, tax_line):
@@ -53,3 +76,39 @@ class AccountMove(models.Model):
line.product_id.id,
]
return tax_key
def _l10n_in_get_shipping_partner(self):
"""Overwrite in sale"""
self.ensure_one()
return self.partner_id
@api.model
def _l10n_in_get_shipping_partner_gstin(self, shipping_partner):
"""Overwrite in sale"""
return shipping_partner.vat
def post(self):
"""Use journal type to define document type because not miss state in any entry including POS entry"""
res = super().post()
gst_treatment_name_mapping = {k: v for k, v in
self._fields['l10n_in_gst_treatment']._description_selection(self.env)}
for move in self.filtered(lambda m: m.l10n_in_company_country_code == 'IN'):
"""Check state is set in company/sub-unit"""
company_unit_partner = move.journal_id.l10n_in_gstin_partner_id or move.journal_id.company_id
if not company_unit_partner.state_id:
raise ValidationError(_("State is missing from your company/unit %s(%s).\nFirst set state in your company/unit." % (company_unit_partner.name, company_unit_partner.id)))
elif self.journal_id.type == 'purchase':
move.l10n_in_state_id = company_unit_partner.state_id
shipping_partner = move._l10n_in_get_shipping_partner()
move.l10n_in_gstin = move._l10n_in_get_shipping_partner_gstin(shipping_partner)
if not move.l10n_in_gstin and move.l10n_in_gst_treatment in ['regular', 'composition', 'special_economic_zone', 'deemed_export']:
raise ValidationError(_("Partner %s(%s) GSTIN is required under GST Treatment %s" % (shipping_partner.name, shipping_partner.id, gst_treatment_name_mapping.get(move.l10n_in_gst_treatment))))
if self.journal_id.type == 'sale':
move.l10n_in_state_id = self._l10n_in_get_indian_state(shipping_partner)
if not move.l10n_in_state_id:
move.l10n_in_state_id = self._l10n_in_get_indian_state(move.partner_id)
#still state is not set then assumed that transaction is local like PoS so set state of company unit
if not move.l10n_in_state_id:
move.l10n_in_state_id = company_unit_partner.state_id
return res
-5
View File
@@ -15,11 +15,6 @@ class AccountChartTemplate(models.Model):
journal['l10n_in_gstin_partner_id'] = company.partner_id.id
if journal['code'] == 'INV':
journal['name'] = _('Tax Invoices')
res += [
{'type': 'sale', 'name': _('Retail Invoices'), 'code': 'RETINV', 'company_id': company.id, 'show_on_dashboard': True, 'l10n_in_gstin_partner_id': company.partner_id.id},
{'type': 'sale', 'name': _('Export Invoices'), 'code': 'EXPINV', 'company_id': company.id, 'show_on_dashboard': True, 'l10n_in_import_export': True, 'l10n_in_gstin_partner_id': company.partner_id.id}
]
return res
class AccountTaxTemplate(models.Model):
+36 -7
View File
@@ -2,16 +2,45 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class ResPartner(models.Model):
_inherit = 'res.partner'
# Use in view attrs. Need to required state_id if Country is India.
l10n_in_country_code = fields.Char(related="country_id.code", string="Country code")
l10n_in_gst_treatment = fields.Selection([
('regular', 'Registered Business - Regular'),
('composition', 'Registered Business - Composition'),
('unregistered', 'Unregistered Business'),
('consumer', 'Consumer'),
('overseas', 'Overseas'),
('special_economic_zone', 'Special Economic Zone'),
('deemed_export', 'Deemed Export'),
], string="GST Treatment")
@api.constrains('vat', 'country_id')
def l10n_in_check_vat(self):
for partner in self.filtered(lambda p: p.commercial_partner_id.country_id.code == 'IN' and p.vat and len(p.vat) != 15):
raise ValidationError(_('The GSTIN [%s] for partner [%s] should be 15 characters only.') % (partner.vat, partner.name))
@api.onchange('company_type')
def onchange_company_type(self):
res = super().onchange_company_type()
if self.country_id and self.country_id.code == 'IN':
self.l10n_in_gst_treatment = (self.company_type == 'company') and 'regular' or 'consumer'
return res
@api.onchange('country_id')
def _onchange_country_id(self):
res = super()._onchange_country_id()
if self.country_id and self.country_id.code != 'IN':
self.l10n_in_gst_treatment = 'overseas'
elif self.country_id and self.country_id.code == 'IN':
self.l10n_in_gst_treatment = (self.company_type == 'company') and 'regular' or 'consumer'
return res
@api.onchange('vat')
def onchange_vat(self):
if self.vat and self.check_vat_in(self.vat):
state_id = self.env['res.country.state'].search([('l10n_in_tin', '=', self.vat[:2])], limit=1)
if state_id:
self.state_id = state_id
@api.model
def _commercial_fields(self):
res = super()._commercial_fields()
return res + ['l10n_in_gst_treatment']
+26 -25
View File
@@ -16,12 +16,15 @@ class L10nInAccountInvoiceReport(models.Model):
name = fields.Char(string="Invoice Number")
partner_id = fields.Many2one('res.partner', string="Customer")
is_reverse_charge = fields.Char("Reverse Charge")
l10n_in_export_type = fields.Selection([
('regular', 'Regular'), ('deemed', 'Deemed'),
('sale_from_bonded_wh', 'Sale from Bonded WH'),
('export_with_igst', 'Export with IGST'),
('sez_with_igst', 'SEZ with IGST payment'),
('sez_without_igst', 'SEZ without IGST payment')])
l10n_in_gst_treatment = fields.Selection([
('regular', 'Registered Business - Regular'),
('composition', 'Registered Business - Composition'),
('unregistered', 'Unregistered Business'),
('consumer', 'Consumer'),
('overseas', 'Overseas'),
('special_economic_zone', 'Special Economic Zone'),
('deemed_export', 'Deemed Export'),
], string="GST Treatment")
journal_id = fields.Many2one('account.journal', string="Journal")
state = fields.Selection([('draft', 'Unposted'), ('posted', 'Posted')], string='Status')
igst_amount = fields.Float(string="IGST Amount")
@@ -70,7 +73,7 @@ class L10nInAccountInvoiceReport(models.Model):
sub.state,
sub.partner_id,
sub.date,
sub.l10n_in_export_type,
sub.l10n_in_gst_treatment,
sub.ecommerce_partner_id,
sub.shipping_bill_number,
sub.shipping_bill_date,
@@ -118,7 +121,7 @@ class L10nInAccountInvoiceReport(models.Model):
am.name,
am.state,
am.date,
am.l10n_in_export_type AS l10n_in_export_type,
am.l10n_in_gst_treatment AS l10n_in_gst_treatment,
am.l10n_in_reseller_partner_id AS ecommerce_partner_id,
am.l10n_in_shipping_bill_number AS shipping_bill_number,
am.l10n_in_shipping_bill_date AS shipping_bill_date,
@@ -128,7 +131,7 @@ class L10nInAccountInvoiceReport(models.Model):
aj.company_id,
am.move_type AS move_type,
am.reversed_entry_id AS reversed_entry_id,
p.vat AS partner_vat,
am.l10n_in_gstin AS partner_vat,
CASE WHEN rp.vat IS NULL THEN '' ELSE rp.vat END AS ecommerce_vat,
(CASE WHEN at.l10n_in_reverse_charge = True
THEN True
@@ -157,34 +160,32 @@ class L10nInAccountInvoiceReport(models.Model):
THEN 'E'
ELSE 'OE'
END) as b2cs_is_ecommerce,
(CASE WHEN ps.id = cp.state_id or p.id IS NULL
(CASE WHEN am.l10n_in_state_id = cp.state_id or p.id IS NULL
THEN 'Intra State'
WHEN ps.id != cp.state_id and p.id IS NOT NULL
WHEN am.l10n_in_state_id != cp.state_id and p.id IS NOT NULL
THEN 'Inter State'
END) AS supply_type,
(CASE WHEN am.l10n_in_export_type in ('deemed', 'export_with_igst', 'sez_with_igst')
(CASE WHEN am.l10n_in_gst_treatment in ('deemed_export', 'overseas') and am.amount_tax > 0.00
THEN 'EXPWP'
WHEN am.l10n_in_export_type in ('sale_from_bonded_wh', 'sez_without_igst')
WHEN am.l10n_in_gst_treatment in ('deemed_export', 'overseas') and am.amount_tax <= 0.00
THEN 'EXPWOP'
ELSE ''
END) AS export_type,
(CASE WHEN refund_am.l10n_in_export_type in ('deemed', 'export_with_igst', 'sez_with_igst')
(CASE WHEN am.l10n_in_gst_treatment in ('deemed_export', 'overseas') and am.amount_tax > 0.00
THEN 'EXPWP'
WHEN refund_am.l10n_in_export_type in ('sale_from_bonded_wh', 'sez_without_igst')
WHEN am.l10n_in_gst_treatment in ('deemed_export', 'overseas') and am.amount_tax <= 0.00
THEN 'EXPWOP'
ELSE 'B2CL'
END) AS refund_export_type,
(CASE WHEN am.l10n_in_export_type = 'regular'
(CASE WHEN am.l10n_in_gst_treatment = 'regular'
THEN 'Regular'
WHEN am.l10n_in_export_type = 'deemed'
WHEN am.l10n_in_gst_treatment = 'deemed_export'
THEN 'Deemed'
WHEN am.l10n_in_export_type = 'sale_from_bonded_wh'
THEN 'Sale from Bonded WH'
WHEN am.l10n_in_export_type = 'export_with_igst'
WHEN am.l10n_in_gst_treatment = 'overseas' and am.amount_tax > 0.00
THEN 'Export with IGST'
WHEN am.l10n_in_export_type = 'sez_with_igst'
WHEN am.l10n_in_gst_treatment = 'special_economic_zone' and am.amount_tax > 0.00
THEN 'SEZ with IGST payment'
WHEN am.l10n_in_export_type = 'sez_without_igst'
WHEN am.l10n_in_gst_treatment = 'special_economic_zone' and am.amount_tax <= 0.00
THEN 'SEZ without IGST payment'
END) AS b2b_type,
(CASE WHEN am.move_type = 'out_refund'
@@ -250,11 +251,11 @@ class L10nInAccountInvoiceReport(models.Model):
JOIN account_account_tag_account_move_line_rel aat_aml_rel ON aat_aml_rel.account_move_line_id = aml.id
JOIN account_account_tag aat ON aat.id = aat_aml_rel.account_account_tag_id
JOIN account_tax_report_line_tags_rel tag_rep_ln ON aat.id = tag_rep_ln.account_account_tag_id
LEFT JOIN res_partner cp ON cp.id = c.partner_id
LEFT JOIN res_partner cp ON cp.id = COALESCE(aj.l10n_in_gstin_partner_id, c.partner_id)
LEFT JOIN res_country_state cps ON cps.id = cp.state_id
LEFT JOIN account_move refund_am ON refund_am.id = am.reversed_entry_id
LEFT JOIN res_partner p ON p.id = aml.partner_id
LEFT JOIN res_country_state ps ON ps.id = p.state_id
LEFT JOIN res_country_state ps ON ps.id = am.l10n_in_state_id
LEFT JOIN res_partner rp ON rp.id = am.l10n_in_reseller_partner_id
LEFT JOIN account_tax_filiation_rel atr ON atr.child_tax = at.id
LEFT JOIN account_tax parent_at ON parent_at.id = atr.parent_tax
@@ -275,7 +276,7 @@ class L10nInAccountInvoiceReport(models.Model):
sub.state,
sub.partner_id,
sub.date,
sub.l10n_in_export_type,
sub.l10n_in_gst_treatment,
sub.ecommerce_partner_id,
sub.shipping_bill_number,
sub.shipping_bill_date,
@@ -92,7 +92,7 @@ class L10nInPaymentReport(models.AbstractModel):
ELSE c.account_purchase_tax_id END)
JOIN res_partner p ON p.id = aml.partner_id
LEFT JOIN res_country_state ps ON ps.id = p.state_id
LEFT JOIN res_partner cp ON cp.id = c.partner_id
LEFT JOIN res_partner cp ON cp.id = COALESCE(aj.l10n_in_gstin_partner_id, c.partner_id)
LEFT JOIN res_country_state cps ON cps.id = cp.state_id
"""
+1 -1
View File
@@ -82,7 +82,7 @@ class L10nInExemptedReport(models.Model):
JOIN account_account aa ON aa.id = aml.account_id
JOIN account_journal aj ON aj.id = am.journal_id
JOIN res_company c ON c.id = aj.company_id
LEFT JOIN res_partner cp ON cp.id = c.partner_id
LEFT JOIN res_partner cp ON cp.id = COALESCE(aj.l10n_in_gstin_partner_id, c.partner_id)
LEFT JOIN res_partner p ON p.id = am.partner_id
LEFT JOIN res_country pc ON pc.id = p.country_id
WHERE aa.internal_type = 'other' and aml.tax_line_id IS NULL
+16 -12
View File
@@ -5,23 +5,27 @@
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@id='other_tab']//group[@name='accounting_info_group']" position="after">
<group string="Import/Export India">
<field name="l10n_in_import_export" invisible="1"/>
<field name="l10n_in_export_type"
attrs="{'invisible': [('l10n_in_import_export', '!=', True), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
<field name="l10n_in_shipping_bill_number"
attrs="{'invisible': [('l10n_in_import_export', '!=', True), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
<field name="l10n_in_shipping_bill_date"
attrs="{'invisible': [('l10n_in_import_export', '!=', True), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
<field name="l10n_in_shipping_port_code_id"
attrs="{'invisible': [('l10n_in_import_export', '!=', True), ('move_type', 'not in', ('out_invoice', 'out_refund'))]}"/>
<xpath expr="//field[@name='ref']" position="after">
<field name="l10n_in_company_country_code" invisible="1"/>
<field name="l10n_in_gst_treatment"
attrs="{'invisible': ['|', ('l10n_in_company_country_code', '!=', 'IN'), ('move_type', '=', 'entry')], 'required': [('l10n_in_company_country_code', '=', 'IN'), ('move_type', '!=', 'entry')]}"/>
</xpath>
<xpath expr="//page[@id='other_tab']/group[@id='other_tab_group']" position="after">
<group string="Export India" attrs="{'invisible': ['|', ('l10n_in_gst_treatment', 'not in', ['overseas', 'deemed_export']), ('move_type', 'not in', ['out_invoice', 'out_refund'])]}">
<field name="l10n_in_shipping_bill_number"/>
<field name="l10n_in_shipping_bill_date"/>
<field name="l10n_in_shipping_port_code_id"/>
</group>
<group string="Import India" attrs="{'invisible': ['|', ('l10n_in_gst_treatment', 'not in', ['overseas', 'special_economic_zone']), ('move_type', 'not in', ['in_invoice', 'in_refund'])]}">
<field name="l10n_in_shipping_bill_number" string="Bill of Entry Number"/>
<field name="l10n_in_shipping_bill_date" string="Bill of Entry Date"/>
<field name="l10n_in_shipping_port_code_id"/>
</group>
</xpath>
<xpath expr="//field[@name='partner_id']" position="after">
<field name="l10n_in_reseller_partner_id"
groups="l10n_in.group_l10n_in_reseller"
attrs="{'invisible': [('move_type', 'not in', ('out_invoice', 'out_refund'))]}"
attrs="{'invisible': ['|', '|',('move_type', 'not in', ('out_invoice', 'out_refund')), ('l10n_in_company_country_code', '!=', 'IN'), ('move_type', '=', 'entry')]}"
/>
</xpath>
</field>
@@ -8,9 +8,6 @@
<xpath expr="//group[@name='column_posting']" position="attributes">
<attribute name="attrs">{'invisible': [('type', 'not in', ['bank', 'cash', 'sale', 'purchase'])]}</attribute>
</xpath>
<xpath expr="//field[@name='loss_account_id']" position="after">
<field name="l10n_in_import_export" attrs="{'invisible': [('type', 'not in', ['sale', 'purchase'])]}"/>
</xpath>
<field name="company_id" position="after">
<field name="l10n_in_gstin_partner_id" context="{'show_vat':True}" options='{"no_create": True,"always_reload": True}'/>
</field>
+18 -3
View File
@@ -2,7 +2,22 @@
<odoo>
<template id="l10n_in_report_invoice_document_inherit" inherit_id="account.report_invoice_document">
<xpath expr="//span[@t-field='o.partner_id.vat']" position="attributes">
<attribute name="t-if">o.company_id.country_id.code != 'IN'</attribute>
</xpath>
<xpath expr="//span[@t-field='o.partner_id.vat']" position="after">
<span t-field="o.l10n_in_gstin" t-if="o.company_id.country_id.code == 'IN'"/>
</xpath>
<xpath expr="//t[@t-set='address']" position="inside">
<t t-if="o.company_id.country_id.code == 'IN' and o.l10n_in_state_id" class="mt16">
<t t-if="o.move_type in ('in_invoice', 'in_refund')">
Destination of supply: <span t-esc="o.l10n_in_state_id.name"/>
</t>
<t t-if="o.move_type in ('out_invoice', 'out_refund')">
Place of supply: <span t-esc="o.l10n_in_state_id.name"/>
</t>
</t>
</xpath>
<xpath expr="//p[@t-if='o.narration']" position="before">
<t t-if="o.company_id.country_id.code == 'IN'">
<p id="total_in_words" class="mb16">
@@ -12,9 +27,9 @@
</t>
</xpath>
<xpath expr="//table[@name='invoice_line_table']/thead/tr/th[2]" position="after">
<xpath expr="//table[@name='invoice_line_table']/thead/tr/th[1]" position="after">
<t t-if="o.company_id.country_id.code == 'IN'">
<th>HSN/SAC<t t-set="colspan" t-value="colspan+1"/></th>
<th>HSN/SAC</th>
</t>
</xpath>
+3 -6
View File
@@ -7,13 +7,10 @@
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='vat']" position="attributes">
<attribute name="string">GSTIN</attribute>
<attribute name="attrs">{'required':[('l10n_in_gst_treatment', 'in', ['regular', 'composition', 'special_economic_zone', 'deemed_export'])], 'readonly': [('parent_id', '!=', False)]}</attribute>
</xpath>
<xpath expr="//field[@name='state_id']" position="before">
<field name="l10n_in_country_code" invisible="1"/>
</xpath>
<xpath expr="//field[@name='state_id']" position="attributes">
<attribute name="attrs">{'required': ['|', ('l10n_in_country_code','=', 'IN'), ('l10n_in_country_code','=', False)]}</attribute>
<xpath expr="//field[@name='vat']" position="before">
<field name="l10n_in_gst_treatment" attrs="{'readonly': [('parent_id', '!=', False)]}"/>
</xpath>
</field>
</record>