GISAPI
API for AIESEC's Global Information System
Refactor Post Experience Surveys
November 22nd, 2024
add new keys for outgoing open to applied
  • o_sign_up_count_to_applied_count_<programme_id>
  • o_sign_up_to_applied_time_<programme_id>
  • total_sign_up_count_to_applied_count
  • total_sign_up_to_applied_time
remove status filter

change label for Time Period to Signed Up At
Post Experience Surveys
November 18th, 2024
Deprecated API's
  1. ldaReport in favour of surveyResponseDetail
  2. nps_survey
  3. survey_details
 New Fields added on Opportunity Application
  1. youth_nps_response
  2. youth_lps_response
  3. standards_response
New Argument on field survey_questions in survey object.
  • main_questions_only takes Boolean, filter out subquestions in survey_questions field.
Survey API's
  • no change in submitting survey response api, takes json of question_id as key and response as value.
  • surveyResponseDetail api is added, for all survey types.
query SurveyDetails($survey_uuid: String!) {
  surveyResponseDetail(survey_uuid: $survey_uuid) {
    id
    survey_uuid
    answers
    completed_at
    survey {
      title
      survey_questions(main_questions_only: true) {
        id
        question_text
        position
        subquestions {
          id
          position
          question_text
        }
        standard { # for standard's
          id
          name
          meta
        }
        leadership_value { # for lda's
          id
          name
          meta
        }
      }
    }
    opportunity_application {
      id
      intial_lda_report {
        survey_uuid
      }
      middle_lda_report {
        survey_uuid
      }
      end_lda_report {
        survey_uuid
      }
      youth_nps_response {
        survey_uuid
      }
      youth_lps_response {
        survey_uuid
      }
      standards_response {
        survey_uuid
      }
    }
  }
}

Conversion Analytics Refactor
November 12th, 2024
  • Conversion analytics is refactored to do calculations only at BE.
  • arguments:
access_token: sometoken
start_date: 2023-08-07
end_date: 2024-08-15
conversion_v3[office_id]: 1626
conversion_v3[campaign_filter]: 12 (optional)

  • sample response
{
  "1626": {
    "i_applied_count_to_accepted_count_7": 61.54,
    "o_applied_count_to_accepted_count_7": 61.54,
    "o_applied_count_to_accepted_count_9": 60.0,
    "i_applied_count_to_accepted_count_8": 38.89,
    "i_applied_count_to_accepted_count_9": 60.0,
    "o_applied_count_to_accepted_count_8": 38.89,
    "total_applied_count_to_accepted_count": 51.22,
    "o_accepted_count_to_approved_count_7": 100.0,
    "i_accepted_count_to_approved_count_8": 100.0,
    "i_accepted_count_to_approved_count_9": 100.0,
    "i_accepted_count_to_approved_count_7": 100.0,
    "o_accepted_count_to_approved_count_9": 100.0,
    "o_accepted_count_to_approved_count_8": 100.0,
    "total_accepted_count_to_approved_count": 100.0,
    "i_approved_count_to_realized_count_7": 50.0,
    "i_approved_count_to_realized_count_8": 57.14,
    "i_approved_count_to_realized_count_9": 33.33,
    "o_approved_count_to_realized_count_8": 57.14,
    "o_approved_count_to_realized_count_9": 33.33,
    "o_approved_count_to_realized_count_7": 50.0,
    "total_approved_count_to_realized_count": 47.62,
    "i_applied_to_accepted_time_9": 0,
    "i_applied_to_accepted_time_8": 0,
    "i_applied_to_accepted_time_7": 0,
    "o_applied_to_accepted_time_9": 0,
    "o_applied_to_accepted_time_8": 0,
    "o_applied_to_accepted_time_7": 0,
    "total_applied_to_accepted_time": 0,
    "i_accepted_to_approved_time_9": 0,
    "i_accepted_to_approved_time_8": 0,
    "i_accepted_to_approved_time_7": 0,
    "o_accepted_to_approved_time_7": 0,
    "o_accepted_to_approved_time_8": 0,
    "o_accepted_to_approved_time_9": 0,
    "total_accepted_to_approved_time": 0,
    "i_approved_to_realized_time_8": 0,
    "i_approved_to_realized_time_7": 0,
    "i_approved_to_realized_time_9": 0,
    "o_approved_to_realized_time_9": 0,
    "o_approved_to_realized_time_7": 0,
    "o_approved_to_realized_time_8": 0,
    "total_approved_to_realized_time": 0,
    "total_sign_up_to_applied_count": 13.79,
    "total_sign_up_to_applied_time": 0
  },
  "489": {
    "i_applied_count_to_accepted_count_8": 0.0,
    "i_applied_count_to_accepted_count_9": 100.0,
    "total_applied_count_to_accepted_count": 50.0,
    "i_accepted_count_to_approved_count_9": 100.0,
    "total_accepted_count_to_approved_count": 100.0,
    "i_approved_count_to_realized_count_9": 0.0,
    "total_approved_count_to_realized_count": 0.0,
    "total_applied_to_accepted_time": 0,
    "total_accepted_to_approved_time": 0,
    "total_approved_to_realized_time": 0,
    "total_sign_up_to_applied_count": null
  },
  "506": {
    "i_applied_count_to_accepted_count_9": 100.0,
    "total_applied_count_to_accepted_count": 100.0,
    "i_accepted_count_to_approved_count_9": 100.0,
    "total_accepted_count_to_approved_count": 100.0,
    "i_approved_count_to_realized_count_9": 0.0,
    "total_approved_count_to_realized_count": 0.0,
    "total_applied_to_accepted_time": 0,
    "total_accepted_to_approved_time": 0,
    "total_approved_to_realized_time": 0,
    "total_sign_up_to_applied_count": 0.0
  }
}
  • field types:
  1. count field - show percentage of one status to other.
  2. time field - show number of days for changing status.
  • How to display field data on FE:
    • example field: i_applied_count_to_accepted_count_9
      • first character i display incoming or outgoing application
      • last character 9 displays programme id. it will always be 7, 8, 9
      • applied_count_to_accepted_count, denotes <intial status name>_count_to_<final status name>_count
    • example field: i_approved_to_realized_time_8
      • same logic for first and last character.
      • approved_to_realized_time, denotes <intial status name>_to_<final status name>_time
    • example field: total_approved_count_to_realized_count
      • denotes total count for one status change to another
      • total_<intial status name>_count_to_<final status count>_count
    • example field: total_approved_to_realized_time
      • denotes total time in days for one status change to another
      •  total_<intial status name>_to_<final status count>_time

NOTE: sign up to applied will only have total count and total days, programme id aggregation is not possible for it.
Add is_interviewed to opportunity application
November 7th, 2024
  • on opportunity application input, a new field is_interviewed is added.
  • on opportunity application object, a new field is_interviewed is added.
  • on opportunity application filter input, a new field is_interviewed is added. which takes a boolean value i.e. true of false.
Add is_default key to cover photo
September 12th, 2024
for a new opportunity, a new key is added is_default indicating a cover photo is default or not.

example response:
      "cover_photo": {
        "url": "https://s3.eu-west-1.amazonaws.com/gis-development/6s0cxvfp0pbcj9sd2odj13cxznok",
        "filename": "default-cover-photo.jpg",
        "is_default": true
      }
Add alternate email
September 10th, 2024
  • new field is added in person input object.
    example:
{	"person": {
		"alternate_email": "test@commutatus.com"
	}
}

  • new field is added in currentPerson and person object.
alternate_email
Add is_aiesecer filter
September 6th, 2024
  • is_aiesecer filter is added in the following analytics.
  • We need to add a query parameter for the is_aiesecer filter. Below are the analytics name and query params required for it.
  • value can be either "true" or "false".

  • Performance Analytics
performance_v3[is_aiesecer]
  • Graphical Analytics
histogram[is_aiesecer]
  • E2E
e_to_e_v1[is_aiesecer]
  • E2E Standards
standards_e2e[is_aiesecer]
  • Funnel
conversion_v2[is_aiesecer]
  • LPS
is_aiesecer
  • NPS
is_aiesecer
  • for opportunity_application this filter is already there.
Expa Banners
August 30th, 2024
  • new expa_banners field is added on currentPerson query.
query CurrentPerson {
  currentPerson {
    id
    full_name
    email
    expa_banners {
      id
      office {
        id
        name
      }
      role_name
      content_url
      image_url
      start_date
      end_date
      status
    }
  }
}

Conversion Analytics
August 27th, 2024
  • query parameters 
    • access_token
    • start_date
    • end_date
    • conversion_v3[office_id]
    • conversion_v3[status] - sign_up, applied, approved, realized, completed
    • conversion_v3[campaign_filter] - provide campaign_id as value

  • response example
    "i_accepted_to_approved_time_9": {
      "meta": {},
      "doc_count": 6,
      "children": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": 489,
            "doc_count": 1,
            "approval_avg": {
              "value": 1723094976000.0,
              "value_as_string": "2024-08-08T05:29:36.000Z"
            },
            "created_avg": {
              "value": 1723094610552.0,
              "value_as_string": "2024-08-08T05:23:30.552Z"
            }
          },
          {
            "key": 506,
            "doc_count": 1,
            "approval_avg": {
              "value": 1723094976000.0,
              "value_as_string": "2024-08-08T05:29:36.000Z"
            },
            "created_avg": {
              "value": 1723094609765.0,
              "value_as_string": "2024-08-08T05:23:29.765Z"
            }
          },
          {
            "key": 567,
            "doc_count": 1,
            "approval_avg": {
              "value": 1723094977000.0,
              "value_as_string": "2024-08-08T05:29:37.000Z"
            },
            "created_avg": {
              "value": 1723094610358.0,
              "value_as_string": "2024-08-08T05:23:30.358Z"
            }
          },
          {
            "key": 1554,
            "doc_count": 1,
            "approval_avg": {
              "value": 1723094959000.0,
              "value_as_string": "2024-08-08T05:29:19.000Z"
            },
            "created_avg": {
              "value": 1723094610772.0,
              "value_as_string": "2024-08-08T05:23:30.772Z"
            }
          },
          {
            "key": 1577,
            "doc_count": 1,
            "approval_avg": {
              "value": 1723094959000.0,
              "value_as_string": "2024-08-08T05:29:19.000Z"
            },
            "created_avg": {
              "value": 1723094610715.0,
              "value_as_string": "2024-08-08T05:23:30.715Z"
            }
          },
          {
            "key": 1610,
            "doc_count": 1,
            "approval_avg": {
              "value": 1723094976000.0,
              "value_as_string": "2024-08-08T05:29:36.000Z"
            },
            "created_avg": {
              "value": 1723094569031.0,
              "value_as_string": "2024-08-08T05:22:49.031Z"
            }
          }
        ]
      },
      "approval_avg": {
        "value": 1723094970500.0,
        "value_as_string": "2024-08-08T05:29:30.500Z"
      },
      "created_avg": {
        "value": 1723094603532.1667,
        "value_as_string": "2024-08-08T05:23:23.532Z"
      }
    },
    "o_completed_count_9": {
      "meta": {},
      "doc_count": 1,
      "children": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": 1709,
            "doc_count": 1,
            "applicants": {
              "value": 1
            }
          }
        ]
      },
      "applicants": {
        "value": 1
      }
    }
    "o_finished_count_7": {
      "meta": {},
      "doc_count": 4,
      "children": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": 1552,
            "doc_count": 1,
            "applicants": {
              "value": 1
            }
          },
          {
            "key": 1570,
            "doc_count": 1,
            "applicants": {
              "value": 1
            }
          },
          {
            "key": 1588,
            "doc_count": 1,
            "applicants": {
              "value": 1
            }
          },
          {
            "key": 1617,
            "doc_count": 1,
            "applicants": {
              "value": 1
            }
          }
        ]
      },
      "applicants": {
        "value": 4
      }
    },

  • response explanation
    • i_accepted_to_approved_time_9
      • i denotes incoming, and o denotes outgoing.
      • accepted_to_approved_time is the of accepted to approval
      • 9 denotes program ID, other program IDs are 7 and 8
    • for time
      • we can calculate the average from the created-approval average this will give the average time of creation to approval.
      •       "approval_avg": {
                "value": 1723094970500.0,
                "value_as_string": "2024-08-08T05:29:30.500Z"
              },
              "created_avg": {
                "value": 1723094603532.1667,
                "value_as_string": "2024-08-08T05:23:23.532Z"
              }
    • for count
      • we can find a percentage from to/from, for example: finished/completed will give a percentage of finished to completed.
    • for suboffices
      • for suboffices you will use the children key, in this, there will be buckets that will represent suboffices.
      • here, the key is the suboffice ID and applicants. value represents the count for this suboffice in a given time range and status.
      • This applies to both the count and time average.
      • "buckets": [
                  {
                    "key": 1552,
                    "doc_count": 1,
                    "applicants": {
                      "value": 1
                    }
                  },
Opportunity Application status count query
August 2nd, 2024
  • for opportunity application status aggregation count, a new query field is introduced on opportunity object applications_status_count and the previous one applications_status_facets is deprecated .
  • it will return a json response with status as key and count as value.
response example:
        "applications_status_count": {
            "matched": 1,
            "approved": 1,
            "withdrawn": 4,
            "rejected": 19,
            "open": 20
          },
example:
query GetMyOpportunities($page: Int, $per_page: Int, $q: String, $filters: OpportunityFilter) {
  myOpportunities(page: $page, per_page: $per_page, q: $q, filters: $filters) {
    paging {
      total_items
      total_pages
      current_page
      __typename
    }
    data {
        applicants_count
        applications_close_date
        applications_status_count
        id
        title
      __typename
    }
    __typename
  }
}

Granular Access Management for Positions
July 18th, 2024
queries:
  • added a new field has_access_to_people_data in the member position query
  • example:
query GetPerson {
  getPerson(id: "2") {
    id
    full_name
    member_positions {
      has_access_to_people_data
    }
  }
}
mutation:
  • added an argument has_access_to_people_data in the member position mutation
  • example:
mutation CreateMemberPosition {
  createMemberPosition(member_position: {person_email: "mahaveer@commutatus.com", term_id: 22039, role_id: 21755, office_id: 54, title: "Testing", has_access_to_people_data: true}) {
    id
    has_access_to_people_data
  }
}
  • Users with access will be able to see the people and applications, there is no need to pass a filter for this.
LDA Survey
June 20th, 2024
queries:
  • survey
    • arguments: survey_type, example: intial_lda, middle_lda, end_lda
    • NOTE: subquestions in the below query denote options for the questions. is_main_question is a boolean key that helps in distinguishing questions and subquestions.
example:
query LDASurvey {
  survey(survey_type: "intial_lda") {
    id
    survey_questions {
      id
      is_main_question
      is_mandatory
      position
      question_type
      question_text
      subquestions {
        id
        position
        question_text
        question_type
      }
      sanitize_meta
      leadership_value {
        id
        name
        meta
      }
    }
  }
}
  • lda_report
    • arguments: survey_uuid, description: can be obtained from opportunity_application query.
example:
query LDASurveyReport {
  ldaReport(survey_uuid: "6fc50732-d9ae-47dc-a79b-4d821a89eaec") {
    id
    associated_surveys {
      survey {
        survey_type
      }
      survey_uuid
      report {
        score
      }
    }
    can_fill
    survey {
      id
      title
    }
    report {
      leadership_value {
        name
        meta
      }
      score
    }
    survey_uuid
    completed_at
    opportunity_application {
      id
      opportunity {
        title
      }
      person {
        full_name
      }
    }
  }
}
  • added 3 more fields in opportunity_application type.
example:
query OpportunitApplication {
  getApplication(id: 42) {
    id
    intial_lda_report {
      id
      completed_at
      can_fill
      survey_uuid
    }
    middle_lda_report {
      id
      completed_at
      can_fill
      survey_uuid
    }
    end_lda_report {
      id
      completed_at
      can_fill
      survey_uuid
    }
  }
}

mutation:
  • survey_answer
    • arguments: survey_uuid, description: can be obtained from opportunity_application or lda_report query.
    • arguments: responses, description: takes an array of objects with question_id and answer (which will be scored from range 1 to 5).
example:
mutation CreateSurvery {
  surveyAnswer(
    survey_uuid: "73c889bd-a677-4c83-8f6b-a46589ab2199"
    responses: [
      { question_id: "365", answer: "1" }
      { question_id: "371", answer: "3" }
      { question_id: "377", answer: "2" }
      { question_id: "383", answer: "5" }
      { question_id: "389", answer: "4" }
      { question_id: "395", answer: "4" }
    ]
  )
}

Expose Email in Branch Employee
June 11th, 2024
  • A new email field is added in the branch employee type.
  • Only users from the same branch can see this field.
    example:
	branchEmployees {
		id
		email
	}
Delete Opportunity
May 28th, 2024
- mutation to delete an opportunity.
example:
mutation DeleteOpportunity {
  deleteOpportunity(id: "38")
}
- a new field added in opportunity permission for can_delete
example:
query Opportunity {
	opportunity(id: "35") {
		id
		permissions {
                  can_delete
                }
        }
}
Optional Weekly Activity
May 27th, 2024
- The weekly activities query has added two more keys in response, is_mandatory, and is_active

-  is_mandatory shows if the weekly activity is optional or not.

- is_active shows if the weekly activity is removed or not.

- The weekly activity query will take public_facing_only as an argument only to show active weekly activity i.e. weekly activity which is not removed. (for YOP).

example:
query Opportunity {
  opportunity(id: "35") {
    id
    weekly_activities(public_facing_only: true) {
      id
      is_mandatory
  is_active
}
}
}

- mutation to remove optional weekly activities.
example:
mutation RemoveOptionalWeekActivities {
  removeOptionalWeekActivities(
    opportunity_id: "35"
    weekly_activities_ids: ["1", "10"]
  ) {
    activity
    id
    is_active
    is_mandatory
    is_templated
    week
  }
}

Expa Usage Policy
May 24th, 2024
a new mutation to mark Expa Usage Policy
example:
mutation AcceptExpaUsagePolicy {
  acceptExpaUsagePolicy {
    id
    accepted_expa_usage_policy_at
    email
  }
}
a new field in currentPerson query for getting accepted_expa_usage_policy_at
example:
query CurrentPerson {
  currentPerson {
    accepted_expa_usage_policy_at
  }
}
Email Usage Policy
May 24th, 2024
a new mutation to mark Email Usage Policy
example:
mutation AcceptEmailUsagePolicy {
  acceptEmailUsagePolicy {
    id
    accepted_email_usage_policy_at
    email
  }
}
a new field in currentPerson query for getting accepted_expa_usage_policy_at which will be datetime
example:
query CurrentPerson {
  currentPerson {
    accepted_email_usage_policy_at
  }
}
Email Request
May 24th, 2024
  • mutation to create an email request requires an email in argument. 
    example:
mutation CreateEmailRequest {
  createEmailRequest(email: "mahaveer3@commutatus.com") {
    approved_at
    created_at
    email
    expired_at
    id
    rejected_at
    status
    updated_at
    permissions {
      can_approve
      can_reject
    }
    member {
      full_name
      home_lc {
        id
        name
      }
      id
    }
  }
}

  • mutation to approve an email request requires the id of an email request.
    example:
mutation ApproveEmailRequest {
  approveEmailRequest(id: "9") {
    approved_at
    approved_by {
      id
      full_name
    }
  }
}

  • mutation to reject an email request requires the id of an email request.
    example:
mutation RejectEmailRequest {
  rejectEmailRequest(id: "9") {
    rejected_at
    rejected_by {
      id
      full_name
    }
  }
}

  • query to get all email requests with pagination.
example:
query EmailRequests {
  emailRequests(pagination: { per_page: 10, page: 1 }) {
    data {
      approved_at
      created_at
      email
      expired_at
      id
      rejected_at
      status
      updated_at
      approved_by {
        id
        full_name
      }
      rejected_by {
        id
        full_name
      }
      permissions {
        can_approve
        can_reject
      }
      member {
        full_name
        home_lc {
          id
          name
        }
        id
      }
    }
    paging {
      current_page
      total_items
      total_pages
    }
  }
}
  • member will be the person who requested an email and it will return the Person type and we can get home_lc from it.
  • permissions will have can_approve and can_reject for permission to approve and reject an email request.
  • approved_by and rejected_by will also be of Person type.

  • Filter based on mc are added now.
    example:
emailRequests(pagination: { per_page: 10, page: 1 }, filters: { mc_id: "79" })
Filter committee based on parent
May 8th, 2024
We have added a filter in the committees query to get the records based on the parent. This will help to get the countries (MCs) under a specific region or cities/universities (LCs) under the country.

Sample query:
query Committee {
  committees(filters: { parent: 1630 }) {
    data {
      id
      name
    }
  }
}
LPS Analytics API
March 7th, 2023
A REST API endpoint is created to measure LPS survey response.

It uses elastic search and aggregates to obtain doc_count for different states

entity_id, used for entity filter, is a mandatory param that must be passed along with access_token. Other params that can be used are
  1. start_date and end_date for the time filter.
  2. programme for Product filter. It accepts the value of Programme IDs(7, 8,9). 
  3. entity_type for Incoming or Outgoing products. Two available options for this filter are person and opportunity.
GET /v2/surveys/analytics.json

Sample request
https://analytics.api.aiesec.org/v2/surveys/analytics.json?access_token=<access_token>&start_date=<start_date>&end_date=<end_date>&entity_id=<office_id>&entity_type=<person/opportunity>&programme=<7,8,9>

Sample response
{
  "analytics": {
    "total_finished": {
      "doc_count": 5
    },
    "children": {
      "meta": {},
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": []
    },
    "total_detractors": {
      "meta": {},
      "doc_count": 1,
      "avg_nps_score": {
        "value": 2
      }
    },
    "total_promoters": {
      "meta": {},
      "doc_count": 1,
      "avg_nps_score": {
        "value": 9
      }
    },
    "total_responses": {
      "meta": {},
      "doc_count": 2,
      "avg_nps_score": {
        "value": 5.5
      }
    },
    "total_passives": {
      "meta": {},
      "doc_count": 0,
      "avg_nps_score": {
        "value": null
      }
    }
  }
}
Query: content_section
March 7th, 2023
Description:

This query returns all the content sections sorted by ascending order using position by default. We support a new argument sort_direction.

New Argument:

sort_direction - This argument determines whether the array would be sorted in ascending order or descending order. The valid inputs are asc and desc.

Sample Query:

query ContentSections {
  contentSections(sort_direction: asc) {
    id
    redirect_url
    content_image {
      id
      filesize
      filename
      url
    }
    position
  }
}
Sample Response:

{
  "data": {
    "contentSections": [
      {
        "id": "5",
        "redirect_url": "https://www.pixelstalk.net/wp-content/uploads/images6/Funny-Anya-Forger-Wallpaper-HD.jpg",
        "content_image": null,
        "position": 1
      },
      {
        "id": "8",
        "redirect_url": "https://www.pixelstalk.net/wp-content/uploads/images6/Funny-Anya-Forger-Wallpaper-HD.jpg",
        "content_image": null,
        "position": 2
      },
      {
        "id": "7",
        "redirect_url": "https://www.pixelstalk.net/wp-content/uploads/images6/Funny-Anya-Forger-Wallpaper-HD.jpg",
        "content_image": null,
        "position": 3
      }
    ]
  }
}
Added delete Department API
March 7th, 2023
The API to delete Department in the manage committee page is added.

Graphql API mutation name - archiveCommitteeDepartment

Use permission can_archive in the permission object to show the delete button.

Technically, In API, we will achieve and not return in the API response. This is why there is a discrepancy between API(archive) and Desing(delete). 

Added update MemberPosition API
March 7th, 2023
The API to update MemberPosition is added.

Graphql API mutation name - updateMemberPosition

Use permission can_update in the permission object to show the edit button.


Added Advancement % in Recruitment analytics
March 7th, 2023
There is a requirement to show the members and advanced count in existing recruitment analytics. We have created a new analytics API to show these details.

API endpoint - /v2/applications/analyze.json?&advancement[office_id]=630&start_date=2021-01-01&end_date=2022-12-30&access_token=XXXX

Response:
{
  "analytics": {
    "advanced_count": {
      "meta": {},
      "doc_count": 1,
      "members": {
        "value": 1
      }
    },
    "positions_count": {
      "meta": {},
      "doc_count": 2,
      "members": {
        "value": 1
      }
    }
  }
}

Use value key inside members object from positions_count hash for Member and use value key inside members object from advanced_count hash for ADV count. The ADV percentage should be calculated in FE.  

Added VPP API support
March 7th, 2023
Please refer to the following changes to VPP integration:
  • Add experience_type field in opportunity input. The enum options are physical, semi-remote and remote.
  • Exposed the experience_type in the OpporutunityType response
  • Added experience_type filter argument in Opportunity filter which is used in Opportunities API. This needs to be implemented in EXPA and YOP.
  • Added experience_type filter argument in Application filter which is used in Applications API.
  • Remove partly_remove filter in opportunity and applications CRM in EXPA and YOP. 
  • Remove API endpoints(mark_opportunity_remote, unmark_opportunity_remote) which were used to mark and unmark opportunities as semi-remote on the opportunity details page.
  • Added experience_type to programme_fees object in committees API. This is used in the fees section on the Committees details page under the youth opportunity portal side nav
Note: In API, we also did changes in permission objects such as can_open in opportunity and can_be_remote_realized in opportunity application to use the newly added field(experience_type). 





Added API changes for Home page requirements
August 11th, 2022
Spotlight section:

T
o get the list of spotlight sections use the following query
query{
  contentSections{
    id
    redirect_url
    content_image{
      filename
      url
    }
  }
}

Opportunity and project count for SDG:

Have added both the counts in SDG API.
query{
  sdgGoals(active_opportunities: true){
    id
    project_and_opportunities_count
  }
}

active_opportunities filter is required to return only SDGs which has active opportunities.
project_and_opportunities_count object will return JSON object which will have opportunities_count and projects_count
Added argument to support login/signup page in Auth
August 11th, 2022
The login CTA from aiesec.org takes to the signup page by default. Now we have added an argument called authentication_type which accepts login/signup values. Based on this value the login or signup page will be shown.

AUTH URL - https://auth.aiesec.org/oauth/authorize
Argument - authentication_type
Sample URL - https://auth.aiesec.org/oauth/authorize?client_id=e305a9957ba043d9998a2369064635cab525b4dfb8a7c8eb39035451236ffb67&redirect_uri=https%3A%2F%2Faiesec.org%2F&response_type=code&authentication_type=login
Member Leads - YOP Phone number consent API changes
August 11th, 2022
Added a new field called allow_phone_communication in MemberLead. This can be used to store if the user wants the phone number to be visible in MemberLead CRM.

Graphql API - createMemberLead
New argument - allow_phone_communication

If the allow_phone_communication is true, then in the member lead response the phone and country code will be returned and if it is false, then it will be returned as null.

Note: For all the existing member leads the allow_phone_communication is marked as false and hence the phone and country code will be returned as null.
Added Custom website footer url to Organisations
August 11th, 2022
Added a new field called custom_website_footer_url in Company.

There is no provision to update this field via API for now. This will be managed by BE team.
However, in organisations and organisation API responses, the field custom_website_footer_url is exposed in the Company response.



Added accept_member_leads flag in Office/Committee.
August 11th, 2022
Added a new field called accept_member_leads in Office. This can be used to store if the entity wants to accept Member Leads.

Graphql API - updateCommittee
New argument - accept_member_leads

Note: For all the existing entities the accept_member_leads is marked as false by default.
Aiesec.net email revamp
August 11th, 2022
The existing API to generate aiesec.net email fails sometimes due to timeout, duplicate username, etc.,

so, to tackle this issue, we have added a new API to check if the username given by the user is available on google. Based on this result the email generation can be carried by the 
generateEmail API.
 API to check the username exists:
Argument:  username

Structure:   
validateAiesecEmailUsername(username: "aisecemail"){
    aiesec_email,
    is_valid
  }
Response:  
"validateAiesecEmailUsername": {
			"aiesec_email": "aisecemail@aiesec.net",
			"is_valid": true
		}

API to generate aiesec.net email:
Argument:  username
Structure:   
generateEmail(username: "aisecemail")
Response:  
{
	"data": {
		"generateEmail": "Request has been queued and will be sent to the email address"
	}
}

Added Hex code for Sdg Goals
February 4th, 2022
Added Hex code for each Sdg Goals in API.
Refer object sdg_goal_hex_code in ConstantType.

Sample query:

query{
  sdgGoals{
    id
    sdg_goal_hex_code
  }
}
Member leads sign up assignment
February 4th, 2022
Currently the Member lead signup uses local offices from the MC committee page. The problem with using these local offices is some Member entities doesn't run Member lead signup programmes and these accounts are created. to tackle this we have added alignment_type in LC Alignment section. There are two types (exchange, recruitment) currently defined. recruitment alignment_type will be used in Member lead signups and exchange alignment_type will be used in YOP signup.

API changes:
  • Added argument alignment_type in add_lc_alignment API. Use recruitment as an option in alignment_type. 
  • Added alignment_type filter argument in lc_alignments query.  Pass recruitment as a filter option in alignment_type. 
  • Added alignment_type filter argument in mc_alignments query.  Pass recruitment as a filter option in alignment_type. 
  • Added argument alignment_type in update_lc_alignment_label API. Use recruitment as an option in alignment_type. 
Note:  For existing LC alignment, no changes required. By default in Adding and querying we use exchange alignment_type. 
  
GV Templates API changes in YOP
February 4th, 2022
All new objects called all_slots in OpportunityType. This object is added as a connection_type and added arguments sort arguments and start_date filter.  When the date filter is selected in opportunity search page, pass that date argument in start_date filter to filter slots which are greater than the selected date.  Along with this filter use sort param to sort. Use the first object from slots connection to show the start_date in opportunity card. Also added a key called opportunity_applications_count, use this key to show the applications count for that slot.

Sample query for all_sorts:

all_slots(sort: start_date, sort_direction: desc, start_date: "2021-03-16"){
      nodes{
        status
        start_date
        opportunity_applications_count
      }
    }

Added filter argument in sdg_goals API endpoint. This can be used to filter out sdg goals which has active opportunities.

query{
  sdgGoals(active_opportunities: true){
    id
  }
}
AIESEC Blog API
February 4th, 2022
AIESEC's Blog (blog.aiesec.org) now has an API.

The API allows you to fetch the latest posts in a paginated list. 

Here's a self explanatory sample request - https://blog.aiesec.org/wp-json/ab/v2/blogs?per_page=5&page=1
Member CRM - Position Analytics API
October 27th, 2021
Description

This api endpoint gives a summary of the positions - roles & departments - for an office.

Back-end

This is a REST api endpoint. It uses elasticsearch and aggregates to obtain doc_count for the particular role and department.

Front-end

The endpoint is a rest api endpoint. The roles and departments are ids which can be resolved by calling the constants query with type_id - role & department. Please do note that the roles bucket will have office_id along with it and the immediate child offices will also be returned. eg: For an MC, all its LCs will be returned, AI will have Regions returned and Regions will have MCs returned.

Sample request - http://localhost:8000/v2/applications/analyze.json?access_token=<access_token>&position%5Boffice_id%5D=<office_id>

GET /v2/applications/analyze.json

Request
position[office_id] - Integer

Response

{
  "analytics": {
    "roles": {
      "after_key": {
        "role": 11647,
        "office": "1585"
      },
      "buckets": [
        {
          "key": {
            "role": 11645,
            "office": "1585"
          },
          "doc_count": 2
        },
        {
          "key": {
            "role": 11646,
            "office": "1585"
          },
          "doc_count": 22
        },
        {
          "key": {
            "role": 11647,
            "office": "1585"
          },
          "doc_count": 44
        }
      ]
    },
    "departments": {
      "doc_count": 227,
      "deparments": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": 11627,
            "doc_count": 20
          },
          {
            "key": 11628,
            "doc_count": 20
          },
          {
            "key": 11629,
            "doc_count": 20
          },
          {
            "key": 11630,
            "doc_count": 20
          },
          {
            "key": 11631,
            "doc_count": 20
          },
          {
            "key": 11632,
            "doc_count": 20
          },
          {
            "key": 11633,
            "doc_count": 20
          },
          {
            "key": 11634,
            "doc_count": 20
          },
          {
            "key": 11635,
            "doc_count": 20
          },
          {
            "key": 11636,
            "doc_count": 20
          },
          {
            "key": 11637,
            "doc_count": 20
          },
          {
            "key": 11638,
            "doc_count": 7
          }
        ]
      }
    }
  }
}
Added duration field in Member Position create/update
October 27th, 2021
API has added support to store duration_type in Member Position. Currently the duration field in the form is used to calculate the end_date. Now we wanted to save the duration which can be directly used by FE platforms instead of calculation from end_date and start_date.

Mutation name: memberPositionCreate, memberPositionUpdate
Input Field name: duration_id
Response field : duration


Added permission object to terminate Member Position
October 27th, 2021
API team has added permission object in Member position to show the terminate button and restrict the action to certain users.

Field name: can_terminate in permission object in MemberPosition response

Added duration type filter in MemberPosition CRM
October 27th, 2021
Added API support for duration types in MemberPosition CRM.

Filter argument - duration_ids

Accepts multiple values. 
Member Lead CRM API changes
October 27th, 2021
Changes in MemberLead .

  • Add Motivation question is a single select field with the following options 
    1. Question: What is your motivation when joining AIESEC?
    2. Options: 
      • Personal Development
      • Leadership Experience
      • Global Networking
      • Connect with impact of AIESEC
  • Motivation to be added as a field to Member Lead form on, 
    • YOP Membership form
    • EXPA Create lead form
  • Display Motivation question on Member Lead Profile Page and Modal
  • Add column for Motivation question on Member Lead CRM
  • Add filter for Motivation question on Member Lead CRM.
  • Change status New Lead to Applied
  • Change status Recruited to Accepted
  • Status name changes to be displayed in the following scenarios (no change in colour) 
    • Status switches - Profile page & modal
    • Status filters - CRM
    • Status tags - CRM and Profile page & modal

API changes:
  1. Options can be found in all_constants Query . type_id is motivation_reason.
  2. Added input field called motivation_reason_id in MemberLead create, update API.
  3. Exposed motivation_reason object in MemberLead response type. 
  4. Added filter input called motivation_reason_ids
  5. Changes status keys new_lead => applied and recruited => accepted .
  6. Renamed member_lead_recruit mutation to member_lead_accept .
  7. Removed moved_to_recruited_by and date_moved_to_recruited  and added  moved_to_accepted_by and date_moved_to_accepted . 
  8. Renamed permission object can_move_to_recruit to can_move_to_accept



GV Templates API changes in EXPA
October 27th, 2021
Projects API:
  1. Added createProject endpoint to create projects.
  2. Added weeklyActivitiesBulkCreate and weeklyActivitiesBulkDelete  to manage project activities. 
  3. Added updateProject endpoint to update details.
  4. To manage Enabled/Disabled use key project_enabled. This is added in createProject and updateProject endpoints.
Opportunity API changes:
  1. added project_id argument in createOpportunity endpoint.
  2. added projectsList endpoint to get the list of available projects. Use this to show the list of projects in projects dropdown in opportunity create form.
  3. Added weeklyActivitiesBulkCreate and weeklyActivitiesBulkDelete to add/delete Project activities.
  4. Exposed project object in OpportunityType.
  5. Exposed weekly_activities object in OpportunityType. This object will have activities from both project and opportunity.
  6. Added opportunity_type filter in opportunities API. Use this filter and pass opportunity_type as opportunity in all Opportunity crm pages in EXPA.
  7. Added key mandatory_fields_check in opportunity type. This object will have all fields with complete check.
MemberLead CRM - Recruitment Analytics API
August 9th, 2021
A REST API endpoint is created which is used to measure member leads funnel with conversion data across the recruitment status flow for an entity.

It uses elasticsearch and aggregates to obtain doc_count for different recruitment statuses.

office_id which is used for entity filter is a mandatory param that needs to be passed along with access_token. Other params that can be used are,
  1. start_date and end_date for time period filter.
  2. academic_level_ids for an academic level filter. It accepts the value as an array of ids which can be resolved by calling the constants query with type_id as academic_level. It is nested inside the recruitment param.
  3. backgrounds for background filter. It accepts the value as an array of ids which can be resolved by calling the constants query with type_id as background.
  4. employment_status_ids for employment status filter. It accepts the value as an array of ids which can be resolved by calling the constants query with type_id as employment_status. It is nested inside the recruitment param.
  5. created_via for lead created via filter. It accepts either of the value, EXPA, expa, YOP, or yop as a string. It is nested inside the recruitment param.
  6. motivation_reason_ids for motivation filter. It accepts the value as an array of ids which can be resolved by calling the constants query with type_id as motivation_reason. It is nested inside the recruitment param.
  7. referral_type_ids for referral filter. It accepts the value as an array of ids which can be resolved by calling the constants query with type_id as referral_type. It is nested inside the recruitment param.
GET /v2/applications/analyze.json

