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.

934 lines
30 KiB

  1. # Copyright 2019 Coop IT Easy SCRL fs
  2. # Houssine Bakkali <houssine@coopiteasy.be>
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. from datetime import datetime
  5. # pylint: disable=missing-manifest-dependency
  6. from addons.base_iban.models.res_partner_bank import validate_iban
  7. from odoo import _, api, fields, models
  8. from odoo.exceptions import UserError, ValidationError
  9. # This structure is only used in easy_my_coop_webstite's controller
  10. _REQUIRED = [
  11. "email",
  12. "firstname",
  13. "lastname",
  14. "birthdate",
  15. "address",
  16. "share_product_id",
  17. "ordered_parts",
  18. "zip_code",
  19. "city",
  20. "gender",
  21. ]
  22. @api.model
  23. def _lang_get(self):
  24. languages = self.env["res.lang"].search([])
  25. return [(language.code, language.name) for language in languages]
  26. # todo move to subscription_request.py
  27. class SubscriptionRequest(models.Model):
  28. _name = "subscription.request"
  29. _description = "Subscription Request"
  30. # This function is only used in easy_my_coop_webstite's controller
  31. def get_required_field(self):
  32. required_fields = _REQUIRED
  33. company = self.env["res.company"]._company_default_get()
  34. if company.data_policy_approval_required:
  35. required_fields.append("data_policy_approved")
  36. if company.internal_rules_approval_required:
  37. required_fields.append("internal_rules_approved")
  38. if company.financial_risk_approval_required:
  39. required_fields.append("financial_risk_approved")
  40. return required_fields
  41. def get_mail_template_notif(self, is_company=False):
  42. if is_company:
  43. mail_template = "easy_my_coop.email_template_confirmation_company"
  44. else:
  45. mail_template = "easy_my_coop.email_template_confirmation"
  46. return self.env.ref(mail_template, False)
  47. def is_member(self, vals, cooperator):
  48. if cooperator.member:
  49. vals["type"] = "increase"
  50. vals["already_cooperator"] = True
  51. return vals
  52. @api.model
  53. def create(self, vals):
  54. partner_obj = self.env["res.partner"]
  55. if not vals.get("partner_id"):
  56. cooperator = False
  57. if vals.get("email"):
  58. cooperator = partner_obj.get_cooperator_from_email(vals.get("email"))
  59. if cooperator:
  60. # TODO remove the following line once it has
  61. # been found a way to avoid double encoding
  62. cooperator = cooperator[0]
  63. vals["type"] = "subscription"
  64. vals = self.is_member(vals, cooperator)
  65. vals["partner_id"] = cooperator.id
  66. else:
  67. cooperator_id = vals.get("partner_id")
  68. cooperator = partner_obj.browse(cooperator_id)
  69. vals = self.is_member(vals, cooperator)
  70. if not cooperator.cooperator:
  71. cooperator.write({"cooperator": True})
  72. subscr_request = super(SubscriptionRequest, self).create(vals)
  73. mail_template_notif = subscr_request.get_mail_template_notif(False)
  74. mail_template_notif.send_mail(subscr_request.id)
  75. return subscr_request
  76. @api.model
  77. def create_comp_sub_req(self, vals):
  78. vals["name"] = vals["company_name"]
  79. if not vals.get("partner_id"):
  80. cooperator = self.env["res.partner"].get_cooperator_from_crn(
  81. vals.get("company_register_number")
  82. )
  83. if cooperator:
  84. vals["partner_id"] = cooperator.id
  85. vals["type"] = "increase"
  86. vals["already_cooperator"] = True
  87. subscr_request = super(SubscriptionRequest, self).create(vals)
  88. confirmation_mail_template = subscr_request.get_mail_template_notif(True)
  89. confirmation_mail_template.send_mail(subscr_request.id)
  90. return subscr_request
  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. try:
  97. if iban:
  98. validate_iban(iban)
  99. return True
  100. else:
  101. return False
  102. except ValidationError:
  103. return False
  104. @api.multi
  105. @api.depends("iban", "skip_control_ng")
  106. def _compute_validated_lines(self):
  107. for sub_request in self:
  108. validated = sub_request.skip_control_ng or self.check_iban(sub_request.iban)
  109. sub_request.validated = validated
  110. @api.multi
  111. @api.depends("share_product_id", "share_product_id.list_price", "ordered_parts")
  112. def _compute_subscription_amount(self):
  113. for sub_request in self:
  114. sub_request.subscription_amount = (
  115. sub_request.share_product_id.list_price * sub_request.ordered_parts
  116. )
  117. already_cooperator = fields.Boolean(
  118. string="I'm already cooperator",
  119. readonly=True,
  120. states={"draft": [("readonly", False)]},
  121. )
  122. name = fields.Char(
  123. string="Name",
  124. required=True,
  125. readonly=True,
  126. states={"draft": [("readonly", False)]},
  127. )
  128. firstname = fields.Char(
  129. string="Firstname",
  130. readonly=True,
  131. states={"draft": [("readonly", False)]},
  132. )
  133. lastname = fields.Char(
  134. string="Lastname",
  135. readonly=True,
  136. states={"draft": [("readonly", False)]},
  137. )
  138. birthdate = fields.Date(
  139. string="Birthdate",
  140. readonly=True,
  141. states={"draft": [("readonly", False)]},
  142. )
  143. gender = fields.Selection(
  144. [("male", _("Male")), ("female", _("Female")), ("other", _("Other"))],
  145. string="Gender",
  146. readonly=True,
  147. states={"draft": [("readonly", False)]},
  148. )
  149. type = fields.Selection(
  150. [
  151. ("new", "New Cooperator"),
  152. ("subscription", "Subscription"),
  153. ("increase", "Increase number of share"),
  154. ],
  155. string="Type",
  156. default="new",
  157. readonly=True,
  158. states={"draft": [("readonly", False)]},
  159. )
  160. state = fields.Selection(
  161. [
  162. ("draft", "Draft"),
  163. ("block", "Blocked"),
  164. ("done", "Done"),
  165. ("waiting", "Waiting"),
  166. ("transfer", "Transfer"),
  167. ("cancelled", "Cancelled"),
  168. ("paid", "paid"),
  169. ],
  170. string="State",
  171. required=True,
  172. default="draft",
  173. )
  174. email = fields.Char(
  175. string="Email",
  176. required=True,
  177. readonly=True,
  178. states={"draft": [("readonly", False)]},
  179. )
  180. iban = fields.Char(
  181. string="Account Number",
  182. readonly=True,
  183. states={"draft": [("readonly", False)]},
  184. )
  185. partner_id = fields.Many2one(
  186. "res.partner",
  187. string="Cooperator",
  188. readonly=True,
  189. states={"draft": [("readonly", False)]},
  190. )
  191. share_product_id = fields.Many2one(
  192. "product.product",
  193. string="Share type",
  194. domain=[("is_share", "=", True)],
  195. required=True,
  196. readonly=True,
  197. states={"draft": [("readonly", False)]},
  198. )
  199. share_short_name = fields.Char(
  200. related="share_product_id.short_name",
  201. string="Share type name",
  202. readonly=True,
  203. states={"draft": [("readonly", False)]},
  204. )
  205. share_unit_price = fields.Float(
  206. related="share_product_id.list_price",
  207. string="Share price",
  208. readonly=True,
  209. states={"draft": [("readonly", False)]},
  210. )
  211. subscription_amount = fields.Monetary(
  212. compute="_compute_subscription_amount",
  213. string="Subscription amount",
  214. currency_field="company_currency_id",
  215. readonly=True,
  216. states={"draft": [("readonly", False)]},
  217. )
  218. ordered_parts = fields.Integer(
  219. string="Number of Share",
  220. required=True,
  221. readonly=True,
  222. default=1,
  223. states={"draft": [("readonly", False)]},
  224. )
  225. address = fields.Char(
  226. string="Address",
  227. required=True,
  228. readonly=True,
  229. states={"draft": [("readonly", False)]},
  230. )
  231. city = fields.Char(
  232. string="City",
  233. required=True,
  234. readonly=True,
  235. states={"draft": [("readonly", False)]},
  236. )
  237. zip_code = fields.Char(
  238. string="Zip Code",
  239. required=True,
  240. readonly=True,
  241. states={"draft": [("readonly", False)]},
  242. )
  243. country_id = fields.Many2one(
  244. "res.country",
  245. string="Country",
  246. ondelete="restrict",
  247. required=True,
  248. readonly=True,
  249. states={"draft": [("readonly", False)]},
  250. )
  251. phone = fields.Char(
  252. string="Phone", readonly=True, states={"draft": [("readonly", False)]}
  253. )
  254. user_id = fields.Many2one("res.users", string="Responsible", readonly=True)
  255. # todo rename to valid_subscription_request
  256. validated = fields.Boolean(
  257. compute="_compute_validated_lines",
  258. string="Valid Subscription request?",
  259. readonly=True,
  260. )
  261. skip_control_ng = fields.Boolean(
  262. string="Skip control",
  263. help="if this field is checked then no"
  264. " control will be done on the national"
  265. " register number and on the iban bank"
  266. " account. To be done in case of the id"
  267. " card is from abroad or in case of"
  268. " a passport",
  269. )
  270. lang = fields.Selection(
  271. _lang_get,
  272. string="Language",
  273. required=True,
  274. readonly=True,
  275. states={"draft": [("readonly", False)]},
  276. default=lambda self: self.env["res.company"]
  277. ._company_default_get()
  278. .default_lang_id.code,
  279. )
  280. date = fields.Date(
  281. string="Subscription date request",
  282. required=True,
  283. readonly=True,
  284. states={"draft": [("readonly", False)]},
  285. default=lambda self: datetime.strftime(datetime.now(), "%Y-%m-%d"),
  286. )
  287. company_id = fields.Many2one(
  288. "res.company",
  289. string="Company",
  290. required=True,
  291. change_default=True,
  292. readonly=True,
  293. default=lambda self: self.env["res.company"]._company_default_get(),
  294. )
  295. company_currency_id = fields.Many2one(
  296. "res.currency",
  297. related="company_id.currency_id",
  298. string="Company Currency",
  299. readonly=True,
  300. )
  301. is_company = fields.Boolean(
  302. string="Is a company",
  303. readonly=True,
  304. states={"draft": [("readonly", False)]},
  305. )
  306. is_operation = fields.Boolean(
  307. string="Is an operation",
  308. readonly=True,
  309. states={"draft": [("readonly", False)]},
  310. )
  311. company_name = fields.Char(
  312. string="Company name",
  313. readonly=True,
  314. states={"draft": [("readonly", False)]},
  315. )
  316. company_email = fields.Char(
  317. string="Company email",
  318. readonly=True,
  319. states={"draft": [("readonly", False)]},
  320. )
  321. company_register_number = fields.Char(
  322. string="Company register number",
  323. readonly=True,
  324. states={"draft": [("readonly", False)]},
  325. )
  326. company_type = fields.Selection(
  327. [("", "")],
  328. string="Company type",
  329. readonly=True,
  330. states={"draft": [("readonly", False)]},
  331. )
  332. same_address = fields.Boolean(
  333. string="Same address",
  334. readonly=True,
  335. states={"draft": [("readonly", False)]},
  336. )
  337. activities_address = fields.Char(
  338. string="Activities address",
  339. readonly=True,
  340. states={"draft": [("readonly", False)]},
  341. )
  342. activities_city = fields.Char(
  343. string="Activities city",
  344. readonly=True,
  345. states={"draft": [("readonly", False)]},
  346. )
  347. activities_zip_code = fields.Char(
  348. string="Activities zip Code",
  349. readonly=True,
  350. states={"draft": [("readonly", False)]},
  351. )
  352. activities_country_id = fields.Many2one(
  353. "res.country",
  354. string="Activities country",
  355. ondelete="restrict",
  356. readonly=True,
  357. states={"draft": [("readonly", False)]},
  358. )
  359. contact_person_function = fields.Char(
  360. string="Function",
  361. readonly=True,
  362. states={"draft": [("readonly", False)]},
  363. )
  364. operation_request_id = fields.Many2one(
  365. "operation.request",
  366. string="Operation Request",
  367. readonly=True,
  368. states={"draft": [("readonly", False)]},
  369. )
  370. capital_release_request = fields.One2many(
  371. "account.invoice",
  372. "subscription_request",
  373. string="Capital release request",
  374. readonly=True,
  375. states={"draft": [("readonly", False)]},
  376. )
  377. capital_release_request_date = fields.Date(
  378. string="Force the capital " "release request date",
  379. help="Keep empty to use the " "current date",
  380. copy=False,
  381. readonly=True,
  382. states={"draft": [("readonly", False)]},
  383. )
  384. source = fields.Selection(
  385. [
  386. ("website", "Website"),
  387. ("crm", "CRM"),
  388. ("manual", "Manual"),
  389. ("operation", "Operation"),
  390. ],
  391. string="Source",
  392. default="website",
  393. readonly=True,
  394. states={"draft": [("readonly", False)]},
  395. )
  396. data_policy_approved = fields.Boolean(string="Data Policy Approved", default=False)
  397. internal_rules_approved = fields.Boolean(
  398. string="Approved Internal Rules", default=False
  399. )
  400. financial_risk_approved = fields.Boolean(
  401. string="Financial Risk Approved", default=False
  402. )
  403. _order = "id desc"
  404. def get_person_info(self, partner):
  405. self.firstname = partner.firstname
  406. self.name = partner.name
  407. self.lastname = partner.lastname
  408. self.email = partner.email
  409. self.birthdate = partner.birthdate_date
  410. self.gender = partner.gender
  411. self.address = partner.street
  412. self.city = partner.city
  413. self.zip_code = partner.zip
  414. self.country_id = partner.country_id
  415. self.phone = partner.phone
  416. self.lang = partner.lang
  417. @api.onchange("partner_id")
  418. def onchange_partner(self):
  419. partner = self.partner_id
  420. if partner:
  421. self.is_company = partner.is_company
  422. self.already_cooperator = partner.member
  423. if partner.bank_ids:
  424. self.iban = partner.bank_ids[0].acc_number
  425. if partner.member:
  426. self.type = "increase"
  427. if partner.is_company:
  428. self.company_name = partner.name
  429. self.company_email = partner.email
  430. self.company_register_number = partner.company_register_number
  431. representative = partner.get_representative()
  432. self.get_person_info(representative)
  433. self.contact_person_function = representative.function
  434. else:
  435. self.get_person_info(partner)
  436. # declare this function in order to be overriden
  437. def get_eater_vals(self, partner, share_product_id): # noqa
  438. return {}
  439. def _prepare_invoice_line(self, product, partner, qty):
  440. self.ensure_one()
  441. account = (
  442. product.property_account_income_id
  443. or product.categ_id.property_account_income_categ_id
  444. )
  445. if not account:
  446. raise UserError(
  447. _(
  448. "Please define income account for this product:"
  449. ' "%s" (id:%d) - or for its category: "%s".'
  450. )
  451. % (product.name, product.id, product.categ_id.name)
  452. )
  453. fpos = partner.property_account_position_id
  454. if fpos:
  455. account = fpos.map_account(account)
  456. res = {
  457. "name": product.name,
  458. "account_id": account.id,
  459. "price_unit": product.lst_price,
  460. "quantity": qty,
  461. "uom_id": product.uom_id.id,
  462. "product_id": product.id or False,
  463. }
  464. return res
  465. def get_capital_release_mail_template(self):
  466. template = "easy_my_coop.email_template_release_capital"
  467. return self.env.ref(template, False)
  468. def send_capital_release_request(self, invoice):
  469. email_template = self.get_capital_release_mail_template()
  470. # we send the email with the capital release request in attachment
  471. # TODO remove sudo() and give necessary access right
  472. email_template.sudo().send_mail(invoice.id, True)
  473. invoice.sent = True
  474. def get_journal(self):
  475. return self.env.ref("easy_my_coop.subscription_journal")
  476. def get_accounting_account(self):
  477. account_obj = self.env["account.account"]
  478. if self.company_id.property_cooperator_account:
  479. account = self.company_id.property_cooperator_account
  480. else:
  481. accounts = account_obj.search([("code", "=", "416000")])
  482. if accounts:
  483. account = accounts[0]
  484. else:
  485. raise UserError(_("You must set a cooperator account on you company."))
  486. return account
  487. def get_invoice_vals(self, partner):
  488. return {
  489. "partner_id": partner.id,
  490. "journal_id": self.get_journal().id,
  491. "account_id": self.get_accounting_account().id,
  492. "type": "out_invoice",
  493. "release_capital_request": True,
  494. "subscription_request": self.id,
  495. }
  496. def create_invoice(self, partner):
  497. # creating invoice and invoice lines
  498. invoice_vals = self.get_invoice_vals(partner)
  499. if self.capital_release_request_date:
  500. invoice_vals["date_invoice"] = self.capital_release_request_date
  501. invoice = self.env["account.invoice"].create(invoice_vals)
  502. vals = self._prepare_invoice_line(
  503. self.share_product_id, partner, self.ordered_parts
  504. )
  505. vals["invoice_id"] = invoice.id
  506. self.env["account.invoice.line"].create(vals)
  507. # validate the capital release request
  508. invoice.action_invoice_open()
  509. self.send_capital_release_request(invoice)
  510. return invoice
  511. def get_partner_company_vals(self):
  512. partner_vals = {
  513. "name": self.company_name,
  514. "last_name": self.company_name,
  515. "is_company": self.is_company,
  516. "company_register_number": self.company_register_number, # noqa
  517. "cooperator": True,
  518. "street": self.address,
  519. "zip": self.zip_code,
  520. "city": self.city,
  521. "email": self.company_email,
  522. "out_inv_comm_type": "bba",
  523. "customer": self.share_product_id.customer,
  524. "country_id": self.country_id.id,
  525. "lang": self.lang,
  526. "data_policy_approved": self.data_policy_approved,
  527. "internal_rules_approved": self.internal_rules_approved,
  528. "financial_risk_approved": self.financial_risk_approved,
  529. }
  530. return partner_vals
  531. def get_partner_vals(self):
  532. partner_vals = {
  533. "name": self.name,
  534. "firstname": self.firstname,
  535. "lastname": self.lastname,
  536. "street": self.address,
  537. "zip": self.zip_code,
  538. "email": self.email,
  539. "gender": self.gender,
  540. "cooperator": True,
  541. "city": self.city,
  542. "phone": self.phone,
  543. "country_id": self.country_id.id,
  544. "lang": self.lang,
  545. "birthdate_date": self.birthdate,
  546. "customer": self.share_product_id.customer,
  547. "data_policy_approved": self.data_policy_approved,
  548. "internal_rules_approved": self.internal_rules_approved,
  549. "financial_risk_approved": self.financial_risk_approved,
  550. }
  551. return partner_vals
  552. def get_representative_vals(self):
  553. contact_vals = {
  554. "name": self.name,
  555. "firstname": self.firstname,
  556. "lastname": self.lastname,
  557. "customer": False,
  558. "is_company": False,
  559. "cooperator": True,
  560. "street": self.address,
  561. "gender": self.gender,
  562. "zip": self.zip_code,
  563. "city": self.city,
  564. "phone": self.phone,
  565. "email": self.email,
  566. "country_id": self.country_id.id,
  567. "out_inv_comm_type": "bba",
  568. "out_inv_comm_algorithm": "random",
  569. "lang": self.lang,
  570. "birthdate_date": self.birthdate,
  571. "parent_id": self.partner_id.id,
  572. "representative": True,
  573. "function": self.contact_person_function,
  574. "type": "representative",
  575. "data_policy_approved": self.data_policy_approved,
  576. "internal_rules_approved": self.internal_rules_approved,
  577. "financial_risk_approved": self.financial_risk_approved,
  578. }
  579. return contact_vals
  580. def create_coop_partner(self):
  581. partner_obj = self.env["res.partner"]
  582. if self.is_company:
  583. partner_vals = self.get_partner_company_vals()
  584. else:
  585. partner_vals = self.get_partner_vals()
  586. partner = partner_obj.create(partner_vals)
  587. if self.iban:
  588. self.env["res.partner.bank"].create(
  589. {"partner_id": partner.id, "acc_number": self.iban}
  590. )
  591. return partner
  592. def set_membership(self):
  593. # To be overridden
  594. return True
  595. @api.multi
  596. def validate_subscription_request(self):
  597. self.ensure_one()
  598. # todo rename to validate (careful with iwp dependencies)
  599. partner_obj = self.env["res.partner"]
  600. if self.ordered_parts <= 0:
  601. raise UserError(_("Number of share must be greater than 0."))
  602. if self.partner_id:
  603. partner = self.partner_id
  604. else:
  605. partner = None
  606. domain = []
  607. if self.already_cooperator:
  608. raise UserError(
  609. _(
  610. "The checkbox already cooperator is"
  611. " checked please select a cooperator."
  612. )
  613. )
  614. elif self.is_company and self.company_register_number:
  615. domain = [
  616. (
  617. "company_register_number",
  618. "=",
  619. self.company_register_number,
  620. )
  621. ] # noqa
  622. elif not self.is_company and self.email:
  623. domain = [("email", "=", self.email)]
  624. if domain:
  625. partner = partner_obj.search(domain)
  626. if not partner:
  627. partner = self.create_coop_partner()
  628. self.partner_id = partner
  629. else:
  630. partner = partner[0]
  631. partner.cooperator = True
  632. if self.is_company and not partner.has_representative():
  633. contact = False
  634. if self.email:
  635. domain = [("email", "=", self.email), ("company_type", "=", "person")]
  636. contact = partner_obj.search(domain)
  637. if len(contact) < 2:
  638. contact.type = "representative"
  639. else:
  640. raise UserError(
  641. _("You have duplicate contact with email %s" % self.email)
  642. )
  643. if not contact:
  644. contact_vals = self.get_representative_vals()
  645. partner_obj.create(contact_vals)
  646. else:
  647. if len(contact) > 1:
  648. raise UserError(
  649. _(
  650. "There is two different persons with the"
  651. " same national register number. Please"
  652. " proceed to a merge before to continue"
  653. )
  654. )
  655. if contact.parent_id and contact.parent_id.id != partner.parent_id.id:
  656. raise UserError(
  657. _(
  658. "This contact person is already defined"
  659. " for another company. Please select"
  660. " another contact"
  661. )
  662. )
  663. else:
  664. contact.write({"representative": True})
  665. invoice = self.create_invoice(partner)
  666. self.write({"state": "done"})
  667. self.set_membership()
  668. return invoice
  669. @api.multi
  670. def block_subscription_request(self):
  671. self.ensure_one()
  672. self.write({"state": "block"})
  673. @api.multi
  674. def unblock_subscription_request(self):
  675. self.ensure_one()
  676. self.write({"state": "draft"})
  677. @api.multi
  678. def cancel_subscription_request(self):
  679. self.ensure_one()
  680. self.write({"state": "cancelled"})
  681. @api.multi
  682. def put_on_waiting_list(self):
  683. self.ensure_one()
  684. waiting_list_mail_template = self.env.ref(
  685. "easy_my_coop.email_template_waiting_list", False
  686. )
  687. waiting_list_mail_template.send_mail(self.id, True)
  688. self.write({"state": "waiting"})
  689. # todo move to share_line.py
  690. class ShareLine(models.Model):
  691. _name = "share.line"
  692. _description = "Share line"
  693. @api.multi
  694. def _compute_total_line(self):
  695. res = {}
  696. for line in self:
  697. line.total_amount_line = line.share_unit_price * line.share_number
  698. return res
  699. share_product_id = fields.Many2one(
  700. "product.product", string="Share type", required=True, readonly=True
  701. )
  702. share_number = fields.Integer(
  703. string="Number of Share", required=True, readonly=True
  704. )
  705. share_short_name = fields.Char(
  706. related="share_product_id.short_name",
  707. string="Share type name",
  708. readonly=True,
  709. )
  710. share_unit_price = fields.Monetary(
  711. string="Share price",
  712. currency_field="company_currency_id",
  713. readonly=True,
  714. )
  715. effective_date = fields.Date(string="Effective Date", readonly=True)
  716. partner_id = fields.Many2one(
  717. "res.partner",
  718. string="Cooperator",
  719. required=True,
  720. ondelete="cascade",
  721. readonly=True,
  722. )
  723. total_amount_line = fields.Monetary(
  724. string="Total amount line",
  725. currency_field="company_currency_id",
  726. compute="_compute_total_line",
  727. )
  728. company_id = fields.Many2one(
  729. "res.company",
  730. string="Company",
  731. required=True,
  732. change_default=True,
  733. readonly=True,
  734. default=lambda self: self.env["res.company"]._company_default_get(),
  735. )
  736. company_currency_id = fields.Many2one(
  737. "res.currency",
  738. string="Company Currency",
  739. related="company_id.currency_id",
  740. readonly=True,
  741. )
  742. # todo move to subscription_register.py
  743. class SubscriptionRegister(models.Model):
  744. _name = "subscription.register"
  745. _description = "Subscription register"
  746. @api.multi
  747. def _compute_total_line(self):
  748. for line in self:
  749. line.total_amount_line = line.share_unit_price * line.quantity
  750. name = fields.Char(string="Number Operation", required=True, readonly=True)
  751. register_number_operation = fields.Integer(
  752. string="Register Number Operation", required=True, readonly=True
  753. )
  754. partner_id = fields.Many2one(
  755. "res.partner", string="Cooperator", required=True, readonly=True
  756. )
  757. partner_id_to = fields.Many2one(
  758. "res.partner", string="Transfered to", readonly=True
  759. )
  760. date = fields.Date(string="Subscription Date", required=True, readonly=True)
  761. quantity = fields.Integer(string="Number of share", readonly=True)
  762. share_unit_price = fields.Monetary(
  763. string="Share price",
  764. currency_field="company_currency_id",
  765. readonly=True,
  766. )
  767. total_amount_line = fields.Monetary(
  768. string="Total amount line",
  769. currency_field="company_currency_id",
  770. compute="_compute_total_line",
  771. )
  772. share_product_id = fields.Many2one(
  773. "product.product",
  774. string="Share type",
  775. required=True,
  776. readonly=True,
  777. domain=[("is_share", "=", True)],
  778. )
  779. share_short_name = fields.Char(
  780. related="share_product_id.short_name",
  781. string="Share type name",
  782. readonly=True,
  783. )
  784. share_to_product_id = fields.Many2one(
  785. "product.product",
  786. string="Share to type",
  787. readonly=True,
  788. domain=[("is_share", "=", True)],
  789. )
  790. share_to_short_name = fields.Char(
  791. related="share_to_product_id.short_name",
  792. string="Share to type name",
  793. readonly=True,
  794. )
  795. quantity_to = fields.Integer(string="Number of share to", readonly=True)
  796. share_to_unit_price = fields.Monetary(
  797. string="Share to price",
  798. currency_field="company_currency_id",
  799. readonly=True,
  800. )
  801. type = fields.Selection(
  802. [
  803. ("subscription", "Subscription"),
  804. ("transfer", "Transfer"),
  805. ("sell_back", "Sell Back"),
  806. ("convert", "Conversion"),
  807. ],
  808. string="Operation Type",
  809. readonly=True,
  810. )
  811. company_id = fields.Many2one(
  812. "res.company",
  813. string="Company",
  814. required=True,
  815. change_default=True,
  816. readonly=True,
  817. default=lambda self: self.env["res.company"]._company_default_get(),
  818. )
  819. company_currency_id = fields.Many2one(
  820. "res.currency",
  821. related="company_id.currency_id",
  822. string="Company Currency",
  823. readonly=True,
  824. )
  825. user_id = fields.Many2one(
  826. "res.users",
  827. string="Responsible",
  828. readonly=True,
  829. default=lambda self: self.env.user,
  830. )
  831. _order = "register_number_operation asc"
  832. @api.model
  833. def read_group(
  834. self,
  835. domain,
  836. fields,
  837. groupby,
  838. offset=0,
  839. limit=None,
  840. orderby=False,
  841. lazy=True,
  842. ):
  843. if "share_unit_price" in fields:
  844. fields.remove("share_unit_price")
  845. if "register_number_operation" in fields:
  846. fields.remove("register_number_operation")
  847. res = super(SubscriptionRegister, self).read_group(
  848. domain,
  849. fields,
  850. groupby,
  851. offset=offset,
  852. limit=limit,
  853. orderby=orderby,
  854. lazy=lazy,
  855. )
  856. if "total_amount_line" in fields:
  857. for line in res:
  858. if "__domain" in line:
  859. lines = self.search(line["__domain"])
  860. inv_value = 0.0
  861. for line2 in lines:
  862. inv_value += line2.total_amount_line
  863. line["total_amount_line"] = inv_value
  864. return res