You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
11 KiB

  1. # -*- coding: utf-8 -*-
  2. import base64
  3. from datetime import datetime
  4. from openerp import api, fields, models, _
  5. TYPE_MAP = {
  6. 'subscription':'subscribed',
  7. 'transfer':'transfered',
  8. 'sell_back':'resold'
  9. }
  10. class TaxShelterDeclaration(models.Model):
  11. _name = "tax.shelter.declaration"
  12. name = fields.Char(string='Declaration year', required=True)
  13. fiscal_year = fields.Char(String="Fiscal year", required=True)
  14. tax_shelter_certificates = fields.One2many('tax.shelter.certificate','declaration_id', string='Tax shelter certificates', readonly=True)
  15. date_from = fields.Date(string='Date from', required=True)
  16. date_to = fields.Date(string='Date to', required=True)
  17. month_from = fields.Char(String='Month from', required=True)
  18. month_to = fields.Char(String='Month to', required=True)
  19. tax_shelter_percentage = fields.Selection([('30','30%'),
  20. ('45','45%')],
  21. string='Tax Shelter percentage', required=True)
  22. state = fields.Selection([('draft','Draft'),
  23. ('computed','Computed'),
  24. ('validated','Validated')],
  25. string='State',required=True, default="draft")
  26. company_id = fields.Many2one('res.company', string='Company', required=True,
  27. change_default=True, readonly=True,
  28. default=lambda self: self.env['res.company']._company_default_get())
  29. tax_shelter_capital_limit = fields.Float(string="Tax shelter capital limite", required=True)
  30. def _prepare_line(self, certificate, entry):
  31. line_vals = {}
  32. line_vals['tax_shelter_certificate'] = certificate.id
  33. line_vals['share_type'] = entry.share_product_id.id
  34. line_vals['share_short_name'] = entry.share_short_name
  35. line_vals['share_unit_price'] = entry.share_unit_price
  36. line_vals['quantity'] = entry.quantity
  37. line_vals['transaction_date'] = entry.date
  38. line_vals['type'] = TYPE_MAP[entry.type]
  39. return line_vals
  40. def _compute_certificates(self,entries,partner_certificate):
  41. for entry in entries:
  42. certificate = partner_certificate.get(entry.partner_id.id, False)
  43. if not certificate:
  44. #create a certificate for this cooperator
  45. cert_vals={}
  46. cert_vals['declaration_id'] = self.id
  47. cert_vals['partner_id'] = entry.partner_id.id
  48. cert_vals['cooperator_number'] = entry.partner_id.cooperator_register_number
  49. certificate = self.env['tax.shelter.certificate'].create(cert_vals)
  50. partner_certificate[entry.partner_id.id] = certificate
  51. line_vals = self._prepare_line(certificate, entry)
  52. self.env['certificate.line'].create(line_vals)
  53. return partner_certificate
  54. @api.one
  55. def compute_declaration(self):
  56. entries = self.env['subscription.register'].search([('date','>=',self.date_from),
  57. ('date','<=',self.date_to),
  58. ('type','=','subscription')])
  59. partner_certificate = self._compute_certificates(entries, partner_certificate = {})
  60. entries = self.env['subscription.register'].search([('date','<=',self.date_to),
  61. ('type','in',['sell_back','transfer'])])
  62. partner_certificate = self._compute_certificates(entries, partner_certificate)
  63. self.state = 'computed'
  64. @api.one
  65. def generate_attachments(self):
  66. self.tax_shelter_certificates.generate_certificates_report()
  67. @api.one
  68. def validate_declaration(self):
  69. self.state = 'validated'
  70. @api.one
  71. def reset_declaration(self):
  72. if not self.state == 'validated':
  73. certificate_ids = self.tax_shelter_certificates.ids
  74. self.tax_shelter_certificates.unlink()
  75. certificate_attchments = self.env['ir.attachment'].search([('res_model','=','tax.shelter.certificate'),
  76. ('res_id','in',certificate_ids)])
  77. certificate_attchments.unlink
  78. class TaxShelterCertificate(models.Model):
  79. _name = "tax.shelter.certificate"
  80. _order = "cooperator_number asc"
  81. cooperator_number = fields.Integer(string='Cooperator number', required=True, readonly=True)
  82. partner_id = fields.Many2one('res.partner', string='Cooperator', required=True, readonly=True)
  83. state = fields.Selection([('draft','Draft'),
  84. ('validated','Validated'),
  85. ('sent','Sent')],
  86. string='State',required=True, default="draft")
  87. declaration_id = fields.Many2one('tax.shelter.declaration', string='Declaration', required=True, readonly=True)
  88. lines = fields.One2many('certificate.line','tax_shelter_certificate', string='Certificate lines', readonly=True)
  89. subscribed_lines = fields.One2many(compute='_compute_certificate_lines', comodel_name='certificate.line', string='Shares subscribed', readonly=True)
  90. resold_lines = fields.One2many(compute='_compute_certificate_lines', comodel_name='certificate.line', string='Shares resold', readonly=True)
  91. transfered_lines = fields.One2many(compute='_compute_certificate_lines', comodel_name='certificate.line', string='Shares transfered', readonly=True)
  92. total_amount_subscribed = fields.Float(compute='_compute_amounts', string='Total subscribed')
  93. total_amount_resold = fields.Float(compute='_compute_amounts', string='Total resold')
  94. total_amount_transfered = fields.Float(compute='_compute_amounts', string='Total transfered')
  95. total_amount = fields.Float(compute='_compute_amounts', string='Total', readonly=True)
  96. company_id = fields.Many2one(related="declaration_id.company_id", string="Company")
  97. def attach_to_certificate(self, report, report_name):
  98. attachment_data = {
  99. 'name': report_name,
  100. 'datas_fname': report_name,
  101. 'datas': report,
  102. 'res_model': 'tax.shelter.certificate',
  103. 'res_id': self.id,
  104. }
  105. self.env['ir.attachment'].create(attachment_data)
  106. @api.multi
  107. def generate_certificates_report(self):
  108. report_dic = {'easy_my_coop_taxshelter_report.tax_shelter_subscription_report':'Tax Shelter Subscription',
  109. 'easy_my_coop_taxshelter_report.tax_shelter_shares_report':'Tax Shelter Shares'}
  110. for certificate in self:
  111. for report_action, name in report_dic.items():
  112. report = self.env['report'].get_pdf(certificate, report_action)
  113. report = base64.b64encode(report)
  114. report_name = certificate.partner_id.name + ' ' + name + ' ' + certificate.declaration_id.name + '.pdf'
  115. certificate.attach_to_certificate(report, report_name)
  116. @api.multi
  117. def print_subscription_certificate(self):
  118. self.ensure_one()
  119. return self.env['report'].get_action(self, 'easy_my_coop_taxshelter_report.tax_shelter_subscription_report')
  120. @api.multi
  121. def print_shares_certificate(self):
  122. self.ensure_one()
  123. return self.env['report'].get_action(self, 'easy_my_coop_taxshelter_report.tax_shelter_shares_report')
  124. @api.multi
  125. def _compute_amounts(self):
  126. for certificate in self:
  127. total_amount_subscribed = 0
  128. total_amount_transfered = 0
  129. total_amount_resold = 0
  130. for line in certificate.subscribed_lines:
  131. total_amount_subscribed += line.amount_subscribed
  132. certificate.total_amount_subscribed = total_amount_subscribed
  133. for line in certificate.transfered_lines:
  134. total_amount_transfered += line.amount_transfered
  135. certificate.total_amount_transfered = total_amount_transfered
  136. for line in certificate.resold_lines:
  137. total_amount_resold += line.amount_resold
  138. certificate.total_amount_resold = total_amount_resold
  139. certificate.total_amount = certificate.total_amount_subscribed + certificate.total_amount_resold + certificate.total_amount_transfered
  140. @api.multi
  141. def _compute_certificate_lines(self):
  142. for certificate in self:
  143. certificate.subscribed_lines = certificate.lines.filtered(lambda r: r.type == 'subscribed')
  144. certificate.resold_lines = certificate.lines.filtered(lambda r: r.type == 'resold')
  145. certificate.transfered_lines = certificate.lines.filtered(lambda r: r.type == 'transfered')
  146. class TaxShelterCertificateLine(models.Model):
  147. _name= "certificate.line"
  148. tax_shelter_certificate = fields.Many2one('tax.shelter.certificate', string="Tax shelter certificate",ondelete='cascade',required=True)
  149. share_type = fields.Many2one('product.product', string='Share type', required=True, readonly=True)
  150. share_unit_price = fields.Float(string='Share price', required=True, readonly=True)
  151. quantity = fields.Integer(string='Number of shares', required=True, readonly=True)
  152. transaction_date = fields.Date(string="Transaction date")
  153. type = fields.Selection([('subscribed','Subscribed'),
  154. ('resold','Resold'),
  155. ('transfered','Transfered'),
  156. ('kept','Kept')], required=True, readonly=True)
  157. amount_subscribed = fields.Float(compute='_compute_totals', string='Amount subscribed',store=True)
  158. amount_resold = fields.Float(compute='_compute_totals', string='Amount resold',store=True)
  159. amount_transfered = fields.Float(compute='_compute_totals', string='Amount transfered',store=True)
  160. share_short_name = fields.Char(string='Share type name', readonly=True)
  161. @api.multi
  162. @api.depends('quantity','share_unit_price')
  163. def _compute_totals(self):
  164. for line in self:
  165. if line.type == 'subscribed':
  166. line.amount_subscribed = line.share_unit_price * line.quantity
  167. if line.type == 'resold':
  168. line.amount_resold = line.share_unit_price * -(line.quantity)
  169. if line.type == 'transfered':
  170. line.amount_transfered = line.share_unit_price * -(line.quantity)