Browse Source

[FIX] emc_taxshelter_report: balcken

pull/68/head
Rémy Taymans 5 years ago
parent
commit
35e16ff4f5
  1. 24
      easy_my_coop_taxshelter_report/__manifest__.py
  2. 37
      easy_my_coop_taxshelter_report/models/mail_template.py
  3. 495
      easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py

24
easy_my_coop_taxshelter_report/__manifest__.py

@ -25,23 +25,21 @@
"depends": ["easy_my_coop"], "depends": ["easy_my_coop"],
"author": "Houssine BAKKALI <houssine@coopiteasy.be>", "author": "Houssine BAKKALI <houssine@coopiteasy.be>",
"category": "Cooperative management", "category": "Cooperative management",
'website': "www.coopiteasy.be",
"website": "www.coopiteasy.be",
"license": "AGPL-3", "license": "AGPL-3",
"description": """ "description": """
This module allows you to create a fiscal declaration year and to print This module allows you to create a fiscal declaration year and to print
tax shelter declaration for each cooperator. tax shelter declaration for each cooperator.
""", """,
'data': [
'security/ir.model.access.csv',
'reports/tax_shelter_report.xml',
'reports/tax_shelter_subscription_report.xml',
'reports/tax_shelter_shares_report.xml',
'views/tax_shelter_declaration_view.xml',
'data/mail_template_data.xml',
'data/scheduler_data.xml',
"data": [
"security/ir.model.access.csv",
"reports/tax_shelter_report.xml",
"reports/tax_shelter_subscription_report.xml",
"reports/tax_shelter_shares_report.xml",
"views/tax_shelter_declaration_view.xml",
"data/mail_template_data.xml",
"data/scheduler_data.xml",
], ],
'demo': [
'demo/tax_shelter_demo.xml',
],
'installable': True,
"demo": ["demo/tax_shelter_demo.xml"],
"installable": True,
} }

37
easy_my_coop_taxshelter_report/models/mail_template.py

@ -5,10 +5,9 @@ class MailTemplate(models.Model):
_inherit = "mail.template" _inherit = "mail.template"
@api.multi @api.multi
def send_mail_with_multiple_attachments(self, res_id,
additional_attachments,
force_send=False,
raise_exception=False):
def send_mail_with_multiple_attachments(
self, res_id, additional_attachments, force_send=False, raise_exception=False
):
"""Generates a new mail message for the given template and record, """Generates a new mail message for the given template and record,
and schedules it for delivery through the ``mail`` and schedules it for delivery through the ``mail``
module's scheduler. module's scheduler.
@ -21,34 +20,36 @@ class MailTemplate(models.Model):
:returns: id of the mail.message that was created :returns: id of the mail.message that was created
""" """
self.ensure_one() self.ensure_one()
Mail = self.env['mail.mail']
Mail = self.env["mail.mail"]
# TDE FIXME: should remove dfeault_type from context # TDE FIXME: should remove dfeault_type from context
Attachment = self.env['ir.attachment']
Attachment = self.env["ir.attachment"]
# create a mail_mail based on values, without attachments # create a mail_mail based on values, without attachments
values = self.generate_email(res_id) values = self.generate_email(res_id)
values['recipient_ids'] = [(4, pid) for pid in values.get('partner_ids', list())]
attachment_ids = values.pop('attachment_ids', [])
attachments = values.pop('attachments', [])
values["recipient_ids"] = [
(4, pid) for pid in values.get("partner_ids", list())
]
attachment_ids = values.pop("attachment_ids", [])
attachments = values.pop("attachments", [])
# add a protection against void email_from # add a protection against void email_from
if 'email_from' in values and not values.get('email_from'):
values.pop('email_from')
if "email_from" in values and not values.get("email_from"):
values.pop("email_from")
mail = Mail.create(values) mail = Mail.create(values)
# manage attachments # manage attachments
attachments.extend(additional_attachments) attachments.extend(additional_attachments)
for attachment in attachments: for attachment in attachments:
attachment_data = { attachment_data = {
'name': attachment[0],
'datas_fname': attachment[0],
'datas': attachment[1],
'res_model': 'mail.message',
'res_id': mail.mail_message_id.id,
"name": attachment[0],
"datas_fname": attachment[0],
"datas": attachment[1],
"res_model": "mail.message",
"res_id": mail.mail_message_id.id,
} }
attachment_ids.append(Attachment.create(attachment_data).id) attachment_ids.append(Attachment.create(attachment_data).id)
if attachment_ids: if attachment_ids:
values['attachment_ids'] = [(6, 0, attachment_ids)]
mail.write({'attachment_ids': [(6, 0, attachment_ids)]})
values["attachment_ids"] = [(6, 0, attachment_ids)]
mail.write({"attachment_ids": [(6, 0, attachment_ids)]})
if force_send: if force_send:
mail.send(raise_exception=raise_exception) mail.send(raise_exception=raise_exception)

