/**
  * Cette méthode est utilisée pour initialiser une demande de cosignature.
  * Vous passerez en paramètre une liste de fichiers à signer ainsi qu'une liste d'informations des cosignataires.
  *
  * Ils recevront ensuite un email contenant une URL unique pour accéder à l'interface de signature du/des documents afin de le/les signer.
  *
  * example:
  * ----------
  *     $listFiles = array(
  *         array(
  *             'name' => 'Fichier 1',
  *             'content' => 'base64 du fichier',
  *             'idFile' => 'idFile1'
  *         ),
  *         array(
  *             'name' => 'Fichier 2',
  *             'content' => 'base64 du fichier',
  *             'idFile' => 'idFile2'
  *         ),
  *     );
  *
  *     $lstPersons = array
  *     (
  *         array(
  *             'firstName' => 'Prenom 1',
  *             'lastName' => 'Nom 1',
  *             'mail' => '*****@*****.**',
  *             'phone' => '+33123456789',
  *             'proofLevel' => 'LOW'
  *         ),
  *         array(
  *             'firstName' => 'Prenom 1',
  *             'lastName' => 'Nom 1',
  *             'mail' => '*****@*****.**',
  *             'phone' => '+33123456789',
  *             'proofLevel' => 'LOW'
  *         ),
  *     );
  *
  *     $visibleOptions = array
  *     (
  *         $listFiles[0]['idFile'] => array
  *         (
  *             array(
  *                 'visibleSignaturePage' => '1',
  *                 'isVisibleSignature' => true,
  *                 'visibleRectangleSignature' => 'llx,lly,urx,ury',
  *                 'mail' => '*****@*****.**'
  *             ),
  *             array(
  *                 'visibleSignaturePage' => '1',
  *                 'isVisibleSignature' => true,
  *                 'visibleRectangleSignature' => 'llx,lly,urx,ury',
  *                 'mail' => '*****@*****.**'
  *             ),
  *         ),
  *         $listFiles[1]['idFile'] => array
  *         (
  *             array(
  *                 'visibleSignaturePage' => '3',
  *                 'isVisibleSignature' => true,
  *                 'visibleRectangleSignature' => 'llx,lly,urx,ury',
  *                 'mail' => '*****@*****.**'
  *             ),
  *             array(
  *                 'visibleSignaturePage' => '3',
  *                 'isVisibleSignature' => true,
  *                 'visibleRectangleSignature' => 'llx,lly,urx,ury',
  *                 'mail' => '*****@*****.**'
  *             ),
  *         )
  *     );
  *
  *     $message = 'Un message';
  *
  *     $options = array(
  *         'initMailSubject' => 'Sujet de l\'email',
  *         'initMail' => 'Contenu de l\'email'
  *         [...]
  *     );
  *
  * @param array  $lstFiles       : Liste du/des fichiers à signer, chaque fichier doit définir:
  *                                   - name : Nom du fichier à signer
  *                                   - content : Contenu du fichier à signer encodé en base64
  *                                   - idFile : identifiant unique (entier ou chaine de caractère)
  * @param array  $lstPersons     : Liste des cosignataires, chaque cosignataire doit définir:
  *                                   - firstName : Le prénom du cosignataire
  *                                   - lastName : Le nom du cosignataire
  *                                   - mail : L'email du cosignataire (ou un id si c'est en mode Iframe)
  *                                   - phone : Le numéro de téléphone du cosignataire (indicatif requis, exemple: +33612326554)
  *                                   - proofLevel : Niveau de preuve
  *                                       Disponible: LOW
  *                                       Par défaut: Rien
  * @param array  $visibleOptions : Liste d'informations requis pour le placement des signatures
  *                                   - visibleSignaturePage : Numéro de la page contenant les signatures
  *                                   - isVisibleSignature : Affiche ou non la signature sur le document
  *                                   - visibleRectangleSignature : Les coordonnées de l'image de signature (ignoré si "isVisibleSignature" est à false)
  *                                     Le format est "llx,lly,urx,ury" avec:
  *                                         * llx: left lower x coordinate
  *                                         * lly: left lower y coordinate
  *                                         * urx: upper right x coordinate
  *                                         * ury: upper right y coordinate
  *                                   - mail : Email du cosignataire associée à la signature
  * @param string $message        : Message de l'email qui sera envoyé aux cosignataires (Non utilisé si initMailXXX définis)
  * @param array  $options        : Tableau d'options facultatifs
  *                                   - initMailSubject : Sujet de l'email envoyé à tous les cosignataires à la création de la cosignature (Non utilisé en mode Iframe)
  *                                   - initMail : Corps de l'email envoyé à tous les cosignataires à la création de la cosignature.
  *                                     Il doit être en HTML et contenir la balise {yousignUrl} qui sera remplacée par l'URL
  *                                     d'accès à l'interface de signature du/des documents. (Non utilisé en mode Iframe)
  *                                   - endMailSubject : Sujet de l'email envoyé lorsque tous les cosignataires ont signés le/les documents (Non utilisé en mode Iframe)
  *                                   - endMail : Corps de l'email envoyé lorsque tous les cosignataires ont signés le/les documents
  *                                     Il dit être en HTML et contenir la balise {yousignUrl} qui sera remplacée par l'URL
  *                                     d'accès à l'interface listant le/les documents signés (Non utilisé en mode Iframe)
  *                                   - language : Langue définie pour la cosignature.
  *                                     Disponibles: FR|EN|DE
  *                                     Par défaut: FR
  *                                   - mode :     Mode d'utilisation (Aucun par défaut)
  *                                       * IFRAME : Permet de signer directement dans l'application hébergeant l'iframe
  *                                         Ceci retournera un token pour chaque signataire
  *                                         L'URL devant appeler l'Iframe est:
  *                                             => (Démo) https://demo.yousign.fr/public/ext/cosignature/{token}
  *                                             => (Prod) https://yousign.fr/public/ext/cosignature/{token}
  *                                   - archive : Booléen permettant d'activer l'archivage du/des documents signés automatiquement
  *                                     L'archivage se fait lorsque tous les cosignataires ont signés
  *
  * @return mixed : Id de la demande de cosignature créée et liste des id des fichiers à signer
  *               Si le mode "IFRAME" est définie, un token sera également retournée pour chaque cosignataire
  *               Pour associer le bon token au bon cosignataire, un email et un numéro de téléphone sont associés à chaque token
  *               (ou false si une erreur est survenue)
  *
  * @category com.yousign.cosignejb
  *
  * @link http://developer.yousign.fr/com/yousign/cosignejb/CosignWS.html#CosignWS()
  */
 public function initCoSign($lstFiles, $lstPersons, $visibleOptions, $message, $options = array())
 {
     $payload = '';
     $this->client = $this->setClientSoap($this->URL_WSDL_COSIGN);
     // A cause d'un soucis dans la librairie Nusoap, nous sommes obligés de créer nous même le payload afin qu'il corresponde à notre WSDL.
     // Le pb : Avec un tableau de paramètres, Nusoap créer cette arborescence : <files><item>...</item><item>...</item></files>
     // Nous avons besoin de cette arborescence : <files>...</files><files>...</files>. Les lignes suivantes permettent de bien la construire.
     // Liste des fichiers de la co-signature
     foreach ($lstFiles as $key => $file) {
         $filePayload = '';
         $visibleOptionsPayload = '';
         // On récupère les options de signature visible
         foreach ($visibleOptions[$file['idFile']] as $option) {
             $item = array('visibleOptions' => $option);
             foreach ($item as $k => $v) {
                 $visibleOptionsPayload .= $this->client->serialize_val($v, $k, false, false, false, false, 'encoded');
             }
         }
         // On supprime l'id file qui est inutile
         unset($file['idFile']);
         $item = array('lstCosignedFile' => $file);
         foreach ($item as $k => $v) {
             $filePayload .= $this->client->serialize_val($v, $k, false, false, false, false, 'encoded');
         }
         // On insert les données de signature visible
         $payload .= substr_replace($filePayload, $visibleOptionsPayload, strpos($filePayload, '</lstCosignedFile>'), 0);
     }
     // Liste des co-signataires
     foreach ($lstPersons as $person) {
         $item = array('lstCosignerInfos' => $person);
         foreach ($item as $k => $v) {
             $payload .= $this->client->serialize_val($v, $k, false, false, false, false, 'encoded');
         }
     }
     // Ajout du message
     $payload .= $this->client->serialize_val($message, 'message', false, false, false, false, 'encoded');
     // Envoi d'email
     if (isset($options['initMailSubject']) && isset($options['initMail'])) {
         $payload .= $this->client->serialize_val($options['initMailSubject'], 'initMailSubject', false, false, false, false, 'encoded');
         $payload .= $this->client->serialize_val($options['initMail'], 'initMail', false, false, false, false, 'encoded');
     }
     if (isset($options['endMailSubject']) && isset($options['endMail'])) {
         $payload .= $this->client->serialize_val($options['endMailSubject'], 'endMailSubject', false, false, false, false, 'encoded');
         $payload .= $this->client->serialize_val($options['endMail'], 'endMail', false, false, false, false, 'encoded');
     }
     if (isset($options['language'])) {
         $payload .= $this->client->serialize_val($options['language'], 'language', false, false, false, false, 'encoded');
     }
     if (isset($options['mode'])) {
         $payload .= $this->client->serialize_val($options['mode'], 'mode', false, false, false, false, 'encoded');
     }
     if (isset($options['archive'])) {
         $payload .= $this->client->serialize_val($options['archive'], 'archive', false, false, false, false, 'encoded');
     }
     $result = $this->client->call('initCosign', $payload, self::API_NAMESPACE, self::API_NAMESPACE, $this->createHeaders());
     if ($this->client->fault) {
         $this->errors[] = $this->client->faultstring;
         return false;
     } else {
         $err = $this->client->getError();
         if ($err) {
             $this->errors = $err;
             return false;
         } else {
             if ($result > 0) {
                 return $result;
             } else {
                 $this->errors[] = 'No result';
                 return false;
             }
         }
     }
 }