Merge branch 'develop' of github.com:sgmap/tps into develop

Conflicts:
	db/schema.rb
This commit is contained in:
Tanguy PATTE 2016-01-20 15:50:13 +01:00
commit f75f0e26d6
80 changed files with 694 additions and 650 deletions

View file

@ -24,5 +24,4 @@
//= require concavehull.min
//= require graham_scan.min
//= require leaflet.freedraw
//= require smart_listing
//= require franceconnect_kit
//= require smart_listing

View file

@ -0,0 +1,61 @@
function cadastre_active() {
return $("#map.cadastre").length > 0
}
function get_cadastre(coordinates) {
if (!cadastre_active())
return;
var cadastre;
$.ajax({
method: 'post',
url: '/users/dossiers/' + dossier_id + '/carte/cadastre',
data: {coordinates: JSON.stringify(coordinates)},
dataType: 'json',
async: false
}).done(function (data) {
cadastre = data
});
return cadastre['cadastres'];
}
function display_cadastre(cadastre_list) {
if (!cadastre_active())
return;
cadastre_array = cadastre_list;
$("#cadastre.list ul").html('');
new_cadastreLayer();
if (cadastre_array.length > 0) {
cadastre_array.forEach(function (cadastre) {
$("#cadastre.list ul").append('<li> Parcelle n°' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '</li>');
cadastreItems.addData(cadastre.geometry);
});
cadastreItems.setStyle({
fillColor: '#8a6d3b',
weight: 2,
opacity: 0.3,
color: 'white',
dashArray: '3',
fillOpacity: 0.7
})
}
else
$("#cadastre.list ul").html('<li>AUCUN</li>');
}
function new_cadastreLayer() {
if (typeof cadastreItems != 'undefined')
map.removeLayer(cadastreItems);
cadastreItems = new L.GeoJSON();
cadastreItems.addTo(map);
}

View file

