Definition: [
"autonomous agent",
{
"init": "{
$nom_AA = 'Accions';
//$_Registre = '5WVBJQHTEP54AEYUJGTQKWTXTXZSJQWA';
$_Registre = trigger.data._Registre; // * només x tests
// $_Portal = $__dada( '_Portal' );
$_Portal = trigger.address; // * només x tests
if ( $_Portal != trigger.address ) bounce( 'Portal no reconegut' );
// Arguments i dades rebudes
$args = trigger.data;
$adr__ = trigger.initial_address;
$id_unitat = trigger.output[[ asset != base ]].asset;
$qt = trigger.output[[ asset = $id_unitat ]];
$ref = $args.ref;
$provisio = $id_unitat == 'none';
$ACC = $args.accio otherwise '';
$dades = $args.dades otherwise {};
$args.sentit = 'entrada';
// Funcions
$__dada = $refval =>
data_feed[[ oracles = $_Registre, feed_name = $refval, ifnone = false ]];
$__arg = $arg =>
$args[ $arg ] otherwise
bounce( "Cal proporcionar el valor de: " || $arg );
// Getó utilitzat
$geto =
$id_unitat == $__dada( 'Estels' ) ?
'Estels':
$__dada( 'geto_' || $id_unitat );
// + Funcions
$__definidor = $refdef => {
$geto == 'Estels' ?
$__dada( $refdef ) :
$__dada( $geto || '_' || to_lower( $refdef ) )
};
// Comprova si adreça activada per operar amb getó especificat
$__activada = ( $refe, $adre ) =>
!! $__dada( 'activacio_' || $refe || '_' || $adre ) ?
true :
bounce( 'Adreça no activada per a ' || $refe );
// Comprova si qt proporcionada cobreix import especificat
$__qtSuficient = $refe, $q => {
$import_requerit = $__definidor( $refe );
$import_requerit > $q ?
bounce( "L'" || $refe || " és de " || $import_requerit )
: true
};
// Comprova si adreça consta com a subscrita
$__subscrita = $adr =>
!! $__dada( 'subscripcio_' || $geto || '_' || $adr ) ?
true :
bounce( "Adreça no subscrita per a " || $geto );
// Cicle actual
$cicle_actual =
1 + floor( ( timestamp - $__dada( 'Origen' ) ) / $__dada( 'Interval' ));
$dades.cicle_actual = $cicle_actual;
// Escala actual
$nombre_digits = length( $__dada( 'volum_ASRAC' ) otherwise 1 );
$escala_actual = $__dada( 'escala_actual' );
$data_escala_actual = $__dada( 'data_escala_actual' );
if ( $nombre_digits > $escala_actual ) {
$nova_escala = $nombre_digits;
$data_nova_escala = timestamp;
$interval_escala = 1000;
} else $interval_escala = timestamp - $data_escala_actual + 1000;
if ( !! $nova_escala ) {
$dades.escala_actual = $nova_escala;
$dades.data_escala_actual = $data_nova_escala;
$dades[ 'data_escala_' || $nova_escala ] = $data_nova_escala;
}
$dades.interval_escala = $interval_escala;
// Actuant activada?
if ( $ACC == 'Activacio') {
if ( $geto != 'Estels' )
$activa_x_estels = $__activada( 'Estels', $adr__ );
} else {
$activa_x_estels = $__activada( 'Estels', $adr__ );
if ( $geto != 'Estels' )
$activa_x_geto = $__activada( $geto, $adr__ );
}
// Consulta si acció restringida
$__accRestringida = $ac => {
$geto == 'Estels' ?
false :
$__dada( $geto || '_' || $ac || 'ns_restringides' )
};
// Si acció restringida per al getó especificat, comprova si adreça capacitada
$__capacitada = ( $ac, $ad ) => {
$capacitacio = $__dada( $geto || '_' || $ac || '_' || $ad ) otherwise '';
$__accRestringida( $ac ) AND $capacitacio != 'capacitada' ?
bounce( 'Acció restringida i adreça no capacitada' ) :
true
};
$adr__capacitada = $__capacitada( $ACC, $adr__ );
// Nou total
$__nou_total = ( $ref_tot, $increment ) => {
$nou_total = $__dada( 'total_' || $ref_tot ) otherwise 0;
$dades[ 'total_' || $ref_tot ] = $nou_total + $increment;
};
// Totals i ASRAC
$total_activacions = $__dada( 'total_activacions_Estels' ) otherwise 0;
$total_subscripcions = $__dada( 'total_subscripcions_Estels' ) otherwise 0;
$total_renovacions = $__dada( 'total_renovacions_Estels' ) otherwise 0;
$total_aportacions = $__dada( 'total_aportacions_Estels' ) otherwise 0;
$total_contribucions = $__dada( 'total_contribucions_Estels' ) otherwise 0;
$dades[ 'volum_ASRAC' ] =
$total_activacions + $total_subscripcions +
$total_renovacions + $total_aportacions + $total_contribucions;
$increment_FOP_compensable =
$ACC == 'Activacio' OR $ACC == 'Subscripcio'
OR $ACC == 'Renovacio' OR $ACC == 'Contribucio' ?
$qt : 0;
if ( $increment_FOP_compensable > 0 ) {
$estat_interficie =
$__dada( 'interficie_' || $args.interficie || '_estat' ) otherwise '-';
$interficie = $estat_interficie == 'operatiu' ? $args.interficie : 'basica';
$__nou_total( 'FOP_' || $geto || '_via_' || $interficie, $increment_FOP_compensable );
$estat_promotora =
$__dada( 'promotora_' || $args.promotora || '_estat' ) otherwise '-';
$promotora = $estat_promotora == 'operatiu' ? $args.promotora : 'basica';
$__nou_total( 'FOP_' || $geto || '_per_' || $promotora, $increment_FOP_compensable );
}
// Ordinal acció
$ordinal_accio = $__dada( 'ordinal_' || $ACC || '_' || $geto ) + 1;
$dades[ 'ordinal_' || $ACC || '_' || $geto ] = $ordinal_accio;
// FOP i id Estels
$_FOP = $__dada( '_FOP' );
$id_estels = $__dada( 'Estels' );
$_FOP_receptor = $geto == 'Estels' ? $_FOP : $__dada( $geto || '__FOP' );
// ...
$registre = {};
$registre.dades = $dades;
}",
"messages": {
"cases": [
{
"if": "{ $ACC == 'Activacio' }",
"init": "{
$ord_activacio = 'activacio_' || $ordinal_accio;
$ref_activacio = 'activacio_' || $geto || '_' || $adr__;
if ( !! $__dada( $ref_activacio ) )
bounce( 'Adreça ja activada' );
$condicions = $__qtSuficient( 'Import_Activacio', $qt );
$dades[ $ref_activacio ] = $ord_activacio;
$dades[ $ord_activacio || '_data' ] = timestamp;
$dades[ $ord_activacio || '_nom' ] = $__arg( 'nom' );
$dades[ $ord_activacio || '_qt' ] = $qt;
$dades[ $ord_activacio || '_cicle' ] = $cicle_actual;
if ( $geto == 'Estels' )
$dades[ $ord_activacio || '_escala' ] = $escala_actual;
$dades[ $ord_activacio || '_interval' ] = $interval_escala;
$__nou_total( 'activacions_' || $geto, $qt );
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP_receptor }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Nom' ] = $args.nom;
response[ 'Adreça' ] = $adr__;
response[ 'Getó' ] = $geto;
}"
}
]
},
{
"if": "{ $ACC == 'Subscripcio' }",
"init": "{
$ord_subscripcio = 'subscripcio_' || $ordinal_accio;
$ref_subscripcio = 'subscripcio_' || $geto || '_' || $adr__;
$nou_ordinal_renovacio = $__dada( 'ordinal_renovacio' ) + 1;
$ord_renovacio = 'renovacio_' || $nou_ordinal_renovacio;
$ref_renovacio = 'renovacio_' || $geto || '_' || $adr__;
if ( !! $__dada( $ref_subscripcio ) )
bounce( 'Adreça ja subscrita' );
$condicions =
$__qtSuficient( 'Import_Subscripcio', $qt )
AND $__arg( 'nom' )
AND $__arg( 'aportacio' );
$dades[ $ref_subscripcio ] = $ord_subscripcio;
$dades[ $ord_subscripcio || '_data' ] = timestamp;
$dades[ $ord_subscripcio || '_nom' ] = $args.nom;
$dades[ $ord_subscripcio || '_aportacio' ] = $args.aportacio;
$dades[ $ord_subscripcio || '_cicle' ] = $cicle_actual;
$dades[ $ref_renovacio ] = $ord_renovacio;
$dades[ $ord_renovacio || '_data' ] = timestamp;
$dades[ $ord_renovacio || '_cicle' ] = $cicle_actual;
$dades[ 'ordinal_renovacio' ] = $nou_ordinal_renovacio;
$__nou_total( 'subscripcions_' || $geto, $qt );
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP_receptor }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Nom subscriptora' ] = $args.nom;
response[ 'Adreça subscriptora' ] = $adr__;
response[ 'Cicle subscripció' ] = $cicle_actual;
response[ 'Getó' ] = $geto;
}"
}
]
},
{
"if": "{ $ACC == 'Renovacio' }",
"init": "{
$ord_renovacio = 'renovacio_' || $ordinal_accio;
$ref_renovacio = 'renovacio_' || $geto || '_' || $adr__;
$cicle_renovat = $__dada( $ord_renovacio || '_cicle' ) otherwise 1;
if ( $cicle_actual == $cicle_renovat )
bounce( 'Cicle actual ( ' || $cicle_actual || ' ) ja renovat' );
$condicions =
$__subscrita( $adr__ )
AND $__qtSuficient( 'Import_Renovacio', $qt );
$dades[ $ref_renovacio ] = $ord_renovacio;
$dades[ $ord_renovacio || '_data' ] = timestamp;
$dades[ $ord_renovacio || '_cicle' ] = $cicle_actual;
$__nou_total( 'renovacions_' || $geto, $qt );
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP_receptor }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Cicle renovat' ] = $cicle_actual;
response[ 'Subscriptora' ] = $adr__;
response[ 'Getó' ] = $geto;
}"
}
]
},
{
"if": "{ $ACC == 'Diposit' }",
"init": "{
$ord_diposit = 'diposit_' || $geto || '_' || $ordinal_accio;
$ref_diposit = 'diposit_' || $geto || '_' || $adr__;
$condicions = $__subscrita( $adr__ );
if ( $qt < $__definidor( 'Diposit_Minim' ) )
bounce( 'El dipòsit mínim és de ' || $__definidor( 'Diposit_Minim' ) );
$ord_renovacio = $__dada( 'renovacio_' || $geto || '_' || $adr__ );
$cicle_renovat = $__dada( $ord_renovacio || '_cicle' );
if ( $cicle_renovat < $cicle_actual )
bounce( 'Subscripció no renovada. Darrer cicle renovat: ' ||
$cicle_renovat || ' Cicle actual: ' || $cicle_actual );
$taxa_conversio = $__definidor( 'Taxa_Conversio' );
$cicles_diposit = $__definidor( 'Cicles_Diposit' );
$factor_conversio = $__definidor( 'factor_conversio' ) otherwise 1;
$cicle_conversio = $cicle_actual + $cicles_diposit;
$taxa = round( $qt * $factor_conversio * $taxa_conversio / 100, 0 );
$qt_conversio = $qt - $taxa;
$dades[ $ref_diposit ] = $ord_diposit;
$dades[ $ord_diposit || '_qt' ] = $qt;
$dades[ $ord_diposit || '_dipositant' ] = $adr__;
$dades[ $ord_diposit || '_cicle' ] = $cicle_actual;
$dades[ $ord_diposit || '_geto_diposit' ] = $geto;
$dades[ $ord_diposit || '_data' ] = timestamp;
$dades[ $ord_diposit || '_taxa' ] = $taxa_conversio;
$dades[ $ord_diposit || '_qt_conversio' ] = $qt_conversio;
$dades[ $ord_diposit || '_cicle_conversio' ] = $cicle_conversio;
$__nou_total( 'diposits_' || $geto, $qt );
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Ref' ] = $ref_diposit;
response[ 'Qt dipòsit' ] = $qt;
response[ 'Qt conversió' ] = $qt_conversio;
response[ 'Taxa' ] = $taxa_conversio;
response[ 'Cicle dipòsit' ] = $cicle_actual;
response[ 'Cicle conversió' ] = $cicle_conversio;
}"
}
]
},
{
"if": "{ $ACC == 'Contribucio' }",
"init": "{
// Les contribucions només es poden fer en Estels
if ( $geto != 'Estels' )
bounce( 'Les contribucions només es poden fer en Estels' );
$ord_contribucio = 'contribucio_' || $ordinal_accio;
$ref_contribucio = 'contribucio_' || $adr__;
$dades[ $ref_contribucio ] = $ord_contribucio;
$dades[ $ord_contribucio || '_qt' ] = $qt;
$dades[ $ord_contribucio || '_contribuidora' ] = $adr__;
$dades[ $ord_contribucio || '_cicle' ] = $cicle_actual;
$dades[ $ord_contribucio || '_escala' ] = $escala_actual;
$dades[ $ord_contribucio || '_interval' ] = $interval_escala;
$dades[ $ord_contribucio || '_data' ] = timestamp;
$__nou_total( 'contribucions_Estels', $qt );
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Ref' ] = $ref_contribucio;
response[ 'Contribuïdora' ] = $adr__;
response[ 'Quantitat' ] = $qt;
}"
}
]
},
{
"if": "{ $ACC == 'Transfer' }",
"init": "{
$receptora = $__arg( 'receptora' );
$receptora_activada =
$__activada( 'Estels', $receptora )
AND $__activada( $geto, $receptora );
$receptora_capacitada = $__capacitada( 'recepcio', $receptora );
$ref_subscripcio = 'subscripcio_' || $geto || '_' || $receptora;
$ord_subscripcio = $__dada( $ref_subscripcio );
$ref_renovacio = 'renovacio_' || $geto || '_' || $receptora;
$ord_renovacio = $__dada( $ref_renovacio );
$cicle_renovacio = $__dada( $ord_renovacio || '_cicle' );
$receptora_renovada =
!! $cicle_renovacio
AND $cicle_renovacio == $cicle_actual;
$__nou_total( 'transfers_' || $geto, $qt );
$args.qt_transfer = $qt;
if ( $ord_subscripcio AND $receptora_renovada ) {
$percent_aportacio = $__dada( $ord_subscripcio || '_aportacio' );
$qt_aportacio = floor( $qt * $percent_aportacio / 100 );
$args.qt_transfer = $qt - $qt_aportacio;
$__nou_total( 'aportacions_' || $geto, $qt_aportacio );
$__nou_total( 'aportacions_' || $geto || '_' || $args.receptora, $qt_aportacio );
}
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"if": "{ !! $qt_aportacio }",
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP_receptor }",
"amount": "{ $qt_aportacio }"
},
{
"address": "{ $receptora }",
"amount": "{ $args.qt_transfer }"
}
]
}
},
{
"if": "{ ! $qt_aportacio }",
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $receptora }",
"amount": "{ $args.qt_transfer }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Receptora' ] = $receptora;
response[ 'Quantitat' ] = $args.qt;
response[ 'Getó' ] = $geto;
if ( !! $qt_aportacio )
response[ 'Receptora aporta a FOP'] =
$qt_aportacio || ' ' || $geto;
}"
}
]
},
{
"if": "{ $ACC == 'Conversio' }",
"init": "{
$qt_dipositada = $__dada( $ref || '_qt' );
if ( ! $qt_dipositada )
bounce( 'Dipòsit desconegut' );
$qt_conversio = $__dada( $ref || '_qt_conversio' );
$geto_diposit = $__dada( $ref || '_geto_diposit' );
$cicle_conversio = $__dada( $ref || '_cicle_conversio' );
$ord_renovacio = $__dada( 'renovacio_' || $geto_diposit || '_' || $adr__ );
$cicle_renovat = $__dada( $ord_renovacio || '_cicle' );
$id_unitat_conversio = $geto_diposit == 'Estels' ? 'base' : $id_estels;
$unitat_conversio = $geto_diposit == 'Estels' ? 'Bytes' : 'Estels';
$ref_conversio = 'conversio_' || $ref;
$ord_conversio = 'conversio_' || $ordinal_accio;
if ( $adr__ != $__dada( $ref || '_dipositant' ))
bounce( "L'adreça receptora ha de ser la dipositant" );
if ( !! $__dada( $ref_conversio ))
bounce( 'Aquest dipòsit ja ha estat convertit' );
if ( $cicle_conversio > $cicle_actual )
bounce( "Encara no és l'hora" );
if ( $cicle_renovat < $cicle_actual )
bounce( "No renovada en " || $geto_diposit ||
" per al cicle actual: " || $cicle_actual );
$dades[ $ref_conversio ] = $ord_conversio;
$dades[ $ord_conversio || '_data' ] = timestamp;
$dades[ $ord_conversio || '_qt' ] = $qt_conversio;
$dades[ $ord_conversio || '_unitat' ] = $unitat_conversio;
$dades[ $ord_conversio || '_rebedora' ] = $adr__;
$__nou_total( 'conversions_' || $geto_diposit, $qt_dipositada );
$__nou_total( 'taxes_' || $geto_diposit, ( $qt_dipositada - $qt_conversio ));
$args.qt = $qt_conversio;
$args.rebedora = $adr__;
$args.sentit = 'sortida';
$args.id_unitat_sortida = $id_unitat_conversio;
$args.unitat_sortida = $unitat_conversio;
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Rebedora' ] = $args.rebedora;
response[ 'Quantitat' ] = $args.qt;
response[ 'Unitat' ] = $args.unitat_sortida;
}"
}
]
},
{
"if": "{ $ACC == 'Retribucio' }",
"init": "{
$ord_retribucio = 'retribucio_' || $ordinal_accio;
if ( $ref == 'aportacio_activacio' ) {
$ord_activac = $__dada( 'activacio_Estels_' || $adr__ )
otherwise bounce( 'Activació inexistent' );
$import = $__dada( $ord_activac || '_qt' );
$escala = $__dada( $ord_activac || '_escala' );
$interval = $__dada( $ord_activac || '_interval' );
$ref_retribucio = 'retribucio_' || $adr__ || '_escala_' || $escala_actual;
} else {
$import = $__dada( $ref || '_qt' )
otherwise bounce( 'Contribució desconeguda' );
$escala = $__dada( $ref || '_escala' );
$interval = $__dada( $ref || '_interval' );
if ( $adr__ != $__dada( $ref || '_contribuidora' ))
bounce( "Només l'adreça contribuïdora pot rebre la retribució" );
$ref_retribucio = 'retribucio_' || $ref || '_escala_' || $escala_actual;
$dades[ $ord_retribucio || '_rebedora' ] = $adr__;
}
// La retribució hi és pendent
if ( !! $__dada( $ref_retribucio ))
bounce( "Ja ha estat retribuïda per a l'escala actual" );
// Cal que s'hagi produït un salt d'escala
if ( $escala_actual == $escala )
bounce( "Cal que es produeixi un salt d'escala" );
/* Comentat temporalment per a facilitar els tests !!
// Cal que hagi passat igual o més temps entre la data del salt d'escala i la de la
//retribució que entre la data del salt d'escala de la contribucio i la data d'aquesta
$diferencia_intervals = $__dada( 'interval_escala' ) - $interval;
if ( $diferencia_intervals < 0 )
bounce( "Encara no és l'hora. Falten: " || $diferencia_intervals || ' segons' );
*/
// Determina la qt de la retribució
$qt_retribucio = $import * ( $escala_actual - $escala );
//...
$dades[ $ref_retribucio ] = $ord_retribucio;
$dades[ $ord_retribucio || '_data' ] = timestamp;
$dades[ $ord_retribucio || '_qt' ] = $qt_retribucio;
$__nou_total( 'retribucions_Estels', $qt_retribucio );
$args.qt = $qt_retribucio;
$args.rebedora = $adr__;
$args.sentit = 'sortida';
$args.id_unitat_sortida = $id_estels;
$args.unitat_sortida = 'Estels';
}",
"messages": [
{
"app": "data",
"payload": "{ $registre || $args }"
},
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $_Registre }",
"amount": "{ $__dada( 'Provisio' ) }"
}
]
}
},
{
"app": "payment",
"payload": {
"asset": "{ $id_unitat }",
"outputs": [
{
"address": "{ $_FOP }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
response[ 'Acció' ] = $ACC;
response[ 'Rebedora' ] = $args.rebedora;
response[ 'Quantitat' ] = $args.qt;
response[ 'Unitat' ] = 'Estels';
}"
}
]
}
]
}
}
]