Doc, tools for lokavaluto development
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2878 lines
107 KiB

  1. # coding: utf-8
  2. from __future__ import unicode_literals
  3. import os
  4. import argparse
  5. import logging
  6. import sys
  7. import requests
  8. from slugify import slugify
  9. try:
  10. stringType = basestring
  11. except NameError: # Python 3, basestring causes NameError
  12. stringType = str
  13. logging.basicConfig()
  14. logger = logging.getLogger(__name__)
  15. def check_request_status(r):
  16. if r.status_code == requests.codes.ok:
  17. logger.info('OK')
  18. else:
  19. logger.error(r.text)
  20. r.raise_for_status()
  21. def get_internal_name(name):
  22. name = name.replace('', 'euro')
  23. slug = slugify(name)
  24. return slug.replace('-', '_')
  25. # Ensemble des constantes nécessaires au fonctionnement du script
  26. ENV = os.environ.get('ENV')
  27. LOCAL_CURRENCY_INTERNAL_NAME = os.environ.get('CURRENCY_SLUG')
  28. NETWORK_INTERNAL_NAME = LOCAL_CURRENCY_INTERNAL_NAME
  29. if ENV != 'prod':
  30. NETWORK_INTERNAL_NAME = ENV + LOCAL_CURRENCY_INTERNAL_NAME
  31. LOCAL_CURRENCY_SYMBOL = os.environ.get('CURRENCY_SYMBOL')
  32. SESSION_TIMEOUT = int(os.environ.get('SESSION_TIMEOUT'))
  33. MAX_LENGTH_PWD = os.environ.get('MAX_LENGTH_PWD')
  34. if ENV != 'prod':
  35. MIN_LENGTH_PWD = 4
  36. else:
  37. MIN_LENGTH_PWD = os.environ.get('MIN_LENGTH_PWD')
  38. # Ensemble des constantes nécessaires à l'API.
  39. constants_by_category = {}
  40. # Nécessaire de placer cette fonction après les variables spécifiques à chaque monnaie
  41. def add_constant(category, name, value):
  42. if category not in constants_by_category.keys():
  43. constants_by_category[category] = {}
  44. internal_name = get_internal_name(name)
  45. # Replace custom currency names by a standard "mlc" for simplification purposes in cyclos_constants.yml file attributes
  46. internal_name = internal_name.replace(NETWORK_INTERNAL_NAME,'mlc')
  47. internal_name = internal_name.replace(LOCAL_CURRENCY_INTERNAL_NAME,'mlc')
  48. internal_name = internal_name.replace(LOCAL_CURRENCY_SYMBOL,'MLC')
  49. constants_by_category[category][internal_name] = value
  50. # Arguments à fournir dans la ligne de commande
  51. parser = argparse.ArgumentParser()
  52. parser.add_argument('url', help='URL of Cyclos')
  53. parser.add_argument('authorization',
  54. help='string to use for Basic Authentication')
  55. parser.add_argument('--debug',
  56. help='enable debug messages',
  57. action='store_true')
  58. args = parser.parse_args()
  59. for k, v in vars(args).items():
  60. logger.debug('args.%s = %s', k, v)
  61. url = args.url.rstrip('/')
  62. if args.debug:
  63. logger.setLevel(logging.DEBUG)
  64. else:
  65. logger.setLevel(logging.INFO)
  66. # URLs des web services
  67. global_web_services = url + '/global/web-rpc/'
  68. network_web_services = url + '/' + NETWORK_INTERNAL_NAME + '/web-rpc/'
  69. # En-têtes pour toutes les requêtes (il n'y a qu'un en-tête, pour
  70. # l'authentification).
  71. headers = {'Authorization': 'Basic ' + args.authorization}
  72. # On fait une 1ère requête en lecture seule uniquement pour vérifier
  73. # si les paramètres fournis sont corrects.
  74. logger.info('Vérification des paramètres fournis...')
  75. r = requests.post(global_web_services + 'network/search',
  76. headers=headers, json={})
  77. check_request_status(r)
  78. networks = r.json()['result']['pageItems']
  79. for network in networks:
  80. if network['internalName'] == NETWORK_INTERNAL_NAME:
  81. logger.info(networks)
  82. raise Exception('Cyclos est déjà configuré, utilisez le fichier cyclos_constants.yml.sample '
  83. 'ou supprimez la base...')
  84. # On force une mise à jour de la license pour pouvoir créer des
  85. # utilisateurs tout de suite après la fin du paramétrage.
  86. # Sans ça Cyclos dit que la création d'utilisateurs est désactivée car
  87. # le serveur de license ne peut pas être contacté, et il faut attendre
  88. # quelques minutes (il doit donc y avoir une mise à jour automatique de
  89. # la license dans cet intervalle).
  90. logger.info('Mise à jour de la licence...')
  91. r = requests.post(global_web_services + 'license/onlineUpdate',
  92. headers=headers, json=[])
  93. check_request_status(r)
  94. logger.info('Récupération de la licence...')
  95. r = requests.get(global_web_services + 'license/getLicense', headers=headers)
  96. check_request_status(r)
  97. logger.debug('Clé de licence : %s', r.json()['result']['licenseKey'])
  98. # Récupération de la liste des canaux pour avoir leurs identifiants
  99. # sans les coder en dur (du coup je code en dur leur nom interne mais je
  100. # préfère ça).
  101. logger.info('Récupération de la liste des canaux...')
  102. r = requests.get(global_web_services + 'channels/list', headers=headers)
  103. check_request_status(r)
  104. channels = r.json()['result']
  105. for channel in channels:
  106. if channel['internalName'] == 'main':
  107. ID_CANAL_MAIN_WEB = channel['id']
  108. elif channel['internalName'] == 'webServices':
  109. ID_CANAL_WEB_SERVICES = channel['id']
  110. elif channel['internalName'] == 'pos':
  111. ID_CANAL_PAY_AT_POS = channel['id']
  112. elif channel['internalName'] == 'mobile':
  113. ID_CANAL_MOBILE_APP = channel['id']
  114. logger.debug('ID_CANAL_MAIN_WEB = %s', ID_CANAL_MAIN_WEB)
  115. logger.debug('ID_CANAL_WEB_SERVICES = %s', ID_CANAL_WEB_SERVICES)
  116. logger.debug('ID_CANAL_PAY_AT_POS = %s', ID_CANAL_PAY_AT_POS)
  117. logger.debug('ID_CANAL_MOBILE_APP = %s', ID_CANAL_MOBILE_APP)
  118. # Récupération de la liste des types de mots de passe.
  119. logger.info('Récupération de la liste des types de mots de passe...')
  120. r = requests.get(global_web_services + 'passwordType/list', headers=headers)
  121. check_request_status(r)
  122. password_types = r.json()['result']
  123. for password_type in password_types:
  124. if password_type['internalName'] == 'login':
  125. ID_PASSWORD_LOGIN = password_type['id']
  126. elif password_type['internalName'] == 'pin':
  127. ID_PASSWORD_PIN = password_type['id']
  128. logger.debug('ID_PASSWORD_LOGIN = %s', ID_PASSWORD_LOGIN)
  129. logger.debug('ID_PASSWORD_PIN = %s', ID_PASSWORD_PIN)
  130. # On charge le type de mot de passe pour le modifier :
  131. # validation des mots de passe : entre 8 et 25 caractères
  132. r = requests.get(
  133. global_web_services + 'passwordType/load/' + ID_PASSWORD_LOGIN,
  134. headers=headers
  135. )
  136. check_request_status(r)
  137. login_password_config = r.json()['result']
  138. login_password_config['blockTime'] = {
  139. 'amount': 0,
  140. 'field': 'MINUTES'
  141. }
  142. #contrainte de validation sur la taille des mots de passe
  143. login_password_config['length'] = {
  144. 'min': MIN_LENGTH_PWD,
  145. 'max': MAX_LENGTH_PWD,
  146. }
  147. login_password_config['expiresAfter'] = {
  148. 'amount': 100,
  149. 'field': 'YEARS'
  150. }
  151. r = requests.post(
  152. global_web_services + 'passwordType/save/',
  153. headers=headers,
  154. json=login_password_config
  155. )
  156. check_request_status(r)
  157. # Récupération de la liste des méthodes d'identification.
  158. logger.info("Récupération de la liste des méthodes d'identification...")
  159. r = requests.get(global_web_services + 'principalType/list', headers=headers)
  160. check_request_status(r)
  161. principal_types = r.json()['result']
  162. for principal_type in principal_types:
  163. if principal_type['internalName'] == 'username':
  164. ID_PRINCIPAL_TYPE_LOGIN_NAME = principal_type['id']
  165. logger.debug('ID_PRINCIPAL_TYPE_LOGIN_NAME = %s', ID_PRINCIPAL_TYPE_LOGIN_NAME)
  166. ########################################################################
  167. # Modification de la configuration par défaut globale :
  168. # - définition de l'URL racine, pour que l'application web fonctionne
  169. # - choix de la virgule comme séparateur pour les décimales
  170. # - dates au format jour/mois/année
  171. # - heures au format 24 heures
  172. # - activation de l'utilisation des numéros de compte
  173. # - activation du canal "Web services" par défaut pour tous les
  174. # utilisateurs
  175. #
  176. # Remarque : on configure l'accès aux web services comme étant activé
  177. # par défaut et pas comme étant imposé mais comme aucun groupe n'a la
  178. # permission "Manage my channels access", cela revient au même.
  179. #
  180. # D'abord on récupère l'id de la config par défaut.
  181. r = requests.get(global_web_services + 'configuration/getDefault',
  182. headers=headers)
  183. check_request_status(r)
  184. global_default_config_id = r.json()['result']['id']
  185. # On charge la configuration par défaut pour pouvoir la modifier.
  186. r = requests.get(
  187. global_web_services + 'configuration/load/' + global_default_config_id,
  188. headers=headers
  189. )
  190. check_request_status(r)
  191. global_default_config = r.json()['result']
  192. global_default_config['rootUrl'] = url
  193. global_default_config['numberFormat'] = 'COMMA_AS_DECIMAL'
  194. global_default_config['dateFormat'] = 'DMY_SLASH'
  195. global_default_config['timeFormat'] = 'H24'
  196. global_default_config['accountNumberConfiguration'] = {
  197. 'enabled': True
  198. }
  199. # pas de contrainte de validation sur la taille des logins
  200. global_default_config['usernameLength'] = {
  201. 'min': None,
  202. 'max': None
  203. }
  204. global_default_config['defaultEmailPrivacy'] = 'VISIBLE_TO_OTHER_USERS'
  205. # Utile notamment car l'applcation SIMM basée sur Cyclos et non Dolibarr :
  206. # peut-être qu'on voudra avoir accès à ces informations..
  207. global_default_config['addressConfiguration'] = {
  208. 'enabledAddressFields': ['ADDRESS_LINE_1','CITY']
  209. }
  210. r = requests.post(
  211. global_web_services + 'configuration/save',
  212. headers=headers,
  213. json=global_default_config
  214. )
  215. check_request_status(r)
  216. # Puis on liste les config de canaux pour retrouver l'id de la config
  217. # du canal "Web services".
  218. r = requests.get(
  219. global_web_services + 'channelConfiguration/list/' + global_default_config_id,
  220. headers=headers
  221. )
  222. check_request_status(r)
  223. for channel_config in r.json()['result']:
  224. if channel_config['channel']['internalName'] == 'webServices':
  225. ws_config_id = channel_config['id']
  226. if channel_config['channel']['internalName'] == 'main':
  227. main_config_id = channel_config['id']
  228. # Ensuite on charge la config du canal "Web services", pour pouvoir la
  229. # modifier.
  230. r = requests.get(
  231. global_web_services + 'channelConfiguration/load/' + ws_config_id,
  232. headers=headers
  233. )
  234. check_request_status(r)
  235. ws_config = r.json()['result']
  236. ws_config['userAccess'] = 'ENFORCED_ENABLED'
  237. ws_config['sessionTimeout'] = {
  238. 'amount': int(SESSION_TIMEOUT/60) + 1,
  239. 'field': 'MINUTES'
  240. }
  241. r = requests.post(
  242. global_web_services + 'channelConfiguration/save',
  243. headers=headers,
  244. json=ws_config
  245. )
  246. check_request_status(r)
  247. # Enfin, on charge la config du canal "main web", pour pouvoir la modifier : accès par défaut avec possibilité de modification.
  248. # Pourquoi ? On souhaite que les pros n'aient pas accès à Cyclos via le canal main web
  249. r = requests.get(
  250. global_web_services + 'channelConfiguration/load/' + main_config_id,
  251. headers=headers
  252. )
  253. check_request_status(r)
  254. main_config = r.json()['result']
  255. main_config['userAccess'] = 'DEFAULT_ENABLED'
  256. main_config['sessionTimeout'] = {
  257. 'amount': 5,
  258. 'field': 'MINUTES'
  259. }
  260. r = requests.post(
  261. global_web_services + 'channelConfiguration/save',
  262. headers=headers,
  263. json=main_config
  264. )
  265. check_request_status(r)
  266. ########################################################################
  267. # Création du réseau NETWORK_INTERNAL_NAME.
  268. #
  269. # C'est le seul réseau, tout le reste du paramétrage va être fait
  270. # dans ce réseau. On ne crée pas d'administrateur spécifique pour ce
  271. # réseau, on fait tout avec l'admnistrateur global.
  272. # Note : On utilise la méthode save() de l'interface CRUDService. Le
  273. # résultat de la requête est l'id de l'objet créé.
  274. #
  275. def create_network(name, internal_name):
  276. logger.info('Création du réseau "%s"...', name)
  277. r = requests.post(global_web_services + 'network/save',
  278. headers=headers,
  279. json={
  280. 'name': NETWORK_INTERNAL_NAME,
  281. 'internalName': get_internal_name(name),
  282. 'enabled': True
  283. })
  284. check_request_status(r)
  285. network_id = r.json()['result']
  286. logger.debug('network_id = %s', network_id)
  287. return network_id
  288. ID_RESEAU = create_network(
  289. name=NETWORK_INTERNAL_NAME,
  290. internal_name=NETWORK_INTERNAL_NAME,
  291. )
  292. ########################################################################
  293. # Création des devises "MLC" et "Euro".
  294. #
  295. def create_currency(name, symbol):
  296. logger.info('Création de la devise "%s"...', name)
  297. r = requests.post(network_web_services + 'currency/save',
  298. headers=headers,
  299. json={
  300. 'name': name,
  301. 'internalName': get_internal_name(name),
  302. 'symbol': symbol,
  303. 'suffix': ' ' + symbol,
  304. 'precision': 2
  305. })
  306. check_request_status(r)
  307. currency_id = r.json()['result']
  308. logger.debug('currency_id = %s', currency_id)
  309. add_constant('currencies', name, currency_id)
  310. return currency_id
  311. ID_DEVISE_LOCAL_CURRENCY = create_currency(
  312. name=LOCAL_CURRENCY_INTERNAL_NAME,
  313. symbol=LOCAL_CURRENCY_SYMBOL,
  314. )
  315. ID_DEVISE_EURO = create_currency(
  316. name='Euro',
  317. symbol='',
  318. )
  319. ########################################################################
  320. # Création du token "Carte NFC".
  321. #
  322. def create_token(name, plural_name,token_type, token_mask, maximum_per_user):
  323. logger.info('Création du token "%s"...', name)
  324. r = requests.post(network_web_services + 'principalType/save',
  325. headers=headers,
  326. json={
  327. 'class': 'org.cyclos.model.access.principaltypes.TokenPrincipalTypeDTO',
  328. 'name': name,
  329. 'pluralName': plural_name,
  330. 'internalName': get_internal_name(name),
  331. 'tokenType': token_type,
  332. 'tokenMask': token_mask,
  333. 'maximumPerUser': maximum_per_user,
  334. })
  335. check_request_status(r)
  336. token_id = r.json()['result']
  337. logger.debug('token_id = %s', token_id)
  338. add_constant('tokens', name, token_id)
  339. return token_id
  340. ID_TOKEN_CARTE_NFC = create_token(
  341. name='Carte NFC',
  342. plural_name='Cartes NFC',
  343. token_type='NFC_TAG',
  344. token_mask='#### #### #### ####',
  345. maximum_per_user=100,
  346. )
  347. all_token_types = [
  348. ID_TOKEN_CARTE_NFC,
  349. ]
  350. ########################################################################
  351. # Création des accès clients
  352. # Création du client "Point de vente NFC".
  353. #
  354. def create_access_client(name, plural_name, maximum_per_user, permission):
  355. logger.info('Création du client "%s"...', name)
  356. r = requests.post(network_web_services + 'principalType/save',
  357. headers=headers,
  358. json={
  359. 'class': 'org.cyclos.model.access.principaltypes.AccessClientPrincipalTypeDTO',
  360. 'name': name,
  361. 'pluralName': plural_name,
  362. 'internalName': get_internal_name(name),
  363. 'maximumPerUser': maximum_per_user,
  364. 'permission': permission,
  365. })
  366. check_request_status(r)
  367. access_client_id = r.json()['result']
  368. logger.debug('access_client_id = %s', access_client_id)
  369. add_constant('access_clients', name, access_client_id)
  370. return access_client_id
  371. ID_CLIENT_POINT_DE_VENTE_NFC = create_access_client(
  372. name='Point de vente NFC',
  373. plural_name='Points de vente NFC',
  374. maximum_per_user=10,
  375. permission='RECEIVE_PAYMENT',
  376. )
  377. #@WARNING : utile uniquement pour le Cairn dans le cadre du paiement SMS
  378. ID_CLIENT_SMS = create_access_client(
  379. name='Client SMS',
  380. plural_name='Clients SMS',
  381. maximum_per_user=1,
  382. permission='RECEIVE_AND_MAKE_PAYMENT',
  383. )
  384. #@WARNING : utile uniquement pour le Cairn afin d'authentifier chaque utilisateur via l'app CEL
  385. ID_CLIENT_MAIN = create_access_client(
  386. name='main',
  387. plural_name='mains',
  388. maximum_per_user=1,
  389. permission='ALL',
  390. )
  391. all_access_clients = [
  392. ID_CLIENT_POINT_DE_VENTE_NFC,
  393. ID_CLIENT_SMS,
  394. ID_CLIENT_MAIN
  395. ]
  396. #########################################################################
  397. # Modification de la configuration des canaux "Pay at POS", "Mobile
  398. # app" et "web services"
  399. # La configuration par défaut pour chaque canal est héritée de la
  400. # configuration globale. Pour personnaliser cette configuration au
  401. # niveau du réseau MLC, il faut créer une nouvelle configuration
  402. # pour chaque canal.
  403. # Ensuite on personnalise les configurations de la manière suivante :
  404. # - activation de chaque canal par défaut pour tous les utilisateurs
  405. # - canal "Pay at POS" : le mot de passe de confirmation est le code PIN
  406. # - canal "Mobile app" : on définit deux méthodes d'identification pour
  407. # se connecter à l'application mobile :
  408. # - le login, pour les connexions "normales"
  409. # - le client "Point de vente NFC", pour pouvoir se connecter à
  410. # l'application mobile en mode point de vente (POS)
  411. # et on définit le token "Carte NFC" comme méthode d'identification
  412. # pour recevoir des paiements en mode POS.
  413. #
  414. # Remarque : Il faut faire ces modifications après avoir créé le token
  415. # "Carte NFC" et l'access client "Point de vente NFC" car nous en avons
  416. # besoin pour configurer le canal "Mobile app".
  417. # - canal "web services" : on définit deux méthodes d'identification pour
  418. # se connecter :
  419. # - le login, pour les connexions "normales" via le site wen
  420. # - le client "Main", pour pouvoir se connecter à
  421. # cyclos en web services
  422. # - le client "SMS" pour réaliser des paiement lors d'un paiement par SMS
  423. #
  424. # Remarque : Il faut faire ces modifications après avoir créé
  425. # les access client car nous en avons
  426. # besoin pour configurer le canal "web services".
  427. #
  428. def get_data_for_new_channel_configuration(channel, configuration):
  429. logger.debug("get_data_for_new_channel_configuration(%s, %s)", channel, configuration)
  430. r = requests.post(network_web_services + 'channelConfiguration/getDataForNew/',
  431. headers=headers,
  432. json={
  433. 'channel': channel,
  434. 'configuration': configuration,
  435. })
  436. check_request_status(r)
  437. return r.json()['result']['dto']
  438. # D'abord on récupère l'id de la config par défaut.
  439. logger.info('Récupération de l\'id de la configuration par défaut...')
  440. r = requests.get(network_web_services + 'configuration/getDefault',
  441. headers=headers)
  442. check_request_status(r)
  443. mlc_default_config_id = r.json()['result']['id']
  444. # Puis on crée une nouvelle configuration pour le canal "Pay at POS".
  445. logger.info('Création d\'une nouvelle configuration pour le canal "Pay at POS"...')
  446. new_pos_config = get_data_for_new_channel_configuration(
  447. channel=ID_CANAL_PAY_AT_POS,
  448. configuration=mlc_default_config_id)
  449. new_pos_config['defined'] = True
  450. new_pos_config['enabled'] = True
  451. new_pos_config['userAccess'] = 'DEFAULT_ENABLED'
  452. new_pos_config['confirmationPassword'] = ID_PASSWORD_PIN
  453. logger.info('Sauvegarde de la nouvelle configuration de canal...')
  454. r = requests.post(
  455. network_web_services + 'channelConfiguration/save',
  456. headers=headers,
  457. json=new_pos_config
  458. )
  459. check_request_status(r)
  460. # De le même manière, on crée une nouvelle configuration pour le canal
  461. # "Mobile app".
  462. logger.info('Création d\'une nouvelle configuration pour le canal "Mobile app"...')
  463. new_mobile_app_config = get_data_for_new_channel_configuration(
  464. channel=ID_CANAL_MOBILE_APP,
  465. configuration=mlc_default_config_id)
  466. new_mobile_app_config['defined'] = True
  467. new_mobile_app_config['enabled'] = True
  468. new_mobile_app_config['userAccess'] = 'DEFAULT_ENABLED'
  469. new_mobile_app_config['principalTypes'] = [
  470. ID_PRINCIPAL_TYPE_LOGIN_NAME,
  471. ID_CLIENT_POINT_DE_VENTE_NFC,
  472. ]
  473. new_mobile_app_config['receivePaymentPrincipalTypes'] = [
  474. ID_TOKEN_CARTE_NFC,
  475. ]
  476. logger.info('Sauvegarde de la nouvelle configuration de canal...')
  477. r = requests.post(
  478. network_web_services + 'channelConfiguration/save',
  479. headers=headers,
  480. json=new_mobile_app_config
  481. )
  482. check_request_status(r)
  483. # De le même manière, on crée une nouvelle configuration pour le canal
  484. # "services web".
  485. logger.info('Création d\'une nouvelle configuration pour le canal "Web services"...')
  486. new_ws_config = get_data_for_new_channel_configuration(
  487. channel=ID_CANAL_WEB_SERVICES,
  488. configuration=mlc_default_config_id)
  489. new_ws_config['defined'] = True
  490. new_ws_config['enabled'] = True
  491. new_ws_config['userAccess'] = 'ENFORCED_ENABLED'
  492. new_ws_config['principalTypes'] = [
  493. ID_PRINCIPAL_TYPE_LOGIN_NAME,
  494. ID_CLIENT_MAIN,
  495. ID_CLIENT_SMS
  496. ]
  497. logger.info('Sauvegarde de la nouvelle configuration de canal...')
  498. r = requests.post(
  499. network_web_services + 'channelConfiguration/save',
  500. headers=headers,
  501. json=new_ws_config
  502. )
  503. check_request_status(r)
  504. ########################################################################
  505. # Création d'une configuration spécifique pour les groupes "Opérateurs
  506. # BDC" et "Gestion interne".
  507. #
  508. # Par défaut le délai de validité des sessions via les services web est
  509. # de 5 minutes. Ce délai est trop court et rend l'utilisation des
  510. # applications BDC et Gestion Interne pénible.
  511. # On crée donc une nouvelle configuration identique à celle par défaut
  512. # mais dans laquelle les sessions créées vis les services web sont
  513. # valables 2h.
  514. #
  515. def get_data_for_new_configuration(parent_configuration):
  516. logger.debug("get_data_for_new_configuration(%s)", parent_configuration)
  517. r = requests.post(network_web_services + 'configuration/getDataForNew/',
  518. headers=headers,
  519. json=[parent_configuration])
  520. check_request_status(r)
  521. return r.json()['result']['dto']
  522. # D'abord on crée une nouvelle configuration qui hérite de la config par
  523. # défaut.
  524. logger.info("Création d'une nouvelle configuration pour les opérateurs BDC...")
  525. operateur_bdc_config = get_data_for_new_configuration(mlc_default_config_id)
  526. operateur_bdc_config['name'] = 'Opérateurs BDC'
  527. logger.info('Sauvegarde de la nouvelle configuration...')
  528. r = requests.post(
  529. network_web_services + 'configuration/save',
  530. headers=headers,
  531. json=operateur_bdc_config
  532. )
  533. check_request_status(r)
  534. ID_CONFIG_OPERATEURS_BDC = r.json()['result']
  535. # Puis on crée une nouvelle configuration pour le canal "Web services".
  536. logger.info('Création d\'une nouvelle configuration pour le canal "Web services"...')
  537. operateur_bdc_ws_config = get_data_for_new_channel_configuration(
  538. channel=ID_CANAL_WEB_SERVICES,
  539. configuration=ID_CONFIG_OPERATEURS_BDC)
  540. operateur_bdc_ws_config['defined'] = True
  541. operateur_bdc_ws_config['sessionTimeout']['amount'] = 2
  542. operateur_bdc_ws_config['sessionTimeout']['field'] = 'HOURS'
  543. logger.info('Sauvegarde de la nouvelle configuration de canal...')
  544. r = requests.post(
  545. network_web_services + 'channelConfiguration/save',
  546. headers=headers,
  547. json=operateur_bdc_ws_config
  548. )
  549. check_request_status(r)
  550. # On fait la même chose pour Gestion interne.
  551. logger.info("Création d'une nouvelle configuration pour Gestion interne...")
  552. gestion_interne = get_data_for_new_configuration(mlc_default_config_id)
  553. gestion_interne['name'] = 'Gestion interne'
  554. logger.info('Sauvegarde de la nouvelle configuration...')
  555. r = requests.post(
  556. network_web_services + 'configuration/save',
  557. headers=headers,
  558. json=gestion_interne
  559. )
  560. check_request_status(r)
  561. ID_CONFIG_GESTION_INTERNE = r.json()['result']
  562. logger.info('Création d\'une nouvelle configuration pour le canal "Web services"...')
  563. gestion_interne_ws_config = get_data_for_new_channel_configuration(
  564. channel=ID_CANAL_WEB_SERVICES,
  565. configuration=ID_CONFIG_GESTION_INTERNE)
  566. gestion_interne_ws_config['defined'] = True
  567. gestion_interne_ws_config['sessionTimeout']['amount'] = 2
  568. gestion_interne_ws_config['sessionTimeout']['field'] = 'HOURS'
  569. logger.info('Sauvegarde de la nouvelle configuration de canal...')
  570. r = requests.post(
  571. network_web_services + 'channelConfiguration/save',
  572. headers=headers,
  573. json=gestion_interne_ws_config
  574. )
  575. check_request_status(r)
  576. ########################################################################
  577. # Création des champs personnalisés pour les paiements.
  578. #
  579. # Note: On a besoin de la liste des champs personnalisés pour créer les
  580. # types de compte puis les types de paiement, c'est pour cette raison
  581. # qu'ils sont créés en premier.
  582. def create_transaction_custom_field_linked_user(name, required=True):
  583. logger.info('Création du champ personnalisé "%s"...', name)
  584. r = requests.post(network_web_services + 'transactionCustomField/save',
  585. headers=headers,
  586. json={
  587. 'name': name,
  588. 'internalName': get_internal_name(name),
  589. 'type': 'LINKED_ENTITY',
  590. 'linkedEntityType': 'USER',
  591. 'control': 'ENTITY_SELECTION',
  592. 'required': required
  593. })
  594. check_request_status(r)
  595. custom_field_id = r.json()['result']
  596. logger.debug('custom_field_id = %s', custom_field_id)
  597. add_constant('transaction_custom_fields', name, custom_field_id)
  598. return custom_field_id
  599. def create_transaction_custom_field_single_selection(name,
  600. possible_values_name,
  601. possible_values,
  602. required=True):
  603. logger.info('Création du champ personnalisé "%s"...', name)
  604. r = requests.post(network_web_services + 'transactionCustomField/save',
  605. headers=headers,
  606. json={
  607. 'name': name,
  608. 'internalName': get_internal_name(name),
  609. 'type': 'SINGLE_SELECTION',
  610. 'control': 'SINGLE_SELECTION',
  611. 'required': required
  612. })
  613. check_request_status(r)
  614. custom_field_id = r.json()['result']
  615. logger.debug('custom_field_id = %s', custom_field_id)
  616. add_constant('transaction_custom_fields', name, custom_field_id)
  617. for value in possible_values:
  618. logger.info('Ajout de la valeur possible "%s"...', value)
  619. r = requests.post(network_web_services + 'transactionCustomFieldPossibleValue/save',
  620. headers=headers,
  621. json={
  622. 'field': custom_field_id,
  623. 'value': value
  624. })
  625. check_request_status(r)
  626. possible_value_id = r.json()['result']
  627. add_constant(possible_values_name, value, possible_value_id)
  628. return custom_field_id
  629. def create_transaction_custom_field_text(name, unique=False,
  630. required=True):
  631. logger.info('Création du champ personnalisé "%s"...', name)
  632. r = requests.post(network_web_services + 'transactionCustomField/save',
  633. headers=headers,
  634. json={
  635. 'name': name,
  636. 'internalName': get_internal_name(name),
  637. 'type': 'STRING',
  638. 'size': 'LARGE',
  639. 'control': 'TEXT',
  640. 'unique': unique,
  641. 'required': required
  642. })
  643. check_request_status(r)
  644. custom_field_id = r.json()['result']
  645. logger.debug('custom_field_id = %s', custom_field_id)
  646. add_constant('transaction_custom_fields', name, custom_field_id)
  647. return custom_field_id
  648. def create_transaction_custom_field_decimal(name, required=True):
  649. logger.info('Création du champ personnalisé "%s"...', name)
  650. r = requests.post(network_web_services + 'transactionCustomField/save',
  651. headers=headers,
  652. json={
  653. 'name': name,
  654. 'internalName': get_internal_name(name),
  655. 'type': 'DECIMAL',
  656. 'decimalDigits': 2,
  657. 'control': 'TEXT',
  658. 'required': required
  659. })
  660. check_request_status(r)
  661. custom_field_id = r.json()['result']
  662. logger.debug('custom_field_id = %s', custom_field_id)
  663. add_constant('transaction_custom_fields', name, custom_field_id)
  664. return custom_field_id
  665. def add_custom_field_to_transfer_type(transfer_type_id, custom_field_id):
  666. logger.info("Ajout d'un champ personnalisé...")
  667. r = requests.post(network_web_services + 'transactionCustomField/addRelation',
  668. headers=headers,
  669. json=[transfer_type_id, custom_field_id])
  670. check_request_status(r)
  671. ID_CHAMP_PERSO_PAIEMENT_BDC = create_transaction_custom_field_linked_user(
  672. name='BDC',
  673. )
  674. ID_CHAMP_PERSO_PAIEMENT_PORTEUR = create_transaction_custom_field_linked_user(
  675. name='Porteur',
  676. )
  677. ID_CHAMP_PERSO_PAIEMENT_ADHERENT = create_transaction_custom_field_linked_user(
  678. name='Adhérent',
  679. )
  680. ID_CHAMP_PERSO_PAIEMENT_ADHERENT_FACULTATIF = create_transaction_custom_field_linked_user(
  681. name='Adhérent (facultatif)',
  682. required=False,
  683. )
  684. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT = create_transaction_custom_field_single_selection(
  685. name='Mode de paiement',
  686. possible_values_name='payment_modes',
  687. possible_values=[
  688. 'Chèque',
  689. 'Espèces',
  690. 'Paiement en ligne',
  691. 'Prélèvement',
  692. 'Virement',
  693. ],
  694. )
  695. ID_CHAMP_PERSO_PAIEMENT_PRODUIT = create_transaction_custom_field_single_selection(
  696. name='Produit',
  697. possible_values_name='products',
  698. possible_values=[
  699. 'Foulard',
  700. ],
  701. )
  702. ID_CHAMP_PERSO_PAIEMENT_NUMERO_BORDEREAU = create_transaction_custom_field_text(
  703. name='Numéro de bordereau',
  704. required=False,
  705. )
  706. ID_CHAMP_PERSO_PAIEMENT_MONTANT_COTISATIONS = create_transaction_custom_field_decimal(
  707. name='Montant Cotisations',
  708. )
  709. ID_CHAMP_PERSO_PAIEMENT_MONTANT_VENTES = create_transaction_custom_field_decimal(
  710. name='Montant Ventes',
  711. )
  712. ID_CHAMP_PERSO_PAIEMENT_MONTANT_CHANGES_BILLET = create_transaction_custom_field_decimal(
  713. name='Montant Changes billet',
  714. )
  715. ID_CHAMP_PERSO_PAIEMENT_MONTANT_CHANGES_NUMERIQUE = create_transaction_custom_field_decimal(
  716. name='Montant Changes numérique',
  717. )
  718. ID_CHAMP_PERSO_PAIEMENT_NUMERO_TRANSACTION_BANQUE = create_transaction_custom_field_text(
  719. name='Numéro de transaction banque',
  720. )
  721. ID_CHAMP_PERSO_PAIEMENT_NUMERO_FACTURE = create_transaction_custom_field_text(
  722. name='Numéro de facture',
  723. unique=True,
  724. )
  725. all_transaction_fields = [
  726. ID_CHAMP_PERSO_PAIEMENT_BDC,
  727. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  728. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  729. ID_CHAMP_PERSO_PAIEMENT_ADHERENT_FACULTATIF,
  730. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT,
  731. ID_CHAMP_PERSO_PAIEMENT_PRODUIT,
  732. ID_CHAMP_PERSO_PAIEMENT_NUMERO_BORDEREAU,
  733. ID_CHAMP_PERSO_PAIEMENT_MONTANT_COTISATIONS,
  734. ID_CHAMP_PERSO_PAIEMENT_MONTANT_VENTES,
  735. ID_CHAMP_PERSO_PAIEMENT_MONTANT_CHANGES_BILLET,
  736. ID_CHAMP_PERSO_PAIEMENT_MONTANT_CHANGES_NUMERIQUE,
  737. ID_CHAMP_PERSO_PAIEMENT_NUMERO_TRANSACTION_BANQUE,
  738. ID_CHAMP_PERSO_PAIEMENT_NUMERO_FACTURE,
  739. ]
  740. ########################################################################
  741. # Création des types de comptes.
  742. #
  743. # Note : La méthode save() de l'interface AccountTypeService prend en
  744. # paramètre un objet de type AccountTypeDTO. AccountTypeDTO a deux
  745. # sous-classes, SystemAccountTypeDTO et UserAccountTypeDTO. Lorsque l'on
  746. # appelle la méthode save(), il faut passer en paramètre un objet du
  747. # type adéquat (selon que l'on crée un compte système ou un compte
  748. # utilisateur) et il faut indiquer explicitement quelle est la classe de
  749. # l'objet passé en paramètre, sinon on se prend l'erreur suivante :
  750. # java.lang.IllegalStateException: Could not instantiate bean of class
  751. # org.cyclos.entities.banking.AccountType.
  752. #
  753. # Note: 'customFieldsForList' définit la liste des champs personnalisés
  754. # visibles dans l'historique du compte. On ne fait pas dans le détail et
  755. # et on donne la liste de tous les champs à chaque fois. Le résultat
  756. # n'est pas terrible dans l'application web mais ce n'est pas grave.
  757. def create_system_account_type(name, currency_id, limit_type):
  758. logger.info('Création du type de compte système "%s"...', name)
  759. params = {
  760. 'class': 'org.cyclos.model.banking.accounttypes.SystemAccountTypeDTO',
  761. 'name': name,
  762. 'internalName': get_internal_name(name),
  763. 'currency': currency_id,
  764. 'limitType': limit_type,
  765. 'customFieldsForList': all_transaction_fields,
  766. }
  767. if limit_type == 'LIMITED':
  768. params['creditLimit'] = 0
  769. r = requests.post(network_web_services + 'accountType/save',
  770. headers=headers, json=params)
  771. check_request_status(r)
  772. account_type_id = r.json()['result']
  773. logger.debug('account_type_id = %s', account_type_id)
  774. add_constant('account_types', name, account_type_id)
  775. return account_type_id
  776. def create_user_account_type(name, currency_id):
  777. logger.info('Création du type de compte utilisateur "%s"...', name)
  778. params = {
  779. 'class': 'org.cyclos.model.banking.accounttypes.UserAccountTypeDTO',
  780. 'name': name,
  781. 'internalName': get_internal_name(name),
  782. 'currency': currency_id,
  783. 'customFieldsForList': all_transaction_fields,
  784. }
  785. r = requests.post(network_web_services + 'accountType/save',
  786. headers=headers, json=params)
  787. check_request_status(r)
  788. account_type_id = r.json()['result']
  789. logger.debug('account_type_id = %s', account_type_id)
  790. add_constant('account_types', name, account_type_id)
  791. return account_type_id
  792. # Comptes système pour l'mlc billet
  793. ID_COMPTE_DE_DEBIT_CURRENCY_BILLET = create_system_account_type(
  794. name='Compte de débit ' + LOCAL_CURRENCY_INTERNAL_NAME + ' billet',
  795. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  796. limit_type='UNLIMITED',
  797. )
  798. ID_STOCK_DE_BILLETS = create_system_account_type(
  799. name='Stock de billets',
  800. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  801. limit_type='LIMITED',
  802. )
  803. ID_COMPTE_DE_TRANSIT = create_system_account_type(
  804. name='Compte de transit',
  805. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  806. limit_type='LIMITED',
  807. )
  808. ID_COMPTE_DES_BILLETS_EN_CIRCULATION = create_system_account_type(
  809. name='Compte des billets en circulation',
  810. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  811. limit_type='LIMITED',
  812. )
  813. ID_COMPTE_DE_DEBIT_EURO = create_system_account_type(
  814. name='Compte de débit €',
  815. currency_id=ID_DEVISE_EURO,
  816. limit_type='UNLIMITED',
  817. )
  818. # Comptes des bureaux de change :
  819. # - Stock de billets : stock d'mlc disponible pour le change (mlc
  820. # billet) et les retraits (mlc numérique)
  821. # - Caisse € : € encaissés pour les changes, cotisations et ventes
  822. # - Caisse mlc : mlc encaissés pour les cotisations et ventes
  823. # - Retours d'mlc : mlc retournés par les prestataires pour les
  824. # reconvertir en € ou les déposer sur leur compte
  825. ID_STOCK_DE_BILLETS_BDC = create_user_account_type(
  826. name='Stock de billets BDC',
  827. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  828. )
  829. ID_CAISSE_EURO_BDC = create_user_account_type(
  830. name='Caisse € BDC',
  831. currency_id=ID_DEVISE_EURO,
  832. )
  833. ID_CAISSE_CURRENCY_BDC = create_user_account_type(
  834. name='Caisse '+ LOCAL_CURRENCY_INTERNAL_NAME +' BDC',
  835. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  836. )
  837. ID_RETOURS_CURRENCY_BDC = create_user_account_type(
  838. name="Retours d'" + LOCAL_CURRENCY_INTERNAL_NAME + " BDC",
  839. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  840. )
  841. # Comptes utilisateur pour la gestion interne des €
  842. # - pour le Crédit Agricole et La Banque Postale
  843. # - pour les 2 comptes dédiés (mlc billet et mlc numérique)
  844. ID_BANQUE_DE_DEPOT = create_user_account_type(
  845. name='Banque de dépôt',
  846. currency_id=ID_DEVISE_EURO,
  847. )
  848. ID_COMPTE_DEDIE = create_user_account_type(
  849. name='Compte dédié',
  850. currency_id=ID_DEVISE_EURO,
  851. )
  852. # Comptes pour la monnaie locale numérique
  853. ID_COFFRE_MLC_NUMERIQUE = create_system_account_type(
  854. name='Compte de credit coffre numerique',
  855. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  856. limit_type='UNLIMITED',
  857. )
  858. ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE = create_system_account_type(
  859. name='Compte de débit ' + LOCAL_CURRENCY_INTERNAL_NAME + ' numérique',
  860. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  861. limit_type='UNLIMITED',
  862. )
  863. ID_COMPTE_ADHERENT = create_user_account_type(
  864. name="Compte d'adhérent",
  865. currency_id=ID_DEVISE_LOCAL_CURRENCY,
  866. )
  867. all_system_accounts = [
  868. ID_COMPTE_DE_DEBIT_CURRENCY_BILLET,
  869. ID_STOCK_DE_BILLETS,
  870. ID_COMPTE_DE_TRANSIT,
  871. ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  872. ID_COMPTE_DE_DEBIT_EURO,
  873. ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  874. ID_COFFRE_MLC_NUMERIQUE
  875. ]
  876. all_user_accounts = [
  877. ID_STOCK_DE_BILLETS_BDC,
  878. ID_CAISSE_EURO_BDC,
  879. ID_CAISSE_CURRENCY_BDC,
  880. ID_RETOURS_CURRENCY_BDC,
  881. ID_BANQUE_DE_DEPOT,
  882. ID_COMPTE_DEDIE,
  883. ID_COMPTE_ADHERENT,
  884. ]
  885. ########################################################################
  886. # Création des "status flow" pour les paiements.
  887. #
  888. def create_transfer_status_flow(name):
  889. logger.info('Création du "status flow" "%s"...', name)
  890. r = requests.post(network_web_services + 'transferStatusFlow/save',
  891. headers=headers,
  892. json={
  893. 'name': name,
  894. 'internalName': get_internal_name(name),
  895. })
  896. check_request_status(r)
  897. status_flow_id = r.json()['result']
  898. logger.debug('status_flow_id = %s', status_flow_id)
  899. add_constant('transfer_status_flows', name, status_flow_id)
  900. return status_flow_id
  901. def create_transfer_status(name, status_flow, possible_next=None):
  902. logger.info('Création du statut "%s"...', name)
  903. status = {
  904. 'name': name,
  905. 'internalName': get_internal_name(name),
  906. 'flow': status_flow,
  907. }
  908. if possible_next:
  909. status['possibleNext'] = possible_next
  910. r = requests.post(network_web_services + 'transferStatus/save',
  911. headers=headers,
  912. json=status)
  913. check_request_status(r)
  914. status_id = r.json()['result']
  915. logger.debug('status_id = %s', status_id)
  916. add_constant('transfer_statuses', name, status_id)
  917. return status_id
  918. # Rapprochement : pour toutes les opérations pour lesquelles on
  919. # souhaite faire des rapprochements.
  920. ID_STATUS_FLOW_RAPPROCHEMENT = create_transfer_status_flow(
  921. name='Rapprochement',
  922. )
  923. ID_STATUS_RAPPROCHE = create_transfer_status(
  924. name='Rapproché',
  925. status_flow=ID_STATUS_FLOW_RAPPROCHEMENT,
  926. )
  927. ID_STATUS_A_RAPPROCHER = create_transfer_status(
  928. name='A rapprocher',
  929. status_flow=ID_STATUS_FLOW_RAPPROCHEMENT,
  930. possible_next=ID_STATUS_RAPPROCHE,
  931. )
  932. # Remise à Euskal Moneta : pour tous les paiements qui créditent les
  933. # caisses €, mlc et retours d'mlc des bureaux de change.
  934. ID_STATUS_FLOW_REMISE_A_ASSO = create_transfer_status_flow(
  935. name="Remise à l'Assocation",
  936. )
  937. ID_STATUS_REMIS = create_transfer_status(
  938. name="Remis à l'Assocation",
  939. status_flow=ID_STATUS_FLOW_REMISE_A_ASSO,
  940. )
  941. ID_STATUS_A_REMETTRE = create_transfer_status(
  942. name="A remettre à l'Assocation",
  943. status_flow=ID_STATUS_FLOW_REMISE_A_ASSO,
  944. possible_next=ID_STATUS_REMIS,
  945. )
  946. # Virements : pour les reconversions d'mlc en € (virement à faire au
  947. # prestataire qui a reconverti) et pour les dépôts en banque (virements
  948. # à faire vers les comptes dédiés).
  949. ID_STATUS_FLOW_VIREMENTS = create_transfer_status_flow(
  950. name='Virements',
  951. )
  952. ID_STATUS_VIREMENTS_FAITS = create_transfer_status(
  953. name='Virements faits',
  954. status_flow=ID_STATUS_FLOW_VIREMENTS,
  955. )
  956. ID_STATUS_VIREMENTS_A_FAIRE = create_transfer_status(
  957. name='Virements à faire',
  958. status_flow=ID_STATUS_FLOW_VIREMENTS,
  959. possible_next=ID_STATUS_VIREMENTS_FAITS,
  960. )
  961. all_status_flows = [
  962. ID_STATUS_FLOW_RAPPROCHEMENT,
  963. ID_STATUS_FLOW_REMISE_A_ASSO,
  964. ID_STATUS_FLOW_VIREMENTS,
  965. ]
  966. ########################################################################
  967. # Création des types de paiement.
  968. #
  969. # Le paramètre "direction" n'est pas nécessaire pour les types de
  970. # paiement SYSTEM_TO_SYSTEM, SYSTEM_TO_USER et USER_TO_SYSTEM, car dans
  971. # ces cas-là, les types de compte d'origine et de destination permettent
  972. # de déduire la direction. Par contre, ce paramètre est requis pour les
  973. # types de paiement de compte utilisateur à compte utilisateur car il
  974. # peut alors prendre la valeur USER_TO_SELF ou USER_TO_USER et cela doit
  975. # être défini explicitement.
  976. # Du coup, je l'ai rendu toujours obligatoire. C'est discutable mais
  977. # définir systématiquement la direction de manière explicite est
  978. # intéressant car cela sert de documentation.
  979. #
  980. # On définit un "maxChargebackTime" de 2 mois, ce qui veut dire que le
  981. # délai maximum pour rejeter un paiment est de 2 mois.
  982. # Note : les paiements pourront être rejetés par les administrateurs du
  983. # groupe "Gestion interne" (voir le paramétrage des permissions).
  984. #
  985. # Par souci de simplicité, tous les types de paiement sont accessibles
  986. # par les 2 canaux "Main web" et "Web services". Ainsi tous les types
  987. # de paiement seront accessibles par l'interface web de Cyclos pour les
  988. # administrateurs du groupe "Gestion interne" (voir le paramétrage des
  989. # permissions), ce qui garantit une capacité à intervenir si nécessaire.
  990. # D'autre part, ils peuvent tous être utilisés par l'API Eusko (ce n'est
  991. # pas forcément nécessaire mais c'est possible, il n'y aura pas de
  992. # question à se poser.
  993. #
  994. def create_payment_transfer_type(name, direction, from_account_type_id,
  995. to_account_type_id, custom_fields=[],
  996. status_flows=[], initial_statuses=[],
  997. channels=[ID_CANAL_MAIN_WEB, ID_CANAL_WEB_SERVICES],
  998. principal_types=[],
  999. allows_recurring_payments=False,
  1000. allows_scheduled_payments=False,
  1001. description_availability="OPTIONAL"):
  1002. logger.info('Création du type de paiement "%s"...', name)
  1003. r = requests.post(network_web_services + 'transferType/save',
  1004. headers=headers,
  1005. json={
  1006. 'class': 'org.cyclos.model.banking.transfertypes.PaymentTransferTypeDTO',
  1007. 'name': name,
  1008. 'internalName': get_internal_name(name),
  1009. 'direction': direction,
  1010. 'from': from_account_type_id,
  1011. 'to': to_account_type_id,
  1012. 'enabled': True,
  1013. 'statusFlows': status_flows,
  1014. 'initialStatuses': initial_statuses,
  1015. 'maxChargebackTime': {'amount': '2', 'field': 'MONTHS'},
  1016. 'channels': channels,
  1017. 'principalTypes': principal_types,
  1018. 'allowsRecurringPayments': allows_recurring_payments,
  1019. 'allowsScheduledPayments': allows_scheduled_payments,
  1020. 'maxInstallments': 1,
  1021. 'descriptionAvailability': description_availability
  1022. })
  1023. check_request_status(r)
  1024. payment_transfer_type_id = r.json()['result']
  1025. logger.debug('payment_transfer_type_id = %s', payment_transfer_type_id)
  1026. add_constant('payment_types', name, payment_transfer_type_id)
  1027. for custom_field_id in custom_fields:
  1028. add_custom_field_to_transfer_type(
  1029. transfer_type_id=payment_transfer_type_id,
  1030. custom_field_id=custom_field_id,
  1031. )
  1032. return payment_transfer_type_id
  1033. def create_generated_transfer_type(name, direction, from_account_type_id,
  1034. to_account_type_id,
  1035. description_availability="OPTIONAL"):
  1036. logger.info('Création du type de paiement "%s"...', name)
  1037. r = requests.post(network_web_services + 'transferType/save',
  1038. headers=headers,
  1039. json={
  1040. 'class': 'org.cyclos.model.banking.transfertypes.GeneratedTransferTypeDTO',
  1041. 'name': name,
  1042. 'internalName': get_internal_name(name),
  1043. 'direction': direction,
  1044. 'from': from_account_type_id,
  1045. 'to': to_account_type_id,
  1046. 'descriptionAvailability': description_availability
  1047. })
  1048. check_request_status(r)
  1049. generated_transfer_type_id = r.json()['result']
  1050. logger.debug('generated_transfer_type_id = %s', generated_transfer_type_id)
  1051. return generated_transfer_type_id
  1052. def create_transfer_fee(name, original_transfer_type, generated_transfer_type,
  1053. other_currency, payer, receiver, charge_mode, amount):
  1054. logger.info('Création des frais de transfert "%s"...', name)
  1055. r = requests.post(network_web_services + 'transferFee/save',
  1056. headers=headers,
  1057. json={
  1058. 'name': name,
  1059. 'internalName': get_internal_name(name),
  1060. 'enabled': True,
  1061. 'originalTransferType': original_transfer_type,
  1062. 'generatedTransferType': generated_transfer_type,
  1063. 'otherCurrency': other_currency,
  1064. 'payer': payer,
  1065. 'receiver': receiver,
  1066. 'chargeMode': charge_mode,
  1067. 'amount': amount,
  1068. })
  1069. check_request_status(r)
  1070. transfer_fee_id = r.json()['result']
  1071. logger.debug('transfer_fee_id = %s', transfer_fee_id)
  1072. # Types de paiement pour l'mlc billet
  1073. #
  1074. ID_TYPE_PAIEMENT_IMPRESSION_BILLETS = create_payment_transfer_type(
  1075. name="Impression de billets " + LOCAL_CURRENCY_INTERNAL_NAME,
  1076. direction='SYSTEM_TO_SYSTEM',
  1077. from_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_BILLET,
  1078. to_account_type_id=ID_STOCK_DE_BILLETS,
  1079. )
  1080. ID_TYPE_PAIEMENT_DESTRUCTION_BILLETS = create_payment_transfer_type(
  1081. name="Destruction de billets " + LOCAL_CURRENCY_INTERNAL_NAME,
  1082. direction='SYSTEM_TO_SYSTEM',
  1083. from_account_type_id=ID_STOCK_DE_BILLETS,
  1084. to_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_BILLET,
  1085. )
  1086. ID_TYPE_PAIEMENT_SORTIE_COFFRE = create_payment_transfer_type(
  1087. name='Sortie coffre',
  1088. direction='SYSTEM_TO_SYSTEM',
  1089. from_account_type_id=ID_STOCK_DE_BILLETS,
  1090. to_account_type_id=ID_COMPTE_DE_TRANSIT,
  1091. custom_fields=[
  1092. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  1093. ID_CHAMP_PERSO_PAIEMENT_BDC,
  1094. ],
  1095. status_flows=[
  1096. ID_STATUS_FLOW_RAPPROCHEMENT,
  1097. ],
  1098. initial_statuses=[
  1099. ID_STATUS_A_RAPPROCHER,
  1100. ],
  1101. )
  1102. ID_TYPE_PAIEMENT_ENTREE_COFFRE_NUMERIQUE = create_payment_transfer_type(
  1103. name='Creation MLC numeriques',
  1104. direction='SYSTEM_TO_SYSTEM',
  1105. from_account_type_id=ID_COFFRE_MLC_NUMERIQUE ,
  1106. to_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE ,
  1107. )
  1108. ID_TYPE_PAIEMENT_SORTIE_COFFRE_NUMERIQUE = create_payment_transfer_type(
  1109. name='Destruction MLC numeriques',
  1110. direction='SYSTEM_TO_SYSTEM',
  1111. from_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE ,
  1112. to_account_type_id=ID_COFFRE_MLC_NUMERIQUE ,
  1113. )
  1114. ID_TYPE_PAIEMENT_ENTREE_COFFRE = create_payment_transfer_type(
  1115. name='Entrée coffre',
  1116. direction='SYSTEM_TO_SYSTEM',
  1117. from_account_type_id=ID_COMPTE_DE_TRANSIT,
  1118. to_account_type_id=ID_STOCK_DE_BILLETS,
  1119. custom_fields=[
  1120. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  1121. ID_CHAMP_PERSO_PAIEMENT_BDC,
  1122. ID_CHAMP_PERSO_PAIEMENT_ADHERENT_FACULTATIF,
  1123. ],
  1124. )
  1125. ID_TYPE_PAIEMENT_ENTREE_STOCK_BDC = create_payment_transfer_type(
  1126. name='Entrée stock BDC',
  1127. direction='SYSTEM_TO_USER',
  1128. from_account_type_id=ID_COMPTE_DE_TRANSIT,
  1129. to_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1130. custom_fields=[
  1131. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  1132. ],
  1133. )
  1134. ID_TYPE_PAIEMENT_SORTIE_STOCK_BDC = create_payment_transfer_type(
  1135. name='Sortie stock BDC',
  1136. direction='USER_TO_SYSTEM',
  1137. from_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1138. to_account_type_id=ID_COMPTE_DE_TRANSIT,
  1139. custom_fields=[
  1140. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  1141. ],
  1142. status_flows=[
  1143. ID_STATUS_FLOW_RAPPROCHEMENT,
  1144. ],
  1145. initial_statuses=[
  1146. ID_STATUS_A_RAPPROCHER,
  1147. ],
  1148. )
  1149. # Les mlc sortis de la Caisse mlc du BDC vont dans le compte des
  1150. # billets en circulation (dans la pratique, ces mlc rentrent dans la
  1151. # caisse mlc de l'Association mais ce sont bien des mlc en
  1152. # circulation). Les sorties caisse sont initialement dans l'état
  1153. # "A rapprocher" et seront passées dans l'état "Rapproché" lorsque leur
  1154. # entrée dans la Caisse mlc d'E.M. sera validée.
  1155. ID_TYPE_PAIEMENT_SORTIE_CAISSE_CURRENCY_BDC = create_payment_transfer_type(
  1156. name='Sortie caisse ' + LOCAL_CURRENCY_INTERNAL_NAME + ' BDC',
  1157. direction='USER_TO_SYSTEM',
  1158. from_account_type_id=ID_CAISSE_CURRENCY_BDC,
  1159. to_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1160. custom_fields=[
  1161. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  1162. ],
  1163. status_flows=[
  1164. ID_STATUS_FLOW_RAPPROCHEMENT,
  1165. ],
  1166. initial_statuses=[
  1167. ID_STATUS_A_RAPPROCHER,
  1168. ],
  1169. )
  1170. ID_TYPE_PAIEMENT_SORTIE_RETOURS_CURRENCY_BDC = create_payment_transfer_type(
  1171. name='Sortie retours ' + LOCAL_CURRENCY_INTERNAL_NAME + ' BDC',
  1172. direction='USER_TO_SYSTEM',
  1173. from_account_type_id=ID_RETOURS_CURRENCY_BDC,
  1174. to_account_type_id=ID_COMPTE_DE_TRANSIT,
  1175. custom_fields=[
  1176. ID_CHAMP_PERSO_PAIEMENT_PORTEUR,
  1177. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1178. ],
  1179. status_flows=[
  1180. ID_STATUS_FLOW_RAPPROCHEMENT,
  1181. ],
  1182. initial_statuses=[
  1183. ID_STATUS_A_RAPPROCHER,
  1184. ],
  1185. )
  1186. ID_TYPE_PAIEMENT_PERTE_DE_BILLETS = create_payment_transfer_type(
  1187. name='Perte de billets',
  1188. direction='USER_TO_SYSTEM',
  1189. from_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1190. to_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1191. )
  1192. ID_TYPE_PAIEMENT_GAIN_DE_BILLETS = create_payment_transfer_type(
  1193. name='Gain de billets',
  1194. direction='SYSTEM_TO_USER',
  1195. from_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1196. to_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1197. )
  1198. # Change billets :
  1199. # Cette opération se fait en 2 temps :
  1200. # 1) l'adhérent(e) donne des € au BDC
  1201. # 2) le BDC donne des € à l'adhérent(e) : les mlc sortent du stock de
  1202. # billets du BDC et vont dans le compte système "Compte des billets en
  1203. # circulation". En effet, une fois donnés à l'adhérent(e), les mlc
  1204. # sont "dans la nature", on ne sait pas exactement ce qu'ils deviennent.
  1205. #
  1206. # Le paiement enregistré est le versement des € et cela génère
  1207. # automatiquement le paiement correspondant au fait de donner les mlc
  1208. # à l'adhérent(e). On utilise pour cela le mécanisme des frais de
  1209. # transaction. Les frais sont payés par le destinataire, çad le BDC, au
  1210. # système (le compte des billets en circulation). Ils correspondent à
  1211. # 100% du montant du paiement original.
  1212. ID_TYPE_PAIEMENT_CHANGE_BILLETS_VERSEMENT_DES_EUROS = create_payment_transfer_type(
  1213. name='Change billets - Versement des €',
  1214. direction='SYSTEM_TO_USER',
  1215. from_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1216. to_account_type_id=ID_CAISSE_EURO_BDC,
  1217. custom_fields=[
  1218. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1219. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT,
  1220. ],
  1221. status_flows=[
  1222. ID_STATUS_FLOW_REMISE_A_ASSO,
  1223. ],
  1224. initial_statuses=[
  1225. ID_STATUS_A_REMETTRE,
  1226. ],
  1227. )
  1228. ID_TYPE_PAIEMENT_CHANGE_BILLETS_VERSEMENT_DES_MLC = create_generated_transfer_type(
  1229. name='Change billets - Versement des ' + LOCAL_CURRENCY_INTERNAL_NAME,
  1230. direction='USER_TO_SYSTEM',
  1231. from_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1232. to_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1233. )
  1234. create_transfer_fee(
  1235. name='Change billets - Versement des ' + LOCAL_CURRENCY_INTERNAL_NAME,
  1236. original_transfer_type=ID_TYPE_PAIEMENT_CHANGE_BILLETS_VERSEMENT_DES_EUROS,
  1237. generated_transfer_type=ID_TYPE_PAIEMENT_CHANGE_BILLETS_VERSEMENT_DES_MLC,
  1238. other_currency=True,
  1239. payer='DESTINATION',
  1240. receiver='SYSTEM',
  1241. charge_mode='PERCENTAGE',
  1242. amount=1.00,
  1243. )
  1244. ID_TYPE_PAIEMENT_RECONVERSION_BILLETS = create_payment_transfer_type(
  1245. name='Reconversion billets - Versement des MLCs',
  1246. direction='SYSTEM_TO_USER',
  1247. from_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1248. to_account_type_id=ID_RETOURS_CURRENCY_BDC,
  1249. custom_fields=[
  1250. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1251. ID_CHAMP_PERSO_PAIEMENT_NUMERO_FACTURE,
  1252. ],
  1253. status_flows=[
  1254. ID_STATUS_FLOW_REMISE_A_ASSO,
  1255. ID_STATUS_FLOW_VIREMENTS,
  1256. ],
  1257. initial_statuses=[
  1258. ID_STATUS_A_REMETTRE,
  1259. ID_STATUS_VIREMENTS_A_FAIRE,
  1260. ],
  1261. )
  1262. ID_TYPE_PAIEMENT_COTISATION_EN_EURO = create_payment_transfer_type(
  1263. name='Cotisation en €',
  1264. direction='SYSTEM_TO_USER',
  1265. from_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1266. to_account_type_id=ID_CAISSE_EURO_BDC,
  1267. custom_fields=[
  1268. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1269. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT,
  1270. ],
  1271. status_flows=[
  1272. ID_STATUS_FLOW_REMISE_A_ASSO,
  1273. ],
  1274. initial_statuses=[
  1275. ID_STATUS_A_REMETTRE,
  1276. ],
  1277. )
  1278. ID_TYPE_PAIEMENT_COTISATION_EN_MLC = create_payment_transfer_type(
  1279. name='Cotisation en mlc',
  1280. direction='SYSTEM_TO_USER',
  1281. from_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1282. to_account_type_id=ID_CAISSE_CURRENCY_BDC,
  1283. custom_fields=[
  1284. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1285. ],
  1286. status_flows=[
  1287. ID_STATUS_FLOW_REMISE_A_ASSO,
  1288. ],
  1289. initial_statuses=[
  1290. ID_STATUS_A_REMETTRE,
  1291. ],
  1292. )
  1293. ID_TYPE_PAIEMENT_VENTE_EN_EURO = create_payment_transfer_type(
  1294. name='Vente en €',
  1295. direction='SYSTEM_TO_USER',
  1296. from_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1297. to_account_type_id=ID_CAISSE_EURO_BDC,
  1298. custom_fields=[
  1299. ID_CHAMP_PERSO_PAIEMENT_PRODUIT,
  1300. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT,
  1301. ],
  1302. status_flows=[
  1303. ID_STATUS_FLOW_REMISE_A_ASSO,
  1304. ],
  1305. initial_statuses=[
  1306. ID_STATUS_A_REMETTRE,
  1307. ],
  1308. )
  1309. ID_TYPE_PAIEMENT_VENTE_EN_MLC = create_payment_transfer_type(
  1310. name='Vente en ' + LOCAL_CURRENCY_INTERNAL_NAME,
  1311. direction='SYSTEM_TO_USER',
  1312. from_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1313. to_account_type_id=ID_CAISSE_CURRENCY_BDC,
  1314. custom_fields=[
  1315. ID_CHAMP_PERSO_PAIEMENT_PRODUIT,
  1316. ],
  1317. status_flows=[
  1318. ID_STATUS_FLOW_REMISE_A_ASSO,
  1319. ],
  1320. initial_statuses=[
  1321. ID_STATUS_A_REMETTRE,
  1322. ],
  1323. )
  1324. # Dépôt en banque :
  1325. # 1 type de paiement pour le dépôt proprement dit + 4 types de paiements
  1326. # pour régulariser les dépôts dont le montant ne correspond pas au
  1327. # montant calculé.
  1328. #
  1329. # Le dépôt proprement dit :
  1330. ID_TYPE_PAIEMENT_DEPOT_EN_BANQUE = create_payment_transfer_type(
  1331. name='Dépôt en banque',
  1332. direction='USER_TO_USER',
  1333. from_account_type_id=ID_CAISSE_EURO_BDC,
  1334. to_account_type_id=ID_BANQUE_DE_DEPOT,
  1335. custom_fields=[
  1336. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT,
  1337. ID_CHAMP_PERSO_PAIEMENT_NUMERO_BORDEREAU,
  1338. ID_CHAMP_PERSO_PAIEMENT_MONTANT_COTISATIONS,
  1339. ID_CHAMP_PERSO_PAIEMENT_MONTANT_VENTES,
  1340. ID_CHAMP_PERSO_PAIEMENT_MONTANT_CHANGES_BILLET,
  1341. ID_CHAMP_PERSO_PAIEMENT_MONTANT_CHANGES_NUMERIQUE,
  1342. ],
  1343. status_flows=[
  1344. ID_STATUS_FLOW_RAPPROCHEMENT,
  1345. ID_STATUS_FLOW_VIREMENTS,
  1346. ],
  1347. initial_statuses=[
  1348. ID_STATUS_A_RAPPROCHER,
  1349. ID_STATUS_VIREMENTS_A_FAIRE,
  1350. ],
  1351. )
  1352. ID_TYPE_PAIEMENT_REGUL_DEPOT_INSUFFISANT = create_payment_transfer_type(
  1353. direction='SYSTEM_TO_USER',
  1354. name='Régularisation dépôt insuffisant',
  1355. from_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1356. to_account_type_id=ID_BANQUE_DE_DEPOT,
  1357. custom_fields=[
  1358. ID_CHAMP_PERSO_PAIEMENT_BDC,
  1359. ],
  1360. status_flows=[
  1361. ID_STATUS_FLOW_VIREMENTS,
  1362. ],
  1363. initial_statuses=[
  1364. ID_STATUS_VIREMENTS_A_FAIRE,
  1365. ],
  1366. )
  1367. ID_TYPE_PAIEMENT_BANQUE_VERS_CAISSE_EURO_BDC = create_payment_transfer_type(
  1368. name='Paiement de Banque de dépôt vers Caisse € BDC',
  1369. direction='USER_TO_USER',
  1370. from_account_type_id=ID_BANQUE_DE_DEPOT,
  1371. to_account_type_id=ID_CAISSE_EURO_BDC,
  1372. status_flows=[
  1373. ID_STATUS_FLOW_RAPPROCHEMENT,
  1374. ID_STATUS_FLOW_REMISE_A_ASSO,
  1375. ],
  1376. initial_statuses=[
  1377. ID_STATUS_A_RAPPROCHER,
  1378. ID_STATUS_A_REMETTRE,
  1379. ],
  1380. )
  1381. ID_TYPE_PAIEMENT_CAISSE_EURO_BDC_VERS_BANQUE = create_payment_transfer_type(
  1382. name='Paiement de Caisse € BDC vers Banque de dépôt',
  1383. direction='USER_TO_USER',
  1384. from_account_type_id=ID_CAISSE_EURO_BDC,
  1385. to_account_type_id=ID_BANQUE_DE_DEPOT,
  1386. status_flows=[
  1387. ID_STATUS_FLOW_RAPPROCHEMENT,
  1388. ],
  1389. initial_statuses=[
  1390. ID_STATUS_A_RAPPROCHER,
  1391. ],
  1392. )
  1393. ID_TYPE_PAIEMENT_REGUL_DEPOT_EXCESSIF = create_payment_transfer_type(
  1394. name='Régularisation dépôt excessif',
  1395. direction='USER_TO_SYSTEM',
  1396. from_account_type_id=ID_BANQUE_DE_DEPOT,
  1397. to_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1398. custom_fields=[
  1399. ID_CHAMP_PERSO_PAIEMENT_BDC,
  1400. ],
  1401. status_flows=[
  1402. ID_STATUS_FLOW_VIREMENTS,
  1403. ],
  1404. initial_statuses=[
  1405. ID_STATUS_VIREMENTS_A_FAIRE,
  1406. ],
  1407. )
  1408. # Type de paiement utilisé lorsqu'un BDC remet des espèces à Euskal
  1409. # Moneta suite à un refus de la banque de prendre ces espèces.
  1410. #
  1411. # Les € remis à E.M. vont dans le compte de débit et les opérations sont
  1412. # initialemnt dans l'état "A rapprocher", ce qui permettra de les
  1413. # valider (c'est le même fonctionnement que pour les sorties de la
  1414. # Caisse mlc des BDC).
  1415. ID_TYPE_PAIEMENT_REMISE_EUROS_EN_CAISSE = create_payment_transfer_type(
  1416. name="Remise d'€ en caisse",
  1417. direction='USER_TO_SYSTEM',
  1418. from_account_type_id=ID_CAISSE_EURO_BDC,
  1419. to_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1420. status_flows=[
  1421. ID_STATUS_FLOW_RAPPROCHEMENT,
  1422. ],
  1423. initial_statuses=[
  1424. ID_STATUS_A_RAPPROCHER,
  1425. ],
  1426. )
  1427. # Paiement utilisé pour les virements depuis les banques de dépôt pour
  1428. # l'argent des cotisations, ventes, .... Dans la pratique, cet argent va
  1429. # sur le Compte de gestion d'Euskal Moneta mais ce compte n'existe pas
  1430. # dans Cyclos et on considère tout simplement que cet argent sort du
  1431. # système.
  1432. #
  1433. # Note : Le Compte de gestion d'Euskal Moneta n'existe pas dans Cyclos
  1434. # car il n'aurait donné qu'une vision partielle du Compte de gestion
  1435. # réel (celui qui se trouve au Crédit Coopératif). Plutôt que d'avoir un
  1436. # compte incomplet (toutes les opérations n'auraient pas été tracées
  1437. # dans Cyclos) et dans un état artificiel (le solde aurait été faux,
  1438. # complètement déconnecté de la réalité), il a été décidé de ne pas
  1439. # avoir ce compte dans Cyclos. Il est donc à l'extérieur du système et
  1440. # c'est le Compte de débit en € qui est utilisé pour les paiements qui
  1441. # dans la réalité font intervenir le Compte de gestion.
  1442. #
  1443. # Note 2 : Dans les noms des types de paiements ci-dessous on utilise
  1444. # "Compte débit €" et pas "le Compte de débit €" de façon à avoir un
  1445. # internalName ne dépassant pas 50 caractères (le internalName étant
  1446. # automatiquement généré à partir du nom).
  1447. ID_TYPE_PAIEMENT_BANQUE_VERS_COMPTE_DE_DEBIT = create_payment_transfer_type(
  1448. name='Virement de Banque de dépôt vers Compte débit €',
  1449. direction='USER_TO_SYSTEM',
  1450. from_account_type_id=ID_BANQUE_DE_DEPOT,
  1451. to_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1452. )
  1453. # Type de paiement utilisé pour les virements depuis les banques de
  1454. # dépôt pour l'argent des changes.
  1455. ID_TYPE_PAIEMENT_BANQUE_VERS_COMPTE_DEDIE = create_payment_transfer_type(
  1456. name='Virement de Banque de dépôt vers Compte dédié',
  1457. direction='USER_TO_USER',
  1458. from_account_type_id=ID_BANQUE_DE_DEPOT,
  1459. to_account_type_id=ID_COMPTE_DEDIE,
  1460. )
  1461. # Type de paiement utilisé pour les virements de remboursement des
  1462. # reconversions.
  1463. ID_TYPE_PAIEMENT_COMPTE_DEDIE_VERS_COMPTE_DE_DEBIT = create_payment_transfer_type(
  1464. name='Virement de Compte dédié vers Compte débit €',
  1465. direction='USER_TO_SYSTEM',
  1466. from_account_type_id=ID_COMPTE_DEDIE,
  1467. to_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1468. )
  1469. # Le type de paiement ci-dessous, "Virement entre comptes dédiés",
  1470. # permettra de régulariser la situation des 2 comptes dédiés lorsque
  1471. # des adhérents feront des dépôts de billets sur leur compte numérique
  1472. # ou des retraits de billets à partir de ce même compte.
  1473. ID_TYPE_PAIEMENT_VIREMENT_ENTRE_COMPTES_DEDIES = create_payment_transfer_type(
  1474. name='Virement entre comptes dédiés',
  1475. direction='USER_TO_USER',
  1476. from_account_type_id=ID_COMPTE_DEDIE,
  1477. to_account_type_id=ID_COMPTE_DEDIE,
  1478. )
  1479. # Les 2 types de paiement suivants sont utilisés lorsqu'un adhérent fait
  1480. # un paiement "en ligne" pour créditer son compte numérique.
  1481. # On parle ici de change "en ligne" par opposition à "dans un bureau
  1482. # de change". Il peut s'agir d'un paiement par prélèvement automatique,
  1483. # par virement ou par carte bleue (dans le cas de la VAD c'est-à-dire la
  1484. # vente à distance sur Internet).
  1485. # L'API Eusko doit générer ces 2 paiements de façon cohérente. Cela ne
  1486. # peut pas être géré dans le paramétrage avec des frais car il s'agit de
  1487. # 2 paiements de compte système à compte utilisateur, mais pour des
  1488. # utilisateurs différents (le compte dédié mlc numérique, et
  1489. # l'adhérent dont il faut créditer le compte).
  1490. # Le champ "Numéro de transaction banque" contient la référence du
  1491. # paiement bancaire réel en €.
  1492. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_LIGNE_VERSEMENT_DES_EUROS = create_payment_transfer_type(
  1493. name='Change numérique en ligne - Versement des €',
  1494. direction='SYSTEM_TO_USER',
  1495. from_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1496. to_account_type_id=ID_COMPTE_DEDIE,
  1497. custom_fields=[
  1498. ID_CHAMP_PERSO_PAIEMENT_NUMERO_TRANSACTION_BANQUE,
  1499. ],
  1500. )
  1501. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_LIGNE_VERSEMENT_DES_MLC = create_payment_transfer_type(
  1502. name='Change numérique en ligne - Versement des ' + LOCAL_CURRENCY_INTERNAL_NAME,
  1503. direction='SYSTEM_TO_USER',
  1504. from_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  1505. to_account_type_id=ID_COMPTE_ADHERENT,
  1506. custom_fields=[
  1507. ID_CHAMP_PERSO_PAIEMENT_NUMERO_TRANSACTION_BANQUE,
  1508. ],
  1509. )
  1510. # Ce type de paiement sera utilisé lorsqu'un adhérent fera un paiement
  1511. # en € dans un bureau de change pour créditer son compte numérique.
  1512. # Pour cette opération, l'API Eusko doit générer 2 paiements :
  1513. # - un paiement "Change numérique en BDC - Versement des €"
  1514. # - un paiement "Crédit du compte"
  1515. # C'est l'API qui doit générer ces 2 paiements de façon cohérente. Cela
  1516. # ne peut pas être géré dans le paramétrage avec des frais car il s'agit
  1517. # de 2 paiements de compte système à compte utilisateur, mais pour des
  1518. # utilisateurs différents (le BDC qui reçoit les €, et l'adhérent dont
  1519. # il faut créditer le compte).
  1520. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_BDC = create_payment_transfer_type(
  1521. name='Change numérique en BDC - Versement des €',
  1522. direction='SYSTEM_TO_USER',
  1523. from_account_type_id=ID_COMPTE_DE_DEBIT_EURO,
  1524. to_account_type_id=ID_CAISSE_EURO_BDC,
  1525. custom_fields=[
  1526. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1527. ID_CHAMP_PERSO_PAIEMENT_MODE_DE_PAIEMENT,
  1528. ],
  1529. status_flows=[
  1530. ID_STATUS_FLOW_REMISE_A_ASSO,
  1531. ],
  1532. initial_statuses=[
  1533. ID_STATUS_A_REMETTRE,
  1534. ],
  1535. )
  1536. ID_TYPE_PAIEMENT_RECONVERSION_NUMERIQUE = create_payment_transfer_type(
  1537. name='Reconversion numérique',
  1538. direction='USER_TO_SYSTEM',
  1539. from_account_type_id=ID_COMPTE_ADHERENT,
  1540. to_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  1541. status_flows=[
  1542. ID_STATUS_FLOW_VIREMENTS,
  1543. ],
  1544. initial_statuses=[
  1545. ID_STATUS_VIREMENTS_A_FAIRE,
  1546. ],
  1547. )
  1548. # Les 2 types de paiement ci-dessous seront utilisés lorsqu'un adhérent
  1549. # déposera des mlc billet dans un bureau de change pour créditer son
  1550. # compte numérique.
  1551. # Pour cette opération, l'API Eusko doit générer 2 paiements :
  1552. # - un paiement "Dépôt de billets"
  1553. # - un paiement "Crédit du compte"
  1554. # Note : voir le commentaire du type de paiement "Change numérique en
  1555. # BDC - Versement des €" pour l'explication sur pourquoi cela est fait
  1556. # de cette manière.
  1557. ID_TYPE_PAIEMENT_DEPOT_DE_BILLETS = create_payment_transfer_type(
  1558. name='Dépôt de billets',
  1559. direction='SYSTEM_TO_USER',
  1560. from_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1561. to_account_type_id=ID_RETOURS_CURRENCY_BDC,
  1562. custom_fields=[
  1563. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1564. ],
  1565. status_flows=[
  1566. ID_STATUS_FLOW_REMISE_A_ASSO,
  1567. ID_STATUS_FLOW_VIREMENTS,
  1568. ],
  1569. initial_statuses=[
  1570. ID_STATUS_A_REMETTRE,
  1571. ID_STATUS_VIREMENTS_A_FAIRE,
  1572. ],
  1573. )
  1574. ID_TYPE_PAIEMENT_CREDIT_DU_COMPTE = create_payment_transfer_type(
  1575. name='Crédit du compte',
  1576. direction='SYSTEM_TO_USER',
  1577. from_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  1578. to_account_type_id=ID_COMPTE_ADHERENT,
  1579. custom_fields=[
  1580. ID_CHAMP_PERSO_PAIEMENT_BDC,
  1581. ],
  1582. )
  1583. # Les 2 types de paiement ci-dessous seront utilisés lorsqu'un adhérent
  1584. # fera un retrait d'mlc billet (à partir de son compte numérique) dans
  1585. # un bureau de change.
  1586. # Pour cette opération, l'API Eusko doit générer 2 paiements :
  1587. # - un paiement "Retrait de billets"
  1588. # - un paiement "Retrait du compte"
  1589. # Note : c'est le même fonctionnement que pour le dépôt de billets.
  1590. #
  1591. # Attention, pour le retrait de billets, le compte d'origine est bien
  1592. # le stock de billets du bureau de change, et pas sa caisse mlc, car
  1593. # on n'a aucun contrôle sur l'approvisionnement de cette caisse mlc.
  1594. # Pour être certain que le BDC a des mlc lorsqu'un adhérent veut faire
  1595. # un retrait, il faut prendre ces mlc dans le stock de billets du BDC.
  1596. # Au départ, nous voulions que ce stock ne soit utilisé que pour le
  1597. # change, mais je ne vois pas comment faire autrement.
  1598. ID_TYPE_PAIEMENT_RETRAIT_DE_BILLETS = create_payment_transfer_type(
  1599. name='Retrait de billets',
  1600. direction='USER_TO_SYSTEM',
  1601. from_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1602. to_account_type_id=ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  1603. custom_fields=[
  1604. ID_CHAMP_PERSO_PAIEMENT_ADHERENT,
  1605. ],
  1606. status_flows=[
  1607. ID_STATUS_FLOW_VIREMENTS,
  1608. ],
  1609. initial_statuses=[
  1610. ID_STATUS_VIREMENTS_A_FAIRE,
  1611. ],
  1612. )
  1613. ID_TYPE_PAIEMENT_RETRAIT_DU_COMPTE = create_payment_transfer_type(
  1614. name='Retrait du compte',
  1615. direction='USER_TO_SYSTEM',
  1616. from_account_type_id=ID_COMPTE_ADHERENT,
  1617. to_account_type_id=ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  1618. custom_fields=[
  1619. ID_CHAMP_PERSO_PAIEMENT_BDC,
  1620. ],
  1621. )
  1622. # Et enfin, les types de paiement les plus importants pour l'mlc
  1623. # numérique !
  1624. # On crée un type de paiement dédié pour le paiement par carte via le
  1625. # terminal de paiement, ce qui permettra de distinguer très facilement
  1626. # les paiements par virement via le site web des paiements par carte.
  1627. # Cela permettra aussi, éventuellement, de définir des règles
  1628. # particulières pour l'un ou l'autre de ces moyens de paiement.
  1629. ID_TYPE_PAIEMENT_VIREMENT_INTER_ADHERENT = create_payment_transfer_type(
  1630. name='Virement inter-adhérent',
  1631. direction='USER_TO_USER',
  1632. from_account_type_id=ID_COMPTE_ADHERENT,
  1633. to_account_type_id=ID_COMPTE_ADHERENT,
  1634. allows_recurring_payments=True,
  1635. allows_scheduled_payments=True
  1636. )
  1637. ID_TYPE_PAIEMENT_PAIEMENT_PAR_SMS = create_payment_transfer_type(
  1638. name='Paiement par SMS',
  1639. direction='USER_TO_USER',
  1640. from_account_type_id=ID_COMPTE_ADHERENT,
  1641. to_account_type_id=ID_COMPTE_ADHERENT,
  1642. principal_types=[
  1643. ID_CLIENT_SMS,
  1644. ],
  1645. )
  1646. ID_TYPE_PAIEMENT_PAIEMENT_PAR_CARTE = create_payment_transfer_type(
  1647. name='Paiement par carte',
  1648. direction='USER_TO_USER',
  1649. from_account_type_id=ID_COMPTE_ADHERENT,
  1650. to_account_type_id=ID_COMPTE_ADHERENT,
  1651. channels=[
  1652. ID_CANAL_PAY_AT_POS,
  1653. ],
  1654. principal_types=[
  1655. ID_TOKEN_CARTE_NFC,
  1656. ],
  1657. )
  1658. # Types de paiement pour des régularisations entre caisses des BDC.
  1659. ID_TYPE_PAIEMENT_DE_STOCK_DE_BILLETS_BDC_VERS_RETOURS_MLC_BDC = create_payment_transfer_type(
  1660. name="De Stock de billets BDC vers Retours de " + LOCAL_CURRENCY_INTERNAL_NAME +" BDC",
  1661. direction='USER_TO_SELF',
  1662. from_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1663. to_account_type_id=ID_RETOURS_CURRENCY_BDC,
  1664. )
  1665. ID_TYPE_PAIEMENT_DE_RETOURS_MLC_BDC_VERS_STOCK_DE_BILLETS_BDC = create_payment_transfer_type(
  1666. name="De Retours des " + LOCAL_CURRENCY_INTERNAL_NAME + " BDC vers Stock de billets BDC",
  1667. direction='USER_TO_SELF',
  1668. from_account_type_id=ID_RETOURS_CURRENCY_BDC,
  1669. to_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  1670. )
  1671. all_system_to_system_payments = [
  1672. ID_TYPE_PAIEMENT_IMPRESSION_BILLETS,
  1673. ID_TYPE_PAIEMENT_DESTRUCTION_BILLETS,
  1674. ID_TYPE_PAIEMENT_SORTIE_COFFRE,
  1675. ID_TYPE_PAIEMENT_ENTREE_COFFRE,
  1676. ID_TYPE_PAIEMENT_ENTREE_COFFRE_NUMERIQUE,
  1677. ID_TYPE_PAIEMENT_SORTIE_COFFRE_NUMERIQUE
  1678. ]
  1679. all_system_to_user_payments = [
  1680. ID_TYPE_PAIEMENT_ENTREE_STOCK_BDC,
  1681. ID_TYPE_PAIEMENT_GAIN_DE_BILLETS,
  1682. ID_TYPE_PAIEMENT_CHANGE_BILLETS_VERSEMENT_DES_EUROS,
  1683. ID_TYPE_PAIEMENT_RECONVERSION_BILLETS,
  1684. ID_TYPE_PAIEMENT_COTISATION_EN_EURO,
  1685. ID_TYPE_PAIEMENT_COTISATION_EN_MLC,
  1686. ID_TYPE_PAIEMENT_VENTE_EN_EURO,
  1687. ID_TYPE_PAIEMENT_VENTE_EN_MLC,
  1688. ID_TYPE_PAIEMENT_REGUL_DEPOT_INSUFFISANT,
  1689. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_LIGNE_VERSEMENT_DES_EUROS,
  1690. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_LIGNE_VERSEMENT_DES_MLC,
  1691. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_BDC,
  1692. ID_TYPE_PAIEMENT_DEPOT_DE_BILLETS,
  1693. ID_TYPE_PAIEMENT_CREDIT_DU_COMPTE,
  1694. ]
  1695. all_user_to_system_payments = [
  1696. ID_TYPE_PAIEMENT_SORTIE_STOCK_BDC,
  1697. ID_TYPE_PAIEMENT_SORTIE_CAISSE_CURRENCY_BDC,
  1698. ID_TYPE_PAIEMENT_SORTIE_RETOURS_CURRENCY_BDC,
  1699. ID_TYPE_PAIEMENT_PERTE_DE_BILLETS,
  1700. ID_TYPE_PAIEMENT_REGUL_DEPOT_EXCESSIF,
  1701. ID_TYPE_PAIEMENT_REMISE_EUROS_EN_CAISSE,
  1702. ID_TYPE_PAIEMENT_BANQUE_VERS_COMPTE_DE_DEBIT,
  1703. ID_TYPE_PAIEMENT_COMPTE_DEDIE_VERS_COMPTE_DE_DEBIT,
  1704. ID_TYPE_PAIEMENT_RECONVERSION_NUMERIQUE,
  1705. ID_TYPE_PAIEMENT_RETRAIT_DE_BILLETS,
  1706. ID_TYPE_PAIEMENT_RETRAIT_DU_COMPTE,
  1707. ]
  1708. all_user_to_user_payments = [
  1709. ID_TYPE_PAIEMENT_DEPOT_EN_BANQUE,
  1710. ID_TYPE_PAIEMENT_BANQUE_VERS_CAISSE_EURO_BDC,
  1711. ID_TYPE_PAIEMENT_CAISSE_EURO_BDC_VERS_BANQUE,
  1712. ID_TYPE_PAIEMENT_BANQUE_VERS_COMPTE_DEDIE,
  1713. ID_TYPE_PAIEMENT_VIREMENT_ENTRE_COMPTES_DEDIES,
  1714. ID_TYPE_PAIEMENT_VIREMENT_INTER_ADHERENT,
  1715. ID_TYPE_PAIEMENT_PAIEMENT_PAR_CARTE,
  1716. ]
  1717. all_user_to_self_payments = [
  1718. ID_TYPE_PAIEMENT_DE_STOCK_DE_BILLETS_BDC_VERS_RETOURS_MLC_BDC,
  1719. ID_TYPE_PAIEMENT_DE_RETOURS_MLC_BDC_VERS_STOCK_DE_BILLETS_BDC,
  1720. ]
  1721. all_payments_to_system = \
  1722. all_system_to_system_payments \
  1723. + all_user_to_system_payments
  1724. all_payments_to_user = \
  1725. all_system_to_user_payments \
  1726. + all_user_to_user_payments \
  1727. + all_user_to_self_payments
  1728. ########################################################################
  1729. # Creation des scripts et des points d extensions associés aux
  1730. # transactions et transferts
  1731. def create_custom_script(name,
  1732. type,
  1733. pathToScript,
  1734. dependencies=[],
  1735. parameters=None):
  1736. logger.info('Création du script "%s"...', name)
  1737. # On commence par créer le script avec les propriétés de base.
  1738. script = {
  1739. 'class': 'org.cyclos.model.system.scripts.CustomScriptDTO',
  1740. 'name': name,
  1741. 'internalName': get_internal_name(name),
  1742. 'runAsSystem': True
  1743. }
  1744. script['type'] = type
  1745. script['parameters'] = parameters
  1746. with open(pathToScript, 'r') as file:
  1747. data = file.read()
  1748. script['functions'] = {
  1749. 'SAVED': data
  1750. }
  1751. r = requests.post(network_web_services + 'customScript/save',
  1752. headers=headers,
  1753. json=script)
  1754. check_request_status(r)
  1755. script_id = r.json()['result']
  1756. logger.debug('script_id = %s', script_id)
  1757. return script_id
  1758. def create_extension_point_with_transfertype(name,
  1759. extension_point_class,
  1760. transfer_types,
  1761. enabled,
  1762. script,
  1763. events=[]):
  1764. logger.info('Création du point d extension "%s"...', name)
  1765. # On commence par créer le point d'extension avec les propriétés de base.
  1766. extensionPoint = {
  1767. 'class': extension_point_class,
  1768. 'name': name,
  1769. 'internalName': get_internal_name(name),
  1770. 'enabled': enabled
  1771. }
  1772. extensionPoint['transferTypes']=transfer_types
  1773. extensionPoint['script']=script
  1774. extensionPoint['events']=events
  1775. r = requests.post(network_web_services + 'extensionPoint/save',
  1776. headers=headers,
  1777. json=extensionPoint)
  1778. check_request_status(r)
  1779. extension_point_id = r.json()['result']
  1780. logger.debug('extension_point_id = %s', extension_point_id)
  1781. return extension_point_id
  1782. ID_TRANSACTION_SCRIPT = create_custom_script(
  1783. name='Warning failed asynchronous transactions',
  1784. type='EXTENSION_POINT',
  1785. pathToScript='script_transaction_extensionpoint.groovy'
  1786. )
  1787. ID_TRANSFER_SCRIPT = create_custom_script(
  1788. name='Asynchronous transfer sync',
  1789. type='EXTENSION_POINT',
  1790. pathToScript='script_transfer_extensionpoint.groovy'
  1791. )
  1792. ID_TRANSACTION_EXTENSION_POINT = create_extension_point_with_transfertype(
  1793. name='Warning failed asynchronous transactions',
  1794. extension_point_class='org.cyclos.model.system.extensionpoints.TransactionExtensionPointDTO',
  1795. transfer_types= [ID_TYPE_PAIEMENT_VIREMENT_INTER_ADHERENT],
  1796. enabled=True,
  1797. script=ID_TRANSACTION_SCRIPT,
  1798. events=['CHANGE_STATUS']
  1799. )
  1800. ID_TRANSFER_EXTENSION_POINT = create_extension_point_with_transfertype(
  1801. name='Asynchronous transfer sync',
  1802. extension_point_class='org.cyclos.model.system.extensionpoints.TransferExtensionPointDTO',
  1803. transfer_types=[ID_TYPE_PAIEMENT_VIREMENT_INTER_ADHERENT],
  1804. enabled=True,
  1805. script=ID_TRANSFER_SCRIPT,
  1806. events=['CREATE']
  1807. )
  1808. ########################################################################
  1809. # Création des champs personnalisés pour les profils utilisateur.
  1810. #
  1811. def create_user_custom_field_linked_user(name, required=True):
  1812. logger.info('Création du champ personnalisé "%s"...', name)
  1813. r = requests.post(network_web_services + 'userCustomField/save',
  1814. headers=headers,
  1815. json={
  1816. 'name': name,
  1817. 'internalName': get_internal_name(name),
  1818. 'type': 'LINKED_ENTITY',
  1819. 'linkedEntityType': 'USER',
  1820. 'control': 'ENTITY_SELECTION',
  1821. 'required': required
  1822. })
  1823. check_request_status(r)
  1824. custom_field_id = r.json()['result']
  1825. logger.debug('custom_field_id = %s', custom_field_id)
  1826. add_constant('user_custom_fields', name, custom_field_id)
  1827. return custom_field_id
  1828. ID_CHAMP_PERSO_UTILISATEUR_BDC = create_user_custom_field_linked_user(
  1829. name='BDC',
  1830. )
  1831. ########################################################################
  1832. # Création des produits et des groupes.
  1833. #
  1834. # Les produits servent à gérer les permissions et les règles d'accès, et
  1835. # à attribuer des types de compte aux utilisateurs.
  1836. #
  1837. # Un groupe de nature Administrateur est associé à un unique produit, de
  1838. # nature Administrateur, et qui est créé automatiquement lors de la
  1839. # création du groupe. C'est dans ce produit que sont définies les
  1840. # permissions et les règles d'accès du groupe.
  1841. #
  1842. # Au contraire, un groupe de nature Membre peut être associé à plusieurs
  1843. # produits (de nature Membre) mais aucun n'est créé automatiquement. Là
  1844. # encore, c'est via les produits que les permissions et les règles
  1845. # d'accès sont définies. Si plusieurs produits sont associés à un
  1846. # groupe, les permissions se cumulent.
  1847. # Un produit de nature Membre ne peut être lié qu'à un seul type de
  1848. # compte utilisateur. Chaque utilisateur appartenant à un groupe associé
  1849. # à ce produit aura un compte de ce type.
  1850. # Si on veut attribuer plusieurs comptes à des utilisateurs (c'est notre
  1851. # cas pour les bureaux de change), il faut créer un produit pour chaque
  1852. # type de compte utilisateur et associer tous ces produits au groupe des
  1853. # utilisateurs.
  1854. #
  1855. # Note: Tous les utilisateurs ont un nom et un login, même ceux qui ne
  1856. # peuvent pas se connecter à Cyclos (par exemple les utilisateurs des
  1857. # groupes "Bureaux de change", "Banques de dépôt" ou "Porteurs"). Comme
  1858. # Cyclos vérifie l'unicité du login, cela rend impossible la création de
  1859. # doublons (c'est donc une mesure de protection).
  1860. def create_member_product(name,
  1861. my_profile_fields=[],
  1862. accessible_user_groups=[],
  1863. other_users_profile_fields={},
  1864. user_account_type_id=None,
  1865. dashboard_actions=[],
  1866. password_actions=[],
  1867. my_access_clients=[],
  1868. my_token_types=[],
  1869. system_payments=[],
  1870. user_payments=[],
  1871. scheduled_payments=[],
  1872. recurring_payments=[],
  1873. receive_payments=[]):
  1874. logger.info('Création du produit "%s"...', name)
  1875. # On commence par créer le produit avec les propriétés de base.
  1876. product = {
  1877. 'class': 'org.cyclos.model.users.products.MemberProductDTO',
  1878. 'name': name,
  1879. 'internalName': get_internal_name(name),
  1880. # Workaround of a bug in Cyclos 4.6.
  1881. 'myRecordTypeFields': [],
  1882. }
  1883. if user_account_type_id:
  1884. product['userAccount'] = user_account_type_id
  1885. product['accountAccessibility'] = 'ALWAYS'
  1886. r = requests.post(network_web_services + 'product/save',
  1887. headers=headers,
  1888. json=product)
  1889. check_request_status(r)
  1890. product_id = r.json()['result']
  1891. logger.debug('product_id = %s', product_id)
  1892. # Ensuite on charge le produit pour pouvoir le modifier.
  1893. r = requests.get(
  1894. network_web_services + 'product/load/' + product_id,
  1895. headers=headers
  1896. )
  1897. check_request_status(r)
  1898. product = r.json()['result']
  1899. # On modifie les paramètres du produit puis on l'enregistre.
  1900. for field in product['myProfileFields']:
  1901. if field['profileField'] in my_profile_fields:
  1902. field['enabled'] = True
  1903. field['editableAtRegistration'] = True
  1904. field['visible'] = True
  1905. field['editable'] = True
  1906. # Par défaut un utilisateur peut accéder à son propre groupe. C'est
  1907. # nécessaire pour qu'un utilisateur soit capable de voir dans quel
  1908. # groupe lui-même se trouve (voir aussi 'groupVisibility' plus bas).
  1909. if not accessible_user_groups:
  1910. product['userGroupAccessibility'] = 'OWN_GROUP'
  1911. else:
  1912. product['userGroupAccessibility'] = 'SPECIFIC'
  1913. product['accessibleUserGroups'] = accessible_user_groups
  1914. product['searchUsersOnGroups'] = 'ALL'
  1915. # Permettre de voir le group dans lequel un utilisateur se trouve
  1916. # (s'applique aussi à soi-même).
  1917. product['groupVisibility'] = 'GROUP'
  1918. for field in product['userProfileFields']:
  1919. key = field['profileField']
  1920. try:
  1921. if key in other_users_profile_fields:
  1922. field['userList'] = True
  1923. field['userFilter'] = True
  1924. field['visible'] = True
  1925. field['userKeywords'] = other_users_profile_fields[key]
  1926. except TypeError:
  1927. # Pour les champs de profil personnalisés (comme 'BDC'),
  1928. # 'profileField' n'est une string mais un dictionnaire et
  1929. # un TypeError est balancé. On ignore l'erreur car on ne
  1930. # traite ici que les champs de profil standards.
  1931. pass
  1932. for dashboard_action in product['dashboardActions']:
  1933. if dashboard_action['dashboardAction'] in dashboard_actions:
  1934. dashboard_action['enabled'] = True
  1935. dashboard_action['enabledByDefault'] = True
  1936. for password_action in product['passwordActions']:
  1937. if password_action['passwordType']['internalName'] in password_actions:
  1938. password_action['change'] = True
  1939. password_action['atRegistration'] = True
  1940. for access_client in product['myAccessClients']:
  1941. if access_client['accessClientType']['id'] in my_access_clients:
  1942. access_client['enable'] = True
  1943. access_client['view'] = True
  1944. access_client['block'] = True
  1945. access_client['unblock'] = True
  1946. access_client['manage'] = True
  1947. access_client['activate'] = True
  1948. access_client['unassign'] = True
  1949. for token_type in product['myTokenTypes']:
  1950. if token_type['tokenType']['id'] in my_token_types:
  1951. token_type['enable'] = True
  1952. token_type['block'] = True
  1953. token_type['unblock'] = True
  1954. product['maxAddresses'] = 1
  1955. product['systemPayments'] = system_payments
  1956. product['userPayments'] = user_payments
  1957. product['receivePayments'] = receive_payments
  1958. product['myScheduledPayments'] = scheduled_payments
  1959. product['myRecurringPayments'] = recurring_payments
  1960. r = requests.post(network_web_services + 'product/save',
  1961. headers=headers,
  1962. json=product)
  1963. check_request_status(r)
  1964. return product_id
  1965. def assign_product_to_group(product_id, group_id):
  1966. logger.info("Affectation du produit à un groupe...")
  1967. r = requests.post(network_web_services + 'productsGroup/assign',
  1968. headers=headers,
  1969. json=[product_id, group_id])
  1970. check_request_status(r)
  1971. def get_admin_product(group_id):
  1972. r = requests.get(network_web_services + 'group/load/' + group_id,
  1973. headers=headers,
  1974. json={})
  1975. check_request_status(r)
  1976. product_id = r.json()['result']['adminProduct']['id']
  1977. return product_id
  1978. def set_admin_group_permissions(
  1979. group_id,
  1980. my_profile_fields=[],
  1981. password_actions=[],
  1982. my_access_clients=[],
  1983. visible_transaction_fields=[],
  1984. transfer_status_flows=[],
  1985. system_accounts=[],
  1986. system_to_system_payments=[],
  1987. system_to_user_payments=[],
  1988. chargeback_of_payments_to_system=[],
  1989. accessible_user_groups=[],
  1990. accessible_administrator_groups=[],
  1991. user_profile_fields=[],
  1992. change_group='NONE',
  1993. user_registration=False,
  1994. blocked_users_manage=False,
  1995. disabled_users='NONE',
  1996. removed_users='NONE',
  1997. user_password_actions=[],
  1998. user_channels_access='NONE',
  1999. user_token_types=[],
  2000. user_access_clients=[],
  2001. access_user_accounts=[],
  2002. payments_as_user_to_user=[],
  2003. payments_as_user_to_system=[],
  2004. payments_as_user_to_self=[],
  2005. user_scheduled_payments=[],
  2006. user_recurring_payments=[],
  2007. chargeback_of_payments_to_user=[]
  2008. ):
  2009. # Récupération de l'id du produit de ce groupe.
  2010. product_id = get_admin_product(group_id)
  2011. # Chargement du produit
  2012. r = requests.get(network_web_services + 'product/load/' + product_id,
  2013. headers=headers,
  2014. json={})
  2015. check_request_status(r)
  2016. product = r.json()['result']
  2017. # Plusieurs champs de profil sont activés par défaut et on doit les
  2018. # désactiver si on n'en veut pas.
  2019. for profile_field in product['myProfileFields']:
  2020. field = profile_field['profileField']
  2021. if isinstance(field, stringType):
  2022. enable = field in my_profile_fields
  2023. elif isinstance(field, dict):
  2024. enable = field['id'] in my_profile_fields
  2025. profile_field['enabled'] = enable
  2026. profile_field['editableAtRegistration'] = enable
  2027. profile_field['visible'] = enable
  2028. profile_field['editable'] = enable
  2029. # Par défaut tous les types de mot de passe sont présents et aucune
  2030. # action n'est activée. Pour les types voulus, on active les actions
  2031. # 'Change' (modifier le mot de passe) et 'At registration' (définir
  2032. # le mot de passe lors de l'enregistrement de l'utilisateur).
  2033. for password_action in product['passwordActions']:
  2034. if password_action['passwordType']['internalName'] in password_actions:
  2035. password_action['change'] = True
  2036. password_action['atRegistration'] = True
  2037. #access main client
  2038. for access_client in product['myAccessClients']:
  2039. if access_client['accessClientType']['id'] in my_access_clients:
  2040. access_client['enable'] = True
  2041. access_client['view'] = True
  2042. access_client['block'] = True
  2043. access_client['unblock'] = True
  2044. access_client['manage'] = True
  2045. access_client['activate'] = True
  2046. access_client['unassign'] = True
  2047. product['visibleTransactionFields'] = visible_transaction_fields
  2048. # Status flows.
  2049. for product_transfer_status_flow in product['transferStatusFlows']:
  2050. if product_transfer_status_flow['flow']['id'] in transfer_status_flows:
  2051. product_transfer_status_flow['visible'] = True
  2052. product_transfer_status_flow['editable'] = True
  2053. product['systemAccounts'] = system_accounts
  2054. product['systemToSystemPayments'] = system_to_system_payments
  2055. product['systemToUserPayments'] = system_to_user_payments
  2056. product['chargebackPaymentsToSystem'] = chargeback_of_payments_to_system
  2057. if accessible_user_groups:
  2058. product['userGroupAccessibility'] = 'SPECIFIC'
  2059. product['accessibleUserGroups'] = accessible_user_groups
  2060. if accessible_administrator_groups:
  2061. product['adminGroupAccessibility'] = 'SPECIFIC'
  2062. product['accessibleAdminGroups'] = accessible_administrator_groups
  2063. for profile_field in product['userProfileFields']:
  2064. field = profile_field['profileField']
  2065. if isinstance(field, stringType):
  2066. enable = field in user_profile_fields
  2067. elif isinstance(field, dict):
  2068. enable = field['id'] in user_profile_fields
  2069. profile_field['visible'] = enable
  2070. profile_field['editable'] = enable
  2071. profile_field['userList'] = enable
  2072. profile_field['userKeywords'] = enable
  2073. product['userGroup'] = change_group
  2074. product['userRegistration'] = user_registration
  2075. product['blockedUsersManage'] = blocked_users_manage
  2076. product['disabledUsers'] = disabled_users
  2077. product['removedUsers'] = removed_users
  2078. # Actions possibles sur les mots de passe des autres utilisateurs :
  2079. # le principe est le même que pour les 'passwordActions' sauf que
  2080. # l'on n'active que l'action 'Change'.
  2081. for password_action in product['userPasswordActions']:
  2082. if password_action['passwordType']['internalName'] in user_password_actions:
  2083. password_action['change'] = True
  2084. password_action['atRegistration'] = True
  2085. # password_action['reset'] = True
  2086. # password_action['unblock'] = True
  2087. product['userChannelsAccess'] = user_channels_access
  2088. for token_type in product['userTokenTypes']:
  2089. if token_type['tokenType']['id'] in user_token_types:
  2090. token_type['view'] = True
  2091. token_type['block'] = True
  2092. token_type['unblock'] = True
  2093. token_type['cancel'] = True
  2094. token_type['initialize'] = True
  2095. token_type['personalize'] = True
  2096. token_type['changeDates'] = True
  2097. for access_client in product['userAccessClients']:
  2098. if access_client['accessClientType']['id'] in user_access_clients:
  2099. access_client['view'] = True
  2100. access_client['manage'] = True
  2101. access_client['block'] = True
  2102. access_client['unblock'] = True
  2103. access_client['activate'] = True
  2104. access_client['unassign'] = True
  2105. product['userAccountsAccess'] = access_user_accounts
  2106. product['userPaymentsAsUser'] = payments_as_user_to_user
  2107. product['systemPaymentsAsUser'] = payments_as_user_to_system
  2108. product['selfPaymentsAsUser'] = payments_as_user_to_self
  2109. product['chargebackPaymentsToUser'] = chargeback_of_payments_to_user
  2110. product['userScheduledPayments'] = user_scheduled_payments #['VIEW','CANCEL','PROCESS_INSTALLMENT']
  2111. product['userRecurringPayments'] = user_recurring_payments #['VIEW']
  2112. # Enregistrement du produit modifié
  2113. r = requests.post(network_web_services + 'product/save',
  2114. headers=headers,
  2115. json=product)
  2116. check_request_status(r)
  2117. # TODO factoriser le code de ces 2 fonctions si elles restent telles quelles
  2118. # create_group(nature = 'ADMIN' ou 'MEMBER', name)
  2119. def create_admin_group(name):
  2120. logger.info('Création du groupe Administrateur "%s"...', name)
  2121. r = requests.post(network_web_services + 'group/save',
  2122. headers=headers,
  2123. json={
  2124. 'class': 'org.cyclos.model.users.groups.AdminGroupDTO',
  2125. 'name': name,
  2126. 'internalName': get_internal_name(name),
  2127. 'initialUserStatus': 'ACTIVE',
  2128. 'enabled': True
  2129. })
  2130. check_request_status(r)
  2131. group_id = r.json()['result']
  2132. logger.debug('group_id = %s', group_id)
  2133. add_constant('groups', name, group_id)
  2134. return group_id
  2135. def create_member_group(name,
  2136. initial_user_status='ACTIVE',
  2137. products=[]):
  2138. logger.info('Création du groupe Membre "%s"...', name)
  2139. r = requests.post(network_web_services + 'group/save',
  2140. headers=headers,
  2141. json={
  2142. 'class': 'org.cyclos.model.users.groups.MemberGroupDTO',
  2143. 'name': name,
  2144. 'internalName': get_internal_name(name),
  2145. 'initialUserStatus': initial_user_status,
  2146. 'enabled': True
  2147. })
  2148. check_request_status(r)
  2149. group_id = r.json()['result']
  2150. logger.debug('group_id = %s', group_id)
  2151. add_constant('groups', name, group_id)
  2152. for product_id in products:
  2153. assign_product_to_group(product_id, group_id)
  2154. return group_id
  2155. def change_group_configuration(group_id, configuration_id):
  2156. logger.info("Affectation d'une nouvelle configuration à un groupe...")
  2157. r = requests.post(network_web_services + 'group/changeConfiguration',
  2158. headers=headers,
  2159. json=[group_id, configuration_id])
  2160. check_request_status(r)
  2161. # Gestion interne :
  2162. # Les membres de ce groupe ont accès à l'application de gestion interne.
  2163. # Ils ont aussi accès à Cyclos, où ils ont toutes les permissions, ce
  2164. # qui leur permet d'intervenir au-delà de ce que permet l'application de
  2165. # gestion interne (par exemple pour annuler un paiement).
  2166. ID_GROUPE_GESTION_INTERNE = create_admin_group(
  2167. name='Gestion interne',
  2168. )
  2169. change_group_configuration(ID_GROUPE_GESTION_INTERNE,
  2170. ID_CONFIG_GESTION_INTERNE)
  2171. # Opérateurs BDC :
  2172. # Les membres de ce groupe ont accès à l'application des bureaux de
  2173. # change. Ils ont aussi accès à Cyclos, où ils n'ont que les permissions
  2174. # correspondant aux opérations qu'ils peuvent faire dans l'application
  2175. # BDC (ils ne peuvent rien faire de plus).
  2176. # Un utilisateur est créé dans ce groupe pour chaque bureau de change,
  2177. # et lié à l'utilisateur "Bureau de change" correspondant.
  2178. ID_GROUPE_OPERATEURS_BDC = create_admin_group(
  2179. name='Opérateurs BDC',
  2180. )
  2181. change_group_configuration(ID_GROUPE_OPERATEURS_BDC,
  2182. ID_CONFIG_OPERATEURS_BDC)
  2183. # Anonyme :
  2184. # Ce groupe ne va contenir qu'un utilisateur : l'utilisateur "anonyme"
  2185. # que l'API va utiliser à chaque fois qu'elle devra faire des requêtes
  2186. # sans qu'un "vrai" utilisateur ne soit authentifié (par exemple, lors
  2187. # de la 1ère connexion d'un adhérent à l'application Compte en ligne).
  2188. ID_GROUPE_ANONYME = create_admin_group(
  2189. name='Anonyme',
  2190. )
  2191. # Bureaux de change :
  2192. # Un utilisateur est créé dans ce groupe pour chaque bureau de change
  2193. # (c'est cet utilisateur qui possèdes les comptes du BDC, par contre
  2194. # toutes les opérations sont faites par l'opérateur BDC associé).
  2195. ID_PRODUIT_STOCK_DE_BILLETS_BDC = create_member_product(
  2196. name='Stock de billets BDC',
  2197. my_profile_fields=[
  2198. 'FULL_NAME',
  2199. 'LOGIN_NAME',
  2200. ],
  2201. user_account_type_id=ID_STOCK_DE_BILLETS_BDC,
  2202. )
  2203. ID_PRODUIT_CAISSE_EURO_BDC = create_member_product(
  2204. name='Caisse € BDC',
  2205. user_account_type_id=ID_CAISSE_EURO_BDC,
  2206. )
  2207. ID_PRODUIT_CAISSE_MLC_BDC = create_member_product(
  2208. name='Caisse '+ LOCAL_CURRENCY_INTERNAL_NAME + ' BDC',
  2209. user_account_type_id=ID_CAISSE_CURRENCY_BDC,
  2210. )
  2211. ID_PRODUIT_RETOURS_MLC_BDC = create_member_product(
  2212. name="Retours des " + LOCAL_CURRENCY_INTERNAL_NAME + " BDC",
  2213. user_account_type_id=ID_RETOURS_CURRENCY_BDC,
  2214. )
  2215. ID_GROUPE_BUREAUX_DE_CHANGE = create_member_group(
  2216. name='Bureaux de change',
  2217. products=[
  2218. ID_PRODUIT_STOCK_DE_BILLETS_BDC,
  2219. ID_PRODUIT_CAISSE_EURO_BDC,
  2220. ID_PRODUIT_CAISSE_MLC_BDC,
  2221. ID_PRODUIT_RETOURS_MLC_BDC,
  2222. ]
  2223. )
  2224. # Banques de dépôt.
  2225. ID_PRODUIT_BANQUE_DE_DEPOT = create_member_product(
  2226. name='Banque de dépôt',
  2227. my_profile_fields=[
  2228. 'FULL_NAME',
  2229. 'LOGIN_NAME',
  2230. ],
  2231. user_account_type_id=ID_BANQUE_DE_DEPOT,
  2232. )
  2233. ID_GROUPE_BANQUES_DE_DEPOT = create_member_group(
  2234. name='Banques de dépôt',
  2235. products=[
  2236. ID_PRODUIT_BANQUE_DE_DEPOT,
  2237. ]
  2238. )
  2239. # Comptes dédiés.
  2240. ID_PRODUIT_COMPTE_DEDIE = create_member_product(
  2241. name='Compte dédié',
  2242. my_profile_fields=[
  2243. 'FULL_NAME',
  2244. 'LOGIN_NAME',
  2245. ],
  2246. user_account_type_id=ID_COMPTE_DEDIE,
  2247. )
  2248. ID_GROUPE_COMPTES_DEDIES = create_member_group(
  2249. name='Comptes dédiés',
  2250. products=[
  2251. ID_PRODUIT_COMPTE_DEDIE,
  2252. ]
  2253. )
  2254. # Adhérents : On crée d'abord les 2 groupes car on en a besoin pour
  2255. # définir les permissions (autrement dit pour créer les produits).
  2256. prestataires = 'Adhérents prestataires'
  2257. utilisateurs = 'Adhérents utilisateurs'
  2258. # @WARNING : avant c'etait DISABLED, sûrement parce que le jeu de tests utilisateurs
  2259. # était généré indépendamment de l'environnement (prod / dev / test) --> c'était un FIXME dans init_test_data.py
  2260. # ce problème étant réglé, on peut les autoriser sans crainte par défaut
  2261. ID_GROUPE_ADHERENTS_PRESTATAIRES = create_member_group(
  2262. name=prestataires,
  2263. initial_user_status='DISABLED',
  2264. )
  2265. ID_GROUPE_ADHERENTS_UTILISATEURS = create_member_group(
  2266. name=utilisateurs,
  2267. initial_user_status='DISABLED',
  2268. )
  2269. # Permissions pour les prestataires.
  2270. #On est plus permissif sur les droits d'accès : login / email / numero de compte... quitte à les enlever après
  2271. ID_PRODUIT_ADHERENTS_PRESTATAIRES = create_member_product(
  2272. name=prestataires,
  2273. my_profile_fields=[
  2274. 'FULL_NAME',
  2275. 'LOGIN_NAME',
  2276. 'EMAIL',
  2277. 'ACCOUNT_NUMBER',
  2278. 'ADDRESS'
  2279. ],
  2280. accessible_user_groups=[
  2281. ID_GROUPE_ADHERENTS_PRESTATAIRES,
  2282. ID_GROUPE_ADHERENTS_UTILISATEURS,
  2283. ],
  2284. other_users_profile_fields={
  2285. 'FULL_NAME': True,
  2286. 'LOGIN_NAME': True,
  2287. 'EMAIL': True,
  2288. 'ACCOUNT_NUMBER': True,
  2289. },
  2290. user_account_type_id=ID_COMPTE_ADHERENT,
  2291. dashboard_actions=[
  2292. 'ACCOUNT_INFO',
  2293. 'PAYMENT_USER_TO_USER',
  2294. 'PAYMENT_USER_TO_SYSTEM',
  2295. ],
  2296. password_actions=[
  2297. 'login',
  2298. # 'pin',
  2299. ],
  2300. my_access_clients=[
  2301. ID_CLIENT_POINT_DE_VENTE_NFC,
  2302. ID_CLIENT_SMS,
  2303. ID_CLIENT_MAIN,
  2304. ],
  2305. my_token_types=[
  2306. ID_TOKEN_CARTE_NFC,
  2307. ],
  2308. system_payments=[
  2309. ID_TYPE_PAIEMENT_RECONVERSION_NUMERIQUE,
  2310. ],
  2311. user_payments=[
  2312. ID_TYPE_PAIEMENT_VIREMENT_INTER_ADHERENT,
  2313. ID_TYPE_PAIEMENT_PAIEMENT_PAR_CARTE,
  2314. ID_TYPE_PAIEMENT_PAIEMENT_PAR_SMS,
  2315. ],
  2316. scheduled_payments=[
  2317. 'VIEW',
  2318. 'CANCEL',
  2319. 'PROCESS_INSTALLMENT'
  2320. ],
  2321. recurring_payments=[
  2322. 'VIEW',
  2323. 'CANCEL'
  2324. ],
  2325. receive_payments=[
  2326. ID_TYPE_PAIEMENT_PAIEMENT_PAR_CARTE,
  2327. ],
  2328. )
  2329. assign_product_to_group(ID_PRODUIT_ADHERENTS_PRESTATAIRES,
  2330. ID_GROUPE_ADHERENTS_PRESTATAIRES)
  2331. # Permissions pour les utilisateurs.
  2332. ID_PRODUIT_ADHERENTS_UTILISATEURS = create_member_product(
  2333. name=utilisateurs,
  2334. my_profile_fields=[
  2335. 'FULL_NAME',
  2336. 'LOGIN_NAME',
  2337. 'EMAIL',
  2338. 'ACCOUNT_NUMBER',
  2339. 'ADDRESS'
  2340. ],
  2341. accessible_user_groups=[
  2342. ID_GROUPE_ADHERENTS_PRESTATAIRES,
  2343. ID_GROUPE_ADHERENTS_UTILISATEURS,
  2344. ],
  2345. other_users_profile_fields={
  2346. 'FULL_NAME': True,
  2347. 'LOGIN_NAME': True,
  2348. 'EMAIL': True,
  2349. 'ACCOUNT_NUMBER': True,
  2350. },
  2351. user_account_type_id=ID_COMPTE_ADHERENT,
  2352. dashboard_actions=[
  2353. 'ACCOUNT_INFO',
  2354. 'PAYMENT_USER_TO_USER',
  2355. 'PAYMENT_USER_TO_SYSTEM',
  2356. ],
  2357. password_actions=[
  2358. 'login',
  2359. # 'pin',
  2360. ],
  2361. my_access_clients=[
  2362. ID_CLIENT_SMS,
  2363. ID_CLIENT_MAIN,
  2364. ],
  2365. my_token_types=[
  2366. ID_TOKEN_CARTE_NFC,
  2367. ],
  2368. user_payments=[
  2369. ID_TYPE_PAIEMENT_VIREMENT_INTER_ADHERENT,
  2370. ID_TYPE_PAIEMENT_PAIEMENT_PAR_CARTE,
  2371. ID_TYPE_PAIEMENT_PAIEMENT_PAR_SMS,
  2372. ],
  2373. scheduled_payments=[
  2374. 'VIEW',
  2375. 'CANCEL',
  2376. 'PROCESS_INSTALLMENT'
  2377. ],
  2378. recurring_payments=[
  2379. 'VIEW',
  2380. 'CANCEL'
  2381. ]
  2382. )
  2383. assign_product_to_group(ID_PRODUIT_ADHERENTS_UTILISATEURS,
  2384. ID_GROUPE_ADHERENTS_UTILISATEURS)
  2385. # Produit pour tous les groupes d'utilisateurs qui n'auront pas de
  2386. # compte.
  2387. ID_PRODUIT_UTILISATEURS_BASIQUES_SANS_COMPTE = create_member_product(
  2388. name='Utilisateurs basiques sans compte',
  2389. my_profile_fields=[
  2390. 'FULL_NAME',
  2391. 'LOGIN_NAME',
  2392. ],
  2393. #@WARNING : y'a-t-il un intérêt de proposer une connexion à des utilisateurs sans compte ?
  2394. # password_actions=[
  2395. # 'login',
  2396. # ],
  2397. )
  2398. # Porteurs.
  2399. ID_GROUPE_PORTEURS = create_member_group(
  2400. name='Porteurs',
  2401. products=[
  2402. ID_PRODUIT_UTILISATEURS_BASIQUES_SANS_COMPTE,
  2403. ]
  2404. )
  2405. # Adhérents sans compte.
  2406. ID_GROUPE_ADHERENTS_SANS_COMPTE = create_member_group(
  2407. name='Adhérents sans compte',
  2408. initial_user_status='DISABLED',
  2409. products=[
  2410. ID_PRODUIT_UTILISATEURS_BASIQUES_SANS_COMPTE,
  2411. ]
  2412. )
  2413. all_user_groups = [
  2414. ID_GROUPE_BUREAUX_DE_CHANGE,
  2415. ID_GROUPE_BANQUES_DE_DEPOT,
  2416. ID_GROUPE_COMPTES_DEDIES,
  2417. ID_GROUPE_ADHERENTS_PRESTATAIRES,
  2418. ID_GROUPE_ADHERENTS_UTILISATEURS,
  2419. ID_GROUPE_PORTEURS,
  2420. ID_GROUPE_ADHERENTS_SANS_COMPTE,
  2421. ]
  2422. # Définition des permissions.
  2423. # Il faut faire ça en dernier car nous avons besoin de tous les objets
  2424. # créés auparavant.
  2425. #
  2426. ## Permissions pour le groupe "Administrateurs réseaux":
  2427. def get_group_id(web_services, name, nature):
  2428. r = requests.post(web_services + 'group/search',
  2429. headers=headers,
  2430. json={
  2431. 'name': name,
  2432. 'natures': nature,
  2433. })
  2434. check_request_status(r)
  2435. groups = r.json()['result']['pageItems']
  2436. for group in groups:
  2437. if group['name'] == name:
  2438. return group['id']
  2439. return None;
  2440. ID_GROUPE_NETWORK_ADMINS = get_group_id(
  2441. network_web_services,
  2442. 'Network administrators' ,
  2443. 'ADMIN_GROUP'
  2444. )
  2445. set_admin_group_permissions(
  2446. group_id=ID_GROUPE_NETWORK_ADMINS,
  2447. my_profile_fields=[
  2448. 'FULL_NAME',
  2449. 'LOGIN_NAME',
  2450. 'EMAIL',
  2451. 'ACCOUNT_NUMBER',
  2452. 'ADDRESS',
  2453. ],
  2454. password_actions=[
  2455. 'login',
  2456. ],
  2457. visible_transaction_fields=[],#all_transaction_fields,
  2458. my_access_clients = [ID_CLIENT_MAIN],
  2459. transfer_status_flows=[],#all_status_flows,
  2460. system_accounts=all_system_accounts,
  2461. system_to_system_payments=[ ID_TYPE_PAIEMENT_ENTREE_COFFRE_NUMERIQUE,ID_TYPE_PAIEMENT_SORTIE_COFFRE_NUMERIQUE ],#all_system_to_system_payments,
  2462. system_to_user_payments=all_system_to_user_payments,
  2463. chargeback_of_payments_to_system=all_payments_to_system,
  2464. accessible_user_groups=[
  2465. ID_GROUPE_ADHERENTS_PRESTATAIRES,
  2466. ID_GROUPE_ADHERENTS_UTILISATEURS
  2467. ], #all_user_groups,
  2468. accessible_administrator_groups=[
  2469. ID_GROUPE_NETWORK_ADMINS,
  2470. ],
  2471. user_profile_fields=[
  2472. 'FULL_NAME',
  2473. 'LOGIN_NAME',
  2474. 'EMAIL',
  2475. 'ACCOUNT_NUMBER',
  2476. 'ADDRESS',
  2477. # ID_CHAMP_PERSO_UTILISATEUR_BDC,
  2478. ],
  2479. change_group='MANAGE',
  2480. user_registration=True,
  2481. blocked_users_manage=True,
  2482. disabled_users='MANAGE',
  2483. removed_users='MANAGE',
  2484. user_password_actions=[
  2485. 'login',
  2486. # 'pin',
  2487. ],
  2488. user_channels_access='MANAGE',
  2489. user_token_types=[],#all_token_types,
  2490. user_access_clients=all_access_clients,
  2491. access_user_accounts=all_user_accounts,
  2492. payments_as_user_to_user=all_user_to_user_payments,
  2493. payments_as_user_to_system=all_user_to_system_payments,
  2494. payments_as_user_to_self=[],#all_user_to_self_payments,
  2495. user_scheduled_payments = ['VIEW','CANCEL','PROCESS_INSTALLMENT'],
  2496. user_recurring_payments = ['VIEW'],
  2497. chargeback_of_payments_to_user=all_payments_to_user
  2498. )
  2499. # Permissions pour le groupe "Gestion interne":
  2500. set_admin_group_permissions(
  2501. group_id=ID_GROUPE_GESTION_INTERNE,
  2502. my_profile_fields=[
  2503. 'FULL_NAME',
  2504. 'LOGIN_NAME',
  2505. ],
  2506. password_actions=[
  2507. 'login',
  2508. ],
  2509. visible_transaction_fields=all_transaction_fields,
  2510. transfer_status_flows=all_status_flows,
  2511. system_accounts=all_system_accounts,
  2512. system_to_system_payments=all_system_to_system_payments,
  2513. system_to_user_payments=all_system_to_user_payments,
  2514. chargeback_of_payments_to_system=all_payments_to_system,
  2515. accessible_user_groups=all_user_groups,
  2516. accessible_administrator_groups=[
  2517. ID_GROUPE_OPERATEURS_BDC,
  2518. ID_GROUPE_GESTION_INTERNE,
  2519. ],
  2520. user_profile_fields=[
  2521. 'FULL_NAME',
  2522. 'LOGIN_NAME',
  2523. 'ACCOUNT_NUMBER',
  2524. 'EMAIL',
  2525. ID_CHAMP_PERSO_UTILISATEUR_BDC,
  2526. ],
  2527. change_group='MANAGE',
  2528. user_registration=True,
  2529. blocked_users_manage=True,
  2530. disabled_users='MANAGE',
  2531. removed_users='MANAGE',
  2532. user_password_actions=[
  2533. 'login',
  2534. # 'pin',
  2535. ],
  2536. user_token_types=all_token_types,
  2537. user_access_clients=all_access_clients,
  2538. access_user_accounts=all_user_accounts,
  2539. payments_as_user_to_user=all_user_to_user_payments,
  2540. payments_as_user_to_system=all_user_to_system_payments,
  2541. payments_as_user_to_self=all_user_to_self_payments,
  2542. chargeback_of_payments_to_user=all_payments_to_user
  2543. )
  2544. # Permissions pour le groupe "Opérateurs BDC":
  2545. set_admin_group_permissions(
  2546. group_id=ID_GROUPE_OPERATEURS_BDC,
  2547. my_profile_fields=[
  2548. 'FULL_NAME',
  2549. 'LOGIN_NAME',
  2550. ID_CHAMP_PERSO_UTILISATEUR_BDC,
  2551. ],
  2552. password_actions=[
  2553. 'login',
  2554. ],
  2555. visible_transaction_fields=all_transaction_fields,
  2556. transfer_status_flows=[
  2557. ID_STATUS_FLOW_RAPPROCHEMENT,
  2558. ID_STATUS_FLOW_REMISE_A_ASSO,
  2559. ],
  2560. system_accounts=[
  2561. ID_COMPTE_DE_TRANSIT,
  2562. ID_COMPTE_DES_BILLETS_EN_CIRCULATION,
  2563. ID_COMPTE_DE_DEBIT_EURO,
  2564. ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  2565. ],
  2566. system_to_user_payments=[
  2567. ID_TYPE_PAIEMENT_ENTREE_STOCK_BDC,
  2568. ID_TYPE_PAIEMENT_CHANGE_BILLETS_VERSEMENT_DES_EUROS,
  2569. ID_TYPE_PAIEMENT_RECONVERSION_BILLETS,
  2570. ID_TYPE_PAIEMENT_COTISATION_EN_EURO,
  2571. ID_TYPE_PAIEMENT_COTISATION_EN_MLC,
  2572. ID_TYPE_PAIEMENT_VENTE_EN_EURO,
  2573. ID_TYPE_PAIEMENT_VENTE_EN_MLC,
  2574. ID_TYPE_PAIEMENT_REGUL_DEPOT_INSUFFISANT,
  2575. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_BDC,
  2576. ID_TYPE_PAIEMENT_DEPOT_DE_BILLETS,
  2577. ID_TYPE_PAIEMENT_CREDIT_DU_COMPTE,
  2578. ],
  2579. accessible_user_groups=all_user_groups,
  2580. accessible_administrator_groups=[
  2581. ID_GROUPE_OPERATEURS_BDC,
  2582. ],
  2583. user_profile_fields=[
  2584. 'FULL_NAME',
  2585. 'LOGIN_NAME',
  2586. 'ACCOUNT_NUMBER',
  2587. 'EMAIL',
  2588. ],
  2589. user_registration=True,
  2590. # disabled_users='VIEW',
  2591. access_user_accounts=[
  2592. ID_STOCK_DE_BILLETS_BDC,
  2593. ID_CAISSE_EURO_BDC,
  2594. ID_CAISSE_CURRENCY_BDC,
  2595. ID_RETOURS_CURRENCY_BDC,
  2596. ID_BANQUE_DE_DEPOT,
  2597. ID_COMPTE_ADHERENT,
  2598. ],
  2599. payments_as_user_to_user=[
  2600. ID_TYPE_PAIEMENT_DEPOT_EN_BANQUE,
  2601. ID_TYPE_PAIEMENT_BANQUE_VERS_CAISSE_EURO_BDC,
  2602. ID_TYPE_PAIEMENT_CAISSE_EURO_BDC_VERS_BANQUE,
  2603. ],
  2604. payments_as_user_to_system=[
  2605. ID_TYPE_PAIEMENT_SORTIE_STOCK_BDC,
  2606. ID_TYPE_PAIEMENT_SORTIE_CAISSE_CURRENCY_BDC,
  2607. ID_TYPE_PAIEMENT_SORTIE_RETOURS_CURRENCY_BDC,
  2608. ID_TYPE_PAIEMENT_REGUL_DEPOT_EXCESSIF,
  2609. ID_TYPE_PAIEMENT_REMISE_EUROS_EN_CAISSE,
  2610. ID_TYPE_PAIEMENT_BANQUE_VERS_COMPTE_DE_DEBIT,
  2611. ID_TYPE_PAIEMENT_RETRAIT_DE_BILLETS,
  2612. ID_TYPE_PAIEMENT_RETRAIT_DU_COMPTE,
  2613. ],
  2614. )
  2615. # Permissions pour le groupe "Anonyme":
  2616. set_admin_group_permissions(
  2617. group_id=ID_GROUPE_ANONYME,
  2618. my_profile_fields=[
  2619. 'FULL_NAME',
  2620. 'LOGIN_NAME',
  2621. ],
  2622. password_actions=[
  2623. 'login',
  2624. ],
  2625. visible_transaction_fields=[
  2626. ID_CHAMP_PERSO_PAIEMENT_NUMERO_TRANSACTION_BANQUE,
  2627. ],
  2628. system_accounts=[
  2629. ID_COMPTE_DE_DEBIT_EURO,
  2630. ID_COMPTE_DE_DEBIT_CURRENCY_NUMERIQUE,
  2631. ],
  2632. system_to_user_payments=[
  2633. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_LIGNE_VERSEMENT_DES_EUROS,
  2634. ID_TYPE_PAIEMENT_CHANGE_NUMERIQUE_EN_LIGNE_VERSEMENT_DES_MLC,
  2635. ID_TYPE_PAIEMENT_CREDIT_DU_COMPTE
  2636. ],
  2637. access_user_accounts=[ID_COMPTE_ADHERENT],
  2638. accessible_user_groups=[
  2639. ID_GROUPE_ADHERENTS_PRESTATAIRES,
  2640. ID_GROUPE_ADHERENTS_UTILISATEURS,
  2641. ID_GROUPE_ADHERENTS_SANS_COMPTE,
  2642. ],
  2643. user_profile_fields=[
  2644. 'ACCOUNT_NUMBER',
  2645. ],
  2646. # change_group='MANAGE',
  2647. disabled_users='MANAGE',
  2648. user_scheduled_payments = ['VIEW'],
  2649. user_recurring_payments = ['VIEW'],
  2650. # user_password_actions=[
  2651. # 'login',
  2652. # ],
  2653. )
  2654. ########################################################################
  2655. # Création des utilisateurs pour les comptes dédiés.
  2656. #
  2657. def create_user(group, name, login, password=None):
  2658. logger.info('Création de l\'utilisateur "%s"...', name)
  2659. json_query={
  2660. 'group': group,
  2661. 'name': name,
  2662. 'username': login,
  2663. 'skipActivationEmail': True,
  2664. }
  2665. if password != None:
  2666. json_query[0]['passwords'] = {
  2667. 'assign': True ,
  2668. 'type': 'login',
  2669. 'value': password,
  2670. 'confirmationValue': password
  2671. }
  2672. r = requests.post(network_web_services + 'user/register',
  2673. headers=headers,
  2674. json=json_query
  2675. )
  2676. check_request_status(r)
  2677. user_id = r.json()['result']['user']['id']
  2678. logger.debug('user_id = %s', user_id)
  2679. add_constant('users', name, user_id)
  2680. return user_id
  2681. create_user(
  2682. group=ID_GROUPE_COMPTES_DEDIES,
  2683. name='Compte dédié ' + LOCAL_CURRENCY_INTERNAL_NAME +' billet',
  2684. login='CD_BILLET',
  2685. )
  2686. create_user(
  2687. group=ID_GROUPE_COMPTES_DEDIES,
  2688. name='Compte dédié ' + LOCAL_CURRENCY_INTERNAL_NAME +' numérique',
  2689. login='CD_NUMERIQUE',
  2690. )
  2691. ########################################################################
  2692. # Récupération de la liste des types de mot de passe.
  2693. r = requests.get(network_web_services + 'passwordType/list',
  2694. headers=headers)
  2695. for passwordType in r.json()['result']:
  2696. add_constant('password_types', passwordType['name'], passwordType['id'])
  2697. ########################################################################
  2698. # On écrit dans un fichier toutes les constantes nécessaires à l'API,
  2699. # après les avoir triées.
  2700. logger.debug('Constantes :\n%s', constants_by_category)
  2701. constants_file = open('cyclos_constants_' + ENV +'.yml', 'w')
  2702. for category in sorted(constants_by_category.keys()):
  2703. constants_file.write(category + ':\n')
  2704. constants = constants_by_category[category]
  2705. for name in sorted(constants.keys()):
  2706. constants_file.write(' ' + name + ': ' + constants[name] + '\n')
  2707. constants_file.close()