diff --git a/back/infolica/routes.py b/back/infolica/routes.py index 8cce2cb3..baf4ec34 100644 --- a/back/infolica/routes.py +++ b/back/infolica/routes.py @@ -35,6 +35,7 @@ def includeme(config): config.add_route('affaire_attribution_change_state', '/infolica/api/affaire_attribution_change_state') config.add_route('loadfile_bf_rp', '/infolica/api/loadfile_bf_rp') config.add_route('save_bf_rp', '/infolica/api/save_bf_rp') + config.add_route('activer_affaire', '/infolica/api/activer_affaire') #Factures config.add_route('factures', '/infolica/api/factures') config.add_route('factures_s', '/infolica/api/factures/') @@ -114,6 +115,7 @@ def includeme(config): config.add_route('etapes_s','/infolica/api/etapes/') config.add_route('etapes_index','/infolica/api/etapes_index') config.add_route('etapes_index_s','/infolica/api/etapes_index/') + config.add_route('etapes_index_by_affaire_id','/infolica/api/etape_index_by_affaire_id') config.add_route('affaire_etapes_by_affaire_id','/infolica/api/affaire_etapes/{id}') config.add_route('controle_etape','/infolica/api/controle_etape') #Numeros affaires diff --git a/back/infolica/scripts/utils.py b/back/infolica/scripts/utils.py index 18ce06b4..15f17fbd 100644 --- a/back/infolica/scripts/utils.py +++ b/back/infolica/scripts/utils.py @@ -4,7 +4,7 @@ from sqlalchemy import String from sqlalchemy.sql.expression import cast from infolica.models.models import Preavis, PreavisRemarque, Plan -from infolica.models.models import Numero, AffaireNumero +from infolica.models.models import Numero, AffaireNumero, AffaireEtape from infolica.models.models import Role, ReservationNumerosMO, Operateur from infolica.scripts.authentication import get_user_functions, check_connected @@ -366,5 +366,29 @@ def generate_file_from_template(cls, request, template, data, output_file_name, doc.save(file_path) return filename + + + @classmethod + def newAffaireEtape(cls, request, affaire_id, etape_id, remarque=None, operateur_id=None, datetime_=None): + + if datetime_ is None: + datetime_ = datetime.now() + + if operateur_id is None: + operateur_id = cls.getOperateurFromUser(request).id, + + params = Utils._params( + affaire_id = affaire_id, + etape_id = etape_id, + operateur_id = operateur_id, + datetime = datetime_, + remarque = remarque + ) + + record = AffaireEtape() + record = Utils.set_model_record(record, params) + request.dbsession.add(record) + + return \ No newline at end of file diff --git a/back/infolica/views/affaire.py b/back/infolica/views/affaire.py index 6af9e8f3..9d28e0f0 100644 --- a/back/infolica/views/affaire.py +++ b/back/infolica/views/affaire.py @@ -9,6 +9,7 @@ from infolica.models.models import ModificationAffaire, VAffaire, Facture, Client from infolica.models.models import ControleGeometre, ControleMutation, ControlePPE, SuiviMandat from infolica.models.models import AffaireEtape, AffaireEtapeIndex, Preavis +from infolica.models.models import AffaireNumero, Numero, NumeroEtatHisto, NumeroRelation from infolica.scripts.mail_templates import MailTemplates from infolica.scripts.utils import Utils from infolica.scripts.authentication import check_connected @@ -848,3 +849,83 @@ def guichet_rf_saisie_pm_view(request): } return result + + +def _reopen_affaire(request, affaire_id): + affaire = request.dbsession.query(Affaire).filter(Affaire.id == affaire_id).first() + + affaire.date_envoi = None + affaire.date_cloture = None + affaire.date_validation = None + affaire.abandon = False + affaire.urgent = False + affaire.urgent_echeance = None + affaire.attribution = None + + return + + +def _reinitialiser_etat_numero(request, affaire_id, numeros_type_id, nouvel_etat_id): + # numéros + numeros = request.dbsession.query(Numero).join( + AffaireNumero, AffaireNumero.numero_id == Numero.id + ).filter( + AffaireNumero.affaire_id == affaire_id, + AffaireNumero.type_id == numeros_type_id + ).all() + + for num in numeros: + num.etat_id = nouvel_etat_id + + neh = NumeroEtatHisto() + neh.numero_id = num.id + neh.numero_etat_id = nouvel_etat_id + neh.date = datetime.strftime(datetime.now(), '%Y-%m-%d') + request.dbsession.add(neh) + + return + + +def _remove_balance(request, affaire_id): + nr = request.dbsession.query(NumeroRelation).filter(NumeroRelation.affaire_id == affaire_id).all() + for num_rel_i in nr: + request.dbsession.delete(num_rel_i) + return + + +@view_config(route_name='activer_affaire', request_method='POST', renderer='json') +def activer_affaire_view(request): + """ + Re-activate affaire + """ + # Check connected + if not check_connected(request): + raise exc.HTTPForbidden() + + affaire_id = request.params['affaire_id'] if 'affaire_id' in request.params else None + etape_id = request.params['etape_id'] if 'etape_id' in request.params else None + + if affaire_id is None or etape_id is None: + exc.HTTPBadRequest('Il manque un paramètre à la requête (affaire_id et etape_id).') + + ### Affaire + _reopen_affaire(request, affaire_id) + + ### Numéros + affaire_numero_type_ancien_id = request.registry.settings['affaire_numero_type_ancien_id'] + affaire_numero_type_nouveau_id = request.registry.settings['affaire_numero_type_nouveau_id'] + numero_projet_id = request.registry.settings['numero_projet_id'] + numero_vigueur_id = request.registry.settings['numero_vigueur_id'] + # anciens numéros + _reinitialiser_etat_numero(request, affaire_id, numeros_type_id=affaire_numero_type_nouveau_id, nouvel_etat_id=numero_projet_id) + + # Nouveaux numéros + _reinitialiser_etat_numero(request, affaire_id, numeros_type_id=affaire_numero_type_ancien_id, nouvel_etat_id=numero_vigueur_id) + + # Effacer la balance + _remove_balance(request, affaire_id) + + # set new affaire_etape + Utils.newAffaireEtape(request, affaire_id, etape_id, remarque="RÉACTIVATION DE L'AFFAIRE") + + return exc.HTTPOk('Affaire réactivée avec succès. L''état des numéros liés à l''affaire a été réinitialisé.' ) diff --git a/back/infolica/views/affaire_etape.py b/back/infolica/views/affaire_etape.py index 12367d8b..c332d4d3 100644 --- a/back/infolica/views/affaire_etape.py +++ b/back/infolica/views/affaire_etape.py @@ -9,7 +9,7 @@ from infolica.exceptions.custom_error import CustomError from infolica.models.constant import Constant from infolica.models.models import AffaireEtape, AffaireEtapeIndex, VEtapesAffaires -from infolica.models.models import Affaire, VAffaire, Facture +from infolica.models.models import Affaire, VAffaire, AffaireType, Facture from infolica.scripts.mail_templates import MailTemplates from infolica.scripts.utils import Utils from infolica.scripts.authentication import check_connected @@ -18,6 +18,53 @@ ########################################################### # ETAPES AFFAIRE ########################################################### +@view_config(route_name='etapes_index_by_affaire_id', request_method='GET', renderer='json') +def etape_index_by_affaire_id_view(request): + """ + GET etape index by affaire_id + """ + # Check connected + if not check_connected(request): + raise exc.HTTPForbidden() + + affaire_id = request.params['affaire_id'] if 'affaire_id' in request.params else None + + if affaire_id is None: + raise exc.HTTPBadRequest(detail="Aucun index spécifié") + + etape = request.dbsession.query( + AffaireEtapeIndex + ).join( + AffaireEtape, AffaireEtape.etape_id == AffaireEtapeIndex.id + ).filter( + AffaireEtape.affaire_id == affaire_id, + AffaireEtapeIndex.ordre != None + ).order_by(AffaireEtape.datetime.desc()).limit(1).first() + + # get next step id + logique_processus = request.dbsession.query( + AffaireType.logique_processus + ).join( + Affaire, Affaire.type_id == AffaireType.id + ).filter( + Affaire.id == affaire_id + ).scalar() + + next_step_id = None + if logique_processus is not None and etape.id in logique_processus: + idx = logique_processus.index(etape.id) + + if idx < len(logique_processus)-1: + next_step_id = logique_processus[idx + 1] + + data = { + 'etape': etape.nom if etape is not None else None, + 'predicted_next_step_id': next_step_id + } + + return data + + @view_config(route_name='etapes_index', request_method='GET', renderer='json') @view_config(route_name='etapes_index_s', request_method='GET', renderer='json') def etapes_index_view(request): diff --git a/front/.env b/front/.env index f6f5b09a..e407a80d 100644 --- a/front/.env +++ b/front/.env @@ -79,6 +79,7 @@ VUE_APP_MODIFICATION_AFFAIRE_BY_AFFAIRE_FILLE_ENDPOINT = "/modification_affaire_ VUE_APP_AFFAIRES_COCKPIT_ENDPOINT = "/affaires_cockpit" VUE_APP_ABANDON_AFFAIRE_REOUVERTURE_AFFAIRE_PARENT_ENDPOINT = "/abandon_affaire_reopen_parent_affaire" VUE_APP_AFFAIRE_ATTRIBUTION_CHANGE_STATE_ENDPOINT = "/affaire_attribution_change_state" +VUE_APP_ACTIVATE_AFFAIRE_ENDPOINT = "/activer_affaire" #Preavis VUE_APP_PREAVIS_ENDPOINT = "/preavis" @@ -111,6 +112,7 @@ VUE_APP_EXPORT_EMOLUMENTS_PDF_ENDPOINT = "/export_emoluments_pdf" #Etapes de l'affaire VUE_APP_ETAPES_INDEX_ENDPOINT = "/etapes_index/" +VUE_APP_ETAPE_INDEX_BY_AFFAIRE_ID_ENDPOINT = "/etape_index_by_affaire_id" #Numéros relations VUE_APP_NUMERO_RELATIONS_BASE_ENDPOINT = "/numero_base_relations/" diff --git a/front/src/components/Affaires/ActivationAffaire/ActivationAffaire.vue b/front/src/components/Affaires/ActivationAffaire/ActivationAffaire.vue index b9ac31ac..f802a0b5 100644 --- a/front/src/components/Affaires/ActivationAffaire/ActivationAffaire.vue +++ b/front/src/components/Affaires/ActivationAffaire/ActivationAffaire.vue @@ -1,3 +1,4 @@ + // PROCESSUS @@ -5,7 +6,8 @@ \ No newline at end of file diff --git a/front/src/components/Affaires/ActivationAffaire/activationAffaire.css b/front/src/components/Affaires/ActivationAffaire/activationAffaire.css new file mode 100644 index 00000000..1c700d68 --- /dev/null +++ b/front/src/components/Affaires/ActivationAffaire/activationAffaire.css @@ -0,0 +1,4 @@ +.activationAffaireDialog .md-dialog-container { + min-width: 750px; + width: 750px; +} diff --git a/front/src/components/Affaires/ActivationAffaire/activationAffaire.html b/front/src/components/Affaires/ActivationAffaire/activationAffaire.html index 61429d52..91e697bb 100644 --- a/front/src/components/Affaires/ActivationAffaire/activationAffaire.html +++ b/front/src/components/Affaires/ActivationAffaire/activationAffaire.html @@ -1,40 +1,27 @@
- + Réactivation de l'affaire + + +

