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.

716 lines
32 KiB

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