495
easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py

@ -3,20 +3,20 @@ import base64
from odoo import api, fields, models from odoo import api, fields, models
TYPE_MAP = { TYPE_MAP = {
'subscription': 'subscribed',
'transfer': 'transfered',
'sell_back': 'resold'
"subscription": "subscribed",
"transfer": "transfered",
"sell_back": "resold",
} }
REPORT_DIC = { REPORT_DIC = {
'subscription': (
'easy_my_coop_taxshelter_report.action_tax_shelter_subscription_report',
'Tax Shelter Subscription'
"subscription": (
"easy_my_coop_taxshelter_report.action_tax_shelter_subscription_report",
"Tax Shelter Subscription",
),
"shares": (
"easy_my_coop_taxshelter_report.action_tax_shelter_shares_report",
"Tax Shelter Shares",
), ),
'shares': (
'easy_my_coop_taxshelter_report.action_tax_shelter_shares_report',
'Tax Shelter Shares'
)
} }
@ -25,70 +25,82 @@ class TaxShelterDeclaration(models.Model):
_name = "tax.shelter.declaration" _name = "tax.shelter.declaration"
_description = "Tax Shelter Declaration" _description = "Tax Shelter Declaration"
name = fields.Char(string='Declaration year', required=True)
name = fields.Char(string="Declaration year", required=True)
fiscal_year = fields.Char(String="Fiscal year", required=True) fiscal_year = fields.Char(String="Fiscal year", required=True)
tax_shelter_certificates = fields.One2many('tax.shelter.certificate',
'declaration_id',
string='Tax shelter certificates',
readonly=True)
date_from = fields.Date(string='Date from', required=True)
date_to = fields.Date(string='Date to', required=True)
month_from = fields.Char(String='Month from', required=True)
month_to = fields.Char(String='Month to', required=True)
tax_shelter_percentage = fields.Selection([('30', '30%'),
('45', '45%')],
string='Tax Shelter percentage',
required=True)
state = fields.Selection([('draft', 'Draft'),
('computed', 'Computed'),
('validated', 'Validated')],
string='State', required=True, default="draft")
company_id = fields.Many2one('res.company', string='Company',
required=True,
change_default=True, readonly=True,
default=lambda self: self.env['res.company']._company_default_get())
tax_shelter_capital_limit = fields.Float(string="Tax shelter capital limit",
required=True)
previously_subscribed_capital = fields.Float(String="Capital previously subscribed",
readonly=True)
excluded_cooperator = fields.Many2many('res.partner',
string="Excluded cooperator",
domain=[('cooperator', '=', True)],
help="If these cooperator have"
" subscribed share during the time"
" frame of this Tax Shelter "
"Declaration. They will be marked "
"as non eligible")
tax_shelter_certificates = fields.One2many(
"tax.shelter.certificate",
"declaration_id",
string="Tax shelter certificates",
readonly=True,
)
date_from = fields.Date(string="Date from", required=True)
date_to = fields.Date(string="Date to", required=True)
month_from = fields.Char(String="Month from", required=True)
month_to = fields.Char(String="Month to", required=True)
tax_shelter_percentage = fields.Selection(
[("30", "30%"), ("45", "45%")], string="Tax Shelter percentage", required=True
)
state = fields.Selection(
[("draft", "Draft"), ("computed", "Computed"), ("validated", "Validated")],
string="State",
required=True,
default="draft",
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
change_default=True,
readonly=True,
default=lambda self: self.env["res.company"]._company_default_get(),
)
tax_shelter_capital_limit = fields.Float(
string="Tax shelter capital limit", required=True
)
previously_subscribed_capital = fields.Float(
String="Capital previously subscribed", readonly=True
)
excluded_cooperator = fields.Many2many(
"res.partner",
string="Excluded cooperator",
domain=[("cooperator", "=", True)],
help="If these cooperator have"
" subscribed share during the time"
" frame of this Tax Shelter "
"Declaration. They will be marked "
"as non eligible",
)
def _excluded_from_declaration(self, entry): def _excluded_from_declaration(self, entry):
if entry.date >= self.date_from and entry.date <= self.date_to: if entry.date >= self.date_from and entry.date <= self.date_to:
declaration = self declaration = self
else: else:
declaration = self.search([('date_from', '<=', entry.date),
('date_to', '>=', entry.date)])
declaration = self.search(
[("date_from", "<=", entry.date), ("date_to", ">=", entry.date)]
)
if entry.partner_id.id in declaration.excluded_cooperator.ids: if entry.partner_id.id in declaration.excluded_cooperator.ids:
return True return True
return False return False
def _prepare_line(self, certificate, entry, ongoing_capital_sub, excluded): def _prepare_line(self, certificate, entry, ongoing_capital_sub, excluded):
line_vals = {} line_vals = {}
line_vals['tax_shelter_certificate'] = certificate.id
line_vals['share_type'] = entry.share_product_id.id
line_vals['share_short_name'] = entry.share_short_name
line_vals['share_unit_price'] = entry.share_unit_price
line_vals['quantity'] = entry.quantity
line_vals['transaction_date'] = entry.date
line_vals['type'] = TYPE_MAP[entry.type]
if entry.type == 'subscription':
line_vals["tax_shelter_certificate"] = certificate.id
line_vals["share_type"] = entry.share_product_id.id
line_vals["share_short_name"] = entry.share_short_name
line_vals["share_unit_price"] = entry.share_unit_price
line_vals["quantity"] = entry.quantity
line_vals["transaction_date"] = entry.date
line_vals["type"] = TYPE_MAP[entry.type]
if entry.type == "subscription":
if not excluded: if not excluded:
capital_after_sub = ongoing_capital_sub + entry.total_amount_line capital_after_sub = ongoing_capital_sub + entry.total_amount_line
else: else:
capital_after_sub = ongoing_capital_sub capital_after_sub = ongoing_capital_sub
line_vals['capital_before_sub'] = ongoing_capital_sub
line_vals['capital_after_sub'] = capital_after_sub
line_vals['capital_limit'] = self.tax_shelter_capital_limit
line_vals["capital_before_sub"] = ongoing_capital_sub
line_vals["capital_after_sub"] = capital_after_sub
line_vals["capital_limit"] = self.tax_shelter_capital_limit
if ongoing_capital_sub < self.tax_shelter_capital_limit and not excluded: if ongoing_capital_sub < self.tax_shelter_capital_limit and not excluded:
line_vals['tax_shelter'] = True
line_vals["tax_shelter"] = True
return line_vals return line_vals
def _compute_certificates(self, entries, partner_certificate): def _compute_certificates(self, entries, partner_certificate):
@ -99,31 +111,37 @@ class TaxShelterDeclaration(models.Model):
if not certificate: if not certificate:
# create a certificate for this cooperator # create a certificate for this cooperator
cert_vals = {} cert_vals = {}
cert_vals['declaration_id'] = self.id
cert_vals['partner_id'] = entry.partner_id.id
cert_vals['cooperator_number'] = entry.partner_id.cooperator_register_number
certificate = self.env['tax.shelter.certificate'].create(cert_vals)
cert_vals["declaration_id"] = self.id
cert_vals["partner_id"] = entry.partner_id.id
cert_vals[
"cooperator_number"
] = entry.partner_id.cooperator_register_number
certificate = self.env["tax.shelter.certificate"].create(cert_vals)
partner_certificate[entry.partner_id.id] = certificate partner_certificate[entry.partner_id.id] = certificate
excluded = self._excluded_from_declaration(entry) excluded = self._excluded_from_declaration(entry)
line_vals = self._prepare_line(certificate, entry, ongoing_capital_sub, excluded)
certificate.write({'lines': [(0, 0, line_vals)]})
line_vals = self._prepare_line(
certificate, entry, ongoing_capital_sub, excluded
)
certificate.write({"lines": [(0, 0, line_vals)]})
if entry.type == 'subscription' and not excluded:
if entry.type == "subscription" and not excluded:
ongoing_capital_sub += entry.total_amount_line ongoing_capital_sub += entry.total_amount_line
return partner_certificate return partner_certificate
@api.one @api.one
def compute_declaration(self): def compute_declaration(self):
entries = self.env['subscription.register'].search([
('partner_id.is_company', '=', False),
('date', '<=', self.date_to),
('type', 'in', ['subscription',
'sell_back',
'transfer'])
])
subscriptions = entries.filtered((lambda r: r.type == 'subscription' and r.date < self.date_from)) #noqa
entries = self.env["subscription.register"].search(
[
("partner_id.is_company", "=", False),
("date", "<=", self.date_to),
("type", "in", ["subscription", "sell_back", "transfer"]),
]
)
subscriptions = entries.filtered(
(lambda r: r.type == "subscription" and r.date < self.date_from)
) # noqa
cap_prev_sub = 0.0 cap_prev_sub = 0.0
for subscription in subscriptions: for subscription in subscriptions:
cap_prev_sub += subscription.total_amount_line cap_prev_sub += subscription.total_amount_line
@ -134,18 +152,18 @@ class TaxShelterDeclaration(models.Model):
partner_cert = self._compute_certificates(entries, partner_cert) partner_cert = self._compute_certificates(entries, partner_cert)
self.state = 'computed'
self.state = "computed"
@api.one @api.one
def validate_declaration(self): def validate_declaration(self):
self.tax_shelter_certificates.write({'state': 'validated'})
self.state = 'validated'
self.tax_shelter_certificates.write({"state": "validated"})
self.state = "validated"
@api.one @api.one
def reset_declaration(self): def reset_declaration(self):
if not self.state == 'validated':
if not self.state == "validated":
self.tax_shelter_certificates.unlink() self.tax_shelter_certificates.unlink()
self.state = 'draft'
self.state = "draft"
class TaxShelterCertificate(models.Model): class TaxShelterCertificate(models.Model):
@ -153,101 +171,141 @@ class TaxShelterCertificate(models.Model):
_description = "Tax Shelter Certificate" _description = "Tax Shelter Certificate"
_order = "cooperator_number asc" _order = "cooperator_number asc"
cooperator_number = fields.Integer(string='Cooperator number',
required=True,
readonly=True)
partner_id = fields.Many2one('res.partner', string='Cooperator',
required=True, readonly=True)
state = fields.Selection([('draft', 'Draft'),
('validated', 'Validated'),
('no_eligible', 'No eligible'),
('sent', 'Sent')],
string='State', required=True, default="draft")
declaration_id = fields.Many2one('tax.shelter.declaration',
string='Declaration', required=True,
readonly=True, ondelete="restrict")
lines = fields.One2many('certificate.line',
'tax_shelter_certificate',
string='Certificate lines', readonly=True)
previously_subscribed_lines = fields.One2many(compute='_compute_certificate_lines',
comodel_name='certificate.line',
string='Previously Subscribed lines',
readonly=True)
cooperator_number = fields.Integer(
string="Cooperator number", required=True, readonly=True
)
partner_id = fields.Many2one(
"res.partner", string="Cooperator", required=True, readonly=True
)
state = fields.Selection(
[
("draft", "Draft"),
("validated", "Validated"),
("no_eligible", "No eligible"),
("sent", "Sent"),
],
string="State",
required=True,
default="draft",
)
declaration_id = fields.Many2one(
"tax.shelter.declaration",
string="Declaration",
required=True,
readonly=True,
ondelete="restrict",
)
lines = fields.One2many(
"certificate.line",
"tax_shelter_certificate",
string="Certificate lines",
readonly=True,
)
previously_subscribed_lines = fields.One2many(
compute="_compute_certificate_lines",
comodel_name="certificate.line",
string="Previously Subscribed lines",
readonly=True,
)
previously_subscribed_eligible_lines = fields.One2many( previously_subscribed_eligible_lines = fields.One2many(
compute='_compute_certificate_lines',
comodel_name='certificate.line',
string='Previously Subscribed eligible lines',
readonly=True)
subscribed_lines = fields.One2many(compute='_compute_certificate_lines',
comodel_name='certificate.line',
string='Shares subscribed',
readonly=True)
resold_lines = fields.One2many(compute='_compute_certificate_lines',
comodel_name='certificate.line',
string='Shares resold',
readonly=True)
transfered_lines = fields.One2many(compute='_compute_certificate_lines',
comodel_name='certificate.line',
string='Shares transfered',
readonly=True)
total_amount_previously_subscribed = fields.Float(compute='_compute_amounts',
string='Total previously subscribed')
total_amount_eligible_previously_subscribed = fields.Float(compute='_compute_amounts',
string='Total eligible previously subscribed')
total_amount_subscribed = fields.Float(compute='_compute_amounts',
string='Total subscribed')
total_amount_eligible = fields.Float(compute='_compute_amounts',
string='Total amount eligible To Tax shelter')
total_amount_resold = fields.Float(compute='_compute_amounts',
string='Total resold')
total_amount_transfered = fields.Float(compute='_compute_amounts',
string='Total transfered')
total_amount = fields.Float(compute='_compute_amounts',
string='Total', readonly=True)
company_id = fields.Many2one(related="declaration_id.company_id",
string="Company")
compute="_compute_certificate_lines",
comodel_name="certificate.line",
string="Previously Subscribed eligible lines",
readonly=True,
)
subscribed_lines = fields.One2many(
compute="_compute_certificate_lines",
comodel_name="certificate.line",
string="Shares subscribed",
readonly=True,
)
resold_lines = fields.One2many(
compute="_compute_certificate_lines",
comodel_name="certificate.line",
string="Shares resold",
readonly=True,
)
transfered_lines = fields.One2many(
compute="_compute_certificate_lines",
comodel_name="certificate.line",
string="Shares transfered",
readonly=True,
)
total_amount_previously_subscribed = fields.Float(
compute="_compute_amounts", string="Total previously subscribed"
)
total_amount_eligible_previously_subscribed = fields.Float(
compute="_compute_amounts", string="Total eligible previously subscribed"
)
total_amount_subscribed = fields.Float(
compute="_compute_amounts", string="Total subscribed"
)
total_amount_eligible = fields.Float(
compute="_compute_amounts", string="Total amount eligible To Tax shelter"
)
total_amount_resold = fields.Float(
compute="_compute_amounts", string="Total resold"
)
total_amount_transfered = fields.Float(
compute="_compute_amounts", string="Total transfered"
)
total_amount = fields.Float(
compute="_compute_amounts", string="Total", readonly=True
)
company_id = fields.Many2one(related="declaration_id.company_id", string="Company")
def generate_pdf_report(self, report_type): def generate_pdf_report(self, report_type):
report, name = REPORT_DIC[report_type] report, name = REPORT_DIC[report_type]
report = self.env.ref(report).render_qweb_pdf(self) report = self.env.ref(report).render_qweb_pdf(self)
report = base64.b64encode(report) report = base64.b64encode(report)
report_name = self.partner_id.name + ' ' + name + ' ' + self.declaration_id.name + '.pdf'
report_name = (
self.partner_id.name + " " + name + " " + self.declaration_id.name + ".pdf"
)
return (report_name, report) return (report_name, report)
def generate_certificates_report(self): def generate_certificates_report(self):
attachments = [] attachments = []
if self.total_amount_eligible > 0: if self.total_amount_eligible > 0:
attachments.append(self.generate_pdf_report('subscription'))
attachments.append(self.generate_pdf_report("subscription"))
if self.partner_id.total_value > 0: if self.partner_id.total_value > 0:
attachments.append(self.generate_pdf_report('shares'))
attachments.append(self.generate_pdf_report("shares"))
# if self.total_amount_resold > 0 or self.total_amount_transfered > 0: # if self.total_amount_resold > 0 or self.total_amount_transfered > 0:
# TODO
# TODO
return attachments return attachments
@api.multi @api.multi
def send_certificates(self): def send_certificates(self):
tax_shelter_mail_template = self.env.ref('easy_my_coop_taxshelter_report.email_template_tax_shelter_certificate', False)
tax_shelter_mail_template = self.env.ref(
"easy_my_coop_taxshelter_report.email_template_tax_shelter_certificate",
False,
)
for certificate in self: for certificate in self:
if certificate.total_amount_eligible + certificate.total_amount_eligible_previously_subscribed > 0:
if (
certificate.total_amount_eligible
+ certificate.total_amount_eligible_previously_subscribed
> 0
):
attachments = certificate.generate_certificates_report() attachments = certificate.generate_certificates_report()
if len(attachments) > 0: if len(attachments) > 0:
tax_shelter_mail_template.send_mail_with_multiple_attachments(certificate.id, attachments,True)
certificate.state = 'sent'
tax_shelter_mail_template.send_mail_with_multiple_attachments(
certificate.id, attachments, True
)
certificate.state = "sent"
else: else:
certificate.state = 'no_eligible'
certificate.state = "no_eligible"
self.env.cr.commit() self.env.cr.commit()
@api.multi @api.multi
def print_subscription_certificate(self): def print_subscription_certificate(self):
self.ensure_one() self.ensure_one()
report, name = REPORT_DIC['subscription']
report, name = REPORT_DIC["subscription"]
return self.env.ref(report).report_action(self) return self.env.ref(report).report_action(self)
@api.multi @api.multi
def print_shares_certificate(self): def print_shares_certificate(self):
self.ensure_one() self.ensure_one()
report, name = REPORT_DIC['shares']
report, name = REPORT_DIC["shares"]
return self.env.ref(report).report_action(self) return self.env.ref(report).report_action(self)
@api.multi @api.multi
@ -268,11 +326,15 @@ class TaxShelterCertificate(models.Model):
for line in certificate.previously_subscribed_eligible_lines: for line in certificate.previously_subscribed_eligible_lines:
total_amount_previously_eligible += line.amount_subscribed_eligible total_amount_previously_eligible += line.amount_subscribed_eligible
certificate.total_amount_eligible_previously_subscribed = total_amount_previously_eligible
certificate.total_amount_eligible_previously_subscribed = (
total_amount_previously_eligible
)
for line in certificate.previously_subscribed_lines: for line in certificate.previously_subscribed_lines:
total_amount_previously_subscribed += line.amount_subscribed total_amount_previously_subscribed += line.amount_subscribed
certificate.total_amount_previously_subscribed = total_amount_previously_subscribed
certificate.total_amount_previously_subscribed = (
total_amount_previously_subscribed
)
for line in certificate.transfered_lines: for line in certificate.transfered_lines:
total_amount_transfered += line.amount_transfered total_amount_transfered += line.amount_transfered
@ -281,20 +343,44 @@ class TaxShelterCertificate(models.Model):
for line in certificate.resold_lines: for line in certificate.resold_lines:
total_amount_resold += line.amount_resold total_amount_resold += line.amount_resold
certificate.total_amount_resold = total_amount_resold certificate.total_amount_resold = total_amount_resold
certificate.total_amount = certificate.total_amount_previously_subscribed + certificate.total_amount_subscribed + certificate.total_amount_resold + certificate.total_amount_transfered
@api.depends('lines')
certificate.total_amount = (
certificate.total_amount_previously_subscribed
+ certificate.total_amount_subscribed
+ certificate.total_amount_resold
+ certificate.total_amount_transfered
)
@api.depends("lines")
def _compute_certificate_lines(self): def _compute_certificate_lines(self):
for certificate in self: for certificate in self:
certificate.previously_subscribed_lines = certificate.lines.filtered(lambda r: r.type == 'subscribed' and r.transaction_date < certificate.declaration_id.date_from)
certificate.previously_subscribed_eligible_lines = certificate.lines.filtered(lambda r: r.type == 'subscribed' and r.transaction_date < certificate.declaration_id.date_from and r.tax_shelter)
certificate.subscribed_lines = certificate.lines.filtered(lambda r: r.type == 'subscribed' and r.transaction_date >= certificate.declaration_id.date_from and r.transaction_date <= certificate.declaration_id.date_to)
certificate.resold_lines = certificate.lines.filtered(lambda r: r.type == 'resold' and r.transaction_date >= certificate.declaration_id.date_from and r.transaction_date <= certificate.declaration_id.date_to)
certificate.transfered_lines = certificate.lines.filtered(lambda r: r.type == 'transfered' and r.transaction_date >= certificate.declaration_id.date_from and r.transaction_date <= certificate.declaration_id.date_to)
certificate.previously_subscribed_lines = certificate.lines.filtered(
lambda r: r.type == "subscribed"
and r.transaction_date < certificate.declaration_id.date_from
)
certificate.previously_subscribed_eligible_lines = certificate.lines.filtered(
lambda r: r.type == "subscribed"
and r.transaction_date < certificate.declaration_id.date_from
and r.tax_shelter
)
certificate.subscribed_lines = certificate.lines.filtered(
lambda r: r.type == "subscribed"
and r.transaction_date >= certificate.declaration_id.date_from
and r.transaction_date <= certificate.declaration_id.date_to
)
certificate.resold_lines = certificate.lines.filtered(
lambda r: r.type == "resold"
and r.transaction_date >= certificate.declaration_id.date_from
and r.transaction_date <= certificate.declaration_id.date_to
)
certificate.transfered_lines = certificate.lines.filtered(
lambda r: r.type == "transfered"
and r.transaction_date >= certificate.declaration_id.date_from
and r.transaction_date <= certificate.declaration_id.date_to
)
@api.model @api.model
def batch_send_tax_shelter_certificate(self): def batch_send_tax_shelter_certificate(self):
certificates = self.search([('state', '=', 'validated')], limit=80)
certificates = self.search([("state", "=", "validated")], limit=80)
certificates.send_certificates() certificates.send_certificates()
@ -303,70 +389,75 @@ class TaxShelterCertificateLine(models.Model):
_name = "certificate.line" _name = "certificate.line"
_description = "Tax Shelter Certificate Line" _description = "Tax Shelter Certificate Line"
declaration_id = fields.Many2one(related='tax_shelter_certificate.declaration_id',
string="Declaration")
tax_shelter_certificate = fields.Many2one('tax.shelter.certificate',
string="Tax shelter certificate",
ondelete='cascade',
required=True)
share_type = fields.Many2one('product.product',
string='Share type',
required=True,
readonly=True)
share_unit_price = fields.Float(string='Share price',
required=True,
readonly=True)
quantity = fields.Integer(string='Number of shares',
required=True,
readonly=True)
declaration_id = fields.Many2one(
related="tax_shelter_certificate.declaration_id", string="Declaration"
)
tax_shelter_certificate = fields.Many2one(
"tax.shelter.certificate",
string="Tax shelter certificate",
ondelete="cascade",
required=True,
)
share_type = fields.Many2one(
"product.product", string="Share type", required=True, readonly=True
)
share_unit_price = fields.Float(string="Share price", required=True, readonly=True)
quantity = fields.Integer(string="Number of shares", required=True, readonly=True)
transaction_date = fields.Date(string="Transaction date") transaction_date = fields.Date(string="Transaction date")
tax_shelter = fields.Boolean(string="Tax shelter eligible", readonly=True) tax_shelter = fields.Boolean(string="Tax shelter eligible", readonly=True)
type = fields.Selection([('subscribed', 'Subscribed'),
('resold', 'Resold'),
('transfered', 'Transfered'),
('kept', 'Kept')],
required=True, readonly=True)
amount_subscribed = fields.Float(compute='_compute_totals',
string='Amount subscribed',
store=True)
amount_subscribed_eligible = fields.Float(compute='_compute_totals',
string='Amount subscribed eligible',
store=True)
amount_resold = fields.Float(compute='_compute_totals',
string='Amount resold',
store=True)
amount_transfered = fields.Float(compute='_compute_totals',
string='Amount transfered',
store=True)
share_short_name = fields.Char(string='Share type name', readonly=True)
capital_before_sub = fields.Float(string="Capital before subscription",
readonly=True)
capital_after_sub = fields.Float(string="Capital after subscription",
readonly=True)
type = fields.Selection(
[
("subscribed", "Subscribed"),
("resold", "Resold"),
("transfered", "Transfered"),
("kept", "Kept"),
],
required=True,
readonly=True,
)
amount_subscribed = fields.Float(
compute="_compute_totals", string="Amount subscribed", store=True
)
amount_subscribed_eligible = fields.Float(
compute="_compute_totals", string="Amount subscribed eligible", store=True
)
amount_resold = fields.Float(
compute="_compute_totals", string="Amount resold", store=True
)
amount_transfered = fields.Float(
compute="_compute_totals", string="Amount transfered", store=True
)
share_short_name = fields.Char(string="Share type name", readonly=True)
capital_before_sub = fields.Float(
string="Capital before subscription", readonly=True
)
capital_after_sub = fields.Float(string="Capital after subscription", readonly=True)
capital_limit = fields.Float(string="Capital limit", readonly=True) capital_limit = fields.Float(string="Capital limit", readonly=True)
@api.multi @api.multi
@api.depends('quantity', 'share_unit_price')
@api.depends("quantity", "share_unit_price")
def _compute_totals(self): def _compute_totals(self):
for line in self: for line in self:
if line.type == 'subscribed':
if line.type == "subscribed":
line.amount_subscribed = line.share_unit_price * line.quantity line.amount_subscribed = line.share_unit_price * line.quantity
if line.type == 'subscribed' and line.tax_shelter:
if (line.capital_before_sub < line.capital_limit
and line.capital_after_sub >= line.capital_limit):
if line.type == "subscribed" and line.tax_shelter:
if (
line.capital_before_sub < line.capital_limit
and line.capital_after_sub >= line.capital_limit
):
line.amount_subscribed_eligible = ( line.amount_subscribed_eligible = (
line.capital_limit - line.capital_before_sub line.capital_limit - line.capital_before_sub
) )
elif (line.capital_before_sub < line.capital_limit
and line.capital_after_sub <= line.capital_limit):
elif (
line.capital_before_sub < line.capital_limit
and line.capital_after_sub <= line.capital_limit
):
line.amount_subscribed_eligible = ( line.amount_subscribed_eligible = (
line.share_unit_price * line.quantity line.share_unit_price * line.quantity
) )
elif line.capital_before_sub >= line.capital_limit: elif line.capital_before_sub >= line.capital_limit:
line.amount_subscribed_eligible = 0 line.amount_subscribed_eligible = 0
if line.type == 'resold':
if line.type == "resold":
line.amount_resold = line.share_unit_price * -(line.quantity) line.amount_resold = line.share_unit_price * -(line.quantity)
if line.type == 'transfered':
line.amount_transfered = (
line.share_unit_price * -(line.quantity)
)
if line.type == "transfered":
line.amount_transfered = line.share_unit_price * -(line.quantity)
Loading…
Cancel
Save