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.
229 lines
7.5 KiB
229 lines
7.5 KiB
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
import odoo.addons.decimal_precision as dp
|
|
|
|
|
|
class PartnerCreateSubscription(models.TransientModel):
|
|
_name = "partner.create.subscription"
|
|
_description = "Create Subscription From Partner"
|
|
|
|
@api.multi
|
|
@api.onchange("share_product")
|
|
def on_change_share_type(self):
|
|
self.share_qty = self.share_product.minimum_quantity
|
|
|
|
@api.model
|
|
def _default_product_id(self):
|
|
domain = [
|
|
("is_share", "=", True),
|
|
("default_share_product", "=", True),
|
|
]
|
|
active_id = self.env.context.get("active_id")
|
|
if active_id:
|
|
partner = self.env["res.partner"].browse(active_id)
|
|
if partner.is_company:
|
|
domain.append(("by_company", "=", True))
|
|
else:
|
|
domain.append(("by_individual", "=", True))
|
|
|
|
return self.env["product.product"].search(domain)[0]
|
|
|
|
def _get_representative(self):
|
|
partner = self._get_partner()
|
|
if partner.is_company:
|
|
return partner.search(
|
|
[("parent_id", "=", partner.id), ("representative", "=", True)]
|
|
)
|
|
return False
|
|
|
|
@api.model
|
|
def _get_representative_email(self):
|
|
representative = self._get_representative()
|
|
if representative:
|
|
return representative.email
|
|
return False
|
|
|
|
@api.model
|
|
def _get_representative_name(self):
|
|
representative = self._get_representative()
|
|
if representative:
|
|
return representative.name
|
|
return False
|
|
|
|
@api.model
|
|
def _get_partner(self):
|
|
active_id = self.env.context.get("active_id")
|
|
return self.env["res.partner"].browse(active_id)
|
|
|
|
@api.model
|
|
def _get_is_company(self):
|
|
return self._get_partner().is_company
|
|
|
|
@api.model
|
|
def _get_email(self):
|
|
return self._get_partner().email
|
|
|
|
@api.model
|
|
def _get_register_number(self):
|
|
partner = self._get_partner()
|
|
if partner.is_company:
|
|
return partner.company_register_number
|
|
|
|
@api.model
|
|
def _get_bank_account(self):
|
|
partner = self._get_partner()
|
|
if len(partner.bank_ids) > 0:
|
|
return partner.bank_ids[0].acc_number
|
|
return None
|
|
|
|
@api.model
|
|
def _get_possible_share(self):
|
|
domain = [("is_share", "=", True)]
|
|
partner = self._get_partner()
|
|
if partner.is_company:
|
|
domain.append(("by_company", "=", True))
|
|
else:
|
|
domain.append(("by_individual", "=", True))
|
|
|
|
return domain
|
|
|
|
@api.multi
|
|
@api.depends("share_product", "share_qty")
|
|
def _compute_subscription_amount(self):
|
|
for sub_request in self:
|
|
sub_request.subscription_amount = (
|
|
sub_request.share_product.list_price * sub_request.share_qty
|
|
)
|
|
|
|
is_company = fields.Boolean(String="Is company?", default=_get_is_company)
|
|
cooperator = fields.Many2one(
|
|
"res.partner", string="Cooperator", default=_get_partner
|
|
)
|
|
register_number = fields.Char(
|
|
string="Register Company Number", default=_get_register_number
|
|
)
|
|
email = fields.Char(string="Email", required=True, default=_get_email)
|
|
bank_account = fields.Char(
|
|
string="Bank account", required=True, default=_get_bank_account
|
|
)
|
|
share_product = fields.Many2one(
|
|
"product.product",
|
|
string="Share Type",
|
|
domain=_get_possible_share,
|
|
default=_default_product_id,
|
|
required=True,
|
|
)
|
|
share_qty = fields.Integer(string="Share Quantity", required=True)
|
|
share_unit_price = fields.Float(
|
|
related="share_product.list_price", string="Share price", readonly=True
|
|
)
|
|
subscription_amount = fields.Float(
|
|
compute="_compute_subscription_amount",
|
|
string="Subscription amount",
|
|
digits=dp.get_precision("Account"),
|
|
readonly=True,
|
|
)
|
|
representative_name = fields.Char(
|
|
string="Representative name", default=_get_representative_name
|
|
)
|
|
representative_email = fields.Char(
|
|
string="Representative email", default=_get_representative_email
|
|
)
|
|
|
|
@api.multi
|
|
def create_subscription(self):
|
|
sub_req = self.env["subscription.request"]
|
|
partner_obj = self.env["res.partner"]
|
|
|
|
cooperator = self.cooperator
|
|
vals = {
|
|
"partner_id": cooperator.id,
|
|
"share_product_id": self.share_product.id,
|
|
"ordered_parts": self.share_qty,
|
|
"cooperator": True,
|
|
"user_id": self.env.uid,
|
|
"email": self.email,
|
|
"source": "crm",
|
|
"address": self.cooperator.street,
|
|
"zip_code": self.cooperator.zip,
|
|
"city": self.cooperator.city,
|
|
"country_id": self.cooperator.country_id.id,
|
|
}
|
|
|
|
if self.is_company:
|
|
vals["company_name"] = cooperator.name
|
|
vals["company_email"] = cooperator.email
|
|
vals["name"] = "/"
|
|
vals["company_register_number"] = self.register_number
|
|
vals["is_company"] = True
|
|
else:
|
|
vals["name"] = cooperator.name
|
|
|
|
coop_vals = {}
|
|
if not self._get_email():
|
|
coop_vals["email"] = self.email
|
|
|
|
if not self._get_register_number():
|
|
if self.is_company:
|
|
coop_vals["company_register_number"] = self.register_number
|
|
|
|
if self.is_company and not self._get_representative():
|
|
representative = False
|
|
if self.representative_email:
|
|
representative = partner_obj.search(
|
|
[("email", "=", self.representative_email)]
|
|
)
|
|
|
|
if representative:
|
|
if len(representative) > 1:
|
|
raise UserError(
|
|
_(
|
|
"There is two different persons with "
|
|
"the same national register number. "
|
|
"Please proceed to a merge before to "
|
|
"continue"
|
|
)
|
|
)
|
|
if representative.parent_id:
|
|
raise UserError(
|
|
_(
|
|
"A person can't be representative of "
|
|
"two different companies."
|
|
)
|
|
)
|
|
representative.parent_id = cooperator.id
|
|
else:
|
|
if self.representative_email:
|
|
represent_vals = {
|
|
"name": self.representative_name,
|
|
"cooperator": True,
|
|
"email": self.representative_email,
|
|
"parent_id": cooperator.id,
|
|
"representative": True,
|
|
}
|
|
partner_obj.create(represent_vals)
|
|
|
|
if not self._get_bank_account():
|
|
partner_bank = self.env["res.partner.bank"]
|
|
partner_bank.create(
|
|
{"partner_id": cooperator.id, "acc_number": self.bank_account}
|
|
)
|
|
vals["iban"] = self.bank_account
|
|
if self.is_company:
|
|
representative = self._get_representative()
|
|
vals["name"] = representative.name
|
|
|
|
if coop_vals:
|
|
cooperator.write(coop_vals)
|
|
|
|
new_sub_req = sub_req.create(vals)
|
|
|
|
return {
|
|
"type": "ir.actions.act_window",
|
|
"view_type": "form, tree",
|
|
"view_mode": "form",
|
|
"res_model": "subscription.request",
|
|
"res_id": new_sub_req.id,
|
|
"target": "current",
|
|
}
|