init: Euro-Office Odoo 16.0 modules

Based on onlyoffice_odoo by Ascensio System SIA (ONLYOFFICE, LGPL-3).
Rebranded and adapted for Euro-Office by bring.out d.o.o.

Modules:
- eurooffice_odoo: base integration
- eurooffice_odoo_templates: document templates
- eurooffice_odoo_oca_dms: OCA DMS integration (replaces Enterprise documents)

All references renamed: onlyoffice -> eurooffice, ONLYOFFICE -> Euro-Office.
Original copyright notices preserved.
This commit is contained in:
Ernad Husremovic 2026-03-31 17:24:17 +02:00
commit b59a9dc6bb
347 changed files with 16699 additions and 0 deletions

View file

@ -0,0 +1,2 @@
from . import controllers
from . import models

View file

@ -0,0 +1,39 @@
# Based on onlyoffice_odoo by Ascensio System SIA (ONLYOFFICE)
# Adapted and rebranded for Euro-Office by bring.out d.o.o.
# pylint: disable=pointless-statement
{
"name": "Euro-Office Templates",
"summary": "Automate form creation with inserting fields from Odoo in templates.",
"description": "Work with fillable templates in Odoo using Euro-Office. Create templates based on the data and fields available in Odoo, fill them out and print with several clicks.", # noqa: E501
"author": "Euro-Office",
"website": "https://github.com/Euro-Office/eurooffice_odoo",
"category": "Productivity",
"version": "1.3.2",
"depends": ["base", "eurooffice_odoo", "web"],
"external_dependencies": {"python": ["pyjwt"]},
# always loaded
"data": [
"security/eurooffice_templates_security.xml",
"security/ir.model.access.csv",
"views/eurooffice_menu_views.xml",
"views/res_config_settings_views.xml",
],
"demo": ["data/templates_data.xml"],
"license": "LGPL-3",
"support": "support@eurooffice.com",
"images": [
"static/description/main_screenshot.png",
"static/description/create_templates.png",
"static/description/edit_templates.png",
"static/description/access_rights.png",
"static/description/work_with_templates.png",
],
"installable": True,
"application": True,
"assets": {
"web.assets_backend": [
"eurooffice_odoo_templates/static/src/css/*",
"eurooffice_odoo_templates/static/src/views/**/*",
],
},
}

View file

@ -0,0 +1,529 @@
#
# (c) Copyright Ascensio System SIA 2024
#
import base64
import codecs
import io
import json
import logging
import re
import zipfile
from datetime import datetime
from urllib.parse import quote
from odoo import http
from odoo.http import request
from odoo.tools import (
DEFAULT_SERVER_DATE_FORMAT,
DEFAULT_SERVER_DATETIME_FORMAT,
file_open,
get_lang,
)
from odoo.addons.eurooffice_odoo.controllers.controllers import Eurooffice_Connector, eurooffice_request
from odoo.addons.eurooffice_odoo.utils import config_utils, file_utils, jwt_utils, url_utils
from odoo.addons.eurooffice_odoo_templates.utils import config_utils as templates_config_utils
logger = logging.getLogger(__name__)
class Eurooffice_Inherited_Connector(Eurooffice_Connector):
@http.route("/eurooffice/template/template_content/<string:path>", auth="public")
def get_template_content(self, path):
try:
file_content = request.env["eurooffice.odoo.demo.templates"].get_template_content(path.replace("_", "/"))
return request.make_response(
file_content,
headers=[
("Content-Type", "application/pdf"),
("Content-Disposition", 'inline; filename="preview.pdf"'),
],
)
except Exception as e:
return request.not_found(f"Error: {str(e)}")
@http.route("/eurooffice/template/editor", auth="user", methods=["POST"], type="json", csrf=False)
def override_render_editor(self, attachment_id, access_token=None):
attachment = self.get_attachment(attachment_id)
if not attachment:
return request.not_found()
attachment.validate_access(access_token)
data = attachment.read(["id", "checksum", "public", "name", "access_token"])[0]
filename = data["name"]
can_read = attachment.check_access_rights("read", raise_exception=False) and file_utils.can_view(filename)
hasAccess = http.request.env.user.has_group("eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin")
can_write = (
hasAccess
and attachment.check_access_rights("write", raise_exception=False)
and file_utils.can_edit(filename)
)
if not can_read:
raise Exception("cant read")
prepare_editor_values = self.prepare_editor_values(attachment, access_token, can_write)
return prepare_editor_values
class EuroofficeTemplate_Connector(http.Controller):
@http.route("/eurooffice/template/fill", auth="user", type="http")
def main(self, template_id, record_ids):
logger.info("GET /eurooffice/template/fill - template: %s, records: %s", template_id, record_ids)
internal_jwt_secret = config_utils.get_internal_jwt_secret(request.env)
oo_security_token = jwt_utils.encode_payload(request.env, {"id": request.env.user.id}, internal_jwt_secret)
try:
templates = self.fill_template(oo_security_token, record_ids, template_id)
if len(templates) == 1:
url = next(iter(templates.values()))
filename = next(iter(templates))
filename = filename.encode("ascii", "ignore").decode("ascii")
if not filename:
filename = "document.pdf"
response = eurooffice_request(url=quote(url, safe="/:?=&"), method="get")
if response.status_code == 200:
headers = [
("Content-Type", "application/pdf"),
("X-Content-Type-Options", "nosniff"),
("Content-Length", str(len(response.content))),
("Content-Disposition", f'attachment; filename="{filename}"'),
]
logger.info("GET /eurooffice/template/fill - returning single PDF: %s", filename)
return request.make_response(response.content, headers)
else:
e = f"error while downloading the document file, status = {response.status_code}"
logger.warning(e)
return request.not_found()
elif len(templates) > 1:
logger.info("GET /eurooffice/template/fill - creating ZIP with %s files", len(templates))
stream = io.BytesIO()
with zipfile.ZipFile(stream, "w", zipfile.ZIP_DEFLATED) as archive:
for filename, url in templates.items():
response = eurooffice_request(url=url, method="get")
if response.status_code == 200:
archive.writestr(filename, response.content)
else:
e = f"error while downloading the document file to be generated zip, status = {response.status_code}" # noqa: E501
logger.warning(e)
return request.not_found()
stream.seek(0)
content = stream.read()
stream.flush()
filename = f"eurooffice-templates-{datetime.now().strftime('%Y_%m_%d_%H_%M')}.zip"
headers = [
("Content-Type", "application/zip"),
("X-Content-Type-Options", "nosniff"),
("Content-Length", str(len(response.content))),
("Content-Disposition", f'attachment; filename="{filename}"'),
]
logger.info("GET /eurooffice/template/fill - returning ZIP: %s", filename)
return request.make_response(content, headers)
else:
logger.warning("no templates found")
logger.debug(templates)
return request.not_found()
except Exception as e:
logger.warning(e)
return request.not_found()
return request.not_found()
def fill_template(self, oo_security_token, record_ids, template_id):
logger.info("fill_template - template: %s, records: %s", template_id, record_ids)
docserver_url = config_utils.get_doc_server_public_url(request.env)
docserver_url = url_utils.replace_public_url_to_internal(request.env, docserver_url)
docbuilder_url = f"{docserver_url}docbuilder"
jwt_header = config_utils.get_jwt_header(request.env)
jwt_secret = config_utils.get_jwt_secret(request.env)
odoo_url = config_utils.get_base_or_odoo_url(request.env)
docbuilder_headers = {"Content-Type": "application/json", "Accept": "application/json"}
docbuilder_callback_url = f"{odoo_url}eurooffice/template/callback/docbuilder/fill_template?oo_security_token={oo_security_token}&record_ids={record_ids}&template_id={template_id}" # noqa: E501
docbuilder_payload = {"async": False, "url": docbuilder_callback_url}
logger.info("fill_template - docserver_url: %s", docserver_url)
logger.info("fill_template - jwt_enabled: %s", bool(jwt_secret))
if jwt_secret:
docbuilder_payload["token"] = jwt_utils.encode_payload(request.env, docbuilder_payload, jwt_secret)
docbuilder_headers[jwt_header] = "Bearer " + jwt_utils.encode_payload(
request.env, {"payload": docbuilder_payload}, jwt_secret
)
try:
if jwt_secret:
docbuilder_response = eurooffice_request(
url=docbuilder_url,
method="post",
opts={
"json": docbuilder_payload,
"headers": docbuilder_headers,
},
)
else:
docbuilder_response = eurooffice_request(
url=docbuilder_url,
method="post",
opts={
"json": docbuilder_payload,
},
)
docbuilder_json = docbuilder_response.json()
if docbuilder_json.get("error"):
e = self.get_docbuilder_error(docbuilder_json.get("error"))
logger.warning("fill_template - docbuilder error: %s", e)
raise Exception(e)
urls = docbuilder_json.get("urls")
logger.info("fill_template - success, got %s URLs", len(urls) if urls else 0)
return urls
except Exception as e:
logger.warning("fill_template - error: %s", str(e))
raise
@http.route("/eurooffice/template/callback/docbuilder/fill_template", auth="public")
def docbuilder_fill_template(self, oo_security_token, record_ids, template_id):
logger.info(
"GET /eurooffice/template/callback/docbuilder/fill_template - template: %s, records: %s",
template_id,
record_ids,
)
if not oo_security_token or not record_ids or not template_id:
logger.warning("oo_security_token or record_ids or template_id not found")
return request.not_found()
user = self.get_user_from_token(oo_security_token)
if not user:
logger.warning("user not found")
return request.not_found()
template = self.get_record("eurooffice.odoo.templates", template_id, user)
if not template:
logger.warning("template not found: %s", template_id)
return request.not_found()
attachment_id = template.attachment_id.id
if not attachment_id:
logger.warning("attachment_id of the template was not found")
return request.not_found()
model = template.template_model_model
if not model:
logger.warning("model of the template was not found")
return request.not_found()
try:
record_ids = [int(x) for x in record_ids.split(",")]
logger.info(
"GET /eurooffice/template/callback/docbuilder/fill_template - processing %s records", len(record_ids)
)
url = f"{config_utils.get_base_or_odoo_url(http.request.env)}eurooffice/template/download/{attachment_id}?oo_security_token={oo_security_token}" # noqa: E501
docbuilder_content = ""
docbuilder_script_content = ""
with file_open("eurooffice_odoo_templates/controllers/fill_template.docbuilder", "r") as f:
docbuilder_script_content = f.read()
keys = self.get_keys(attachment_id, oo_security_token)
logger.info(
"GET /eurooffice/template/callback/docbuilder/fill_template - got %s keys", len(keys) if keys else 0
)
for record_id in record_ids:
fields = self.get_fields(keys, model, record_id, user)
fields = json.dumps(fields, ensure_ascii=False)
docbuilder_content += f"""
builder.OpenFile("{url}");
var fields = {fields};
"""
docbuilder_content += docbuilder_script_content
record = self.get_record(model, record_id, user)
record_name = getattr(record, "display_name", getattr(record, "name", str(record_id)))
template_name = getattr(template, "display_name", getattr(template, "name", "Filled Template"))
filename = re.sub(r"[<>:'/\\|?*\x00-\x1f]", " ", f"{template_name} - {record_name}")
editable_form_fields = templates_config_utils.get_editable_form_fields(http.request.env)
if editable_form_fields:
docbuilder_content += f"""
builder.SaveFile("pdf", "{filename}.pdf", "<m_sJsonParams>{{&quot;isPrint&quot;:true}}</m_sJsonParams>")
builder.CloseFile();
""" # noqa: E501
else:
docbuilder_content += f"""
builder.SaveFile("pdf", "{filename}.pdf");
builder.CloseFile();
"""
headers = {
"Content-Disposition": "attachment; filename='fill_template.docbuilder'",
"Content-Type": "text/plain",
}
logger.info("GET /eurooffice/template/callback/docbuilder/fill_template - success")
return request.make_response(docbuilder_content, headers)
except Exception as e:
logger.warning(e)
return request.not_found()
def get_keys(self, attachment_id, oo_security_token):
logger.info("get_keys - attachment: %s", attachment_id)
docserver_url = config_utils.get_doc_server_public_url(request.env)
docserver_url = url_utils.replace_public_url_to_internal(request.env, docserver_url)
docbuilder_url = f"{docserver_url}docbuilder"
jwt_header = config_utils.get_jwt_header(request.env)
jwt_secret = config_utils.get_jwt_secret(request.env)
odoo_url = config_utils.get_base_or_odoo_url(request.env)
docbuilder_headers = {"Content-Type": "application/json", "Accept": "application/json"}
docbuilder_callback_url = f"{odoo_url}eurooffice/template/callback/docbuilder/get_keys?attachment_id={attachment_id}&oo_security_token={oo_security_token}" # noqa: E501
docbuilder_payload = {"async": False, "url": docbuilder_callback_url}
if jwt_secret:
docbuilder_payload["token"] = jwt_utils.encode_payload(request.env, docbuilder_payload, jwt_secret)
docbuilder_headers[jwt_header] = "Bearer " + jwt_utils.encode_payload(
request.env, {"payload": docbuilder_payload}, jwt_secret
)
try:
if jwt_secret:
docbuilder_response = eurooffice_request(
url=docbuilder_url,
method="post",
opts={
"json": docbuilder_payload,
"headers": docbuilder_headers,
},
)
else:
docbuilder_response = eurooffice_request(
url=docbuilder_url,
method="post",
opts={
"json": docbuilder_payload,
},
)
docbuilder_json = docbuilder_response.json()
if docbuilder_json.get("error"):
e = self.get_docbuilder_error(docbuilder_json.get("error"))
raise Exception(e)
urls = docbuilder_json.get("urls")
keys_url = urls.get("keys.txt")
keys_response = eurooffice_request(
url=keys_url,
method="get",
)
response_content = codecs.decode(keys_response.content, "utf-8-sig")
logger.info("get_keys - success")
return json.loads(response_content)
except Exception as e:
logger.warning("get_keys - error: %s", str(e))
raise
@http.route("/eurooffice/template/callback/docbuilder/get_keys", auth="public")
def docbuilder_get_keys(self, attachment_id, oo_security_token):
logger.info("GET /eurooffice/template/callback/docbuilder/get_keys - attachment: %s", attachment_id)
if not attachment_id or not oo_security_token:
logger.warning("attachment_id or oo_security_token not found")
return request.not_found()
url = f"{config_utils.get_base_or_odoo_url(http.request.env)}eurooffice/template/download/{attachment_id}?oo_security_token={oo_security_token}" # noqa: E501
docbuilder_content = f"""
builder.OpenFile("{url}");
"""
with file_open("eurooffice_odoo_templates/controllers/get_keys.docbuilder", "r") as f:
docbuilder_content = docbuilder_content + f.read()
headers = {
"Content-Disposition": "attachment; filename='get_keys.docbuilder'",
"Content-Type": "text/plain",
}
logger.info("GET /eurooffice/template/callback/docbuilder/get_keys - success")
return request.make_response(docbuilder_content, headers)
@http.route("/eurooffice/template/download/<int:attachment_id>", auth="public")
def download(self, attachment_id, oo_security_token):
logger.info("GET /eurooffice/template/download - attachment: %s", attachment_id)
if not attachment_id or not oo_security_token:
logger.warning("attachment_id or oo_security_token not found")
return request.not_found()
attachment = self.get_record("ir.attachment", attachment_id, self.get_user_from_token(oo_security_token))
if attachment:
content = base64.b64decode(attachment.datas)
headers = {
"Content-Type": "application/pdf",
"Content-Disposition": "attachment; filename=template.pdf",
}
logger.info("GET /eurooffice/template/download - success")
return request.make_response(content, headers)
else:
logger.warning("attachment not found: %s", attachment_id)
return request.not_found()
def get_fields(self, keys, model, record_id, user): # noqa: C901
logger.info("get_fields - model: %s, record: %s", model, record_id)
def convert_keys(input_list):
output_dict = {}
for item in input_list:
if " " in item:
keys = item.split(" ")
current_dict = output_dict
for key in keys[:-1]:
current_dict = current_dict.setdefault(key, {})
current_dict[keys[-1]] = None
else:
output_dict[item] = None
def dict_to_list(input_dict):
output_list = []
for key, value in input_dict.items():
if isinstance(value, dict):
output_list.append({key: dict_to_list(value)})
else:
output_list.append(key)
return output_list
return dict_to_list(output_dict)
def get_related_field(keys, model, record_id): # noqa: C901
result = {}
record = self.get_record(model, record_id, user)
if not record:
logger.warning("Record not found")
return
for field in keys:
try:
if isinstance(field, dict):
related_field = list(field.keys())[0]
if related_field not in record._fields:
continue
field_type = record._fields[related_field].type
related_keys = field[related_field]
if field_type in ["one2many", "many2many", "many2one"]:
related_model = record._fields[related_field].comodel_name
related_record_ids = record.read([related_field])[0][related_field]
if not related_record_ids:
continue
if field_type == "many2one" and isinstance(related_record_ids, tuple):
related_data = get_related_field(related_keys, related_model, related_record_ids[0])
else:
related_data = []
for record_id in related_record_ids:
related_data_temp = get_related_field(related_keys, related_model, record_id)
if related_data_temp:
related_data.append(related_data_temp)
if related_data:
result[related_field] = related_data
else:
if field not in record._fields:
continue
field_type = record._fields[field].type
data = record.read([field])[0][field]
if field_type in ["html", "json"]:
continue # TODO
elif field_type == "boolean":
result[field] = str(data).lower()
elif isinstance(data, tuple):
result[field] = str(data[1])
elif field_type == "binary" and isinstance(data, bytes):
img = re.search(r"'(.*?)'", str(data))
if img:
result[field] = img.group(1)
elif data:
if field_type in ["float", "integer", "char", "text"]:
result[field] = str(data)
elif field_type == "monetary":
data = f"{float(data):,.2f}"
currency_field_name = record._fields[field].currency_field
if currency_field_name:
currency = getattr(record, currency_field_name).name
result[field] = f"{data} {currency}" if currency else str(data)
else:
result[field] = str(data)
elif field_type == "date":
date_format = None
lang = request.env["res.lang"].search([("code", "=", user.lang)], limit=1)
user_date_format = lang.date_format
if user_date_format:
date_format = user_date_format
else:
date_format = get_lang(request.env).date_format
format_to_use = date_format or DEFAULT_SERVER_DATE_FORMAT
result[field] = str(data.strftime(format_to_use))
elif field_type == "datetime":
date_format = None
time_format = None
lang = request.env["res.lang"].search([("code", "=", user.lang)], limit=1)
user_date_format = lang.date_format
user_time_format = lang.time_format
if user_date_format and user_time_format:
date_format = user_date_format
time_format = user_time_format
else:
date_format = get_lang(request.env).date_format
time_format = get_lang(request.env).time_format
if date_format and time_format:
format_to_use = f"{date_format} {time_format}"
else:
format_to_use = DEFAULT_SERVER_DATETIME_FORMAT
result[field] = str(data.strftime(format_to_use))
elif field_type == "selection":
selection = record._fields[field].selection
if isinstance(selection, list):
result[field] = str(dict(selection).get(data))
else:
result[field] = str(data)
except Exception as e:
logger.warning(e)
continue
return result
keys = convert_keys(keys)
return get_related_field(keys, model, record_id)
def get_record(self, model, record_id, user=None):
logger.info("get_record - model: %s, record: %s", model, record_id)
if not isinstance(record_id, list):
record_id = [int(record_id)]
model = request.env[model].sudo()
context = {"lang": request.env.context.get("lang", "en_US")}
if user:
model = model.with_user(user)
context["lang"] = user.lang
context["uid"] = user.id
try:
return model.with_context(**context).browse(record_id).exists() # TODO: Add .sudo()
except Exception as e:
logger.warning(e)
raise
def get_user_from_token(self, token):
if not token:
raise Exception("missing security token")
user_id = jwt_utils.decode_token(request.env, token, config_utils.get_internal_jwt_secret(request.env))["id"]
user = request.env["res.users"].sudo().browse(user_id).exists().ensure_one()
logger.info("get_user_from_token - user: %s", user.name)
return user
def get_docbuilder_error(self, error_code):
docbuilder_messages = {
-1: "Unknown error.",
-2: "Generation timeout error.",
-3: "Document generation error.",
-4: "Error while downloading the document file to be generated.",
-6: "Error while accessing the document generation result database.",
-8: "Invalid token.",
}
return docbuilder_messages.get(error_code, "Error code not recognized.")

