/** * 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; } } } }