Sample request
https://analytics.api.aiesec.org/v2/applications/analyze.json?access_token=<access_token>&start_date=<start_date>&end_date=<end_date>&recruitment[office_id]=<office_id>&recruitment[academic_level_ids][]=<academic_level_id_1>&recruitment[academic_level_ids][]=<academic_level_id_2>&recruitment[employment_status_ids][]=<employment_status_id_1>&recruitment[employment_status_ids][]=<employment_status_id_2>&recruitment[motivation_reason_ids][]=<motivation_reason_id_1>&recruitment[motivation_reason_ids][]=<motivation_reason_id_2>&recruitment[created_via]=<YOP_or_EXPA>&recruitment[referral_type_ids][]=<referral_type_id_1>&recruitment[referral_type_ids][]=<referral_type_id_2>&backgrounds[]=<background_id_1>&backgrounds[]=<background_id_2>

Sample response
{
    "analytics":  {
        "contacted_count":  {
            "meta":  {
            
            },
            "doc_count": 4
        },
        "accepted_count":  {
            "meta":  {
              
            },
            "doc_count": 1
        },
        "in_process_count":  {
            "meta":  {
              
            },
            "doc_count": 3
        },
        "rejected_count":  {
            "meta":  {
              
            },
            "doc_count": 2
        },
        "applied_count":  {
            "meta":  {
              
            },
            "doc_count": 7
        }
    }
}
Moving arguments to filters and pagination in all CRMs
August 9th, 2021
We have moved q and sort arguments into filters argument and page and per_page arguments into the pagination argument. A list of endpoints on which the changes are made can be found below,

  1.  In Accommodation query,
    • accommodations endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q argument is DEPRECATED and moved inside the filters argument.
  2. In AccommodationAssignment query,
    • assignedApplications endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q argument is DEPRECATED and moved inside the filters argument.
  3. In Branch query,
    • branchAutocomplete endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  4. In Campaign query,
    • campaignAutocomplete endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  5. In City query,
    • allCity endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The value accepted here is - name.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
    • cityAutocomplete endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  6. In Committee query,
    • committees, committeesDownload, and committeesListBasic endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The values accepted here are - name, parent_name, and tag.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
    • committeeAutocomplete and myCommitteeAutocomplete endpoint
      • per_page argument is DEPRECATED and moved inside the pagination argument.
      • q argument is DEPRECATED and moved inside the filters argument.
  7. In Constants query,
    • constantAutocomplete endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  8. In EmployeeLead query,
    • employeeLeads endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The values accepted here are - created_via, email, full_name, home_lc_name, home_mc_name, last_active, organization_name, phone_number, product_interest, qualification, referral_type, and status.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
  9. In Event query,
    • eventList endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q argument is DEPRECATED and moved inside the filters argument.
    • similarEvents endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
  10. In EventRegistration query,
    • eventRegistrationList endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q argument is DEPRECATED and moved inside the filters argument.
  11. In MemberLead query,
    • memberLeads endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The values accepted here are - academic_level_name, created_via, date_of_birth, employment_status_name, home_mc_name, lc_alignment_name, lead_name, preferred_mode_of_contact_name, referral_type_name, and status.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
  12. In MemberPosition query,
    • memberPositions and memberPositionsDownload endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The values accepted here are - active, completed, and terminated.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
  13. In Notifications query,
    • notificationList endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
  14. In Opportunity query,
    • allOpportunity, allOpportunityV2, allOpportunityDownload, searchAllOpportunity, myOpportunities, and similarOpportunities endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The values accepted here are - application, application_count, applications_closing, average_nps_score, branch_name, branches, committee, companycompany_size, company_type, created_via, date_opened, departments, duration_max, duration_min, duration_type, earliest_start_date, home_mcs, host_lc_name, host_mc_name, industries, is_ge, is_gep, issues, latest_end_date, nps_score, open_to, organisation_name, price, programmes, regions, relevance, sdg_goal, sdg_target, status, sub_product, title, view_count, and work_fields.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
  15. In OpportunityApplication query,
    • allOpportunityApplication, allOpportunityApplicationDownload, unbilledApplications, and applicationTestimonials endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The values accepted here are - applicant_name, average_score, date_an_signed, date_approved, date_matched, date_realized, duration_type, experience_end_date, experience_start_date, favourite, flight_date, graduation_date, has_started_standards_survey, home_lc_name, home_mc_name, host_lc_name, host_mc_name, is_gep, last_active, ldm_grade, nps_grade, opportunity_id, organisation_name, opportunity_title, paid_at, partner_type, product, required_backgrounds_percentage, required_skills_percentage, sdg_goal, sdg_target, slot, status, sub_product, and scheduled_interview.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
  16. In OrganizationDevelopment query,
    • organizationDevelopmentList endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  17. In Page query,
    • pages endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The value accepted here is - title.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
  18. In People query,
    • allPeople, allPeopleDownload, myPeople, and personApplications endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
      • q and sort arguments are DEPRECATED and moved inside the filters argument.
      • sort argument is of type enum. The value accepted here is - aiesecer, application, contacted_at, contacted_by_name, dob, follow_up_name, followed_up_at, full_name, gender, home_lc_name, home_mc_name, interviewed, interviewed_at, last_active_at, lc_alignment_name, professional_experience_in_years, referral_type, selected_programmes, and status.
      • Additionally, sort_direction argument of type enum is added. The values accepted here are - asc, desc.
    • colleagueAutocomplete endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  19. In PeopleAutocomplete query,
    • peopleAutocomplete, peopleAutocompleteColleagues, peopleAutocompleteEmployees, and peopleAutocompleteActive endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  20. In TagListAutocomplete query,
    • tagListAutocomplete endpoint
      • q argument is DEPRECATED and moved inside the filters argument.
  21. In Todo query,
    • todos endpoint
      • page and per_page arguments are DEPRECATED and moved inside the pagination argument.
The code is backward compatible. If both arguments (new and deprecated) are present in a query, a value from the new argument will be considered to get the result.

Example query,
query {
    opportunities(filters: {q: "Test", sort: created_at, sort_direction: desc}, pagination: {page: 2, per_page: 10}) {
        paging {
            total_items,
            current_page,
            total_pages
        }
        data {
            id,
            title,
            created_at,
            __typename
        }
    }
}

Campaign mutation name changes
August 9th, 2021
In the campaign mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones.

  1. campaignCreate -> createCampaign
  2. campaignUpdate -> updateCampaign
  3. campaignActivate -> activateCampaign
  4. campaignDeactivate -> deactivateCampaign
Apart from the following mentioned details all the arguments and functionalities are intact.
  1. For createCampaign mutation,
    • office_id is made a required argument.
  2. For deactivateCampaign mutation,
    • campaign argument is removed as it is not used for making any change in the campaign record.
BranchEmployee mutation name changes
August 9th, 2021
In the branchEmployee mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones.

  1. branchEmployeeCreate -> createBranchEmployee
  2. branchEmployeeUpdate -> updateBranchEmployee
  3. branchEmployeeApprove -> approveBranchEmployee
  4. branchEmployeeReject -> rejectBranchEmployee
  5. branchEmployeeDelete -> deleteBranchEmployee
Apart from the following mentioned details all the arguments and functionalities are intact.
  1. For createBranchEmployee mutation,
    • person_id and branch_id arguments are made required.
Branch mutation name changes
August 9th, 2021
In the branch mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. branchApprove -> approveBranch
  2. branchDeny -> denyBranch
Opportunities mutation name changes
August 9th, 2021
In the opportunity mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. opportunityUnarchive -> unarchiveOpportunity
  2. opportunityReport -> reportOpportunity
  3. opportunitySubmitForReview -> submitOpportunityForReview
  4. opportunityRemoveCoverPhoto -> removeOpportunityCoverPhoto
  5. opportunityUnpublish -> unpublishOpportunity
  6. opportunityMarkRemote -> markOpportunityRemote
  7. opportunityUnmarkRemote -> unmarkOpportunityRemote
MemberLead mutation name changes
August 9th, 2021
In the memberLead mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. memberLeadCreate -> createMemberLead
  2. memberLeadUpdate -> updateMemberLead
  3. memberLeadContact -> contactMemberLead
  4. memberLeadProcess -> processMemberLead
  5. memberLeadRecruit -> recruitMemberLead
  6. memberLeadReject -> rejectMemberLead
  7. memberLeadChecklistResponseCreate -> createChecklistResponseMemberLead
MemberPosition mutation name changes
August 9th, 2021
In the memberPosition mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. memberPositionCreate -> createMemberPosition
  2. memberPositionUpdate -> updateMemberPosition
  3. memberPositionTerminate -> terminateMemberPosition
Page mutation name changes
August 9th, 2021
In the page mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. pageCreate -> createPage
  2. pageUpdate -> updatePage
  3. pageMoveToDraft -> movePageToDraft
  4. pageFavourite -> favouritePage
  5. pageUnfavourite -> unfavouritePage
  6. pagePublish -> publishPage
  7. pageDelete -> deletePage
PageComponent mutation name changes
August 9th, 2021
In the pageComponent mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. pageComponentCreate -> createPageComponent
  2. pageComponentUpdate -> updatePageComponent
  3. pageComponentDelete -> deletePageComponent
  4. pageComponentDuplicate -> duplicatePageComponent
Questionnaire mutation name changes
August 9th, 2021
In the questionnaire mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. questionBulkCreate -> bulkCreateQuestion
  2. questionBulkUpdate -> bulkUpdateQuestion
  3. questionBulkDelete -> bulkDeleteQuestion
Slot mutation name changes
August 9th, 2021
In the slot mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. slotCreate -> createSlot
  2. slotUpdate -> updateSlot
  3. slotDelete -> deleteSlot
  4. slotMoveToInactive -> moveSlotToInactive
  5. slotMoveToActive -> moveSlotToActive
EmployeeLead mutation name changes
August 9th, 2021
In the employeeLead mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. employeeLeadCreate -> createEmployeeLead
  2. employeeLeadUpdate -> updateEmployeeLead
  3. employeeLeadNewLead -> moveEmployeeLeadToNewLead
  4. employeeLeadAttemptedToContact -> moveEmployeeLeadToAttemptedToContact
  5. employeeLeadConnected -> moveEmployeeLeadToConnected
  6. employeeLeadProposalSent -> moveEmployeeLeadToProposalSent
  7. employeeLeadContractSent -> moveEmployeeLeadToContractSent
  8. employeeLeadContractSigned -> moveEmployeeLeadToContractSigned
  9. employeeLeadDealLost -> moveEmployeeLeadToDealLost
  10. employeeLeadFuturePipeline -> moveEmployeeLeadToFuturePipeline
  11. employeeLeadSendInvite -> sendInviteToEmployeeLead
Branch query name improvements
August 9th, 2021
In the branch query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. getBranch -> branch
Additionally, "myBranch" query will be DEPRECATED. Use "my" boolean argument in "branches" query instead and set the value as true to get the current user's managed data.

The default value for "my" boolean argument is false.
ClientData query name improvements
August 9th, 2021
In the clientData query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. clientDataGet -> clientData
  2. clientDataGetByNameAndApplicable -> clientDataByNameAndApplicable
Constants query improvements
August 9th, 2021
In the constants query following query will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. allConstants -> constants
EmployeeLead query name changes
August 9th, 2021
In the employeeLead query following query will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. employeeLeadGet -> employeeLead
LcAlignment query name improvements
August 9th, 2021
In the lcAlignment query following query will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. getLcAlignment -> lcAlignment
MemberLead query name improvements
August 9th, 2021
In the memberLead query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. memberLeadGet -> memberLead
  2. memberLeadCheckIfExists -> checkIfMemberLeadExists
MemberPosition query name improvements
August 9th, 2021
In the memberPosition query following query will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. memberPositionsDownload -> downloadMemberPositions
SuggestedCountry query name improvement
August 9th, 2021
In the suggestedCountry query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. allSuggestedCountries -> suggestedCountries
  2. getSuggestedCountry -> suggestedCountry
TagList query name improvements
August 9th, 2021
In the tagList query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. allTagList -> tagLists
  2. getTagList -> tagList
Person query name improvement
August 9th, 2021
In the person query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones.
  1. allPeople -> people
  2. allPeopleDownload -> downloadPeople
  3. getPerson -> person
  4. personPaymentCreate -> createPersonPayment
  5. personPaymentDelete -> deletePersonPayment
Additionally, "myPeople" query will be DEPRECATED. Use "my" boolean argument in "people" query and set the value as true to get the current user's managed data.

The default value for "my" boolean argument is false.