View file

@ -0,0 +1,370 @@
var oDocument = Api.GetDocument()
// As new elements appear when filling tables and lists, the total number of elements in the document increases,
// so we need to store references to elements, or increase the loop counter when traversing document elements.
var oDocumentElementsCount = oDocument.GetElementsCount()
var oDocumentElements = []
for (var i = 0; i < oDocumentElementsCount; i++) {
var oElement = oDocument.GetElement(i)
oDocumentElements.push(oElement)
}
oDocumentElements.forEach((oElement) => {
fillElementByType(oElement)
})
// From docs:
// 💡 Please note that the current paragraph must be in the document (not in the footer/header).
// And if the current paragraph is placed in a shape, then a caption is added after (or before) the parent shape.
// So, numbering in shapes and footer/header is not supported.
// fill header and footer
var oSection = oDocument.GetFinalSection()
var oHeader = oSection.GetHeader("default", true)
var oFooter = oSection.GetFooter("default", true)
var oHeaderElementsCount = oHeader.GetElementsCount()
var oFooterElementsCount = oFooter.GetElementsCount()
for (var i = 0; i < oHeaderElementsCount; i++) {
var oElement = oHeader.GetElement(i)
var oElementClassType = oElement.GetClassType()
if (oElementClassType === "paragraph" && oElement.GetNumbering()) {
continue
} else {
fillElementByType(oElement)
}
}
for (var i = 0; i < oFooterElementsCount; i++) {
var oElement = oFooter.GetElement(i)
var oElementClassType = oElement.GetClassType()
if (oElementClassType === "paragraph" && oElement.GetNumbering()) {
continue
} else {
fillElementByType(oElement)
}
}
// fill form in shapes object
var oShapes = oDocument.GetAllShapes()
oShapes.forEach((oShape) => {
var oShapesClassType = oShape.GetClassType()
if (oShapesClassType === "shape") {
var oShapeContent = oShape.GetDocContent()
try {
var oShapeContentClassType = oShapeContent.GetClassType()
if (oShapeContentClassType === "documentContent") {
var oShapeElementsCount = oShapeContent.GetElementsCount()
for (var i = 0; i < oShapeElementsCount; i++) {
var oElement = oShapeContent.GetElement(i)
var oElementClassType = oElement.GetClassType()
if (oElementClassType === "paragraph" && oElement.GetNumbering()) {
continue
} else {
fillElementByType(oElement)
}
}
}
} catch (_e) {}
}
})
function getData(keyPath, index = 0, obj = fields) {
const keys = keyPath.split(" ")
// Recursive function to traverse the object and get the desired value(s)
function traverse(obj, keys) {
if (keys.length === 0) return obj
let key = keys[0]
let remainingKeys = keys.slice(1)
if (Array.isArray(obj)) {
return obj.map((item) => traverse(item, [key, ...remainingKeys]))
} else {
if (typeof obj[key] === "undefined") {
return ""
}
return traverse(obj[key], remainingKeys)
}
}
// Get the value(s) from the object based on the keys
let values = traverse(obj, keys)
if (typeof values[index] === "undefined") {
return ""
}
if (Array.isArray(values[0])) {
// If the first element is an array, return a concatenated string of all values by key
return values[index].flat().join(" ")
} else if (Array.isArray(values) && typeof values[index] !== "object") {
// If values are an array, return the value at the specified index
return values[index]
} else {
// If the value is not an array, return it as is
return values
}
}
function getDataArrayLength(keyPath, obj = fields) {
const keys = keyPath.split(" ")
let currentObj = obj
for (let key of keys) {
if (typeof currentObj === "undefined") {
return 0
}
if (Array.isArray(currentObj)) {
return currentObj.length
}
currentObj = currentObj[key]
}
return 0
}
function fillElementByType(oElement) {
var oElementClassType = oElement.GetClassType()
if (oElementClassType === "paragraph") {
if (oElement.GetNumbering()) {
fillNumbering(oElement)
} else {
fillParagraph(oElement)
}
}
if (oElementClassType === "form" || oElementClassType === "textForm") {
fillForm(oElement)
}
if (oElementClassType === "run") {
}
if (oElementClassType === "table") {
fillTable(oElement)
}
if (oElementClassType === "pictureForm") {
fillForm(oElement)
}
}
function fillParagraph(oParagraph) {
var oParagraphElementsCount = oParagraph.GetElementsCount()
for (var i = 0; i < oParagraphElementsCount; i++) {
var oElement = oParagraph.GetElement(i)
fillElementByType(oElement)
}
}
function fillNumbering(oParagraph) {
var requiredLevel = 0
var oParagraphElementsCount = oParagraph.GetElementsCount()
for (var i = 0; i < oParagraphElementsCount; i++) {
var oElement = oParagraph.GetElement(i)
var oElementClassType = oElement.GetClassType()
if (oElementClassType === "form" || oElementClassType === "textForm" || oElementClassType === "pictureForm") {
var oForm = oElement
var oFormKey = oForm.GetFormKey()
var data = getData(oFormKey, 0)
var length = getDataArrayLength(oFormKey)
requiredLevel = Math.max(requiredLevel, length)
fillForm(oForm, data)
}
}
if (requiredLevel > 1) {
var oNumberingLevel = oParagraph.GetNumbering()
var oCurrentParagraph = oParagraph
for (var newLevel = 1; newLevel < requiredLevel; newLevel++) {
var nPos = oCurrentParagraph.GetPosInParent()
var oNewParagraph = oParagraph.Copy()
oNewParagraph.SetNumbering(oNumberingLevel)
var oParagraphElementsCount = oNewParagraph.GetElementsCount()
for (var element = 0; element < oParagraphElementsCount; element++) {
var oElement = oNewParagraph.GetElement(element)
var oElementClassType = oElement.GetClassType()
if (oElementClassType === "form" || oElementClassType === "textForm" || oElementClassType === "pictureForm") {
var oForm = oElement
var oFormKey = oForm.GetFormKey()
oForm.SetFormKey(oFormKey + newLevel)
var data = getData(oFormKey, newLevel)
fillForm(oForm, data)
}
}
oDocument.AddElement(nPos + 1, oNewParagraph)
oCurrentParagraph = oNewParagraph
}
}
}
function fillTable(oTable) {
var rows = oTable.GetRowsCount()
for (var row = 0; row < rows; row++) {
var oRow = oTable.GetRow(row)
var cols = oRow.GetCellsCount()
// If there is a form in the cell, then write the length of the array using the form key.
// Maximum length - the number of lines that must be inserted after the current row.
var requiredRows = 0
var tableData = {}
for (var col = 0; col < cols; col++) {
var oCell = oTable.GetCell(row, col)
var oCellContent = oCell.GetContent()
// Enum of paragraphs inside the cell
var oCellElementsCount = oCellContent.GetElementsCount()
for (var cellElement = 0; cellElement < oCellElementsCount; cellElement++) {
var oCellElement = oCellContent.GetElement(cellElement)
if (oCellElement.GetClassType() !== "paragraph") {
fillElementByType(oCellElement)
} else {
// Enum paragraph elements inside a cell
var oParagraphElementsCount = oCellElement.GetElementsCount()
for (var paragraphElement = 0; paragraphElement < oParagraphElementsCount; paragraphElement++) {
var oParagraphElement = oCellElement.GetElement(paragraphElement)
if (
oParagraphElement.GetClassType() !== "form" &&
oParagraphElement.GetClassType() !== "textForm" &&
oParagraphElement.GetClassType() !== "pictureForm"
) {
fillElementByType(oParagraphElement)
} else {
// Fill the first element and count the number of required rows
var oForm = oParagraphElement
var oFormKey = oForm.GetFormKey()
var data = getData(oFormKey, 0)
var length = getDataArrayLength(oFormKey)
requiredRows = Math.max(requiredRows, length)
fillForm(oForm, data)
}
}
}
}
}
if (requiredRows > 1) {
// Add new rows, the first row is already there and filled
// In each cell of the column we copy the previous cell to save the structure.
oTable.AddRows(oTable.GetCell(row, 0), requiredRows - 1, false)
for (var newRow = 1; newRow < requiredRows; newRow++) {
for (var col = 0; col < cols; col++) {
var oNewCell = oTable.GetCell(row + newRow, col)
var oCell = oTable.GetCell(row, col)
var oCellContent = oCell.GetContent()
var oCellElementsCount = oCellContent.GetElementsCount()
for (var i = 0; i < oCellElementsCount; i++) {
// Get the contents of the cell for further copying to a new cell
var oCellElement = oCellContent.GetElement(i)
// Copy the contents of a cell to paste into a new cell
var oNewCellElement = oCellElement.Copy()
// If this is not a paragraph, paste into a new cell unchanged
if (oCellElement.GetClassType() !== "paragraph") {
oNewCell.AddElement(i, oNewCellElement)
} else {
// If it is a paragraph, process the elements of the paragraph to fill the forms inside
var oParagraphElementsCount = oNewCellElement.GetElementsCount()
for (var paragraphElement = 0; paragraphElement < oParagraphElementsCount; paragraphElement++) {
var oNewParagraphElement = oNewCellElement.GetElement(paragraphElement)
if (
oNewParagraphElement.GetClassType() === "form" ||
oNewParagraphElement.GetClassType() === "textForm" ||
oNewParagraphElement.GetClassType() === "pictureForm"
) {
var oForm = oNewParagraphElement
var oFormKey = oForm.GetFormKey()
var data = getData(oFormKey, newRow)
fillForm(oForm, data)
}
}
oNewCell.AddElement(i, oNewCellElement)
}
}
// After creating a new cell, there is an empty paragraph inside. Remove it
var oNewCellContent = oNewCell.GetContent()
var oNewCellElementsCount = oNewCellContent.GetElementsCount()
oNewCellContent.RemoveElement(oNewCellElementsCount - 1)
}
}
rows += requiredRows - 1
row += requiredRows - 1
}
}
}
// In odoo, if there is no data in the field, the value will be false
function fillForm(oForm, data = null) {
var oFormFormType = oForm.GetFormType()
if (oFormFormType === "form" || oFormFormType === "textForm") {
function fillTextForm(data) {
data = String(data)
if (data === "false" || data === "undefined") {
oForm.SetText(" ")
} else {
oForm.SetText(data)
}
}
if (data === null) {
var oFormKey = oForm.GetFormKey()
data = getData(oFormKey)
fillTextForm(data)
} else {
fillTextForm(data)
}
}
if (oFormFormType === "comboBoxForm") {
}
if (oFormFormType === "dropDownForm") {
}
if (oFormFormType === "checkBoxForm") {
function fillCheckBoxForm(data) {
try {
data = JSON.parse(data)
oForm.SetChecked(data)
} catch (_e) {
// TODO: set checked BoxForm in case of error
}
}
if (data === null) {
var oFormKey = oForm.GetFormKey()
var data = getData(oFormKey)
fillCheckBoxForm(data)
} else {
fillCheckBoxForm(data)
}
}
if (oFormFormType === "radioButtonForm") {
}
if (oFormFormType === "pictureForm") {
function fillPictureForm(data) {
if (typeof data === "string") {
oForm.SetImage(`data:image/png;base64, ${data}`)
}
}
if (data === null) {
var oFormKey = oForm.GetFormKey()
data = getData(oFormKey)
fillPictureForm(data)
} else {
fillPictureForm(data)
}
}
}
Api.Save()

View file

@ -0,0 +1,19 @@
var oDocument = Api.GetDocument();
var aForms = oDocument.GetAllForms();
var sKeys = [];
aForms.forEach(aForm => {
sKeys.push(aForm.GetFormKey());
});
var json = JSON.stringify(sKeys);
GlobalVariable["json"] = json;
builder.CloseFile();
builder.CreateFile("docx");
var json = GlobalVariable["json"];
var oDocument = Api.GetDocument();
var oParagraph = oDocument.GetElement(0);
oParagraph.AddText(json);
oDocument.Push(oParagraph);
Api.Save();
builder.SaveFile("txt", "keys.txt");
builder.CloseFile();

View file

@ -0,0 +1,4 @@
<?xml version="1.0" ?>
<odoo>
<function model="eurooffice.odoo.templates" name="_create_demo_data" />
</odoo>

View file

@ -0,0 +1,33 @@
Prerequisites
=============
To be able to work with office files within Odoo Enterprise, you will need an instance of `Euro-Office Docs <https://www.eurooffice.com/download-docs.aspx>`_.
**Please note:** You need to obtain a license for Euro-Office Docs with the included Automation API option.
**Please note**: Euro-Office demo templates will only be added to the Odoo modules that are already installed. That's why we strongly recommend installing Euro-Office Templates after installing other Odoo modules such as CRM, Sales, Calendar, etc.
Euro-Office app configuration
============================
All the settings are configured from the `main Euro-Office app for Odoo <https://apps.odoo.com/apps/modules/16.0/eurooffice_odoo>`_.
To adjust the main app settings within your Odoo, go to *Home menu -> Settings -> Euro-Office*.
In the **Document Server Url**, specify the URL of the installed Euro-Office Docs or the address of Euro-Office Docs Cloud.
**Document Server JWT Secret**: JWT is enabled by default and the secret key is generated automatically to restrict the access to Euro-Office Docs. if you want to specify your own secret key in this field, also specify the same secret key in the Euro-Office Docs `config file <https://api.eurooffice.com/docs/docs-api/additional-api/signature/>`_ to enable the validation.
**Document Server JWT Header**: Standard JWT header used in Euro-Office is Authorization. In case this header is in conflict with your setup, you can change the header to the custom one.
In case your network configuration doesn't allow requests between the servers via public addresses, specify the Euro-Office Docs address for internal requests from the Odoo server and vice versa.
If you would like the editors to open in the same tab instead of a new one, check the corresponding setting "Open file in the same tab".
.. image:: settings.png
:width: 800
Contact us
============================
If you have any questions or suggestions regarding the Euro-Office app for Odoo, please let us know at `forum.eurooffice.com <https://forum.eurooffice.com>`_.

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View file

@ -0,0 +1,560 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-01 16:09+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ", select the desired Odoo module, and create or upload a PDF template with fillable fields."
msgstr ", wählen Sie das gewünschte Odoo-Modul aus und erstellen oder laden Sie eine PDF-Vorlage mit ausfüllbaren Feldern hoch."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr "<span class=\"o_form_label\">\n"
" Vorlagengalerie\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "Administrator"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "Sind Sie sicher, dass Sie diesen Datensatz löschen wollen?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "Anhang"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Kann Euro-Office-Vorlagen zur Ansicht öffnen und diese ausdrucken."
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Kann Euro-Office-Vorlagen öffnen, erstellen, bearbeiten und ausdrucken."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "Abbrechen"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Check templates you want to export to the Euro-Office Templates module and press Export. You can do this as many times as you need."
msgstr "Markieren Sie die Vorlagen, die Sie in das Modul Euro-Office Templates exportieren möchten, und klicken Sie auf Exportieren. Sie können dies beliebig oft wiederholen."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr "Wählen Sie das <span class=\"fw-bolder\">Odoo-Modul</span>\n"
" (z. B. Mitarbeiter, Rechnung, Kundenauftrag), mit dem die Vorlage verknüpft werden soll. Das gewählte\n"
" Modul definiert die für das automatische Ausfüllen des Formulars verfügbaren Datenfelder."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "Wählen Sie das nachstehende Feld, um den ausgewählten Parameter an der Cursorposition einzufügen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Wählen Sie die gewünschte Vorlage zum Ausfüllen mit Odoo-Daten aus."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "Klicken Sie auf die Schaltfläche Aktion."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigurationseinstellungen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "Das Feld konnte nicht eingefügt werden. Bitte prüfen Sie die Automatisierungs-API."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "Erstellen oder Hochladen"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "Vorlage erstellen"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "Erstellt von"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "Erstellt am"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "Löschen"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "Formularfelder nach dem Drucken des PDF-Formulars deaktivieren"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "Anzeigename"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "Herunterladen"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "Dropdown-Menü"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "Bearbeiten"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "Exportieren"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "Vorlagen in das Modul Euro-Office Templates exportieren"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "Konvertiertes PDF-Formular konnte nicht heruntergeladen werden"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "Das Herunterladen des Formulars ist fehlgeschlagen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "Felder"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr "Formularfelder können nicht manuell ausgefüllt werden, wenn sie nicht automatisch\n"
" mit Daten aus Odoo ausgefüllt wurden"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "Gehen Sie zum entsprechenden Odoo-Modul (z.B. Verkäufe, Rechnungen)."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "Gruppieren nach"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "Hilfe"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "Dateifeld ausblenden"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr "Wenn Sie bereits eine <span class=\"fw-bolder\">vorbereitete\n"
" PDF-Datei</span> mit ausfüllbaren Feldern haben, können Sie diese hier hochladen"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "Ungültiges Dateiformat."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "Kanban: keine Aktion für Typ: "
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "Zuletzt geändert am"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "Zuletzt aktualisiert von"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "Zuletzt aktualisiert am"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "Vorlagen werden geladen..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from the selected\n"
" Odoo model."
msgstr "Suchen Sie Ihre neu erstellte Vorlage und richten Sie die Verbindungen zwischen den Formularfeldern\n"
" im Euro-Office-Editor und den entsprechenden Datenfeldern aus dem ausgewählten\n"
" Odoo-Modell ein."
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "Vorlagen verwalten"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "Vorlagen verwalten"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetyp"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "Modell"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "Modellbeschreibung"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "Modell, für das die Vorlage erstellt werden soll."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "Modul/Sektion"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "Keine Übereinstimmung gefunden."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Euro-Office Demo-Vorlagen"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Euro-Office-Vorlagen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Euro-Office Vorlagenmodul"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "Euro-Office kann nicht erreicht werden. Bitte wenden Sie sich an den Administrator."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Euro-Office-Logo"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Euro-Office-Vorlagen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "OK"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "On this page, you can create form templates for any Odoo module, such as Invoice, Receipt, Employee Leave Form, etc. Just click"
msgstr "Auf dieser Seite können Sie Formularvorlagen für jedes Odoo-Modul erstellen, z. B. Rechnung, Quittung, Urlaubsformular usw. Klicken Sie einfach auf"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "Nachdem Sie die Vorlage gespeichert haben, kehren Sie zur Euro-Office-Vorlagenliste zurück."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "Dokumentvorlagen öffnen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "Datensatz öffnen."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "Drücken Sie die Schaltfläche Drucken."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "Vorschau"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "Drucken"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "Aus Vorlage drucken"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Mit Euro-Office drucken"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "Modell auswählen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Wählen Sie „Mit Euro-Office drucken“."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr "Wählen Sie eine vorhandene Vorlage aus. Lassen Sie das Feld leer, um eine leere Vorlage zu erstellen."
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "Ausgewählte Vorlagen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "Unterfelder anzeigen"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "Vorlagenname"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "Erstellung der Vorlage"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "Vorlage gelöscht"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "Hochladen der Vorlage"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr "Mit dem Euro-Office-Vorlagenmodul können Sie ausfüllbare PDF-Dateien erstellen, verwalten und verwenden."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "This will generate a PDF document with your template, automatically filled with the corresponding record's data."
msgstr "Dadurch wird ein PDF-Dokument mit Ihrer Vorlage generiert, das automatisch mit den entsprechenden Datensatzdaten gefüllt wird."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "So füllen Sie eine Vorlage mit Odoo-Daten aus:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "Vorhandene Vorlage hochladen"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "Einen technischen Namen verwenden"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name </span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr "Verwenden Sie dieses Formular, um eine neue ausfüllbare PDF-Vorlage\n"
" für Ihre Odoo-Module zu erstellen. Geben Sie zunächst einen <span class=\"fw-bolder\">Namen</span>\n"
" für Ihre Vorlage ein, um sie später in der Euro-Office-Vorlagenliste leicht zu identifizieren."
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "Benutzer"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "You don't have any templates yet. Please go to the Euro-Office Templates app to create a new template or ask your admin to create it."
msgstr "Sie haben noch keine Vorlagen. Bitte gehen Sie zur Euro-Office-Vorlagen-App, um eine neue Vorlage zu erstellen oder bitten Sie Ihren Administrator, sie zu erstellen."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be filled in automatically with real-time data from your Odoo system — no manual input needed."
msgstr "für jedes installierte Odoo-Modul (z. B. Vertrieb, Rechnungsstellung, CRM). Diese Vorlagen können dann automatisch mit Echtzeitdaten aus Ihrem Odoo-System ausgefüllt werden keine manuelle Eingabe erforderlich."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "Vorlagen"

