[
    "autonomous agent",
    {
        "init": "{
        $nom_AA = 'Implicacions';
        // Portal
        //$_Portal = '5WVBJQHTEP54AEYUJGTQKWTXTXZSJQWA';
        $_Portal = trigger.address; //Hauria de ser fix amb adr Portal original
        if ( $_Portal != trigger.address ) bounce( 'Portal no reconegut' );
       // Principals
        $args = trigger.data;
        $adr__ = trigger.initial_address;
        $idgeto = trigger.output[[ asset != base ]].asset;
        $dades = $args.dades otherwise {};
        $__dada = $refval => {
            data_feed[[ oracles = $args._Registre, feed_name = $refval, ifnone = false ]]
        };
        // Abreviacions
        $proces = $args.proces;
        $operacio = $args.operacio;
        $idprop = $args.idprop;
        $nova_idprop = $args.nova_idprop;
        $ref = $args.ref;
        $val = $args.val;
        // Si no s'ha lliurat l'argument especificat bota l'accés
        $__arg = $arg =>
            $args[ $arg ] otherwise
            bounce( "Cal proporcionar el valor de: " || $arg );
       // Admin isox
        if ( $proces == 'nova_isox' OR $proces == 'nou_estat_isox' ) {
            $ord_isox = $__dada( 'ordinal_isox' ) + 1;
            $_actuant_es_isox_000 = $__dada( 'isox_000' ) == $adr__ ;
            $_estat_isox_actuant = $__dada( 'isox_' || $adr__ || '_estat' ) otherwise '';
            $autoritzacio = $_actuant_es_isox_000 OR $_estat_isox_actuant == 'habilitat';
            if ( ! $autoritzacio ) bounce( 'No autoritzada per a no isox' );
            $index_baules_isox = $__dada( 'isox_' || $adr__ || '_index_baules' ) otherwise 1;
            $mitjana_index_baules = $__dada( 'mitjana_index_baules' ) otherwise 1;
            $factor_topall_index_baules = $__dada( 'Factor_Topall_Index_Baules' ) otherwise 1.5;
            if ( $index_baules_isox > $mitjana_index_baules * $factor_topall_index_baules )
                bounce( 'No autoritzada per massa baules' );
        }
        if ( $proces == 'nova_isox' ) {
            $estat_isox = $__dada( 'isox_' || $args.adr || '_estat') otherwise '';
            if ( $estat_isox == 'habilitat' )
                bounce( 'Ja hi consta una isox habilitada amb aquesta adreça' );
            $_aspirant = $__dada( 'aspirant_' || $args.adr );
            if ( $_actuant_es_isox_000 ) {
                $index_baules_nou_isox = $args.index_baules otherwise $mitjana_index_baules;
                $dades_alta = [ 'isox_000', 'isox_000', 1, $index_baules_nou_isox ];
            } else {
                $nombre_avals =
                    $__dada( 'isox_' || $adr__ || '_aval_2' ) ? 2 :
                    $__dada( 'isox_' || $adr__ || '_aval_1' ) ? 1 :
                    0;
                if ( $nombre_avals == 2 ) bounce( "Ja n'has avalat 2" );
                if ( !! $_aspirant ) {
                    $_proposant = $__dada( 'aspirant_' || $args.adr || '_proposant' );
                    if ( $_proposant == $adr__ )
                        bounce( "Els dos avals han de provenir d'adreces diferents" );
                    $index_baules_proposant =
                        $__dada( 'isox_' || $_proposant || '_index_baules' ) otherwise 1;
                    $index_baules_nouisox = 1 + round( ( $index_baules_proposant + $index_baules_isox ) / 2 );
                    $index_absolut = $index_baules_nouisox + ( $mitjana_index_baules * ( $ord_isox - 1 ) );
                    $nova_mitjana_index_baules = round( $index_absolut / $ord_isox );
                    $dades[ 'isox_' || $adr__ || '_aval_' || ( $nombre_avals + 1 ) ] = $args.adr;
                    $dades_alta = [ $_proposant, $adr__, $index_baules_nouisox, $nova_mitjana_index_baules ];
                } else {
                    $dades[ 'aspirant_' || $args.adr ] = timestamp;
                    $dades[ 'aspirant_' || $args.adr || '_proposant' ] = $adr__;
                    $dades[ 'isox_' || $adr__ || '_aval_' || ( $nombre_avals + 1 ) ] = $args.adr;
                }
            }
            if ( !! $dades_alta[0] ) {
                $dades[ 'ordinal_isox' ] = $ord_isox;
                $dades[ 'isox_' || $ord_isox ] = $args.adr;
                $dades[ 'isox_' || $args.adr || '_ordinal' ] = 'isox_' || $ord_isox;
                $dades[ 'isox_' || $args.adr || '_proposant' ] = $dades_alta[0];
                $dades[ 'isox_' || $args.adr || '_confirmant' ] = $dades_alta[1];
                $dades[ 'isox_' || $args.adr || '_data' ] = timestamp;
                $dades[ 'isox_' || $args.adr || '_estat' ] = 'habilitat';
                $dades[ 'isox_' || $args.adr || '_index_baules' ] = $dades_alta[2];
                $dades[ 'mitjana_index_baules' ] = $dades_alta[3];
            }
        }
        if ( $proces == 'nou_estat_isox' ) {
            $estat_actual = $__dada( 'isox_' || $args.adr || '_estat' );
            if ( ! $estat_actual )
                bounce( 'No hi consta cap isox amb aquesta adreça' );
            if ( $estat_actual == $args.estat )
                bounce( "L'estat actual és el mateix que el proposat" );
            $index_baules = $__dada( 'isox_' || $args.adr || '_index_baules' );
            if ( $args.estat == 'habilitat' )
                $nova_mitjana_index_baules =
                    round( ( ( $mitjana_index_baules * ( $ord_isox - 1 ) ) + $index_baules ) / $ord_isox );
            else
                $nova_mitjana_index_baules =
                    round( ( ( $mitjana_index_baules * ( $ord_isox - 1 ) ) - $index_baules ) / $ord_isox );
            $dades[ 'isox_' || $args.adr || '_estat' ] = $args.estat;
            $dades[ 'mitjana_index_baules' ] = $nova_mitjana_index_baules;
        }
       // Admin delegacions
        if ( $proces == 'nova_delegacio' OR $proces == 'final_delegacio' ) {
            $ref_entitat = 'Entitat_' || $__arg( 'nom' );
            $estat_entitat = $__dada( $ref_entitat || '_estat' ) otherwise '';
            $adr_entitat = $__dada( $ref_entitat || '_adr' ) otherwise '';
            if ( $estat_entitat != 'operatiu' ) 
                bounce( 'Entitat inexistent o no operativa' );
            if ( $adr_entitat != $adr__ )
                bounce( 'Adreça equivocada' );
            // $ords = [ "1", "2", "3", "4", "5" ];
            $ords = [ "1", "2", "3" ];  // per als TESTS
            $ord_delegada_trobada = [];
            $semiref_delegada = $ref_entitat || '_delegada_';
            $__troba_delegada = $o => {
                $adr_delegada = $__dada( $semiref_delegada || $o ) otherwise '';
                if (
                    ! $ord_delegada_trobada[0]
                    AND $adr_delegada == $args.adr
                )
                $ord_delegada_trobada[0] = $o;
            };
            //foreach( $ords, 5, $__troba_delegada );
            foreach( $ords, 3, $__troba_delegada );  // per als TESTS
            if ( $proces == 'nova_delegacio' ) {
                if ( !! $ord_delegada_trobada[0] )
                    bounce( 'Ja hi consta una delegada amb aquesta adreça' );
                $lloc_trobat = [];
                $__troba_lloc_lliure = $o => {
                    if (
                        ! $__dada( $semiref_delegada || $o ) AND
                        ! $lloc_trobat[0]
                    ) {
                        $dades[ $semiref_delegada || $o ] = $args.adr;
                        $lloc_trobat[0] = $o;
                    }
                };
                //$troba_lloc_lliure = map( $ords, 5, $__troba_lloc_lliure );
                $troba_lloc_lliure = map( $ords, 3, $__troba_lloc_lliure );  // per als TESTS
                if ( ! $lloc_trobat[0] )
                    bounce( 'Ja consten com a habilitades totes les delegacions possibles' );
            }
            if ( $proces == 'final_delegacio' ) {
                if ( ! $ord_delegada_trobada[0] )
                    bounce( 'No hi consta cap delegada amb aquesta adreça' );
                $dades[ $semiref_delegada || $ord_delegada_trobada[0] ] = '';
            }
        }
       // Admin vincles
        if ( $args.admin_vincles ) {
            $tipus_vincle = $__dada( $idprop || '_tipus' ) otherwise $__arg( 'tipus' );
            $_vincle = $__dada( $idprop || '_adr' ) otherwise $__arg( 'adr' );
            $nom_vincle = $__dada( $idprop || '_nom' ) otherwise $__arg( 'nom' );
            $ref_vincle = $tipus_vincle || '_' || $nom_vincle;
            $registrat = !! $__dada( $ref_vincle );
            if ( $proces == 'nou_vincle' ) {
                // No ha d'estar registrat
                if ( $registrat )
                    bounce( "Ja n'hi ha un amb aquest nom" );
                // Adreça única
                $adr_registrada = $__dada( $ref_vincle || '_adr' );
                if ( !! $adr_registrada )
                    bounce( "Ja n'hi ha un amb aquesta adreça" );
                //...
                if ( $operacio == 'proposta' ) {
                    $dades[ $nova_idprop || '_adr' ] = $args.adr;
                    $dades[ $nova_idprop || '_nom' ] = $args.nom;
                } else {
                    $ord_vincle = $__dada( 'ordinal_' || $tipus_vincle ) + 1;
                    $dades[ $ref_vincle ] = $ord_vincle;
                    $dades[ $ref_vincle || '_adr' ] = $_vincle;
                    $dades[ $ref_vincle || '_estat' ] = 'operatiu';
                    $dades[ $tipus_vincle || '_' || $ord_vincle ] = $ref_vincle;
                    $dades[ 'ordinal_' || $tipus_vincle ] = $ord_vincle;
                }
            }
            if ( $proces == 'nou_estat_vincle' ) {
                // Ha d'estar registrat
                if ( ! $registrat )
                    bounce( "No n'hi ha cap amb aquesta adreça" );
                //...
                if ( $operacio == 'proposta' ) {
                    $dades[ $nova_idprop || '_adr' ] = $args.adr;
                    $dades[ $nova_idprop || '_estat' ] = $args.estat;
                } else {
                    $nou_estat = $__dada( $idprop || '_estat' ) otherwise $args.estat;
                    $dades[ $ref_vincle || '_estat' ] = $nou_estat;
                    $dades[ $tipus_vincle || '_' || $nom_vincle ] =
                        $nou_estat == 'opereatiu' ? $ref_vincle : '---';
                }
            }
        }
        $registre = {};
        $registre.dades = $dades;
    }",
        "messages": [
            {
                "app": "data",
                "payload": "{ $registre }"
            },
            {
                "app": "payment",
                "payload": {
                    "asset": "base",
                    "outputs": [
                        {
                            "address": "{ $args._Registre }",
                            "amount": "{ $__dada( 'Provisio' ) }"
                        }
                    ]
                }
            },
            {
                "app": "state",
                "state": "{
                if ( !! $nou_estat )
                    response[ 'Nou estat ' || $ref_vincle ] = $nou_estat;
                
                if ( $args.admin_vincles ) {
                    response[ 'Proposta' ] = $nova_idprop otherwise $ref otherwise 'drecera';
                    response[ 'operacio' ] = $operacio;
                }
                response[ 'proces' ] = $proces;
            }"
            }
        ]
    }
]