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.

200 lines
9.1 KiB

  1. # -*- coding: utf-8 -*-
  2. ##############################################################################
  3. #
  4. # Copyright (C) 2013-2018 Open Architects Consulting SPRL.
  5. # Copyright (C) 2013-2018 Coop IT Easy SCRLfs.
  6. #
  7. # This program is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU Affero General Public License as
  9. # published by the Free Software Foundation, either version 3 of the
  10. # License, or (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU Affero General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU Affero General Public License
  18. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. #
  20. ##############################################################################
  21. from __future__ import division
  22. from datetime import datetime
  23. import openerp.addons.decimal_precision as dp
  24. from openerp import fields, models, api
  25. class dividend_year(models.Model):
  26. _name = 'dividend.year'
  27. @api.multi
  28. def _compute_dividend_info(self):
  29. res = {}
  30. for dividend in self:
  31. res[dividend.id] = {'grand_total_dividend': 0.0,
  32. 'grand_total_taxes': 0.0}
  33. for line in dividend.dividend_ids:
  34. res[dividend.id]['grand_total_dividend'] += line.dividend_amount
  35. res[dividend.id]['grand_total_taxes'] += line.dividend_taxes
  36. return res
  37. name = fields.Char(string='Code')
  38. date_from = fields.Date(string='Date from')
  39. date_to = fields.Date(string='Date to')
  40. # fiscal_year_id = fields.Many2one('account.fiscalyear',
  41. # string='Fiscal year')
  42. percentage = fields.Float(string='Percentage')
  43. withholding_tax = fields.Float(string='Withholding tax')
  44. detailed_dividend_ids = fields.One2many('detailed.dividend.line',
  45. 'dividend_year_id',
  46. string='Dividend lines')
  47. dividend_ids = fields.One2many('dividend.line',
  48. 'dividend_year_id',
  49. string='Dividend lines')
  50. grand_total_dividend = fields.Float(
  51. compute=_compute_dividend_info,
  52. string='Grand total dividend',
  53. digits_compute=dp.get_precision('Account'))
  54. grand_total_taxes = fields.Float(
  55. compute=_compute_dividend_info,
  56. string='Grand total taxes',
  57. digits_compute=dp.get_precision('Account'))
  58. @api.multi
  59. def compute_dividend(self):
  60. self.ensure_one()
  61. det_div_line_obj = self.env['detailed.dividend.line']
  62. div_line_obj = self.env['dividend.line']
  63. res_partner_obj = self.env['res.partner']
  64. # delete lines if any
  65. detailed_dividend_ids = det_div_line_obj.search([('dividend_year_id', '=', self.id)])
  66. detailed_dividend_ids.unlink()
  67. dividend_ids = div_line_obj.search([('dividend_year_id', '=', self.id)])
  68. dividend_ids.unlink()
  69. partner_ids = res_partner_obj.search([
  70. ('cooperator', '=', True),
  71. ('member', '=', True)],
  72. order='cooperator_register_number')
  73. number_of_days = (datetime.strptime(self.date_to, '%Y-%m-%d')
  74. - datetime.strptime(self.date_from, '%Y-%m-%d')
  75. ).days + 1
  76. print number_of_days
  77. for partner in partner_ids:
  78. total_amount_dividend = 0.0
  79. for line in partner.share_ids:
  80. vals = {}
  81. vals2 = {}
  82. line_id = False
  83. if line.effective_date >= self.date_from \
  84. and line.effective_date <= self.date_to:
  85. date_res = (datetime.strptime(self.date_to, '%Y-%m-%d')
  86. - datetime.strptime(line.effective_date, '%Y-%m-%d')).days
  87. coeff = (date_res / number_of_days) * self.percentage
  88. dividend_amount = line.total_amount_line * coeff
  89. vals['days'] = date_res
  90. vals['dividend_year_id'] = self.id
  91. vals['coop_number'] = line.partner_id.cooperator_register_number
  92. vals['partner_id'] = partner.id
  93. vals['share_line_id'] = line.id
  94. vals['coeff'] = coeff
  95. vals['dividend_amount'] = dividend_amount
  96. total_amount_dividend += dividend_amount
  97. line_id = det_div_line_obj.create(vals)
  98. elif line.effective_date < self.date_from:
  99. dividend_amount = line.total_amount_line * self.percentage
  100. vals['days'] = number_of_days
  101. vals['dividend_year_id'] = self.id
  102. vals['coop_number'] = line.partner_id.cooperator_register_number
  103. vals['partner_id'] = partner.id
  104. vals['share_line_id'] = line.id
  105. vals['coeff'] = self.percentage
  106. vals['dividend_amount'] = dividend_amount
  107. total_amount_dividend += dividend_amount
  108. line_id = det_div_line_obj.create(vals)
  109. if line_id:
  110. vals2['coop_number'] = line.partner_id.cooperator_register_number
  111. vals2['dividend_year_id'] = self.id
  112. vals2['partner_id'] = line.partner_id.id
  113. vals2['dividend_amount_net'] = total_amount_dividend
  114. vals2['dividend_amount'] = total_amount_dividend
  115. # TODO set as a parameter on dividend year object
  116. if total_amount_dividend <= 190.00:
  117. vals2['dividend_taxes'] = 0.0
  118. else:
  119. div_tax = (total_amount_dividend - 190) * self.withholding_tax
  120. vals2['dividend_taxes'] = div_tax
  121. vals2['dividend_amount_net'] = total_amount_dividend - div_tax
  122. div_line_obj.create(vals2)
  123. return True
  124. class DetailedDividendLine(models.Model):
  125. _name = 'detailed.dividend.line'
  126. @api.multi
  127. def _compute_total_line(self):
  128. res = {}
  129. for line in self:
  130. res[line.id] = line.share_unit_price * line.share_number
  131. return res
  132. dividend_year_id = fields.Many2one('dividend.year',
  133. string='Dividend year')
  134. coop_number = fields.Integer(string='Cooperator Number')
  135. days = fields.Integer(string='Days')
  136. partner_id = fields.Many2one('res.partner',
  137. string='Cooperator',
  138. readonly=True)
  139. share_line_id = fields.Many2one('share.line',
  140. string='Share line',
  141. readonly=True)
  142. share_number = fields.Integer(related='share_line_id.share_number',
  143. string='Number of Share')
  144. share_unit_price = fields.Float(related='share_line_id.share_unit_price',
  145. string='Share unit price')
  146. effective_date = fields.Date(related='share_line_id.effective_date',
  147. string='Effective date')
  148. total_amount_line = fields.Float(compute=_compute_total_line,
  149. string="Total value of share",
  150. readonly=True)
  151. coeff = fields.Float(string='Coefficient to apply',
  152. digits=(2, 4))
  153. dividend_amount = fields.Float(string='Gross Dividend')
  154. dividend_amount_net = fields.Float(string='Dividend net')
  155. dividend_taxes = fields.Float(string='Taxes')
  156. class dividend_line(models.Model):
  157. _name = 'dividend.line'
  158. @api.multi
  159. def _get_account_number(self):
  160. res = {}
  161. for line in self:
  162. bank_accounts = self.env['res.partner.bank'].search(
  163. [('partner_id', '=', line.partner_id.id)])
  164. res[line.id] = bank_accounts[0].acc_number
  165. return res
  166. coop_number = fields.Integer(string='Coop Number')
  167. dividend_year_id = fields.Many2one('dividend.year',
  168. string='Dividend year')
  169. partner_id = fields.Many2one('res.partner',
  170. string='Cooperator',
  171. readonly=True)
  172. account_number = fields.Char(compute=_get_account_number,
  173. string='Account Number')
  174. dividend_amount = fields.Float(string='Gross Dividend')
  175. dividend_amount_net = fields.Float(string='Dividend net')
  176. dividend_taxes = fields.Float(string='Taxes')