@ -8,22 +8,27 @@ function initCarto() {
position = get_position() || default_position();
if (position.lon == "0" && position.lat == "0")
position = default_position();
if (typeof position.zoom == 'undefined')
position.zoom = 13;
map = L.map("map", {
center: new L.LatLng(position.lat, position.lon),
zoom: position.zoom,
layers: [OSM]
});
if (qp_active())
display_qp(JSON.parse($("#quartier_prioritaires").val()));
if (cadastre_active())
display_cadastre(JSON.parse($("#cadastres").val()));
freeDraw = new L.FreeDraw();
freeDraw.options.setSmoothFactor(4);
freeDraw.options.simplifyPolygon = false;
map.addLayer(freeDraw);
if ($("#json_latlngs").val() != '' && $("#json_latlngs").val() != '[]') {
map.setZoom(18);
$.each($.parseJSON($("#json_latlngs").val()), function (i, val) {
freeDraw.createPolygon(val);
});
@ -34,21 +39,26 @@ function initCarto() {
map.setView(new L.LatLng(position.lat, position.lon), 5);
add_event_freeDraw();
if (qp_active())
display_qp(JSON.parse($("#quartier_prioritaires").val()));
}
function default_position (){
return {lon: LON, lat: LAT, zoom: 13}
}
function get_external_data (latLngs){
if (qp_active())
display_qp(get_qp(latLngs));
if (cadastre_active())
display_cadastre(get_cadastre(latLngs));
}
function add_event_freeDraw() {
freeDraw.on('markers', function (e) {
$("#json_latlngs").val(JSON.stringify(e.latLngs));
if (qp_active())
display_qp(get_qp(e.latLngs));
get_external_data(e.latLngs);
});
$("#new").on('click', function (e) {
@ -73,63 +83,12 @@ function get_position() {
async: false
}).done(function (data) {
position = data
position.zoom = default_position().zoom
});
return position;
}
function qp_active() {
return $("#map.qp").length > 0
}
function get_qp(coordinates) {
if (!qp_active())
return;
var qp;
$.ajax({
method: 'post',
url: '/users/dossiers/' + dossier_id + '/carte/qp',
data: {coordinates: JSON.stringify(coordinates)},
dataType: 'json',
async: false
}).done(function (data) {
qp = data
});
return qp['quartier_prioritaires'];
}
function display_qp(qp_list) {
if (!qp_active())
return;
qp_array = jsObject_to_array(qp_list);
$("#qp_list ul").html('');
new_qpLayer();
if (qp_array.length > 0) {
qp_array.forEach(function (qp) {
$("#qp_list ul").append('<li>' + qp.commune + ' : ' + qp.nom + '</li>');
qpItems.addData(qp.geometry);
});
}
else
$("#qp_list ul").html('<li>AUCUN</li>');
}
function new_qpLayer() {
if (typeof qpItems != 'undefined')
map.removeLayer(qpItems);
qpItems = new L.GeoJSON();
qpItems.addTo(map);
}
function jsObject_to_array(qp_list) {
return Object.keys(qp_list).map(function (v) {
return qp_list[v];

View file

@ -0,0 +1,60 @@
function qp_active() {
return $("#map.qp").length > 0
}
function get_qp(coordinates) {
if (!qp_active())
return;
var qp;
$.ajax({
method: 'post',
url: '/users/dossiers/' + dossier_id + '/carte/qp',
data: {coordinates: JSON.stringify(coordinates)},
dataType: 'json',
async: false
}).done(function (data) {
qp = data
});
return qp['quartier_prioritaires'];
}
function display_qp(qp_list) {
if (!qp_active())
return;
qp_array = jsObject_to_array(qp_list);
$("#qp.list ul").html('');
new_qpLayer();
if (qp_array.length > 0) {
qp_array.forEach(function (qp) {
$("#qp.list ul").append('<li>' + qp.commune + ' : ' + qp.nom + '</li>');
qpItems.addData(qp.geometry);
});
qpItems.setStyle({
fillColor: '#31708f',
weight: 2,
opacity: 0.3,
color: 'white',
dashArray: '3',
fillOpacity: 0.7
})
}
else
$("#qp.list ul").html('<li>AUCUN</li>');
}
function new_qpLayer() {
if (typeof qpItems != 'undefined')
map.removeLayer(qpItems);
qpItems = new L.GeoJSON();
qpItems.addTo(map);
}

View file

@ -2,132 +2,6 @@ $(document).on('page:load', franceconnect_kit);
$(document).ready(franceconnect_kit);
function franceconnect_kit() {
init_franceconnect_kit();
//franceConnectKit.init();
}
var fconnect = {
tracesUrl: '/traces',
aboutUrl: ''
};
function init_franceconnect_kit() {
initCurrentHostnameSource();
includeFCCss();
var fconnectProfile = document.getElementById('fconnect-profile');
if (fconnectProfile) {
var fcLogoutUrl = fconnectProfile.getAttribute('data-fc-logout-url');
var access = createFCAccessElement(fcLogoutUrl);
fconnectProfile.parentNode.appendChild(access);
fconnectProfile.onclick = toogleElement.bind(access);
}
}
function initCurrentHostnameSource() {
var currentScript = 'https://fcp.integ01.dev-franceconnect.fr/js/franceconnect.js';
var parseUrl = currentScript.split('/');
fconnect.currentHost = parseUrl[2];
}
function includeFCCss() {
var linkCss = document.createElement('link');
linkCss.rel = 'stylesheet';
linkCss.href = '//' + fconnect.currentHost + '/stylesheets/franceconnect.css';
linkCss.type = 'text/css';
linkCss.media = 'screen';
document.getElementsByTagName('head')[0].appendChild(linkCss);
}
function toogleElement(event) {
event.preventDefault();
if (this.style.display === "block") {
this.style.display = "none";
} else {
this.style.display = "block";
}
}
function closeFCPopin(event) {
event.preventDefault();
fconnect.popin.className = 'fade-out';
setTimeout(function() {
document.body.removeChild(fconnect.popin);
}, 200);
}
function openFCPopin() {
fconnect.popin = document.createElement('div');
fconnect.popin.id = 'fc-background';
var iframe = createFCIframe();
document.body.appendChild(fconnect.popin);
fconnect.popin.appendChild(iframe);
setTimeout(function() {
fconnect.popin.className = 'fade-in';
}, 200);
}
function createFCIframe() {
var iframe = document.createElement("iframe");
iframe.setAttribute('id', 'fconnect-iframe');
iframe.frameBorder = 0;
iframe.name = 'fconnect-iframe';
return iframe;
}
function createFCAccessElement(logoutUrl) {
var access = document.createElement('div');
access.id = 'fconnect-access';
access.innerHTML = '<h5>Vous êtes identifié grâce à FranceConnect</h5>';
access.appendChild(createAboutLink());
access.appendChild(document.createElement('hr'));
access.appendChild(createHistoryLink());
access.appendChild(createLogoutElement(logoutUrl));
return access;
}
function createHistoryLink() {
var historyLink = document.createElement('a');
historyLink.target = 'fconnect-iframe';
historyLink.href = '//' + fconnect.currentHost + fconnect.tracesUrl;
historyLink.onclick = openFCPopin;
historyLink.innerHTML = 'Historique des connexions/échanges de données';
return historyLink;
}
function createAboutLink() {
var aboutLink = document.createElement('a');
aboutLink.href = fconnect.aboutUrl ? '//' + fconnect.currentHost + fconnect.aboutUrl : '#';
if (fconnect.aboutUrl) {
aboutLink.target = 'fconnect-iframe';
aboutLink.onclick = openFCPopin;
}
aboutLink.innerHTML = 'Qu\'est-ce-que FranceConnect ?';
return aboutLink;
}
function createLogoutElement(logoutUrl) {
var elm = document.createElement('div');
elm.className = 'logout';
elm.innerHTML = '<a class="btn btn-default" href="' + logoutUrl + '">Se déconnecter</a>'
return elm;
}
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
// Listen to message from child window
eventer(messageEvent,function(e) {
var key = e.message ? "message" : "data";
var data = e[key];
if(data === 'close_popup'){
closeFCPopin(e);
}
},false);

View file

@ -15,10 +15,24 @@ table {
height: 600px;
}
#map.qp {
#map.qp, #map.cadastre {
@extend .col-md-9;
@extend .col-lg-9;
}
.list {
@extend .col-md-3;
@extend .col-lg-3;
margin-bottom: 20px;
h3 {
margin-top: 0px;
}
ul li {
margin-bottom: 10px;
}
}
}
#infos_dossier {
@ -28,18 +42,7 @@ table {
}
}
#qp_list {
@extend .col-md-3;
@extend .col-lg-3;
h3 {
margin-top: 0px;
}
ul li {
margin-bottom: 10px;
}
}
#map section.overlay {
position: absolute;

View file

@ -11,7 +11,6 @@ class Admin::ProceduresController < AdminController
partial: "admin/procedures/list",
array: true
@page = 'active'
active_class
end
@ -21,7 +20,6 @@ class Admin::ProceduresController < AdminController
partial: "admin/procedures/list",
array: true
@page = 'archived'
archived_class
render 'index'
@ -78,11 +76,11 @@ class Admin::ProceduresController < AdminController
end
def active_class
@active_class = 'active' if @page == 'active'
@active_class = 'active'
end
def archived_class
@archived_class = 'active' if @page == 'archived'
@archived_class = 'active'
end
private

View file

@ -1,36 +0,0 @@
class FranceConnect::EntrepriseController < ApplicationController
def login
client = FranceConnectEntrepriseClient.new
session[:state] = SecureRandom.hex(16)
session[:nonce] = SecureRandom.hex(16)
authorization_uri = client.authorization_uri(
scope: [:profile, :email],
state: session[:state],
nonce: session[:nonce]
)
redirect_to authorization_uri
end
def callback
return redirect_to new_user_session_path unless params.has_key?(:code)
user_infos = FranceConnectService.retrieve_user_informations_entreprise(params[:code])
unless user_infos.nil?
@user = User.find_for_france_connect(user_infos.email, user_infos.siret)
sign_in @user
@user.loged_in_with_france_connect = 'entreprise'
@user.save
redirect_to stored_location_for(current_user) || signed_in_root_path(current_user)
end
rescue Rack::OAuth2::Client::Error => e
Rails.logger.error e.message
flash.alert = t('errors.messages.france_connect.connexion')
redirect_to(new_user_session_path)
end
end

View file

@ -33,20 +33,21 @@ class FranceConnect::ParticulierController < ApplicationController
end
def check_email
return create if User.find_by_email(params[:user][:email]).nil?
user = User.find_by_email(params[:user][:email])
return create if user.nil?
return redirect_to root_path if france_connect_particulier_id_blank?
unless params[:user][:password].nil?
user = User.find_by_email(params[:user][:email])
valid_password = user.valid_password?(params[:user][:password])
if valid_password
if user.valid_password?(params[:user][:password])
user.update_attributes create_user_params
return connect_france_connect_particulier user
else
flash.now.alert = 'Mot de passe invalide'
end
end
@user = (User.new create_user_params).decorate
end

View file

@ -18,14 +18,27 @@ class Users::CarteController < UsersController
dossier = current_user_dossier
dossier.quartier_prioritaires.map(&:destroy)
dossier.cadastres.map(&:destroy)
unless params[:json_latlngs].blank?
qp_list = generate_qp JSON.parse(params[:json_latlngs])
if dossier.procedure.module_api_carto.quartiers_prioritaires?
qp_list = generate_qp JSON.parse(params[:json_latlngs])
qp_list.each do |key, qp|
qp.merge!({dossier_id: dossier.id})
qp[:geometry] = qp[:geometry].to_json
QuartierPrioritaire.new(qp).save
qp_list.each do |key, qp|
qp.merge!({dossier_id: dossier.id})
qp[:geometry] = qp[:geometry].to_json
QuartierPrioritaire.create(qp)
end
end
if dossier.procedure.module_api_carto.cadastre?
cadastre_list = generate_cadastre JSON.parse(params[:json_latlngs])
cadastre_list.each do |cadastre|
cadastre.merge!({dossier_id: dossier.id})
cadastre[:geometry] = cadastre[:geometry].to_json
Cadastre.create(cadastre)
end
end
end
@ -60,6 +73,12 @@ class Users::CarteController < UsersController
render json: {quartier_prioritaires: qp}
end
def get_cadastre
cadastres = generate_cadastre JSON.parse(params[:coordinates])
render json: {cadastres: cadastres}
end
private
def generate_qp coordinates
@ -72,4 +91,15 @@ class Users::CarteController < UsersController
qp
end
def generate_cadastre coordinates
cadastre = []
coordinates.each_with_index do |coordinate, index|
coordinate = coordinates[index].map { |latlng| [latlng['lng'], latlng['lat']] }
cadastre << CARTO::SGMAP::Cadastre::Adapter.new(coordinate).to_params
end
cadastre.flatten
end
end

View file

@ -37,43 +37,21 @@ class Users::DossiersController < UsersController
end
def create
etablissement = Etablissement.new(SIADE::EtablissementAdapter.new(siret).to_params)
entreprise = Entreprise.new(SIADE::EntrepriseAdapter.new(siren).to_params)
rna_information = SIADE::RNAAdapter.new(siret).to_params
exercices = SIADE::ExercicesAdapter.new(siret).to_params
mandataires_sociaux = SIADE::MandatairesSociauxAdapter.new(siren).to_params
entreprise_adapter = SIADE::EntrepriseAdapter.new(siren)
unless exercices.nil?
exercices.each_value do |exercice|
exercice = Exercice.new(exercice)
exercice.etablissement = etablissement
exercice.save
end
end
mandataire_social = false
dossier = Dossier.create(user: current_user,
state: 'draft',
procedure_id: create_params[:procedure_id],
mandataire_social: mandataire_social?(entreprise_adapter.mandataires_sociaux))
mandataires_sociaux.each do |k, mandataire|
break mandataire_social = true if !current_user.france_connect_particulier_id.nil? &&
mandataire[:nom] == current_user.family_name &&
mandataire[:prenom] == current_user.given_name &&
mandataire[:date_naissance_timestamp] == current_user.birthdate.to_time.to_i
entreprise = dossier.create_entreprise(entreprise_adapter.to_params)
end
entreprise.create_rna_information(SIADE::RNAAdapter.new(siret).to_params)
dossier = Dossier.create(user: current_user, state: 'draft', procedure_id: create_params[:procedure_id], mandataire_social: mandataire_social)
etablissement = dossier.create_etablissement(SIADE::EtablissementAdapter.new(siret).to_params
.merge({entreprise_id: entreprise.id}))
entreprise.dossier = dossier
entreprise.save
unless rna_information.nil?
rna_information = RNAInformation.new(rna_information)
rna_information.entreprise = entreprise
rna_information.save
end
etablissement.dossier = dossier
etablissement.entreprise = entreprise
etablissement.save
etablissement.exercices.create(SIADE::ExercicesAdapter.new(siret).to_params)
redirect_to url_for(controller: :dossiers, action: :show, id: dossier.id)
@ -177,4 +155,15 @@ class Users::DossiersController < UsersController
redirect_to url_for users_dossiers_path
end
def mandataire_social? mandataires_list
mandataires_list.each do |mandataire|
return true if !current_user.france_connect_particulier_id.nil? &&
mandataire[:nom].upcase == current_user.family_name.upcase &&
mandataire[:prenom].upcase == current_user.given_name.upcase &&
mandataire[:date_naissance_timestamp] == current_user.birthdate.to_time.to_i
end
false
end
end

7
app/models/cadastre.rb Normal file
View file

@ -0,0 +1,7 @@
class Cadastre < ActiveRecord::Base
belongs_to :dossier
def geometry
JSON.parse(read_attribute(:geometry))
end
end

View file

@ -10,12 +10,15 @@ class Dossier < ActiveRecord::Base
has_one :etablissement, dependent: :destroy
has_one :entreprise, dependent: :destroy
has_one :cerfa, dependent: :destroy
has_many :pieces_justificatives, dependent: :destroy
has_many :champs, dependent: :destroy
has_many :quartier_prioritaires, dependent: :destroy
has_many :cadastres, dependent: :destroy
has_many :commentaires, dependent: :destroy
belongs_to :procedure
belongs_to :user
has_many :commentaires, dependent: :destroy
delegate :siren, to: :entreprise
delegate :siret, to: :etablissement, allow_nil: true

View file

@ -5,6 +5,6 @@ class Etablissement < ActiveRecord::Base
has_many :exercices
def geo_adresse
numero_voie.to_s << ' ' << type_voie.to_s << ' ' << nom_voie.to_s << ' ' << complement_adresse.to_s << ' ' << code_postal.to_s << ' ' << localite.to_s
[numero_voie, type_voie, nom_voie, complement_adresse, code_postal, localite].join(' ')
end
end

View file

@ -1,3 +1,6 @@
class Exercice < ActiveRecord::Base
belongs_to :etablissement
validates :ca, presence: true, allow_blank: false, allow_nil: false
end

View file

@ -4,4 +4,13 @@ class ModuleAPICarto < ActiveRecord::Base
validates :use_api_carto, presence: true, allow_blank: true, allow_nil: false
validates :quartiers_prioritaires, presence: true, allow_blank: true, allow_nil: false
validates :cadastre, presence: true, allow_blank: true, allow_nil: false
def classes
modules = ''
modules += 'qp ' if quartiers_prioritaires?
modules += 'cadastre ' if cadastre?
modules
end
end

View file

@ -1,8 +1,11 @@
class PieceJustificative < ActiveRecord::Base
belongs_to :dossier
belongs_to :type_de_piece_justificative
delegate :api_entreprise, :libelle, to: :type_de_piece_justificative
alias_attribute :type, :type_de_piece_justificative_id
mount_uploader :content, PieceJustificativeUploader
def empty?

View file

@ -1,12 +1,15 @@
class Procedure < ActiveRecord::Base
has_many :types_de_piece_justificative
has_many :types_de_champ
has_many :dossiers
has_one :module_api_carto
has_many :types_de_piece_justificative, dependent: :destroy
has_many :types_de_champ, dependent: :destroy
has_many :dossiers, dependent: :destroy
has_one :module_api_carto, dependent: :destroy
belongs_to :administrateur
accepts_nested_attributes_for :types_de_champ,:reject_if => proc { |attributes| attributes['libelle'].blank? }, :allow_destroy => true
accepts_nested_attributes_for :types_de_piece_justificative, :reject_if => proc { |attributes| attributes['libelle'].blank? }, :allow_destroy => true
accepts_nested_attributes_for :module_api_carto
belongs_to :administrateur
mount_uploader :logo, ProcedureLogoUploader

View file

@ -1,3 +1,5 @@
class RNAInformation < ActiveRecord::Base
belongs_to :entreprise
validates :association_id, presence: true, allow_blank: false, allow_nil: false
end

View file

@ -6,7 +6,8 @@ class TypeDeChamp < ActiveRecord::Base
}
belongs_to :procedure
has_many :champ
has_many :champ, dependent: :destroy
validates :libelle, presence: true, allow_blank: false, allow_nil: false
validates :type_champ, presence: true, allow_blank: false, allow_nil: false

View file

@ -1,5 +1,6 @@
class TypeDePieceJustificative < ActiveRecord::Base
has_many :pieces_justificatives
has_many :pieces_justificatives, dependent: :destroy
belongs_to :procedure
validates :libelle, presence: true, allow_blank: false, allow_nil: false

View file

@ -7,7 +7,7 @@ class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :dossiers
has_many :dossiers, dependent: :destroy
def self.find_for_france_connect_particulier user_info

View file

@ -1,5 +1,5 @@
class GeojsonService
def self.to_json_polygon coordinates
def self.to_json_polygon_for_qp coordinates
polygon = {
geo: {
type: "Polygon",
@ -9,4 +9,21 @@ class GeojsonService
polygon.to_json
end
def self.to_json_polygon_for_cadastre coordinates
polygon = {
geom: {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [
coordinates
]
}
}
}
polygon.to_json
end
end

View file

@ -26,10 +26,12 @@
- if @facade.dossier.procedure.module_api_carto.use_api_carto
.col-lg-6.col-md-6
#map.mini{class: @facade.dossier.class_qp_active}
#map.mini{class: @facade.dossier.procedure.module_api_carto.classes}
%input{id: 'json_latlngs', type:'hidden', value: "#{@facade.dossier.json_latlngs}"}
%input{id: 'quartier_prioritaires', type:'hidden', value: "#{@facade.dossier.quartier_prioritaires.to_json}"}
%input{id: 'cadastres', type:'hidden', value: "#{@facade.dossier.cadastres.to_json}"}
%script{type: 'text/javascript'}
= "var dossier_id =#{@facade.dossier.id}"
initCarto();

View file

@ -7,7 +7,7 @@
%br
%p
%h4.center Nous vous avons trouvé un compte qui utilise déjà cette adresse email.
%h4.center Nous avons trouvé un compte qui utilise déjà cette adresse email.
%p.center
Afin d'associer ce compte à votre identifiant France Connect, merci de saisir votre mot de passe TPS.
%br
@ -15,7 +15,7 @@
#france_connect_particulier_email
= form_for @user, url: {controller: 'france_connect/particulier', action: :check_email}, method: :post do |f|
.form-group.form-group-lg
= f.text_field :email, class: "form-control", placeholder: "Entrez votre email", readonly: 'readonly'
= f.text_field :email, class: "form-control", readonly: 'readonly'
%br
= f.password_field :password, class: "form-control", placeholder: "Entrez votre mot de passe"
= f.hidden_field :email

View file

@ -49,3 +49,4 @@
%div{:style => 'margin-left:10%; margin-right:10%;'}
= yield
%script{src: 'http://fcp.integ01.dev-franceconnect.fr/js/franceconnect.js'}

View file

@ -12,18 +12,24 @@
%br
%br
#carte_page.row
#map{class: @dossier.procedure.module_api_carto.classes }
- if @dossier.procedure.module_api_carto.quartiers_prioritaires
#map.qp
#qp_list
%h3 Quartiers prioritaites
#qp.list
%h3.text-info Quartiers prioritaites
%ul
-else
#map
- if @dossier.procedure.module_api_carto.cadastre
#cadastre.list
%h3.text-warning Cadastres
%ul
= form_tag(url_for({controller: :carte, action: :save, dossier_id: @dossier.id}), class: 'form-inline', method: 'POST') do
%br
%input{type: 'hidden', value: "#{@dossier.json_latlngs}", name: 'json_latlngs', id: 'json_latlngs'}
%input{id: 'quartier_prioritaires', type:'hidden', value: "#{@dossier.quartier_prioritaires.to_json}"}
%input{id: 'cadastres', type:'hidden', value: "#{@dossier.cadastres.to_json}"}
-if @dossier.draft?
=render partial: '/layouts/etape_suivante'

View file

@ -10,7 +10,6 @@
%a.text-info{href: 'https://fcp.integ01.dev-franceconnect.fr/a-propos', target: '_blank'}
Quest-ce que FranceConnect ?
%hr
= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
%h4
@ -43,6 +42,10 @@
%a{href: '/administrateurs/sign_in'}
= 'Administrateur'
%br
\-
%br
%a{href: 'https://github.com/sgmap/tps/releases', target: '_blank'}
= 'Nouveautés'

View file

@ -16,9 +16,6 @@ Rails.application.routes.draw do
root 'root#index'
namespace :france_connect do
# get 'entreprise' => 'entreprise#login'
# get 'entreprise/callback' => 'entreprise#callback'
get 'particulier' => 'particulier#login'
get 'particulier/callback' => 'particulier#callback'
@ -41,6 +38,8 @@ Rails.application.routes.draw do
get '/carte/position' => 'carte#get_position'
post '/carte/qp' => 'carte#get_qp'
post '/carte/cadastre' => 'carte#get_cadastre'
get '/carte' => 'carte#show'
post '/carte' => 'carte#save'

View file

@ -0,0 +1,18 @@
class CreateCadastreTable < ActiveRecord::Migration
def change
create_table :cadastres do |t|
t.string :surface_intersection
t.float :surface_parcelle
t.string :numero
t.integer :feuille
t.string :section
t.string :code_dep
t.string :nom_com
t.string :code_com
t.string :code_arr
t.text :geometry
end
add_reference :cadastres, :dossier, references: :dossiers
end
end

View file

@ -11,7 +11,9 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160120141602) do
ActiveRecord::Schema.define(version: 20160115135025) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -35,6 +37,20 @@ ActiveRecord::Schema.define(version: 20160120141602) do
add_index "administrateurs", ["email"], name: "index_administrateurs_on_email", unique: true, using: :btree
add_index "administrateurs", ["reset_password_token"], name: "index_administrateurs_on_reset_password_token", unique: true, using: :btree
create_table "cadastres", force: :cascade do |t|
t.string "surface_intersection"
t.float "surface_parcelle"
t.string "numero"
t.integer "feuille"
t.string "section"
t.string "code_dep"
t.string "nom_com"
t.string "code_com"
t.string "code_arr"
t.text "geometry"
t.integer "dossier_id"
end
create_table "cerfas", force: :cascade do |t|
t.string "content"
t.integer "dossier_id"

View file

@ -1,6 +1,6 @@
class CARTO::SGMAP::Cadastre::Adapter
def initialize(coordinates)
@coordinates = GeojsonService.to_json_polygon(coordinates)
@coordinates = GeojsonService.to_json_polygon_for_cadastre(coordinates)
end
def data_source
@ -8,15 +8,25 @@ class CARTO::SGMAP::Cadastre::Adapter
end
def to_params
params = []
data_source[:features].each do |feature|
tmp = feature[:properties]
data_source[:features].inject([]) do |acc, feature|
tmp = filter_properties feature[:properties]
tmp[:geometry] = feature[:geometry]
params << tmp
acc << tmp
end
end
params
def filter_properties properties
{
surface_intersection: properties[:surface_intersection],
surface_parcelle: properties[:surface_parcelle],
numero: properties[:numero],
feuille: properties[:feuille],
section: properties[:section],
code_dep: properties[:code_dep],
nom_com: properties[:nom_com],
code_com: properties[:code_com],
code_arr: properties[:code_arr]
}
end
end

View file

@ -1,6 +1,6 @@
class CARTO::SGMAP::QuartiersPrioritaires::Adapter
def initialize(coordinates)
@coordinates = GeojsonService.to_json_polygon(coordinates)
@coordinates = GeojsonService.to_json_polygon_for_qp(coordinates)
end
def data_source

View file

@ -34,4 +34,10 @@ class SIADE::EntrepriseAdapter
:nom,
:prenom]
end
def mandataires_sociaux
data_source[:entreprise][:mandataires_sociaux]
rescue
nil
end
end