+ En confirmant, les opérations suivantes seront réalisées: +

    +
  • Les dates d'envoi, clôture et de validation de l'affaire seront effacées,
  • +
  • l'affaire sera renvoyée à l'étape précisée ci-dessous,
  • +
  • les biens-fonds réservés dans l'affaire redeviendront à l'état "projet" et ceux liés à l'affaire à l'état "validé",
  • +
  • la balance et les relations entre les numéros (DDP, PPE, PCOP) de l'affaire seront effacées
  • +
+

+
+ +
- + Annuler - Confirmer + Confirmer
- - - -
\ No newline at end of file diff --git a/front/src/components/Utils/NewStepSetter/NewStepSetter.vue b/front/src/components/Utils/NewStepSetter/NewStepSetter.vue new file mode 100644 index 00000000..9ef08029 --- /dev/null +++ b/front/src/components/Utils/NewStepSetter/NewStepSetter.vue @@ -0,0 +1,63 @@ + + + + + + diff --git a/front/src/components/Utils/NewStepSetter/newStepSetter.css b/front/src/components/Utils/NewStepSetter/newStepSetter.css new file mode 100644 index 00000000..f56680a0 --- /dev/null +++ b/front/src/components/Utils/NewStepSetter/newStepSetter.css @@ -0,0 +1,3 @@ +#newStepSetter .inputWidth { + width: 280px !important; +} \ No newline at end of file diff --git a/front/src/components/Utils/NewStepSetter/newStepSetter.html b/front/src/components/Utils/NewStepSetter/newStepSetter.html new file mode 100644 index 00000000..1cc6066d --- /dev/null +++ b/front/src/components/Utils/NewStepSetter/newStepSetter.html @@ -0,0 +1,23 @@ +
+
+
+ + + + + +
+ +

=>

+ +
+ + + + + {{ item.nom }} + + +
+
+