View file

@ -0,0 +1,583 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20250909\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-29 05:15+0000\n"
"PO-Revision-Date: 2025-09-29 05:15+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with "
"fillable fields."
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
#, python-format
msgid "Cancel"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and "
"press Export. You can do this as many times as you need."
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__create_uid
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__create_date
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__display_name
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__id
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates____last_update
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__write_uid
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__write_date
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from the selected\n"
" Odoo model."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_related_name
msgid "Model Description"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Module/ section"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Euro-Office Templates"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as "
"Invoice, Receipt, Employee Leave Form, etc. Just click"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Once you've saved the template, return to the Euro-Office Templates list."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/list/eurooffice_list_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Select an existing template. Leave the field blank to create a blank "
"template."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"The Euro-Office Templates module allows you to create, manage, and use "
"fillable PDF"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled "
"with the corresponding record's data."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr ""
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name </span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app "
"to create a new template or ask your admin to create it."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates"
" can then be filled in automatically with real-time data from your Odoo "
"system — no manual input needed."
msgstr ""
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr ""

View file

@ -0,0 +1,611 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-01 16:37+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with fillable "
"fields."
msgstr ""
", seleccione el módulo Odoo deseado y cree o cargue una plantilla PDF con campos "
"rellenables."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
"<span class=\"o_form_label\">\n"
" Galería de plantillas\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "Administrador"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "¿Está seguro de que desea eliminar este registro?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "Archivo adjunto"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Puede abrir las plantillas de Euro-Office para verlas e imprimirlas."
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Puede abrir, crear, editar e imprimir plantillas de Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "Cancelar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and press Export. "
"You can do this as many times as you need."
msgstr ""
"Marque las plantillas que quiere exportar al módulo Plantillas de Euro-Office y pulse "
"Exportar. Puede hacerlo tantas veces como necesite."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked "
"to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
"Elija el <span class=\"fw-bolder\">módulo Odoo </span>\n"
" (por ejemplo, Empleado, Facturas, Pedido de venta) al que se vinculará la "
"plantilla. El modelo elegido\n"
" define los campos de datos disponibles para el rellenado automático del "
"formulario."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "Elija el campo siguiente para pegar el parámetro seleccionado en el cursor"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Elija la plantilla requerida para rellenarla con los datos de Odoo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "Haga clic en el botón Acción."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes de configuración"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "No se ha podido insertar el campo. Por favor, compruebe la API de automatización."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "Crear o subir"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "Crear plantilla"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "Creado"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "Eliminar"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "Desactivar los campos del formulario después de imprimir el formulario PDF"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "Mostrar nombre"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "Descargar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "Menú desplegable"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "Editar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "Exportar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "Exportar plantillas al módulo Plantillas de Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "No se ha podido descargar el formulario PDF convertido"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "No se ha podido descargar el formulario"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "Campos"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
"Los campos del formulario no se pueden rellenar manualmente si no se han rellenado "
"automáticamente\n"
" con datos de Odoo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "Vaya al módulo Odoo correspondiente (por ejemplo, Ventas, Facturas)."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "Agrupar por"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "Ayuda"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "Ocultar campo de archivo"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
"Si ya tiene un <span class=\"fw-bolder\">archivo PDF preparado\n"
" </span> con campos rellenables, puede cargarlo aquí."
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "Formato de archivo no válido."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "Kanban: ninguna acción para el tipo:  "
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "Última modificación"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "Última actualización"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "Cargando plantillas..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from "
"the selected\n"
" Odoo model."
msgstr ""
"Localice la plantilla recién creada y configure las conexiones entre los campos del "
"formulario\n"
" en el editor Euro-Office y los campos de datos correspondientes del "
"modelo Odoo\n"
" seleccionado."
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "Gestionar plantillas"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "Gestionar plantillas"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Tipo Mime"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "Modelo"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "Descripción del modelo"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "Modelo para el que se está creando la plantilla."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "Módulo/ sección"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "No se ha encontrado ninguna coincidencia."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Demostración de Euro-Office Templates"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Plantillas de Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Módulo Euro-Office Templates"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr ""
"No se puede acceder a Euro-Office. Por favor, póngase en contacto con el administrador."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Logotipo de Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Plantillas de Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "OK"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as Invoice, "
"Receipt, Employee Leave Form, etc. Just click"
msgstr ""
"En esta página, puede crear plantillas de formularios para cualquier módulo Odoo, como "
"Facturas, Recibo, Formulario de baja laboral, etc. Solo tiene que hacer clic en"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "Una vez guardada la plantilla, vuelva a la lista de plantillas de Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "Abrir plantillas de documento"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "Abrir un registro."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "Pulse el botón Imprimir."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "Vista previa"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "Imprimir"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "Imprimir desde plantilla"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Imprimir con Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "Seleccionar modelo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Seleccione Imprimir con Euro-Office."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr ""
"Seleccione una plantilla existente. Deje el campo en blanco para crear una \"plantilla\" "
"en blanco."
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "Plantillas seleccionadas"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "Mostrar subcampos"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "Nombre de la plantilla"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "Creación de la plantilla"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "Plantilla eliminada"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "Carga de plantillas"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr ""
"El módulo Euro-Office Templates le permite crear, gestionar y utilizar archivos PDF "
"rellenables"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled with the "
"corresponding record's data."
msgstr ""
"Esto generará un documento PDF con su plantilla, rellenado automáticamente con los datos "
"del registro correspondiente."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "Para rellenar una plantilla con datos de Odoo:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "Cargar una plantilla existente"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "Utilizar un nombre técnico"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name "
"</span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
"Utilice este formulario para crear una nueva plantilla PDF rellenable\n"
" para sus módulos Odoo. Comience introduciendo un <span class=\"fw-"
"bolder\">nombre </span> para\n"
" su plantilla, de modo que pueda identificarla fácilmente más adelante en "
"la lista de plantillas de Euro-Office."
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "Usuario"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a "
"new template or ask your admin to create it."
msgstr ""
"Todavía no tiene plantillas. Por favor, acceda a la aplicación Plantillas de Euro-Office "
"para crear una plantilla nueva o pida a su administrador que la cree."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be "
"filled in automatically with real-time data from your Odoo system — no manual input "
"needed."
msgstr ""
"para cualquier módulo Odoo instalado (por ejemplo, Ventas, Facturas, CRM). Estas "
"plantillas se pueden rellenar automáticamente con datos en tiempo real de su sistema "
"Odoo, sin necesidad de introducirlos manualmente."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "plantillas"

View file

@ -0,0 +1,609 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-01 16:44+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with fillable "
"fields."
msgstr ""
", sélectionnez le module Odoo souhaité et créez ou téléchargez un modèle PDF avec des "
"champs à remplir."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
"<span class=\"o_form_label\">\n"
" Galerie de modèles\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "Administrateur"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "Souhaitez-vous vraiment supprimer cet enregistrement ?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "Pièce jointe"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Peut ouvrir des modèles Euro-Office pour les afficher et les imprimer."
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Peut ouvrir, créer, éditer et imprimer des modèles Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "Annuler"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and press Export. "
"You can do this as many times as you need."
msgstr ""
"Cochez les modèles que vous souhaitez exporter vers le module Euro-Office Templates et "
"cliquez sur Exporter. Vous pouvez effectuer cette opération autant de fois que "
"nécessaire."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked "
"to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
"Choisissez le <span class=\"fw-bolder\">module Odoo </span>\n"
" (par ex. Employés, Facturation, Commande client) auquel le modèle sera "
"lié. Le modèle choisi\n"
" définit les champs de données disponibles pour le remplissage automatique "
"du formulaire."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "Sélectionnez la zone ci-dessous pour coller le paramètre sélectionné au curseur"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Choisissez le modèle requis à remplir avec les données Odoo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "Cliquez sur le bouton Action."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de configuration"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "Impossible d'insérer le champ. Veuillez vérifier l'API d'automatisation."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "Créer ou télécharger"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "Créer un modèle"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "Créé le"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "Supprimer"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "Désactiver les champs du formulaire après l'impression du formulaire PDF"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "Afficher le nom"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "Télécharger"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "Menu déroulant"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "Modifier"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "Exporter"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "Exporter des modèles vers le module Euro-Office Templates"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "Échec du téléchargement du formulaire PDF converti"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "Échec du téléchargement du formulaire"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "Champs"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
"Les champs du formulaire ne peuvent pas être remplis manuellement s'ils n'ont pas été "
"remplis automatiquement\n"
" avec les données d'Odoo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "Accédez au module Odoo concerné (par ex. Ventes, Facturation)."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "Groupe par"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "Aide"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "Masquer le champ Fichier"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
"Si vous disposez déjà d'un <span class=\"fw-bolder\">fichier PDF\n"
" prêt</span> avec des champs à remplir, vous pouvez le télécharger ici"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "Format de fichier non valide."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "Kanban : aucune action pour le type : "
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "Chargement des modèles..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from "
"the selected\n"
" Odoo model."
msgstr ""
"Localisez votre modèle nouvellement créé et configurez les connexions entre les champs "
"du formulaire\n"
" dans l'éditeur Euro-Office et les champs de données correspondants du "
"modèle\n"
" Odoo sélectionné."
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "Gérer les modèles"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "Gérer les modèles"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetype"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "Modèle"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "Description du modèle"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "Modèle pour lequel le formulaire est créé."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "Module/ section"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "Aucune correspondance trouvée."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Modèles de démonstration de Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Modèles Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Module Euro-Office Templates"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "Euro-Office n'est pas joignable. Veuillez contacter l'administration."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Logo Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Modèles Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "OK"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as Invoice, "
"Receipt, Employee Leave Form, etc. Just click"
msgstr ""
"Sur cette page, vous pouvez créer des modèles de formulaires pour tout module Odoo, par "
"exemple, Facture, Reçu, Formulaire de congé employé, etc. Il suffit de cliquer"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "Une fois le modèle enregistré, retournez à la liste des modèles Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "Ouvrir les modèles de documents"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "Ouvrir un enregistrement."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "Appuyez sur le bouton Imprimer."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "Aperçu"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "Imprimer"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "Imprimer à partir du modèle"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Imprimer avec Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "Sélectionner un modèle"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Sélectionnez Imprimer avec Euro-Office."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr ""
"Sélectionnez un modèle existant. Laissez le champ vide pour créer un « modèle » vierge."
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "Modèles sélectionnés"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "Afficher les sous-champs"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "Nom du modèle"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "Création du modèle"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "Modèle supprimé"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "Chargement du modèle"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr ""
"Le module Euro-Office Templates vous permet de créer, gérer et utiliser des PDF à remplir"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled with the "
"corresponding record's data."
msgstr ""
"Cela générera un document PDF avec votre modèle, automatiquement rempli avec les données "
"de l'enregistrement correspondant."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "Pour remplir un modèle avec les données Odoo :"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "Charger un modèle existant"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "Utiliser un nom technique"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name "
"</span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
"Utilisez ce formulaire pour créer un nouveau modèle PDF\n"
" à remplir pour vos modules Odoo. Commencez par saisir un <span class=\"fw-"
"bolder\">nom </span> pour\n"
" votre modèle afin de l'identifier facilement plus tard dans la liste des "
"modèles Euro-Office."
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "Utilisateur"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a "
"new template or ask your admin to create it."
msgstr ""
"Vous n'avez pas encore de modèles. Veuillez vous rendre sur l'application Euro-Office "
"Templates pour créer un nouveau modèle ou demander à votre administrateur de le faire."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be "
"filled in automatically with real-time data from your Odoo system — no manual input "
"needed."
msgstr ""
"pour tout module Odoo installé (par ex. Ventes, Facturation, CRM). Ces modèles peuvent "
"ensuite être remplis automatiquement avec les données en temps réel de votre système "
"Odoo — aucune saisie manuelle nécessaire."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "modèles"

View file

@ -0,0 +1,557 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-02 20:38+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: it_IT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ", select the desired Odoo module, and create or upload a PDF template with fillable fields."
msgstr ", seleziona il modulo Odoo desiderato e crea o carica un modello PDF con campi compilabili."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr "<span class=\"o_form_label\">\n"
" Galleria modelli\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "Amministratore"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "Sei sicuro di voler eliminare questo record?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "Allegato"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Può aprire i modelli di Euro-Office per visualizzarli e stamparli."
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Può aprire, creare, modificare e stampare modelli di Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "Annulla"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Check templates you want to export to the Euro-Office Templates module and press Export. You can do this as many times as you need."
msgstr "Seleziona i modelli che desideri esportare nel modulo Euro-Office Templates e clicca su Esporta. Puoi ripetere questa operazione tutte le volte che vuoi."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr "Scegli il <span class=\"fw-bolder\">modulo Odoo</span>\n"
"(ad es., Dipendente, Fattura, Ordine di vendita) a cui il modello sarà collegato. Il modello scelto\n"
"definisce i campi dati disponibili per la compilazione automatica del modulo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "Scegli il campo sottostante per incollare il parametro selezionato nel cursore"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Scegli il modello richiesto da compilare con i dati di Odoo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "Fai clic sul pulsante Azione."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni di configurazione"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "Impossibile inserire il campo. Controlla l'API di automazione."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "Crea o carica"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "Crea modello"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "Creato il"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "Elimina"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "Disabilita i campi del modulo dopo la stampa del PDF"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "Visualizza nome"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "Scarica"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "Menu a discesa"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "Modifica"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "Esporta"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "Esporta i modelli nel modulo Euro-Office Templates"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "Impossibile scaricare il PDF convertito"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "Impossibile scaricare il modulo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "Campi"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr "I campi del modulo non possono essere compilati manualmente se non sono stati compilati automaticamente\n"
" con i dati provenienti da Odoo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "Vai al modulo Odoo corrispondente (ad es., Vendite, Fatture)."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "Raggruppa per"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "Aiuto"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "Nascondi campo file"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr "Se hai già un <span class=\"fw-bolder\">file PDF preparato\n"
" con campi compilabili</span>, puoi caricarlo qui"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "Formato file non valido."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "Kanban: nessuna azione per tipo: "
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "Ultima modifica effettuata il"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento effettuato da"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento effettuato il"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "Caricamento dei modelli in corso..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from the selected\n"
" Odoo model."
msgstr ""
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "Gestisci modelli"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "Gestisci modelli"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetype"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "Modello"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "Descrizione del modello"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "Modulo per il quale viene creato il modello."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "Modulo/sezione"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "Nessuna corrispondeza trovata."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Modelli demo di Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Modelli Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Modulo modelli Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "Impossibile raggiungere Euro-Office. Si prega di contattare l'amministratore."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Logo Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Modelli di Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "OK"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "On this page, you can create form templates for any Odoo module, such as Invoice, Receipt, Employee Leave Form, etc. Just click"
msgstr "In questa pagina puoi creare modelli di modulo per qualsiasi modulo Odoo, come Fattura, Ricevuta, Modulo ferie dipendente, ecc. Basta fare clic"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "Una volta salvato il modello, torna allelenco dei modelli di Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "Apri modelli di documento"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "Apri un record."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "Premi il pulsante Stampa."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "Anteprima"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "Stampa"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "Stampa da modello"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Stampa con Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "Seleziona modello"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Seleziona Stampa con Euro-Office."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr "Seleziona un modello esistente. Lascia il campo vuoto per creare un \"modello\" vuoto."
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "Modelli selezionati"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "Mostra sotto-campi"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "Nome del modello"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "Creazione del modello"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "Modello eliminato"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "Caricamento del modello"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr "Il modulo Modelli di Euro-Office consente di creare, gestire e usare PDF compilabili"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "This will generate a PDF document with your template, automatically filled with the corresponding record's data."
msgstr "Questo genererà un documento PDF con il tuo modello, compilato automaticamente con i dati del record corrispondente."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "Per compilare un modello con i dati di Odoo:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "Carica un modello esistente"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "Usa un nome tecnico"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name </span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr "Usa questo modulo per creare un nuovo modello PDF compilabile\n"
" per i tuoi moduli Odoo. Inizia inserendo un <span class=\"fw-bolder\">nome</span> per\n"
" il tuo modello, così da identificarlo facilmente in seguito nellelenco dei modelli di Euro-Office."
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "Utente"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "You don't have any templates yet. Please go to the Euro-Office Templates app to create a new template or ask your admin to create it."
msgstr "Non hai ancora alcun modello. Vai all'app Modelli di Euro-Office per creare un nuovo modello o chiedi al tuo amministratore di crearlo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be filled in automatically with real-time data from your Odoo system — no manual input needed."
msgstr "per qualsiasi modulo Odoo installato (ad es., Vendite, Fatturazione, CRM). Questi modelli possono poi essere compilati automaticamente con i dati in tempo reale dal tuo sistema Odoo, senza necessità di inserimento manuale."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "modelli"

View file

@ -0,0 +1,595 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-11-14 11:15+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with fillable "
"fields."
msgstr ""
"必要なOdooモジュールを選択し、入力可能フィールド付きPDFテンプレートを作成またはアップロー"
"ドしてください。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
"<span class=\"o_form_label\">\n"
" テンプレートギャラリー\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "管理者"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "本当にこのレコードを削除しますか?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "添付ファイル"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Euro-Officeテンプレートを開いて閲覧・印刷できます。"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Euro-Officeテンプレートを開き、作成、編集、印刷することができます。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "キャンセル"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and press Export. "
"You can do this as many times as you need."
msgstr ""
"エクスポートしたいテンプレートを 「Euro-Officeテンプレート」モジュールで選択し、「エクス"
"ポート」をクリックします。この操作は必要な回数だけ繰り返すことができます。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked "
"to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
"テンプレートを紐づける <span class=\"fw-bolder\">Odooモジュール </span>\n"
" (例:従業員、請求書、販売注文)を選択します。\n"
" 選択したモデルにより、自動入力に使用できるデータフィールドが定義されます。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "選択したパラメータをカーソルに貼り付けるには、下のフィールドを選択してください"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Odooデータで入力するテンプレートを選択します。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "アクションボタンをクリックします。"
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "設定"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "フィールドを挿入できません。Automation APIを確認してください。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "作成またはアップロード"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "テンプレートの作成"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "作成者"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "作成日"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "削除"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "PDFフォーム印刷後にフォームフィールドを無効化"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "表示名"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "ダウンロード"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "ドロップダウンメニュー"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "編集"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "エクスポート"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "テンプレートを「Euro-Officeテンプレート」モジュールにエクスポートします。"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "変換済みPDFフォームのダウンロードに失敗しました"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "フォームのダウンロードに失敗しました"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "フィールド"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
"Odooのデータで自動入力されなかったフィールドは、\n"
" 手動で入力できません"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "該当するOdooモジュール販売、請求に移動します。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "グループ分け"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "ヘルプ"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "ファイルフィールドを非表示"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
"入力可能フィールド付きの <span class=\"fw-bolder\">準備済み\n"
" PDFファイル</span> がある場合は、ここにアップロードできます"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "無効なファイル形式です。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "カンバン:タイプに対するアクションがありません:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "最終編集日"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "最終更新したユーザー"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "最終更新日"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "テンプレートを読み込み中..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from "
"the selected\n"
" Odoo model."
msgstr ""
"作成したテンプレートを開き、\n"
" Euro-Officeエディター内のフォームフィールドと選択した\n"
" Odooモデルの対応フィールドを接続します。"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "テンプレートの管理"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "テンプレートの管理"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetype"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "OK"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as Invoice, "
"Receipt, Employee Leave Form, etc. Just click"
msgstr ""
"このページでは、請求書、領収書、休暇申請など、任意のOdooモジュール用にフォームテンプレー"
"トを作成できます。クリックして開始してください。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "テンプレートを保存したら、Euro-Officeテンプレートリストに戻ります。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "ドキュメントテンプレートを開く"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "レコードを開きます。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "印刷ボタンを押します。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "プレビュー"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "モデル"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "モデルの説明"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "テンプレートが作成されるモデル。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "モジュール/セクション"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "一致しているものはありません"
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Euro-Officeデモテンプレート"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Euro-Officeテンプレート"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "Euro-Officeにアクセスできません。管理者にご連絡ください。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Euro-Officeロゴ"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Euro-Officeテンプレート"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "印刷"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "テンプレートから印刷"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Euro-Officeで印刷"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "モデルを選択"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Euro-Officeで印刷を選択します。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr ""
"既存のテンプレートを選択してください。空白の「テンプレート」を作成するには、フィールドを"
"空白のままにしてください。"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "選択されたテンプレート"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "サブフィールドを表示"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "テンプレート名"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "テンプレート作成"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "テンプレートが削除されました"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "テンプレートがアップロードされています"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr "Euro-Officeテンプレートモジュールでは、入力可能なPDFの作成、管理、利用が可能です"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled with the "
"corresponding record's data."
msgstr ""
"これにより、テンプレートに基づいたPDF文書が生成され、対応するレコードのデータが自動的に入"
"力されます。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "テンプレートにOdooデータを入力する手順"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "既存のテンプレートをアップロード"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "技術的な名称を使用"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name "
"</span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
"このフォームを使用して、\n"
" Odooモジュール用の新しい入力可能PDFテンプレートを作成します。まずテンプレー"
"トに <span class=\"fw-bolder\">名前</span> を付け、\n"
" Euro-Officeテンプレート一覧で識別しやすくします。"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "ユーザー"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a "
"new template or ask your admin to create it."
msgstr ""
"まだテンプレートがありません。Euro-Officeテンプレートアプリから新しいテンプレートを作成す"
"るか、管理者に作成を依頼してください。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be "
"filled in automatically with real-time data from your Odoo system — no manual input "
"needed."
msgstr ""
"インストール済みのOdooモジュール販売、請求書発行、CRM向けに用意されています。これ"
"らのテンプレートには、Odooシステムからのリアルタイムデータが自動的に入力されるため、手動"
"入力は不要です。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "テンプレート"

View file

@ -0,0 +1,606 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-01 16:58+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with fillable "
"fields."
msgstr ""
", selecione o módulo Odoo desejado e crie ou carregue um modelo em PDF com campos "
"preenchíveis."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
"<span class=\"o_form_label\">\n"
" Galeria de templates\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "Administrador"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "Tem certeza de que deseja excluir este registro?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "Anexo"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Pode abrir modelos do Euro-Office para visualizá-los e imprimi-los."
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Pode abrir, criar, editar e imprimir modelos do Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "Cancelar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and press Export. "
"You can do this as many times as you need."
msgstr ""
"Marque os templates que deseja exportar para o módulo de modelos do Euro-Office e clique "
"em Exportar. Você pode fazer isso quantas vezes precisar."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked "
"to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
"Escolha o <span class=\"fw-bolder\">módulo Odoo</span>\n"
" (por exemplo, Funcionário, Fatura, Pedido de Venda) ao qual o modelo será "
"vinculado. O modelo escolhido\n"
" define os campos de dados disponíveis para preenchimento automático do "
"formulário."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "Escolha o campo abaixo para colar o parâmetro selecionado no cursor"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Escolha o modelo desejado para preencher com os dados do Odoo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "Clique no botão Ação."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "Configurações"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "Não foi possível inserir o campo. Verifique a API de automação."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "Criar ou fazer upload"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "Criar modelo"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "Criado por"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "Criado em"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "Excluir"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "Desabilite os campos do formulário após imprimir o formulário em PDF"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "Nome de exibição"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "Baixar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "Menu suspenso"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "Editar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "Exportar"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "Exportar templates para o módulo de templates do Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "Falha ao baixar o formulário em PDF convertido"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "Falha ao baixar o formulário"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "Campos"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
"Os campos do formulário não podem ser preenchidos manualmente se não foram preenchidos\n"
" automaticamente com dados do Odoo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "Acesse o módulo Odoo relevante (por exemplo, Vendas, Faturas)."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "Agrupar por"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "Ajuda"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "Ocultar Campo de Arquivo"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
"Se você já possui um <span class=\"fw-bolder\">arquivo\n"
"PDF</span> preparado com campos preenchíveis, pode enviá-lo aqui"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "Formato de arquivo inválido."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "Kanban: nenhuma ação para o tipo: "
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "Última modificação em"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "Última atualização por"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "Última atualização em"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "Carregando templates..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from "
"the selected\n"
" Odoo model."
msgstr ""
"Localize o modelo recém-criado e configure as conexões entre os campos do formulário\n"
" no editor Euro-Office e os campos de dados correspondentes do modelo "
"Odoo\n"
" selecionado."
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "Gerenciar templates"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "Gerenciar templates"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetype"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "Modelo"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "Descrição do modelo"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "Modelo para o qual o modelo está sendo criado."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "Módulo/seção"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "Nenhuma correspondência encontrada."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Templates de demonstração do Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Modelos Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Módulo de Modelos do Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "Euro-Office não pode ser alcançado. Entre em contato com o administrador."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Logotipo do Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Modelos Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "ОК"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as Invoice, "
"Receipt, Employee Leave Form, etc. Just click"
msgstr ""
"Nesta página, você pode criar modelos de formulário para qualquer módulo do Odoo, como "
"Fatura, Recibo, Formulário de Licença de Funcionário, etc. Basta clicar em"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "Após salvar o modelo, retorne à lista de Modelos do Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "Abrir Modelos de Documentos"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "Abra um registro."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "Pressione o botão Imprimir."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "Visualizar"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "Imprimir"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "Imprimir a partir do modelo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Imprimir com Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "Selecione o modelo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Selecione Imprimir com o Euro-Office."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr ""
"Selecione um modelo existente. Deixe o campo em branco para criar um \"modelo\" em "
"branco."
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "Templates selecionados"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "Mostrar subcampos"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "Nome do modelo"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "Criação de modelo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "Modelo removido"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "Carregamento de modelo"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr "O módulo de Modelos do Euro-Office permite criar, gerenciar e usar PDF preenchível."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled with the "
"corresponding record's data."
msgstr ""
"Isso gerará um documento PDF com o seu modelo, preenchido automaticamente com os dados "
"do registro correspondente."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "Para preencher um modelo com dados do Odoo:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "Carregar um modelo existente"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "Usar um nome técnico"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name "
"</span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
"Use este formulário para criar um novo modelo de PDF\n"
" preenchível para seus módulos do Odoo. Comece inserindo um <span "
"class=\"fw-bolder\">nome</span> para\n"
" o seu modelo para identificá-lo facilmente mais tarde na lista de Modelos "
"do Euro-Office."
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "Do utilizador"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a "
"new template or ask your admin to create it."
msgstr ""
"Você ainda não tem nenhum modelo. Acesse o aplicativo Euro-Office Templates para criar um "
"novo modelo ou peça ao seu administrador para criá-lo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be "
"filled in automatically with real-time data from your Odoo system — no manual input "
"needed."
msgstr ""
"para qualquer módulo Odoo instalado (por exemplo, Vendas, Faturamento, CRM). Esses "
"modelos podem ser preenchidos automaticamente com dados em tempo real do seu sistema "
"Odoo — sem necessidade de entrada manual."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "modelos"

View file

@ -0,0 +1,603 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-02 20:51+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && "
"(n%100<12 || n%100>14) ? 1 : 2);\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with fillable "
"fields."
msgstr ""
", выберите нужный модуль Odoo, создайте или загрузите PDF-шаблон с заполняемыми полями."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
"<span class=\"o_form_label\">\n"
" Галерея шаблонов\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "Администратор"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "Вы уверены, что хотите удалить эту запись?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "Вложение"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "Вы можете открыть шаблоны Euro-Office для просмотра и распечатать их."
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "Вы можете открывать, создавать, редактировать и распечатывать шаблоны Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "Отменить"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and press Export. "
"You can do this as many times as you need."
msgstr ""
"Отметьте шаблоны, которые вы хотите экспортировать в модуль шаблонов Euro-Office, и "
"нажмите «Экспортировать». Вы можете сделать это столько раз, сколько необходимо."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked "
"to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
"Выберите <span class=\"fw-bolder\">модуль Odoo</span>\n"
" (например, Сотрудники, Выставление счетов, Продажи), с которым будет "
"связан шаблон. Выбранная\n"
" модель определяет поля данных, доступные для автоматического заполнения "
"формы."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "Выберите поле ниже, чтобы вставить выбранный параметр"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "Выберите нужный шаблон для заполнения данными Odoo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "Нажмите кнопку «Действие»."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "Настройки конфигурации"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "Не удалось вставить поле. Проверьте API автоматизации."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "Создать или загрузить"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "Создать шаблон"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "Создано"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "Дата создания:"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "Удалить"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "Отключить поля формы после печати PDF-формы"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "Отображаемое имя"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "Скачать"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "Выпадающее меню"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "Редактировать"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "Экспортировать"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "Экспортировать шаблоны в модуль шаблонов Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "Не удалось загрузить сконвертированную PDF-форму"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "Не удалось загрузить форму"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "Поля"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
"Нельзя заполнить поля формы вручную, если они не были автоматически заполнены\n"
" данными из Odoo."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "Перейдите в соответствующий модуль Odoo (например, Продажи, Выставление счетов)."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "Группировать по"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "Помощь"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "Скрыть поле файла"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
"Если у вас уже есть <span class=\"fw-bolder\">готовый\n"
" PDF-файл</span> с заполняемыми полями, вы можете загрузить его здесь"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "Неверный формат файла."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "Канбан: нет действий для типа: "
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "Дата последнего изменения:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "Последнее обновление"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "Дата последнего обновления:"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "Загрузка шаблонов..."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from "
"the selected\n"
" Odoo model."
msgstr ""
"Найдите вновь созданный шаблон и настройте связи между полями\n"
" формы в редакторе Euro-Office и соответствующими полями данных из "
"выбранной\n"
" модели Odoo."
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "Управление шаблонами"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "Управление шаблонами"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetype"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "Модель"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "Описание модели"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "Модель, для которой был создан шаблон."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "Модуль / раздел"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "Совпадения не найдены."
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Демо-шаблоны Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Шаблоны Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Модуль «Шаблоны Euro-Office»"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "Приложение Euro-Office недоступно. Пожалуйста, свяжитесь с администратором."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Логотип Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Шаблоны Euro-Office"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "OK"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as Invoice, "
"Receipt, Employee Leave Form, etc. Just click"
msgstr ""
"На этой странице вы можете создать шаблоны форм для любого модуля Odoo, например: "
"Выставление счетов, Чеки, Отпуска и так далее. Просто нажмите"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "После сохранения шаблона вернитесь к списку шаблонов Euro-Office."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "Открыть шаблоны документов"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "Открыть запись."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "Нажмите кнопку «Печать»."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "Предварительный просмотр"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "Печать"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "Распечатать из шаблона"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "Распечатать с помощью Euro-Office"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "Выбрать модель"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "Выберите «Печать с помощью Euro-Office»."
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr "Выберите существующий шаблон. Оставьте поле пустым, чтобы создать пустой шаблон."
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "Выбранные шаблоны"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "Показать дополнительные поля"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "Имя шаблона"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "Создание шаблона"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "Шаблон удален"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "Загрузка шаблона"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr "Модуль «Шаблоны Euro-Office» позволяет создавать, использовать заполняемые PDF-"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled with the "
"corresponding record's data."
msgstr ""
"Будет создан PDF-документ с вашим шаблоном, автоматически заполненный данными "
"соответствующей записи."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "Чтобы заполнить шаблон данными Odoo:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "Загрузить существующий шаблон"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "Использовать техническое имя"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name "
"</span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
"Используйте эту форму для создания нового заполняемого PDF-шаблона\n"
" для ваших модулей Odoo. Начните с ввода <span class=\"fw-bolder\">имени</"
"span>\n"
" вашего шаблона, чтобы его было проще найти в списке шаблонов Euro-Office."
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "Пользователь"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a "
"new template or ask your admin to create it."
msgstr ""
"У вас пока нет шаблонов. Перейдите в приложение Шаблоны Euro-Office, чтобы создать новый "
"шаблон, или попросите администратора создать его."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be "
"filled in automatically with real-time data from your Odoo system — no manual input "
"needed."
msgstr ""
"для любого установленного модуля Odoo и управлять ими (например, Продажи, Выставление "
"счетов, CRM). Эти шаблоны можно затем автоматически заполнять данными из вашей системы "
"Odoo в режиме реального времени — ввод данных вручную не требуется."
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "шаблоны"

View file

@ -0,0 +1,590 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * eurooffice_odoo_templates
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20240216\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-03 08:20+0000\n"
"PO-Revision-Date: 2025-10-02 20:45+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 3.4.1\n"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
", select the desired Odoo module, and create or upload a PDF template with fillable "
"fields."
msgstr ",选择所需的 Odoo 模块,并创建或上传带有可填写字段的 PDF 模板。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">\n"
" Templates gallery\n"
" </span>"
msgstr ""
"<span class=\"o_form_label\">\n"
" 模板库\n"
" </span>"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Administrator"
msgstr "管理员"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Are you sure you want to delete this record?"
msgstr "您确实要删除该记录?"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__attachment_id
msgid "Attachment"
msgstr "附件"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "Can open Euro-Office templates for viewing and print them."
msgstr "打开 Euro-Office 模板进行查看和打印。"
#. module: eurooffice_odoo_templates
#: model:res.groups,comment:eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin
msgid "Can open, create, edit and print Euro-Office templates."
msgstr "打开、创建、编辑和打印 Euro-Office 模板。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Cancel"
msgstr "取消"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid ""
"Check templates you want to export to the Euro-Office Templates module and press Export. "
"You can do this as many times as you need."
msgstr ""
"要导出模板至 Euro-Office 模板模块,请勾选然后点击“导出”。您可以根据需求多次执行此操作。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Choose the <span class=\"fw-bolder\">Odoo module </span>\n"
" (e.g., Employee, Invoice, Sales Order) that the template will be linked "
"to. The chosen\n"
" model defines the data fields available for automatic form filling."
msgstr ""
"选择 <span class=\"fw-bolder\"> Odoo 模块</span>\n"
" (例如,员工、发票、销售),模板将与该模块关联。\n"
" 所选模块定义了可用于自动填写的字段。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Choose the field below to paste selected parameter to the cursor"
msgstr "选择以下字段将选定的参数粘贴到光标处"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Choose the required template to fill in with Odoo data."
msgstr "选择要用 Odoo 数据填写的模板。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Click on the Action button."
msgstr "点击“操作”按钮。"
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_res_config_settings
msgid "Config Settings"
msgstr "配置设置"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.js:0
#, python-format
msgid "Couldn't insert the field. Please check Automation API."
msgstr "无法插入字段,请检查自动化 API。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Create or Upload"
msgstr "创建或上传"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Create template"
msgstr "创建模板"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_uid
msgid "Created by"
msgstr "创建者"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__create_date
msgid "Created on"
msgstr "创建于"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Delete"
msgstr "删除"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_res_config_settings__editable_form_fields
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Disable form fields after printing PDF form"
msgstr "打印 PDF 表单后禁用表单字段"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Download"
msgstr "下载"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Dropdown menu"
msgstr "下拉菜单"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban
msgid "Edit"
msgstr "编辑"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_demo_templates_form
msgid "Export"
msgstr "导出"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Export templates to the Euro-Office Templates module"
msgstr "导出模板至 Euro-Office 模板模块"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download converted PDF form"
msgstr "下载转换后的 PDF 表单失败"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Failed to download form"
msgstr "下载表单失败"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Fields"
msgstr "字段"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid ""
"Form fields cannot be filled in manually if they were not automatically filled in\n"
" with data from Odoo"
msgstr ""
"如果字段没有通过 Odoo 数据自动填写,\n"
" 则无法手动填写。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Go to the relevant Odoo module (e.g., Sales, Invoices)."
msgstr "进入相关的 Odoo 模块(例如,销售、发票)。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Group By"
msgstr "分组依据"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.js:0
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Help"
msgstr "帮助"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__hide_file_field
msgid "Hide File Field"
msgstr "隐藏“文件”字段"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__id
msgid "ID"
msgstr "ID"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"If you already have a <span class=\"fw-bolder\">prepared\n"
" PDF file</span> with fillable fields, you can upload it here"
msgstr ""
"如果您已有带有可填写字段的 <span class=\"fw-bolder\">PDF 文件</span>,可以在此上传。"
#. module: eurooffice_odoo_templates
#. odoo-python
#: code:addons/eurooffice_odoo_templates/models/eurooffice_odoo_templates.py:0
#, python-format
msgid "Invalid file format."
msgstr "文件格式无效。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Kanban: no action for type: "
msgstr "看板:无操作类型:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates____last_update
msgid "Last Modified on"
msgstr "上次修改日期"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_uid
msgid "Last Updated by"
msgstr "上次更新者"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__write_date
msgid "Last Updated on"
msgstr "上次更新日期"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/widget/eurooffice_templates_tree.xml:0
#, python-format
msgid "Loading templates..."
msgstr "正在加载模板…"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Locate your newly created template and set up the connections between the form\n"
" fields in the Euro-Office editor and the corresponding data fields from "
"the selected\n"
" Odoo model."
msgstr ""
"找到新建的模板,并在 \n"
" Euro-Office 编辑器中将表单字段与所选 \n"
" Odoo 模块中的数据字段建立连接。"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_demo_templates
msgid "Manage Templates"
msgstr "管理模板"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.res_config_settings_view_form
msgid "Manage templates"
msgstr "管理模板"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__mimetype
msgid "Mimetype"
msgstr "Mimetype"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_model
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_kanban_search
msgid "Model"
msgstr "类型"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_name
msgid "Model Description"
msgstr "类型描述"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Model for which the template is being created."
msgstr "正在为其创建模板的类型。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Module/ section"
msgstr "模块/部分"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "No match found."
msgstr "未找到匹配项"
#. module: eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_demo_templates
msgid "Euro-Office Demo Templates"
msgstr "Euro-Office 示例模板"
#. module: eurooffice_odoo_templates
#: model:ir.actions.act_window,name:eurooffice_odoo_templates.action_eurooffice_odoo_templates
#: model:ir.model,name:eurooffice_odoo_templates.model_eurooffice_odoo_templates
#: model:ir.ui.menu,name:eurooffice_odoo_templates.eurooffice_menu
msgid "Euro-Office Templates"
msgstr "Euro-Office 模板"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Euro-Office Templates module"
msgstr "Euro-Office 模板模块"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office cannot be reached. Please contact admin."
msgstr "无法访问 Euro-Office。请联系管理员。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor.xml:0
#, python-format
msgid "Euro-Office logo"
msgstr "Euro-Office logo"
#. module: eurooffice_odoo_templates
#: model:ir.module.category,name:eurooffice_odoo_templates.module_category_eurooffice_odoo_templates
msgid "Euro-Office templates"
msgstr "Euro-Office 模板"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Ok"
msgstr "好的"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"On this page, you can create form templates for any Odoo module, such as Invoice, "
"Receipt, Employee Leave Form, etc. Just click"
msgstr ""
"在此页面,您可以为任何 Odoo 模块(如发票、收据、员工请假单等)创建表单模板。只需点击"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Once you've saved the template, return to the Euro-Office Templates list."
msgstr "保存模板后,返回 Euro-Office 模板列表。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_controller.xml:0
#, python-format
msgid "Open Document templates"
msgstr "打开文档模板"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Open a record."
msgstr "打开记录。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Press the Print button."
msgstr "点击打印按钮。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Preview"
msgstr "预览"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.xml:0
#, python-format
msgid "Print"
msgstr "打印"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid "Print from template"
msgstr "从模板打印"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/form/eurooffice_form_view.js:0
#, python-format
msgid "Print with Euro-Office"
msgstr "使用 Euro-Office 打印"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__template_model_id
msgid "Select Model"
msgstr "选择类型"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "Select Print with Euro-Office."
msgstr "选择使用 Euro-Office 打印。"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Select an existing template. Leave the field blank to create a blank template."
msgstr "选择现有模板。保留字段空白以创建空白模板"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_demo_templates__selected_templates
msgid "Selected Templates"
msgstr "已选模板"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Show sub-fields"
msgstr "显示子字段"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__name
msgid "Template Name"
msgstr "模板名称"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template creation"
msgstr "模板创建"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_kanban_record.js:0
#, python-format
msgid "Template removed"
msgstr "模板已移除"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid "Template uploading"
msgstr "模板上传"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "The Euro-Office Templates module allows you to create, manage, and use fillable PDF"
msgstr "Euro-Office 模板模块允许您创建、管理并使用可填写的 PDF"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"This will generate a PDF document with your template, automatically filled with the "
"corresponding record's data."
msgstr "这将根据您的模板生成一份 PDF 文档,并自动填充相应记录的数据。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "To fill in a template with Odoo data:"
msgstr "用 Odoo 数据填写模板:"
#. module: eurooffice_odoo_templates
#: model:ir.model.fields,field_description:eurooffice_odoo_templates.field_eurooffice_odoo_templates__file
msgid "Upload an existing template"
msgstr "上传现有模板"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/editor/eurooffice_editor_export_data.xml:0
#, python-format
msgid "Use a technical name"
msgstr "使用技术名称"
#. module: eurooffice_odoo_templates
#: model_terms:ir.ui.view,arch_db:eurooffice_odoo_templates.view_eurooffice_form
msgid ""
"Use this form to create a new fillable PDF template\n"
" for your Odoo modules. Start by entering a <span class=\"fw-bolder\">name "
"</span> for\n"
" your template to easily identify it later in the Euro-Office Templates list."
msgstr ""
"使用此表单为您的 \n"
" Odoo 模块创建新的可填写 PDF 模板。首先输入模板的<span class=\"fw-bolder\">"
"名称</span>\n"
" 以便之后在 Euro-Office 模板列表中轻松找到它。"
#. module: eurooffice_odoo_templates
#: model:res.groups,name:eurooffice_odoo_templates.group_eurooffice_odoo_templates_user
msgid "User"
msgstr "用户"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/dialog/eurooffice_dialog.js:0
#, python-format
msgid ""
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a "
"new template or ask your admin to create it."
msgstr "您还没有任何模板。请进入 Euro-Office 模板应用创建新模板,或让管理员创建。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid ""
"for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be "
"filled in automatically with real-time data from your Odoo system — no manual input "
"needed."
msgstr ""
"适用于任意已安装的 Odoo 模块如销售、发票、CRM 等)。这些模板可以自动填充 Odoo 系统的实"
"时数据,无需手动输入。"
#. module: eurooffice_odoo_templates
#. odoo-javascript
#: code:addons/eurooffice_odoo_templates/static/src/views/kanban/eurooffice_dialog_help.xml:0
#, python-format
msgid "templates"
msgstr "模板,"

