Advertisement
bigdawgbz

wireman

Mar 9th, 2023
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.40 KB | Source Code | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. from odoo import models, fields, api, exceptions, _
  4. from datetime import datetime
  5. from dateutil.relativedelta import relativedelta
  6. from odoo.exceptions import ValidationError
  7. import werkzeug
  8.  
  9.  
  10. class PucWireman(models.Model):
  11. _name = 'puc.wireman'
  12. _inherit = ['mail.thread', 'mail.activity.mixin']
  13. _description = "Wireman Profile"
  14. _order = "last_name"
  15.  
  16. #Added a contraint to prevent ID Number from Changing.
  17. @api.constrains('id_number')
  18. def _check_id_number(self):
  19. for record in self:
  20. if record.status == 'approved' and record.id_number != record._origin.id_number:
  21. raise ValidationError('Cannot modify id_number for approved wireman.')
  22.  
  23.  
  24. @api.model
  25. def create(self, values):
  26. record = super(PucWireman, self).create(values)
  27. if 'id_number' not in values or values['id_number'] == '/':
  28. sequence = self.env['ir.sequence'].search(
  29. [('prefix', '=', record.wireman_type_id.code)])
  30. if record.wireman_type_id.code:
  31. record.id_number = sequence.next_by_id()
  32. record.phone = record.mobile_telephone_no
  33. return record
  34.  
  35. def write(self, values):
  36. if 'id_number' not in values or values['id_number'] == '/':
  37. if 'wireman_type_id' in values:
  38. code = self.env['puc.wireman.types'].search([
  39. ('id', '=', values['wireman_type_id'])]).code
  40. sequence = self.env['ir.sequence'].search(
  41. [('prefix', '=', code)])
  42. values['id_number'] = sequence.next_by_id()
  43. if not self.partner_id:
  44. partner_id = self.env['res.partner'].create({
  45. 'is_company': False,
  46. 'company_id': self.company_id.id,
  47. 'name': self.name,
  48. 'email': self.email,
  49. 'phone': self.home_telephone_no,
  50. 'mobile': self.mobile_telephone_no,
  51. 'street': self.street,
  52. 'street2': self.street2,
  53. 'city': self.major_city_id.name,
  54. 'country_id': self.country_id.id
  55. })
  56. values['partner_id'] = partner_id
  57.  
  58. record = super(PucWireman, self).write(values)
  59. return record
  60.  
  61. @api.model
  62. def _get_languages(self):
  63. return self.env['res.lang'].get_installed()
  64.  
  65. def open_submission(self):
  66. self.ensure_one()
  67. return {
  68. 'type': 'ir.actions.act_window',
  69. "name": "Submission",
  70. 'view_mode': 'tree,form',
  71. 'view_type': 'form',
  72. "res_model": "puc.submission",
  73. "domain": [('puc_wireman_id', '=', self.id)],
  74. "context": {'default_puc_wireman_id': self.id}
  75. }
  76.  
  77. def get_submission(self):
  78. for line in self:
  79. line.submission_count = self.env['puc.submission'].search_count([
  80. ('puc_wireman_id', '=', line.id)])
  81.  
  82. @api.onchange('district_id')
  83. def onchange_district_id(self):
  84. for rec in self:
  85. return {'domain': {'village_id': [
  86. ('district_id', '=', rec.district_id.id)]}}
  87.  
  88. def _default_officer(self):
  89. user = self.env.user
  90. officer = self.env['hr.employee'].search([('user_id', '=', user.id)])
  91. return officer
  92.  
  93. def _default_wireman_type_id(self):
  94. wireman_type_id = self.env.ref('wireman.first_wireman_type').id
  95. return wireman_type_id
  96.  
  97. submission_count = fields.Integer(string='Submission',
  98. compute='get_submission')
  99. name = fields.Char('Name', size=128, required=True, tracking=True)
  100. last_name = fields.Char('Last Name', compute='_compute_last_name',
  101. store=True)
  102. street = fields.Char('Street 1', tracking=True)
  103. street2 = fields.Char('Street 2', track_visibility='onchange',
  104. tracking=True)
  105. telephone_no = fields.Char(string="Telephone No.", required=False,
  106. tracking=True)
  107. zip = fields.Char('Zip', track_visibility='onchange', tracking=True)
  108. village_id = fields.Many2one('puc.village', 'Village', tracking=True)
  109. city_id = fields.Many2one('puc.city', 'City', tracking=True)
  110. major_city_id = fields.Many2one('puc.major.city', 'Major City',
  111. tracking=True)
  112. major_town_id = fields.Many2one('puc.majortown', 'Major Town',
  113. tracking=True)
  114. district_id = fields.Many2one('puc.district', 'District', tracking=True)
  115. state_id = fields.Many2one('res.country.state', 'State', tracking=True)
  116. country_id = fields.Many2one('res.country', string="Country", tracking=True)
  117. active = fields.Boolean(default=True)
  118. state = fields.Selection(selection=[('active', 'Active'),
  119. ('inactive', 'In Active'),
  120. ('expired', 'Expired'),
  121. ('cancel', 'Cancelled')],
  122. string='Status', copy=False, tracking=True,
  123. index=True,
  124. default='active')
  125. user_id = fields.Many2one('res.users', string='User', tracking=True)
  126. place_of_birth = fields.Char(string="Place of Birth", required=False,
  127. tracking=True)
  128. date = fields.Date(string='Date', default=fields.Date.today(),
  129. tracking=True)
  130. birth_date = fields.Date('Birth Date', tracking=True)
  131. blood_group = fields.Selection(
  132. [('A+', 'A+ve'), ('B+', 'B+ve'), ('O+', 'O+ve'), ('AB+', 'AB+ve'),
  133. ('A-', 'A-ve'), ('B-', 'B-ve'), ('O-', 'O-ve'), ('AB-', 'AB-ve')],
  134. 'Blood Group', tracking=True)
  135. email = fields.Char('E-Mail', tracking=True)
  136. license_category_id = fields.Many2one('puc.wireman.types',
  137. compute='_compute_license_category',
  138. string="License Category", )
  139. application_fee_paid = fields.Char(string="Application Fee Paid",
  140. tracking=True)
  141. application_cash_receipt_no = fields.Char(string="Cash Receipt No",
  142. tracking=True)
  143. application_paid_date = fields.Date('Paid Date', tracking=True)
  144. exam_date = fields.Date('Date Of Exam', tracking=True)
  145. passed = fields.Char('Passed', tracking=True)
  146. failed = fields.Char('Failed', tracking=True)
  147. comments = fields.Text('Remarks', tracking=True)
  148. license_fee_paid = fields.Char(string="License Fee Paid", tracking=True)
  149. license_cash_receipt_no = fields.Char(string="License Cash Receipt No",
  150. tracking=True)
  151. license_paid_date = fields.Date('Paid Date', tracking=True)
  152. serial_no = fields.Char(string='Serial No', tracking=True)
  153. issued_type = fields.Selection([('first_issue', 'First Issue'),
  154. ('renewal', 'Renewal')], tracking=True)
  155. expiry_date = fields.Date('Expiry Date', compute='_compute_expiry_date',
  156. readonly=False, store=True, tracking=True)
  157. valid_police_record_ids = fields.Many2many('ir.attachment',
  158. relation="m2m_ir_police_record_rel",
  159. column1="m2m_id",
  160. column2="attachment_id",
  161. string="Valid Police Record", tracking=True)
  162. diploma_ids = fields.Many2many('ir.attachment',
  163. relation="m2m_ir_diploma_rel",
  164. column1="m2m_id",
  165. column2="attachment_id", string="Diploma", tracking=True)
  166. certificate_ids = fields.Many2many('ir.attachment',
  167. relation="m2m_ir_certificate_rel",
  168. column1="m2m_id",
  169. column2="attachment_id",
  170. string="Certificates", tracking=True)
  171. reference_ids = fields.Many2many('ir.attachment',
  172. relation="m2m_ir_reference_rel",
  173. column1="m2m_id",
  174. column2="attachment_id",
  175. string="References", tracking=True)
  176. other_doc_ids = fields.Many2many('ir.attachment',
  177. relation="m2m_ir_other_rel",
  178. column1="m2m_id",
  179. column2="attachment_id",
  180. string="Other Documents", tracking=True)
  181. lang = fields.Selection(selection='_get_languages', string='Language',
  182. validate=False)
  183. gender = fields.Selection(
  184. [('male', 'Male'), ('female', 'Female'),
  185. ('other', 'Other')], 'Gender', required=True, tracking=True)
  186. place_of_birth = fields.Char(string="Place of Birth", required=False,
  187. tracking=True)
  188. nationality_id = fields.Many2one('puc.wireman.nationality', 'Nationality',
  189. tracking=True)
  190. emergency_contact_person = fields.Char(
  191. 'Emergency Contact', required=False, tracking=True)
  192. emergency_contact_no = fields.Char(
  193. 'Emergency Contact.No', required=False, tracking=True)
  194.  
  195. identification_type = fields.Selection(
  196. [('passport', 'Passport'), ('social', 'Social Security'), ('drivers', 'Drivers License'),
  197. ], string="Identification Type",
  198. tracking=True)
  199. identification_info = fields.Char('Identification No.', size=64,
  200. tracking=True)
  201. id_number = fields.Char('ID Card Number', size=64, tracking=True)
  202. image_1920 = fields.Binary('Image', track_visibility='onchange',
  203. required=True)
  204. eye_color = fields.Selection(
  205. [('hazel', 'Hazel'), ('light brown', 'Light Brown'),
  206. ('medium brown', 'Medium Brown'), ('dark brown', 'Dark Brown'),
  207. ('green', 'Green'), ('light blue', 'Light Blue'), ('blue', 'Blue'),
  208. ('violet', 'Violet'), ('gray', 'Gray')], string="Eye Color",
  209. required=False, tracking=True)
  210. height = fields.Char(string="Height", required=False, tracking=True)
  211. place_of_employment = fields.Char(string="Place of Employment",
  212. required=False, tracking=True)
  213. wireman_experience = fields.Selection(
  214. [('1-5', '1-5'), ('6-10', '6-10'), ('11-15', '11-15'),
  215. ('16+', '16+')], required=False, string="Experience (Years)",
  216. tracking=True)
  217. wireman_academic_id = fields.Many2one('puc.wireman.education',
  218. tracking=True)
  219. #wireman_type_id = fields.Many2one('puc.wireman.types', tracking=True,
  220. # readonly=True,
  221. wireman_type_id = fields.Many2one('puc.wireman.types', tracking=True,
  222. readonly=False,
  223. default=_default_wireman_type_id)
  224. wireman_license_no = fields.Char(string="License No.",
  225. tracking=True, required=False)
  226. date_issued = fields.Date('Date Issued', tracking=True)
  227. date_expires = fields.Date('Date Expires', compute='_compute_expiry_date',
  228. inverse='_inverse_expiry_date', store=True,
  229. readonly=False, tracking=True)
  230. wireman_license_seq = fields.Char(string="Wireman License No.",
  231. required=False, tracking=True)
  232. home_telephone_no = fields.Char(string="Telephone No.", required=False,
  233. tracking=True)
  234. mobile_telephone_no = fields.Char(string="Mobile No.", required=False,
  235. tracking=True)
  236. phone = fields.Char(string="Mobile No.", required=False, tracking=True)
  237. fax_no = fields.Char(string="Fax No.", required=False, tracking=True)
  238. gr_no = fields.Char("GR Number", size=20, tracking=True)
  239. category_id = fields.Many2one('puc.category', 'Category', tracking=True)
  240. submission_ids = fields.One2many('puc.submission', 'puc_wireman_id',
  241. string='Submissions')
  242. inspection_ids = fields.One2many('puc.inspection', 'construct_wireman_id',
  243. string='Inspections')
  244. submission_detail_ids = fields.One2many('puc.wireman.submission',
  245. 'wireman_id',
  246. 'Submission Details')
  247. company_id = fields.Many2one('res.company', 'Company', readonly=True,
  248. default=lambda self: self.env.user.company_id,
  249. tracking=True)
  250. exam_result = fields.Selection([('Passed', 'Passed'), ('Failed', 'Failed')],
  251. string='Exam Result', tracking=True)
  252. partner_id = fields.Many2one('res.partner', 'Partner', tracking=True)
  253. design_limit = fields.Char('Design Limit', tracking=True)
  254. installation_limit = fields.Char('Installation Limit', tracking=True)
  255. worksheet = fields.Binary('Worksheet', attachment=True)
  256. signature = fields.Binary('Signature', readonly=True)
  257. signed_by = fields.Many2one('res.users', readonly=True, tracking=True)
  258. is_admin = fields.Boolean(compute='compute_is_admin', default=True)
  259. license_request_ids = fields.One2many('puc.license.request', 'wireman_id')
  260. id_card_printed_ids = fields.One2many('puc.id.card.details', 'wire_man_id')
  261. id_printed_by = fields.Many2one('res.users', readonly=True)
  262. id_printed_on = fields.Datetime(readonly=True)
  263.  
  264. def compute_is_admin(self):
  265. for rec in self:
  266. if self.env.user.has_group('wireman.group_puc_back_office_admin'):
  267. rec.is_admin = True
  268. else:
  269. rec.is_admin = False
  270. # if rec.birth_date == fields.date.today():
  271. # print('hey')
  272.  
  273. @api.depends('name')
  274. def _compute_last_name(self):
  275. for rec in self:
  276. if rec.name:
  277. last_name = rec.name.split()
  278. rec.last_name = last_name[-1]
  279.  
  280. @api.depends('wireman_type_id')
  281. def _compute_license_category(self):
  282. self.license_category_id = self.wireman_type_id
  283.  
  284. @api.onchange('country_id')
  285. def onchange_country_id(self):
  286. nationality = self.env['puc.wireman.nationality'].search(
  287. [('country_id', '=', self.country_id.name)])
  288. self.nationality_id = nationality.id
  289.  
  290. @api.constrains('birth_date')
  291. def _check_birthdate(self):
  292. for record in self:
  293. if record.birth_date and record.birth_date > fields.Date.today():
  294. raise ValidationError(_(
  295. "Birth Date can't be greater than current date!"))
  296.  
  297. @api.model
  298. @api.depends('date_issued')
  299. def _compute_expiry_date(self):
  300. """Computing the expiration date"""
  301. today = fields.Date.today()
  302. for rec in self.env['puc.wireman'].search([]):
  303. if rec.date_issued:
  304. rec.expiry_date = rec.date_issued + relativedelta(years=1)
  305. rec.date_expires = rec.expiry_date
  306. r = relativedelta(today, rec.expiry_date)
  307. if rec.expiry_date >= today:
  308. rec.state = 'active'
  309. else:
  310. if rec.expiry_date < today:
  311. rec.state = 'inactive'
  312. r = relativedelta(today, rec.expiry_date)
  313. if r.months >= 1:
  314. rec.state = 'expired'
  315. elif r.years >= 2:
  316. rec.state = 'cancel'
  317.  
  318. def _inverse_expiry_date(self):
  319. return True
  320.  
  321. def _check_expiry(self):
  322. """Checking for the expiry date and changing the state to expired"""
  323. today = fields.Date.today()
  324. for rec in self.env['puc.wireman'].search([('active', '=', True),
  325. ('state', '=', 'active'),
  326. (
  327. 'expiry_date', '<',
  328. today)]):
  329. rec.state = 'inactive'
  330. # rec.active = False
  331. for rec in self.env['puc.wireman'].search([('active', '=', True), '|',
  332. ('state', '=', 'inactive'),
  333. ('state', '=',
  334. 'expired')]):
  335. r = relativedelta(today, rec.expiry_date)
  336. if r.months >= 1:
  337. rec.state = 'expired'
  338. if r.years >= 2:
  339. rec.state = 'cancel'
  340.  
  341. @api.model
  342. def build_qr_code_url(self):
  343. base_url = self.env['ir.config_parameter'].sudo().get_param(
  344. 'web.base.url')
  345. base_url += '/wireman/profile/%s' % (self.id)
  346.  
  347. return '/report/barcode/?' + werkzeug.urls.url_encode(
  348. {'type': 'QR', 'value': base_url, 'width': 45,
  349. 'height': 45, 'humanreadable': 1})
  350.  
  351. def redirect_submission(self):
  352. return {
  353. 'type': 'ir.actions.act_window',
  354. 'name': 'Sale',
  355. 'view_mode': 'tree,form',
  356. 'res_model': 'puc.submission',
  357. 'domain': [('puc_wireman_id', '>=', self.id)],
  358. 'target': 'current',
  359. }
  360.  
  361. def action_send(self, data):
  362. template = self.env['mail.template'].search(
  363. [('subject', '=', 'test123')])
  364. if template:
  365. mailvals = {
  366. 'subject': template.subject,
  367. 'body_html': template.body_html,
  368. 'email_to': data,
  369. 'email_from': "[email protected]",
  370. }
  371. s = self.env['mail.mail'].create(mailvals).send()
  372.  
  373. def create_wireman_user(self):
  374. user_group = self.env.ref("base.group_portal") or False
  375. users_res = self.env['res.users']
  376. for record in self:
  377. if not record.user_id:
  378. user_id = users_res.create({
  379. 'name': record.name,
  380. 'partner_id': record.partner_id.id,
  381. 'login': record.email,
  382. 'password': record.birth_date,
  383. 'groups_id': user_group,
  384. 'tz': self._context.get('tz'),
  385. })
  386. message = _('%s has created a new User <br> for wire man %s',
  387. record.env.user.name, record.name)
  388. record.user_id = user_id
  389. record.message_post(
  390. body=message)
  391.  
  392.  
  393. class WiremanIDReport(models.AbstractModel):
  394. _name = 'report.wireman.report_wireman_id_card'
  395. _description = 'Wireman ID'
  396.  
  397. def _get_report_values(self, docids, data=None):
  398. docs = self.env['puc.wireman'].browse(docids)
  399. for doc in docs:
  400. if not doc.signature or not doc.signed_by:
  401. raise exceptions.ValidationError('Please sign the Wireman ID')
  402. message = 'ID CARD printed <br/>' + '' \
  403. '<br> License Category : ' + str(
  404. doc.license_category_id.name) + '' \
  405. '<br> printed by : ' + str(
  406. self.env.user.name) + ' ' \
  407. '<br>Printed on:' + str(
  408. fields.datetime.now())
  409. doc.message_post(body=message)
  410. self.env['puc.id.card.details'].create({
  411. 'wire_man_id': doc.id,
  412. 'printed_by': self.env.user.id,
  413. 'printed_on': fields.datetime.now()
  414. })
  415. doc.write({
  416. 'id_printed_by': self.env.user.id,
  417. 'id_printed_on': fields.datetime.now()
  418. })
  419. return {
  420. 'doc_ids': docs.ids,
  421. 'doc_model': 'puc.wireman',
  422. 'docs': docs,
  423. }
  424.  
  425.  
  426. class PucWiremanSubmission(models.Model):
  427. _name = 'puc.wireman.submission'
  428. _description = 'Wireman Submission Details'
  429.  
  430. wireman_id = fields.Many2one('puc.wireman', 'Wireman', ondelete="cascade")
  431. submission_id = fields.Many2one('puc.submission', 'Submission',
  432. required=False)
  433. batch_id = fields.Many2one('puc.batch', 'Batch', required=False)
  434. file_number = fields.Char('File Number')
  435. inspection_ids = fields.Many2many('puc.inspection', 'submission_id',
  436. string='Inspections')
  437.  
  438. _sql_constraints = [
  439. ('unique_name_file_number_id',
  440. 'unique(file_number,submission_id,batch_id,wireman_id)',
  441. 'File Number & Wireman must be unique per Batch!'),
  442. ('unique_name_file_number_submission_id',
  443. 'unique(file_number,submission_id,batch_id)',
  444. 'File Number must be unique per Batch!'),
  445. ('unique_name_file_number_wireman_id',
  446. 'unique(wireman_id,submission_id,batch_id)',
  447. 'Wireman must be unique per Batch!'),
  448. ]
  449.  
  450.  
  451. class PucWiremanType(models.Model):
  452. _name = 'puc.wireman.types'
  453.  
  454. name = fields.Char('Wireman Type')
  455. code = fields.Char('Code')
  456. sequence_prior = fields.Char(string="Sequence", copy=False, default='New')
  457.  
  458. @api.model
  459. def create(self, values):
  460.  
  461. print(values)
  462. sequence = self.env['ir.sequence'].create({
  463. 'code': 'wireman_sequence',
  464. 'name': 'Wireman sequence',
  465. 'implementation': 'no_gap',
  466. 'prefix': values['code'],
  467. 'padding': 5,
  468. })
  469. if values.get('sequence_prior', 'New') == 'New':
  470. values['sequence_prior'] = self.env['ir.sequence'].next_by_code(
  471. 'wireman_prior') or 'New'
  472. res = super(PucWiremanType, self).create(values)
  473. return res
  474.  
  475.  
  476. class PucWiremanNationality(models.Model):
  477. _name = 'puc.wireman.nationality'
  478.  
  479. name = fields.Char(string='Nationality')
  480. country_id = fields.Char(string='Country')
  481.  
  482.  
  483. class PucWiremanEducation(models.Model):
  484. _name = 'puc.wireman.education'
  485.  
  486. name = fields.Char(string='Education')
  487.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement