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.

711 lines
34 KiB

6 years ago
6 years ago
6 years ago
6 years ago
  1. # -*- coding: utf-8 -*-
  2. from datetime import datetime
  3. from openerp import api, fields, models, _
  4. from openerp.addons.base_iban import base_iban
  5. from openerp.exceptions import UserError, ValidationError
  6. _REQUIRED = ['email',
  7. 'firstname',
  8. 'lastname',
  9. 'birthdate',
  10. 'address',
  11. 'share_product_id',
  12. 'ordered_parts',
  13. 'zip_code',
  14. 'city',
  15. 'iban',
  16. 'no_registre',
  17. 'gender'] # Could be improved including required from model
  18. @api.model
  19. def _lang_get(self):
  20. languages = self.env['res.lang'].search([])
  21. return [(language.code, language.name) for language in languages]
  22. class subscription_request(models.Model):
  23. _name = 'subscription.request'
  24. _description = 'Subscription Request'
  25. def get_required_field(self):
  26. required_fields = _REQUIRED
  27. company = self.env['res.company']._company_default_get()
  28. if company.data_policy_approval_required:
  29. required_fields.append('data_policy_approved')
  30. if company.internal_rules_approval_required:
  31. required_fields.append('internal_rules_approved')
  32. return required_fields
  33. @api.model
  34. def create(self, vals):
  35. partner_obj = self.env['res.partner']
  36. if not vals.get('partner_id'):
  37. cooperator = False
  38. if vals.get('no_registre'):
  39. cooperator = partner_obj.get_cooperator_from_nin(
  40. vals.get('no_registre'))
  41. if cooperator:
  42. # TODO remove the following line of code once it has
  43. # been founded a way to avoid dubble entry
  44. cooperator = cooperator[0]
  45. if cooperator.member:
  46. vals['type'] = 'increase'
  47. vals['already_cooperator'] = True
  48. else:
  49. vals['type'] = 'subscription'
  50. vals['partner_id'] = cooperator.id
  51. if not cooperator.cooperator:
  52. cooperator.write({'cooperator': True})
  53. else:
  54. cooperator_id = vals.get('partner_id')
  55. cooperator = partner_obj.browse(cooperator_id)
  56. if cooperator.member:
  57. vals['type'] = 'increase'
  58. vals['already_cooperator'] = True
  59. subscr_request = super(subscription_request, self).create(vals)
  60. confirmation_mail_template = self.env.ref('easy_my_coop.email_template_confirmation', False)
  61. confirmation_mail_template.send_mail(subscr_request.id)
  62. return subscr_request
  63. @api.model
  64. def create_comp_sub_req(self, vals):
  65. vals["name"] = vals['company_name']
  66. if not vals.get('partner_id'):
  67. cooperator = self.env['res.partner'].get_cooperator_from_crn(vals.get('company_register_number'))
  68. if cooperator:
  69. vals['partner_id'] = cooperator.id
  70. vals['type'] = 'increase'
  71. vals['already_cooperator'] = True
  72. subscr_request = super(subscription_request, self).create(vals)
  73. confirmation_mail_template = self.env.ref('easy_my_coop.email_template_confirmation_company', False)
  74. confirmation_mail_template.send_mail(subscr_request.id, True)
  75. return subscr_request
  76. def check_belgian_identification_id(self, nat_register_num):
  77. if not self.check_empty_string(nat_register_num):
  78. return False
  79. if len(nat_register_num) != 11:
  80. return False
  81. if not nat_register_num.isdigit():
  82. return False
  83. birthday_number = nat_register_num[0:9]
  84. controle = nat_register_num[9:11]
  85. check_controle = 97 - (int(birthday_number) % 97)
  86. if int(check_controle) != int(controle):
  87. check_controle = 97 - ((2000000000 + int(birthday_number)) % 97)
  88. if int(check_controle) != int(controle):
  89. return False
  90. return True
  91. def check_empty_string(self, value):
  92. if value is None or value is False or value == '':
  93. return False
  94. return True
  95. def check_iban(self, iban):
  96. validated = True
  97. try:
  98. base_iban.validate_iban(iban)
  99. except ValidationError:
  100. validated = False
  101. return validated
  102. @api.multi
  103. @api.depends('iban', 'no_registre', 'skip_control_ng', 'is_company')
  104. def _validated_lines(self):
  105. for sub_request in self:
  106. validated = self.check_iban(sub_request.iban)
  107. if validated and (sub_request.skip_control_ng or
  108. self.check_belgian_identification_id(
  109. sub_request.no_registre)):
  110. validated = True
  111. else:
  112. validated = False
  113. sub_request.validated = validated
  114. @api.multi
  115. @api.depends('share_product_id',
  116. 'share_product_id.list_price',
  117. 'ordered_parts')
  118. def _compute_subscription_amount(self):
  119. for sub_request in self:
  120. sub_request.subscription_amount = (sub_request.share_product_id.
  121. list_price *
  122. sub_request.ordered_parts)
  123. already_cooperator = fields.Boolean(string="I'm already cooperator",
  124. readonly=True,
  125. states={'draft': [('readonly', False)]}
  126. )
  127. name = fields.Char(string='Name',
  128. required=True,
  129. readonly=True,
  130. states={'draft': [('readonly', False)]})
  131. firstname = fields.Char(string='Firstname',
  132. readonly=True,
  133. states={'draft': [('readonly', False)]})
  134. lastname = fields.Char(string='Lastname',
  135. readonly=True,
  136. states={'draft': [('readonly', False)]})
  137. birthdate = fields.Date(string="Birthdate",
  138. readonly=True,
  139. states={'draft': [('readonly', False)]})
  140. gender = fields.Selection([('male', _('Male')),
  141. ('female', _('Female')),
  142. ('other', _('Other'))],
  143. string='Gender',
  144. readonly=True,
  145. states={'draft': [('readonly', False)]})
  146. type = fields.Selection([('new', 'New Cooperator'),
  147. ('subscription', 'Subscription'),
  148. ('increase', 'Increase number of share')],
  149. string='Type', default="new",
  150. readonly=True,
  151. states={'draft': [('readonly', False)]})
  152. state = fields.Selection([('draft', 'Draft'),
  153. ('block', 'Blocked'),
  154. ('done', 'Done'),
  155. ('waiting', 'Waiting'),
  156. ('transfer', 'Transfer'),
  157. ('cancelled', 'Cancelled'),
  158. ('paid', 'paid')],
  159. string='State', required=True, default="draft")
  160. email = fields.Char(string='Email',
  161. required=True,
  162. readonly=True,
  163. states={'draft': [('readonly', False)]})
  164. iban = fields.Char(string='Account Number',
  165. readonly=True,
  166. states={'draft': [('readonly', False)]})
  167. partner_id = fields.Many2one('res.partner',
  168. string='Cooperator',
  169. readonly=True,
  170. states={'draft': [('readonly', False)]})
  171. share_product_id = fields.Many2one('product.product',
  172. string='Share type',
  173. domain=[('is_share', '=', True)],
  174. required=True,
  175. readonly=True,
  176. states={'draft': [('readonly', False)]})
  177. share_short_name = fields.Char(related='share_product_id.short_name',
  178. string='Share type name',
  179. readonly=True,
  180. states={'draft': [('readonly', False)]})
  181. share_unit_price = fields.Float(related='share_product_id.list_price',
  182. string='Share price',
  183. readonly=True,
  184. states={'draft': [('readonly', False)]})
  185. subscription_amount = fields.Float(compute='_compute_subscription_amount',
  186. string='Subscription amount',
  187. readonly=True,
  188. states={'draft': [('readonly', False)]})
  189. ordered_parts = fields.Integer(string='Number of Share',
  190. required=True,
  191. readonly=True,
  192. default=1,
  193. states={'draft': [('readonly', False)]})
  194. address = fields.Char(string='Address',
  195. required=True,
  196. readonly=True,
  197. states={'draft': [('readonly', False)]})
  198. city = fields.Char(string='City',
  199. required=True,
  200. readonly=True,
  201. states={'draft': [('readonly', False)]})
  202. zip_code = fields.Char(string='Zip Code',
  203. required=True,
  204. readonly=True,
  205. states={'draft': [('readonly', False)]})
  206. country_id = fields.Many2one('res.country',
  207. string='Country',
  208. ondelete='restrict',
  209. required=True,
  210. readonly=True,
  211. states={'draft': [('readonly', False)]})
  212. phone = fields.Char(string='Phone',
  213. readonly=True,
  214. states={'draft': [('readonly', False)]})
  215. no_registre = fields.Char(string='National Register Number',
  216. readonly=True,
  217. states={'draft': [('readonly', False)]})
  218. user_id = fields.Many2one('res.users',
  219. string='Responsible',
  220. readonly=True)
  221. validated = fields.Boolean(compute='_validated_lines',
  222. string='Valid Line?',
  223. readonly=True)
  224. skip_control_ng = fields.Boolean(string="Skip control",
  225. help="if this field is checked then no"
  226. " control will be done on the national"
  227. " register number and on the iban bank"
  228. " account. To be done in case of the id"
  229. " card is from abroad or in case of"
  230. " a passport")
  231. lang = fields.Selection(_lang_get,
  232. string='Language',
  233. required=True,
  234. readonly=True,
  235. states={'draft': [('readonly', False)]},
  236. default=lambda self: self.env['res.company']._company_default_get().default_lang_id.code)
  237. date = fields.Date(string='Subscription date request',
  238. required=True,
  239. readonly=True,
  240. states={'draft': [('readonly', False)]},
  241. default=lambda self: datetime.strftime(datetime.now(),
  242. '%Y-%m-%d'))
  243. company_id = fields.Many2one('res.company',
  244. string='Company',
  245. required=True,
  246. change_default=True,
  247. readonly=True,
  248. default=lambda self: self.env['res.company']._company_default_get())
  249. is_company = fields.Boolean(string='Is a company',
  250. readonly=True,
  251. states={'draft': [('readonly', False)]})
  252. is_operation = fields.Boolean(string='Is an operation',
  253. readonly=True,
  254. states={'draft': [('readonly', False)]})
  255. company_name = fields.Char(string="Company name",
  256. readonly=True,
  257. states={'draft': [('readonly', False)]})
  258. company_email = fields.Char(string="Company email",
  259. readonly=True,
  260. states={'draft': [('readonly', False)]})
  261. company_register_number = fields.Char(string='Company register number',
  262. readonly=True,
  263. states={'draft': [('readonly', False)]})
  264. company_type = fields.Selection([('scrl', 'SCRL'),
  265. ('asbl', 'ASBL'),
  266. ('sprl', 'SPRL'),
  267. ('sa', 'SA'),
  268. ('other', 'Other')],
  269. string="Company type",
  270. readonly=True,
  271. states={'draft': [('readonly', False)]})
  272. same_address = fields.Boolean(string='Same address',
  273. readonly=True,
  274. states={'draft': [('readonly', False)]})
  275. activities_address = fields.Char(string='Activities address',
  276. readonly=True,
  277. states={'draft': [('readonly', False)]})
  278. activities_city = fields.Char(string='Activities city',
  279. readonly=True,
  280. states={'draft': [('readonly', False)]})
  281. activities_zip_code = fields.Char(string='Activities zip Code',
  282. readonly=True,
  283. states={'draft': [('readonly', False)]})
  284. activities_country_id = fields.Many2one('res.country',
  285. string='Activities country',
  286. ondelete='restrict',
  287. readonly=True,
  288. states={'draft': [('readonly', False)]})
  289. contact_person_function = fields.Char(string='Function',
  290. readonly=True,
  291. states={'draft': [('readonly', False)]})
  292. operation_request_id = fields.Many2one('operation.request',
  293. string="Operation Request",
  294. readonly=True,
  295. states={'draft': [('readonly', False)]})
  296. capital_release_request = fields.One2many('account.invoice',
  297. 'subscription_request',
  298. string='Capital release request',
  299. readonly=True,
  300. states={'draft': [('readonly', False)]})
  301. capital_release_request_date = fields.Date(string="Force the capital "
  302. "release request date",
  303. help="Keep empty to use the "
  304. "current date",
  305. copy=False,
  306. readonly=True,
  307. states={'draft': [('readonly', False)]})
  308. source = fields.Selection([('website', 'Website'),
  309. ('crm', 'CRM'),
  310. ('manual', 'Manual'),
  311. ('operation', 'Operation')],
  312. string="Source",
  313. default="website",
  314. readonly=True,
  315. states={'draft': [('readonly', False)]})
  316. data_policy_approved = fields.Boolean(
  317. string='Data Policy Approved',
  318. default=False,
  319. )
  320. internal_rules_approved = fields.Boolean(
  321. string='Approved Internal Rules',
  322. default=False,
  323. )
  324. _order = "id desc"
  325. def get_person_info(self, partner):
  326. self.firstname = partner.firstname
  327. self.name = partner.name
  328. self.lastname = partner.lastname
  329. self.no_registre = partner.national_register_number
  330. self.email = partner.email
  331. self.birthdate = partner.birthdate_date
  332. self.gender = partner.gender
  333. self.address = partner.street
  334. self.city = partner.city
  335. self.zip_code = partner.zip
  336. self.country_id = partner.country_id
  337. self.phone = partner.phone
  338. self.lang = partner.lang
  339. @api.onchange('partner_id')
  340. def onchange_partner(self):
  341. partner = self.partner_id
  342. if partner:
  343. self.is_company = partner.is_company
  344. self.already_cooperator = partner.member
  345. if partner.bank_ids:
  346. self.iban = partner.bank_ids[0].acc_number
  347. if partner.member:
  348. self.type = 'increase'
  349. if partner.is_company:
  350. self.company_name = partner.name
  351. self.company_email = partner.email
  352. self.company_register_number = partner.company_register_number
  353. representative = partner.get_representative()
  354. self.get_person_info(representative)
  355. self.contact_person_function = representative.function
  356. else:
  357. self.get_person_info(partner)
  358. # declare this function in order to be overriden
  359. def get_eater_vals(self, partner, share_product_id): #noqa
  360. return {}
  361. def _prepare_invoice_line(self, product, partner, qty):
  362. self.ensure_one()
  363. account = product.property_account_income_id \
  364. or product.categ_id.property_account_income_categ_id
  365. if not account:
  366. raise UserError(_('Please define income account for this product:'
  367. ' "%s" (id:%d) - or for its category: "%s".') %
  368. (product.name, product.id, product.categ_id.name))
  369. fpos = partner.property_account_position_id
  370. if fpos:
  371. account = fpos.map_account(account)
  372. res = {
  373. 'name': product.name,
  374. 'account_id': account.id,
  375. 'price_unit': product.lst_price,
  376. 'quantity': qty,
  377. 'uom_id': product.uom_id.id,
  378. 'product_id': product.id or False,
  379. }
  380. return res
  381. def send_capital_release_request(self, invoice):
  382. invoice_email_template = self.env['mail.template'].search([('name', '=', 'Request to Release Capital - Send by Email')])[0]
  383. # we send the email with the capital release request in attachment
  384. invoice_email_template.send_mail(invoice.id, True)
  385. invoice.sent = True
  386. def create_invoice(self, partner):
  387. # get subscription journal
  388. journal = self.env['account.journal'].search([('code', '=', 'SUBJ')])[0]
  389. # get the account for associate
  390. # TODO this should be defined in configuration
  391. if self.company_id.property_cooperator_account:
  392. account = self.company_id.property_cooperator_account
  393. else:
  394. account = self.env['account.account'].search([('code', '=', '416000')])[0]
  395. # creating invoice and invoice lines
  396. invoice_vals = {'partner_id': partner.id,
  397. 'journal_id': journal.id,
  398. 'account_id': account.id,
  399. 'type': 'out_invoice',
  400. 'release_capital_request': True,
  401. 'subscription_request': self.id}
  402. if self.capital_release_request_date:
  403. invoice_vals['date_invoice'] = self.capital_release_request_date
  404. invoice = self.env['account.invoice'].create(invoice_vals)
  405. vals = self._prepare_invoice_line(self.share_product_id, partner,
  406. self.ordered_parts)
  407. vals['invoice_id'] = invoice.id
  408. self.env['account.invoice.line'].create(vals)
  409. # validate the capital release request
  410. invoice.signal_workflow('invoice_open')
  411. self.send_capital_release_request(invoice)
  412. return invoice
  413. def get_partner_company_vals(self):
  414. partner_vals = {'name': self.company_name,
  415. 'last_name': self.company_name,
  416. 'is_company': self.is_company,
  417. 'company_register_number': self.company_register_number, #noqa
  418. 'cooperator': True,
  419. 'street': self.address, 'zip': self.zip_code,
  420. 'city': self.city, 'email': self.company_email,
  421. 'out_inv_comm_type': 'bba',
  422. 'customer': self.share_product_id.customer,
  423. 'out_inv_comm_algorithm': 'random',
  424. 'country_id': self.country_id.id,
  425. 'lang': self.lang,
  426. 'data_policy_approved': self.data_policy_approved,
  427. 'internal_rules_approved': self.internal_rules_approved}
  428. return partner_vals
  429. def get_partner_vals(self):
  430. partner_vals = {'name': self.name, 'firstname': self.firstname,
  431. 'lastname': self.lastname, 'street': self.address,
  432. 'zip': self.zip_code, 'email': self.email,
  433. 'gender': self.gender, 'cooperator': True,
  434. 'city': self.city, 'phone': self.phone,
  435. 'national_register_number': self.no_registre,
  436. 'out_inv_comm_type': 'bba',
  437. 'out_inv_comm_algorithm': 'random',
  438. 'country_id': self.country_id.id, 'lang': self.lang,
  439. 'birthdate_date': self.birthdate,
  440. 'customer': self.share_product_id.customer,
  441. 'data_policy_approved': self.data_policy_approved,
  442. 'internal_rules_approved': self.internal_rules_approved}
  443. return partner_vals
  444. def create_coop_partner(self):
  445. partner_obj = self.env['res.partner']
  446. if self.is_company:
  447. partner_vals = self.get_partner_company_vals()
  448. else:
  449. partner_vals = self.get_partner_vals()
  450. partner = partner_obj.create(partner_vals)
  451. if self.iban:
  452. self.env['res.partner.bank'].create({
  453. 'partner_id': partner.id,
  454. 'acc_number': self.iban
  455. })
  456. return partner
  457. @api.one
  458. def validate_subscription_request(self):
  459. partner_obj = self.env['res.partner']
  460. if self.ordered_parts <= 0:
  461. raise UserError(_('Number of share must be greater than 0.'))
  462. if self.partner_id:
  463. if not self.partner_id.cooperator:
  464. self.partner_id.cooperator = True
  465. partner = self.partner_id
  466. else:
  467. partner = None
  468. domain = []
  469. if self.already_cooperator:
  470. raise UserError(_('The checkbox already cooperator is'
  471. ' checked please select a cooperator.'))
  472. elif self.is_company and self.company_register_number:
  473. domain = [('company_register_number', '=', self.company_register_number)] #noqa
  474. elif not self.is_company and self.no_registre:
  475. domain = [('national_register_number', '=', self.no_registre)]
  476. if domain:
  477. partner = partner_obj.search(domain)
  478. if not partner:
  479. partner = self.create_coop_partner()
  480. else:
  481. partner = partner[0]
  482. if self.is_company and not partner.has_representative():
  483. contact = False
  484. if self.no_registre:
  485. domain = [('national_register_number', '=', self.no_registre)]
  486. contact = partner_obj.search(domain)
  487. if contact:
  488. contact.type = 'representative'
  489. if not contact:
  490. contact_vals = {'name': self.name,
  491. 'firstname': self.firstname,
  492. 'lastname': self.lastname, 'customer': False,
  493. 'is_company': False, 'cooperator': True,
  494. 'street': self.address, 'gender': self.gender,
  495. 'zip': self.zip_code, 'city': self.city,
  496. 'phone': self.phone, 'email': self.email,
  497. 'national_register_number': self.no_registre,
  498. 'country_id': self.country_id.id,
  499. 'out_inv_comm_type': 'bba',
  500. 'out_inv_comm_algorithm': 'random',
  501. 'lang': self.lang,
  502. 'birthdate_date': self.birthdate,
  503. 'parent_id': partner.id,
  504. 'representative': True,
  505. 'function': self.contact_person_function,
  506. 'type': 'representative',
  507. 'data_policy_approved': self.data_policy_approved,
  508. 'internal_rules_approved': self.internal_rules_approved}
  509. contact = partner_obj.create(contact_vals)
  510. else:
  511. if len(contact) > 1:
  512. raise UserError(_('There is two different persons with the'
  513. ' same national register number. Please'
  514. ' proceed to a merge before to continue')
  515. )
  516. if contact.parent_id and contact.parent_id.id != partner.id:
  517. raise UserError(_('This contact person is already defined'
  518. ' for another company. Please select'
  519. ' another contact'))
  520. else:
  521. contact.write({'parent_id': partner.id,
  522. 'representative': True})
  523. invoice = self.create_invoice(partner)
  524. self.write({'partner_id': partner.id, 'state': 'done'})
  525. return invoice
  526. @api.one
  527. def block_subscription_request(self):
  528. self.write({'state': 'block'})
  529. @api.one
  530. def unblock_subscription_request(self):
  531. self.write({'state': 'draft'})
  532. @api.one
  533. def cancel_subscription_request(self):
  534. self.write({'state': 'cancelled'})
  535. @api.one
  536. def put_on_waiting_list(self):
  537. self.write({'state': 'waiting'})
  538. class share_line(models.Model):
  539. _name = 'share.line'
  540. @api.multi
  541. def _compute_total_line(self):
  542. res = {}
  543. for line in self:
  544. line.total_amount_line = line.share_unit_price * line.share_number
  545. return res
  546. share_product_id = fields.Many2one('product.product',
  547. string='Share type',
  548. required=True,
  549. readonly=True)
  550. share_number = fields.Integer(string='Number of Share',
  551. required=True,
  552. readonly=True)
  553. share_short_name = fields.Char(related='share_product_id.short_name',
  554. string='Share type name',
  555. readonly=True)
  556. share_unit_price = fields.Float(string='Share price',
  557. readonly=True)
  558. effective_date = fields.Date(string='Effective Date',
  559. readonly=True)
  560. partner_id = fields.Many2one('res.partner',
  561. string='Cooperator',
  562. required=True,
  563. ondelete='cascade',
  564. readonly=True)
  565. total_amount_line = fields.Float(compute='_compute_total_line',
  566. string='Total amount line')
  567. class subscription_register(models.Model):
  568. _name = 'subscription.register'
  569. @api.multi
  570. def _compute_total_line(self):
  571. for register_line in self:
  572. register_line.total_amount_line = register_line.share_unit_price * register_line.quantity
  573. name = fields.Char(string='Register Number Operation',
  574. required=True,
  575. readonly=True)
  576. register_number_operation = fields.Integer(string='Register Number Operation',
  577. required=True,
  578. readonly=True)
  579. partner_id = fields.Many2one('res.partner',
  580. string='Cooperator',
  581. required=True,
  582. readonly=True)
  583. partner_id_to = fields.Many2one('res.partner',
  584. string='Transfered to',
  585. readonly=True)
  586. date = fields.Date(string='Subscription Date',
  587. required=True,
  588. readonly=True)
  589. quantity = fields.Integer(string='Number of share',
  590. readonly=True)
  591. share_unit_price = fields.Float(string='Share price',
  592. readonly=True)
  593. total_amount_line = fields.Float(compute='_compute_total_line',
  594. string='Total amount line')
  595. share_product_id = fields.Many2one('product.product',
  596. string='Share type',
  597. required=True,
  598. readonly=True,
  599. domain=[('is_share', '=', True)])
  600. share_short_name = fields.Char(related='share_product_id.short_name',
  601. string='Share type name',
  602. readonly=True)
  603. share_to_product_id = fields.Many2one('product.product',
  604. string='Share to type',
  605. readonly=True,
  606. domain=[('is_share', '=', True)])
  607. share_to_short_name = fields.Char(related='share_to_product_id.short_name',
  608. string='Share to type name',
  609. readonly=True)
  610. quantity_to = fields.Integer(string='Number of share to',
  611. readonly=True)
  612. share_to_unit_price = fields.Float(string='Share to price',
  613. readonly=True)
  614. type = fields.Selection([('subscription', 'Subscription'),
  615. ('transfer', 'Transfer'),
  616. ('sell_back', 'Sell Back'),
  617. ('convert', 'Conversion')],
  618. string='Operation Type', readonly=True)
  619. company_id = fields.Many2one('res.company', string='Company',
  620. required=True,
  621. change_default=True, readonly=True,
  622. default=lambda self: self.env['res.company']._company_default_get())
  623. user_id = fields.Many2one('res.users',
  624. string='Responsible',
  625. readonly=True,
  626. default=lambda self: self.env.user)
  627. _order = "register_number_operation asc"
  628. @api.model
  629. def read_group(self, domain, fields, groupby, offset=0, limit=None,
  630. orderby=False,
  631. lazy=True):
  632. if 'share_unit_price' in fields:
  633. fields.remove('share_unit_price')
  634. if 'register_number_operation' in fields:
  635. fields.remove('register_number_operation')
  636. res = super(subscription_register, self).read_group(domain, fields,
  637. groupby,
  638. offset=offset,
  639. limit=limit,
  640. orderby=orderby,
  641. lazy=lazy)
  642. if 'total_amount_line' in fields:
  643. for line in res:
  644. if '__domain' in line:
  645. lines = self.search(line['__domain'])
  646. inv_value = 0.0
  647. for line2 in lines:
  648. inv_value += line2.total_amount_line
  649. line['total_amount_line'] = inv_value
  650. return res