View file

@ -10,16 +10,7 @@ class SIADE::ExercicesAdapter
end
def to_params
params = {}
data_source[:exercices].each_with_index do |values, i|
params[i] = {}
values.each do |index, value|
params[i][index] = value if attr_to_fetch.include?(index)
end
end
params
data_source[:exercices]
rescue
nil
end

View file

@ -1,35 +0,0 @@
class SIADE::MandatairesSociauxAdapter
def initialize(siren)
@siren = siren
end
def data_source
@data_source ||= JSON.parse(SIADE::API.entreprise(@siren), symbolize_names: true)
rescue
@data_source = nil
end
def to_params
params = {}
data_source[:entreprise][:mandataires_sociaux].each_with_index do |mandataire, i|
params[i] = {}
mandataire.each do |k, v|
params[i][k] = v if attr_to_fetch.include?(k)
end
end
params
rescue
nil
end
def attr_to_fetch
[:nom,
:prenom,
:fonction,
:date_naissance,
:date_naissance_timestamp]
end
end

View file

@ -1,6 +1,6 @@
class SIADE::RNAAdapter
def initialize(siren)
@siret = siren
def initialize(siret)
@siret = siret
end
def data_source

View file

@ -18,7 +18,7 @@ describe Admin::PiecesJustificativesController, type: :controller do
end
context 'when procedure have at least a file' do
let!(:dossier) { create(:dossier, :with_user, procedure: procedure, state: :initiated) }
let!(:dossier) { create(:dossier, procedure: procedure, state: :initiated) }
it { is_expected.to redirect_to admin_procedure_path id: procedure_id }
end