Apart from the following mentioned details all the arguments and functionalities are intact.
  1. For person query,
    • id is made a required argument.
  2. For createPersonPayment query,
    • id is made a required argument.
    • created_by and action_for argument are removed as it is not used for making any change in the person record.
  3. For deletePersonPayment query,
    • id is made a required argument.
Added filter to sort constants by name or position
August 9th, 2021
In allConstants query, a new argument called filters has been added. It will contain the sort and sort_direction argument, both are of type enum.

sort will accept name and position as the value, the default value will be name.

sort_direction will accept asc and desc, the default value will be asc.

Sample query:
query {
    allConstants(type_id: "skill", filters: {sort: position, sort_direction: desc}) {
        id,
        name,
        position,
        __typename
    }
}
Remove remote_experience argument from opportunityMarkRemote and move it to updateOpportunity
June 28th, 2021
Duration, salary, and additional details for any partly remote opportunity can now be added from updateOpportunity mutation and is removed from opportunityMarkRemote. This is done to provide the ability for LC and MC to edit partly remote details.

Under the `opportunity` argument, the `remote_experience_details` argument will contain the following three inputs,
  • remote_experience_duration
  • remote_experience_salary
  • remote_experience_additional_details
All three inputs are required if `remote_experience_details` argument is used.

The exposed field are `remote_experience_duration`, `remote_experience_salary`, `remote_experience_additional_details`.

Sample request,
mutation{
  updateOpportunity(id: 14620, opportunity: {
    remote_experience_details: {
      remote_experience_duration: "<div>Total duration will be of 6 months</div>",
      remote_experience_salary: "<div>$200 and $300 per month for remote and on-field work resp.</div>",
      remote_experience_additional_details: "<ol><li>Minimum of 2 months of on-field work is mandatory</li><li>Have a bank account which accepts international payments</li></ol>"
    }
  }) {
    id
    remote_opportunity
    remote_experience_duration
    remote_experience_salary
    remote_experience_additional_details
  }
}
Organisation mutation name improvement
June 28th, 2021
In the organisation mutation following mutations will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. organisationFollowup -> followupOrganisation
  2. organisationScorecardCreate -> createOrganisationScorecard
  3. organisationScorecardUpdate -> updateOrganisationScorecard
  4. organisationScorecardDelete -> deleteOrganisationScorecard
  5. organisationScorecardAttributeCreate -> createOrganisationScorecardAttribute
  6. organisationScorecardAttributeUpdate -> updateOrganisationScorecardAttribute
  7. organisationScorecardAttributeDelete -> deleteOrganisationScorecardAttribute
  8. organisationApprove -> approveOrganisation
  9. organisationReject -> rejectOrganisation
  10. organisationArchive -> archiveOrganisation
  11. organisationSetPartnerType -> setOrganisationPartnerType
  12. organisationRemovePartnerType -> removeOrganisationPartnerType
Organisation query name improvement
June 28th, 2021
In the organisation query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.
  1. allOrganisation -> organisations
  2. allOrganisationDownload -> organisationDownload
  3. getOrganisation -> organisation
Additionally, "myOrganisation" and "organisationAutocompleteMy" queries will be DEPRECATED. Use "my" boolean argument in "organisations" and "organisationAutocomplete" queries respectively and set the value as true to get the current user's managed data.

The default value for "my" boolean argument is false.
Committee query improvements
June 28th, 2021
In the committee query following queries will be DEPRECATED and are renamed with the new ones. Kindly replace them with the new ones. All the arguments and functionalities are intact.

  1. getCommittee -> committee
  2. getCommitteeBasicDetails -> committeeBasicDetails
  3. getCommitteeTerm -> committeeTerm
Additionally, "myCommitteeAutocomplete" query will be DEPRECATED. Use "my_committee_autocomplete" boolean argument in "committeeAutocomplete" query instead and set the value as true to get the current user's managed data.

The default value for "my_committee_autocomplete" boolean argument is false.
Added Member Lead mutuation. Queries, Filters
June 28th, 2021
We have added API endpoints to add,edit and get details of member leads.

Mutations:
  • memberLeadCreate - To create Member lead
  • memberLeadUpdate - To update Member lead.
  • memberLeadContact - To move lead to contact status
  • memberLeadProcess - To move lead to process status
  • memberLeadRecruit - To move lead to recruited status
  • memberLeadReject - To reject lead.
Queries:
  • memberLeads - List all Member leads.
  • memberLeadGet - To get details of particular lead.

Filters
lead_name, email, status, employement_status, home_lc_name, home_mc_name, created_via, referral_type, background_ids, employement_status, manager_ids, has_managers, status_last_updated_at

Timeline:
  • created_at
  • creator
  • date_moved_to_contacted
  • date_moved_to_in_process
  • date_moved_to_recruited
  • date_moved_to_rejected
  • moved_to_contacted_by
  • moved_to_in_process_by
  • moved_to_recruited_by
  • moved_to_rejected_by
Country and Alignment fields:
Use the following API to get the list of countries and the alignments. Which ever country is selected the respective mc_aligments has to shown in alignment field. When submitting the form, along with alignment_id selected the id inside lc object should also be sent in the request.
query{
  mcsAlignments{
    id
    name
    label
    mc_alignments{
      id
      keywords
      lc{
        id
      }
    }
  }
}

Added New API to check if the Lead is present. This is to be used in customer facing application. When the user enters the email id pass this argument to memberLeadCheckIfExists API endpoint. This will return either entity_not_found or entity_already_exists in response object for key name sub_code.

Note: We have added new types to constants. employment_status, preferred_mode_of_contact, academic_level, referral_type . Use the constants from these types in create, update and show for the following (employment_status_id, preferred_mode_of_contact_id, academic_level_id, referral_type_id) fields in Member Lead.

Checklist:
There are two mutations added to bulk create checklist and creating responses for the checklist.
mutation:
Add member_lead mutation with params id which should be the committe id.
mutation {
  memberLeadChecklistQuestionBulkCreate(id: 1,checklist: [{
    question_text: "Are you a volunteer updated",
    description: "new updated description 1"
  },
    {
    question_text: "Are you having a passport updated",
    description: "new updated description 2"
  }
  ]
  ){
    id
    description
    question_text
    question_type
    survey
  } 
}

To add response use memberLeadChecklistResponseCreate with the params id, survey_id, and answers where member_lead id should be passed in id and survey id should be passed in survey_id

Eg: 
mutation {
  memberLeadChecklistResponseCreate(id: 1, survey_id: 10,answers: [{
    question_id: 720,
    answer: "true"
  },
    {
    question_id: 718,
    answer: "false"
  }
  ]
    ) {
    id
    answers
    survey {
      id
      survey_questions {
        id
        question_text
        question_type
      }
    }
  }
}
Queries :

To list all checklist question use the query getChecklistQuestion with params id where you should pass committe id
Eg:

query{
 getChecklistQuestion(id: 1){
  id
  question_text
  question_type
  description
}
}
FrontEnd need to check the member_lead whether they have permission to create checklist_response, to check this there is a permission added inside member_lead types called can_fill_checklist which returns boolean value, if its return true then the frontend can allow the user to create response.
Page revamp
June 28th, 2021
Changes

We had 2 copies of the same component for a page - one as draft and the other as published. Under this new change, the draft items will be removed and will be saved in the same row as the published item. This will reduce the number of items in the table by a lot.

Back-end
The change entails having to manage the creation and handling of the component to create and provide the data correctly. The creation and updation of the component involves having to map the input data to their draft columns so that the FE doesn't need to change anything. The deletion of a component will contain nullifying the content, position etc of the draft and flagging it as deleted but the published will stay as is. Once the draft is published, if the delete is flagged, the entire component is deleted.

While publishing the component, the contents of the draft columns will be copied to the publisher columns. Any subsequent edit happens in the draft columns.

Front-end
The change to be made by the front end is during fetching of the components. The creation, updation and deletion of the component remains the same. The thing to note is that since the published and draft are no longer different components, there will only be one id or client_reference_id whichever is being used.

The keys for fetching data remains unchanged - content, component_type, position and component_attachment.

The keys remain unchanged for the FE. The response depends on the input. For component creation and updation the draft items will be provided and for page query, the status determines what to respond with.

Sample query

query {
  getPage(id: 2965) {
    title
    status
    page_components(status: "draft") {
      edges {
        node {
          id
          content
          position
          component_type
        }
      }
    }
  }
}

Sample mutations

Create component


mutation {
 pageComponentCreate(page_id: 2965, page_component: {
    content: "mnop",
    component_type: "text"
  }) {
    id
    position
    content
  }
}


Update component

mutation {
 pageComponentUpdate(id: 29652, page_component: {
    position: 2
  }) {
    id
    position
    content
  }
}


Delete component

The component is deleted. The response would be null. But during the page query, this component will be present with its content until published again.

mutation {
 pageComponentDelete(id: 29652) {
    id
  }
}
Change in current positions in current person API
May 7th, 2021
We have revamped the manage committee section in EXPA and this causes breaking changes in current_positions object. current_positions returns the list of position a person holds in EXPA. 

This changes affects both REST and Graphql API type.
REST API changes:
Before:
{
   "id":252867,
   "position_short_name":null,
   "role":"Global Support Team",
   "name":"Backend",
   "url":"https://gis.aiesec.org/v2/teams//positions/252867",
   "start_date":"2016-10-20T00:00:00Z",
   "end_date":"2021-09-21T00:00:00Z",
   "team":{
      "id":30567,
      "title":"Commutatus",
      "team_type":"normal",
      "office":{
         "id":1626,
         "name":"AIESEC INTERNATIONAL",
         "full_name":"AIESEC INTERNATIONAL",
         "email":"info@ai.aiesec.org",
         "tag":"AI",
         "parent_id":null,
         "signup_link":null,
         "country":null,
         "url":"https://gis.aiesec.org/v2/committees/1626"
      }
   },
   "parent":{
      "id":252866,
      "position_short_name":null,
      "role":"Global Support Team",
      "name":"CEO",
      "url":"https://gis.aiesec.org/v2/teams//positions/252866"
   },
   "function":{
      "id":11341,
      "name":"Other",
      "matching_with_opportunity":null
   }
}

After:
{
   "id":11438,
   "start_date":"2021-02-15",
   "end_date":"2022-02-17",
   "role":"AIVP",
   "title":"Local Committee Vice President (LCVP)",
   "department":{
    "id": 1
    name: "Other"
    }
   "term":{
      "id":11471,
      "name":"2021-2022"
   },
   "duration":{
       "id": 11518,
       "name": "1 Year"
   },
   "parent":null,
   "office":{
      "id":1626,
      "name":"AIESEC INTERNATIONAL",
      "full_name":"AIESEC INTERNATIONAL",
      "email":"idontwannadoit",
      "tag":"AI",
      "parent_id":null,
      "signup_link":"wdasff",
      "country":null,
      "url":"https://gis.aiesec.org/v2/committees/1626"
   }
}

Graphql API changes:
We have added new object called member_positions in current_person type. This object will have newly added fields related to positions. This object should be used instead of current_positions

Sample Request:
query ProfileQuery {
  currentPerson {
   id    
   member_positions{
    id
    start_date
    end_date
    status
    ldm_report
    title
    role{
      name
    }
    function{
      name
    }
    committee_department{
      name
    }
    duration{
      name
    }
  }
  }
}


API name changes in Tag Auto complete Query
April 8th, 2021
We had changed the auto complete query API name for tag from TagListAutocomplete to tagListAutocomplete . This is to mainly follow Graphql naming convention. This was the only autocomplete API endpoint changes and rest of the autocomplete names already follow  Graphql naming convention.
Member CRM
March 15th, 2021
Description

This feature is a revamp to the existing positions to make it more manageable and analyzable.

Back-end

There is the MemberPosition model which contains the detail of each position. It has 3 states - active, completed and terminated. Each position has a role, function and department assigned to an office along with the start and end date for the responsibility. If a position is terminated, a reason has to be provided.

Front-end

There are create and terminate mutations as well as queries to fetch one, all or download the positions.

The functions, roles, exit reasons and degree level can be queried using the Constants query. The type_id are function, role, exit_reason, study_level. The id from this query is the value for role_id, function_id and exit_reason_id in the mutations. A sample query is below.

query{
  allConstants(type_id: "role"){
    id
    name
  }
}


Mutations

1. memberPositionCreate - This is used to create a position. Please note that  reports_to_position_id is required for everyone other than president.

For department, there are two arguments committee_department_name and committee_department_id . When adding LCVP initially, use committee_department_name and when adding LCVP to an existing department section, use committee_department_id. 

reports_to_position_id is the member position of the person who reports to. If the role is for a VP, then the reports_to_position_id will be the id of the member_position object for the President.

Note: focus_products field is dependent on function field. for selective functions focus product applicable. For this, look for the key called has_focus_products in functions response(allConstants). This will return "true" or "false". Based on this value show the focus product input.

mutation {
  memberPositionCreate(member_position: {function_id: 11638, role_id: 11648, office_id: 630, start_date: "01-02-2021", end_date: "31-07-2021", reports_to_position: 12, invite_person: {first_name: "super", last_name: "man", home_lc_id: 630, email: "sajin+1023@commutatus.com"}}) {
    id
  }
}

2. memberPositionUpdate - Update the position. Has the same params as create.

mutation {
  memberPositionUpdate(id: 1, member_position: {role_id: 11645, office_id: 1585}) {
    id
  }
}

3. memberPositionTerminate - Used to terminate a member position. Exit reason id is required. The id can be obtained from constants with type_id exit_reason. Sample constant query above. If the exit reason is Other, then other_exit_reason has to be provided.

mutation {
  memberPositionTerminate(id: 1, exit_reason_id: 11667, other_exit_reason: "Just for fun") {
    id
    status
    exit_reason {
      name
    }
    other_exit_reason
    terminated_at
    terminated_by {
      id
    }
  }
}

Queries

1. memberPosition - This fetches a single member position. Id is required

query {
  memberPosition(id: 1) {
    id
  }
}

2. memberPositions - This query fetches all member positions and is used for analytics. Filters are available. The columns to sort by are ["gender", "no_of_ixps", "is_ixp", "status", "start_date", "dob", "end_date", "office_name", "exit_reason", "role", "department_department", "study_levels", "reports_to_name", "full_name", "function_name"]


query {
  memberPositions(filters: {status: ["terminated"]}) {
    paging {
      total_items
    }
    data {
      id
    }
  }
}

3. memberPositionsDownload - This query adds an export task which will be sent to the email id of the requesting person. All the available columns are in the query. The filters can be applied here as well.

query {
  memberPositionsDownload(columns: ["position_id", "position_title", "position_skills", "position_gender", "position_no_of_ixps", "position_ixp_products", "position_is_ixp", "position_languages", "position_status", "position_start_date", "position_backgrounds", "position_date_of_birth", "position_end_date", "position_office", "position_phone", "position_exit_reason", "position_role", "position_department", "position_study_level", "position_reports_to", "position_full_name", "position_email"])
}

4. committee - A new API to return member_positions has been added.

query{
  committeeTerms(id: 630){
    id
    name
    member_position{
      id
    }
    committee_departments{
      total_count
      edges{
        node{
          id
          name
          member_positions{
            edges{
              node{
                id
              }
            }
          }
        }
      }
    }  
  }
}

query{
  committeeTerm(id: 630, term_id: 11471){
    id
    name
    member_position{
      id
    }
    committee_departments{
      edges{
        node{
          id
          name
          member_positions{
            total_count
            facets
            edges{
              node{
                id
                role{
                  name
                }
              }
            }
          }
        }
      }
  }
  }
}

5. VP count in Department accordion - To get the VP count, refer facets objects inside member_positions object. 

facets - {21755=>8, 21756=>187} . 21755 is role_id. use local storage for role_id and 8 is total count. 
for AI - use role AIVP, for Region use role RD, for MC use role MCVP. and for LC use role LCVP. 
Add Remote Realized count in Performance, E2E and Graphical analytics.
February 25th, 2021
Graphical Analytics:
Exposed total_remote_realized in analytics response.

E2E Analytics:
Now added additional filter option in status filter. The status filter accepts remote_realized argument and return result.

Performance Analytics:
Added following keys to the response:
  • remote_realized_total
  • o_remote_realized_1
  • o_remote_realized_2
  • o_remote_realized_5
  • o_remote_realized_7
  • o_remote_realized_8
  • o_remote_realized_9
  • i_remote_realized_1
  • i_remote_realized_2
  • i_remote_realized_5
  • i_remote_realized_7
  • i_remote_realized_8
  • i_remote_realized_9

Added status remote_realization_broken in Application
February 25th, 2021
We have added remote_realization_broken status in remote opportunity flow. An application can be moved to remote_realization_broken from remote_realized.


Recommended changes on user interfaces

Customer Facing Applications
  1. If you are showing a timeline of an application, you must now represent remote_realization_broken by checking for this status.
  2. When filtering data for remote realized broken applications, you must also pass "remote_realization_broken" in the filters as well.

Internal Applications
  1. If you are showcasing statuses of applications or people in a list, you must account for remote_realization_broken status
  2. If you are showcasing the profile of a particular application, you must check for the status remote_realization_broken
  3. If you are showcasing a timeline, you must check for the remote_realization_broken status.
  4. You must add remote_realization_broken status as a filter on all lists for people and applications.
  5. Added break_remote_realization mutation to mark application as remote realize broken.
  6. Added permission object can_break_remote_realization in OpportunityApplication permission.
  7. Added date_remote_realization_broken_at and remote_realization_broken_by in ApplicationMeta .


Premium Partners improvements
February 25th, 2021
Before the premium partners were identified using an object called is_gep. If this object is true then it is considered as Premium partner. Now we have added a new field called partner_type. This will have either global or regional as value.

Make these changes in following places:

Application filter: 
  • Remove is_gep and add partner_type.
Organisation Filter:
  • Remove is_gep and add partner_type.
Opportunity filter: 
  • Remove is_gep and add partner_type.

    Organisation details page:
  • Remove is_gep and add partner_type.
Organisation Mutation:
  • Remove is_gep from updateOrganisation and createOrganisation API.
Added new API endpoint to mark partner type in organisation

  • Mutation name - organisation_set_partner_type
  • Params - id(Organisation ID), partner_type(Partner type)
  • Added permission object called can_update_partner_type in organisation permission.

    Added new API endpoint to remove partner type in organisation

    • Mutation name - organisation_remove_partner_type
    • Params - id(Organisation ID)
    • Added permission object called can_remove_partner_type in organisation permission.
Remote opportunity additional argument
February 25th, 2021
When marking an opportunity remote, it will now accept the `remote_experience` argument in `opportunityMarkRemote` mutation which will contain the following three inputs,
  • remote_experience_duration
  • remote_experience_salary
  • remote_experience_additional_details
All the arguments are required.

The exposed field are `remote_experience_duration`, `remote_experience_salary`, `remote_experience_additional_details`.

Sample request,
mutation{
  opportunityMarkRemote(id: 14620, remote_experience: {remote_experience_duration: "<div>Total duration will be of 6 months</div>", remote_experience_salary: "<div>$200 and $300 per month for remote and on-field work resp.</div>", remote_experience_additional_details: "<ol><li>Minimum of 2 months of on-field work is mandatory</li><li>Have a bank account which accepts international payments</li></ol>"}){
    id
    remote_opportunity
    remote_experience_duration
    remote_experience_salary
    remote_experience_additional_details
  }
}
Entity Goal Setting
February 25th, 2021
Description

This feature aims at setting and tracking the achievements of the entities of AIESEC.

How it works

There will be plans for an entity to which the target is updated. The targets will be uploaded via an xlsx file which will contain the info of the programme and the targets for each programme and the various stages of applications. Only when the template is uploaded will the data be available in the analytics.

The achieved data is calculated on the first upload and then on every further update to an application. This is to ensure that the data is consistent and real-time.

The goal type - sign_ups will always return the total since its only based on home office.

Back-end

There are plans which has a start month and end month. Each entity has a deadline by which the entity has to upload a plan. The deadline will be set by the parent entity. The template will be processed and data will be entered into entity goals which will specify the type, programme and other details for that particular target.

Once the template is imported, the calculation for the targets created will be triggered. The achieved info of the goal will be updated. This calculation also happens for a particular goal when an application is updated.

The data can be fetched via analytics and it returns a list of entity goals. Filters are available for filtering necessary data. FE is expected to do the final calculation and consolidation.

Front-end

FE has access to multiple API's to facilitate this. The set deadline and file import mutation and entity plans and entity goal setting query for analytics will provide all the necessity needed by FE.

1. entityPlans - This query is used to fetch the plans for the entity. Upcoming is an optional parameter. If upcoming is false, it will show only the current plans. If upcoming is true, then the return data will only be the upcoming plans.

query {
  entityPlans(office_id: 1585, upcoming: true) {
    deadline
    file_import {
      url
      filename
      status
      creator {
        id
        full_name
      }
    }
    office {
      id
    }
    plan {
      id
      start_month
      end_month
      mc_deadline
      lc_deadline(office_id: 630)
    }
  }
}

2. planSetDeadline mutation - This mutation is used to set deadline to a plan. If an MC is setting the deadline, it'll be applicable for all the LCs under it. If AI set the deadline, that is the deadline for all MCs.

mutation {
  planSetDeadline(office_id: 1585, plan_id: 1, deadline: "10-02-2020") {
    id
    start_month
    end_month
    name
    mc_deadline
    lc_deadline(office_id: 630)
  }
}

3. fileImport mutation - This endpoint is used to upload all xlsx, csv type files and process the data. Its a general purpose endpoint and require FE to specify the type of file uploaded. For entity goals, FE should also pass in plan_id and office_id to meta in the input.

mutation{
  fileImport(file_input: {import_type: "entity_goal",
    meta: {plan_id: 1, office_id: 1585},
    import_file: {
         filename: "plan_template.xlsx",
        content: "data:file/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,UEsDBBQAA"
    }
  }
  )
}

4. entity_goal_setting query - This is the query for analytics. Its not currently paginated and raw data is provided. Filters are available but consolidation of data is expected to happen at the FE.

query {
  entityGoalSetting(office_id: 1585, programme_id: 1, exchange_type: incoming, opportunity_duration_type_id: 1, sub_product_group: information_technology_engineering, time_period: {from: "", to: ""}) {
    office {
      id
    }
    programme {
      id
    }
    exchange_type
    opportunity_duration_type {
      id
      duration_type
    }
    sub_product_group
    goal_type
    goal
    achieved
  }
}
Added Membership LPS, Youth LPS and Membership NPS surveys
February 25th, 2021
We have added API support for 3 new surveys in AIESEC.

To get survey details and survey questions:

API endpoint: {{host}}/v2/surveys/survey_details
Request Type: GET
Params name: survey_type
Param option: ['membership_lps', 'youth_lps', 'membership_nps']
Sample request: {{host}}/v2/surveys/survey_details?survey_type=position_lps

To submit survey answer:

API endpoint: {{host}}/v2/surveys/answer
Request Type: POST
Params name: responses, survey_uuid
Sample request: {{host}}/v2/surveys/answer
Body:  {"responses": [{"question_id": 1, "answer": 1}, {"question_id": 2, "answer": 2, "other_question_id": 3, "other_option_answer": "test"}] }

Note: 
  • Have added additional details in the survey question. These object will have keys like sub_question_type, visual_style, is_other . 
  • sub_question_type will have either ["detractor","passive"] or ["passive","promoter"]  value. According to this value the step 2 and step 3 questions are showed.
  • visual_style will have vertical value which indicates how that questions are aligned.
  • is_other will have true value. If this option is selected then and input field should appear and the user enters the value. For these cases we have two additional params (other_question_id, other_option_answer) .
  • For Membership LPS and Membership NPS surveys, in api new object added  position is added. This will have details for person name, person home mc name, profile picture, position name and position office id. current_position key is also removed from the response and the details of this can be taken from name inside position object.
  • For Youth LPS and Youth NPS surveys, in api new object added  opportunity_application is added. This will have details for person name, person home mc name, profile picture, opportunity title and opportunity home MC id.

Added status finished in application
February 25th, 2021
We have added a new status called finished for applications (opportunity_applications). 

Before we considered an application as finished if an application status is realized and the experience_end_date is in the past.

Recommended changes on user interfaces

Customer Facing Applications
  1. If you are showing a timeline of an application, you must now represent finished by only checking for the status rather than checking for realised and experience_end_date.
  2. When filtering data for applications that are in the past or completed, you must also pass "finished" in the filters as well.

Internal Applications
  1. If you are showcasing statuses of applications or people in a list, you must account for finished being a status rather than checking for realised and experience_end_date
  2. If you are showcasing the profile of a particular application, you must check for the status of finished rather than checking for realised and experience_end_date
  3. If you are showcasing a timeline, you must check for the finished status.
  4. You must add finished status as a filter on all lists for people and applications.

