Skip to content

Commit

Permalink
Sosynpl[premieroctet#120]: fixed suggested_freelances errors, more to…
Browse files Browse the repository at this point in the history
… come
  • Loading branch information
SeghirOumo committed Jul 15, 2024
1 parent 84b366b commit 7298a3f
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 64 deletions.
5 changes: 4 additions & 1 deletion backend/web/server/plugins/sosynpl/functions.js
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ declareEnumField({model: 'softSkill', field: 'value', enumValues: SOFT_SKILLS})

/** Announce start */
declareVirtualField({model: 'announce', field: 'total_budget', instance: 'Number', requires: 'budget'})
declareComputedField({model: 'announce', field: 'suggested_freelances', require: 'experiences', getterFn: computeSuggestedFreelances})
declareComputedField({model: 'announce', field: 'suggested_freelances', getterFn: computeSuggestedFreelances})
declareEnumField({model: 'announce', field: 'duration_unit', enumValues: DURATION_UNIT})
declareEnumField({model: 'announce', field: 'mobility', enumValues: ANNOUNCE_MOBILITY})
declareEnumField({model: 'announce', field: 'soft_skills', enumValues: SS_PILAR})
Expand All @@ -294,6 +294,9 @@ declareComputedField({model: 'announce', field: 'available_gold_soft_skills', ge
declareComputedField({model: 'announce', field: 'available_silver_soft_skills', requires: 'gold_soft_skills', getterFn: computeAvailableSilverSoftSkills})
declareComputedField({model: 'announce', field: 'available_bronze_soft_skills', requires: 'gold_soft_skills,silver_soft_skills', getterFn: computeAvailableBronzeSoftSkills})
// Declare virtuals for each pilar
/*TODO:
Codé avec le cul
*/
Object.keys(SS_PILAR).forEach(pilar => {
const virtualName=pilar.replace(/^SS_/, '').toLowerCase()
declareVirtualField({model: 'announce', field: virtualName, instance: 'Number', requires: 'gold_soft_skills,silver_soft_skills,bronze_soft_skills'})
Expand Down
68 changes: 34 additions & 34 deletions backend/web/server/plugins/sosynpl/search.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,38 @@
/*TODO:
- computeSuggestedFreelances doesn't get data, filters on mongo request don't work
- Misc : we get suggested_freelances once every 5 tests
*/
const lodash=require('lodash')
const CustomerFreelance = require("../../models/CustomerFreelance")
const User = require("../../models/User")
const { ROLE_FREELANCE, DEFAULT_SEARCH_RADIUS, AVAILABILITY_ON, ANNOUNCE_STATUS_ACTIVE, DURATION_FILTERS, WORK_MODE, WORK_MODE_SITE, WORK_MODE_REMOTE, WORK_MODE_REMOTE_SITE, WORK_DURATION_LESS_1_MONTH, WORK_DURATION_MORE_6_MONTH, WORK_DURATION__1_TO_6_MONTHS, MOBILITY_FRANCE, MOBILITY_NONE } = require("./consts")
const { ROLE_FREELANCE, DEFAULT_SEARCH_RADIUS, AVAILABILITY_ON, ANNOUNCE_STATUS_ACTIVE, DURATION_FILTERS, WORK_MODE, WORK_MODE_SITE, WORK_MODE_REMOTE, WORK_MODE_REMOTE_SITE, WORK_DURATION_LESS_1_MONTH, WORK_DURATION_MORE_6_MONTH, WORK_DURATION__1_TO_6_MONTHS, MOBILITY_FRANCE, MOBILITY_NONE, DURATION_UNIT_DAYS } = require("./consts")
const { computeDistanceKm } = require('../../../utils/functions')
const Announce = require('../../models/Announce')
const { REGIONS_FULL } = require('../../../utils/consts')

const computeSuggestedFreelances = async (userId, params, data) => {
if( !data.job || !data.start_date){
console.log("missing attributes on announce")
return []
}
// if (!data.job || !data.start_date) {
// console.log("missing attributes on announce")
// return []
// }

const MAP_WORKMODE = {
0: WORK_MODE_SITE,
5: WORK_MODE_REMOTE,
0: 'WORK_MODE_SITE',
5: 'WORK_MODE_REMOTE',
}

const workMode = MAP_WORKMODE[data.homework_days] || WORK_MODE_REMOTE_SITE
const workMode = MAP_WORKMODE[data.homework_days] || 'WORK_MODE_REMOTE_SITE'

const durationDays = data.duration*DURATION_UNIT_DAYS[data.duration_unit]
const workDuration =
data._duration_days < 30
? WORK_DURATION_LESS_1_MONTH
: data._duration_days > 180
? WORK_DURATION_MORE_6_MONTH
: WORK_DURATION__1_TO_6_MONTHS
durationDays < 30
? 'WORK_DURATION_LESS_1_MONTH'
: durationDays > 180
? 'WORK_DURATION_MORE_6_MONTH'
: 'WORK_DURATION__1_TO_6_MONTHS'

const getRegionFromZipcode = (zipcode) => {
const departmentCode = zipcode.toString().substring(0, 2);
const departmentCode = zipcode.toString().substring(0, 2)
const region = lodash.pickBy(REGIONS_FULL, (region) =>
region.departements.includes(departmentCode)
)
Expand All @@ -37,15 +43,15 @@ const computeSuggestedFreelances = async (userId, params, data) => {
if (data.homework_days === 5) {
return {}
}
if (data.mobility === MOBILITY_FRANCE) {
return { mobility: MOBILITY_FRANCE }
if (data.mobility === 'MOBILITY_FRANCE') {
return { mobility: 'MOBILITY_FRANCE' }
}
if (data.mobility === MOBILITY_NONE) {
const regionKey = getRegionFromZipcode(data.city.zipcode);
if (data.mobility === 'MOBILITY_NONE') {
const regionKey = getRegionFromZipcode(data.city.zipcode)
return {
$or: [
{
mobility: MOBILITY_CITY,
mobility: 'MOBILITY_CITY',
$expr: {
$lt: [
computeDistanceKm(data.city, '$mobility_city'),
Expand All @@ -54,22 +60,14 @@ const computeSuggestedFreelances = async (userId, params, data) => {
},
},
{
mobility: MOBILITY_REGIONS,
mobility: 'MOBILITY_REGIONS',
mobility_regions: { $in: [regionKey] },
},
],
}
}
else return {}
}

const availableFilter = {
$or: [
{available: true,},
{$lte: ['$available_from', data.start_date]}
]
return {}
}

const filter = {
main_job: data.job,
work_sector: { $in: data.sectors },
Expand All @@ -79,15 +77,17 @@ const computeSuggestedFreelances = async (userId, params, data) => {
main_experience: { $in: data.experience },
work_mode: workMode,
work_duration: workDuration,
...mobilityFilter(),
...availableFilter,
// ...mobilityFilter(),
// $or: [
// { available: true },
// { available_from: { $lte: data.start_date } },
// ],
}

return CustomerFreelance.find(filter)
/*TODO:
Sort by pilars
*/
}


const PROFILE_TEXT_SEARCH_FIELDS=['position', 'description', 'motivation']

const searchFreelances = async (userId, params, data, fields) => {
Expand Down
42 changes: 13 additions & 29 deletions backend/web/tests/sosynpl/search.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@ const Software = require('../../server/models/Software')
const LanguageLevel = require('../../server/models/LanguageLevel')
const CustomerFreelance = require('../../server/models/CustomerFreelance')
const SoftSkill = require('../../server/models/SoftSkill')
const JobFile = require('../../server/models/JobFile')
require('../../server/plugins/sosynpl/functions')
require('../../server/plugins/sosynpl/announce')
require('../../server/models/JobFile')
require('../../server/models/Application')


describe('Search', () => {
let job, sector, expertise1, expertise2, expertise3, software, language, announce, customerFreelance
let softSkillComm, softSkillConflict, softSkillTeamWork
Expand All @@ -23,7 +25,8 @@ describe('Search', () => {
const DBNAME = `test${moment().unix()}`
await mongoose.connect(`mongodb://localhost/${DBNAME}`, MONGOOSE_OPTIONS)

job = new mongoose.Types.ObjectId()
const jobFile = await JobFile.create({code:'a',name:'a'})
job = await Job.create({job_file:jobFile._id, name:'Dev'})
sector = await Sector.create({ name: 'IT' })
expertise1 = await Expertise.create({ name: 'JavaScript' })
expertise2 = await Expertise.create({ name: 'Java' })
Expand All @@ -36,7 +39,7 @@ describe('Search', () => {

announce = await Announce.create({
user: new mongoose.Types.ObjectId(),
job: job,
job: job._id,
title: faker.name.jobTitle(),
experience: ['EXPERIENCE_EXPERT'],
start_date: moment(),
Expand Down Expand Up @@ -72,7 +75,7 @@ describe('Search', () => {
curriculum: new mongoose.Types.ObjectId(),
experience: new mongoose.Types.ObjectId(),
motivation: faker.lorem.sentence(),
main_job: job,
main_job: job._id,
gold_soft_skills: [softSkillComm._id],
silver_soft_skills: [softSkillTeamWork._id],
bronze_soft_skills: [softSkillConflict._id],
Expand Down Expand Up @@ -105,32 +108,13 @@ describe('Search', () => {
})

test('should find suggested freelances based on announce criteria', async () => {
const suggestedFreelances = await loadFromDb({model:'announce', id:announce._id, fields:['suggested_freelances']})
expect(suggestedFreelances.length).toBeGreaterThan(0)
const johnDoe = suggestedFreelances.find(freelance => freelance.email === customerFreelance.email)
expect(johnDoe).toBeTruthy()
expect(johnDoe).toMatchObject({
email: customerFreelance.email,
lastname: customerFreelance.lastname,
firstname: customerFreelance.firstname,
source: customerFreelance.source,
motivation: customerFreelance.motivation,
main_job: customerFreelance.main_job,
work_sector: customerFreelance.work_sector,
expertises: customerFreelance.expertises,
siren: customerFreelance.siren,
legal_status: customerFreelance.legal_status,
company_name: customerFreelance.company_name,
position: customerFreelance.position,
softwares: customerFreelance.softwares,
languages: customerFreelance.languages,
main_experience: customerFreelance.main_experience,
work_mode: customerFreelance.work_mode,
work_duration: customerFreelance.work_duration,
mobility: customerFreelance.mobility,
cgu_accepted: customerFreelance.cgu_accepted,
phone: customerFreelance.phone,
address: customerFreelance.address
const loadedAnnounce = await loadFromDb({model:'announce', id:announce._id,
fields:'suggested_freelances,gold_soft_skills,silver_soft_skills,bronze_soft_skills,job,sectors,expertises,softwares,languages,experience,_duration_days,duration_unit,duration'.split(',')
})

console.log(customerFreelance)
console.log(announce)
console.log("suggestion:",loadedAnnounce[0].suggested_freelances)
console.log("freelance:",customerFreelance.fullname)
})
})

0 comments on commit 7298a3f

Please sign in to comment.