Definition: [
    "autonomous agent",
    {
        "init": "{\r
        $nom_AA = 'Accions';\r
        $darrera_versio = '0000000000';\r
        //$_Portal_original = '0000000000';\r
        $_Portal_original = trigger.address; //Hauria de ser fix amb adr darrer Portal \r
\r
        $_Portal_actual = var[ 'nou_portal' ] otherwise $_Portal_original;\r
\r
        if ( $_Portal_actual != trigger.address )\r
        {\r
            $_Portal = substring( var[ $_Portal_actual ][ 'versions' ], 0, 32 );\r
            if ( $_Portal != trigger.address )\r
            { bounce ( 'Portal no reconegut' ); }\r
        } else {\r
            $_Portal = $_Portal_actual;\r
        }\r
\r
\r
      // Principals\r
        $args = trigger.data;\r
        $adr__ = trigger.initial_address;\r
        $idgeto = trigger.output[[ asset != base ]].asset;\r
\r
        $generics = var[ $_Portal ][ 'generics' ];\r
\r
        $versions_portal = var[ $_Portal ][ 'versions' ];\r
        $versions = var[ $_Portal ][ 'versions_accions' ] otherwise this_address;\r
        $versions_getons =\r
            var[ $_Portal ][ 'versions_getons' ] otherwise $generics._Getons;\r
\r
        $refs_getons = var[ $_Portal ][ 'refs_getons' ];\r
        $refgeto = $args.refgeto otherwise \r
        bounce( 'refgeto? ' || $args.refgeto || ' qt_accio ' || $args.qt_accio );\r
\r
        $dades = var[ 'dades' ] otherwise {};\r
        $ordinals = $dades.ordinals otherwise {};\r
        $cicle_actual = $dades.cicle_actual;\r
\r
\r
      // Funcions\r
        $__ordinal = $rf => $ordinals[ $rf ] ? $ordinals[ $rf ] + 1 : 1;\r
\r
        // Si no s'ha lliurat l'argument especificat bota l'accés\r
        $__arg = $arg =>\r
            $args[ $arg ] otherwise \r
            bounce( "Cal proporcionar el valor de: " || $arg );\r
\r
        $__dada = $refval => {\r
            data_feed[[ oracles = $versions, feed_name = $refval, ifnone = false ]]\r
        };\r
\r
        $__dada_geto = $refval => {\r
            data_feed[[ oracles = $versions_getons, feed_name = $refval, ifnone = false ]]\r
        };\r
\r
        $__dada_portal = $refval => {\r
            data_feed[[ oracles = $versions_portal, feed_name = $refval, ifnone = false ]]\r
        };\r
\r
        $__param = $refparam => {\r
            $refgeto == 'estels'?\r
            $generics[ $refparam ] :\r
            $__dada_geto( $refgeto || '_' || $refparam )\r
        };\r
\r
        // Consulta si acció restringida\r
        $__accRestringida = $acc => {\r
            $refgeto == 'estels' ?\r
            false :\r
            $__dada_geto( $refgeto || '_' || $acc || 'ns_restringides' )\r
        };\r
\r
        // Si acció restringida per al getó especificat, comprova si adreça capacitada\r
        $__capacitada = ( $acc, $adr ) => true;                   // Pendent revisió\r
\r
        /*\r
        $__capacitada = ( $acc, $adr ) => {\r
            $capacitacio = $__dada_geto( 'capacitacio_' || $refgeto || '_' || $acc || '_' || $adr );\r
            $__accRestringida( $acc ) AND ! $capacitacio OR $capacitacio != 'capacitada' ?\r
            bounce( 'Adreça no capacitada per a aquesta acció' ) :\r
            true\r
        };\r
        */\r
\r
        \r
        // Comprova si adreça activada per operar amb getó especificat\r
        $__activada = ( $adr, $ref ) => {\r
            data_feed[[ oracles = $versions, feed_name = 'activacio_' || $adr__ || '_en_' || $ref, ifnone = false ]] ?\r
            //$__dada( 'activacio_' || $adr__ || '_en_' || $ref ) ?\r
            true :\r
            bounce( 'Adreça no activada per a ' || $ref )\r
        };\r
\r
        // Comprova si qt proporcionada cobreix import especificat\r
        $__qtSuficient = $ref, $q =>\r
            $__param( $ref ) > $q ?\r
            bounce( "L'" || $ref || " és de " || $__param( $ref ) ) :\r
            true;\r
\r
        // Comprova si adreça consta com a subscrita\r
        $__subscrita = $adr => {\r
            $__dada( 'subscripcio_' || $adr__ || '_en_' || $refgeto ) ?\r
            true :\r
            bounce( "Adreça no subscrita per a " || $refgeto ) };\r
\r
        // Comprova si la subscripció ha estat renovada per al cicle actual\r
        $__renovada = $adr => {\r
            $cicle_renovat = $__dada( 'renovacio_' || $adr__ || '_en_' || $refgeto || '_cicle' );\r
            ! $cicle_renovat OR $cicle_actual > $cicle_renovat ?\r
            bounce( "Subscripció de l'adreça no renovada per a " || $refgeto )\r
            : $__subscrita( $adr ) };\r
\r
\r
      // Principals\r
        $ACC = $__arg( 'accio' );\r
        $qt = $__arg( 'qt_accio' );\r
\r
      // Avisos\r
       // Consulta si hi ha cap avís per a adr__\r
        $ref_avis = $refgeto || '_avis_' || $adr__;\r
        $rebot = $__dada_geto( $ref_avis || '_rebot' );\r
        $temps_avis = $__dada_geto( $ref_avis );\r
        $avis_es_actual =\r
            $temps_avis AND\r
            $temps_avis + ( $generics.Lapse * 2 ) < timestamp;\r
        if ( $avis_es_actual AND $rebot )\r
        { bounce ( $__dada_geto( $ref_avis ) ); }\r
\r
\r
      // Accions\r
       // Control adr__ activa\r
        // Tret de l'activació per a Estels, per a la resta d'accions cal\r
        // que l'adr__ actuant consti com a activada per operar amb Estels \r
        if ( $refgeto != 'estels' ) {\r
            $__activada( $adr__, 'estels' );\r
            if ( $ACC != 'Activacio' )\r
            { $__activada( $adr__, $refgeto ); }\r
        }\r
        else if ( $ACC != 'Activacio' )\r
        { $__activada( $adr__, 'estels' ); }\r
\r
\r
       // Transfer\r
        if ( $ACC == 'Transfer' ) {\r
            $receptora = $__arg( 'receptora' );\r
            $condicions =\r
                $__activada( $receptora, 'estels' )\r
                AND $__activada( $receptora, $refgeto )\r
                AND $refgeto == 'estels' ? true : $__capacitada( 'recepcio', $receptora )\r
                AND $__subscrita( $adr__ ) ? $__renovada( $receptora ) : true;\r
        }\r
\r
\r
        // Gestió Cicles\r
            if ( ! $cicle_actual ) {\r
                $nou_cicle = 1;\r
                $nova_data = timestamp;\r
                $nova_data_cicle_anterior = 0;\r
                $interval = 0;\r
                $nova_escala = 1;\r
            } else {\r
                $data_cicle_actual = $dades.data_cicle_actual;\r
                $data_cicle_anterior = $dades.data_cicle_anterior;\r
                $interval = timestamp - $data_cicle_actual;\r
                if ( $generics.Interval < $interval ) {\r
                    $nou_cicle = $cicle_actual + 1;\r
                    $nova_data = timestamp;\r
                    $nova_data_cicle_anterior = $data_cicle_actual;\r
                    $total_FOP = $__dada_portal( 'total_FOP_en_estels' );\r
                    $nova_escala = $total_FOP ? length( $total_FOP ) : 1;\r
                } else {\r
                    $nou_cicle = $cicle_actual;\r
                    $nova_data = $data_cicle_actual;\r
                    $nova_data_cicle_anterior = $data_cicle_anterior;\r
                    $nova_escala = $dades.escala_actual;\r
                }\r
            }\r
\r
            $dades.cicle_actual = $nou_cicle;\r
            $dades.data_cicle_actual = $nova_data;\r
            $dades.data_cicle_anterior = $nova_data_cicle_anterior;\r
            $dades.escala_actual = $nova_escala;\r
\r
\r
       // Activacio\r
        if ( $ACC == 'Activacio' ) {\r
\r
            if ( $__dada( 'activacio_' || $adr__ || '_en_' || $refgeto ) )\r
            { bounce( 'Adreça ja activada' ); }\r
\r
            $condicions =\r
                $__capacitada( 'activacio', $adr__ )\r
                AND $__qtSuficient( 'Import_Activacio', $qt )\r
                AND $__arg( 'nom' );\r
        }\r
\r
\r
       // Subscripcio\r
        if ( $ACC == 'Subscripcio' ) {\r
            \r
            if ( $__dada( 'subscripcio_' || $adr__ || '_en_' || $refgeto ) )\r
            { bounce( 'Adreça ja subscrita' ); }\r
\r
            $condicions =\r
                $__capacitada( 'subscripcio', $adr__ )\r
                AND $__qtSuficient( 'Import_Subscripcio', $qt )\r
                AND $__arg( 'nom' )\r
                AND $__arg( 'derivacio' );\r
        }\r
\r
\r
       // Renovacio\r
        if ( $ACC == 'Renovacio' ) {\r
            $condicions =\r
                $__subscrita( $adr__ )\r
                AND $__qtSuficient( 'Import_Renovacio', $qt );\r
\r
            $cicle_renovat = $__dada( 'renovacio_' || $adr__ || '_en_' || $refgeto || '_cicle' );\r
            if ( $nou_cicle > 1\r
                AND $cicle_renovat\r
                AND $nou_cicle == $cicle_renovat )\r
            { bounce( 'Cicle ja renovat' ); }\r
        }\r
\r
\r
       // Diposit\r
        if ( $ACC == 'Diposit' ) {\r
            $condicions =\r
                $__capacitada( 'conversio', $adr__ )\r
                AND $__renovada( $adr__ );\r
\r
            $taxa_conversio = $__param( 'Taxa_Conversio' );\r
            $cicles_diposit = $__param( 'Cicles_Diposit' );\r
            $cicle_conversio = $nou_cicle + $cicles_diposit;\r
            $taxa = round( $qt * $taxa_conversio / 100, 0 );\r
            $qt_conversio = $qt - $taxa;\r
        }\r
\r
\r
       // Contribucio\r
        if ( $ACC == 'Contribucio' )\r
        {\r
            // Ha de ser exclusivament en Estels\r
            $__arg( 'ref' ); \r
        }\r
\r
\r
       // Ordinal\r
        $ordinal = $__ordinal( $ACC );\r
\r
\r
       // Total acumulat\r
        $ref_total = $ACC == 'Diposit' ? 'diposits' : to_lower( $ACC ) || 'ns';\r
        $total_acc = $__dada( 'total_' || $ref_total || '_en_' || $refgeto ) otherwise 0;\r
\r
    }",
        "messages": [
            {
                "if": "{ $ACC == 'Activacio' }",
                "app": "data_feed",
                "payload": {
                    "{ $ref_total }": "{ $total_acc + $qt }",
                    "{ 'activacio_' || $adr__ || '_en_' || $refgeto }": "{ timestamp }",
                    "{ 'activacio_' || $adr__ || '_en_' || $refgeto || '_nom' }": "{ $args.nom }",
                    "{ 'activacio_' || $adr__ || '_en_' || $refgeto || '_qt' }": "{ $qt }",
                    "{ 'activacio_' || $adr__ || '_en_' || $refgeto || '_cicle' }": "{ $nou_cicle }",
                    "{ 'activacio_' || $adr__ || '_en_' || $refgeto || '_ordinal' }": "{ $ordinal }",
                    "{ 'activacio_' || $adr__ || '_en_' || $refgeto || '_escala' }": "{ $refgeto == 'estels' ? $nova_escala : 100 }"
                }
            },
            {
                "if": "{ $ACC == 'Subscripcio' }",
                "app": "data_feed",
                "payload": {
                    "{ $ref_total }": "{ $total_acc + $qt }",
                    "{ 'subscripcio_' || $adr__ || '_en_' || $refgeto }": "{ timestamp }",
                    "{ 'subscripcio_' || $adr__ || '_en_' || $refgeto || '_nom' }": "{ $args.nom }",
                    "{ 'subscripcio_' || $adr__ || '_en_' || $refgeto || '_cicle' }": "{ $nou_cicle }",
                    "{ 'subscripcio_' || $adr__ || '_en_' || $refgeto || '_ordinal' }": "{ $ordinal }",
                    "{ 'subscripcio_' || $adr__ || '_en_' || $refgeto || '_derivacio' }": "{ $args.derivacio }"
                }
            },
            {
                "if": "{ $ACC == 'Renovacio' }",
                "app": "data_feed",
                "payload": {
                    "{ $ref_total }": "{ $total_acc + $qt }",
                    "{ 'renovacio_' || $adr__ || '_en_' || $refgeto }": "{ timestamp }",
                    "{ 'renovacio_' || $adr__ || '_en_' || $refgeto || '_cicle' }": "{ $nou_cicle }"
                }
            },
            {
                "if": "{ $ACC == 'Diposit' }",
                "app": "data_feed",
                "payload": {
                    "{ $ref_total }": "{ $total_acc + $qt }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto }": "{ timestamp }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_dipositant' }": "{ $adr__ }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_qt_diposit' }": "{ $qt }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_qt_conversio' }": "{ $qt_conversio }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_cicle_conversio' }": "{ $taxa_conversio }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_taxa' }": "{ $taxa_conversio }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_cicle' }": "{ $nou_cicle }",
                    "{ 'diposit_' || $ordinal || '_en_' || $refgeto || '_geto_diposit' }": "{ $refgeto }"
                }
            },
            {
                "if": "{ $ACC == 'Contribucio' }",
                "app": "data_feed",
                "payload": {
                    "{ $ref_total }": "{ $total_acc + $qt }",
                    "{ 'contribucio_' || $ordinal }": "{ timestamp }",
                    "{ 'contribucio_' || $ordinal || '_contribuidora' }": "{ $adr__ }",
                    "{ 'contribucio_' || $ordinal || '_qt' }": "{ $qt }",
                    "{ 'contribucio_' || $ordinal || '_cicle' }": "{ $nou_cicle }",
                    "{ 'contribucio_' || $ordinal || '_escala' }": "{ $nova_escala }"
                }
            },
            {
                "app": "state",
                "state": "{\r
\r
                if ( $ref_avis AND $avis_es_actual )\r
                { response[ 'AVÍS: ' ] = $__dada_geto( $ref_avis || '_text' ); }\r
\r
                response[ 'cicle actual' ] = $nou_cicle;\r
                response[ 'data cicle actual' ] = timestamp_to_string( $nova_data );\r
                response[ 'data cicle anterior' ] = timestamp_to_string( $nova_data_cicle_anterior );\r
                response[ 'escala actual' ] = $nova_escala;\r
                response[ 'interval' ] = $interval;\r
\r
               // Activacions\r
                if ( $ACC == 'Activacio' ) {\r
                    response[ 'Resultat: ' ] =\r
                    "Activació #" || $ordinal || " amb nom: " || $args.nom\r
                    || " de l'adr " || $adr__ || " per operar amb " || $refgeto;\r
                }\r
\r
               // Subscripcions\r
                if ( $ACC == 'Subscripcio' ) {\r
                    response[ 'Resultat: ' ] =\r
                    "Subscripció #" || $ordinal || " amb nom: " \r
                    || $args.nom || " de l'adr " || $adr__ || " per al cicle "\r
                    || $nou_cicle || 'per operar amb ' || $refgeto;\r
                }\r
\r
               // Renovacions\r
                if ( $ACC == 'Renovacio' ) {\r
                    response[ 'Resultat: ' ] =\r
                    "Renovació de la subscripció per al cicle " || $nou_cicle\r
                    || " de l'adr " || $adr__ || ' en ' || $refgeto;\r
                }\r
\r
               // Dipòsits\r
                if ( $ACC == 'Diposit' ) {\r
                    response[ 'Ref dipòsit' ] = 'diposit_' || $ordinal || '_en_' || $refgeto;\r
                    response[ 'Dipositant' ] = $adr__;\r
                    response[ 'Qt dipòsit' ] = $qt;\r
                    response[ 'Qt conversió' ] = $qt_conversio;\r
                    response[ 'Taxa' ] = $taxa_conversio;\r
                    response[ 'Data dipòsit' ] = timestamp_to_string( timestamp );\r
                    response[ 'Cicle dipòsit' ] = $nou_cicle;\r
                    response[ 'Cicle conversió' ] = $nou_cicle + $cicle_conversio;\r
                }\r
\r
               // Contribucions\r
                if ( $ACC == 'Contribucio' ) {\r
                    response[ 'Ref contribucio' ] = 'contribucio_' || $ordinal;\r
                    response[ 'Contribuidora' ] = $adr__;\r
                    response[ 'Qt' ] = $qt;\r
                    response[ 'Escala actual' ] = $nova_escala;\r
                }\r
\r
               // -- Nou Portal\r
                if ( $_Portal != $_Portal_actual ) {\r
                    var[ 'anterior_portal' ] = var[ 'nou_portal' ];\r
                    var[ 'nou_portal' ] = $_Portal;\r
                    response[ 'Nou portal'] = $_Portal;\r
                }\r
\r
               // -- Actualització dades\r
                if ( $args.copia_dades ) {\r
                    var[ 'dades' ] = var[ $darrera_versio ][ 'dades' ];\r
                } else {\r
                    var[ 'dades' ] = $dades;\r
                }\r
\r
                response[ 'acció realitzada' ] = $ACC;\r
                response[ 'cicle actual' ] = $nou_cicle;\r
            }"
            }
        ]
    }
]