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.

700 lines
33 KiB

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