Files
Odoo-Modules/fusion_payroll/models/pdf_field_position.py
2026-02-22 01:22:18 -05:00

98 lines
2.8 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api
class PdfFieldPosition(models.Model):
"""PDF Field Position Configuration
Stores user-configurable positions for text overlay on flattened PDF templates.
Each record defines where a specific field should be placed on a PDF template.
"""
_name = 'pdf.field.position'
_description = 'PDF Field Position'
_order = 'template_type, sequence, field_name'
_rec_name = 'field_name'
template_type = fields.Selection([
('T4', 'T4 Slip'),
('T4 Summary', 'T4 Summary'),
('T4A', 'T4A Slip'),
('T4A Summary', 'T4A Summary'),
], string='Template Type', required=True, index=True,
help='The PDF template type this field position applies to')
field_name = fields.Char(
string='Field Name',
required=True,
index=True,
help='Field identifier used in PDF field mapping (e.g., EmployeeLastName, SIN, Box14)'
)
field_label = fields.Char(
string='Field Label',
help='Human-readable label for this field (for display purposes)'
)
x_position = fields.Float(
string='X Position',
required=True,
default=0.0,
help='X coordinate in points (1 point = 1/72 inch). Origin is at bottom-left corner.'
)
y_position = fields.Float(
string='Y Position',
required=True,
default=0.0,
help='Y coordinate in points (1 point = 1/72 inch). Origin is at bottom-left corner. Standard letter size is 612 x 792 points.'
)
font_size = fields.Integer(
string='Font Size',
required=True,
default=10,
help='Font size in points (default: 10)'
)
font_name = fields.Char(
string='Font Name',
required=True,
default='Helvetica',
help='Font family name (e.g., Helvetica, Times-Roman, Courier)'
)
active = fields.Boolean(
string='Active',
default=True,
help='If unchecked, this field position will not be used when filling PDFs'
)
sequence = fields.Integer(
string='Sequence',
default=10,
help='Display order for this field'
)
@api.model
def get_coordinates_dict(self, template_type):
"""Get coordinates dictionary for a template type.
Returns dict in format: {'field_name': (x, y, font_size, font_name)}
Only includes active positions.
"""
positions = self.search([
('template_type', '=', template_type),
('active', '=', True),
])
result = {}
for pos in positions:
result[pos.field_name] = (
pos.x_position,
pos.y_position,
pos.font_size,
pos.font_name,
)
return result