View file

@ -0,0 +1,3 @@
from . import eurooffice_odoo_templates
from . import eurooffice_odoo_demo_templates
from . import res_config_settings

View file

@ -0,0 +1,105 @@
import base64
import json
import logging
import os
from odoo import api, fields, models
from odoo.modules import get_module_path
_logger = logging.getLogger(__name__)
class EuroOfficeDemoTemplate(models.Model):
_name = "eurooffice.odoo.demo.templates"
_description = "Euro-Office Demo Templates"
selected_templates = fields.Text(string="Selected Templates")
def _get_template_structure(self):
templates_dir = self._get_templates_dir()
structure = {}
for root, _dirs, files in os.walk(templates_dir):
if files:
model = os.path.basename(root)
model_exists = bool(self.env["ir.model"].search([("model", "=", model)], limit=1))
if not model_exists:
continue
name = self._get_model_name(model)
rel_path = os.path.relpath(root, templates_dir)
structure[model] = {
"model": model,
"name": name,
"files": [
{
"name": f,
"path": os.path.join(rel_path, f) if rel_path != "." else f,
}
for f in files
],
}
return structure
def _get_model_name(self, model_name):
model = self.env["ir.model"].search([("model", "=", model_name)], limit=1)
return model.name if model else model_name
def _get_templates_dir(self):
module_path = get_module_path(self._module)
return os.path.join(module_path, "data", "templates")
@api.model
def get_template_data(self):
structure = self._get_template_structure()
selected = json.loads(self.selected_templates or "[]")
return {"structure": structure, "selected": selected}
def action_save(self):
selected_templates = json.loads(self.selected_templates or "[]")
if len(selected_templates) == 0:
return
templates_dir = self._get_templates_dir()
template_model = self.env["eurooffice.odoo.templates"]
for template_path in selected_templates:
model_name, filename = template_path.split("/")
full_path = os.path.join(templates_dir, template_path)
try:
with open(full_path, "rb") as f:
template_data = base64.b64encode(f.read())
model = self.env["ir.model"].search([("model", "=", model_name)], limit=1)
if not model:
continue
template_model.create(
{
"name": os.path.splitext(filename)[0],
"template_model_id": model.id,
"file": template_data,
"mimetype": "application/pdf",
}
)
except Exception as e:
_logger.error("Failed to process template %s: %s", template_path, str(e))
continue
return {
"type": "ir.actions.client",
"tag": "soft_reload",
}
def get_template_content(self, template_path):
templates_dir = self._get_templates_dir()
file_path = os.path.join(templates_dir, template_path)
with open(file_path, "rb") as f:
return f.read()

View file

@ -0,0 +1,344 @@
import base64
import json
import logging
import os
import time
from odoo import _, api, fields, models, tools
from odoo.exceptions import UserError
from odoo.modules import get_module_path
from odoo.addons.eurooffice_odoo.controllers.controllers import eurooffice_request
from odoo.addons.eurooffice_odoo.utils import config_utils, file_utils, jwt_utils, url_utils
from odoo.addons.eurooffice_odoo_templates.utils import pdf_utils
logger = logging.getLogger(__name__)
class EuroOfficeTemplate(models.Model):
_name = "eurooffice.odoo.templates"
_description = "Euro-Office Templates"
name = fields.Char(required=True, string="Template Name")
template_model_id = fields.Many2one("ir.model", string="Select Model")
template_model_name = fields.Char(string="Model Description", compute="_compute_template_model_fields", store=True)
template_model_related_name = fields.Char("Model Description", related="template_model_id.name")
template_model_model = fields.Char(string=" ", compute="_compute_template_model_fields", store=True)
file = fields.Binary(string="Upload an existing template")
hide_file_field = fields.Boolean(string="Hide File Field", default=False)
attachment_id = fields.Many2one("ir.attachment", readonly=True)
mimetype = fields.Char(default="application/pdf")
@api.onchange("name")
def _onchange_name(self):
if self.attachment_id:
self.attachment_id.name = self.name + ".pdf"
self.attachment_id.display_name = self.name
@api.depends("template_model_id")
def _compute_template_model_fields(self):
for record in self:
if record.template_model_id:
record.template_model_name = record.template_model_id.name
record.template_model_model = record.template_model_id.model
else:
record.template_model_name = False
record.template_model_model = False
@api.onchange("file")
def _onchange_file(self):
if self.file and self.create_date: # if file exist
decode_file = base64.b64decode(self.file)
is_pdf_form = pdf_utils.is_pdf_form(decode_file)
old_datas = self.attachment_id.datas
self.attachment_id.write({"datas": self.file})
self.file = False
if not is_pdf_form:
self.env.cr.commit()
converted_result = self._convert_to_form(self.attachment_id)
if converted_result.get("error"):
self.attachment_id.write({"datas": old_datas})
self.env.cr.commit()
raise UserError(converted_result.get("message"))
if converted_result.get("fileUrl"):
try:
response = eurooffice_request(
url=converted_result["fileUrl"],
method="get",
)
new_datas = base64.b64encode(response.content)
self.attachment_id.write({"datas": new_datas})
self.env.cr.commit()
except Exception as e:
logger.error("Failed to download and update PDF form: %s", str(e))
self.attachment_id.write({"datas": old_datas})
self.env.cr.commit()
raise UserError(_("Failed to download converted PDF form")) from e
@api.model
def _create_demo_data(self):
module_path = get_module_path(self._module)
templates_dir = os.path.join(module_path, "data", "templates")
if not os.path.exists(templates_dir):
return
model_folders = [name for name in os.listdir(templates_dir) if os.path.isdir(os.path.join(templates_dir, name))]
installed_models = self.env["ir.model"].search([])
installed_models_list = [(model.model, model.name) for model in installed_models]
for model_name in model_folders:
if any(model_name == model[0] for model in installed_models_list):
templates_path = os.path.join(templates_dir, model_name)
templates_name = [
name
for name in os.listdir(templates_path)
if os.path.isfile(os.path.join(templates_path, name)) and name.lower().endswith(".pdf")
]
for template_name in templates_name:
template_path = os.path.join(templates_path, template_name)
template = open(template_path, "rb")
try:
template_data = template.read()
template_data = base64.encodebytes(template_data)
model = self.env["ir.model"].search([("model", "=", model_name)], limit=1)
name = template_name.rstrip(".pdf")
self.create(
{
"name": name,
"template_model_id": model.id,
"file": template_data,
}
)
finally:
template.close()
return
@api.model
def create(self, vals):
url = self._context.get("url", None)
if isinstance(url, str) and url.startswith(("http://", "https://")) and url.endswith(".pdf"):
try:
response = eurooffice_request(
url=url,
method="get",
)
file_content = response.content
vals["file"] = base64.b64encode(file_content)
except Exception as e:
raise UserError(_("Failed to download form")) from e
is_pdf_form = None
if "file" in vals and vals["file"]:
try:
decode_file = base64.b64decode(vals["file"])
is_pdf_form = pdf_utils.is_pdf_form(decode_file)
except Exception as e:
raise UserError(_("Invalid file format.")) from e
else:
vals["file"] = base64.encodebytes(file_utils.get_default_file_template(self.env.user.lang, "pdf"))
is_pdf_form = True
model = self.env["ir.model"].search([("id", "=", vals["template_model_id"])], limit=1)
vals["template_model_name"] = model.name
vals["template_model_model"] = model.model
vals["mimetype"] = file_utils.get_mime_by_ext("pdf")
datas = vals.pop("file")
vals.pop("hide_file_field", None)
vals.pop("datas", None)
record = super().create(
{
"name": vals.get("name", "New Template"),
"template_model_id": vals.get("template_model_id"),
"mimetype": vals.get("mimetype", "application/pdf"),
"template_model_name": vals.get("template_model_name", ""),
"template_model_model": vals.get("template_model_model", ""),
}
)
attachment = self.env["ir.attachment"].create(
{
"name": vals.get("name", record.name) + ".pdf",
"display_name": vals.get("name", record.name),
"mimetype": vals.get("mimetype"),
"datas": datas,
"res_model": self._name,
"res_id": record.id,
}
)
record.attachment_id = attachment.id
if not is_pdf_form:
self.env.cr.commit()
converted_result = self._convert_to_form(attachment)
if converted_result.get("error"):
attachment.unlink()
record.unlink()
super().unlink()
self.env.cr.commit()
raise UserError(converted_result.get("message"))
if converted_result.get("fileUrl"):
try:
response = eurooffice_request(
url=converted_result["fileUrl"],
method="get",
)
new_datas = base64.b64encode(response.content)
attachment.write({"datas": new_datas, "mimetype": vals.get("mimetype")})
self.env.cr.commit()
except Exception as e:
logger.error("Failed to download and update PDF form: %s", str(e))
attachment.unlink()
record.unlink()
super().unlink()
self.env.cr.commit()
raise UserError(_("Failed to download converted PDF form")) from e
return record
@api.model
def _convert_to_form(self, attachment):
jwt_header = config_utils.get_jwt_header(self.env)
jwt_secret = config_utils.get_jwt_secret(self.env)
docserver_url = config_utils.get_doc_server_public_url(self.env)
docserver_url = url_utils.replace_public_url_to_internal(self.env, docserver_url)
odoo_url = config_utils.get_base_or_odoo_url(self.env)
internal_jwt_secret = config_utils.get_internal_jwt_secret(self.env)
oo_security_token = jwt_utils.encode_payload(self.env, {"id": self.env.user.id}, internal_jwt_secret)
oo_security_token = (
oo_security_token.decode("utf-8") if isinstance(oo_security_token, bytes) else oo_security_token
)
conversion_url = os.path.join(docserver_url, "ConvertService.ashx")
payload = {
"url": f"{odoo_url}eurooffice/template/download/{attachment.id}?oo_security_token={oo_security_token}",
"key": int(time.time()),
"filetype": "pdf",
"outputtype": "pdf",
"pdf": {
"form": True,
},
}
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
}
if bool(jwt_secret):
payload = {"payload": payload}
token = jwt_utils.encode_payload(self.env, payload, jwt_secret)
headers[jwt_header] = "Bearer " + token
payload["token"] = token
try:
response = eurooffice_request(
url=conversion_url,
method="get",
opts={
"data": json.dumps(payload),
"headers": headers,
},
)
if response.status_code == 200:
response_json = response.json()
if "error" in response_json:
return {
"error": response_json.get("error"),
"message": self._get_conversion_error_message(response_json.get("error")),
}
else:
return response_json
else:
return {
"error": response.status_code,
"message": f"Document conversion service returned status {response.status_code}",
}
except Exception:
return {
"error": 1,
"message": "Document conversion service cannot be reached",
}
def _get_conversion_error_message(self, error_code):
error_dictionary = {
-1: "Unknown error",
-2: "Conversion timeout error",
-3: "Conversion error",
-4: "Error while downloading the document file to be converted",
-5: "Incorrect password",
-6: "Error while accessing the conversion result database",
-7: "Input error",
-8: "Invalid token",
}
try:
return error_dictionary[error_code]
except Exception:
return "Undefined error code"
@api.model
def get_fields_for_model(self, model, prefix="", parent_name="", exclude=None):
try:
m = self.env[model]
fields = m.fields_get()
except Exception:
return []
fields = sorted(fields.items(), key=lambda field: tools.ustr(field[1].get("string", "").lower()))
records = []
for field_name, field in fields:
if exclude and field_name in exclude:
continue
if field.get("type") in ("properties", "properties_definition", "html", "json"):
continue
if not field.get("exportable", True):
continue
ident = prefix + ("/" if prefix else "") + field_name
val = ident
name = parent_name + (parent_name and "/" or "") + field["string"]
record = {
"id": ident,
"string": name,
"value": val,
"children": False,
"field_type": field.get("type"),
"required": field.get("required"),
"relation_field": field.get("relation_field"),
}
records.append(record)
if len(ident.split("/")) < 4 and "relation" in field:
ref = field.pop("relation")
record["value"] += "/id"
record["params"] = {"model": ref, "prefix": ident, "name": name}
record["children"] = True
return records
@api.model
def update_relationship(self, template_model_id, model):
"""
If the module was uninstalled and reinstalled, its model id may have changed.
Update the model id in the template record
"""
if not template_model_id or not model:
return
model_id = self.sudo().env["ir.model"].search([("model", "=", model)]).id
if not model_id:
return
record = self.sudo().env["eurooffice.odoo.templates"].browse(template_model_id)
if not record:
return
if record.template_model_id != model_id:
record.template_model_id = model_id
return

View file

@ -0,0 +1,21 @@
from odoo import fields, models
from odoo.addons.eurooffice_odoo_templates.utils import config_utils
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
editable_form_fields = fields.Boolean("Disable form fields after printing PDF form")
def set_values(self):
res = super().set_values()
previous_disable_form_fields = config_utils.get_editable_form_fields(self.env)
if previous_disable_form_fields != self.editable_form_fields:
config_utils.set_editable_form_fields(self.env, self.editable_form_fields)
return res
def get_values(self):
res = super().get_values()
editable_form_fields = config_utils.get_editable_form_fields(self.env)
res.update(editable_form_fields=editable_form_fields)
return res

View file

@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View file

@ -0,0 +1,55 @@
<?xml version="1.0" ?>
<odoo>
<record id="module_category_eurooffice_odoo_templates" model="ir.module.category">
<field name="name">Euro-Office templates</field>
<field name="sequence">30</field>
</record>
<!-- User role with read-only access -->
<record id="group_eurooffice_odoo_templates_user" model="res.groups">
<field name="name">User</field>
<field name="category_id" ref="module_category_eurooffice_odoo_templates" />
<field name="comment">Can open Euro-Office templates for viewing and print them.</field>
</record>
<!-- Administrator role with full access -->
<record id="group_eurooffice_odoo_templates_admin" model="res.groups">
<field name="name">Administrator</field>
<field name="category_id" ref="module_category_eurooffice_odoo_templates" />
<field name="implied_ids" eval="[(4, ref('group_eurooffice_odoo_templates_user'))]" />
<field name="comment">Can open, create, edit and print Euro-Office templates.</field>
</record>
<record id="base.user_root" model="res.users">
<field name="groups_id" eval="[(4, ref('eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin'))]" />
</record>
<record id="base.default_user" model="res.users">
<field name="groups_id" eval="[(4, ref('eurooffice_odoo_templates.group_eurooffice_odoo_templates_user'))]" />
</record>
<record id="base.user_admin" model="res.users">
<field name="groups_id" eval="[(4, ref('eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin'))]" />
</record>
<!-- Access control rules -->
<record id="access_eurooffice_odoo_templates_user" model="ir.model.access">
<field name="name">User Access</field>
<field name="model_id" ref="eurooffice_odoo_templates.model_eurooffice_odoo_templates" />
<field name="group_id" ref="group_eurooffice_odoo_templates_user" />
<field name="perm_read" eval="1" />
<field name="perm_write" eval="0" />
<field name="perm_create" eval="0" />
<field name="perm_unlink" eval="0" />
</record>
<record id="access_eurooffice_odoo_templates_admin" model="ir.model.access">
<field name="name">Administrator Access</field>
<field name="model_id" ref="eurooffice_odoo_templates.model_eurooffice_odoo_templates" />
<field name="group_id" ref="group_eurooffice_odoo_templates_admin" />
<field name="perm_read" eval="1" />
<field name="perm_write" eval="1" />
<field name="perm_create" eval="1" />
<field name="perm_unlink" eval="1" />
</record>
</odoo>

View file

@ -0,0 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_eurooffice_odoo_templates_user,EuroOffice Template User Access,eurooffice_odoo_templates.model_eurooffice_odoo_templates,group_eurooffice_odoo_templates_user,1,0,0,0
access_eurooffice_odoo_templates_admin,EuroOffice Template Admin Access,eurooffice_odoo_templates.model_eurooffice_odoo_templates,group_eurooffice_odoo_templates_admin,1,1,1,1
access_eurooffice_odoo_templates,EuroOffice Template,eurooffice_odoo_templates.model_eurooffice_odoo_templates,,0,0,0,0
access_eurooffice_demo_templates,eurooffice.demo.templates.access,model_eurooffice_odoo_demo_templates,base.group_system,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_eurooffice_odoo_templates_user EuroOffice Template User Access eurooffice_odoo_templates.model_eurooffice_odoo_templates group_eurooffice_odoo_templates_user 1 0 0 0
3 access_eurooffice_odoo_templates_admin EuroOffice Template Admin Access eurooffice_odoo_templates.model_eurooffice_odoo_templates group_eurooffice_odoo_templates_admin 1 1 1 1
4 access_eurooffice_odoo_templates EuroOffice Template eurooffice_odoo_templates.model_eurooffice_odoo_templates 0 0 0 0
5 access_eurooffice_demo_templates eurooffice.demo.templates.access model_eurooffice_odoo_demo_templates base.group_system 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View file

