Browse Source
[ADD] Dividend Engine
[ADD] Dividend Engine
this module allow to calculate the amount to give to the cooperator based on the purcentage to attributepull/1/head
houssine
6 years ago
6 changed files with 420 additions and 0 deletions
-
2easy_my_coop_dividend/__init__.py
-
51easy_my_coop_dividend/__openerp__.py
-
2easy_my_coop_dividend/models/__init__.py
-
200easy_my_coop_dividend/models/dividend.py
-
1easy_my_coop_dividend/security/ir.model.access.csv
-
164easy_my_coop_dividend/views/dividend_views.xml
@ -0,0 +1,2 @@ |
|||||
|
# -*- coding: utf8 -*- |
||||
|
from . import models |
@ -0,0 +1,51 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
# Copyright (C) 2013-2018 Open Architects Consulting SPRL. |
||||
|
# Copyright (C) 2013-2018 Coop IT Easy SCRLfs. |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. |
||||
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). |
||||
|
############################################################################## |
||||
|
|
||||
|
|
||||
|
{ |
||||
|
'name': 'Easy My Coop Dividend Engine', |
||||
|
|
||||
|
'summary': """ |
||||
|
Manage the dividend calculation for a fiscal year. |
||||
|
""", |
||||
|
'description': """ |
||||
|
This module allows to calculate the dividend to give to a cooperator base |
||||
|
on the amount of his shares, the percentage allocated and for how long the |
||||
|
shares have been owned on prorata temporis calculation. |
||||
|
""", |
||||
|
|
||||
|
'author': 'Houssine BAKKALI, <houssine@coopiteasy.be>', |
||||
|
'license': 'AGPL-3', |
||||
|
'version': '9.0.1.0', |
||||
|
'website': "www.coopiteasy.be", |
||||
|
|
||||
|
'category': 'Cooperative Management', |
||||
|
|
||||
|
'depends': [ |
||||
|
'base', |
||||
|
'web', |
||||
|
'mail', |
||||
|
], |
||||
|
|
||||
|
'data': [ |
||||
|
'security/ir.model.access.csv', |
||||
|
'views/dividend_views.xml', |
||||
|
] |
||||
|
} |
@ -0,0 +1,2 @@ |
|||||
|
# -*- coding: utf8 -*- |
||||
|
from . import dividend |
@ -0,0 +1,200 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
############################################################################## |
||||
|
# |
||||
|
# Copyright (C) 2013-2018 Open Architects Consulting SPRL. |
||||
|
# Copyright (C) 2013-2018 Coop IT Easy SCRLfs. |
||||
|
# |
||||
|
# This program is free software: you can redistribute it and/or modify |
||||
|
# it under the terms of the GNU Affero General Public License as |
||||
|
# published by the Free Software Foundation, either version 3 of the |
||||
|
# License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU Affero General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU Affero General Public License |
||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
from __future__ import division |
||||
|
from datetime import datetime |
||||
|
import openerp.addons.decimal_precision as dp |
||||
|
|
||||
|
from openerp import fields, models, api |
||||
|
|
||||
|
|
||||
|
class dividend_year(models.Model): |
||||
|
_name = 'dividend.year' |
||||
|
|
||||
|
@api.multi |
||||
|
def _compute_dividend_info(self): |
||||
|
res = {} |
||||
|
for dividend in self: |
||||
|
res[dividend.id] = {'grand_total_dividend': 0.0, |
||||
|
'grand_total_taxes': 0.0} |
||||
|
for line in dividend.dividend_ids: |
||||
|
res[dividend.id]['grand_total_dividend'] += line.dividend_amount |
||||
|
res[dividend.id]['grand_total_taxes'] += line.dividend_taxes |
||||
|
return res |
||||
|
|
||||
|
name = fields.Char(string='Code') |
||||
|
date_from = fields.Date(string='Date from') |
||||
|
date_to = fields.Date(string='Date to') |
||||
|
# fiscal_year_id = fields.Many2one('account.fiscalyear', |
||||
|
# string='Fiscal year') |
||||
|
percentage = fields.Float(string='Percentage') |
||||
|
withholding_tax = fields.Float(string='Withholding tax') |
||||
|
detailed_dividend_ids = fields.One2many('detailed.dividend.line', |
||||
|
'dividend_year_id', |
||||
|
string='Dividend lines') |
||||
|
dividend_ids = fields.One2many('dividend.line', |
||||
|
'dividend_year_id', |
||||
|
string='Dividend lines') |
||||
|
grand_total_dividend = fields.Float( |
||||
|
compute=_compute_dividend_info, |
||||
|
string='Grand total dividend', |
||||
|
digits_compute=dp.get_precision('Account')) |
||||
|
grand_total_taxes = fields.Float( |
||||
|
compute=_compute_dividend_info, |
||||
|
string='Grand total taxes', |
||||
|
digits_compute=dp.get_precision('Account')) |
||||
|
|
||||
|
@api.multi |
||||
|
def compute_dividend(self): |
||||
|
self.ensure_one() |
||||
|
det_div_line_obj = self.env['detailed.dividend.line'] |
||||
|
div_line_obj = self.env['dividend.line'] |
||||
|
res_partner_obj = self.env['res.partner'] |
||||
|
|
||||
|
# delete lines if any |
||||
|
detailed_dividend_ids = det_div_line_obj.search([('dividend_year_id', '=', self.id)]) |
||||
|
detailed_dividend_ids.unlink() |
||||
|
dividend_ids = div_line_obj.search([('dividend_year_id', '=', self.id)]) |
||||
|
dividend_ids.unlink() |
||||
|
|
||||
|
partner_ids = res_partner_obj.search([ |
||||
|
('cooperator', '=', True), |
||||
|
('member', '=', True)], |
||||
|
order='cooperator_register_number') |
||||
|
number_of_days = (datetime.strptime(self.date_to, '%Y-%m-%d') |
||||
|
- datetime.strptime(self.date_from, '%Y-%m-%d') |
||||
|
).days + 1 |
||||
|
print number_of_days |
||||
|
|
||||
|
for partner in partner_ids: |
||||
|
total_amount_dividend = 0.0 |
||||
|
for line in partner.share_ids: |
||||
|
vals = {} |
||||
|
vals2 = {} |
||||
|
line_id = False |
||||
|
if line.effective_date >= self.date_from \ |
||||
|
and line.effective_date <= self.date_to: |
||||
|
date_res = (datetime.strptime(self.date_to, '%Y-%m-%d') |
||||
|
- datetime.strptime(line.effective_date, '%Y-%m-%d')).days |
||||
|
coeff = (date_res / number_of_days) * self.percentage |
||||
|
dividend_amount = line.total_amount_line * coeff |
||||
|
|
||||
|
vals['days'] = date_res |
||||
|
vals['dividend_year_id'] = self.id |
||||
|
vals['coop_number'] = line.partner_id.cooperator_register_number |
||||
|
vals['partner_id'] = partner.id |
||||
|
vals['share_line_id'] = line.id |
||||
|
vals['coeff'] = coeff |
||||
|
vals['dividend_amount'] = dividend_amount |
||||
|
total_amount_dividend += dividend_amount |
||||
|
|
||||
|
line_id = det_div_line_obj.create(vals) |
||||
|
elif line.effective_date < self.date_from: |
||||
|
dividend_amount = line.total_amount_line * self.percentage |
||||
|
vals['days'] = number_of_days |
||||
|
vals['dividend_year_id'] = self.id |
||||
|
vals['coop_number'] = line.partner_id.cooperator_register_number |
||||
|
vals['partner_id'] = partner.id |
||||
|
vals['share_line_id'] = line.id |
||||
|
vals['coeff'] = self.percentage |
||||
|
vals['dividend_amount'] = dividend_amount |
||||
|
total_amount_dividend += dividend_amount |
||||
|
|
||||
|
line_id = det_div_line_obj.create(vals) |
||||
|
if line_id: |
||||
|
vals2['coop_number'] = line.partner_id.cooperator_register_number |
||||
|
vals2['dividend_year_id'] = self.id |
||||
|
vals2['partner_id'] = line.partner_id.id |
||||
|
|
||||
|
vals2['dividend_amount_net'] = total_amount_dividend |
||||
|
vals2['dividend_amount'] = total_amount_dividend |
||||
|
|
||||
|
# TODO set as a parameter on dividend year object |
||||
|
if total_amount_dividend <= 190.00: |
||||
|
vals2['dividend_taxes'] = 0.0 |
||||
|
else: |
||||
|
div_tax = (total_amount_dividend - 190) * self.withholding_tax |
||||
|
vals2['dividend_taxes'] = div_tax |
||||
|
vals2['dividend_amount_net'] = total_amount_dividend - div_tax |
||||
|
|
||||
|
div_line_obj.create(vals2) |
||||
|
return True |
||||
|
|
||||
|
|
||||
|
class DetailedDividendLine(models.Model): |
||||
|
_name = 'detailed.dividend.line' |
||||
|
|
||||
|
@api.multi |
||||
|
def _compute_total_line(self): |
||||
|
res = {} |
||||
|
for line in self: |
||||
|
res[line.id] = line.share_unit_price * line.share_number |
||||
|
return res |
||||
|
|
||||
|
dividend_year_id = fields.Many2one('dividend.year', |
||||
|
string='Dividend year') |
||||
|
coop_number = fields.Integer(string='Cooperator Number') |
||||
|
days = fields.Integer(string='Days') |
||||
|
partner_id = fields.Many2one('res.partner', |
||||
|
string='Cooperator', |
||||
|
readonly=True) |
||||
|
share_line_id = fields.Many2one('share.line', |
||||
|
string='Share line', |
||||
|
readonly=True) |
||||
|
share_number = fields.Integer(related='share_line_id.share_number', |
||||
|
string='Number of Share') |
||||
|
share_unit_price = fields.Float(related='share_line_id.share_unit_price', |
||||
|
string='Share unit price') |
||||
|
effective_date = fields.Date(related='share_line_id.effective_date', |
||||
|
string='Effective date') |
||||
|
total_amount_line = fields.Float(compute=_compute_total_line, |
||||
|
string="Total value of share", |
||||
|
readonly=True) |
||||
|
coeff = fields.Float(string='Coefficient to apply', |
||||
|
digits=(2, 4)) |
||||
|
dividend_amount = fields.Float(string='Gross Dividend') |
||||
|
dividend_amount_net = fields.Float(string='Dividend net') |
||||
|
dividend_taxes = fields.Float(string='Taxes') |
||||
|
|
||||
|
|
||||
|
class dividend_line(models.Model): |
||||
|
_name = 'dividend.line' |
||||
|
|
||||
|
@api.multi |
||||
|
def _get_account_number(self): |
||||
|
res = {} |
||||
|
for line in self: |
||||
|
bank_accounts = self.env['res.partner.bank'].search( |
||||
|
[('partner_id', '=', line.partner_id.id)]) |
||||
|
res[line.id] = bank_accounts[0].acc_number |
||||
|
|
||||
|
return res |
||||
|
|
||||
|
coop_number = fields.Integer(string='Coop Number') |
||||
|
dividend_year_id = fields.Many2one('dividend.year', |
||||
|
string='Dividend year') |
||||
|
partner_id = fields.Many2one('res.partner', |
||||
|
string='Cooperator', |
||||
|
readonly=True) |
||||
|
account_number = fields.Char(compute=_get_account_number, |
||||
|
string='Account Number') |
||||
|
dividend_amount = fields.Float(string='Gross Dividend') |
||||
|
dividend_amount_net = fields.Float(string='Dividend net') |
||||
|
dividend_taxes = fields.Float(string='Taxes') |
@ -0,0 +1 @@ |
|||||
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink |
@ -0,0 +1,164 @@ |
|||||
|
<odoo> |
||||
|
<data> |
||||
|
<menuitem name="Dividend" id="menu_easy_my_coop_main_dividend" parent="easy_my_coop.menu_main_easy_my_coop" sequence="10" /> |
||||
|
|
||||
|
<record id="dividend_year_form" model="ir.ui.view"> |
||||
|
<field name="name">dividend.year.form</field> |
||||
|
<field name="model">dividend.year</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Dividend year"> |
||||
|
<header> |
||||
|
<button name="compute_dividend" string="Compute dividend" type="object" class="oe_highlight" groups="base.group_user"/> |
||||
|
</header> |
||||
|
<sheet> |
||||
|
<group> |
||||
|
<group> |
||||
|
<field name="name"/> |
||||
|
<field name="percentage"/> |
||||
|
<field name="grand_total_dividend"/> |
||||
|
<field name="grand_total_taxes"/> |
||||
|
</group> |
||||
|
<group> |
||||
|
<field name="date_from"/> |
||||
|
<field name="date_to"/> |
||||
|
<field name="withholding_tax"/> |
||||
|
</group> |
||||
|
</group> |
||||
|
<notebook> |
||||
|
<page string="Dividend line"> |
||||
|
<field name="dividend_ids"> |
||||
|
<tree> |
||||
|
<field name="coop_number"/> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="dividend_amount" sum="Total dividend"/> |
||||
|
<field name="dividend_amount_net" sum="Total dividend net"/> |
||||
|
<field name="dividend_taxes" sum="Total dividend taxes"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</page> |
||||
|
<page string="Detailed dividend line"> |
||||
|
<field name="detailed_dividend_ids"> |
||||
|
<tree> |
||||
|
<field name="coop_number"/> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="share_number"/> |
||||
|
<field name="share_unit_price"/> |
||||
|
<field name="effective_date"/> |
||||
|
<field name="days"/> |
||||
|
<field name="total_amount_line"/> |
||||
|
<field name="coeff"/> |
||||
|
<field name="dividend_amount" string="Dividend" sum="Total dividend"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</page> |
||||
|
</notebook> |
||||
|
</sheet> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="dividend_year_tree" model="ir.ui.view"> |
||||
|
<field name="name">dividend.year.tree</field> |
||||
|
<field name="model">dividend.year</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Dividend year"> |
||||
|
<field name="name"/> |
||||
|
<field name="percentage"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="dividend_year_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Dividend year</field> |
||||
|
<field name="res_model">dividend.year</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_id" ref="dividend_year_tree"/> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem action="dividend_year_action" name="Dividend" id="menu_dividend_year" parent="menu_easy_my_coop_main_dividend" sequence="10"/> |
||||
|
|
||||
|
<record id="view_detailed_dividend_line_filter" model="ir.ui.view"> |
||||
|
<field name="name">detailed.dividend.line.select</field> |
||||
|
<field name="model">detailed.dividend.line</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="Search detailed dividend line"> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="coop_number"/> |
||||
|
<filter name="dividend_year_id" string="Dividend Year"/> |
||||
|
<separator/> |
||||
|
<filter string="Partner" domain="[]" context="{'group_by':'partner_id'}"/> |
||||
|
<filter string="Dividend Year" domain="[]" context="{'group_by':'dividend_year_id'}"/> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
<record id="detailed_dividend_line_tree" model="ir.ui.view"> |
||||
|
<field name="name">detailed.dividend.line.tree</field> |
||||
|
<field name="model">detailed.dividend.line</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="Detailed dividend lines"> |
||||
|
<field name="dividend_year_id"/> |
||||
|
<field name="coop_number"/> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="share_number"/> |
||||
|
<field name="share_unit_price"/> |
||||
|
<field name="effective_date"/> |
||||
|
<field name="days"/> |
||||
|
<field name="total_amount_line"/> |
||||
|
<field name="coeff"/> |
||||
|
<field name="dividend_amount" string="Dividend" sum="Total dividend"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="detailed_dividend_line_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Detailed dividend lines</field> |
||||
|
<field name="res_model">detailed.dividend.line</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_id" ref="detailed_dividend_line_tree"/> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem action="detailed_dividend_line_action" name="Detailed dividend lines" id="menu_det_dividend_line" parent="menu_easy_my_coop_main_dividend" sequence="20"/> |
||||
|
|
||||
|
<record id="view_dividend_line_filter" model="ir.ui.view"> |
||||
|
<field name="name">dividend.line.select</field> |
||||
|
<field name="model">dividend.line</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<search string="Search Subscription"> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="coop_number"/> |
||||
|
<filter name="dividend_year_id" string="Dividend Year"/> |
||||
|
<separator/> |
||||
|
<group expand="0" string="Group By..."> |
||||
|
<filter string="Partner" domain="[]" context="{'group_by':'partner_id'}"/> |
||||
|
<filter string="Dividend Year" domain="[]" context="{'group_by':'dividend_year_id'}"/> |
||||
|
</group> |
||||
|
</search> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="dividend_line_tree" model="ir.ui.view"> |
||||
|
<field name="name">dividend.line.tree</field> |
||||
|
<field name="model">dividend.line</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<tree string="dividend lines"> |
||||
|
<field name="dividend_year_id"/> |
||||
|
<field name="coop_number"/> |
||||
|
<field name="partner_id"/> |
||||
|
<field name="account_number"/> |
||||
|
<field name="dividend_amount" sum="Total dividend"/> |
||||
|
<field name="dividend_amount_net" sum="Total dividend net"/> |
||||
|
<field name="dividend_taxes" sum="Total dividend taxes"/> |
||||
|
</tree> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="dividend_line_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Dividend lines</field> |
||||
|
<field name="res_model">dividend.line</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_id" ref="dividend_line_tree"/> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem action="dividend_line_action" name="Dividend lines" id="menu_dividend_line" parent="menu_easy_my_coop_main_dividend" sequence="30"/> |
||||
|
</data> |
||||
|
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue