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.
 
 

314 lines
10 KiB

from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError, Warning
from psycopg2 import sql, DatabaseError
from werkzeug import utils
import re
from string import ascii_uppercase
class partner(models.Model):
_inherit = 'res.partner'
type = fields.Selection(
[('contact', 'Contact'),
('invoice', 'Invoice Address'),
('delivery', 'Delivery Address'),
('other', 'Other Address'),
("private", "Private Address"),
], string='Address Type',
default='private',
help="Invoice & Delivery addresses are used in sales orders. Private addresses are only visible by authorized users.")
locality=fields.Char('Locality')
tax_street=fields.Char('Street')
tax_street2=fields.Char('Street2')
tax_locality=fields.Char('Locality')
tax_city=fields.Char('City')
tax_zip=fields.Char('Zip ')
tax_country_id=fields.Many2one('res.country')
def _compute_address_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.address_count = len(partner.address_ids)
except Exception:
partner.address_count = 0
def _compute_email_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.email_count = len(partner.email_ids)
except Exception:
partner.email_count = 0
def _compute_phone_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.phone_count = len(partner.phone_ids)
except Exception:
partner.phone_count = 0
def _compute_relationshipPartner_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.relationshipPartner_count = len(partner.relationshipPartner_ids)
except Exception:
partner.relationshipPartner_count = 0
def _compute_recurring_donation_count(self):
# The current user may not have access rights for donations
for partner in self:
try:
partner.recurring_donation_count=self.env['donation.donation'].search_count(['&',('recurring_template','!=',''),('partner_id','=',int(partner.id))])
except Exception:
partner.recurring_donation_count = 0
qualifier_ids = fields.One2many(
'opendons_qualifier.partnerqualifier',
'partner_id',
string='Qualifier',
readonly=True
)
address_ids = fields.One2many(
'opendons.partneraddress',
'partner_id',
string='Address',
readonly=True
)
request_ids = fields.Many2many('opendons.request', 'request_partner_rel', 'partner_id', 'request_id', string='requests')
operation_ids = fields.Many2many('opendons.operation', 'operation_partner_rel', 'partner_id', 'operation_id', string='operations')
operation_excl_ids = fields.Many2many('opendons.operation', 'operation_excl_partner_rel', 'partner_id', 'operation_id', string='excluded operations')
segment_ids = fields.Many2many('opendons.segment', 'segment_partner_rel', 'partner_id', 'segment_id', string='segments')
address_count = fields.Integer(
compute='_compute_address_count',
string="# of Addresses",
readonly=True
)
relationshipPartner_ids = fields.One2many(
'opendons_relationship.partner',
'partner_id',
string='Relationship',
readonly=True
)
relationshipPartner_count = fields.Integer(
compute='_compute_relationshipPartner_count',
string="# of Relationship",
readonly=True
)
email_ids = fields.One2many(
'opendons.partneremail',
'partner_id',
string='Email',
readonly=True
)
email_count = fields.Integer(
compute='_compute_email_count',
string="# of email",
readonly=True
)
phone_ids = fields.One2many(
'opendons.partnerphone',
'partner_id',
string='Phone',
readonly=True
)
phone_count = fields.Integer(
compute='_compute_phone_count',
string="# of phone",
readonly=True
)
recurring_donation_count = fields.Integer(
compute='_compute_recurring_donation_count',
string="# of recurring donation",
readonly=True
)
key=fields.Char(
string="Key",
store=True,
readonly=True
)
firstname=fields.Char(string="First name")
npai_count=fields.Integer(String="NPAI count", readonly=True)
source=fields.Char(String="source")
donor_id=fields.Char('Donor id',compute="_compute_donor_id",store=True)
def _compute_donor_id(self):
for rec in self:
if rec.key:
rec.donor_id=str(rec.id)+rec.key
else :
rec.donor_id=""
def _alpha(self,id):
alpha={}
alpha[0]='A'
alpha[1]='B'
alpha[2]='C'
alpha[3]='D'
alpha[4]='E'
alpha[5]='F'
alpha[6]='G'
alpha[7]='H'
alpha[8]='I'
alpha[9]='J'
alpha[10]='K'
alpha[11]='L'
alpha[12]='M'
alpha[13]='N'
alpha[14]='P'
alpha[15]='Q'
alpha[16]='R'
alpha[17]='S'
alpha[18]='T'
alpha[19]='U'
alpha[20]='V'
alpha[21]='W'
alpha[22]='X'
alpha[23]='Y'
alpha[24]='Z'
return (alpha[id%25])
def _compute_key(self):
self.key==self._alpha(int(self.id))
@api.model
def create(self, values):
# Override the original create function for the res.partner model
record = super(partner, self).create(values)
# Change the values of a variable in this super function
record['key'] = self._alpha(int(record.id))
# Return the record so that the changes are applied and everything is stored.
return record
def _compute_all_key(self):
for rec in self.env['res.partner'].search([]):
rec.key=self._alpha(int(rec.id))
def _compute_all_donor_id(self):
for rec in self.env['res.partner'].search([]):
rec.donor_id=str(rec.id)+rec.key
def _update_source(self):
for rec in self.env['res.partner'].search([]):
rec.source='joomla'
def _remove_source(self):
self.env["res.partner"].search([('source','=','joomla')]).unlink()
@api.onchange('street')
def _onchange_street(self):
for rec in self:
rec.npai_count=0
return
@api.constrains('email')
def _onchange_email(self):
if self.email:
if not self.image_1920 and self._context.get('gravatar_image') and self.email:
self.image_1920 = self._get_gravatar_image(self.email)
regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+')
if not re.fullmatch(regex, self.email):
raise ValidationError('Invalid email')
@api.constrains('phone')
def _onchange_phone(self):
if self.mobile:
regex = re.compile(r'(^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$)+')
# 0123456789
# 01 23 45 67 89
# 01.23.45.67.89
# 0123 45.67.89
# 0033 123-456-789
# +33-1.23.45.67.89
# +33 - 123 456 789
# +33(0) 123 456 789
# +33 (0)123 45 67 89
# +33 (0)1 2345-6789
# +33(0) - 123456789
if not re.fullmatch(regex, self.phone):
raise ValidationError('Invalid phone')
@api.constrains('mobile')
def _onchange_mobile(self):
if self.mobile:
regex = re.compile(r'(^(?:(?:\+|00)33[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)[1-9](?:(?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]?\d{3}){2})$)+')
# 0123456789
# 01 23 45 67 89
# 01.23.45.67.89
# 0123 45.67.89
# 0033 123-456-789
# +33-1.23.45.67.89
# +33 - 123 456 789
# +33(0) 123 456 789
# +33 (0)123 45 67 89
# +33 (0)1 2345-6789
# +33(0) - 123456789
if not re.fullmatch(regex, self.mobile):
raise ValidationError('Invalid mobile')
class ResPartnerBank(models.Model):
_inherit = 'res.partner.bank'
@api.onchange('acc_number')
def _onchange_acc_number(self):
#validation IBAN
#https://www.regextester.com/115565
if self.acc_number:
regex = re.compile(r'(^(?:(?:IT|SM)\d{2}[A-Z]\d{22}|CY\d{2}[A-Z]\d{23}|NL\d{2}[A-Z]{4}\d{10}|LV\d{2}[A-Z]{4}\d{13}|(?:BG|BH|GB|IE)\d{2}[A-Z]{4}\d{14}|GI\d{2}[A-Z]{4}\d{15}|RO\d{2}[A-Z]{4}\d{16}|KW\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{23}|NO\d{13}|(?:DK|FI|GL|FO)\d{16}|MK\d{17}|(?:AT|EE|KZ|LU|XK)\d{18}|(?:BA|HR|LI|CH|CR)\d{19}|(?:GE|DE|LT|ME|RS)\d{20}|IL\d{21}|(?:AD|CZ|ES|MD|SA)\d{22}|PT\d{23}|(?:BE|IS)\d{24}|(?:FR|MR|MC)\d{25}|(?:AL|DO|LB|PL)\d{26}|(?:AZ|HU)\d{27}|(?:GR|MU)\d{28})$)+')
if not re.fullmatch(regex, self.acc_number):
raise Warning('Invalid IBAN')
@api.constrains('acc_number')
def _onchange_acc_number(self):
#validation IBAN
#https://www.regextester.com/115565
if self.acc_number:
regex = re.compile(r'(^(?:(?:IT|SM)\d{2}[A-Z]\d{22}|CY\d{2}[A-Z]\d{23}|NL\d{2}[A-Z]{4}\d{10}|LV\d{2}[A-Z]{4}\d{13}|(?:BG|BH|GB|IE)\d{2}[A-Z]{4}\d{14}|GI\d{2}[A-Z]{4}\d{15}|RO\d{2}[A-Z]{4}\d{16}|KW\d{2}[A-Z]{4}\d{22}|MT\d{2}[A-Z]{4}\d{23}|NO\d{13}|(?:DK|FI|GL|FO)\d{16}|MK\d{17}|(?:AT|EE|KZ|LU|XK)\d{18}|(?:BA|HR|LI|CH|CR)\d{19}|(?:GE|DE|LT|ME|RS)\d{20}|IL\d{21}|(?:AD|CZ|ES|MD|SA)\d{22}|PT\d{23}|(?:BE|IS)\d{24}|(?:FR|MR|MC)\d{25}|(?:AL|DO|LB|PL)\d{26}|(?:AZ|HU)\d{27}|(?:GR|MU)\d{28})$)+')
if not re.fullmatch(regex, self.acc_number):
raise Warning('Invalid IBAN')