Sales CRM import API
February 25th, 2021
We have added a feature in Sales CRM which will allow import data by Uploading Import sheet in either CSV or Excel format. This way more leads can be added.

Mutation to import file
Mutation:
fileImport
Params:
import_type: "employee_lead",
                   import_file: {
                    filename: "Employee_lead.csv",
                   content: "To base 64 converted file"
                   }

Eg:
The following will be the example for the above mentioned mutation to process records when uploading sheets.
Sample mutation
     mutation{
  fileImport(file_input: {import_type: "employee_lead",
                          import_file: {
				           filename: "employee_lead.csv",
                                            content: "data:file/csv;base64,77u/RW1haWwsZmlyc3RfbmFtZSxob21lX2xjX2lkCmJhbGFqaSsxMjJAY29tbXV0YXR1cy5jb20sQmFsYSwyMjQyCmJhbGFqaSsxMjNAY29tbXV0YXR1cy5jb20sQmFsYSAxMjMsMjI0Mgo="
                                        }
                         }
            )
          }
The CSV file headers
  • Before creating csv file or excel make sure the file has a required headers to process.
  • Employee_lead csv should have following headers
    Lead Name
    Job Role
    Work Email
    Phone Country Code
    Mobile
    Organization Name
    Organization Type ID
    Industry ID
    Product Interest ID
    Referral
    Local Committee ID
    Invite To POP ( True or False or Nil )

Added status remote_realized in application
February 25th, 2021
Before in remote realize feature we tracked remote start date and remove end date. Now, in API remote_realized status is added and will be updated with this status for the applications which are being marked as remote_realized.

We have added this status which will help us get these stats in analytics.

Recommended changes on user interfaces

Customer Facing Applications
  1. If you are showing a timeline of an application, you must now represent remote_realized by checking for this status.
  2. When filtering data for remote realized applications, you must also pass "remote_realized" in the filters as well.

Internal Applications
  1. If you are showcasing statuses of applications or people in a list, you must account for remote_realized status
  2. If you are showcasing the profile of a particular application, you must check for the status remote_realized
  3. If you are showcasing a timeline, you must check for the remote_realized status.
  4. You must add remote_realized status as a filter on all lists for people and applications.


Governance Actions
February 25th, 2021
Description

There was a requirement of having to freeze an office or unpublish opportunties. The governance actions was made for this purpose.

How it works

Only AI members have the power to unpublish an opportunity. This can be done by providing a reason out of a list of constants of type unpublish_reason. The freezing of office also results in the opportunities under it getting unpublished. The reason in this case would be OfficeType Frozen.

The freezing and unfreezing of office is done by letting the team know. Once frozen, the currently active president will receive a mail. If its an LC then both the LCP and MCP will receive a mail mentioning the same. For an MC, all the LCS under it would be frozen as well. Once an office is frozen, all the opportunities under that office will also get unpublished.

Front-End

There is an existing API for unpublishing an opportunity. The change made was to the permission as well as to provide a reason and any other remarks. The reason can be selected using the constants query with type unpublish_reason. This id has to be passed as the reason for unpublishing.

opportunityUnpublish(id: 1, reason_id: 10, remarks: 'Just for fun') {
  id
  status
}

The reason_id can be obtained using the constants query.

allConstants(type_id: 'unpublish_reason') {
  id
}

Exposed is_frozen in OfficeType - This will return true or false. Use this object to know the status frozen status of committees.
Graphql error revamp
December 28th, 2020
We have revamped the Graphql errors in Graphql standards, returning 200 response codes with errors as messages in response. 

Old error codes:
Currently the restructuring of graphql errors were done for the following error types:

In build errors:

  • ActiveRecord::RecordNotFound 

  • ActiveRecord::RecordInvalid

  • ActiveRecord::StatementInvalid

  • ActiveRecord::RecordNotUnique

Custom errors:

  • EntityNotFound 

  • InvalidRecord

All internal server errors(status code - 500) are also rescued and presented to the frontend. This particular response will include the rollbar id for the error to easily debug it.

The above-mentioned errors do go through Graphql API endpoints and are being rescued. There are two other scenarios where we check a few validations before the API endpoint is triggered. These errors are not rescued now and require infrastructure change which will also impact Rest endpoints. The following are those scenarios:

  • Invalid Account Type - This is used to determine which user can access which platform. Example scenario. YOP users should not be able to access EXPA.

  • Invalid Access Token - When the provided access token is invalid.

To fix the above two scenarios we will need to have an infrastructure update to Graphqh. We can take this forward in the future.

Note: The error codes which will remain the same are 401 and 406.

Sample Request & Response:

1. ActiveRecord::RecordNotFound:

Request:
query getApplicationQuery {
 getApplication(id: 628134) {
   id
 }
}

Response:
Status: 200
{
  "data": {
    "getApplication": null
  },
  "errors": [
    {
      "message": "Requested record not found.",
      "locations": [
        {
          "line": 2,
          "column": 2
        }
      ],
      "path": [
        "getApplication"
      ],
      "extensions": {
        "code": "record_not_found"
      }
    }
  ]
}

2. ActiveRecord::RecordInvalid

Request:
mutation{
  createOpportunity(opportunity: {home_lc_id: 630,   branch_id: 1,  programme_id: 9}){
    id
  }
}

Response:
Status: 200
{
  "data": {
    "createOpportunity": null
  },
  "errors": [
    {
      "message": "Title can't be blank",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createOpportunity"
      ],
      "extensions": {
        "code": "unprocessable_entity",
        "sub_code": "record_invalid",
        "message": "Title can't be blank"
      }
    }
  ]
}

3.EntityNotFound

Request:
query{
  checkPersonPresent(email: "testinng@commutatus.com"){
    id
  }
}

Response:
Status: 200
{
  "data": {
    "checkPersonPresent": null
  },
  "errors": [
    {
      "message": "Requested entity not found.",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "checkPersonPresent"
      ],
      "extensions": {
        "code": "unprocessable_entity",
        "sub_code": "entity_not_found",
        "message": "Requested entity not found."
      }
    }
  ]
}

4.InvalidRecord

Request:
mutation{
  updateCommittee(id: 1558, committee: {default_project_fee_cents: 4500, project_fee_limit_cents: 100}){
    id
   
    default_currency{
      id
    }
  }
}

Response:
Status: 200
{
  "data": {
    "updateCommittee": null
  },
  "errors": [
    {
      "message": "project_fee_limit value should not be lesser than default_project_fee value.",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "updateCommittee"
      ],
      "extensions": {
        "code": "unprocessable_entity",
        "sub_code": "invalid_record",
        "message": "project_fee_limit value should not be lesser than default_project_fee value."
      }
    }
  ]
}



Added First Followed up date in Application
November 16th, 2020
When updating the application follow up for the first time. it will store the current date and time in the first_followed_up_date  field.

Exposed first_followed_up_date in OpportunityApplicationType.

Data democratization (CRM data download)
October 29th, 2020
Description

We have the EXPA CRM which can be used to view the details of various stuff such as Opportunities, Applications, People, Offices and Companies. But it was mentioned to be difficult to handle and use the data effectively from EXPA. So a downloadable version of the data was required. This feature is built to provide a downloadable link for all the data available in EXPA CRM.

How it works

The link to the download will be available in the respective CRM page in EXPA. Each file can contain a maximum of 5000 rows of data (5000 records).

The front-end side will hit the required API endpoint along with columns as well as the other filters that were available for the CRM. The back-end will queue the request and execute it as a background task while responding to the api with 200 and a message informing that the request is queued.

The back-end will then generate an excel which contains the records based on the filters and other request data provided. This excel file will then be uploaded to Amazon S3 where it will stay for 48 hours. The link will then be mailed to the email address of the user who requested the download. The link in the email is valid for 48 hours, after which the file would be deleted.

Front-end

The front-end has to call the API endpoints with the column names as well as the other required filters. Please find the column names below.

People
  • person_id
  • person_name
  • person_email
  • person_date_of_birth
  • person_applications_count
  • person_backgrounds
  • person_languages
  • person_skills
  • person_nationalities
  • person_signed_up_on
  • person_gender
  • person_lc
  • person_mc
  • person_referral
  • person_status
  • person_manager_ids
  • person_manager_names
  • person_is_aiesecer
  • person_contacted_by_id
  • person_contacted_by
  • person_contacted_at
  • person_interviewed
  • person_last_action
  • person_lead_alignment
  • person_phone
  • person_interested_products

Opportunities
  • opportunity_id
  • opportunity_title
  • opportunity_organization
  • opportunity_status
  • opportunity_applicant_count
  • opportunity_close_date
  • opportunity_branch
  • opportunity_created_at
  • opportunity_created_via
  • opportunity_duration_type
  • opportunity_earliest_start_date
  • opportunity_is_gep
  • opportunity_last_updated
  • opportunity_latest_end_date
  • opportunity_opened_at
  • opportunity_openings
  • opportunity_product
  • opportunity_work_field
  • opportunity_sdg_target
  • opportunity_sdg
  • opportunity_manager_ids
  • opportunity_manager_names
  • opportunity_backgrounds
  • opportunity_duration
  • opportunity_lc
  • opportunity_mc
  • opportunity_organization_type

Applications
  • application_id
  • application_status
  • application_applicant_id
  • application_applicant_name
  • application_applicant_email
  • application_applicant_backgrounds
  • application_applicant_languages
  • application_applicant_skills
  • application_applicant_nationalities
  • application_applicant_phone
  • application_opportunity_id
  • application_opportunity_title
  • application_opportunity_product
  • application_opportunity_work_field
  • application_opportunity_sdg_target
  • application_opportunity_sdg
  • application_opportunity_duration_type
  • application_is_gep
  • application_applied_at
  • application_date_ep_accepted_offer
  • application_date_marked_accepted_by_host
  • application_date_marked_approved
  • application_date_marked_realized
  • application_experience_start_date
  • application_experience_end_date
  • application_has_standards_survey
  • application_home_lc
  • application_home_mc
  • application_host_lc
  • application_host_mc
  • application_lda_score
  • application_nps_score
  • application_organization
  • application_shortlisted
  • application_slot

Offices
  • office_id
  • office_name
  • office_parent
  • office_type

Companies
  • company_id
  • company_name
  • company_type
  • company_size
  • company_status
  • company_manager_ids
  • company_active_opportunities
  • company_no_of_opportunities
  • company_no_of_employees
  • company_lc
  • company_mc
  • company_phone
  • company_email
  • company_first_pop_sign_up_date
  • company_is_gep

API Endpoints

  • allPeopleDownload
  • allOpportunityDownload
  • allOpportunityApplicationDownload
  • committeesDownload
  • allOrganisationDownload
Add Signup and Accepted count in Graphical Analytics
October 26th, 2020
The Graphical analytics used to return Total applications , approved , realized, finished and completed count. Now in API added two more data count.

1. Total Signups  - The value of this can be found in the key total_signups
2. Total Accepted -
The value of this can be found in the key total_an_accepted

Deprecation of contacted REST endpoint.
October 26th, 2020
We have deprecated POST /v2/people/{:person_id}/contacted endpoint which will update the EP contacted at details. This was an old endpoint and this is now part of EP Followup .


The alternate for this endpoint:

Endpoint: updatePerson
Param: follow_up_id

The followup options can be get form the following endpoint:
query{
  allConstants(type_ids: ["ep_manager_follow_ups"]){
    id
    name
  }
}
Added Remote Opportunity Mutation
October 26th, 2020
Mark Remote Opportunity:
Mutation: opportunityMarkRemote
Permission: 
can_mark_remote_opportunity  exposed in OpportunityPermissionType


Unmark Remote Opportunity:
Mutation: opportunityUnmarkRemote
Permission: 
can_mark_unremote_opportunity exposed in OpportunityPermissionType

Added new feature Remote Realize
October 26th, 2020
Remote Realize
  1.  Added "remoteRealizeApplication" mutation in OpportunityApplicationMutationQueryType
  2. Added "can_be_remote_realized" permission object in OpportunityApplicationPermissionType
  3. Added "remote_start_date" in ApplicationFilter
Extend Remote Experience
  1. Added "applicationExtendRemoteExperience" mutation in OpportunityApplicationMutationQueryType
  2. Added "can_extend_remote_experience" permission object in OpportunityApplicationPermissionType

Added Sub Product filter in Performance analytics
August 27th, 2020
Sub Product is part of new Opportunities and this filter is now being added to performance analytics which will filter out ICX data from opportunity, applications from opportunities under the selected sub products.

Filter name: sub_product_ids
Filter type: Array, accepts multiple Integer values.
Filter option:  Fetch available sub products from subProducts Graphql API query.