View file

@ -67,7 +67,7 @@ describe Admin::ProceduresController, type: :controller do
end
context 'when procedure have at least a file' do
let!(:dossier) { create(:dossier, :with_user, procedure: procedure, state: :initiated) }
let!(:dossier) { create(:dossier, procedure: procedure, state: :initiated) }
it { is_expected.to redirect_to admin_procedure_path id: procedure_id }
end

View file

@ -20,7 +20,7 @@ describe Admin::TypesDeChampController, type: :controller do
end
context 'when procedure have at least a file' do
let!(:dossier) { create(:dossier, :with_user, procedure: procedure, state: :initiated) }
let!(:dossier) { create(:dossier, procedure: procedure, state: :initiated) }
it { is_expected.to redirect_to admin_procedure_path id: procedure_id }
end

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe Backoffice::CommentairesController, type: :controller do
let(:dossier) { create(:dossier, :with_user) }
let(:dossier) { create(:dossier) }
let(:dossier_id) { dossier.id }
let(:email_commentaire) { 'test@test.com' }
let(:texte_commentaire) { 'Commentaire de test' }

View file

@ -1,8 +1,8 @@
require 'rails_helper'
describe Backoffice::DossiersController, type: :controller do
let(:dossier) { create(:dossier, :with_entreprise, :with_user) }
let(:dossier_archived) { create(:dossier, :with_entreprise, :with_user, archived: true) }
let(:dossier) { create(:dossier, :with_entreprise) }
let(:dossier_archived) { create(:dossier, :with_entreprise, archived: true) }
let(:dossier_id) { dossier.id }
let(:bad_dossier_id) { Dossier.count + 10 }

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe Users::CommentairesController, type: :controller do
let(:dossier) { create(:dossier, :with_user) }
let(:dossier) { create(:dossier) }
let(:dossier_id) { dossier.id }
let(:email_commentaire) { 'test@test.com' }
let(:texte_commentaire) { 'Commentaire de test' }

View file

@ -1,61 +0,0 @@
# require 'spec_helper'
#
# describe FranceConnect::EntrepriseController, type: :controller do
#
# describe '.login' do
# it 'redirect to france connect serveur' do
# get :login
# expect(response.status).to eq(302)
# end
# end
#
# describe '.callback' do
# context 'when param code is missing' do
# it 'redirect to login page' do
# get :callback
# expect(response).to redirect_to(new_user_session_path)
# end
# end
# context 'when params code is present' do
# let(:code) { 'plop' }
# let(:email) { 'patator@cake.com' }
# let(:siret) { '41123069100049' }
# let(:user_info) { Hashie::Mash.new(email: email, siret: siret) }
# context 'when code is correct' do
# let(:email) { 'patator@cake.com' }
# let(:current_user) { User.find_by_email(email) }
#
# before do
# allow(FranceConnectService).to receive(:retrieve_user_informations_entreprise).and_return(user_info)
# get :callback, code: code
# end
#
# it 'current user have attribut loged_in_with_france_connect at enterprise' do
# expect(current_user.loged_in_with_france_connect).to eq 'entreprise'
# end
# let(:stored_location) { '/plip/plop' }
# it 'redirect to stored location' do
# subject.store_location_for(:user, stored_location)
# get :callback, code: code
# expect(response).to redirect_to(stored_location)
# end
# end
#
# context 'when code is not correct' do
# before do
# allow(FranceConnectService).to receive(:retrieve_user_informations_entreprise) { raise Rack::OAuth2::Client::Error.new(500, error: 'Unknown') }
# get :callback, code: code
# end
#
# it 'redirect to login page' do
# expect(response).to redirect_to(new_user_session_path)
# end
#
# it 'display error message' do
# expect(flash[:alert]).to be_present
# end
# end
# end
# end
# end
#

View file

@ -81,28 +81,20 @@ describe FranceConnect::ParticulierController, type: :controller do
end
describe 'POST #create' do
let(:email) { 'plop@gmail.com' }
subject { post :create, user: user_info }
context 'when email is filled' do
it { expect { subject }.to change { User.count }.by(1) }
let(:email) { 'plop@gmail.com' }
it 'redirects user root page' do
subject
expect(response).to redirect_to(root_path)
end
it { expect { subject }.to change { User.count }.by(1) }
it { expect(subject).to redirect_to(root_path) }
end
context 'when email is incorrect' do
let(:email) { '' }
it { expect { subject }.to change { User.count }.by(0) }
it 'redirect to check email FC page' do
subject
expect(response).to redirect_to(france_connect_particulier_new_path(user: user_info))
end
it { expect(subject).to redirect_to(france_connect_particulier_new_path(user: user_info)) }
end
end

View file

