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.

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