Skip to content

Commit

Permalink
fix(campaign): campagnes (#2405)
Browse files Browse the repository at this point in the history
* update Pays Basque Adour (946) description
* update Cannes (1018)
* add PETR Lunevillois S1 2023 campaign
  • Loading branch information
jonathanfallon authored Feb 8, 2024
1 parent 3d7e0d7 commit 4ab52aa
Show file tree
Hide file tree
Showing 7 changed files with 375 additions and 99 deletions.
28 changes: 14 additions & 14 deletions api/services/policy/src/engine/helpers/isInside.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,27 @@ import { Feature, MultiPolygon, Polygon, Properties, multiPolygon, point, polygo
import booleanPointInPolygon from '@turf/boolean-point-in-polygon';

interface IsCloseToParams {
shape: GeoJSON,
shape: GeoJSON;
}

export const isInside: StatelessRuleHelper<IsCloseToParams> = (
ctx: StatelessContextInterface,
params: IsCloseToParams,
): boolean => {
const start = point([ctx.carpool.start_lon, ctx.carpool.start_lat]);
const end = point([ctx.carpool.end_lon, ctx.carpool.end_lat]);
const shape = getShapeFromGeoJSON(params.shape);
return booleanPointInPolygon(start, shape) || booleanPointInPolygon(end, shape);
const start = point([ctx.carpool.start_lon, ctx.carpool.start_lat]);
const end = point([ctx.carpool.end_lon, ctx.carpool.end_lat]);
const shape = getShapeFromGeoJSON(params.shape);

return booleanPointInPolygon(start, shape) || booleanPointInPolygon(end, shape);
};

function getShapeFromGeoJSON(data: GeoJSON): Feature<Polygon|MultiPolygon, Properties> {
if (data.type === 'Polygon') {
return polygon(data.coordinates);
}
function getShapeFromGeoJSON(data: GeoJSON): Feature<Polygon | MultiPolygon, Properties> {
if (data.type === 'Polygon') {
return polygon(data.coordinates);
}

if (data.type === 'MultiPolygon') {
return multiPolygon(data.coordinates);
}
throw new Error('Invalid GeoJSON');
if (data.type === 'MultiPolygon') {
return multiPolygon(data.coordinates);
}
throw new Error('Invalid GeoJSON');
}
61 changes: 33 additions & 28 deletions api/services/policy/src/engine/policies/Cannes.html.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,33 @@
export const description = `<p _ngcontent-pmm-c231="" id="summary" class="campaignSummaryText-content-text">
<p>Campagne d’incitation au covoiturage du <b> 01 janvier 2024 au 30 avril 2024</b>
</p>
<p>Cette campagne est limitée à
<b>50 896,48 euros </b>.
</p>
<p>
Le périmètre géographique de la campagne comprend les zones suivantes
</p>
<ul>
<li>Communauté d'agglomération Cannes Pays de Lérins</li>
</ul>
<p>Les <b> conducteurs </b> effectuant un trajet entre 2 km et 80 km,
avec pour origine OU destination le périmètre ci-dessus,
sont incités selon les règles suivantes : </p>
<ul>
<li><b>De 2 à 15 km : 1.5 euros par trajet par passager transporté.</b></li>
<li><b>De 15 à 30 km : 0.1 euros par km par passager transporté.</b></li>
</ul>
<p>Les restrictions suivantes seront appliquées :</p>
<ul>
<li><b>150 € maximum pour le conducteur par mois.</b></li>
<li><b>6 trajets maximum pour le conducteur par jour.</b></li>
</ul>
<p>La campagne est limitée aux opérateurs <b>Klaxit</b>
proposant des preuves de classe <b>B ou C</b>.</p>
<p></p>
</p>`;
export const description = `<div _ngcontent-pmm-c231="" id="summary" class="campaignSummaryText-content-text">
<p>Campagne d’incitation au covoiturage du <b> 01 janvier 2024 au 30 avril 2024</b></p>
<p>Cette campagne est limitée à <b>50 896,48 euros </b>.</p>
<p> Le périmètre géographique de la campagne comprend les zones suivantes :</p>
<ul>
<li>Communauté d'agglomération Cannes Pays de Lérins</li>
</ul>
<p>
Les <b> conducteurs </b> effectuant un trajet entre 2 km et 80 km,
avec pour origine OU destination le périmètre ci-dessus,
sont incités selon les règles suivantes :
</p>
<ul>
<li><b>De 2 à 15 km : 1.5 euros par trajet par passager transporté.</b></li>
<li><b>De 15 à 30 km : 0.1 euros par km par passager transporté.</b></li>
</ul>
<p>Les restrictions suivantes seront appliquées :</p>
<ul>
<li><b>150 € maximum pour le conducteur par mois.</b></li>
<li><b>6 trajets maximum pour le conducteur par jour.</b></li>
</ul>
<p>La campagne est limitée à l'opérateur <b>Klaxit</b> proposant des preuves de classes <b>B ou C</b>.</p>
</div>`;
61 changes: 32 additions & 29 deletions api/services/policy/src/engine/policies/PaysBasque.html.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
export const description = `<p _ngcontent-pmm-c231="" id="summary" class="campaignSummaryText-content-text">
<p>Campagne d’incitation au covoiturage du <b> 1 avril 2023 au 31 décembre 2023</b>, toute la semaine
</p>
<p>Cette campagne est limitée à
<b>185 000 euros </b>.
</p>
<p>Les trajets de + de 80km sont exclus à partir du 1er janvier 2024</p>
<p>Les <b> conducteurs et passagers </b> effectuant un trajet d'au moins 5 km sont incités selon les règles suivantes :
</p>
<ul>
<li><b>De 5 à 20 km : 2 euros par trajet par passager </b></li>
<li><b>De 20 à 30 km : 0.1 euro par trajet par km par passager </b></li>
</ul>
<p>Les <b> passagers </b> effectuant un trajet d'au moins 5 km sont incités selon les règles suivantes :
</p>
<ul>
<li><b>Les trajets sont gratuits s’il a une origine ou une destination sur le territoire du
Pays Basque Adour</b></li> (la contrepartie n'est pas prise en compte par le RPC)
</ul>
<p>Les restrictions suivantes seront appliquées :</p>
<ul>
<li><b>6 trajets maximum pour le conducteur par jour.</b></li>
<li><b>150 euros maximum pour le conducteur par mois.</b></li>
</ul>
<p>La campagne est limitée à aux opérateurs Klaxit, Karos, Blablacar Daily,
Mobicoop proposant des preuves de classe <b>C</b>.</p>
*Mobicoop ne fait plus parti des opérateurs éligibles depuis le 1 Janvier 2024
<p></p>
</p>`;
/* eslint-disable */

export const description = `<div _ngcontent-pmm-c231="" id="summary" class="campaignSummaryText-content-text">
<p>Campagne d'incitation au covoiturage du <b> 1 avril 2023 au 31 décembre 2024</b>, toute la semaine</p>
<p>Cette campagne est limitée à <b>185 000 euros</b>.</p>
<p>Les trajets de + de 80km sont exclus à partir du 1er janvier 2024</p>
<p>Les <b> conducteurs et passagers </b> effectuant un trajet d'au moins 5 km sont incités selon les règles suivantes :</p>
<ul>
<li><b>De 5 à 20 km : 2 euros par trajet par passager </b></li>
<li><b>De 20 à 30 km : 0.1 euro par trajet par km par passager </b></li>
</ul>
<p>Les <b> passagers </b> effectuant un trajet d'au moins 5 km sont incités selon les règles suivantes :</p>
<ul>
<li><b>Les trajets sont gratuits s'il a une origine ou une destination sur le territoire du
Pays Basque Adour</b></li> (la contrepartie n'est pas prise en compte par le RPC)
</ul>
<p>Les restrictions suivantes seront appliquées :</p>
<ul>
<li><b>6 trajets maximum pour le conducteur par jour.</b></li>
<li><b>150 euros maximum pour le conducteur par mois.</b></li>
</ul>
<p>La campagne est limitée à aux opérateurs Klaxit, Karos et Blablacar Daily proposant des preuves de classe <b>C</b>.</p>
<p><em>Mobicoop ne fait plus partie des opérateurs éligibles depuis le 1 Janvier 2024</em></p>
</div>`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/* eslint-disable */

export const description = `<div _ngcontent-pmm-c231="" id="summary" class="campaignSummaryText-content-text">
<p>Campagne d'incitation au covoiturage du <b> 8 janvier 2024 au 7 juin 2024</b>, toute la semaine</p>
<p>Cette campagne est limitée à <b>10 000 euros</b>.</p>
<p>Les <b> conducteurs </b> effectuant un trajet en covoiturage d'au moins 2 km sont incités selon les règles suivantes :</p>
<ul>
<li><b>De 2 à 60 km : 7 centimes d'euro par km et par trajet par passager transporté</b></li>
</ul>
<p>Les restrictions suivantes seront appliquées :</p>
<ul>
<li><b>2 trajets maximum pour le conducteur par jour.</b></li>
</ul>
<p>La campagne est limitée à l'opérateur Mobicoop proposant des preuves de classe <b>C</b>.</p>
</div>`;
162 changes: 162 additions & 0 deletions api/services/policy/src/engine/policies/PetrLunevilloisS12023.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
import test from 'ava';
import { v4 } from 'uuid';
import { OperatorsEnum } from '../../interfaces';
import { makeProcessHelper } from '../tests/macro';
import { PetrLunevilloisS12023 as Handler } from './PetrLunevilloisS12023';

const defaultPosition = {
arr: '54233',
com: '54233',
aom: '200051134',
epci: '200069433',
dep: '54',
reg: '44',
country: 'XXXXX',
reseau: '269',
};
const defaultLat = 48.5905360901711;
const defaultLon = 6.499392987670189;

const defaultCarpool = {
_id: 1,
trip_id: v4(),
passenger_identity_uuid: v4(),
driver_identity_uuid: v4(),
operator_siret: OperatorsEnum.Mobicoop,
operator_class: 'C',
passenger_is_over_18: true,
passenger_has_travel_pass: true,
driver_has_travel_pass: true,
datetime: new Date('2023-02-01'),
seats: 1,
duration: 600,
distance: 5_000,
cost: 20,
driver_payment: 20,
passenger_payment: 20,
start: { ...defaultPosition },
end: { ...defaultPosition },
start_lat: defaultLat,
start_lon: defaultLon,
end_lat: 48.58685290576798,
end_lon: 6.483696700766759,
};

const process = makeProcessHelper(defaultCarpool);

test(
'should work with exclusions',
process,
{
policy: { handler: Handler.id },
carpool: [
{ operator_siret: 'not in list' },
{ operator_siret: OperatorsEnum.Klaxit },
{ distance: 100 },
{ distance: 60_000 },
{ operator_class: 'A' },
],
meta: [],
},
{ incentive: [0, 0, 0, 0, 0], meta: [] },
);

test(
'should work basic with start/end inside aom',
process,
{
policy: { handler: Handler.id },
carpool: [
{ distance: 5_000, driver_identity_uuid: 'one' },
{ distance: 5_000, seats: 2, driver_identity_uuid: 'one' },
{ distance: 25_000, driver_identity_uuid: 'two' },
{ distance: 25_000, seats: 2, driver_identity_uuid: 'two' },
],
meta: [],
},
{
incentive: [21, 42, 161, 322],
meta: [
{
key: 'max_amount_restriction.global.campaign.global',
value: 546,
},
],
},
);

test(
'should work basic with start or end outside aom',
process,
{
policy: { handler: Handler.id },
carpool: [
// start
{ distance: 5_000, driver_identity_uuid: 'one', start: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 5_000, seats: 2, driver_identity_uuid: 'one', start: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 25_000, driver_identity_uuid: 'two', start: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 25_000, seats: 2, driver_identity_uuid: 'two', start: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 55_000, driver_identity_uuid: 'two', start: { ...defaultPosition, aom: 'not_in_aom' } },

// end
{ distance: 5_000, driver_identity_uuid: 'one', end: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 5_000, seats: 2, driver_identity_uuid: 'one', end: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 25_000, driver_identity_uuid: 'two', end: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 25_000, seats: 2, driver_identity_uuid: 'two', end: { ...defaultPosition, aom: 'not_in_aom' } },
{ distance: 55_000, driver_identity_uuid: 'two', end: { ...defaultPosition, aom: 'not_in_aom' } },
],
meta: [],
},
{
incentive: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
meta: [],
},
);

test(
'should work with global limits',
process,
{
policy: { handler: Handler.id, max_amount: 10_000_00 },
carpool: [{ distance: 59_000, driver_identity_uuid: 'one' }],
meta: [
{
key: 'max_amount_restriction.global.campaign.global',
value: 9_999_99,
},
],
},
{
incentive: [1], // <-- should be 413. capped to 1
meta: [
{
key: 'max_amount_restriction.global.campaign.global',
value: 10_000_00,
},
],
},
);

test(
'should work with 2 trips per day limit',
process,
{
policy: { handler: Handler.id },
carpool: [
{ distance: 5_000, driver_identity_uuid: 'one' },
{ distance: 5_000, driver_identity_uuid: 'one' },
{ distance: 5_000, driver_identity_uuid: 'one' },
{ distance: 5_000, driver_identity_uuid: 'one' },
],
meta: [],
},
{
incentive: [21, 21, 0, 0],
meta: [
{
key: 'max_amount_restriction.global.campaign.global',
value: 42,
},
],
},
);
Loading

0 comments on commit 4ab52aa

Please sign in to comment.