@ -3,10 +3,11 @@ require 'spec_helper'
RSpec.describe Users::CarteController, type: :controller do
let(:bad_adresse) { 'babouba' }
let(:procedure) { create(:procedure, :with_api_carto) }
let(:dossier) { create(:dossier, :with_user, procedure: procedure) }
let(:module_api_carto) { create(:module_api_carto, :with_api_carto) }
let(:procedure) { create(:procedure, module_api_carto: module_api_carto) }
let(:dossier) { create(:dossier, procedure: procedure) }
let(:dossier_with_no_carto) { create(:dossier, :with_user, :with_procedure) }
let(:dossier_with_no_carto) { create(:dossier, :with_procedure) }
let!(:entreprise) { create(:entreprise, dossier: dossier) }
let!(:etablissement) { create(:etablissement, dossier: dossier) }
let(:bad_dossier_id) { Dossier.count + 1000 }
@ -59,7 +60,7 @@ RSpec.describe Users::CarteController, type: :controller do
end
context 'En train de modifier la localisation' do
let(:dossier) { create(:dossier, :with_procedure, :with_user, state: 'initiated') }
let(:dossier) { create(:dossier, :with_procedure, state: 'initiated') }
before do
post :save, dossier_id: dossier.id, json_latlngs: ''
end
@ -86,6 +87,8 @@ RSpec.describe Users::CarteController, type: :controller do
end
describe 'Save quartier prioritaire' do
let(:module_api_carto) { create(:module_api_carto, :with_quartiers_prioritaires) }
before do
allow_any_instance_of(CARTO::SGMAP::QuartiersPrioritaires::Adapter).
to receive(:to_params).
@ -96,7 +99,7 @@ RSpec.describe Users::CarteController, type: :controller do
context 'when json_latlngs params is empty' do
context 'when dossier have quartier prioritaire in database' do
let!(:dossier) { create(:dossier, :with_user, :with_procedure, :with_two_quartier_prioritaires) }
let!(:dossier) { create(:dossier, :with_procedure, :with_two_quartier_prioritaires) }
before do
dossier.reload
@ -117,10 +120,6 @@ RSpec.describe Users::CarteController, type: :controller do
context 'when json_latlngs params is informed' do
let(:json_latlngs) { '[[{"lat":48.87442541960633,"lng":2.3859214782714844},{"lat":48.87273183590832,"lng":2.3850631713867183},{"lat":48.87081237174292,"lng":2.3809432983398438},{"lat":48.8712640169951,"lng":2.377510070800781},{"lat":48.87510283703279,"lng":2.3778533935546875},{"lat":48.87544154230615,"lng":2.382831573486328},{"lat":48.87442541960633,"lng":2.3859214782714844}]]' }
before do
dossier.reload
end
it { expect(dossier.quartier_prioritaires.size).to eq(1) }
describe 'Quartier Prioritaire' do
@ -133,12 +132,65 @@ RSpec.describe Users::CarteController, type: :controller do
end
end
end
describe 'Save cadastre' do
let(:module_api_carto) { create(:module_api_carto, :with_cadastre) }
before do
allow_any_instance_of(CARTO::SGMAP::Cadastre::Adapter).
to receive(:to_params).
and_return([{:surface_intersection=>"0.0006", :surface_parcelle=>11252.692583090324, :numero=>"0013", :feuille=>1, :section=>"CD", :code_dep=>"30", :nom_com=>"Le Grau-du-Roi", :code_com=>"133", :code_arr=>"000", :geometry=>{:type=>"MultiPolygon", :coordinates=>[[[[4.134084, 43.5209193], [4.1346615, 43.5212035], [4.1346984, 43.521189], [4.135096, 43.5213848], [4.1350839, 43.5214122], [4.1352697, 43.521505], [4.1356278, 43.5211065], [4.1357402, 43.5207188], [4.1350935, 43.5203936], [4.135002, 43.5204366], [4.1346051, 43.5202412], [4.134584, 43.5202472], [4.1345572, 43.5202551], [4.134356, 43.5203137], [4.1342488, 43.5203448], [4.134084, 43.5209193]]]]}}])
post :save, dossier_id: dossier.id, json_latlngs: json_latlngs
end
context 'when json_latlngs params is empty' do
context 'when dossier have cadastres in database' do
let!(:dossier) { create(:dossier, :with_procedure, :with_two_cadastres) }
before do
dossier.reload
end
context 'when value is empty' do
let(:json_latlngs) { '' }
it { expect(dossier.cadastres.size).to eq(0) }
end
context 'when value is empty array' do
let(:json_latlngs) { '[]' }
it { expect(dossier.cadastres.size).to eq(0) }
end
end
end
context 'when json_latlngs params is informed' do
let(:json_latlngs) { '[[{"lat":48.87442541960633,"lng":2.3859214782714844},{"lat":48.87273183590832,"lng":2.3850631713867183},{"lat":48.87081237174292,"lng":2.3809432983398438},{"lat":48.8712640169951,"lng":2.377510070800781},{"lat":48.87510283703279,"lng":2.3778533935546875},{"lat":48.87544154230615,"lng":2.382831573486328},{"lat":48.87442541960633,"lng":2.3859214782714844}]]' }
it { expect(dossier.cadastres.size).to eq(1) }
describe 'Cadastre' do
subject { Cadastre.last }
it { expect(subject.surface_intersection).to eq('0.0006') }
it { expect(subject.surface_parcelle).to eq(11252.6925830903) }
it { expect(subject.numero).to eq('0013') }
it { expect(subject.feuille).to eq(1) }
it { expect(subject.section).to eq('CD') }
it { expect(subject.code_dep).to eq('30') }
it { expect(subject.nom_com).to eq('Le Grau-du-Roi') }
it { expect(subject.code_com).to eq('133') }
it { expect(subject.code_arr).to eq('000') }
it { expect(subject.geometry).to eq({"type"=>"MultiPolygon", "coordinates"=>[[[[4.134084, 43.5209193], [4.1346615, 43.5212035], [4.1346984, 43.521189], [4.135096, 43.5213848], [4.1350839, 43.5214122], [4.1352697, 43.521505], [4.1356278, 43.5211065], [4.1357402, 43.5207188], [4.1350935, 43.5203936], [4.135002, 43.5204366], [4.1346051, 43.5202412], [4.134584, 43.5202472], [4.1345572, 43.5202551], [4.134356, 43.5203137], [4.1342488, 43.5203448], [4.134084, 43.5209193]]]]}) }
end
end
end
end
describe '#get_position' do
context 'Geocodeur renvoie des positions nil' do
let(:etablissement) { create(:etablissement, adresse: bad_adresse, numero_voie: 'dzj', type_voie: 'fzjfk', nom_voie: 'hdidjkz', complement_adresse: 'fjef', code_postal: 'fjeiefk', localite: 'zjfkfz') }
let(:dossier) { create(:dossier, :with_procedure, :with_user, etablissement: etablissement) }
let(:dossier) { create(:dossier, :with_procedure, etablissement: etablissement) }
before do
stub_request(:get, /http:\/\/api-adresse[.]data[.]gouv[.]fr\/search[?]limit=1&q=/)
.to_return(status: 200, body: '{"query": "babouba", "version": "draft", "licence": "ODbL 1.0", "features": [], "type": "FeatureCollection", "attribution": "BAN"}', headers: {})

View file

@ -12,6 +12,9 @@ describe Users::DossiersController, type: :controller do
let(:rna_status) { 404 }
let(:rna_body) { '' }
let(:exercices_status) { 200 }
let(:exercices_body) { File.read('spec/support/files/exercices.json') }
let(:siren) { dossier.siren }
let(:siret) { dossier.siret }
let(:bad_siret) { 1 }
@ -78,7 +81,7 @@ describe Users::DossiersController, type: :controller do
.to_return(status: 200, body: File.read('spec/support/files/entreprise.json'))
stub_request(:get, "https://api-dev.apientreprise.fr/api/v1/etablissements/exercices/#{siret}?token=#{SIADETOKEN}")
.to_return(status: 200, body: File.read('spec/support/files/exercices.json'))
.to_return(status: exercices_status, body: exercices_body)
stub_request(:get, "https://api-dev.apientreprise.fr/api/v1/associations/#{siret}?token=#{SIADETOKEN}")
.to_return(status: rna_status, body: rna_body)
@ -131,6 +134,13 @@ describe Users::DossiersController, type: :controller do
expect(Exercice.last.etablissement).to eq(Dossier.last.etablissement)
end
context 'when siret have no exercices' do
let(:exercices_status) { 404 }
let(:exercices_body) { '' }
it { expect { subject }.not_to change { Exercice.count } }
end
it 'links procedure to dossier' do
subject
expect(Dossier.last.procedure).to eq(Procedure.last)

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe Users::RecapitulatifController, type: :controller do
let(:dossier) { create(:dossier, :with_user, :with_procedure) }
let(:dossier) { create(:dossier, :with_procedure) }
let(:bad_dossier_id) { Dossier.count + 100000 }
before do

View file

@ -17,7 +17,7 @@ describe Users::RegistrationsController, type: :controller do
context 'when user is correct' do
it { expect(described_class).to be < Devise::RegistrationsController }
it 'welcome email is send' do
it 'sends welcome email' do
expect(WelcomeMailer).to receive(:welcome_email).and_return(WelcomeMailer)
expect(WelcomeMailer).to receive(:deliver_now!)
@ -28,7 +28,7 @@ describe Users::RegistrationsController, type: :controller do
context 'when user is not correct' do
let(:user) { {email: '', password: password, password_confirmation: password} }
it 'welcome email is not send' do
it 'not sends welcome email' do
expect(WelcomeMailer).not_to receive(:welcome_email)
subject

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe DossierDecorator do
let(:dossier) { create(:dossier, :with_user, updated_at: Time.new(2015, 12, 24, 14, 10)) }
let(:dossier) { create(:dossier, updated_at: Time.new(2015, 12, 24, 14, 10)) }
subject { dossier.decorate }
describe 'last_update' do

View file

@ -3,13 +3,13 @@ require 'spec_helper'
describe AdminProceduresShowFacades do
let!(:procedure) { create(:procedure) }
let!(:dossier_0) { create(:dossier, :with_user, procedure: procedure, state: 'draft') }
let!(:dossier_1) { create(:dossier, :with_user, procedure: procedure, state: 'initiated') }
let!(:dossier_2) { create(:dossier, :with_user, procedure: procedure, state: 'validated') }
let!(:dossier_3) { create(:dossier, :with_user, procedure: procedure, state: 'validated') }
let!(:dossier_4) { create(:dossier, :with_user, procedure: procedure, archived: true, state: 'validated') }
let!(:dossier_5) { create(:dossier, :with_user, procedure: procedure, archived: true, state: 'validated') }
let!(:dossier_6) { create(:dossier, :with_user, procedure: procedure, archived: true, state: 'initiated') }
let!(:dossier_0) { create(:dossier, procedure: procedure, state: 'draft') }
let!(:dossier_1) { create(:dossier, procedure: procedure, state: 'initiated') }
let!(:dossier_2) { create(:dossier, procedure: procedure, state: 'validated') }
let!(:dossier_3) { create(:dossier, procedure: procedure, state: 'validated') }
let!(:dossier_4) { create(:dossier, procedure: procedure, archived: true, state: 'validated') }
let!(:dossier_5) { create(:dossier, procedure: procedure, archived: true, state: 'validated') }
let!(:dossier_6) { create(:dossier, procedure: procedure, archived: true, state: 'initiated') }
subject { AdminProceduresShowFacades.new procedure }

View file

@ -0,0 +1,7 @@
FactoryGirl.define do
factory :cadastre do
numero '001'
feuille 1
section 'OM'
end
end

View file

@ -2,6 +2,7 @@ FactoryGirl.define do
factory :dossier do
nom_projet "Demande de subvention dans le cadre d'accompagnement d'enfant à l'étranger"
state 'draft'
association :user, factory:[:user]
trait :with_entreprise do
after(:build) do |dossier, _evaluator|
@ -19,12 +20,6 @@ FactoryGirl.define do
end
end
trait :with_user do
after(:build) do |dossier, _evaluator|
dossier.user = create(:user)
end
end
trait :with_two_quartier_prioritaires do
after(:build) do |dossier, _evaluator|
@ -35,5 +30,16 @@ FactoryGirl.define do
dossier.quartier_prioritaires << qp2
end
end
trait :with_two_cadastres do
after(:build) do |dossier, _evaluator|
qp1 = create(:cadastre)
qp2 = create(:cadastre)
dossier.cadastres << qp1
dossier.cadastres << qp2
end
end
end
end

View file

@ -17,7 +17,7 @@ feature 'procedure locked' do
end
context 'when procedure have at least a file' do
before do
create(:dossier, :with_user, procedure: procedure, state: :initiated)
create(:dossier, procedure: procedure, state: :initiated)
visit admin_procedure_path(procedure)
end

View file

@ -1,7 +1,7 @@
require 'spec_helper'
feature 'add commentaire on backoffice' do
let(:dossier) { create(:dossier, :with_entreprise, :with_procedure, :with_user) }
let(:dossier) { create(:dossier, :with_entreprise, :with_procedure) }
let(:dossier_id) { dossier.id }
let!(:commentaire) { create(:commentaire, dossier: dossier, email: 'toto@toto.com') }
let(:email_commentaire) { 'test@test.com' }

View file

@ -2,7 +2,7 @@ require 'spec_helper'
feature 'when gestionnaire come to /backoffice and is not authenticated' do
let(:procedure) { create(:procedure) }
let!(:dossier) { create(:dossier, :with_user, procedure: procedure) }
let!(:dossier) { create(:dossier, procedure: procedure) }
before do
visit backoffice_path
end

View file

@ -5,7 +5,7 @@ feature 'on backoffice page' do
let(:gestionnaire) { create(:gestionnaire, administrateur: administrateur) }
let(:procedure) { create(:procedure, administrateur: administrateur) }
let!(:dossier) { create(:dossier, :with_user, :with_entreprise, procedure: procedure, state: 'initiated') }
let!(:dossier) { create(:dossier, :with_entreprise, procedure: procedure, state: 'initiated') }
before do
visit backoffice_path
end

View file

@ -37,8 +37,8 @@ feature 'search file on gestionnaire backoffice' do
context 'when terms input does return result' do
let!(:procedure) { create(:procedure, administrateur: administrateur) }
let!(:dossier) { create(:dossier, :with_entreprise, :with_user, procedure: procedure, state: 'initiated') }
let!(:dossier_2) { create(:dossier, :with_user, procedure: procedure, state: 'initiated', nom_projet: 'Projet de test') }
let!(:dossier) { create(:dossier, :with_entreprise, procedure: procedure, state: 'initiated') }
let!(:dossier_2) { create(:dossier, procedure: procedure, state: 'initiated', nom_projet: 'Projet de test') }
let(:terms) { dossier.nom_projet }

View file

@ -1,7 +1,7 @@
require 'spec_helper'
feature 'user is on description page' do
let(:dossier) { create(:dossier, :with_entreprise, :with_procedure, :with_user) }
let(:dossier) { create(:dossier, :with_entreprise, :with_procedure) }
before do
visit users_dossier_description_path dossier

View file

@ -1,81 +0,0 @@
# require 'spec_helper'
#
# feature 'France Connect Connexion' do
# context 'when user is on login page' do
#
# before do
# visit new_user_session_path
# end
#
# scenario 'link to France Connect is present' do
# expect(page).to have_css('a#btn_fce')
# end
#
# context 'and click on france connect link' do
# let(:code) { 'plop' }
#
# context 'when authentification is ok' do
# before do
# allow_any_instance_of(FranceConnectEntrepriseClient).to receive(:authorization_uri).and_return(france_connect_entreprise_callback_path(code: code))
# allow(FranceConnectService).to receive(:retrieve_user_informations_entreprise).and_return(Hashie::Mash.new(email: 'patator@cake.com'))
# page.find_by_id('btn_fce').click
# end
#
# scenario 'he is redirected to france connect' do
# expect(page).to have_content('Mes dossiers')
# end
# end
#
# context 'when authentification is not ok' do
# before do
# allow_any_instance_of(FranceConnectEntrepriseClient).to receive(:authorization_uri).and_return(france_connect_entreprise_callback_path(code: code))
# allow(FranceConnectService).to receive(:retrieve_user_informations_entreprise) { raise Rack::OAuth2::Client::Error.new(500, error: 'Unknown') }
# page.find_by_id('btn_fce').click
# end
#
# scenario 'he is redirected to login page' do
# expect(page).to have_css('a#btn_fce')
# end
#
# scenario 'error message is displayed' do
# expect(page).to have_content(I18n.t('errors.messages.france_connect.connexion'))
# end
# end
# end
# end
#
#
# feature 'redirection' do
# before do
# visit initial_path
# end
# context 'when he use france connect' do
# let(:code) { 'my_code' }
# let(:email) { 'plop@plop.com' }
# let(:siret) { '00000000000000' }
# let(:user_infos) { Hashie::Mash.new(email: email, siret: siret) }
# before do
# allow_any_instance_of(FranceConnectEntrepriseClient).to receive(:authorization_uri).and_return(france_connect_entreprise_callback_path(code: code))
# allow(FranceConnectService).to receive(:retrieve_user_informations_entreprise).and_return(user_infos)
# page.find_by_id('btn_fce').click
# end
# context 'when starting page is dossiers list' do
# let(:initial_path) { users_dossiers_path }
# scenario 'he is redirected to dossier list' do
# expect(page).to have_css('#users_index')
# end
# end
# context 'when starting page is procedure' do
# let(:procedure) { create(:procedure) }
# let(:initial_path) { new_users_dossiers_path(procedure_id: procedure.id ) }
# scenario 'he is redirected to siret page' do
# expect(page).to have_css('#users_siret_index')
# end
#
# scenario 'the siret is already written in form' do
# expect(page.find_by_id('dossier_siret').value).to have_content(siret)
# end
# end
# end
# end
# end

View file

@ -12,7 +12,13 @@ feature 'France Connect Particulier Connexion' do
let(:know_france_connect_particulier_id) { 'blabla' }
let(:unknow_france_connect_particulier_id) { 'titi' }
let(:user_info) { Hashie::Mash.new(france_connect_particulier_id: france_connect_particulier_id, given_name: given_name, family_name: family_name, birthdate: birthdate, birthplace: birthplace, gender: gender, email: email) }
let(:user_info) { Hashie::Mash.new(france_connect_particulier_id: france_connect_particulier_id,
given_name: given_name,
family_name: family_name,
birthdate: birthdate,
birthplace: birthplace,
gender: gender,
email: email) }
context 'when user is on login page' do
@ -28,7 +34,13 @@ feature 'France Connect Particulier Connexion' do
let(:code) { 'plop' }
context 'when authentification is ok' do
let!(:user) { create(:user, france_connect_particulier_id: know_france_connect_particulier_id, given_name: given_name, family_name: family_name, birthdate: birthdate, birthplace: birthplace, gender: gender) }
let!(:user) { create(:user,
france_connect_particulier_id: know_france_connect_particulier_id,
given_name: given_name,
family_name: family_name,
birthdate: birthdate,
birthplace: birthplace,
gender: gender) }
before do
allow_any_instance_of(FranceConnectParticulierClient).to receive(:authorization_uri).and_return(france_connect_particulier_callback_path(code: code))

View file

@ -5,7 +5,7 @@ feature 'user access to the list of his dossier' do
let(:user) { create(:user) }
let!(:last_updated_dossier) { create(:dossier, :with_procedure, user: user, state: 'replied')}
let!(:dossier1) { create(:dossier, :with_procedure, user: user, nom_projet: 'mon permier dossier', state: 'replied') }
let!(:dossier2) { create(:dossier, :with_user, nom_projet: 'mon deuxième dossier') }
let!(:dossier2) { create(:dossier, nom_projet: 'mon deuxième dossier') }
before do
last_updated_dossier.update_attributes(nom_projet: 'salut la compagnie')

View file

@ -18,6 +18,22 @@ describe CARTO::SGMAP::Cadastre::Adapter do
it { expect(subject).to be_a_instance_of(Array) }
it { expect(subject.size).to eq 16 }
describe 'Attribut filter' do
let(:adapter) { described_class.new(coordinates) }
subject { adapter.filter_properties adapter.data_source }
it { expect(subject.size).to eq 9 }
it { expect(subject.keys).to eq [:surface_intersection,
:surface_parcelle,
:numero,
:feuille,
:section,
:code_dep,
:nom_com,
:code_com,
:code_arr] }
end
describe 'Attributes' do
subject { super().first }
@ -31,7 +47,7 @@ describe CARTO::SGMAP::Cadastre::Adapter do
it { expect(subject[:code_com]).to eq('046') }
it { expect(subject[:code_arr]).to eq('000') }
it { expect(subject[:geometry]).to eq({type: "MultiPolygon", coordinates: [[[[2.4362443, 48.8092078], [2.436384, 48.8092043], [2.4363802, 48.8091414]]]] })}
it { expect(subject[:geometry]).to eq({type: "MultiPolygon", coordinates: [[[[2.4362443, 48.8092078], [2.436384, 48.8092043], [2.4363802, 48.8091414]]]]}) }
end
end

View file

@ -5,7 +5,7 @@ describe SIADE::EntrepriseAdapter do
before do
stub_request(:get, "https://api-dev.apientreprise.fr/api/v1/entreprises/418166096?token=#{SIADETOKEN}")
.to_return(body: File.read('spec/support/files/entreprise.json', status: 200))
.to_return(body: File.read('spec/support/files/entreprise.json', status: 200))
end
it '#to_params class est une Hash ?' do
@ -61,4 +61,35 @@ describe SIADE::EntrepriseAdapter do
expect(subject[:prenom]).to eq('test_prenom')
end
end
context 'Mandataire sociaux' do
subject { described_class.new('418166096').mandataires_sociaux }
it '#to_params class est une Hash ?' do
expect(subject).to be_an_instance_of(Array)
end
it { expect(subject.size).to eq(8) }
describe 'Attributs' do
it 'Un mandataire social possède bien un nom' do
expect(subject[0][:nom]).to eq('HISQUIN')
end
it 'Un mandataire social possède bien un prenom' do
expect(subject[0][:prenom]).to eq('FRANCOIS')
end
it 'Un mandataire social possède bien une fonction' do
expect(subject[0][:fonction]).to eq('PRESIDENT DU DIRECTOIRE')
end
it 'Un mandataire social possède bien une date de naissance' do
expect(subject[0][:date_naissance]).to eq('1965-01-27')
end
it 'Un mandataire social possède bien une date de naissance au format timestamp' do
expect(subject[0][:date_naissance_timestamp]).to eq(-155523600)
end
end
end
end

View file

@ -10,7 +10,7 @@ describe SIADE::ExercicesAdapter do
end
it '#to_params class est une Hash ?' do
expect(subject).to be_an_instance_of(Hash)
expect(subject).to be_an_instance_of(Array)
end
it 'have 3 exercices' do

View file

@ -1,43 +0,0 @@
require 'spec_helper'
describe SIADE::MandatairesSociauxAdapter do
subject { described_class.new('418166096').to_params }
before do
stub_request(:get, "https://api-dev.apientreprise.fr/api/v1/entreprises/418166096?token=#{SIADETOKEN}")
.to_return(body: File.read('spec/support/files/entreprise.json', status: 200))
end
it '#to_params class est une Hash ?' do
expect(subject).to be_an_instance_of(Hash)
end
describe 'Mandataires Sociaux' do
it { expect(subject.size).to eq(8) }
describe 'Attributs' do
it 'Un mandataire social possède bien un nom' do
expect(subject[0][:nom]).to eq('HISQUIN')
end
it 'Un mandataire social possède bien un prenom' do
expect(subject[0][:prenom]).to eq('FRANCOIS')
end
it 'Un mandataire social possède bien une fonction' do
expect(subject[0][:fonction]).to eq('PRESIDENT DU DIRECTOIRE')
end
it 'Un mandataire social possède bien une date de naissance' do
expect(subject[0][:date_naissance]).to eq('1965-01-27')
end
it 'Un mandataire social possède bien une date de naissance au format timestamp' do
expect(subject[0][:date_naissance_timestamp]).to eq(-155523600)
end
end
end
end

View file

@ -0,0 +1,16 @@
require 'spec_helper'
describe Cadastre do
it { is_expected.to have_db_column(:surface_intersection) }
it { is_expected.to have_db_column(:surface_parcelle) }
it { is_expected.to have_db_column(:numero) }
it { is_expected.to have_db_column(:feuille) }
it { is_expected.to have_db_column(:section) }
it { is_expected.to have_db_column(:code_dep) }
it { is_expected.to have_db_column(:nom_com) }
it { is_expected.to have_db_column(:code_com) }
it { is_expected.to have_db_column(:code_arr) }
it { is_expected.to have_db_column(:geometry) }
it { is_expected.to belong_to(:dossier) }
end

View file

@ -19,6 +19,7 @@ describe Dossier do
it { is_expected.to have_many(:champs) }
it { is_expected.to have_many(:commentaires) }
it { is_expected.to have_many(:quartier_prioritaires) }
it { is_expected.to have_many(:cadastres) }
it { is_expected.to have_one(:cerfa) }
it { is_expected.to have_one(:etablissement) }
it { is_expected.to have_one(:entreprise) }
@ -130,7 +131,7 @@ describe Dossier do
end
describe '#next_step' do
let(:dossier) { create(:dossier, :with_user) }
let(:dossier) { create(:dossier) }
let(:role) { 'user' }
let(:action) { 'initiate' }
@ -389,18 +390,18 @@ describe Dossier do
let(:procedure_admin) { create(:procedure, administrateur: admin) }
let(:procedure_admin_2) { create(:procedure, administrateur: admin_2) }
let!(:dossier1) { create(:dossier, :with_user, procedure: procedure_admin, state: 'draft') }
let!(:dossier2) { create(:dossier, :with_user, procedure: procedure_admin, state: 'initiated') } #a_traiter
let!(:dossier3) { create(:dossier, :with_user, procedure: procedure_admin, state: 'initiated') } #a_traiter
let!(:dossier4) { create(:dossier, :with_user, procedure: procedure_admin, state: 'replied') } #en_attente
let!(:dossier5) { create(:dossier, :with_user, procedure: procedure_admin, state: 'updated') } #a_traiter
let!(:dossier6) { create(:dossier, :with_user, procedure: procedure_admin_2, state: 'validated') } #en_attente
let!(:dossier7) { create(:dossier, :with_user, procedure: procedure_admin_2, state: 'submitted') } #a_traiter
let!(:dossier8) { create(:dossier, :with_user, procedure: procedure_admin_2, state: 'closed') } #termine
let!(:dossier9) { create(:dossier, :with_user, procedure: procedure_admin, state: 'closed') } #termine
let!(:dossier10) { create(:dossier, :with_user, procedure: procedure_admin, state: 'initiated', archived: true) } #a_traiter #archived
let!(:dossier11) { create(:dossier, :with_user, procedure: procedure_admin, state: 'replied', archived: true) } #en_attente #archived
let!(:dossier12) { create(:dossier, :with_user, procedure: procedure_admin, state: 'closed', archived: true) } #termine #archived
let!(:dossier1) { create(:dossier, procedure: procedure_admin, state: 'draft') }
let!(:dossier2) { create(:dossier, procedure: procedure_admin, state: 'initiated') } #a_traiter
let!(:dossier3) { create(:dossier, procedure: procedure_admin, state: 'initiated') } #a_traiter
let!(:dossier4) { create(:dossier, procedure: procedure_admin, state: 'replied') } #en_attente
let!(:dossier5) { create(:dossier, procedure: procedure_admin, state: 'updated') } #a_traiter
let!(:dossier6) { create(:dossier, procedure: procedure_admin_2, state: 'validated') } #en_attente
let!(:dossier7) { create(:dossier, procedure: procedure_admin_2, state: 'submitted') } #a_traiter
let!(:dossier8) { create(:dossier, procedure: procedure_admin_2, state: 'closed') } #termine
let!(:dossier9) { create(:dossier, procedure: procedure_admin, state: 'closed') } #termine
let!(:dossier10) { create(:dossier, procedure: procedure_admin, state: 'initiated', archived: true) } #a_traiter #archived
let!(:dossier11) { create(:dossier, procedure: procedure_admin, state: 'replied', archived: true) } #en_attente #archived
let!(:dossier12) { create(:dossier, procedure: procedure_admin, state: 'closed', archived: true) } #termine #archived
describe '#waiting_for_gestionnaire' do
subject { gestionnaire.dossiers.waiting_for_gestionnaire }

