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.

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