Added Duration type filter in Performance analytics
August 27th, 2020
Duration type is part of new Opportunities and this filter is now being added to performance analytics which will filter out ICX data from opportunity, applications from opportunities under the selected duration type.

Filter name: duration_types
Filter type: String, accepts multiple values.
Filter option: short, medium, long


Breaking change: Performance analytics response format changed for open data
August 24th, 2020
With new programmes, the performance analytics response has to be changed to accommodate these programmes.

Open OGX:

Before Improvement:
open_ogx, open_ogv, open_ogt, open_oge

After Improvement:
open_ogx, open_o_programme_1, open_o_programme_2, open_o_programme_5, open_o_programme_7, open_o_programme_8, open_o_programme_9

Open ICX:

Before Improvement:
open_icx, open_igv, open_igt, open_ige

After Improvement:
open_icx, open_i_programme_1, open_i_programme_2, open_i_programme_5, open_i_programme_7, open_i_programme_8, open_i_programme_9

Applications Data:

Before Improvement:
i_matched_gv, i_matched_gt, i_matched_ge, o_matched_gv, o_matched_gt, o_matched_ge

After Improvement:
i_matched_1, i_matched_2, i_matched_5, i_matched_7, i_matched_8, i_matched_9,  o_matched_1, ,  o_matched_2,  o_matched_5,  o_matched_7,  o_matched_8,  o_matched_9

Note: 
1. This same format applies for all the other statuses also -  applied, matched, an_accepted, approved, realized, finished, completed
3. The number value added now are the programmes ids.
1 - Old GV
2 - Old GT
5 - GE
7 - New GV
8 - New GT(GTa)
9 - GTe

Feature to add custom data to a Person/Application.
August 21st, 2020
We have added a feature in a way that will let the users to add custom data to a person or an application.

This way custom clients can store information for users and applications in a secure manner only accessible to that client. Some examples might be preferences such as timezone, language, last online, etc.

Mutation:
clientDataPut - This is a create mutation
clientDataUpdate - This is an update mutation

Currently clientData can be added to person and application and thus these records are returned in CurrentPersonType, OpportunityApplicationType as client_datas as connection_type

Sample request:
mutation{
   clientDataPut(client_data: {applicable_id: 1, applicable_type: "Person", name: "foo", value:        "bar", data_type: "String"}){
    id
    data_type
    name
    value
  }
}



Urgent: Deprecation of old performance and E2E analytics params
August 17th, 2020
Reason:
We have revamped both Performance and E2E analytics to serve the response fast. These change has been implemented in EXPA analytics.
We could still see few analytics requests in our logs with old params for performance and E2E and this is affecting other analytics requests. We have planned to remove the support for old analytics params and this way the other requests are served faster.

Recommended Solution:

Performance Analytics:
Old param - performance
New param - performance_v3
Sample request:  https://analytics.api.aiesec.org/v2/applications/analyze.json?access_token=****&start_date=2019-05-29&end_date=2020-01-01&performance_v3[office_id]=1626

E2E Analytics:
Old param - e_to_e
New param - e_to_e_v1
Sample request - https://analytics.api.aiesec.org/v2/applications/analyze.json?access_token=****&start_date=2020-01-01&end_date=2020-08-05&e_to_e_v1[person_committee]=1585&e_to_e_v1[opportunity_committee]=1609&e_to_e_v1[status]=accepted&programmes[]=1

Deprecation Date:  7th August 2020

Note: After the deprecation date if the endpoint is still accessed with old param the response  code will be 410 and there will not be any data returned.

Urgent: Removal of old programmes support in API signup
August 17th, 2020
The signup in aiesec.org is carried out in two ways.
1. Signup through aiesec.org
2. signup via API endpoint.

Signup via API endpoint support additional fields along with the mandatory fields. One of the field is selected_programmes and this is to mark the product interest fo the Signup account. This field used to accept values like 1, 2, 5. These are the programme ids. We have stopped support for old programmes and thus allow only new programmes 7, 8, 9.

If any of the old programme Id is passed in selected_programmes the API will respond with Validation error.

Sample error response for old programme id :
Status Code: 422
Response:
{
    "errors": {
        "selected_programmes": [
            "Old products are not supported anymore. Please use the new products - 7, 8, 9"
        ]
    }
}

Please change the value to new programme ids for successful signups.

New programme Ids:
7 - Global Volunteer
8 - Global Talent
9 - Global Teacher
Added feature Sales CRM
August 13th, 2020
Call/Meeting tracker: 
  1. Added mutation for create, update and destroy. engagementCreate, engagementUpdate, engagementDelete
  2. Added can_add_engagement permission object in EmployeeLeadPermissionType
  3. Added can_update and can_delete permission objects in EngagementPermissionType.
  4. Exposed engagements as connections in EmployeeLeadType

Lead Qualification:
  1. Added fields budget, authority, need and timing in EmployeeLeadInput, EmployeeLeadType and EmployeeLeadFilter
  2. added field qualification_score in EmployeeLeadType which will return the percentage for true value in budget, authority, need and timing fields.
Status time tracker
  1. added field status_last_updated_at in EmployeeLeadType which will return the timestamp for the latest status update.
Note: 
1. budget, authority, need and timing are boolean type but the UI will have options like Yes, No.
2. meeting date and meeting time will be two different fields in UI but it will be one field in API - engagement_date
Added new logistics filters
July 28th, 2020
For new products in Opportunity we have added/revamped the logistics filter. 

Newly added logistics filters:
  • accommodation_covered - Available options - covered, not_covered
  • accommodation_provided - Available types - provided, not_provided
  • food_covered - Available options - covered, not_covered
  • food_provided - Available types - provided, not_provided
  • transportation_covered - Available options - covered, not_covered
  • transportation_provided - Available types - provided, not_provided
Exposed remote_opportunity key in OpportunityType
July 27th, 2020
We have added remote_opportunity flag to differentiate certain opportunities. This key is now being exposed in response of OpportunityType. this will be used by the YOP application to show additional information.

key - remote_opportunity
type - String
possible options - "true", nil
Removal of SDG Course Emails
July 27th, 2020
SDG Course emails will not be triggered when an EP gets approved anymore.
Added duration type filter in Opportunities and applications CRM
July 23rd, 2020
With new opportunities having duration type associated to it, the duration_type filter is added for the Opportunity CRM and Application CRM.

Filter name: duration_type
Filter type: String, accepts multiple values.
Filter option: short, medium, long
Fitler added in : OpportunityFilter, ApplicationFilter
Added remote opportunity filter in Applications CRM
July 23rd, 2020
We have added a new filter in application CRM to filter remote opportunity.

Filter Name: remote_opportunity
Filter Type: Boolean
Urgent: Deprecation of opportunity_cost in GraphQL Opportunity Type
July 23rd, 2020
Deprecated field:
opportunity_cost in OpportunityType

Reason:
opportunity_cost used to return exchange participation fee and project fee. With new opportunity flow we geocode the users location and return the project fee and participation fee according to their location. Now we have a requirement to return the users home MC health insurance details.  For this we have deprecated this and added a new object with same response.

Recommended solution:
Use the fee_and_health_insurance instead of opportunity_cost and this new object will return all the data from opportunity_cost along with health_insurance_link in its response.

Date of deprecation: 15th July 2020

Date of removal: 24th July 2020
Improvements to role function list
July 8th, 2020
Two new roles have been added to the API
  • Incoming Global Teacher
  • Outgoing Global Teacher
Two roles have been marked as "in-active"
  • Incoming Global Entrepreneur
  • Outgoing Global Entrepreneur
Positions are now returned with roles to help ordering them in dropdowns.
Additional information for reported opportunities
July 6th, 2020
When reporting an opportunity, it is now possible to pass in additional information specially when the reason is other by using the "additional_information" argument in the "opportunityReport" mutation
Scoped out committees for Opportunity create
June 29th, 2020
Reason:
Currently the opportunity can be created for any Local committee irrespective of the user's role.However this opportunity will not show up for the user if they dont manage that committee. To tackle this issue we have scoped out the committees that the user manages and listed out in current_person response. This can be shown in the Host LC dropdown in opportunity create. 

Details:
current_person_type -> creatable_offices_for_opportunities

creatable_offices_for_opportunities field accepts argument for search. 

Note:  creatable_offices_for_opportunities is exposed as connection and if the total_count is 1 prefill that option directly in Host LC dropdown.
Added API support for Incoming Programme Fees
June 23rd, 2020
API endpoint details:

Mutation name:
incomingProgrammeFeeUpdate
Fields: programme_fee_min, programme_fee_max

The above fields are exposed in response type of ProgrammeFee(Types::Objects::ProgrammeFeeType)


Deprecation of unused fields in GraphQL Schema
June 15th, 2020
The following fields will be deprecated as they are not relevant to live features on the platform.

Opportunity:
  • parent_opportunity
  • video_url
  • lat
  • lng
  • programmes
  • project_id
  • preferred_locations_info
  • organisation
  • tm_details
  • office_footfall_for_exchange

Application:
  • vd_blog_url
  • system_rated_at
  • system_rating
  • attendees
  • inbound_emails
  • transactions

Comment:
  • meta

Office:
  • committee_aggregations
  • committee_targets

Branch:
  • invoices
Deprecation Schedule
  • 30th June 2020 - the fields will be marked as deprecated on the schema.
  • 30th July 2020 - the fields will be removed from the schema.
Deprecation of unused queries in GraphQL schema
June 15th, 2020
The following queries will be deprecated as they are not relevant to live features on the platform.

Branch:
  • branchContracts

Event:
  • eventList
  • eventGet
  • similarEvents
EventRegistration:
  • eventRegistrationList
  • eventRegistrationGet

EventSpeaker:
  • eventSpeakerCreate
  • eventSpeakerUpdate
  • eventSpeakerDelete

EventTicket:
  • eventTicketCreate
  • eventTicketUpdate
  • eventTicketDelete

OpportunityApplication:
  • getInboundEmailApplication

OrganizationDevelopment:
  • updateOrganizationDevelopment
  • updateOrganizationDevelopmentTarget
  • organizationDevelopmentList
  • organizationDevelopmentGet
  • organizationDevelopmentTargetList
  • organizationDevelopmentTargetGet

MailTemplate:
  • createMailTemplate
  • publishMailTemplate
  • sendTestMailTemplate
  • deleteMailTemplate
  • updateMailTemplate
  • mailTemplates
  • getMailTemplate
  • deliverabilityReport

Invoice:
  • createInvoice
  • updateInvoice
  • updatePaymentInvoice
  • deleteInvoice
  • invoicePayByCash
  • invoiceApproveCashPayment
  • getInvoice

Deprecation Schedule
  • 30th June 2020 - the queries/mutations will be marked as deprecated on the schema.
  • 30th July 2020 - the queries/mutations will be removed from the schema.
Urgent: logistics_info input type changed
May 31st, 2020
Deprecated field:
accommodation_covered of LogisticsInfoInput in OpportunityInput.

Reason:
accommodation_covered field is defined as Boolean type and with  New opportunity creation flow for new products/programmes this field will have values other than Boolean.  The reason why we didn't add a new field and changing the existing field input type is this field is being used in existing opportunity and this is also part of new opportunity flow.

Recommended solution:
Fetch the latest schema query and update the accommodation_covered  input field type to String.

Date of removal: 31st May 2020.
Urgent: cover_photo response type changed
May 21st, 2020
Field Name:
cover_photo in OpportunityType

Reason:
We are improving the response type to be standardised with attachments. This will also return the name of the cover photo image along with the URL rather than just the URL. Due to some features being deployed on EXPA, it is important that we deploy this change to production without giving much notice.

Sample Format:
cover_photo: {url: "https://cdn-expa.aiesec.org/gis-img/gv_default.png",  filename: "gv_default.png"}

Date of removal:
 21st May 2020
Urgent: Deprecations in GraphQL Opportunity Type
May 21st, 2020
Deprecated field:
organisation in OpportunityType

Reason:
branch_id is no longer a required parameter in the opportunity creation flow as per the new programme structure and hence we cannot readily provide an organisation.

Recommended solution:
Use the branch.company to get the name of the organisation or any other details of the company/organisation that is hosting the opportunity.

Date of deprecation:
27th May 2020, after this, you will see a notice in development consoles that the field has been deprecated. If an opportunity does not have a branch associated with it during creation and you request for the organisation, the API will throw a 500 error.

Date of removal:
30th June 2020, after this, the field will no longer be available on the OpportunityType
X
Crafted by