View file

@ -21,4 +21,13 @@ describe Etablissement do
it { is_expected.to belong_to(:entreprise) }
it { is_expected.to have_many(:exercices) }
end
describe '#geo_adresse' do
let(:etablissement) { create(:etablissement) }
subject { etablissement.geo_adresse }
it { is_expected.to eq '6 RUE RAOUL NORDLING IMMEUBLE BORA 92270 BOIS COLOMBES' }
end
end

View file

@ -10,4 +10,44 @@ describe ModuleAPICarto do
it { is_expected.to have_db_column(:quartiers_prioritaires) }
it { is_expected.to have_db_column(:cadastre) }
end
describe '#classes' do
let(:module_api_carto) { create(:module_api_carto, quartiers_prioritaires: qp, cadastre: cadastre) }
context 'when module api carto qp is true' do
let(:qp) { true }
let(:cadastre) { false }
subject { module_api_carto.classes }
it { is_expected.to eq 'qp ' }
end
context 'when module api carto cadastre is true' do
let(:qp) { false }
let(:cadastre) { true }
subject { module_api_carto.classes }
it { is_expected.to eq 'cadastre ' }
end
context 'when module api carto qp is true and cadastre is true' do
let(:qp) { true }
let(:cadastre) { true }
subject { module_api_carto.classes }
it { is_expected.to eq 'qp cadastre ' }
end
context 'when module api carto qp is false and cadastre is false' do
let(:qp) { false }
let(:cadastre) { false }
subject { module_api_carto.classes }
it { is_expected.to eq '' }
end
end
end

View file

@ -87,7 +87,7 @@ describe Procedure do
context 'when procedure have dossier with state draft' do
before do
create(:dossier, :with_user, procedure: procedure, state: :draft)
create(:dossier, procedure: procedure, state: :draft)
end
it { is_expected.to be_falsey }
@ -95,7 +95,7 @@ describe Procedure do
context 'when procedure have dossier with state initiated' do
before do
create(:dossier, :with_user, procedure: procedure, state: :initiated)
create(:dossier, procedure: procedure, state: :initiated)
end
it { is_expected.to be_truthy }

View file

@ -1,8 +1,23 @@
require 'spec_helper'
describe GeojsonService do
describe '.toGeoJsonPolygon' do
subject { JSON.parse(described_class.to_json_polygon coordinates) }
let(:good_coordinates) {
[
[5.93536376953125,
48.91888968903368],
[5.93536376953125,
49.26780455063753],
[7.094421386718749,
49.26780455063753],
[7.094421386718749,
48.91888968903368],
[5.93536376953125,
48.91888968903368]
]
}
describe '.toGeoJsonPolygonForQp' do
subject { JSON.parse(described_class.to_json_polygon_for_qp coordinates) }
describe 'coordinates are empty' do
let(:coordinates) { '' }
@ -12,23 +27,30 @@ describe GeojsonService do
end
describe 'coordinates are informed' do
let(:coordinates) {
[
[5.93536376953125,
48.91888968903368],
[5.93536376953125,
49.26780455063753],
[7.094421386718749,
49.26780455063753],
[7.094421386718749,
48.91888968903368],
[5.93536376953125,
48.91888968903368]
]
}
let(:coordinates) { good_coordinates }
it { expect(subject['geo']['type']).to eq('Polygon') }
it { expect(subject['geo']['coordinates']).to eq([coordinates]) }
end
end
describe '.toGeoJsonPolygonForCadastre' do
subject { JSON.parse(described_class.to_json_polygon_for_cadastre coordinates) }
describe 'coordinates are empty' do
let(:coordinates) { '' }
it { expect(subject['geom']['type']).to eq('Feature') }
it { expect(subject['geom']['geometry']['type']).to eq('Polygon') }
it { expect(subject['geom']['geometry']['coordinates']).to eq([coordinates]) }
end
describe 'coordinates are informed' do
let(:coordinates) { good_coordinates }
it { expect(subject['geom']['type']).to eq('Feature') }
it { expect(subject['geom']['geometry']['type']).to eq('Polygon') }
it { expect(subject['geom']['geometry']['coordinates']).to eq([coordinates]) }
end
end
end

View file

@ -1,7 +1,7 @@
require 'spec_helper'
RSpec.shared_examples 'not owner of dossier' do |controller, redirect|
let(:dossier_2) { create(:dossier, :with_user) }
let(:dossier_2) { create(:dossier) }
before do
get controller, dossier_id: dossier_2.id

View file

@ -5,9 +5,9 @@ describe 'backoffice/dossiers/index.html.haml', type: :view do
let(:gestionnaire) { create(:gestionnaire, administrateur: administrateur) }
let!(:procedure) { create(:procedure, administrateur: administrateur) }
let!(:decorate_dossier_initiated) { create(:dossier, :with_user, procedure: procedure, nom_projet: 'projet initiated', state: 'initiated').decorate }
let!(:decorate_dossier_replied) { create(:dossier, :with_user, procedure: procedure, nom_projet: 'projet replied', state: 'replied').decorate }
let!(:decorate_dossier_closed) { create(:dossier, :with_user, procedure: procedure, nom_projet: 'projet closed', state: 'closed').decorate }
let!(:decorate_dossier_initiated) { create(:dossier, procedure: procedure, nom_projet: 'projet initiated', state: 'initiated').decorate }
let!(:decorate_dossier_replied) { create(:dossier, procedure: procedure, nom_projet: 'projet replied', state: 'replied').decorate }
let!(:decorate_dossier_closed) { create(:dossier, procedure: procedure, nom_projet: 'projet closed', state: 'closed').decorate }
describe 'on tab a_traiter' do
before do

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe 'backoffice/dossiers/show.html.haml', type: :view do
let!(:dossier) { create(:dossier, :with_entreprise, :with_procedure, :with_user, state: state) }
let!(:dossier) { create(:dossier, :with_entreprise, :with_procedure, state: state) }
let(:state) { 'draft' }
let(:dossier_id) { dossier.id }
let(:gestionnaire) { create(:gestionnaire) }

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe 'dossiers/_infos_dossier.html.haml', type: :view do
let(:dossier) { create(:dossier, :with_entreprise, :with_user, procedure: create(:procedure, :with_api_carto, :with_type_de_champ)) }
let(:dossier) { create(:dossier, :with_entreprise, procedure: create(:procedure, :with_api_carto, :with_type_de_champ)) }
before do
assign(:facade, DossierFacades.new(dossier.id, dossier.user.email))

View file

@ -2,7 +2,7 @@ require 'spec_helper'
describe 'users/carte/show.html.haml', type: :view do
let(:state) { 'draft' }
let(:dossier) { create(:dossier, :with_procedure, :with_user, state: state) }
let(:dossier) { create(:dossier, :with_procedure, state: state) }
let(:dossier_id) { dossier.id }
before do

View file

@ -5,6 +5,7 @@ describe 'users/dossiers/index.html.haml', type: :view do
let!(:dossier) { create(:dossier, :with_procedure, user: user, state: 'initiated', nom_projet: 'projet de test').decorate }
let!(:dossier_2) { create(:dossier, :with_procedure, user: user, state: 'replied', nom_projet: 'projet répondu').decorate }
let!(:dossier_3) { create(:dossier, :with_procedure, user: user, state: 'replied', nom_projet: 'projet répondu 2').decorate }
let!(:dossier_termine) { create(:dossier, :with_procedure, user: user, state: 'closed').decorate }
describe 'params liste is a_traiter' do
@ -18,6 +19,10 @@ describe 'users/dossiers/index.html.haml', type: :view do
partial: "users/dossiers/list",
array: true))
assign(:liste, 'a_traiter')
assign(:dossiers_a_traiter_total, '1')
assign(:dossiers_en_attente_total, '2')
assign(:dossiers_termine_total, '1')
render
end
@ -36,6 +41,12 @@ describe 'users/dossiers/index.html.haml', type: :view do
it { is_expected.not_to have_content(dossier.nom_projet) }
it { is_expected.not_to have_content(dossier_termine.nom_projet) }
end
describe 'badges on tabs' do
it { is_expected.to have_content('À traiter 1') }
it { is_expected.to have_content('En attente 2') }
it { is_expected.to have_content('Terminé 1') }
end
end
describe 'params liste is en_attente' do

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe 'users/recapitulatif/_commentaires_flux.html.haml', type: :view do
let(:dossier) { create(:dossier, :with_procedure, :with_user) }
let(:dossier) { create(:dossier, :with_procedure) }
let(:dossier_id) { dossier.id }
let(:email_commentaire) { 'mon_mail_de_commentaire@test.com' }
let!(:commentaire) { create(:commentaire, dossier: dossier, email: email_commentaire, body: 'ma super description') }

View file

@ -1,7 +1,7 @@
require 'spec_helper'
describe 'users/recapitulatif/show.html.haml', type: :view do
let(:dossier) { create(:dossier, :with_user, :with_entreprise, state: state, procedure: create(:procedure, :with_api_carto)) }
let(:dossier) { create(:dossier, :with_entreprise, state: state, procedure: create(:procedure, :with_api_carto)) }
let(:dossier_id) { dossier.id }
let(:state) { 'draft' }