Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found
Sélectionner une révision Git
Loading items

Cible

Sélectionner le projet cible
  • lefilament/alterincub/alterincub_partner
1 résultat
Sélectionner une révision Git
Loading items
Afficher les modifications
Validations sur la source (6)
......@@ -13,9 +13,12 @@
"datas/alterincub_area.xml",
"datas/alterincub_class_duration.xml",
"datas/alterincub_department.xml",
"datas/alterincub_education_level.xml",
"datas/alterincub_end_reason.xml",
"datas/alterincub_sector.xml",
"datas/alterincub_service_place.xml",
"datas/alterincub_situation_entrance.xml",
"datas/cron_age_range.xml",
# wizard
"wizard/alterincub_exit_project_wizard.xml",
# views
......@@ -24,12 +27,14 @@
"views/alterincub_class_duration.xml",
"views/alterincub_collective_day.xml",
"views/alterincub_department.xml",
"views/alterincub_education_level.xml",
"views/alterincub_end_reason.xml",
"views/alterincub_lot.xml",
"views/alterincub_price_list.xml",
"views/alterincub_program.xml",
"views/alterincub_sector.xml",
"views/alterincub_service_place.xml",
"views/alterincub_situation_entrance.xml",
"views/res_partner.xml",
# views menus
"views/menus.xml",
......
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data noupdate="1">
<record
id="alterincub_education_level_01"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">10</field>
<field name="name">CITE_0</field>
<field
name="description"
>Inférieur à l'école primaire, vous n'êtes jamais allé à l'école</field>
</record>
<record
id="alterincub_education_level_02"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">20</field>
<field name="name">CITE_1_2</field>
<field
name="description"
>Primaire, 6ème, 5ème, 4ème, 3ème (secondaire 1er cycle), Brevet des collèges, CAP, BEP, 2nde professionnelle (technique cycle court)</field>
</record>
<record
id="alterincub_education_level_03"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">30</field>
<field name="name">CITE_3_4</field>
<field
name="description"
>Baccalauréat général ou technologique, Bac Pro, Brevet professionnel (BP)</field>
</record>
<record
id="alterincub_education_level_04"
model="alterincub.education.level"
forcecreate="0"
>
<field name="sequence">40</field>
<field name="name">CITE_5_8</field>
<field
name="description"
>DEUG, BTS, DUT, Ecoles d'infirmières, Licence, Maîtrise, Grande école, Ecole d'ingénieur, Ecole de commerce, Master recherche ou professionnel, DEA, DESS, Doctorat</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data noupdate="1">
<record
id="alterincub_situation_entrance_01"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">10</field>
<field name="name">EMPLOI</field>
<field name="description">(y compris indépendant)</field>
</record>
<record
id="alterincub_situation_entrance_02"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">20</field>
<field name="name">RECHERCHE_EMPLOI_MOINS_6_MOIS</field>
</record>
<record
id="alterincub_situation_entrance_03"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">30</field>
<field name="name">RECHERCHE_EMPLOI_6_12_MOIS</field>
</record>
<record
id="alterincub_situation_entrance_04"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">40</field>
<field name="name">RECHERCHE_EMPLOI_PLUS_12_MOIS</field>
</record>
<record
id="alterincub_situation_entrance_05"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">50</field>
<field name="name">FORMATION</field>
<field name="description">En formation ou en enseignement</field>
</record>
<record
id="alterincub_situation_entrance_06"
model="alterincub.situation.entrance"
forcecreate="0"
>
<field name="sequence">60</field>
<field name="name">INACTIF</field>
<field
name="description"
>Inactif, ni en formation, ni en enseignement</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data noupdate="1">
<record id="alterincub_age_range_cron" forcecreate="True" model="ir.cron">
<field name="name">AlterIncub - Partner : Calcul de la tranche d'âge</field>
<field eval="True" name="active" />
<field name="user_id" ref="base.user_root" />
<field name="interval_number">12</field>
<field name="interval_type">months</field>
<field name="numbercall">-1</field>
<field name="nextcall">2024-10-01 16:00:00</field>
<field name="model_id" ref="model_res_partner" />
<field name="state">code</field>
<field name="code">model.cron_age_range()</field>
</record>
</data>
</odoo>
......@@ -5,6 +5,7 @@ from . import alterincub_area
from . import alterincub_class
from . import alterincub_class_duration
from . import alterincub_collective_day
from . import alterincub_education_level
from . import alterincub_department
from . import alterincub_end_reason
from . import alterincub_lot
......@@ -12,4 +13,5 @@ from . import alterincub_price_list
from . import alterincub_program
from . import alterincub_sector
from . import alterincub_service_place
from . import alterincub_situration_entrance
from . import res_partner
# Copyright 2022 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class AlterincubEducationLevel(models.Model):
_name = "alterincub.education.level"
_description = "Niveau d'instruction"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
name = fields.Char(
"Nom",
required=True,
)
active = fields.Boolean(
"Actif",
default=True,
)
description = fields.Char("Description")
sequence = fields.Integer()
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# -----------------------------------------------------
# Copyright 2022 Le Filament (https://le-filament.com)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class AlterincubSituationEntrance(models.Model):
_name = "alterincub.situation.entrance"
_description = "Situation à l'entrée"
# ------------------------------------------------------
# Fields declaration
# ------------------------------------------------------
name = fields.Char(
"Nom",
required=True,
)
active = fields.Boolean(
"Actif",
default=True,
)
description = fields.Char("Description")
sequence = fields.Integer()
# ------------------------------------------------------
# Computed fields / Search Fields
# ------------------------------------------------------
# ------------------------------------------------------
# Onchange / Constraints
# -----------------------------------------------------
......@@ -3,6 +3,8 @@
import json
from dateutil.relativedelta import relativedelta
from odoo import _, api, fields, models
from odoo.exceptions import UserError
......@@ -160,6 +162,60 @@ class ResPartner(models.Model):
committee_backup = fields.Text("Retours comité")
# field to set readonly fields if not admin
is_alterincub_admin = fields.Boolean(compute="_compute_is_alterincub_admin")
# Contact fields
birthdate = fields.Date("Date de naissance")
age_range = fields.Selection(
selection=[
("under_25", "Moins de 25 ans"),
("25_35", "Entre 25 et 35 ans"),
("36_45", "Entre 36 et 45 ans"),
("over_45", "Plus de 45 ans"),
],
string="Tranche d'âge",
compute="_compute_age_range",
store=True,
)
nationality = fields.Selection(
selection=[
("ue", "UE"),
("not_ue", "HORS UE"),
("nd", "ND"),
],
string="Nationalité",
)
foreign_parents = fields.Selection(
selection=[
("yes", "Oui"),
("not", "Non"),
("nsp", "NSP"),
],
string="Parents étrangers",
)
educational_level = fields.Many2one(
comodel_name="alterincub.education.level",
string="Niveau d'instruction",
ondelete="restrict",
)
situation = fields.Many2one(
comodel_name="alterincub.situation.entrance",
string="Situation à l’entrée",
ondelete="restrict",
)
disability = fields.Selection(
selection=[
("yes", "Oui"),
("no", "Non"),
],
string="Reconnaissance handicap",
)
exclusion_risk = fields.Selection(
selection=[
("yes", "Oui"),
("not", "Non"),
("nsp", "NSP"),
],
string="Risque exclusion",
)
# ------------------------------------------------------
# SQL Constraints
......@@ -217,9 +273,35 @@ class ResPartner(models.Model):
if partner.contact_type == "project" and not partner.original_name:
partner.original_name = partner.name
@api.depends("birthdate")
def _compute_age_range(self):
for partner in self:
if partner.birthdate:
age = relativedelta(fields.Date.today(), partner.birthdate).years
if age < 25:
partner.age_range = "under_25"
elif 25 <= age <= 35:
partner.age_range = "25_35"
elif 36 <= age <= 45:
partner.age_range = "36_45"
else:
partner.age_range = "over_45"
else:
partner.age_range = None
# ------------------------------------------------------
# Onchange / Constraints
# ------------------------------------------------------
@api.onchange("is_company")
def onchange_is_company(self):
"""
Set contact_type to False for person
"""
if not self.is_company:
self.contact_type = False
if self.is_incubated or self.is_provider:
self.type = "other"
@api.onchange("parent_id")
def onchange_parent_id(self):
"""
......@@ -228,7 +310,10 @@ class ResPartner(models.Model):
result = super().onchange_parent_id()
if self.env.context.get("default_parent_id"):
self.parent_id = self.env.context.get("default_parent_id")
if not self.parent_id:
self.type = "contact"
else:
self.type = "other"
return result
# ------------------------------------------------------
......@@ -284,6 +369,16 @@ class ResPartner(models.Model):
}
)
# ------------------------------------------------------
# CRON methods
# ------------------------------------------------------
def cron_age_range(self):
"""
CRON permettant de recalculer les tranches d'âge
"""
partner_ids = self.search([("birthdate", "!=", False)])
partner_ids._compute_age_range()
# ------------------------------------------------------
# Business methods
# ------------------------------------------------------
......
......@@ -23,3 +23,7 @@ access_alterincub_program_manager,access_alterincub_program_manager,model_alteri
access_alterincub_sector_manager,access_alterincub_sector_manager,model_alterincub_sector,alterincub_partner.group_alterincub_list_manager,1,1,1,1
access_alterincub_service_place_manager,access_alterincub_service_place_manager,model_alterincub_service_place,alterincub_partner.group_alterincub_list_manager,1,1,1,1
access_alterincub_exit_project_wizard,access_alterincub_exit_project_wizard,model_alterincub_exit_project_wizard,base.group_user,1,1,1,1
access_alterincub_education_level,access_alterincub_education_level,model_alterincub_education_level,base.group_user,1,0,0,0
access_alterincub_education_level_manager,access_alterincub_education_level_manager,model_alterincub_education_level,alterincub_partner.group_alterincub_list_manager,1,1,1,1
access_alterincub_situation_entrance,access_alterincub_situation_entrance,model_alterincub_situation_entrance,base.group_user,1,0,0,0
access_alterincub_situation_entrance_manager,access_alterincub_situation_entrance_manager,model_alterincub_situation_entrance,alterincub_partner.group_alterincub_list_manager,1,1,1,1
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<!-- Tree view -->
<record id="alterincub_education_level_tree_view" model="ir.ui.view">
<field name="name">alterincub.education.level.tree</field>
<field name="model">alterincub.education.level</field>
<field name="arch" type="xml">
<tree string="Niveau d'instruction" editable="top">
<field name="sequence" widget="handle" />
<field name="name" />
<field name="description" />
</tree>
</field>
</record>
<!--
ACTIONS
-->
<record
id="alterincub_education_level_act_window"
model="ir.actions.act_window"
>
<field name="name">Niveaux d'éducation</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">alterincub.education.level</field>
<field name="view_mode">tree</field>
</record>
</data>
</odoo>
<?xml version="1.0" encoding="utf-8" ?>
<!-- Copyright 2022 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<!-- Tree view -->
<record id="alterincub_situation_entrance_tree_view" model="ir.ui.view">
<field name="name">alterincub.situation.entrance.tree</field>
<field name="model">alterincub.situation.entrance</field>
<field name="arch" type="xml">
<tree string="Situation à l’entrée" editable="top">
<field name="sequence" widget="handle" />
<field name="name" />
<field name="description" />
</tree>
</field>
</record>
<!--
ACTIONS
-->
<record
id="alterincub_situation_entrance_act_window"
model="ir.actions.act_window"
>
<field name="name">Situation à l’entrée</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">alterincub.situation.entrance</field>
<field name="view_mode">tree</field>
</record>
</data>
</odoo>
......@@ -141,11 +141,18 @@
action="alterincub_partner.alterincub_end_reason_act_window"
/>
<menuitem
name="Durée de Promotion"
sequence="70"
id="menu_alterincub_class_duration"
name="Niveaux d'instruction"
sequence="80"
id="menu_alterincub_education_level"
parent="menu_alterincub_list_root"
action="alterincub_partner.alterincub_class_duration_act_window"
action="alterincub_partner.alterincub_education_level_act_window"
/>
<menuitem
name="Situations à l’entrée"
sequence="90"
id="menu_alterincub_situation_entrance"
parent="menu_alterincub_list_root"
action="alterincub_partner.alterincub_situation_entrance_act_window"
/>
</data>
</odoo>
......@@ -121,6 +121,9 @@
<xpath expr="//field[@name='parent_id']" position="attributes">
<attribute name="options">{'no_create': 1, 'no_edit': 1}</attribute>
<attribute name="domain">parent_id_domain</attribute>
<attribute
name="required"
>context.get('default_is_incubated') or context.get('default_is_provider')</attribute>
</xpath>
<!-- Type de contact -->
......@@ -141,30 +144,10 @@
</xpath>
<!-- Bloc gauche : Adresse -->
<!-- Autorise la modification d'adresse pour les porteurs de projet -->
<xpath expr="//field[@name='street']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<xpath expr="//field[@name='street2']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<xpath expr="//field[@name='city']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<!-- Cache le champ Etat -->
<xpath expr="//field[@name='state_id']" position="attributes">
<attribute name="invisible">1</attribute>
</xpath>
<xpath expr="//field[@name='zip']" position="attributes">
<attribute
name="attrs"
>{'readonly': [('type', '=', 'contact'),('parent_id', '!=', False),('is_incubated', '=', False)]}</attribute>
</xpath>
<!-- Masque la TVA -->
<xpath expr="//field[@name='vat']" position="attributes">
<attribute name="invisible">1</attribute>
......@@ -282,6 +265,26 @@
/>
</group>
</group>
<!-- Données porteur de projet -->
<group
name="alterincub_project_datas"
attrs="{'invisible': [('is_incubated', '!=', True)]}"
string="Questionnaire FSE"
>
<group>
<field name="birthdate" />
<field name="age_range" />
<field name="nationality" />
<field name="foreign_parents" />
</group>
<group>
<field name="educational_level" widget="selection" />
<field name="situation" widget="selection" />
<field name="disability" />
<field name="exclusion_risk" />
</group>
</group>
</xpath>
<!-- Masque l'onglet Contacts pour les contacts -->
......@@ -808,7 +811,7 @@
>[('is_provider', '=', True),('is_company', '!=', True)]</field>
<field
name="context"
>{'default_is_company': False, 'default_is_provider': True}</field>
>{'default_is_company': False, 'default_is_provider': True,}</field>
</record>
</data>
......