Skip to content
Extraits de code Groupes Projets
Valider 2431a56b rédigé par Julien - Le Filament's avatar Julien - Le Filament
Parcourir les fichiers

[WIP] work in progress

parent 61bc6fd7
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
Affichage de avec 1742 ajouts et 93 suppressions
# Configuration for known file extensions
[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.{json,yml,yaml,rst,md}]
indent_size = 2
# Do not configure editor for libs and autogenerated content
[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}]
charset = unset
end_of_line = unset
indent_size = unset
indent_style = unset
insert_final_newline = false
trim_trailing_whitespace = false
env:
browser: true
es6: true
# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449
parserOptions:
ecmaVersion: 2017
overrides:
- files:
- "**/*.esm.js"
parserOptions:
sourceType: module
# Globals available in Odoo that shouldn't produce errorings
globals:
_: readonly
$: readonly
fuzzy: readonly
jQuery: readonly
moment: readonly
odoo: readonly
openerp: readonly
owl: readonly
# Styling is handled by Prettier, so we only need to enable AST rules;
# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
rules:
accessor-pairs: warn
array-callback-return: warn
callback-return: warn
capitalized-comments:
- warn
- always
- ignoreConsecutiveComments: true
ignoreInlineComments: true
complexity:
- warn
- 15
constructor-super: warn
dot-notation: warn
eqeqeq: warn
global-require: warn
handle-callback-err: warn
id-blacklist: warn
id-match: warn
init-declarations: error
max-depth: warn
max-nested-callbacks: warn
max-statements-per-line: warn
no-alert: warn
no-array-constructor: warn
no-caller: warn
no-case-declarations: warn
no-class-assign: warn
no-cond-assign: error
no-const-assign: error
no-constant-condition: warn
no-control-regex: warn
no-debugger: error
no-delete-var: warn
no-div-regex: warn
no-dupe-args: error
no-dupe-class-members: error
no-dupe-keys: error
no-duplicate-case: error
no-duplicate-imports: error
no-else-return: warn
no-empty-character-class: warn
no-empty-function: error
no-empty-pattern: error
no-empty: warn
no-eq-null: error
no-eval: error
no-ex-assign: error
no-extend-native: warn
no-extra-bind: warn
no-extra-boolean-cast: warn
no-extra-label: warn
no-fallthrough: warn
no-func-assign: error
no-global-assign: error
no-implicit-coercion:
- warn
- allow: ["~"]
no-implicit-globals: warn
no-implied-eval: warn
no-inline-comments: warn
no-inner-declarations: warn
no-invalid-regexp: warn
no-irregular-whitespace: warn
no-iterator: warn
no-label-var: warn
no-labels: warn
no-lone-blocks: warn
no-lonely-if: error
no-mixed-requires: error
no-multi-str: warn
no-native-reassign: error
no-negated-condition: warn
no-negated-in-lhs: error
no-new-func: warn
no-new-object: warn
no-new-require: warn
no-new-symbol: warn
no-new-wrappers: warn
no-new: warn
no-obj-calls: warn
no-octal-escape: warn
no-octal: warn
no-param-reassign: warn
no-path-concat: warn
no-process-env: warn
no-process-exit: warn
no-proto: warn
no-prototype-builtins: warn
no-redeclare: warn
no-regex-spaces: warn
no-restricted-globals: warn
no-restricted-imports: warn
no-restricted-modules: warn
no-restricted-syntax: warn
no-return-assign: error
no-script-url: warn
no-self-assign: warn
no-self-compare: warn
no-sequences: warn
no-shadow-restricted-names: warn
no-shadow: warn
no-sparse-arrays: warn
no-sync: warn
no-this-before-super: warn
no-throw-literal: warn
no-undef-init: warn
no-undef: error
no-unmodified-loop-condition: warn
no-unneeded-ternary: error
no-unreachable: error
no-unsafe-finally: error
no-unused-expressions: error
no-unused-labels: error
no-unused-vars: error
no-use-before-define: error
no-useless-call: warn
no-useless-computed-key: warn
no-useless-concat: warn
no-useless-constructor: warn
no-useless-escape: warn
no-useless-rename: warn
no-void: warn
no-with: warn
operator-assignment: [error, always]
prefer-const: warn
radix: warn
require-yield: warn
sort-imports: warn
spaced-comment: [error, always]
strict: [error, function]
use-isnan: error
valid-jsdoc:
- warn
- prefer:
arg: param
argument: param
augments: extends
constructor: class
exception: throws
func: function
method: function
prop: property
return: returns
virtual: abstract
yield: yields
preferType:
array: Array
bool: Boolean
boolean: Boolean
number: Number
object: Object
str: String
string: String
requireParamDescription: false
requireReturn: false
requireReturnDescription: false
requireReturnType: false
valid-typeof: warn
yoda: warn
[flake8]
max-line-length = 88
max-complexity = 16
# B = bugbear
# B9 = bugbear opinionated (incl line length)
select = C,E,F,W,B,B9
# E203: whitespace before ':' (black behaviour)
# E501: flake8 line length (covered by bugbear B950)
# W503: line break before binary operator (black behaviour)
ignore = E203,E501,W503
per-file-ignores=
__init__.py:F401
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
/.venv
/.pytest_cache
# C extensions
*.so
# Distribution / packaging
.Python
env/
bin/
build/
develop-eggs/
dist/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
*.eggs
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
# Pycharm
.idea
# Eclipse
.settings
# Visual Studio cache/options directory
.vs/
.vscode
# OSX Files
.DS_Store
# Django stuff:
*.log
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# Rope
.ropeproject
# Sphinx documentation
docs/_build/
# Backup files
*~
*.swp
# OCA rules
!static/lib/
[settings]
; see https://github.com/psf/black
multi_line_output=3
include_trailing_comma=True
force_grid_wrap=0
combine_as_imports=True
use_parentheses=True
line_length=88
known_odoo=odoo
known_odoo_addons=odoo.addons
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
default_section=THIRDPARTY
ensure_newline_before_comments = True
exclude: |
(?x)
# NOT INSTALLABLE ADDONS
# END NOT INSTALLABLE ADDONS
# Files and folders generated by bots, to avoid loops
^setup/|/static/description/index\.html$|
# We don't want to mess with tool-generated files
.svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|
# Library files can have extraneous formatting (even minimized)
/static/(src/)?lib/|
# Repos using Sphinx to generate docs don't need prettying
^docs/_templates/.*\.html$|
# You don't usually want a bot to modify your legal texts
(LICENSE.*|COPYING.*)
default_language_version:
python: python3
node: "14.13.0"
repos:
- repo: local
hooks:
# These files are most likely copier diff rejection junks; if found,
# review them manually, fix the problem (if needed) and remove them
- id: forbidden-files
name: forbidden files
entry: found forbidden files; remove them
language: fail
files: "\\.rej$"
- repo: https://github.com/oca/maintainer-tools
rev: 7d8a9f9ad73db0976fb03cbee43d953bc29b89e9
hooks:
# update the NOT INSTALLABLE ADDONS section above
- id: oca-update-pre-commit-excluded-addons
- id: oca-fix-manifest-website
args: ["https://le-filament.com"]
- repo: https://github.com/myint/autoflake
rev: v1.4
hooks:
- id: autoflake
args:
- --expand-star-imports
- --ignore-init-module-imports
- --in-place
- --remove-all-unused-imports
- --remove-duplicate-keys
- --remove-unused-variables
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v2.6.2
hooks:
- id: prettier
name: prettier (with plugin-xml)
additional_dependencies:
- "prettier@2.1.2"
- "@prettier/plugin-xml@0.12.0"
args:
- --plugin=@prettier/plugin-xml
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.15.0
hooks:
- id: eslint
verbose: true
args:
- --color
- --fix
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.2.0
hooks:
- id: trailing-whitespace
# exclude autogenerated files
exclude: /README\.rst$|\.pot?$
- id: end-of-file-fixer
# exclude autogenerated files
exclude: /README\.rst$|\.pot?$
- id: debug-statements
- id: fix-encoding-pragma
args: ["--remove"]
- id: check-case-conflict
- id: check-docstring-first
- id: check-executables-have-shebangs
- id: check-merge-conflict
# exclude files where underlines are not distinguishable from merge conflicts
exclude: /README\.rst$|^docs/.*\.rst$
- id: check-symlinks
- id: check-xml
- id: mixed-line-ending
args: ["--fix=lf"]
- repo: https://github.com/asottile/pyupgrade
rev: v2.32.1
hooks:
- id: pyupgrade
args: ["--keep-percent-format"]
- repo: https://github.com/PyCQA/isort
rev: 5.10.1
hooks:
- id: isort
name: isort except __init__.py
args:
- --settings=.
exclude: /__init__\.py$
- repo: https://gitlab.com/PyCQA/flake8
rev: 3.9.2
hooks:
- id: flake8
name: flake8
additional_dependencies: ["flake8-bugbear==20.1.4"]
- repo: https://github.com/PyCQA/pylint
rev: v2.11.1
hooks:
- id: pylint
name: pylint with optional checks
args:
- --rcfile=.pylintrc
- --exit-zero
verbose: true
additional_dependencies: &pylint_deps
- pylint-odoo==5.0.5
- id: pylint
name: pylint with mandatory checks
args:
- --rcfile=.pylintrc-mandatory
additional_dependencies: *pylint_deps
# Defaults for all prettier-supported languages.
# Prettier will complete this with settings from .editorconfig file.
bracketSpacing: false
printWidth: 88
proseWrap: always
semi: true
trailingComma: "es5"
xmlWhitespaceSensitivity: "strict"
[MASTER]
load-plugins=pylint_odoo
score=n
[ODOOLINT]
readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
manifest_required_authors=Le Filament
manifest_required_keys=license
manifest_deprecated_keys=description,active
license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
valid_odoo_versions=14.0
[MESSAGES CONTROL]
disable=all
# This .pylintrc contains optional AND mandatory checks and is meant to be
# loaded in an IDE to have it check everything, in the hope this will make
# optional checks more visible to contributors who otherwise never look at a
# green travis to see optional checks that failed.
# .pylintrc-mandatory containing only mandatory checks is used the pre-commit
# config as a blocking check.
enable=anomalous-backslash-in-string,
api-one-deprecated,
api-one-multi-together,
assignment-from-none,
attribute-deprecated,
class-camelcase,
dangerous-default-value,
dangerous-view-replace-wo-priority,
development-status-allowed,
duplicate-id-csv,
duplicate-key,
duplicate-xml-fields,
duplicate-xml-record-id,
eval-referenced,
eval-used,
incoherent-interpreter-exec-perm,
license-allowed,
manifest-author-string,
manifest-deprecated-key,
manifest-required-author,
manifest-required-key,
manifest-version-format,
method-compute,
method-inverse,
method-required-super,
method-search,
openerp-exception-warning,
pointless-statement,
pointless-string-statement,
print-used,
redundant-keyword-arg,
redundant-modulename-xml,
reimported,
relative-import,
return-in-init,
rst-syntax-error,
sql-injection,
too-few-format-args,
translation-field,
translation-required,
unreachable,
use-vim-comment,
wrong-tabs-instead-of-spaces,
xml-syntax-error,
# messages that do not cause the lint step to fail
consider-merging-classes-inherited,
create-user-wo-reset-password,
dangerous-filter-wo-user,
deprecated-module,
file-not-used,
invalid-commit,
missing-manifest-dependency,
missing-newline-extrafiles,
no-utf8-coding-comment,
odoo-addons-relative-import,
old-api7-method-defined,
redefined-builtin,
too-complex,
unnecessary-utf8-coding-comment
[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
reports=no
[MASTER]
load-plugins=pylint_odoo
score=n
[ODOOLINT]
readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
manifest_required_authors=Le Filament
manifest_required_keys=license
manifest_deprecated_keys=description,active
license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
valid_odoo_versions=14.0
[MESSAGES CONTROL]
disable=all
enable=anomalous-backslash-in-string,
api-one-deprecated,
api-one-multi-together,
assignment-from-none,
attribute-deprecated,
class-camelcase,
dangerous-default-value,
dangerous-view-replace-wo-priority,
development-status-allowed,
duplicate-id-csv,
duplicate-key,
duplicate-xml-fields,
duplicate-xml-record-id,
eval-referenced,
eval-used,
incoherent-interpreter-exec-perm,
license-allowed,
manifest-author-string,
manifest-deprecated-key,
manifest-required-author,
manifest-required-key,
manifest-version-format,
method-compute,
method-inverse,
method-required-super,
method-search,
openerp-exception-warning,
pointless-statement,
pointless-string-statement,
print-used,
redundant-keyword-arg,
redundant-modulename-xml,
reimported,
relative-import,
return-in-init,
rst-syntax-error,
sql-injection,
too-few-format-args,
translation-field,
translation-required,
unreachable,
use-vim-comment,
wrong-tabs-instead-of-spaces,
xml-syntax-error
[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
reports=no
Ce diff est replié.
# cgscop_inpi
## Getting started
To make it easy for you to get started with GitLab, here's a list of recommended next steps.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command:
```
cd existing_repo
git remote add origin https://sources.le-filament.com/lefilament/cgscop/cgscop_inpi.git
git branch -M main
git push -uf origin main
```
## Integrate with your tools
- [ ] [Set up project integrations](https://sources.le-filament.com/lefilament/cgscop/cgscop_inpi/-/settings/integrations)
## Collaborate with your team
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/)
## Test and Deploy
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: http://www.gnu.org/licenses/agpl
:alt: License: AGPL-3
======================
CG SCOP - INPI
======================
Credits
=======
Funders
-------
The development of this module has been financially supported by:
Confédération Générale des SCOP (https://www.les-scop.coop)
Contributors
------------
Maintainer
----------
.. image:: https://le-filament.com/images/logo-lefilament.png
:alt: Le Filament
:target: https://le-filament.com
This module is maintained by Le Filament
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import models
from . import wizard
{
"name": "CG SCOP - INPI",
"summary": "CG SCOP - INPI",
"version": "14.0.0.0.1",
"author": "Le Filament",
"license": "AGPL-3",
"application": False,
"installable": True,
"depends": [
"base",
"cgscop_partner",
"mail",
"api_sirene",
"api_inpi",
"cgscop_liasse_fiscale"
],
"data": [
# security
"security/ir.model.access.csv",
# datas
# views
"views/menus.xml",
"views/res_partner.xml",
# templates
# wizards
"wizard/inpi_update_wizard_views.xml",
],
"installable": True,
"auto_install": False,
"qweb": [],
}
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import res_partner
from . import cgscop_inpi_director
# Copyright 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import datetime
import logging
from odoo import _, fields, models
logger = logging.getLogger(__name__)
class CgScopInpiDirector(models.Model):
_name = "cgscop.inpi.director"
_description = "Dirigeant"
partner_id = fields.Many2one(
comodel_name="res.partner",
string="Dirigeant",
ondelete="restrict",
)
name = fields.Char()
# Copyright 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import datetime
import logging
from odoo import _, fields, models
import odoo.addons.api_inpi.models.inpi_models as inpi_models
logger = logging.getLogger(__name__)
class ResPartner(models.Model):
_inherit = "res.partner"
wizard_id = fields.Char()
director_ids = fields.One2many(
comodel_name="cgscop.inpi.director",
inverse_name="partner_id",
string="Dirigeants",
)
# --------------------------------------------------
# Fonctions utiles traiement reponse INPI
# --------------------------------------------------
def _get_inpi_naf_id(self, codeApe):
if codeApe:
return self.env["res.partner.naf"].search(
[("name", "like", f"{codeApe[:2]}.{codeApe[2:]}")]
)
return None
def _get_inpi_address(self, adresse):
voie = []
data = {"street": "", "cedex": "", "street2": "", "zip": "", "city": ""}
if adresse.numVoiePresent:
voie.append(adresse.numVoie)
if adresse.indiceRepetitionPresent:
voie.append(adresse.indiceRepetition)
if adresse.typeVoiePresent:
voie.append(adresse.typeVoie)
if adresse.voiePresent:
voie.append(adresse.voie)
if adresse.datePriseEffetAdressePresent:
data["date_prise_effet"] = adresse.datePriseEffetAdresse
if voie:
data["street"] = " ".join(voie)
if adresse.cedexPresent:
data["cedex"] = adresse.cedex
if adresse.complementLocalisationPresent:
data["street2"] = adresse.complementLocalisation
if adresse.codePostalPresent:
data["zip"] = adresse.codePostal
if adresse.communePresent:
data["city"] = adresse.commune
return data
def _get_current_period(self):
return self.env["scop.period"].search(
[("partner_id", "=", self.id), ("end", "=", False)],
)
def _get_values_from_period(self, period):
return {
"partner_id": period.partner_id.id,
"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,
}
def _get_siege(self, inpi_data):
"""
renvoi l objet etablissement du siege
pas forcement l etablissement principal
"""
# check si l etablissement principal est le siege
ets_prin = inpi_data.formality.content.personneMorale.etablissementPrincipal
if (
ets_prin.descriptionEtablissement.rolePourEntreprise
== inpi_models.RolePourEntreprise.SIEGE_ETS_PRIN.value
):
return ets_prin
# si l etablissement pricipal n est pas le siege,
# on cherche parmi les secondaires
ets_secondaires = (
inpi_data.formality.content.personneMorale.autresEtablissements
)
for ets in ets_secondaires:
if (
ets.descriptionEtablissement.rolePourEntreprise
== inpi_models.RolePourEntreprise.SIEGE.value
):
return ets
# --------------------------------------------------
# Fonctions update générale
# --------------------------------------------------
def update_from_inpi(self, update_type="all"):
type_list = [
"adresse",
"etablissement",
"denomination",
"forme_juridique",
"dirigeant",
"activite",
"all",
]
if update_type not in type_list:
logger.warning(f"INPI update form {update_type} not available")
update_methods = {
"adresse": self._update_address_from_inpi,
"etablissement": self._update_etablissement_from_inpi,
"denomination": self._update_denomination_from_inpi,
"forme_juridique": self._update_forme_juridique_from_inpi,
"dirigeant": self._update_dirigeant_from_inpi,
"activite": self._update_naf_from_inpi,
"all": self._update_all_from_inpi,
}
inpi_data = self.env["api.inpi"].get_rne_data_object(
sirens=[self.siren.replace(" ", "")]
)
update_methods.get(update_type)(inpi_data=inpi_data)
# --------------------------------------------------
# Denomination
# --------------------------------------------------
def _update_denomination_from_inpi(self, inpi_data, new_period=True):
inpi_name = (
inpi_data.formality.content.personneMorale.identite.entreprise.denomination
)
period = self._get_current_period()
period_values = self._get_values_from_period(period)
if inpi_name != period.name:
if new_period:
period.write(
{"end": datetime.datetime.now().date(), "end_reason": "nom"}
)
period_values["start"] = fields.Date.today()
period_values["name"] = inpi_name
if new_period:
return self.env["scop.period"].with_context().create(period_values)
else:
period.write(period_values)
return period
# --------------------------------------------------
# NAF
# --------------------------------------------------
def _update_naf_from_inpi(self, inpi_data, new_period=True):
inpi_naf_id = self._get_inpi_naf_id(
inpi_data.formality.content.personneMorale.identite.entreprise.codeApe
)
period = self._get_current_period()
period_values = self._get_values_from_period(period)
if inpi_naf_id != period.naf_id:
if new_period:
period.write(
{"end": datetime.datetime.now().date(), "end_reason": "acti"}
)
period_values["start"] = fields.Date.today()
period_values["naf_id"] = inpi_naf_id
if new_period:
return self.env["scop.period"].with_context().create(period_values)
else:
period.write(period_values)
return period
# --------------------------------------------------
# ETABLISSEMENTS
# --------------------------------------------------
def _close_ets_secondaire(self, inpi_facility, facility):
# en attente reponse client
pass
def _create_ets_secondaire(self, inpi_facility: inpi_models.InpiEtablissement):
"""
creation d'un etablissement secondaire
"""
if inpi_facility.descriptionEtablissement.codeApe:
inpi_naf_id = self._get_inpi_naf_id(
inpi_facility.descriptionEtablissement.codeApe
)
elif inpi_facility.activites:
inpi_naf_id = self._get_inpi_naf_id(inpi_facility.activites[0].codeApe)
inpi_adress = self._get_inpi_address(inpi_facility.adresse)
if inpi_facility.descriptionEtablissement.enseigne:
name = inpi_facility.descriptionEtablissement.enseigne
else:
name = self.name
facility_values = {
"name": name,
"type": "facility",
"parent_id": self.id,
"is_company": True,
"siret": inpi_facility.descriptionEtablissement.siret,
"naf_id": inpi_naf_id.id,
}
facility_values.update(inpi_adress)
self.env["res.partner"].create(facility_values)
def _get_inpi_facility_from_siret(self, siret, inpi_data):
""" """
inpi_facilities = (
inpi_data.formality.content.personneMorale.autresEtablissements
)
if inpi_facilities:
for facility in inpi_facilities:
if facility.descriptionEtablissement.siret == siret:
return facility
return None
def _update_facility(self, inpi_facility, facility):
"""
mise a jours etablissement secondaire
"""
if (
inpi_facility.descriptionEtablissement.rolePourEntreprise
== inpi_models.RolePourEntreprise.ETS_SEC_FERME.value
):
self._close_ets_secondaire(inpi_facility, facility)
else:
if inpi_facility.descriptionEtablissement.codeApe:
inpi_naf_id = self._get_inpi_naf_id(
inpi_facility.descriptionEtablissement.codeApe
)
elif inpi_facility.activites:
inpi_naf_id = self._get_inpi_naf_id(inpi_facility.activites[0].codeApe)
inpi_adress = self._get_inpi_address(inpi_facility.adresse)
if inpi_facility.descriptionEtablissement.enseigne:
name = inpi_facility.descriptionEtablissement.enseigne
else:
name = self.name
facility_values = {
"name": name,
"type": "facility",
"parent_id": self.id,
"is_company": True,
"siret": inpi_facility.descriptionEtablissement.siret,
"naf_id": inpi_naf_id.id,
}
facility_values.update(inpi_adress)
facility.write(facility_values)
def _update_etablissement_from_inpi(self, inpi_data, new_period=True):
""" """
inpi_facilities = (
inpi_data.formality.content.personneMorale.autresEtablissements
)
if inpi_facilities:
facilities = self.facility_ids
# mise a jours de etablissements en base
for facility in facilities:
self._update_facility(
inpi_facility=self._get_inpi_facility_from_siret(
facility.siret, inpi_data
),
facility=facility,
)
# creation des eventuels nouveaux établissements secondaire
for inpi_facility in inpi_facilities:
role = inpi_facility.descriptionEtablissement.rolePourEntreprise
if role == inpi_models.RolePourEntreprise.ETS_SEC.value:
if not self.env["res.partner"].search(
[("siret", "=", inpi_facility.descriptionEtablissement.siret)]
):
self._create_ets_secondaire(inpi_facility)
# --------------------------------------------------
# FORME JURIDIQUE
# --------------------------------------------------
def _update_forme_juridique_from_inpi(self, inpi_data, new_period=True):
inpi_forme_juridique = inpi_data.formality.content.natureCreation.formeJuridique
pass
# --------------------------------------------------
# DIRIGEANTS
# --------------------------------------------------
def _update_dirigeant_from_inpi(self, inpi_data, new_period=True):
pass
# --------------------------------------------------
# ADRESSE
# --------------------------------------------------
def _update_address_from_inpi(self, inpi_data, new_period=True):
"""
Met a jours l adresse du siege dans la periode
"""
siege = self._get_siege(inpi_data=inpi_data)
inpi_address = self._get_inpi_address(siege.adresse)
adress_values = ["street", "cedex", "street2", "zip", "city"]
changing_values = []
period = self._get_current_period()
period_values = self._get_values_from_period(period)
for v in adress_values:
if v in period._fields and inpi_address.get(v) != getattr(period, v):
changing_values.append(v)
if changing_values:
if new_period:
period.write(
{"end": datetime.datetime.now().date(), "end_reason": "adr"}
)
period_values["start"] = fields.Date.today()
for value in changing_values:
period_values[value] = inpi_address.get(value)
if new_period:
return self.env["scop.period"].with_context().create(period_values)
else:
period.write(period_values)
return period
# --------------------------------------------------
# UPDATE
# --------------------------------------------------
def _update_all_from_inpi(self, inpi_data):
self._update_denomination_from_inpi(inpi_data=inpi_data, new_period=False)
self._update_forme_juridique_from_inpi(inpi_data=inpi_data, new_period=False)
self._update_naf_from_inpi(inpi_data=inpi_data, new_period=False)
self._update_address_from_inpi(inpi_data=inpi_data, new_period=False)
self._update_dirigeant_from_inpi(inpi_data=inpi_data, new_period=False)
self._update_etablissement_from_inpi(inpi_data=inpi_data)
period = self._get_current_period()
period.write({"end": datetime.datetime.now().date(), "end_reason": "autr"})
period_values = self._get_values_from_period(period)
self.env["scop.period"].with_context().create(period_values)
# --------------------------------------------------
# INITIALISATION SCOP
# --------------------------------------------------
def init_scop_from_inpi(self):
"""
Init scop data from INPI
"""
scop_data = {}
scop_siren = self.siren.replace(" ", "")
inpi_data = self.env["api.inpi"].get_rne_data_object(sirens=[scop_siren])
personne_morale = inpi_data.formality.content.personneMorale
inpi_social_object = personne_morale.identite.description.objet
inpi_naf_id = self._get_inpi_naf_id(
codeApe=personne_morale.identite.entreprise.codeApe
)
inpi_siret = (
personne_morale.etablissementPrincipal.descriptionEtablissement.siret
)
inpi_denomination = personne_morale.identite.entreprise.denomination
inpi_date_creation = inpi_data.formality.content.natureCreation.dateCreation
if inpi_social_object:
scop_data["social_object"] = inpi_social_object
if inpi_naf_id:
scop_data["naf_id"] = inpi_naf_id
if inpi_siret:
scop_data["siret"] = inpi_siret
if inpi_denomination:
scop_data["name"] = inpi_denomination
if inpi_date_creation:
scop_data["registration_date"] = inpi_date_creation
inpi_address = self._get_inpi_address(
personne_morale.etablissementPrincipal.adresse
)
if inpi_address.get("street"):
scop_data["street"] = inpi_address.get("street")
if inpi_address.get("cedex"):
scop_data["cedex"] = inpi_address.get("cedex")
if inpi_address.get("street2"):
scop_data["street2"] = inpi_address.get("street2")
if inpi_address.get("zip"):
scop_data["zip"] = inpi_address.get("zip")
if inpi_address.get("city"):
scop_data["city"] = inpi_address.get("city")
self.write(scop_data)
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_inpi_wizard,access_inpi_wizard,model_inpi_update_wizard,base.group_user,1,1,1,1
static/description/icon.png

15,5 ko

static/description/icon_greffe.png

11,5 ko

0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter