Files
2026-02-22 01:22:18 -05:00

184 lines
5.6 KiB
Python

# -*- coding: utf-8 -*-
from odoo import api, fields, models, _
from odoo.exceptions import UserError
import base64
import logging
_logger = logging.getLogger(__name__)
class ADPDocument(models.Model):
_name = 'fusion.adp.document'
_description = 'ADP Application Document'
_order = 'upload_date desc, revision desc'
_rec_name = 'display_name'
# Relationships
sale_order_id = fields.Many2one(
'sale.order',
string='Sale Order',
ondelete='cascade',
index=True,
)
assessment_id = fields.Many2one(
'fusion.assessment',
string='Assessment',
ondelete='cascade',
index=True,
)
# Document Type
document_type = fields.Selection([
('full_application', 'Full ADP Application (14 pages)'),
('pages_11_12', 'Pages 11 & 12 (Signature Pages)'),
('page_11', 'Page 11 Only (Authorizer Signature)'),
('page_12', 'Page 12 Only (Client Signature)'),
('submitted_final', 'Final Submitted Application'),
('assessment_report', 'Assessment Report'),
('assessment_signed', 'Signed Pages from Assessment'),
('other', 'Other Document'),
], string='Document Type', required=True, default='full_application')
# File Data
file = fields.Binary(
string='File',
required=True,
attachment=True,
)
filename = fields.Char(
string='Filename',
required=True,
)
file_size = fields.Integer(
string='File Size (bytes)',
compute='_compute_file_size',
store=True,
)
mimetype = fields.Char(
string='MIME Type',
default='application/pdf',
)
# Revision Tracking
revision = fields.Integer(
string='Revision',
default=1,
readonly=True,
)
revision_note = fields.Text(
string='Revision Note',
help='Notes about what changed in this revision',
)
is_current = fields.Boolean(
string='Is Current Version',
default=True,
index=True,
)
# Upload Information
uploaded_by = fields.Many2one(
'res.users',
string='Uploaded By',
default=lambda self: self.env.user,
readonly=True,
)
upload_date = fields.Datetime(
string='Upload Date',
default=fields.Datetime.now,
readonly=True,
)
source = fields.Selection([
('authorizer', 'Authorizer Portal'),
('sales_rep', 'Sales Rep Portal'),
('internal', 'Internal User'),
('assessment', 'Assessment Form'),
], string='Source', default='internal')
# Display
display_name = fields.Char(
string='Display Name',
compute='_compute_display_name',
store=True,
)
@api.depends('file')
def _compute_file_size(self):
for doc in self:
if doc.file:
doc.file_size = len(base64.b64decode(doc.file))
else:
doc.file_size = 0
@api.depends('document_type', 'filename', 'revision')
def _compute_display_name(self):
type_labels = dict(self._fields['document_type'].selection)
for doc in self:
type_label = type_labels.get(doc.document_type, doc.document_type)
doc.display_name = f"{type_label} - v{doc.revision} ({doc.filename or 'No file'})"
@api.model_create_multi
def create(self, vals_list):
"""Override create to handle revision numbering"""
for vals in vals_list:
# Find existing documents of the same type for the same order/assessment
domain = [('document_type', '=', vals.get('document_type'))]
if vals.get('sale_order_id'):
domain.append(('sale_order_id', '=', vals.get('sale_order_id')))
if vals.get('assessment_id'):
domain.append(('assessment_id', '=', vals.get('assessment_id')))
existing = self.search(domain, order='revision desc', limit=1)
if existing:
# Mark existing as not current and increment revision
existing.is_current = False
vals['revision'] = existing.revision + 1
else:
vals['revision'] = 1
vals['is_current'] = True
return super().create(vals_list)
def action_download(self):
"""Download the document"""
self.ensure_one()
return {
'type': 'ir.actions.act_url',
'url': f'/web/content/{self._name}/{self.id}/file/{self.filename}?download=true',
'target': 'self',
}
def get_document_url(self):
"""Get the download URL for portal access"""
self.ensure_one()
return f'/my/authorizer/document/{self.id}/download'
@api.model
def get_documents_for_order(self, sale_order_id, document_type=None, current_only=True):
"""Get documents for a sale order, optionally filtered by type"""
domain = [('sale_order_id', '=', sale_order_id)]
if document_type:
domain.append(('document_type', '=', document_type))
if current_only:
domain.append(('is_current', '=', True))
return self.search(domain, order='document_type, revision desc')
@api.model
def get_revision_history(self, sale_order_id, document_type):
"""Get all revisions of a specific document type"""
return self.search([
('sale_order_id', '=', sale_order_id),
('document_type', '=', document_type),
], order='revision desc')