[
    "autonomous agent",
    {
        "init": "{
        $nom_AA = 'Validacions';
       // Portal
        //$_Portal = '5WVBJQHTEP54AEYUJGTQKWTXTXZSJQWA';
        $_Portal = trigger.address;  // * només x tests
        if ( $_Portal != trigger.address ) bounce ( 'Portal no reconegut' );
       // Principals
        $args = trigger.data;
        $adr__ = trigger.initial_address;
        $_unitat = trigger.output[[ asset != base ]].asset;
        $qt = 1;                                           // Pendent de definició!!!
        $proces = $args.proces;
        $idprop = $args.idprop;
        $dades = $args.dades otherwise {};
       // Funcions
        $__dada = $refval =>
            data_feed[[ oracles = $args._Registre, feed_name = $refval, ifnone = '' ]];
        $__arg = $arg =>
            $args[ $arg ] otherwise
            bounce ( "Cal proporcionar el valor de: " || $arg );
      // Comprovacions
        // La proposta encara no pot estar validada
        if ( $__dada( 'validacio_' || $idprop ) != '' )
            bounce( 'Ja validada' );
        // La proposta ha d'existir
        /*if ( ! $__dada( $idprop ) )
            bounce( 'No hi ha cap proposta amb aquesta id' );
        */
       // Processos
        if ( $proces == 'convocatoria_validadores' ) {
            $convocs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ];
            $nombre_isox = $__dada( 'ordinal_isox' );
            $selec_isox = [];
            $llista = [];
            $__isox_aleatori = $x => {
                $ordinal_aleatori =
                    number_from_seed( ( timestamp + $x ), $nombre_isox );
                $_isox = $__dada( 'isox_' || $ordinal_aleatori );
                $estat_isox = $__dada( 'isox_' || $_isox || '_estat' ) otherwise '';
                if( $estat_isox == 'habilitat' AND ! contains( $llista[0], $_isox ) ) {
                    $selec_isox[] = $_isox;
                    $llista[0] = $_isox || ':' || $llista[0];
                    $dades['convocatoria_' || $idprop || '_validadora_isox_' || $x ] = $_isox;
                }
            };
            foreach( $convocs, 10, $__isox_aleatori );
/*
            $nombre_entitats = $__dada( 'ordinal_entitat' );
            $selec_delegades = [];
            
            $__entitat_aleatoria = $x => {
                $ord_entitat_aleatoria =
                    number_from_seed( ( timestamp + $x ), $nombre_entitats );
                $ref_entitat = $__dada( 'entitat_' || $ord_entitat_aleatoria );
                $estat_entitat = $__dada( $ref_entitat || '_estat' ) otherwise '';
                if( $estat_entitat == 'operatiu' ) {
                    $ord_delegada_aleatoria = number_from_seed( ( timestamp + $x ), 5 );
                    $ref_delegada = $ref_entitat || '_delegada_' || $ord_delegada_aleatoria;
                    $_delegada = $__dada( $ref_delegada );
                    if( $_delegada != '' ) {
                        $selec_delegades[] = $_delegada;
                        $dades['convocatoria' || $idprop || '_validadora_delegada_' || $x ] = $_delegada;
                    }
                }
            };
            foreach( $convocs, 10, $__entitat_aleatoria );
            $selec_valoradores = $selec_isox || $selec_delegades;
*/
            $selec_valoradores = $selec_isox; // || $selec_delegades;
            $avisos = [];
            $__avisos_seleccionades = $adr_valoradora => {
                if( $adr_valoradora ) {
                    $avis_convocatoria = {
                        address : $adr_valoradora,
                        amount : $qt
                    };
                    $avisos[] = $avis_convocatoria;
                }
            };
            foreach( $selec_valoradores, 20, $__avisos_seleccionades );
            $dades['convocatoria_' || $idprop ] = timestamp;
        }
        if ( $proces == 'decisio_validacio' ) {
            $convocatoria = $__dada( 'convocatoria_' || $idprop );
            $validacio = $__dada( 'validacio_' || $idprop );
            $refus = $__dada( 'refus_' || $idprop );
            $convocs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ];
            
            // La convocatoria ha d'existir
            if ( ! $convocatoria )
                bounce( 'No hi ha cap convocatoria amb aquesta id' );
            // Tractament proposta encara pendent
            if ( !! $validacio OR !! $refus )
                bounce( 'Aquesta proposta ja ha estat tractada' );
            $_isox_convocada = [];
            $semiref_convo = 'convocatoria_' || $idprop || '_validadora_isox_';
            $__troba_convocatoria_isox = $o => {
                $adr_convo = $__dada( $semiref_convo || $o ) otherwise '';
                if (
                    ! $_isox_convocada[0]
                    AND $adr_convo == $adr__
                )
                $_isox_convocada[0] = $o;
            };
            foreach( $convocs, 10, $__troba_convocatoria_isox );
            if ( ! $_isox_convocada[0] )         // per als TESTs
                bounce( 'Adreça no convocada com a isox' );
            $_delegada_convocada = [];
            $semiref_convo = 'convocatoria_' || $idprop || '_validadora_delegada_';
            $__troba_convocatoria_delegada = $o => {
                $adr_convo = $__dada( $semiref_convo || $o ) otherwise '';
                if (
                    ! $_delegada_convocada[0]
                    AND $adr_convo == $adr__
                )
                $_delegada_convocada[0] = $o;
            };
            foreach( $convocs, 10, $__troba_convocatoria_delegada );
            // adr__ actuant ha estat convocada
            //if ( ! $_isox_convocada[0] AND ! $_delegada_convocada[0] )
            if ( ! $_isox_convocada[0] )         // per als TESTs
                bounce( 'Adreça no convocada' );
            if ( !! $_isox_convocada[0] ) $grup = 'isox';
            
            if ( !! $_delegada_convocada[0] ) $grup = 'delegades';
            $secc_ref_decisio = 'decisio_' || $idprop || '_grup_' || $grup;
            if ( !! $__dada( $secc_ref_decisio || '_' || $adr__ ) )
                bounce( "Ja hi consta una decisió d'aquesta adreça per a aquesta proposta" );
            // Deliberació en curs
            $decisio_grup = $__dada( $secc_ref_decisio );
            if ( !! $decisio_grup )
                bounce( 'Decisió del grup ' || $grup || ' ja pronunciada: ' || $decisio_grup );
            if ( $__arg( 'decisio' ) == 'refusada' ) {
                $dades[ $secc_ref_decisio || '_' || $adr__ ] = 'refusada';
                $dades[ $secc_ref_decisio ] = 'refusada';
                $dades[ 'refus_' || $idprop ] = timestamp;
            }
            if ( $__arg( 'decisio' ) == 'aprovada' ) {
                $ref_nombre_aprovacions = 'nombre_aprovacions_' || $grup || '_' || $idprop;
                $nombre_aprovacions = $__dada( $ref_nombre_aprovacions );
                $dades[ $secc_ref_decisio || '_' || $adr__ ] = 'aprovada';
                $dades[ $ref_nombre_aprovacions ] = $nombre_aprovacions + 1;
                if ( $nombre_aprovacions == $__dada( 'Nombre_Aprovacions' ) ) {
                    $dades[ $secc_ref_decisio ] = 'aprovada';
                    $alter_grup = $grup == 'isox' ? 'delegades' : 'isox';
                    if ( $__dada( 'decisio_' || $idprop || '_grup_' || $alter_grup ) == 'aprovada' )
                        $dades[ 'validacio_' || $idprop ] = timestamp;
                }
            }
        }
        // Temporalment, per als TESTS!!!...............................
        if ( $proces == 'validacio_directa_TEST' )
            $dades[ 'validacio_' || $idprop ] = timestamp;
        $registre = {};
        $registre.dades = $dades;
    }",
        "messages": [
            {
                "app": "data",
                "payload": "{ $registre }"
            },
            {
                "app": "payment",
                "payload": {
                    "asset": "base",
                    "outputs": [
                        {
                            "address": "{ $args._Registre }",
                            "amount": "{ $__dada( 'Provisio' ) }"
                        }
                    ]
                }
            },
            {
                "if": "{ $proces == 'convocatoria_validadores' }",
                "init": "{
                $payload =
                    {
                        asset : $_unitat,
                        outputs : $avisos
                    };
            }",
                "app": "payment",
                "payload": "{ $payload }"
            },
            {
                "app": "state",
                "state": "{
                response[ 'Procés' ] = $proces;
                response[ 'Proposta' ] = $idprop;
                if ( $proces == 'convocatoria_validadores' ) {
                    response[ 'Nombre Isox' ] = $nombre_isox;
                    $__isox_seleccionades = $n => {
                        response[ 'Isox seleccionada ' || $n ] = $selec_isox[ $n ];
                    };
                    foreach( $convocs, 10, $__isox_seleccionades );
                    $__isox_convocades = $n => {
                        if( $selec_isox[ $n ] )
                            response[ 'Valoradora convocada ' || $n ] = $selec_isox[ $n ];
                    };
                    foreach( $convocs, 10, $__isox_convocades );
                    /*
                    $__delegades_seleccionades = $n => {
                        response[ 'Isox seleccionada ' || $n ] = $seleccio_delegades[ $n ][0];
                    };
                    $llista_delegades = map( $convocs, 10, $__delegades_seleccionades );
                    */
                }
                if ( $proces == 'decisio_validacio' ) {
                    response[ 'Validació' ] =
                        $__arg( 'decisio' ) || ' per ' || $adr__;
                    if ( $dades[ $secc_ref_decisio ] == 'aprovada' )
                        response[ 'Validació' ] = ' aprovada per ' || $grup;
                    if ( !! $dades[ 'validacio_' || $idprop ] )
                        response[ 'Validació' ] = 'aprovada';
                    if ( $__arg( 'decisio' ) == 'refusada' )
                        response[ 'Validació' ] = 'refusada';
                }
           }"
            }
        ]
    }
]