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
  • 12.0
  • 12.0-lm-00
  • 13.0
  • 14.0
4 résultats

Cible

Sélectionner le projet cible
  • lefilament/cgscop/cgscop_partner
  • hsilvant/cgscop_partner
2 résultats
Sélectionner une révision Git
  • 12-RV-Bug_ecrasement_date_radiation
  • 12-RV-Correctif-open-instagram
  • 12-RV-Tree-Coop-Ajout-effectif
  • 12-RV-copadev
  • 12-RV-revision-staff
  • 12.0
  • 12.0-RV-Abonnements
  • 12.0-RV-Instagram
  • 12.0-RV-segment_visibility
  • 12.0-evo-202003
  • 14-RV-20231222
  • 14-RV-20240830
  • 14-RV-20250324
13 résultats
Afficher les modifications
Affichage de
avec 1219 ajouts et 302 suppressions
<?xml version="1.0" ?>
<!-- Copyright 2021 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<!-- Form view -->
<record id="scop_partner_staff_form_view" model="ir.ui.view">
<field name="name">scop.partner.staff.form</field>
<field name="model">scop.partner.staff</field>
<field name="arch" type="xml">
<form string="Effectifs">
<sheet>
<group col="2">
<group name="infos_coop">
<field
name="partner_id"
options="{'no_create': True, 'no_open': True}"
readonly="1"
/>
<field name="partner_city" />
<field name="partner_siret" />
</group>
<group name="infos_entry">
<field name="user_id" readonly="1" />
<field name="type_entry" />
<field
name="effective_date"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership'))]}"
/>
</group>
<group name="staff_stats">
<field name="cooperative_form_id" invisible="1" />
<field name="is_partner_in_tracked_naf" invisible="1" />
<field name="is_admin_user" invisible="1" />
<field
name="staff_count"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership')), ('is_admin_user', '!=', True)]}"
/>
<field
name="staff_shareholder_count"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership')), ('is_admin_user', '!=', True)]}"
/>
<field
name="staff_shareholder_total"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership')), ('is_admin_user', '!=', True)]}"
/>
<field
name="staff_average"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership')), ('is_admin_user', '!=', True)], 'required':[('is_partner_in_tracked_naf', '=', True)]}"
/>
</group>
<group name="staff_stats">
<field name="staff_men" />
<field name="staff_women" />
<field name="staff_shareholder_men" />
<field name="staff_shareholder_women" />
</group>
<group name="comment">
<field name="comment" />
</group>
</group>
</sheet>
</form>
</field>
</record>
<!-- Tree view -->
<record id="scop_partner_staff_tree_view" model="ir.ui.view">
<field name="name">scop.partner.staff.tree</field>
<field name="model">scop.partner.staff</field>
<field name="arch" type="xml">
<tree string="Effectifs">
<field
name="partner_id"
options="{'no_create': True, 'no_open': True}"
readonly="1"
/>
<field name="partner_city" optional="show" />
<field name="partner_siret" optional="show" />
<field name="user_id" readonly="1" />
<field name="type_entry" />
<field
name="effective_date"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership'))]}"
/>
<field name="cooperative_form_id" invisible="1" />
<field name="is_partner_in_tracked_naf" invisible="1" />
<field
name="staff_count"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership'))]}"
/>
<field
name="staff_shareholder_count"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership'))]}"
/>
<field
name="staff_shareholder_total"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership'))]}"
/>
<field
name="staff_average"
attrs="{'readonly':[('type_entry','in',('questionnaire', 'questionnaire_inscription', 'membership'))], 'required':[('is_partner_in_tracked_naf', '=', True)]}"
/>
<field name="staff_men" optional="hide" />
<field name="staff_women" optional="hide" />
<field name="staff_shareholder_men" optional="hide" />
<field name="staff_shareholder_women" optional="hide" />
<field name="comment" optional="hide" />
</tree>
</field>
</record>
<record
id="action_view_res_partner_staff"
model="ir.actions.act_window"
>
<field name="name">Effectifs</field>
<field name="res_model">scop.partner.staff</field>
<field name="view_mode">tree,form</field>
<field name="help">Affiche et gère la liste des effectifs.</field>
</record>
</data>
</odoo>
<?xml version="1.0" ?>
<!-- Copyright 2019 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<record id="scop_period_view_search" model="ir.ui.view">
<field name="name">scop.period.view.search</field>
<field name="model">scop.period</field>
<field name="arch" type="xml">
<search string="Recherche Organisme">
<field name="name" filter_domain="[('name', 'ilike', self)]" />
<field name="siret" filter_domain="[('siret','ilike',self)]" />
<field name="number" filter_domain="[('number','=like',self)]" />
</search>
</field>
</record>
<record id="view_scop_period_tree" model="ir.ui.view">
<field name="name">scop.period.tree</field>
<field name="model">scop.period</field>
<field name="arch" type="xml">
<tree string="Périodes" editable="bottom">
<field name="partner_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="partner_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="number" />
<field name="start" />
<field name="end" />
<field name="end_reason" />
<field name="dissolution_reason_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="dissolution_reason_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="comments" />
<field name="name" />
<field name="cooperative_form_id" options="{'no_open': True, 'no_create': True}"/>
<field name="partner_company_type_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="cooperative_form_id"
options="{'no_open': True, 'no_create': True}"
/>
<field
name="partner_company_type_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="siret" />
<field name="street" />
<field name="street2" />
......@@ -28,57 +54,73 @@
<field name="cedex" />
<field name="state_id" invisible="1" />
<field name="country_id" invisible="1" />
<field name="naf_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="naf_id"
options="{'no_open': True, 'no_create': True}"
/>
<field
name="ur_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="cae" />
</tree>
</field>
</record>
<record id="action_view_scop_period" model="ir.actions.act_window">
<field name="name">Historique des périodes</field>
<field name="res_model">scop.period</field>
<field name="view_mode">tree</field>
<field name="search_view_id" ref="scop_period_view_search" />
<field name="help">Affiche et gère les Historiques des Périodes</field>
</record>
<record id="scop_membership_period_view_search" model="ir.ui.view">
<field name="name">scop.membership_period.view.search</field>
<field name="model">scop.membership.period</field>
<field name="arch" type="xml">
<search string="Recherche Organisme">
<field
name="partner_id"
filter_domain="[('partner_id', 'ilike', self)]"
/>
<field name="number" filter_domain="[('number','=like',self)]" />
</search>
</field>
</record>
<record id="view_scop_membership_period_tree" model="ir.ui.view">
<field name="name">scop.membership.period.tree</field>
<field name="model">scop.membership.period</field>
<field name="arch" type="xml">
<tree string="Périodes d'adhésion" editable="bottom">
<field name="partner_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="partner_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="start" />
<field name="type_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="type_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="number" />
<field name="state"/>
<field name="end" />
<field name="end_reason_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="end_reason_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="note" />
</tree>
</field>
</record>
<record id="action_view_membership_period" model="ir.actions.act_window">
<field name="name">Périodes d'adhésion</field>
<field name="res_model">scop.membership.period</field>
<field name="view_mode">tree</field>
<field name="search_view_id" ref="scop_membership_period_view_search" />
<field name="help">Affiche et gère les Périodes d'Adhésion</field>
</record>
<!-- Data Import -->
<menuitem id="menu_periods"
name="Périodes"
parent="contacts.menu_contacts" groups="cgscop_partner.group_edit_period"
sequence="35"/>
<menuitem id="menu_action_periods"
action="action_view_scop_period"
parent="menu_periods"
sequence="20"/>
<menuitem id="menu_action_membership_period"
action="action_view_membership_period"
parent="menu_periods"
sequence="30"/>
</data>
</odoo>
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import scop_address_wizard
from . import scop_period_wizard
from . import scop_deces_wizard
from . import scop_membership_period_wizard
from . import scop_membership_out_wizard
from . import scop_status_wizard
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
# TODO: Supprimer le fichier
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class ScopPeriodWizard(models.TransientModel):
_name = "scop.address.wizard"
_description = "Wizard changement d'adresse"
# Default functions
@api.model
def _default_partner_id(self):
return self.env.context.get("active_id")
@api.model
def _default_previous_period_id(self):
return (
self.env["scop.period"]
.search(
[
("partner_id", "=", self.env.context.get("active_id")),
("end", "=", False),
],
limit=1,
)
.id
)
@api.model
def _default_name(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).name
@api.model
def _default_cooperative_form_id(self):
return (
self.env["res.partner"]
.browse(self.env.context.get("active_id"))
.cooperative_form_id
)
@api.model
def _default_partner_company_type_id(self):
return (
self.env["res.partner"]
.browse(self.env.context.get("active_id"))
.partner_company_type_id
)
@api.model
def _default_siret(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).siret
@api.model
def _default_street(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).street
@api.model
def _default_street2(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).street2
@api.model
def _default_street3(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).street3
@api.model
def _default_zip(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).zip
@api.model
def _default_zip_id(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).zip_id
@api.model
def _default_city(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).city
@api.model
def _default_cedex(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).cedex
@api.model
def _default_state_id(self):
return (
self.env["res.partner"].browse(self.env.context.get("active_id")).state_id
)
@api.model
def _default_country_id(self):
return (
self.env["res.partner"].browse(self.env.context.get("active_id")).country_id
)
@api.model
def _default_naf_id(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).naf_id
@api.model
def _default_cae(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).cae
@api.model
def _default_ur_id(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).ur_id
# Fields common
partner_id = fields.Integer("Partner", default=_default_partner_id)
# Fields previous period
previous_period_id = fields.Integer(default=_default_previous_period_id)
end_reason = fields.Selection(
[
("juri", "Modification de la forme juridique"),
("form", "Changement de forme coopérative"),
("acti", "Changement d'activité (NAF)"),
("adr", "Changement d'adresse"),
("nom", "Changement de dénomination sociale"),
("autr", "Autres"),
],
string="Motif",
default="adr",
)
comments = fields.Text("Commentaires")
# Fields new period
start = fields.Date("Début de validité", required=True, default=lambda self: fields.Date.today())
name = fields.Char("Raison Sociale", required=True, default=_default_name)
cooperative_form_id = fields.Many2one(
"res.partner.cooperative.form",
string="Cooperative form",
ondelete="restrict",
required=True,
default=_default_cooperative_form_id,
)
partner_company_type_id = fields.Many2one(
comodel_name="res.partner.company.type",
string="Legal Form",
ondelete="restrict",
required=True,
default=_default_partner_company_type_id,
)
siret = fields.Char(string="SIRET", size=14, required=True, default=_default_siret)
street = fields.Char(default=_default_street)
street2 = fields.Char(default=_default_street2)
street3 = fields.Char(default=_default_street3)
zip = fields.Char(default=_default_zip)
zip_id = fields.Many2one("res.city.zip", "ZIP Location", default=_default_zip_id)
city = fields.Char(default=_default_city)
cedex = fields.Char(default=_default_cedex)
state_id = fields.Many2one(
"res.country.state",
string="State",
ondelete="restrict",
domain="[('country_id', '=?', country_id)]",
default=_default_state_id,
)
country_id = fields.Many2one(
"res.country",
string="Country",
ondelete="restrict",
default=_default_country_id,
)
naf_id = fields.Many2one(
"res.partner.naf",
string="Code NAF",
ondelete="restrict",
default=_default_naf_id,
)
cae = fields.Boolean("CAE", default=_default_cae)
ur_id = fields.Many2one(
comodel_name="union.regionale",
string="Union Régionale",
default=_default_ur_id,
)
# Action
@api.onchange("zip_id")
def _onchange_zip_id(self):
if self.zip_id:
self.zip = self.zip_id.name
self.city = self.zip_id.city_id.name
self.country_id = self.zip_id.city_id.country_id
self.state_id = self.zip_id.city_id.state_id
def create_period(self):
for period in self:
partner_values = {}
partner = self.env["res.partner"].browse(period.partner_id)
# Check changement de région
zip_id = self.env["res.city.zip"].search([("name", "=", period.zip)])
region = zip_id[0].city_id[0].state_id
if partner.region and region != partner.region:
raise ValidationError(
_(
"Vous ne pouvez pas modifier l'adresse "
"dans une autre région.\n"
" - ancienne région : %s\n"
" - nouvelle région : %s"
)
% (partner.region.name, region.name)
)
# Close previous period
previous_period = self.env["scop.period"].browse(period.previous_period_id)
if previous_period:
if previous_period.end:
if period.start >= previous_period.end:
partner_values = {
"dissolution_date": False,
}
else:
raise ValidationError(
_(
"La nouvelle période ne peut commencer avant la "
"fin de la période précédente : "
)
+ str(previous_period.end)
)
if period.start >= previous_period.start:
if not previous_period.end:
previous_period.sudo().write(
{
"end": period.start,
"end_reason": period.end_reason,
"comments": period.comments,
}
)
else:
raise ValidationError(
_(
"La nouvelle période ne peut commencer avant la "
"période précédente : "
)
+ str(previous_period.start)
)
# Create new period
period_values = {
"start": period.start,
"partner_id": period.partner_id,
}
values = {
"name": period.name,
"dissolution_reason_id": False,
"cooperative_form_id": period.cooperative_form_id.id,
"partner_company_type_id": period.partner_company_type_id.id,
"siret": period.siret,
"street": period.street,
"street2": period.street2,
"street3": period.street3,
"zip": period.zip,
"zip_id": period.zip_id.id,
"city": period.city,
"cedex": period.cedex,
"state_id": period.state_id.id,
"country_id": period.country_id.id,
"naf_id": period.naf_id.id,
"cae": period.cae,
"ur_id": period.ur_id.id,
}
period_values.update(values)
self.env["scop.period"].sudo().create(period_values)
# Update partner
partner_values.update(
{
"siret": period.siret,
"street": period.street,
"street2": period.street2,
"street3": period.street3,
"zip": period.zip,
"zip_id": period.zip_id.id,
"city": period.city,
"cedex": period.cedex,
"state_id": period.state_id.id,
"country_id": period.country_id.id,
"ur_id": period.ur_id.id,
}
)
partner.sudo().write(partner_values)
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- TODO: supprimer fichier -->
<!-- WIZARD FORM -->
<record id="scop_address_wizard_view_form" model="ir.ui.view">
<field name="name">scop.address.wizard.form</field>
<field name="model">scop.address.wizard</field>
<field name="arch" type="xml">
<form string="Nouvelle Période">
<div class="alert alert-danger" role="alert" style="font-size: 1.4rem;">
L’adresse renseignée ici doit impérativement être celle du KBIS !
<br />
Ce formulaire ne peut pas être utilisé pour une adresse postale qui ne soit pas celle du siège.
</div>
<group name="period" string="Période" col="2">
<field name="start" required="1" />
<field name="previous_period_id" invisible="1" />
<field
name="end_reason"
attrs="{'required': [('previous_period_id', '!=', 0)], 'invisible': [('previous_period_id', '=', 0)]}"
readonly="1"
/>
<field
name="comments"
attrs="{'invisible': [('previous_period_id', '=', 0)]}"
/>
</group>
<group col="2">
<group>
<field name="name" readonly="1" />
<field name="siret" required="1" />
</group>
<group>
<label for='street' string="Adresse du siège social" />
<div class="o_address_format" modifiers="{}">
<field
name="street"
placeholder="Rue..."
class="o_address_street"
required="1"
/>
<field
name="street2"
placeholder="Rue 2..."
class="o_address_street"
/>
<field
name="street3"
placeholder="Rue 3..."
class="o_address_street"
/>
<field
name="zip_id"
options="{'create_name_field': 'city', 'no_open': True, 'no_create': True}"
placeholder="Location completion"
on_change="1"
can_create="true"
can_write="true"
/>
<field
name="zip"
placeholder="Code postal"
class="o_address_city"
on_change="1"
required="1"
/>
<field
name="city"
placeholder="Ville"
class="o_address_city"
required="1"
/>
<field
name="cedex"
placeholder="Cedex"
class="o_address_city"
/>
<field
name="state_id"
placeholder="Région"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
<field
name="country_id"
placeholder="Pays"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
<field
name="ur_id"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
</div>
</group>
</group>
<footer>
<button
class="btn btn-sm btn-primary"
name="create_period"
string="Créer"
type="object"
confirm="Êtes-vous sûr de vouloir créer une nouvelle période ?"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Close"
/>
</footer>
</form>
</field>
</record>
<record id="scop_address_wizard_action" model="ir.actions.act_window">
<field name="name">Changement d'adresse</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">scop.address.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="scop_address_wizard_view_form" />
<field name="target">new</field>
</record>
</odoo>
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class ScopDecesWizard(models.TransientModel):
_name = 'scop.deces.wizard'
_description = "Décés"
_name = "scop.deces.wizard"
_description = "Décès"
# Default functions
@api.model
def _default_partner_id(self):
return self.env.context.get('active_id')
return self.env.context.get("active_id")
@api.model
def _default_last_period_id(self):
return self.env['scop.period'].search(
[('partner_id', '=', self.env.context.get('active_id')),
('end', '=', False)],
limit=1).id
return (
self.env["scop.period"]
.search(
[
("partner_id", "=", self.env.context.get("active_id")),
("end", "=", False),
],
limit=1,
)
.id
)
# Fields common
partner_id = fields.Integer('Partner', default=_default_partner_id)
partner_id = fields.Integer("Partner", default=_default_partner_id)
# Fields previous period
last_period_id = fields.Integer(default=_default_last_period_id)
end = fields.Date(
'Fin de validité', required=True, default=fields.Date.today())
end = fields.Date("Fin de validité", required=True, default=lambda self: fields.Date.today())
dissolution_reason_id = fields.Many2one(
'res.partner.dissolution.reason',
string="Motif Décés",
on_delete='restrict',
required=True)
comments = fields.Text('Commentaires')
"res.partner.dissolution.reason",
string="Motif Décès",
ondelete="restrict",
required=True,
)
comments = fields.Text("Commentaires")
@api.multi
def deces_action(self):
# Close previous period
for period in self:
last_period = self.env['scop.period'].browse(
period.last_period_id)
last_period = self.env["scop.period"].browse(period.last_period_id)
if last_period:
if period.end >= last_period.start:
last_period.write({
'end': period.end,
'end_reason': 'deces',
'dissolution_reason_id':
period.dissolution_reason_id.id,
'comments': period.comments,
})
last_period.write(
{
"end": period.end,
"end_reason": "deces",
"dissolution_reason_id": period.dissolution_reason_id.id,
"comments": period.comments,
}
)
else:
raise ValidationError(
"La date de fin doit être postèrieure à la date de "
_(
"La date de fin doit être postérieure à la date de "
+ "début de la dernière période: "
+ str(last_period.start))
)
+ str(last_period.start)
)
# Update partner
partner = self.env['res.partner'].browse(period.partner_id)
partner.write({
'dissolution_date': period.end,
'dissolution_reason_id': period.dissolution_reason_id.id
})
partner = self.env["res.partner"].browse(period.partner_id)
partner.write(
{
"dissolution_date": period.end,
"dissolution_reason_id": period.dissolution_reason_id.id,
"project_status": "6_decede",
}
)
#
# HS 08/04/2020
# On procède à la radiation à la même date
#
# Lecture du motif de radiation type décès
motif = self.env.ref("cgscop_partner.reason_end_membership_5")
# Mise à jour des périodes d'adhésions
if motif:
adh_period = self.env["scop.membership.period"].search(
[
("partner_id", "=", period.partner_id),
("end", "=", False),
]
)
for adh in adh_period:
if not adh.end:
adh.write({"end": period.end, "end_reason_id": motif.id})
else:
raise ValidationError(
"Il n'existe pas de période à fermer.")
raise ValidationError(_("Il n'existe pas de période à fermer."))
......@@ -5,22 +5,48 @@
<field name="name">scop.deces.wizard.form</field>
<field name="model">scop.deces.wizard</field>
<field name="arch" type="xml">
<form string="Décés">
<group name="period" string="Décés / Mise en sommeil">
<form string="Décès">
<div class="alert alert-warning" role="alert">
<strong>Attention :</strong> la validation de cette action va déclencher les actions suivantes :
<ul>
<li>clôture de la dernière ligne de l'historique (décès)</li>
<li>modification du statut de la coopérative (coop décédée)</li>
<li>affectation d'une date de décès et d'un motif de décès</li>
<li>clôture de la dernière période d'adhésion (mort économique)</li>
<li>modification du statut d'adhésion (radié)</li>
<li>expiration des mandats bancaires</li>
<li>modification du mode de paiement des factures et cotisations en cours (virement)</li>
<li>modification du mode de paiement par défaut de la coopérative (virement)</li>
</ul>
</div>
<group name="period" string="Décès / Mise en sommeil">
<field name="end" />
<field name="dissolution_reason_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="dissolution_reason_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="comments" />
</group>
<footer>
<button class="btn btn-sm btn-primary" name="deces_action" string="Créer" type="object" confirm="Êtes-vous sûr de vouloir clôturer la dernière période ?"/>
<button class="btn btn-sm btn-default" special="cancel" string="Close"/>
<button
class="btn btn-sm btn-primary"
name="deces_action"
string="Créer"
type="object"
confirm="Êtes-vous sûr de vouloir clôturer la dernière période ?"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Close"
/>
</footer>
</form>
</field>
</record>
<record id="scop_deces_wizard_create_action" model="ir.actions.act_window">
<field name="name">Décés période</field>
<field name="name">Décès période</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">scop.deces.wizard</field>
<field name="view_mode">form</field>
......
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class ScopMembershipOutWizard(models.TransientModel):
_name = 'scop.membership.out.wizard'
_name = "scop.membership.out.wizard"
_description = "Radiation"
# Default functions
@api.model
def _default_partner_id(self):
return self.env.context.get('active_id')
return self.env.context.get("active_id")
partner_id = fields.Integer('Partner', default=_default_partner_id)
partner_id = fields.Many2one(
comodel_name="res.partner", string="Partner", default=_default_partner_id
)
type_all = fields.Boolean(string="Tous types d'adhésion", default=True)
type_id = fields.Many2one(
'scop.membership.type',
string="Type d'adhésion",
ondelete='restrict', required=True)
end = fields.Date(
"Fin d'adhésion", required=True, default=fields.Date.today())
"scop.membership.type", string="Type d'adhésion", ondelete="restrict"
)
end = fields.Date("Fin d'adhésion", required=True, default=lambda self: fields.Date.today())
end_reason_id = fields.Many2one(
'scop.membership.reason.end',
"scop.membership.reason.end",
string="Motif de fin d’adhésion",
on_delete='restrict',
required=True)
note = fields.Text('Commentaires')
ondelete="restrict",
required=True,
)
note = fields.Text("Commentaires")
@api.multi
# ............................................................
# Fermeture des périodes
# ............................................................
def member_out(self):
# Close previous period
for period in self:
last_period = self.env['scop.membership.period'].search(
[('partner_id', '=', period.partner_id),
('end', '=', False), ('type_id', '=', period.type_id.id)],
limit=1)
# On veut cloture toutes les périodes
if period.type_all:
last_periods = self.env["scop.membership.period"].search(
[
("partner_id", "=", period.partner_id.id),
("end", "=", False),
]
)
for lp in last_periods:
period_type_id = lp.type_id.id
period.member_out_period(
period.partner_id.id,
period_type_id,
period.end,
period.end_reason_id.id,
period.note,
)
# On ne veut cloturer qu'une seule période
else:
period_type_id = period.type_id.id
period.member_out_period(
period.partner_id.id,
period_type_id,
period.end,
period.end_reason_id.id,
period.note,
)
self.partner_id.write({"membership_status": "out"})
return
# ............................................................
# Fermeture d'une période
# ............................................................
def member_out_period(self, partner_id, period_type_id, end, end_reason_id, note):
# Lecture de la dernière période active
last_period = self.env["scop.membership.period"].search(
[
("partner_id", "=", partner_id),
("end", "=", False),
("type_id", "=", period_type_id),
],
limit=1,
)
if last_period:
if period.end >= last_period.start:
last_period.write({
'end': period.end,
'end_reason_id': period.end_reason_id.id,
'note': period.note,
})
if end >= last_period.start:
last_period.write(
{
"end": end,
"end_reason_id": end_reason_id,
"note": note,
}
)
else:
raise ValidationError(
_(
"La date de fin doit être postèrieure à la date de "
+ "début de la dernière période: "
+ str(last_period.start))
)
+ str(last_period.start)
)
else:
raise ValidationError(
"Il n'existe pas de période avec ce type à fermer.")
_("Il n'existe pas de période avec ce type à fermer.")
)
return
......@@ -7,14 +7,33 @@
<field name="arch" type="xml">
<form string="Radiation">
<group name="period" string="Radiation">
<field name="type_id" options="{'no_open': True, 'no_create': True}"/>
<field name="partner_id" invisible="1" />
<field name="type_all" />
<field
name="type_id"
options="{'no_open': True, 'no_create': True}"
attrs="{'required' : [('type_all','=', False)] ,'invisible': [('type_all','=', True)]}"
/>
<field name="end" />
<field name="end_reason_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="end_reason_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="note" />
</group>
<footer>
<button class="btn btn-sm btn-primary" name="member_out" string="Créer" type="object" confirm="Êtes-vous sûr de vouloir clôturer la dernière période ?"/>
<button class="btn btn-sm btn-default" special="cancel" string="Close"/>
<button
class="btn btn-sm btn-primary"
name="member_out"
string="Créer"
type="object"
confirm="Êtes-vous sûr de vouloir clôturer la dernière période ?"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Close"
/>
</footer>
</form>
</field>
......
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class ScopMembershipPeriodWizard(models.TransientModel):
_name = 'scop.membership.period.wizard'
_name = "scop.membership.period.wizard"
_description = "Création d'une nouvelle période d'adhésion"
# Default functions
@api.model
def _default_partner_id(self):
return self.env.context.get('active_id')
return self.env.context.get("active_id")
partner_id = fields.Integer('Partner', default=_default_partner_id)
@api.model
def _default_number(self):
partner_id = self.env["res.partner"].browse(self.env.context.get("active_id"))
number = partner_id.member_number if partner_id.member_number else ""
return number
partner_id = fields.Integer("Partner", default=_default_partner_id)
type_id = fields.Many2one(
'scop.membership.type',
"scop.membership.type",
string="Type d'adhésion",
ondelete='restrict', required=True)
start = fields.Date('Début d’adhésion', required=True,
default=fields.Date.today())
number = fields.Char("No adhérent", required=True)
state = fields.Selection(
[("none", "Non Adhérent"),
("ongoing", "Traitement de l'adhésion"),
("approval", "Attente d'approbation"),
("done", "Adhérent")],
string="Statut adhésion", default="none", required=True)
note = fields.Text('Commentaires')
ondelete="restrict",
required=True,
)
start = fields.Date("Début d’adhésion", required=True, default=lambda self: fields.Date.today())
number = fields.Char("No adhérent", required=True, default=_default_number)
note = fields.Text("Commentaires")
@api.multi
def create_period(self):
for period in self:
# Raise validation error if previous period exists
if self.env['scop.membership.period'].search(
[('partner_id', '=', period.partner_id),
('end', '=', False), ('type_id', '=', period.type_id.id)],
limit=1):
if self.env["scop.membership.period"].search(
[
("partner_id", "=", period.partner_id),
("end", "=", False),
("type_id", "=", period.type_id.id),
],
limit=1,
):
raise ValidationError(
"Une période d'adhésion existe déjà pour ce type")
_("Une période d'adhésion existe déjà pour ce type")
)
else:
self.env['scop.membership.period'].create({
'partner_id': period.partner_id,
'type_id': period.type_id.id,
'start': period.start,
'number': period.number,
'state': period.state,
'note': period.note
})
self.env["scop.membership.period"].create(
{
"partner_id": period.partner_id,
"type_id": period.type_id.id,
"start": period.start,
"number": period.number,
"note": period.note,
}
)
......@@ -7,21 +7,36 @@
<field name="arch" type="xml">
<form string="Nouvelle Période d'Adhésion">
<group name="period" string="Période" col="2">
<field name="type_id" options="{'no_open': True, 'no_create': True}"/>
<field
name="type_id"
options="{'no_open': True, 'no_create': True}"
/>
<field name="start" />
<field name="number" />
<field name="state"/>
<field name="note" />
</group>
<footer>
<button class="btn btn-sm btn-primary" name="create_period" string="Créer" type="object" confirm="Êtes-vous sûr de vouloir créer une nouvelle période d'adhésion ?"/>
<button class="btn btn-sm btn-default" special="cancel" string="Close"/>
<button
class="btn btn-sm btn-primary"
name="create_period"
string="Créer"
type="object"
confirm="Êtes-vous sûr de vouloir créer une nouvelle période d'adhésion ?"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Close"
/>
</footer>
</form>
</field>
</record>
<record id="scop_membership_period_wizard_create_action" model="ir.actions.act_window">
<record
id="scop_membership_period_wizard_create_action"
model="ir.actions.act_window"
>
<field name="name">Nouvelle période d'adhésion</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">scop.membership.period.wizard</field>
......
......@@ -6,154 +6,177 @@ from odoo.exceptions import ValidationError
class ScopPeriodWizard(models.TransientModel):
_name = 'scop.period.wizard'
_name = "scop.period.wizard"
_description = "Création d'une nouvelle période"
# Default functions
@api.model
def _default_partner_id(self):
return self.env.context.get('active_id')
return self.env.context.get("active_id")
@api.model
def _default_previous_period_id(self):
return self.env['scop.period'].search(
[('partner_id', '=', self.env.context.get('active_id')),
('end_reason', '=', False)],
limit=1).id
return (
self.env["scop.period"]
.search(
[
("partner_id", "=", self.env.context.get("active_id")),
("end_reason", "=", False),
],
limit=1,
)
.id
)
@api.model
def _default_name(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).name
return self.env["res.partner"].browse(self.env.context.get("active_id")).name
@api.model
def _default_cooperative_form_id(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).cooperative_form_id
return (
self.env["res.partner"]
.browse(self.env.context.get("active_id"))
.cooperative_form_id
)
@api.model
def _default_partner_company_type_id(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).partner_company_type_id
return (
self.env["res.partner"]
.browse(self.env.context.get("active_id"))
.partner_company_type_id
)
@api.model
def _default_siret(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).siret
return self.env["res.partner"].browse(self.env.context.get("active_id")).siret
@api.model
def _default_street(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).street
return self.env["res.partner"].browse(self.env.context.get("active_id")).street
@api.model
def _default_street2(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).street2
return self.env["res.partner"].browse(self.env.context.get("active_id")).street2
@api.model
def _default_street3(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).street3
return self.env["res.partner"].browse(self.env.context.get("active_id")).street3
@api.model
def _default_zip(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).zip
return self.env["res.partner"].browse(self.env.context.get("active_id")).zip
@api.model
def _default_zip_id(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).zip_id
return self.env["res.partner"].browse(self.env.context.get("active_id")).zip_id
@api.model
def _default_city(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).city
return self.env["res.partner"].browse(self.env.context.get("active_id")).city
@api.model
def _default_cedex(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).cedex
return self.env["res.partner"].browse(self.env.context.get("active_id")).cedex
@api.model
def _default_state_id(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).state_id
return (
self.env["res.partner"].browse(self.env.context.get("active_id")).state_id
)
@api.model
def _default_country_id(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).country_id
return (
self.env["res.partner"].browse(self.env.context.get("active_id")).country_id
)
@api.model
def _default_naf_id(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).naf_id
return self.env["res.partner"].browse(self.env.context.get("active_id")).naf_id
@api.model
def _default_cae(self):
return self.env['res.partner'].browse(
self.env.context.get('active_id')).cae
return self.env["res.partner"].browse(self.env.context.get("active_id")).cae
@api.model
def _default_ur_id(self):
return self.env["res.partner"].browse(self.env.context.get("active_id")).ur_id
# Fields common
partner_id = fields.Integer('Partner', default=_default_partner_id)
partner_id = fields.Integer("Partner", default=_default_partner_id)
# Fields previous period
previous_period_id = fields.Integer(default=_default_previous_period_id)
end_reason = fields.Selection(
[('juri', "Modification de la forme juridique"),
('form', "Changement de forme coopérative"),
('acti', "Changement d'activité (NAF)"),
('adr', "Changement d'adresse"),
('nom', "Changement de dénomination sociale"),
('autr', "Autres")],
string='Motif')
comments = fields.Text('Commentaires')
[
("juri", "Modification de la forme juridique"),
("form", "Changement de forme coopérative"),
("acti", "Changement d'activité (NAF)"),
("adr", "Changement d'adresse"),
("nom", "Changement de dénomination sociale"),
("registration", "Immatriculation"),
("dreets", "Radiation DREETS"),
("autr", "Autres"),
],
string="Motif",
)
comments = fields.Text("Commentaires")
# Fields new period
start = fields.Date('Début de validité', required=True,
default=fields.Date.today())
name = fields.Char('Raison Sociale', required=True, default=_default_name)
start = fields.Date("Début de validité", required=True, default=lambda self: fields.Date.today())
name = fields.Char("Raison Sociale", required=True, default=_default_name)
cooperative_form_id = fields.Many2one(
'res.partner.cooperative.form',
"res.partner.cooperative.form",
string="Cooperative form",
on_delete='restrict', required=True,
default=_default_cooperative_form_id)
ondelete="restrict",
required=True,
default=_default_cooperative_form_id,
)
partner_company_type_id = fields.Many2one(
comodel_name='res.partner.company.type',
string='Legal Form',
track_visibility='onchange',
on_delete='restrict', required=True,
default=_default_partner_company_type_id)
siret = fields.Char(string='SIRET', size=14, required=True,
default=_default_siret)
comodel_name="res.partner.company.type",
string="Legal Form",
ondelete="restrict",
required=True,
default=_default_partner_company_type_id,
)
siret = fields.Char(string="SIRET", size=14, required=True, default=_default_siret)
street = fields.Char(default=_default_street)
street2 = fields.Char(default=_default_street2)
street3 = fields.Char(default=_default_street3)
zip = fields.Char(default=_default_zip)
zip_id = fields.Many2one('res.city.zip', 'ZIP Location',
default=_default_zip_id)
zip_id = fields.Many2one("res.city.zip", "ZIP Location", default=_default_zip_id)
city = fields.Char(default=_default_city)
cedex = fields.Char(default=_default_cedex)
state_id = fields.Many2one(
"res.country.state",
string='State',
ondelete='restrict',
string="State",
ondelete="restrict",
domain="[('country_id', '=?', country_id)]",
default=_default_state_id)
default=_default_state_id,
)
country_id = fields.Many2one(
'res.country', string='Country', ondelete='restrict',
default=_default_country_id)
"res.country",
string="Country",
ondelete="restrict",
default=_default_country_id,
)
naf_id = fields.Many2one(
'res.partner.naf',
string='Code NAF',
on_delete='restrict', default=_default_naf_id)
"res.partner.naf",
string="Code NAF",
ondelete="restrict",
default=_default_naf_id,
)
cae = fields.Boolean("CAE", default=_default_cae)
ur_id = fields.Many2one(
comodel_name="union.regionale",
string="Union Régionale",
default=_default_ur_id,
)
# Action
@api.onchange('zip_id')
@api.onchange("zip_id")
def _onchange_zip_id(self):
if self.zip_id:
self.zip = self.zip_id.name
......@@ -161,66 +184,74 @@ class ScopPeriodWizard(models.TransientModel):
self.country_id = self.zip_id.city_id.country_id
self.state_id = self.zip_id.city_id.state_id
@api.multi
def create_period(self):
for period in self:
partner_values = {}
# Close previous period
previous_period = self.env['scop.period'].search(
[('partner_id', '=', self.env.context.get('active_id'))],
limit=1)
previous_period = self.env["scop.period"].search(
[("partner_id", "=", self.env.context.get("active_id"))],
limit=1,
)
if previous_period:
if previous_period.end:
if period.start >= previous_period.end:
partner_values = {
'dissolution_date': False,
"dissolution_date": False,
}
else:
raise ValidationError(
"La nouvelle période ne peut commencer avant la "
+ "fin de la période précédente : "
+ str(previous_period.end))
+ str(previous_period.end)
)
if period.start >= previous_period.start:
if not previous_period.end_reason:
previous_period.write({
'end': period.start,
'end_reason': period.end_reason,
'comments': period.comments,
})
previous_period.write(
{
"end": period.start,
"end_reason": period.end_reason,
"comments": period.comments,
}
)
else:
raise ValidationError(
"La nouvelle période ne peut commencer avant la "
+ "période précédente : "
+ str(previous_period.start))
+ str(previous_period.start)
)
# Create new period
period_values = {
'start': period.start,
'partner_id': period.partner_id
"start": period.start,
"partner_id": period.partner_id,
}
values = {
'name': period.name,
'dissolution_reason_id': False,
'cooperative_form_id': period.cooperative_form_id.id,
'partner_company_type_id': period.partner_company_type_id.id,
'siret': period.siret,
'street': period.street,
'street2': period.street2,
'street3': period.street3,
'zip': period.zip,
'zip_id': period.zip_id.id,
'city': period.city,
'cedex': period.cedex,
'state_id': period.state_id.id,
'country_id': period.country_id.id,
'naf_id': period.naf_id.id,
'cae': period.cae
"name": period.name,
"dissolution_reason_id": False,
"cooperative_form_id": period.cooperative_form_id.id,
"partner_company_type_id": period.partner_company_type_id.id,
"siret": period.siret,
"street": period.street,
"street2": period.street2,
"street3": period.street3,
"zip": period.zip,
"zip_id": period.zip_id.id,
"city": period.city,
"cedex": period.cedex,
"state_id": period.state_id.id,
"country_id": period.country_id.id,
"naf_id": period.naf_id.id,
"cae": period.cae,
"ur_id": period.ur_id.id,
}
period_values.update(values)
self.env['scop.period'].create(period_values)
self.env["scop.period"].with_context().create(period_values)
# Update partner
partner_values.update(values)
partner = self.env['res.partner'].browse(period.partner_id)
partner.write(partner_values)
partner = self.env["res.partner"].browse(period.partner_id)
partner.sudo().write(partner_values)
if period.siret and partner.is_registration_in_progress:
partner.update({"is_registration_in_progress": False})
......@@ -9,37 +9,104 @@
<group name="period" string="Période" col="2">
<field name="start" required="1" />
<field name="previous_period_id" invisible="1" />
<field name="end_reason" attrs="{'required': [('previous_period_id', '!=', 0)], 'invisible': [('previous_period_id', '=', 0)]}"/>
<field name="comments" attrs="{'invisible': [('previous_period_id', '=', 0)]}"/>
<field
name="end_reason"
attrs="{'required': [('previous_period_id', '!=', 0)], 'invisible': [('previous_period_id', '=', 0)]}"
/>
<field
name="comments"
attrs="{'invisible': [('previous_period_id', '=', 0)]}"
/>
</group>
<group col="2">
<group>
<field name="name" required="1" />
<field name="cooperative_form_id" required="1" options="{'no_open': True, 'no_create': True}"/>
<field name="partner_company_type_id" required="1" options="{'no_open': True, 'no_create': True}"/>
<field
name="cooperative_form_id"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
<field
name="partner_company_type_id"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
<field name="siret" required="1" />
<label for='street' string="Adresse Administrative"/>
<label for='street' string="Adresse du siège social" />
<div class="o_address_format" modifiers="{}">
<field name="street" placeholder="Rue..." class="o_address_street" required="1"/>
<field name="street2" placeholder="Rue 2..." class="o_address_street"/>
<field name="street3" placeholder="Rue 3..." class="o_address_street"/>
<field name="zip_id" options="{'create_name_field': 'city', 'no_open': True, 'no_create': True}" placeholder="Location completion"
on_change="1" can_create="true" can_write="true"/>
<field name="zip" placeholder="Code postal" class="o_address_city" on_change="1" required="1"/>
<field name="city" placeholder="Ville" class="o_address_city" required="1"/>
<field name="cedex" placeholder="Cedex" class="o_address_city"/>
<field
name="street"
placeholder="Rue..."
class="o_address_street"
required="1"
/>
<field
name="street2"
placeholder="Rue 2..."
class="o_address_street"
/>
<field
name="street3"
placeholder="Rue 3..."
class="o_address_street"
/>
<field
name="zip_id"
options="{'create_name_field': 'city', 'no_open': True, 'no_create': True}"
placeholder="Location completion"
on_change="1"
can_create="true"
can_write="true"
/>
<field
name="zip"
placeholder="Code postal"
class="o_address_city"
on_change="1"
required="1"
/>
<field
name="city"
placeholder="Ville"
class="o_address_city"
required="1"
/>
<field
name="cedex"
placeholder="Cedex"
class="o_address_city"
/>
<field name="state_id" placeholder="État" invisible="1" />
<field name="country_id" placeholder="Pays" invisible="1" />
<field
name="ur_id"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
</div>
</group>
<group>
<field name="naf_id" required="1" options="{'no_open': True, 'no_create': True}"/>
<field
name="naf_id"
required="1"
options="{'no_open': True, 'no_create': True}"
/>
<field name="cae" />
</group>
</group>
<footer>
<button class="btn btn-sm btn-primary" name="create_period" string="Créer" type="object" confirm="Êtes-vous sûr de vouloir créer une nouvelle période ?"/>
<button class="btn btn-sm btn-default" special="cancel" string="Close"/>
<button
class="btn btn-sm btn-primary"
name="create_period"
string="Créer"
type="object"
confirm="Êtes-vous sûr de vouloir créer une nouvelle période ?"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Close"
/>
</footer>
</form>
</field>
......
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
PROJECT_STATUS = [
("1_information", "Phase d'information"),
("2_pre-diagnostic", "Phase de pré-diagnostic"),
("3_accompagnement", "Phase d'accompagnement projet"),
("4_suivi", "Phase de suivi"),
("5_abandonne", "Projet abandonné"),
("6_decede", "Coop Décédée"),
]
class ScopStatusWizard(models.TransientModel):
_name = "scop.status.wizard"
_description = "Wizard changement de statut projet"
# Default functions
@api.model
def _default_partner_id(self):
return self.env.context.get("active_id")
@api.model
def _default_project_status(self):
return (
self.env["res.partner"]
.browse(self.env.context.get("active_id"))
.project_status
)
# Fields common
partner_id = fields.Many2one(
comodel_name="res.partner",
string="Partner",
default=_default_partner_id,
)
# Informations Bandeau
project_status = fields.Selection(
selection=PROJECT_STATUS,
string="Statut projet actuel",
default=_default_project_status,
)
project_status_new = fields.Selection(
selection=PROJECT_STATUS,
string="Statut projet nouveau",
)
def change_project_status(self):
self.partner_id.write({"project_status": self.project_status_new})
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- WIZARD FORM -->
<record id="scop_status_wizard_view_form" model="ir.ui.view">
<field name="name">scop.status.wizard.form</field>
<field name="model">scop.status.wizard</field>
<field name="arch" type="xml">
<form string="Changement statut projet">
<group name="period" string="Période" col="2">
<field name="partner_id" readonly="1" />
<field name="project_status" readonly="1" />
<field name="project_status_new" required="1" />
</group>
<footer>
<button
class="btn btn-sm btn-primary"
name="change_project_status"
string="Modifier statut projet"
type="object"
/>
<button
class="btn btn-sm btn-default"
special="cancel"
string="Close"
/>
</footer>
</form>
</field>
</record>
<record id="scop_status_wizard_action" model="ir.actions.act_window">
<field name="name">Modification statut projet</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">scop.status.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="scop_status_wizard_view_form" />
<field name="target">new</field>
</record>
</odoo>