@ -0,0 +1,23 @@
<svg width="144" height="144" viewBox="0 0 144 144" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1648_12465)">
<rect width="144" height="144" rx="8" fill="#F5F5F5"/>
<path opacity="0.12" d="M24.6858 31.8856L41 119L96.5 119L117 109L123.419 112.105L43.3679 192.46L-46.2607 102.831L24.6858 31.8856Z" fill="#808080"/>
<path d="M25 34C25 32.3431 26.3431 31 28 31H37V113H28C26.3431 113 25 111.657 25 110V34Z" fill="white"/>
<path d="M47 31H28C26.3431 31 25 32.3431 25 34V110C25 111.657 26.3431 113 28 113H47" stroke="#666666" stroke-width="4" stroke-linecap="round"/>
<path d="M37 30C37 28.3431 38.3431 27 40 27H83.5882L109 52.0909V116C109 117.657 107.657 119 106 119H40C38.3431 119 37 117.657 37 116V30Z" fill="white"/>
<path d="M78.1765 117H40C38.3431 117 37 115.657 37 114V30C37 28.3431 38.3431 27 40 27H82.2941L107 51.5455V76.0909" stroke="#666666" stroke-width="4" stroke-linecap="round"/>
<path d="M82.2856 26.7429L106.971 51.4286H85.2856C83.6288 51.4286 82.2856 50.0855 82.2856 48.4286V26.7429Z" fill="#666666"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M102.602 120.161L87.3729 113.121C86.0756 112.507 86.0756 111.557 87.3729 110.998L92.6747 108.54L102.545 113.121C103.843 113.736 105.929 113.736 107.17 113.121L117.041 108.54L122.343 110.998C123.64 111.613 123.64 112.562 122.343 113.121L107.114 120.161C105.929 120.72 103.843 120.72 102.602 120.161Z" fill="#FF6F3D"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M102.602 111.501L87.3729 104.461C86.0756 103.846 86.0756 102.896 87.3729 102.338L92.5619 99.9351L102.602 104.573C103.899 105.187 105.986 105.187 107.227 104.573L117.266 99.9351L122.456 102.338C123.753 102.952 123.753 103.902 122.456 104.461L107.227 111.501C105.929 112.115 103.843 112.115 102.602 111.501Z" fill="#95C038"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M102.602 103.064L87.3729 96.024C86.0756 95.4094 86.0756 94.4596 87.3729 93.9008L102.602 86.8609C103.899 86.2463 105.986 86.2463 107.227 86.8609L122.456 93.9008C123.753 94.5154 123.753 95.4653 122.456 96.024L107.227 103.064C105.929 103.623 103.843 103.623 102.602 103.064Z" fill="#5DC0E8"/>
<path d="M78 66C78 64.8954 78.9514 64 80.125 64H92.875C94.0486 64 95 64.8954 95 66C95 67.1046 94.0486 68 92.875 68H80.125C78.9514 68 78 67.1046 78 66Z" fill="#666666"/>
<path d="M49 78C49 76.8954 49.9361 76 51.0909 76H92.9091C94.0639 76 95 76.8954 95 78C95 79.1046 94.0639 80 92.9091 80H51.0909C49.9361 80 49 79.1046 49 78Z" fill="#666666"/>
<path d="M49 90C49 88.8954 49.9253 88 51.0667 88H77.9333C79.0747 88 80 88.8954 80 90C80 91.1046 79.0747 92 77.9333 92H51.0667C49.9253 92 49 91.1046 49 90Z" fill="#666666"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M66 51H53V64H66V51ZM53.2 47C50.8804 47 49 48.8804 49 51.2V63.8C49 66.1196 50.8804 68 53.2 68H65.8C68.1196 68 70 66.1196 70 63.8V51.2C70 48.8804 68.1196 47 65.8 47H53.2Z" fill="#666666"/>
</g>
<defs>
<clipPath id="clip0_1648_12465">
<rect width="144" height="144" rx="8" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -0,0 +1,145 @@
<section class="oe_container">
<div class="oe_row oe_spaced">
<h2 class="oe_slogan">
Automate form creation with inserting fields from Odoo in templates
</h2>
<div class="oe_span12">
<span class="text-center">
<p class="oe_mt16">
Work with fillable templates in Odoo using Euro-Office. Create templates based
on the data and fields available in Odoo, fill them out and print with several
clicks.
</p>
</span>
</div>
</div>
</section>
<section class="oe_container mt-5">
<div class="oe_row">
<div class="oe_span12">
<h6>Edit the existing templates</h6>
</div>
<div class="oe_span12">
<p>
<b>Please note</b>: Euro-Office demo templates will only be added to the Odoo
modules that are already installed. That's why we strongly recommend installing
Euro-Office Templates after installing other Odoo modules such as CRM, Sales,
Calendar, etc.
</p>
<p>
Launch the Euro-Office Templates app to open the page with the existing form
templates. Each template has a tag indicating which Odoo module the template was
created for.
</p>
<p>
When you click the Edit button in the file context menu, a form template will
open in the Euro-Office editor. The left panel dynamically displays the fields
from Odoo that can be linked to the Euro-Office form fields. The Odoo field ID is
written in the Key field of the editor in the right panel.
</p>
</div>
<div class="oe_span12">
<div class="oe_demo oe_screenshot">
<img src="edit_templates.png" />
</div>
</div>
</div>
</section>
<section class="oe_container mt-5">
<div class="oe_row">
<div class="oe_span12">
<h6>Create new templates</h6>
</div>
<div class="oe_span12">
<p>
To create a new template, click the Create&Upload button. In the pop-up window,
specify the template name and select the Odoo module to which the template
belongs.
</p>
</div>
<div class="oe_span12">
<div class="oe_demo oe_screenshot">
<img src="create_templates.png" />
</div>
</div>
<div class="oe_span12">
<p class="oe_mt8">
You can upload any existing form template from your local drive (using the
Upload your file button), or save a new blank template (using the Create button
in the upper right corner).
</p>
</div>
</div>
</section>
<section class="oe_container mt-5">
<div class="oe_row">
<div class="oe_span12">
<h6>Work with ready templates</h6>
</div>
<div class="oe_span12">
<p>
Several standard templates are available when installing the Euro-Office Templates app, but certain Odoo modules
must be installed first. Without these modules, the templates won't appear in the Euro-Office Templates module.
After installing the required modules, you can export templates by navigating to Settings -> Euro-Office ->
Manage Templates. Select the templates you want in the pop-up window and click Export to add them to the
Euro-Office Templates module.
</p>
</div>
<div class="oe_span12">
<div class="oe_demo oe_screenshot">
<img src="work_with_templates.png" />
</div>
</div>
<div class="oe_span12">
<p class="oe_mt8">
Next, a window appears with a list of templates available for this section.
Select the required template so that it is filled with the data taken from the
linked Odoo page (deal, employee card, etc.).
</p>
</div>
<div class="oe_span12">
<p class="oe_mt8">
You can also preview the form template a user wants to fill out by clicking the Preview button in the form
templates list. This will display a preview of the template, but no data from Odoo will be included at this
stage.
</p>
</div>
<div class="oe_span12">
<p class="oe_mt8">
To print multiple records using a template, select the desired items in the list view, then click Action ->
Print with Euro-Office. In the pop-up window, click Print, and a ZIP file containing the filled PDFs will be
downloaded to your device.
</p>
</div>
</div>
</section>
<section class="oe_container mt-5">
<div class="oe_row">
<div class="oe_span12">
<h6>Access rights</h6>
</div>
<div class="oe_span12">
<p>There are two types of roles for this app:</p>
<ul>
<li>
<b>User:</b> can print templates and open them for viewing. Users cannot
create new templates and cannot edit the current ones.
</li>
<li><b>Administrator:</b> can open, create, edit and print templates.</li>
</ul>
<p>
The role type is specified in the user profile. By default, all users are
assigned the User role.
</p>
</div>
<div class="oe_span12">
<div class="oe_demo oe_screenshot">
<img src="access_rights.png" />
</div>
</div>
</div>
</section>

View file

@ -0,0 +1,4 @@
.o_eurooffice_kanban_record_selected {
border-color: #017e84;
box-shadow: 0 0 0 2px #017e84;
}

View file

@ -0,0 +1,45 @@
.o-eurooffice-template {
display: flex;
.o-eurooffice-template-fields {
width: 320px;
height: 100%;
background-color: var(--body-bg) !important;
font-family: Arial !important;
font-weight: 400 !important;
font-size: 11px !important;
line-height: 14px !important;
letter-spacing: 2% !important;
.o-eurooffice-fields-title {
display: flex;
height: 54px;
padding: 0 12px;
align-items: center;
font-family: Arial;
font-weight: 700;
font-size: 11px;
line-height: 16px;
letter-spacing: 2%;
vertical-align: middle;
}
.o-eurooffice-template-separator {
width: 100%;
margin: 0;
flex-shrink: 0;
border-color: var(--gray-300);
}
}
.o-eurooffice-template-editor {
width: calc(100% - 320px);
height: 100%;
iframe {
width: 100%;
height: 100%;
}
}
}

View file

@ -0,0 +1,138 @@
.o-eurooffice-fields-options {
display: flex;
flex-direction: column;
row-gap: 12px;
padding: 12px 16px;
justify-content: center;
.o-eurooffice-options-help {
display: flex;
align-items: center;
}
.o-eurooffice-options-title {
align-items: center;
font-family: Arial;
font-weight: 700;
font-size: 12px;
line-height: 16px;
letter-spacing: 2%;
}
.o-eurooffice-options-search {
position: relative;
background-color: var(--o-cc1-btn-primary-text);
.o-eurooffice-search-field {
position: relative;
padding: 0 !important;
border: 1px solid var(--gray-300) !important;
.o-eurooffice-search-input {
width: 100% !important;
height: 24px;
font-family: Arial;
font-weight: 400;
font-size: 11px;
line-height: 16px;
letter-spacing: 2%;
vertical-align: middle;
}
button {
display: flex;
position: absolute;
top: 0;
right: 0;
align-items: center;
border: none;
height: 100%;
background-color: transparent;
svg {
path {
fill: var(--gray-900);
}
width: 14px;
height: 14px;
}
}
}
}
.o-eurooffice-options-technical-name {
.o-checkbox {
display: flex;
align-items: center;
column-gap: 6px;
padding: 0 !important;
margin: 0 !important;
}
input {
margin: 0 !important;
border: 1px solid var(--gray-300) !important;
}
}
}
.o-eurooffice-fields-list {
height: calc(100% - 248px);
margin: 0 16px 16px 16px;
padding-right: 4px;
overflow-y: scroll;
user-select: none;
scrollbar-width: thin;
h3 {
font-size: 12px;
font-weight: bold;
}
.o-eurooffice-list-field {
cursor: pointer;
.o-eurooffice-field {
display: flex;
position: relative;
min-height: 22px;
.o-eurooffice-field-caret {
display: flex;
position: absolute;
top: 50%;
transform: translate(25%, -50%);
font-size: 0.875em;
align-items: center;
}
.o-eurooffice-field-title {
padding-left: 12px;
align-content: center;
}
&:hover:not(.o-eurooffice-field_expanded) {
background-color: var(--gray-200) !important;
}
&.o-eurooffice-field_expanded {
padding: 0 !important;
border: none !important;
}
}
&.o-eurooffice-list-field_expanded {
/*border-bottom: 1px solid grey;*/
}
.o-eurooffice-template-separator {
margin: 2px 0px;
}
}
.o-eurooffice-list-field_children {
padding-left: 18px !important;
}
}

View file

@ -0,0 +1,5 @@
.oe_eurooffice_kanban_bottom_right {
.o_m2o_avatar {
display: flex;
}
}

View file

@ -0,0 +1,24 @@
.o-eurooffice-templates-tree {
.o-eurooffice-tree-list {
.o-eurooffice-list-item {
.o-eurooffice-item-body {
.o-eurooffice-body-template {
label {
display: flex;
align-items: center;
column-gap: 6px;
.o-eurooffice-template-checkbox {
margin: 0 !important;
}
button {
padding: 0 !important;
border: none !important;
}
}
}
}
}
}
}

View file

@ -0,0 +1,170 @@
/** @odoo-module **/
import { EuroofficePreview } from "@eurooffice_odoo/views/preview/eurooffice_preview"
import { AlertDialog } from "@web/core/confirmation_dialog/confirmation_dialog"
import { Dialog } from "@web/core/dialog/dialog"
import { useHotkey } from "@web/core/hotkeys/hotkey_hook"
import { download } from "@web/core/network/download"
import { Pager } from "@web/core/pager/pager"
import { useService } from "@web/core/utils/hooks"
import { SearchModel } from "@web/search/search_model"
import { getDefaultConfig } from "@web/views/view"
import { DropPrevious } from "web.concurrency"
const { Component, useState, useSubEnv, useChildSubEnv, onWillStart } = owl
export class TemplateDialog extends Component {
setup() {
this.orm = useService("orm")
this.rpc = useService("rpc")
this.viewService = useService("view")
this.notificationService = useService("notification")
this.dialog = useService("dialog")
this.data = this.env.dialogData
useHotkey("escape", () => this.data.close())
this.dialogTitle = this.env._t("Print from template")
this.limit = 8
this.state = useState({
currentOffset: 0,
isOpen: true,
isProcessing: false,
selectedTemplateId: null,
templates: [],
totalTemplates: 0,
})
useSubEnv({ config: { ...getDefaultConfig() } })
this.model = new SearchModel(this.env, {
orm: this.orm,
user: useService("user"),
view: useService("view"),
})
useChildSubEnv({ searchModel: this.model })
this.dp = new DropPrevious()
onWillStart(async () => {
const { resModel } = this.props
const views = await this.viewService.loadViews({
context: this.props.context,
resModel: "eurooffice.odoo.templates",
views: [[false, "search"]],
})
await this.model.load({
context: this.props.context,
domain: [["template_model_model", "=", resModel]],
orderBy: "id",
resModel: "eurooffice.odoo.templates",
searchMenuTypes: [],
searchViewArch: views.views.search.arch,
searchViewFields: views.fields,
searchViewId: views.views.search.id,
})
await this.fetchTemplates()
})
}
async createTemplate() {
// TODO: create template from dialog
}
async fetchTemplates(offset = 0) {
const { domain, context } = this.model
const { records, length } = await this.dp.add(
this.rpc("/web/dataset/search_read", {
context,
domain,
fields: ["display_name", "name", "create_date", "create_uid", "attachment_id", "mimetype"],
limit: this.limit,
model: "eurooffice.odoo.templates",
offset,
sort: "id",
}),
)
if (!length) {
this.dialog.add(AlertDialog, {
body: this.env._t(
// eslint-disable-next-line @stylistic/max-len
"You don't have any templates yet. Please go to the Euro-Office Templates app to create a new template or ask your admin to create it.",
),
title: this.dialogTitle,
})
return this.data.close()
}
this.state.templates = records
this.state.totalTemplates = length
}
async fillTemplate() {
if (this.state.isProcessing) {
return
}
this.state.isProcessing = true
const templateId = this.state.selectedTemplateId
const { resId } = this.props
this.env.services.ui.block()
try {
await download({
data: {
record_ids: resId,
template_id: templateId,
},
url: "/eurooffice/template/fill",
})
} finally {
this.env.services.ui.unblock()
}
this.env.services.ui.unblock()
this.data.close()
}
selectTemplate(templateId) {
this.state.selectedTemplateId = templateId
}
isSelected(templateId) {
return this.state.selectedTemplateId === templateId
}
onPagerChange({ offset }) {
this.state.currentOffset = offset
this.state.selectedTemplateId = null
return this.fetchTemplates(this.state.currentOffset)
}
isButtonDisabled() {
return this.state.isProcessing || this.state.selectedTemplateId === null
}
previewTemplate() {
const t = this.state.templates.find((item) => item.id === this.state.selectedTemplateId)
const url = `/eurooffice/file/content/${t.attachment_id[0]}`
this.env.services.dialog.add(
EuroofficePreview,
{
close: () => {
this.env.services.dialog.close()
},
title: t.display_name + ".pdf",
url: url,
},
{
onClose: () => {
return
},
},
)
}
}
TemplateDialog.template = "eurooffice_odoo_templates.TemplateDialog"
TemplateDialog.components = {
Dialog,
Pager,
}

View file

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="eurooffice_odoo_templates.TemplateDialog" owl="1">
<div>
<Dialog
t-if="state.isOpen"
title="dialogTitle"
contentClass="'o-spreadsheet-templates-dialog'"
footer="true"
modalRef="modalRef"
>
<div class="o-pager">
<Pager
t-if="state.totalTemplates"
total="state.totalTemplates"
offset="state.currentOffset"
limit="limit"
isEditable="false"
onUpdate.bind="onPagerChange"
/>
</div>
<div
class="o_kanban_renderer o_renderer d-flex o_kanban_ungrouped align-content-start flex-wrap justify-content-start"
>
<t t-foreach="state.templates" t-as="template" t-key="template.id">
<div
class="o_kanban_record d-flex flex-grow-1 flex-md-shrink-1 flex-shrink-0"
tabindex="0"
t-att-class="isSelected(template.id) ? 'o_eurooffice_kanban_record_selected': ''"
t-on-focus="() => this.selectTemplate(template.id)"
t-on-dblclick="fillTemplate"
>
<div class="oe_kanban_global_area oe_kanban_global_click o_kanban_attachment">
<div class="o_kanban_image">
<div class="o_kanban_image_wrapper">
<div class="o_image o_image_thumbnail" t-att-data-mimetype="template.mimetype" />
</div>
</div>
<div class="o_kanban_details">
<div class="o_kanban_details_wrapper">
<div class="o_kanban_record_title" t-att-title="template.name">
<span class="o_text_overflow" t-esc="template.name" />
</div>
<div class="o_kanban_record_body">
<samp class="text-muted" />
</div>
<div class="o_kanban_record_bottom">
<time class="oe_kanban_bottom_left">
<div name="create_date" class="o_field_widget o_readonly_modifier o_field_date">
<span t-esc="template.create_date" />
</div>
</time>
<div class="oe_kanban_bottom_right">
<div
name="create_uid"
class="o_field_widget o_readonly_modifier o_field_many2one_avatar_user o_field_many2one_avatar"
>
<div class="d-flex" t-att-data-tooltip="template.create_uid[1]">
<span class="o_m2o_avatar">
<img t-att-src="'/web/image/res.users/' + template.create_uid[0] + '/avatar_128'" />
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</t>
</div>
<t t-set-slot="footer">
<button class="btn btn-primary o-template-fill" t-att-disabled="isButtonDisabled()" t-on-click="fillTemplate">
<t>Print</t>
</button>
<button class="btn btn-secondary" t-att-disabled="isButtonDisabled()" t-on-click="previewTemplate">
<t>Preview</t>
</button>
<button class="btn btn-secondary" t-on-click="data.close">
<t>Cancel</t>
</button>
</t>
</Dialog>
</div>
</t>
</templates>

View file

@ -0,0 +1,169 @@
/** @odoo-module **/
import { registry } from "@web/core/registry"
import { useService } from "@web/core/utils/hooks"
import { _t } from "web.core"
import { ExportData } from "./eurooffice_editor_export_data"
const { Component, useState, onMounted, onWillUnmount } = owl
class TemplateEditor extends Component {
setup() {
super.setup()
this.orm = useService("orm")
this.rpc = useService("rpc")
this.ExportData = ExportData
this.notificationService = useService("notification")
this.cookies = useService("cookie")
this.router = useService("router")
this.state = useState({ resModel: "" })
this.config = null
this.docApiJS = null
this.documentReady = false
this.hasLicense = false
this.script = null
this.unchangedModels = {}
this.env.bus.on("eurooffice-template-create-form", this, (field) => this.createForm(field))
onMounted(async () => {
try {
const attachment_id = this.props.action.params.attachment_id
const template_model_model = this.props.action.params.template_model_model
const id = this.props.action.params.id
this.router.pushState({
attachment_id: this.props.action.params.attachment_id,
id: this.props.action.params.id,
template_model_model: this.props.action.params.template_model_model,
})
await this.orm.call("eurooffice.odoo.templates", "update_relationship", [id, template_model_model])
const response = await this.rpc("/eurooffice/template/editor", { attachment_id: attachment_id })
const config = JSON.parse(response.editorConfig)
config.events = {
onDocumentReady: () => {
if (window.docEditor && "createConnector" in window.docEditor) {
window.connector = docEditor.createConnector()
window.connector.executeMethod("GetVersion", [], () => {
this.hasLicense = true
})
}
// Render fields
this.state.resModel = template_model_model
this.documentReady = true
},
}
const theme = this.cookies.current.color_scheme
config.editorConfig.customization = {
...config.editorConfig.customization,
uiTheme: theme ? `default-${theme}` : "default-light",
}
this.config = config
this.docApiJS = response.docApiJS
if (!window.DocsAPI) {
await this.loadDocsAPI(this.docApiJS)
}
if (window.DocsAPI) {
window.docEditor = new DocsAPI.DocEditor("doceditor", this.config)
} else {
throw new Error("window.DocsAPI is null")
}
} catch (error) {
console.error("onMounted TemplateEditor error:", error)
document.getElementById("error").classList.remove("d-none")
}
})
onWillUnmount(() => {
if (window.connector) {
window.connector.disconnect()
delete window.connector
}
if (window.docEditor) {
window.docEditor.destroyEditor()
delete window.docEditor
}
if (this.script && this.script.parentNode) {
this.script.parentNode.removeChild(this.script)
}
if (window.DocsAPI) {
delete window.DocsAPI
}
this.env.bus.off("eurooffice-template-create-form", this)
})
}
async loadDocsAPI(DocsAPI) {
return new Promise((resolve, reject) => {
const script = document.createElement("script")
script.src = DocsAPI
script.onload = resolve
script.onerror = reject
document.body.appendChild(script)
this.script = script
})
}
createForm(field) {
if (this.documentReady) {
if (!this.hasLicense) {
this.notificationService.add(_t("Couldn't insert the field. Please check Automation API."), { type: "danger" })
return
}
Asc.scope.data = field
window.connector.callCommand(() => {
var oDocument = Api.GetDocument()
var oForm = null
if (
[
"char",
"text",
"selection",
"integer",
"float",
"monetary",
"date",
"datetime",
"many2one",
"one2many",
"many2many",
].includes(Asc.scope.data.field_type)
) {
oForm = Api.CreateTextForm({
key: Asc.scope.data.id.replaceAll("/", " "),
placeholder: Asc.scope.data.formattedString,
tip: Asc.scope.data.formattedString,
})
}
if (Asc.scope.data.field_type === "boolean") {
oForm = Api.CreateCheckBoxForm({
key: Asc.scope.data.id.replaceAll("/", " "),
tip: Asc.scope.data.formattedString,
})
}
if (Asc.scope.data.field_type === "binary") {
oForm = Api.CreatePictureForm({
key: Asc.scope.data.id.replaceAll("/", " "),
tip: Asc.scope.data.formattedString,
})
}
var oParagraph = Api.CreateParagraph()
oParagraph.AddElement(oForm)
oDocument.InsertContent([oParagraph], true, { KeepTextOnly: true })
})
window.docEditor.grabFocus()
}
}
}
TemplateEditor.components = {
...Component.components,
ExportData,
}
TemplateEditor.template = "eurooffice_odoo_templates.TemplateEditor"
registry.category("actions").add("eurooffice_template_editor", TemplateEditor)

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="eurooffice_odoo_templates.TemplateEditor" owl="1">
<html>
<head>
<meta charset="UTF-8" />
<title> Euro-Office </title>
<style>
html, body {
height: 100%;
}
</style>
</head>
<body class="o-eurooffice-template">
<div class="o-eurooffice-template-fields border-end">
<div class="o-eurooffice-fields-title">
<span> Fields </span>
</div>
<hr class="o-eurooffice-template-separator" />
<t t-if="state.resModel">
<ExportData resModel="state.resModel" />
</t>
</div>
<div class="o-eurooffice-template-editor">
<div id="doceditor" />
<div id="error" class="w-25 m-auto my-5 py-5 d-flex flex-column d-none">
<img src="/eurooffice_odoo_templates/static/svg/eurooffice_logo.svg" alt="Euro-Office logo" />
<div class="my-3 alert alert-danger">
<p> Euro-Office cannot be reached. Please contact admin. </p>
</div>
</div>
</div>
</body>
</html>
</t>
</templates>

View file

@ -0,0 +1,200 @@
/** @odoo-module **/
import { Component, useRef, useState, onWillStart } from "@odoo/owl"
import { CheckBox } from "@web/core/checkbox/checkbox"
import { unique } from "@web/core/utils/arrays"
import { useService } from "@web/core/utils/hooks"
import { fuzzyLookup } from "@web/core/utils/search"
class ExportDataItem extends Component {
setup() {
this.state = useState({ subfields: [] })
onWillStart(() => {
if (this.props.isExpanded) {
return this.toggleItem(this.props.field, false)
}
})
}
async toggleItem(field, isUserToggle) {
const id = field.id
if (this.props.isFieldExpandable(id)) {
if (this.state.subfields.length) {
this.state.subfields = []
} else {
const subfields = await this.props.loadFields(id, !isUserToggle)
if (subfields) {
this.state.subfields = isUserToggle ? subfields : this.props.filterSubfields(subfields)
} else {
this.state.subfields = []
}
}
} else if (isUserToggle) {
this.env.bus.trigger("eurooffice-template-create-form", field)
}
}
}
ExportDataItem.template = "eurooffice_odoo_templates.ExportDataItem"
ExportDataItem.components = { ExportDataItem }
ExportDataItem.props = {
field: {
optional: true,
type: Object,
},
filterSubfields: Function,
isExpanded: Boolean,
isFieldExpandable: Function,
isTechnicalName: Boolean,
loadFields: Function,
}
export class ExportData extends Component {
setup() {
this.dialog = useService("dialog")
this.notification = useService("notification")
this.orm = useService("orm")
this.rpc = useService("rpc")
this.searchRef = useRef("search")
this.knownFields = {}
this.expandedFields = {}
this.state = useState({
exportList: [],
isTechnicalName: false,
search: [],
})
onWillStart(async () => {
await this.fetchFields()
})
}
get fieldsAvailable() {
if (this.searchRef.el && this.searchRef.el.value) {
return this.state.search.length && Object.values(this.state.search)
}
return Object.values(this.knownFields)
}
get rootFields() {
if (this.searchRef.el && this.searchRef.el.value) {
const rootFromSearchResults = this.fieldsAvailable.map((f) => {
if (f.parent) {
const parentEl = this.knownFields[f.parent.id]
return this.knownFields[parentEl.parent ? parentEl.parent.id : parentEl.id]
}
return this.knownFields[f.id]
})
return unique(rootFromSearchResults)
}
return this.fieldsAvailable.filter(({ parent }) => !parent)
}
filterSubfields(subfields) {
let subfieldsFromSearchResults = []
let searchResults = null
if (this.searchRef.el && this.searchRef.el.value) {
searchResults = this.lookup(this.searchRef.el.value)
}
const fieldsAvailable = Object.values(searchResults || this.knownFields)
if (this.searchRef.el && this.searchRef.el.value) {
subfieldsFromSearchResults = fieldsAvailable
.filter((f) => f.parent && this.knownFields[f.parent.id].parent)
.map((f) => f.parent)
}
const availableSubFields = unique([...fieldsAvailable, ...subfieldsFromSearchResults])
return subfields.filter((a) => availableSubFields.some((b) => a.id === b.id))
}
async fetchFields() {
this.state.search = []
this.knownFields = {}
this.expandedFields = {}
await this.loadFields()
if (this.searchRef.el) {
this.searchRef.el.value = ""
}
}
isFieldExpandable(id) {
return this.knownFields[id].children && id.split("/").length < 4
}
async loadFields(id, preventLoad = false) {
let model = this.props.resModel
let parentField = null
let parentParams = {}
if (id) {
if (this.expandedFields[id]) {
return this.expandedFields[id].fields
}
parentField = this.knownFields[id]
model = parentField.params && parentField.params.model
parentParams = {
exclude: [parentField.relation_field],
...parentField.params,
parent_name: parentField.string,
}
}
if (preventLoad) {
return
}
const fields = await this.getExportedFields(model, parentParams)
for (const field of fields) {
field.formattedString = field.string.split("/").pop()
field.formattedId = field.id.split("/").pop()
field.parent = parentField
if (!this.knownFields[field.id]) {
this.knownFields[field.id] = field
}
}
if (id) {
this.expandedFields[id] = { fields }
}
return fields
}
async getExportedFields(model, parentParams = {}) {
const fields = await this.orm.call("eurooffice.odoo.templates", "get_fields_for_model", [
model,
parentParams.prefix || "",
parentParams.parent_name || "",
parentParams.exclude,
])
return fields
}
onSearch(ev) {
this.state.search = this.lookup(ev.target.value)
}
onCleanSearch() {
this.searchRef.el.value = ""
this.state.search = []
}
lookup(value) {
let lookupResult = null
if (this.state.isTechnicalName) {
lookupResult = fuzzyLookup(value, Object.values(this.knownFields), (field) => field.id.replaceAll("/", " "))
} else {
lookupResult = fuzzyLookup(value, Object.values(this.knownFields), (field) => field.string.replaceAll("/", " "))
}
return lookupResult
}
onToggleDisplayOption(value) {
// This.onCleanSearch()
this.state.isTechnicalName = value
}
}
ExportData.components = {
CheckBox,
ExportDataItem,
}
ExportData.props = { resModel: String }
ExportData.template = "eurooffice_odoo_templates.ExportData"

View file

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="eurooffice_odoo_templates.ExportDataItem" owl="1">
<div
t-att-data-field_id="props.field.id"
t-attf-class="o-eurooffice-list-field {{ state.subfields.length ? 'o-eurooffice-list-field_expanded mb-2' : '' }} {{ props.field.parent ? 'o-eurooffice-list-field_children' : ''}}"
role="treeitem"
t-on-click.stop="() => this.toggleItem(props.field, true)"
t-attf-data-tooltip="{{ props.isTechnicalName ? props.field.string : props.field.id }}"
>
<div
t-attf-class="o-eurooffice-field list-group-item-action {{ state.subfields.length ? 'o-eurooffice-field_expanded list-group-item active' : '' }}"
>
<span
t-if="props.isFieldExpandable(props.field.id)"
t-attf-class="o-eurooffice-field-caret fa {{ state.subfields.length ? 'fa-caret-down' : 'fa-caret-right' }}"
role="img"
aria-label="Show sub-fields"
title="Show sub-fields"
/>
<span t-if="props.isTechnicalName" class="o-eurooffice-field-title" t-esc="props.field.formattedId" />
<span t-else="" class="o-eurooffice-field-title" t-esc="props.field.formattedString" />
<!--<span
t-if="props.field.field_type === 'binary'"
title="Image"
t-attf-class="o-eurooffice-field-type fa fa-picture-o float-end m-1"
/>-->
</div>
<t t-foreach="state.subfields" t-as="field" t-key="field.id">
<ExportDataItem t-props="props" field="field" />
<t t-if="field_index === state.subfields.length-1">
<hr class="o-eurooffice-template-separator" />
</t>
</t>
</div>
</t>
<t t-name="eurooffice_odoo_templates.ExportData" owl="1">
<div class="o-eurooffice-fields-options">
<div class="o-eurooffice-options-help">
<span> Choose the field below to paste selected parameter to the cursor </span>
</div>
<div class="o-eurooffice-options-title">
<span>Module/ section</span>
</div>
<div class="o-eurooffice-options-search">
<div class="o-eurooffice-search-field o_searchview">
<input
t-ref="search"
class="o-eurooffice-search-input o_searchview_input form-control"
id="o-export-search-filter"
t-attf-placeholder="{{ state.isTechnicalName ? 'Search technical name' : 'Search field' }}"
t-on-input="onSearch"
/>
<button t-if="this.searchRef.el and this.searchRef.el.value" t-on-click="onCleanSearch">
<svg width="12" height="11" viewBox="0 0 12 11" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M0.810547 0.707106L1.4718 1.36836L2.7943 2.69087L5.29585 5.19244L3.00452 7.48377L1.57703 8.91125L0.863283 9.625L1.57039 10.3321L2.28413 9.61836L3.71162 8.19087L6.00295 5.89954L8.2943 8.19089L9.7218 9.61839L10.4355 10.3321L11.1427 9.62503L10.4289 8.91128L9.0014 7.48378L6.71006 5.19244L9.21162 2.69087L10.5341 1.36836L11.1954 0.707108L10.4883 0L9.82703 0.661255L8.50452 1.98377L6.00295 4.48533L3.50141 1.98377L2.17891 0.661257L1.51766 0L0.810547 0.707106Z"
fill="black"
/>
</svg>
</button>
<button t-else="">
<svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M10 5.5C10 7.98528 7.98528 10 5.5 10C3.01472 10 1 7.98528 1 5.5C1 3.01472 3.01472 1 5.5 1C7.98528 1 10 3.01472 10 5.5ZM9.01953 9.72663C8.06578 10.5217 6.83875 11 5.5 11C2.46243 11 0 8.53757 0 5.5C0 2.46243 2.46243 0 5.5 0C8.53757 0 11 2.46243 11 5.5C11 6.83875 10.5217 8.06578 9.72663 9.01953L13.8536 13.1465L13.1465 13.8536L9.01953 9.72663Z"
fill="black"
/>
</svg>
</button>
</div>
</div>
<div class="o-eurooffice-options-technical-name">
<CheckBox id="'o-display-option'" value="state.isTechnicalName" onChange.bind="onToggleDisplayOption">
Use a technical name
</CheckBox>
</div>
<hr class="o-eurooffice-template-separator" />
</div>
<div class="o-eurooffice-fields-list">
<t t-if="fieldsAvailable">
<t t-foreach="rootFields" t-as="field" t-key="field.id + '_' + state.search.length + '_' + state.isCompatible">
<ExportDataItem
field="field"
filterSubfields.bind="filterSubfields"
isExpanded="state.search.length > 0"
isFieldExpandable.bind="isFieldExpandable"
isTechnicalName="state.isTechnicalName"
loadFields.bind="loadFields"
/>
</t>
</t>
<h3 t-else="" class="text-center text-muted mt-5 o_no_match">No match found.</h3>
</div>
</t>
</templates>

View file

@ -0,0 +1,24 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch"
import { FormController } from "@web/views/form/form_controller"
import { TemplateDialog } from "../dialog/eurooffice_dialog"
patch(FormController.prototype, "FormController.ActionButton", {
/**
* @override
**/
getActionMenuItems() {
const menuItems = this._super()
menuItems.other.push({
callback: () => {
this.env.services.dialog.add(TemplateDialog, {
resId: this.model.root.resId,
resModel: this.props.resModel,
})
},
description: this.env._t("Print with Euro-Office"),
skipSave: true,
})
return menuItems
},
})

View file

@ -0,0 +1,15 @@
/** @odoo-module **/
import { Dialog } from "@web/core/dialog/dialog"
import { _t } from "@web/core/l10n/translation"
const { Component } = owl
export class HelpDialog extends Component {
setup() {
this.title = _t("Help")
console.log(this)
}
}
HelpDialog.template = "eurooffice_odoo_templates.HelpDialog"
HelpDialog.components = { Dialog }

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="eurooffice_odoo_templates.HelpDialog" owl="1">
<div>
<Dialog title="title" footer="true" size="'md'">
<span class="fw-bolder">
Euro-Office Templates module
</span>
<p>The Euro-Office Templates module allows you to create, manage, and use fillable PDF <span
class="fw-bolder"
>templates </span> for any installed Odoo module (e.g., Sales, Invoicing, CRM). These templates can then be filled in automatically with real-time data from your Odoo system — no manual input needed.</p>
<p
>On this page, you can create form templates for any Odoo module, such as Invoice, Receipt, Employee Leave Form, etc. Just click <span
class="fw-bolder"
>Create or Upload</span>, select the desired Odoo module, and create or upload a PDF template with fillable fields.</p>
<br />
<span class="fw-bolder">To fill in a template with Odoo data:</span>
<ol>
<li>Go to the relevant Odoo module (e.g., Sales, Invoices).</li>
<li>Open a record.</li>
<li>Click on the Action button.</li>
<li>Select Print with Euro-Office.</li>
<li>Choose the required template to fill in with Odoo data.</li>
<li>Press the Print button.</li>
</ol>
<p
>This will generate a PDF document with your template, automatically filled with the corresponding record's data.</p>
<t t-set-slot="footer">
<button class="btn btn-primary" t-on-click="props.close">
<t>Ok</t>
</button>
</t>
</Dialog>
</div>
</t>
</templates>

View file

@ -0,0 +1,43 @@
/** @odoo-module */
import { FormGallery } from "@eurooffice_odoo/views/form_gallery/form_gallery"
import { useService } from "@web/core/utils/hooks"
import { KanbanController } from "@web/views/kanban/kanban_controller"
import { HelpDialog } from "./eurooffice_dialog_help"
export class EuroofficeKanbanController extends KanbanController {
setup() {
super.setup()
this.action = useService("action")
this.orm = useService("orm")
this.notificationService = useService("notification")
this.dialog = useService("dialog")
this.openedFormGallery = false
}
async openFormGallery() {
const download = (form) => {
if (form) {
this.action.doAction({
context: {
default_hide_file_field: true,
default_name: form.attributes.name_form,
url: form.attributes.file_oform.data[0].attributes.url,
},
res_model: "eurooffice.odoo.templates",
target: "current",
type: "ir.actions.act_window",
view_mode: "form",
views: [[false, "form"]],
})
}
}
this.dialog.add(FormGallery, {
onDownload: download,
showType: false,
})
}
async help() {
this.dialog.add(HelpDialog, {})
}
}

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates>
<t
t-name="eurooffice_odoo_templates.EuroofficeKanbanController.Buttons"
t-inherit="web.KanbanView.Buttons"
t-inherit-mode="primary"
owl="1"
>
<xpath expr="//button[hasclass('o-kanban-button-new')]" position="replace">
<button
type="button"
class="btn btn-primary o-kanban-button-new"
accesskey="c"
t-on-click="() => this.createRecord(null)"
data-bounce-button=""
groups="eurooffice_odoo_templates.group_manager"
>
Create or Upload
</button>
</xpath>
<xpath expr="//div[hasclass('o_cp_buttons')]" position="inside">
<button class="btn btn-secondary ms-1" t-on-click="() => this.openFormGallery()" style="text-wrap: nowrap;">
Open Document templates
</button>
<button class="btn btn-secondary ms-1" t-on-click="() => this.help()"> Help </button>
</xpath>
</t>
</templates>

View file

@ -0,0 +1,78 @@
/** @odoo-module **/
import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog"
import { useService } from "@web/core/utils/hooks"
import { CANCEL_GLOBAL_CLICK, KanbanRecord } from "@web/views/kanban/kanban_record"
export class EuroofficeKanbanRecord extends KanbanRecord {
setup() {
super.setup()
this.orm = useService("orm")
this.actionService = useService("action")
}
/**
* @override
*/
triggerAction(params) {
const env = this.env
const { group, list, openRecord, record } = this.props
const { type } = params
switch (type) {
case "edit": {
return openRecord(record, "edit")
}
case "delete": {
const listOrGroup = group || list
if (listOrGroup.deleteRecords) {
this.dialog.add(ConfirmationDialog, {
body: env._t("Are you sure you want to delete this record?"),
cancel: () => {
return
},
confirm: async () => {
await listOrGroup.deleteRecords([record])
this.props.record.model.load()
this.props.record.model.notify()
return this.notification.add(env._t("Template removed"), {
sticky: false,
type: "info",
})
},
})
}
return
}
default: {
return this.notification.add(env._t("Kanban: no action for type: ") + type, { type: "danger" })
}
}
}
/**
* @override
*/
async onGlobalClick(ev) {
if (ev.target.closest(CANCEL_GLOBAL_CLICK) && !ev.target.classList.contains("o_eurooffice_download")) {
return
}
if (ev.target.classList.contains("o_eurooffice_download")) {
window.location.href = `/eurooffice/template/download/${this.props.record.data.attachment_id[0]}`
return
}
return this.editTemplate()
}
async editTemplate() {
const action = {
params: {
attachment_id: this.props.record.data.attachment_id[0],
id: this.props.record.data.id,
template_model_model: this.props.record.data.template_model_model,
},
tag: "eurooffice_template_editor",
target: "current",
type: "ir.actions.client",
}
return this.actionService.doAction(action, { props: this.props.record.data })
}
}

View file

@ -0,0 +1,29 @@
/** @odoo-module **/
import { KanbanRenderer } from "@web/views/kanban/kanban_renderer"
import { EuroofficeKanbanRecord } from "./eurooffice_kanban_record"
export class EuroofficeKanbanRenderer extends KanbanRenderer {
setup() {
super.setup()
}
/**
* @override
**/
canQuickCreate() {
return false
}
/**
* @override
**/
canCreateGroup() {
return false
}
}
EuroofficeKanbanRenderer.components = {
...KanbanRenderer.components,
KanbanRecord: EuroofficeKanbanRecord,
}

View file

@ -0,0 +1,14 @@
/** @odoo-module */
import { registry } from "@web/core/registry"
import { kanbanView } from "@web/views/kanban/kanban_view"
import { EuroofficeKanbanController } from "./eurooffice_kanban_controller"
import { EuroofficeKanbanRenderer } from "./eurooffice_kanban_renderer"
export const euroofficeKanbanView = {
...kanbanView,
Controller: EuroofficeKanbanController,
Renderer: EuroofficeKanbanRenderer,
buttonTemplate: "eurooffice_odoo_templates.EuroofficeKanbanController.Buttons",
}
registry.category("views").add("eurooffice_kanban", euroofficeKanbanView)

View file

@ -0,0 +1,24 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch"
import { ListController } from "@web/views/list/list_controller"
import { TemplateDialog } from "../dialog/eurooffice_dialog"
patch(ListController.prototype, "ListController.ActionButton", {
/**
* @override
**/
getActionMenuItems() {
const menuItems = this._super()
menuItems.other.push({
callback: async () => {
this.env.services.dialog.add(TemplateDialog, {
resId: await this.model.root.getResIds(true),
resModel: this.props.resModel,
})
},
description: this.env._t("Print with Euro-Office"),
skipSave: true,
})
return menuItems
},
})

View file

@ -0,0 +1,81 @@
/** @odoo-module **/
import { Component, useState, onWillStart } from "@odoo/owl"
import { EuroofficePreview } from "@eurooffice_odoo/views/preview/eurooffice_preview"
import { registry } from "@web/core/registry"
import { useService } from "@web/core/utils/hooks"
export class TemplatesTree extends Component {
setup() {
this.orm = useService("orm")
this.state = useState({
loading: true,
selected: [],
structure: {},
})
onWillStart(async () => {
await this.loadTemplates()
})
}
async loadTemplates() {
try {
const data = await this.orm.call("eurooffice.odoo.demo.templates", "get_template_data")
this.state.structure = data.structure || {}
this.state.selected = data.selected || []
} catch (error) {
console.error("Failed to load templates:", error)
} finally {
this.state.loading = false
}
}
toggleTemplate(path, checked) {
if (checked) {
this.state.selected.push(path)
} else {
this.state.selected = this.state.selected.filter((p) => p !== path)
}
if (this.props.record) {
this.props.record.update({ selected_templates: JSON.stringify(this.state.selected) })
}
}
async saveSelection() {
const value = JSON.stringify({
selected: this.state.selected,
structure: this.state.structure,
})
await this.orm.write("eurooffice.odoo.demo.templates", [this.props.record.resId], { selected_templates: value })
if (this.props.update) {
this.props.update(value)
}
}
previewTemplate(path) {
const url = `/eurooffice/template/template_content/${encodeURIComponent(path.replace("/", "_"))}`
this.env.services.dialog.add(
EuroofficePreview,
{
close: () => {
this.env.services.dialog.close()
},
title: path.split("/").pop(),
url: url,
},
{
onClose: () => {
return
},
},
)
}
}
TemplatesTree.template = "eurooffice_odoo_templates.TemplatesTree"
registry.category("fields").add("eurooffice_template_tree", TemplatesTree)

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="eurooffice_odoo_templates.TemplatesTree" owl="1">
<div class="o-eurooffice-templates-tree">
<t t-if="state.loading">
<div class="text-center p-4">
<i class="fa fa-refresh fa-spin" />
Loading templates...
</div>
</t>
<t t-else="">
<div class="o-eurooffice-tree-list">
<t t-foreach="Object.values(state.structure)" t-as="category" t-key="category.model">
<div class="o-eurooffice-list-item">
<h3 class="o-eurooffice-item-header">
<t t-esc="category.name" />
</h3>
<div class="o-eurooffice-item-body">
<t t-foreach="category.files" t-as="file" t-key="file.path">
<div class="o-eurooffice-body-template">
<label>
<input
type="checkbox"
class="o-eurooffice-template-checkbox form-check-input"
t-att-checked="state.selected.includes(file.path)"
t-on-change="(ev) => this.toggleTemplate(file.path, ev.target.checked)"
/>
<button class="btn btn-sm btn-link" t-on-click="() => this.previewTemplate(file.path)">
<i class="fa fa-eye" />
</button>
<span t-esc="file.name" />
</label>
</div>
</t>
</div>
</div>
</t>
</div>
</t>
</div>
</t>
</templates>

View file

@ -0,0 +1,15 @@
<svg width="433" height="70" viewBox="0 0 433 70" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M100.633 19.9039C96.3343 23.3872 94.2545 28.7462 94.2545 35.847C94.2545 42.9475 96.3343 48.3063 100.633 51.9237C104.931 55.541 109.784 57.2828 115.469 57.2828C121.016 57.2828 126.007 55.541 130.167 51.9237C134.327 48.4404 136.407 43.0813 136.407 35.9808C136.407 28.7462 134.327 23.5212 130.167 19.9039C126.007 16.2866 121.154 14.5449 115.469 14.5449C109.784 14.5449 104.793 16.2866 100.633 19.9039ZM106.179 46.5649C104.377 44.2874 103.406 40.8038 103.406 35.847C103.406 31.0237 104.377 27.5405 106.179 25.3969C108.12 23.1193 110.2 21.6456 112.419 21.1097L112.419 21.1097C112.973 20.9757 113.528 20.8418 113.944 20.8418C114.36 20.7078 114.776 20.7078 115.33 20.7078H115.331C115.608 20.7078 115.85 20.7413 116.093 20.7748C116.336 20.8083 116.578 20.8418 116.856 20.8418C117.272 20.8418 117.827 20.9757 118.381 21.1097C120.6 21.6456 122.68 23.1193 124.482 25.3969C126.285 27.6745 127.255 31.2919 127.255 35.9808C127.255 40.67 126.285 44.2874 124.482 46.5649C122.68 48.8425 120.6 50.3161 118.381 50.8522C118.286 50.8752 118.194 50.8983 118.105 50.9207C117.679 51.0282 117.315 51.1201 116.856 51.1201C116.301 51.2539 115.885 51.2539 115.331 51.2539H115.331C115.123 51.2539 114.88 51.2204 114.637 51.187C114.395 51.1535 114.152 51.1201 113.944 51.1201C113.485 51.1201 113.121 51.0282 112.695 50.9208C112.606 50.8983 112.514 50.8752 112.419 50.8522C110.2 50.3161 108.12 48.8425 106.179 46.5649Z" fill="#333333"/>
<path d="M140.982 14.9468H152.352L167.327 41.3398L169.546 46.9668H169.685L169.546 39.598V14.9468H178.281V56.7469H166.912L151.936 29.416L149.718 24.7269H149.579L149.718 32.0954V56.7469H140.982V14.9468Z" fill="#333333"/>
<path d="M185.908 14.9468H194.643V49.646H211.837V56.7469H185.908V14.9468Z" fill="#333333"/>
<path d="M206.43 14.9468H216.552L225.426 29.684L226.812 32.4974H227.09L228.476 29.684L237.489 14.9468H246.779L231.111 39.7321V56.7469H222.375V39.7321L206.43 14.9468Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M253.434 19.9039C249.136 23.3872 247.056 28.7462 247.056 35.847C247.056 42.9475 249.275 48.3063 253.434 51.9237C257.733 55.541 262.586 57.2828 268.271 57.2828C273.817 57.2828 278.809 55.541 282.969 51.9237C287.128 48.4404 289.208 43.0813 289.208 35.9808C289.208 28.7462 287.128 23.5212 282.969 19.9039C278.809 16.2866 273.956 14.5449 268.271 14.5449C262.586 14.5449 257.594 16.2866 253.434 19.9039ZM258.981 46.5649C257.178 44.2874 256.208 40.8038 256.208 35.847C256.208 31.0237 257.178 27.5405 258.981 25.3969C260.922 23.1193 263.002 21.6456 265.22 21.1097C265.775 20.9757 266.33 20.8418 266.746 20.8418C267.162 20.7078 267.577 20.7078 268.132 20.7078H268.132C268.41 20.7078 268.652 20.7413 268.895 20.7748C269.137 20.8083 269.38 20.8418 269.657 20.8418C270.073 20.8418 270.627 20.9755 271.182 21.1094L271.183 21.1097C273.401 21.6456 275.481 23.1193 277.284 25.3969C279.086 27.6745 280.057 31.2919 280.057 35.9808C280.057 40.67 279.086 44.2874 277.284 46.5649C275.481 48.8425 273.401 50.3161 271.183 50.8522C271.087 50.8753 270.995 50.8984 270.906 50.9209C270.48 51.0283 270.116 51.1201 269.657 51.1201C269.103 51.2539 268.687 51.2539 268.132 51.2539H268.132C267.924 51.2539 267.682 51.2204 267.439 51.187C267.196 51.1535 266.954 51.1201 266.746 51.1201C266.331 51.1201 265.778 50.9867 265.225 50.8533L265.22 50.8522C262.863 50.3161 260.922 48.8425 258.981 46.5649Z" fill="#333333"/>
<path d="M293.923 14.9468H318.049V22.0474H302.658V32.0954H317.355V39.196H302.658V56.7469H293.923V14.9468Z" fill="#333333"/>
<path d="M323.181 14.9468H347.307V22.0474H331.915V32.0954H346.613V39.196H331.915V56.7469H323.181V14.9468Z" fill="#333333"/>
<path d="M352.436 56.7469V14.9468H361.173V56.7469H352.436Z" fill="#333333"/>
<path d="M400.624 15.8843V23.1189C399.099 22.583 397.573 22.1811 395.91 21.9131C394.247 21.6452 392.444 21.5112 390.501 21.5112C385.927 21.5112 382.461 22.851 379.964 25.6644C377.469 28.3439 376.221 31.8272 376.221 35.9803C376.221 39.9997 377.329 43.3491 379.687 46.0287C382.044 48.7079 385.372 50.1818 389.67 50.1818C391.195 50.1818 392.721 50.0477 394.524 49.9139C396.324 49.6457 398.127 49.244 400.07 48.44L400.624 55.5406C400.347 55.6747 399.93 55.8088 399.516 55.9426C398.961 56.0767 398.404 56.2105 397.713 56.3446C396.604 56.6125 395.216 56.7466 393.553 57.0145C391.89 57.1483 390.224 57.2824 388.421 57.2824C388.144 57.2824 387.867 57.2824 387.73 57.2824C387.453 57.2824 387.175 57.2824 387.035 57.2824C382.044 57.0145 377.469 55.1389 373.309 51.9233C369.149 48.5741 367.069 43.3491 367.069 36.3823C367.069 29.5497 369.149 24.1907 373.169 20.4394C377.189 16.6881 382.738 14.8125 389.533 14.8125C391.333 14.8125 392.998 14.8125 394.384 14.9464C395.91 15.0804 397.296 15.3484 398.821 15.6163C399.099 15.7503 399.516 15.7503 399.793 15.8843C399.93 15.7503 400.207 15.8843 400.624 15.8843Z" fill="#333333"/>
<path d="M406.08 14.9468H432.009V21.5115H414.955V31.9616H430.346V38.5264H414.955V50.1821H432.009V56.7469H406.08V14.9468Z" fill="#333333"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.3143 69.1577L2.00187 55.01C-0.665498 53.7748 -0.665498 51.8661 2.00187 50.7431L12.9033 45.8027L33.1986 55.01C35.8658 56.245 40.1569 56.245 42.7081 55.01L63.0033 45.8027L73.9049 50.7431C76.5721 51.9784 76.5721 53.8871 73.9049 55.01L42.5921 69.1577C40.1569 70.2807 35.8658 70.2807 33.3143 69.1577Z" fill="#FF6F3D"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.3143 51.0822L2.00187 36.9345C-0.665498 35.6993 -0.665498 33.7906 2.00187 32.6676L12.6713 27.8394L33.3143 37.1591C35.9818 38.3941 40.2726 38.3941 42.8241 37.1591L63.4674 27.8394L74.1366 32.6676C76.8042 33.9028 76.8042 35.8116 74.1366 36.9345L42.8241 51.0822C40.1569 52.3175 35.8658 52.3175 33.3143 51.0822Z" fill="#95C038"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.3131 33.4888L2.00052 19.341C-0.666841 18.1058 -0.666841 16.197 2.00052 15.0742L33.3131 0.926346C35.9803 -0.308782 40.2714 -0.308782 42.8229 0.926346L74.1354 15.0742C76.8027 16.3093 76.8027 18.2181 74.1354 19.341L42.8229 33.4888C40.1554 34.6117 35.8646 34.6117 33.3131 33.4888Z" fill="#5DC0E8"/>
</svg>

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -0,0 +1 @@
EDITABLE_FORM_FIELDS = "eurooffice_connector.editable_form_fields"

View file

@ -0,0 +1,10 @@
from odoo.addons.eurooffice_odoo_templates.utils import config_constants
def set_editable_form_fields(env, value):
env["ir.config_parameter"].sudo().set_param(config_constants.EDITABLE_FORM_FIELDS, value)
return
def get_editable_form_fields(env):
return env["ir.config_parameter"].sudo().get_param(config_constants.EDITABLE_FORM_FIELDS)

View file

@ -0,0 +1,39 @@
# TODO: add convert docx to pdf
def is_pdf_form(text):
if not text:
return False
index_first = text.find(b"%\xcd\xca\xd2\xa9\x0d")
if index_first == -1:
return False
p_first = text[index_first + 6 :]
if not p_first.startswith(b"1 0 obj\x0a<<\x0a"):
return False
p_first = p_first[11:]
signature = b"Euro-OfficeFORM"
index_stream = p_first.find(b"stream\x0d\x0a")
index_meta = p_first.find(signature)
if index_stream == -1 or index_meta == -1 or index_stream < index_meta:
return False
p_meta = p_first[index_meta:]
p_meta = p_meta[len(signature) + 3 :]
index_meta_last = p_meta.find(b" ")
if index_meta_last == -1:
return False
p_meta = p_meta[index_meta_last + 1 :]
index_meta_last = p_meta.find(b" ")
if index_meta_last == -1:
return False
return True

View file

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="view_eurooffice_form" model="ir.ui.view">
<field name="name">eurooffice.odoo.templates.form</field>
<field name="model">eurooffice.odoo.templates</field>
<field name="arch" type="xml">
<form string="Create template">
<sheet>
<group string="Template creation">
<div class="text-muted" colspan="2"> Use this form to create a new fillable PDF template
for your Odoo modules. Start by entering a <span class="fw-bolder">name </span> for
your template to easily identify it later in the Euro-Office Templates list. </div>
<div class="text-muted" colspan="2"> Choose the <span class="fw-bolder">Odoo module </span>
(e.g., Employee, Invoice, Sales Order) that the template will be linked to. The chosen
model defines the data fields available for automatic form filling. </div>
<field name="name" required="1" />
<field
name="template_model_id"
options="{'no_create': True, 'no_create_edit':True, 'no_open':True}"
help="Model for which the template is being created."
required="1"
/>
<field name="template_model_related_name" invisible="1" />
<field name="template_model_model" invisible="1" />
<field name="hide_file_field" invisible="1" />
</group>
<group string="Template uploading" attrs="{'invisible': [('hide_file_field', '=', True)]}">
<div class="text-muted" colspan="2"> If you already have a <span class="fw-bolder">prepared
PDF file</span> with fillable fields, you can upload it here </div>
<field
name="file"
options="{'accepted_file_extensions': '.pdf', 'attachment': False}"
help="Select an existing template. Leave the field blank to create a blank template."
/>
</group>
<group>
<div colspan="2">
<div class="text-muted">
Once you've saved the template, return to the Euro-Office Templates list.
</div>
<div class="text-muted">
Locate your newly created template and set up the connections between the form
fields in the Euro-Office editor and the corresponding data fields from the selected
Odoo model.
</div>
</div>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_eurooffice_kanban_search" model="ir.ui.view">
<field name="name">eurooffice.odoo.templates.kanban.search</field>
<field name="model">eurooffice.odoo.templates</field>
<field name="arch" type="xml">
<search>
<field name="name" />
<field name="template_model_name" />
<group expand="0" string="Group By">
<filter string="Model" name="template_model_id" context="{'group_by': 'template_model_id'}" />
</group>
<searchpanel>
<field name="template_model_id" string="Model" enable_counters="1" />
</searchpanel>
</search>
</field>
</record>
<record id="view_eurooffice_kanban" model="ir.ui.view">
<field name="name">eurooffice.odoo.templates.kanban</field>
<field name="model">eurooffice.odoo.templates</field>
<field name="arch" type="xml">
<kanban js_class="eurooffice_kanban">
<field name="id" />
<field name="attachment_id" />
<field name="mimetype" />
<field name="create_uid" />
<field name="create_date" />
<field name="name" />
<field name="template_model_name" />
<field name="template_model_related_name" />
<field name="template_model_model" />
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_area o_kanban_attachment oe_kanban_global_click">
<div class="o_kanban_image">
<div class="o_kanban_image_wrapper">
<div class="o_image o_image_thumbnail" t-att-data-mimetype="record.mimetype.value" />
</div>
</div>
<div class="o_kanban_details">
<div class="o_kanban_details_wrapper">
<div class="o_kanban_record_title">
<field name="name" class="o_text_overflow" />
</div>
<div class="o_kanban_record_body">
<t t-if="template_model_related_name">
<field name="template_model_related_name" widget="badge" />
</t>
<t t-else="">
<field name="template_model_name" widget="badge" />
</t>
</div>
<div class="o_kanban_record_bottom">
<span class="oe_kanban_bottom_left">
<field name="create_date" widget="date" />
</span>
<div class="oe_kanban_bottom_right oe_eurooffice_kanban_bottom_right">
<field name="create_uid" widget="many2one_avatar_user" />
</div>
</div>
<div class="o_dropdown_kanban dropdown" tabindex="-1">
<a
class="dropdown-toggle o-no-caret btn"
data-bs-toggle="dropdown"
href="#"
role="button"
aria-label="Dropdown menu"
title="Dropdown menu"
>
<span class="fa fa-ellipsis-v" />
</a>
<div class="dropdown-menu" role="menu" aria-labelledby="dLabel">
<a t-if="widget.editable" type="edit" class="dropdown-item">Edit</a>
<a t-if="widget.deletable" type="delete" class="dropdown-item">Delete</a>
<a
t-attf-href="/web/content/ir.attachment/#{record.attachment_id.raw_value}/datas?download=true"
download=""
class="dropdown-item"
>Download</a>
</div>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<record model="ir.actions.act_window" id="action_eurooffice_odoo_templates">
<field name="name">Euro-Office Templates</field>
<field name="res_model">eurooffice.odoo.templates</field>
<field name="view_mode">kanban,form</field>
</record>
<menuitem
id="eurooffice_menu"
name="Euro-Office Templates"
web_icon="eurooffice_odoo_templates,static/description/icon.svg"
sequence="30"
groups="eurooffice_odoo_templates.group_eurooffice_odoo_templates_user,eurooffice_odoo_templates.group_eurooffice_odoo_templates_admin"
action="action_eurooffice_odoo_templates"
/>
</odoo>

View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- -->
<!-- (c) Copyright Ascensio System SIA 2024 -->
<!-- -->
<odoo>
<record id="action_eurooffice_demo_templates" model="ir.actions.act_window">
<field name="name">Manage Templates</field>
<field name="res_model">eurooffice.odoo.demo.templates</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<record id="view_eurooffice_demo_templates_form" model="ir.ui.view">
<field name="name">eurooffice.demo.templates.form</field>
<field name="model">eurooffice.odoo.demo.templates</field>
<field name="arch" type="xml">
<form>
<p>
Check templates you want to export to the Euro-Office Templates module and press Export. You can do this as many times as you need.
</p>
<field name="selected_templates" widget="eurooffice_template_tree" />
<footer>
<button name="action_save" string="Export" type="object" class="btn-primary" />
<button string="Cancel" special="cancel" class="btn-secondary" />
</footer>
</form>
</field>
</record>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.eurooffice_odoo_templates</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="10" />
<field name="inherit_id" ref="base.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[hasclass('o_eurooffice_settings_common')]" position="after">
<div>
<h2>Euro-Office Templates</h2>
<div class="row mt16 o_settings_container">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane" />
<div class="o_setting_right_pane">
<span class="o_form_label">
Templates gallery
</span>
<div class="text-muted">
Export templates to the Euro-Office Templates module
</div>
<div class="text-muted content-group mt16">
<button
type="action"
name="%(action_eurooffice_demo_templates)d"
string="Manage templates"
class="btn-link"
icon="fa-arrow-right"
/>
</div>
</div>
</div>
</div>
<div class="row mt16 o_settings_container">
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="editable_form_fields" />
</div>
<div class="o_setting_right_pane">
<label class="o_form_label" for="editable_form_fields">
Disable form fields after printing PDF form
</label>
<div class="text-muted">
Form fields cannot be filled in manually if they were not automatically filled in
with data from Odoo
</div>
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,33 @@
[project]
name = "odoo-bringout-eurooffice-eurooffice_odoo_templates"
version = "16.0.3.3.0"
description = "Euro-Office/Euro-Office document templates for Odoo"
authors = [
{ name = "Euro-Office", email = "support@eurooffice.com" }
]
dependencies = [
"pyjwt>=2.0.0"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/Euro-Office/eurooffice_odoo"
repository = "https://github.com/Euro-Office/eurooffice_odoo"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["eurooffice_odoo_templates"]