type_document = 'BI'; //Set Siren $this->siren = $siren; //Get defaut database adapter if ($db === null) { $this->db = Zend_Db_Table_Abstract::getDefaultAdapter(); } else { $this->db = $db; } } /** * * @param $onlyDb * @return array */ public function getList($onlyDb = false) { $this->mode_diffusion = 'XL'; $this->reference_client = 'list-' . $this->siren; $bilansM = new Application_Model_JoGreffesBilans(); //Requete WebService $bilansXML = null; if ( $onlyDb === false ) { //Set All line state to 0 try { $bilansM->update(array('actif' => 0), 'siren='.$this->siren); } catch(Zend_Db_Exception $e) {} //Infogreffe webservice try { $xml = $this->callRequest(); } catch( Exception $e ) { //@todo : get error message return array(); } $bilansXML = $this->formatList($xml); } //Lecture de la base de données $sql = $bilansM->select() ->where('siren=?', $this->siren) ->where('actif=1') ->order('date_cloture DESC') ->order('num_depot DESC') ->order('dateInsert DESC'); //GROUP BY type_comptes, date_cloture AND ORDER BY num_depot DESC $rows = $bilansM->fetchAll($sql); $bilans = array(); if ( count($rows)>0 ) { foreach ( $rows as $row ) { $item = new stdClass(); $item->File = $row->pdfLink; $item->FileSize = $row->pdfSize; $item->NumberOfPages = $row->pdfPage; $item->Millesime = $row->millesime; $item->NumDepot = $row->num_depot; $item->DateCloture = $row->date_cloture; if ( empty($row->type_comptes) ) { $item->Type = 'sociaux'; } else { $item->Type = $row->type_comptes; } $mode_diffusion = explode(',', $row->mode_diffusion); if (in_array('T', $mode_diffusion) || !empty($item->File)) { $item->ModeDiffusion = 'T'; } elseif (in_array('C',$mode_diffusion)) { $item->ModeDiffusion = 'C'; } else { $item->ModeDiffusion = ''; } $item->DureeExercice = $row->duree_exercice; $item->SaisieDate = $row->saisie_date; $item->SaisieCode = $row->saisie_code; switch ( $row->saisie_code ) { case '00': $item->SaisieLabel = "Bilan saisi sans anomalie"; break; case '01': $item->SaisieLabel = "Bilan saisi avec des incohérences comptables à la source du document (issues du remettant)"; break; case '02': $item->SaisieLabel = "Bilan avec Actif, Passif ou Compte de Résultat nul"; break; case '03': $item->SaisieLabel = "Bilan incomplet (des pages manquent)"; break; case '04': $item->SaisieLabel = "Bilan complet non détaillé (seuls les totaux et sous totaux sont renseignés)"; break; case '05': $item->SaisieLabel = "Bilan reçu en double exemplaire"; break; case '06': $item->SaisieLabel = "Bilan intermédiaire - Situation provisoire"; break; case '07': $item->SaisieLabel = "Bilan illisible"; break; case 'A7': $item->SaisieLabel = "Bilan illisible, présentant un cadre gris très foncés (dans lesquels sont inscrits en général les totaux)"; break; case 'B7': $item->SaisieLabel = "Bilan manuscrits"; break; case 'C7': $item->SaisieLabel = "Bilan illisible, présentant des caractères trop gras"; break; case 'D7': $item->SaisieLabel = "Bilan scanné en biais ou qui présentent des pages rognées"; break; case 'E7': $item->SaisieLabel = "Bilan numérisés trop clairement (comme une imprimante dont la cartouche est presque vide)"; break; case 'F7': $item->SaisieLabel = "Bilan illisible"; break; case '08': $item->SaisieLabel = "Bilan consolidé"; break; case '09': $item->SaisieLabel = "Déclaration d'impôts"; break; case '10': $item->SaisieLabel = "Document autre que bilan"; break; case '11': $item->SaisieLabel = "Bilan de clôture de liquidation"; break; case '12': $item->SaisieLabel = "Bilan de Société financière"; break; case '13': $item->SaisieLabel = "Bilan de Société d'assurance"; break; case '14': $item->SaisieLabel = "Bilan de Société immobilière"; break; case '15': $item->SaisieLabel = "Bilan de Société étrangère"; break; default: $item->SaisieLabel = ""; break; } $bilans[] = $item; } } return $bilans; } /** * Download file * @param string $dateCloture * Format AAAA-MM-DD * @param string $type * sociaux ou consolides * @params int $orderId * Id de commande pour l'enregistrement dans la table de gestion * @throws Exception * @return string * Return path (not complete) and filename */ public function getCommandeT($dateCloture = null, $type = 'sociaux', $orderId = null) { //Lire dans la base de données $bilansM = new Application_Model_JoGreffesBilans(); $sql = $bilansM->select() ->where('siren=?', $this->siren) ->where('date_cloture=?', $dateCloture); if ( $type == 'sociaux' || $type == '' ) { $sql->where("(type_comptes='sociaux' OR type_comptes='')"); } else { $sql->where('type_comptes=?',$type); } $sql->order('dateInsert DESC')->order('num_depot DESC')->limit(1); $row = $bilansM->fetchRow($sql); if ( null === $row ) { throw new Exception("Element doesn't exist"); } $this->mode_diffusion = 'T'; $this->reference_client = 'T'.date('YmdHis'); $this->greffe = $row->numGreffe; $this->dossier_millesime = substr($row->numRC,0,2); $this->dossier_statut = substr($row->numRC,2,1); $this->dossier_chrono = substr($row->numRC,3); $this->num_depot = $row->num_depot; $this->date_cloture = $row->date_cloture; //Set the filename $filename = $this->getFilePath($type, $dateCloture) . '/' . $this->getFileName($type, $dateCloture); if ($row->pdfLink != '') { //Set filename $filename = $this->getFilePath($type, $dateCloture) . '/' . $this->getFileName($type, $dateCloture); //Check if filename exist if ( !file_exists($this->config->storage->path . '/' . $filename) ) { throw new Exception('File not found'); } }elseif ( file_exists($this->config->storage->path . '/' . $filename) ) { //Analyser le fichier - Nombre de page et taille $infos = $this->pdfInfos($this->config->storage->path . '/' . $filename); //Enregistrer les infos du fichier dans la base de données if (false !== $infos) { $this->dbSetFile(basename($filename), $infos['size'], $infos['pages'], $infos['version']); } else { $this->dbSetFile(basename($filename)); } } else { try { $xml = $this->callRequest(); } catch(Exception $e) { throw new Exception($e->getMessage(), $e->getCode()); } $bilan = $this->formatItem($xml); $url = $bilan['url_acces']; if ( empty($url) ) { throw new Exception('File url not given'); } if ( $orderId !== null ) { $commandeM = new Application_Model_Sdv1GreffeCommandesBi(); $commandeM->update(array( 'cmdUrl'=> $url, 'dateCommande' => date('YmdHis'), ), 'id='.$orderId); } //Récupérer le fichier $getfile = $this->download($url, $filename); //Analyser le fichier - Nombre de page et taille $infos = $this->pdfInfos($getfile); //Enregistrer les infos du fichier dans la base de données if (false !== $infos) { $this->dbSetFile(basename($filename), $infos['size'], $infos['pages'], $infos['version']); } else { $this->dbSetFile(basename($filename)); } } return $filename; } /** * @todo : Vérifier fonctionnement * @param string $dateCloture * @param string $type * @param string $reference * @throws Exception * @return boolean */ public function getCommandeC($dateCloture = null, $type = 'sociaux', $reference = '') { $this->mode_diffusion = 'C'; //Lire dans la base de données $bilansM = new Application_Model_JoGreffesBilans(); $sql = $bilansM->select() ->where('siren=?', $this->siren) ->where('date_cloture=?', $dateCloture); if ($type=='sociaux') { $sql->where("(type_comptes='sociaux' OR type_comptes='')"); } else { $sql->where('type_comptes=?',$type); } $row = $bilansM->fetchRow($sql); if ( null === $row ) { throw new Exception('Not exist'); } $this->reference_client = $reference; //Générer les paramètres de commande depuis la base de données $this->greffe = $row->numGreffe; $this->dossier_millesime = substr($row->numRC,0,2); $this->dossier_statut = substr($row->numRC,2,1); $this->dossier_chrono = substr($row->numRC,3); $this->num_depot = $row->num_depot; $this->date_cloture = $row->date_cloture; //Faire la requete try { $xml = $this->callRequest(); } catch(Exception $e) { //La prise en charge du courrier est effective if ( $e->getCode() != 17 ) { throw new Exception($e->getMessage()); } } return true; } /** * Name of file * @param string $type * @param string $dateCloture * Format : AAAA-MM-JJ * @return string */ public function getFileName($type, $dateCloture) { if ($type=='') { $type = 'sociaux'; } $date = substr($dateCloture,0,4).substr($dateCloture,5,2).substr($dateCloture,8,2); return 'bilan-' . $this->siren . '-' . $type . '-' . $date . '.pdf'; } /** * Path of file * @param string $type * @param string $dateCloture * Format : AAAA-MM-JJ * @return string */ public function getFilePath($type, $dateCloture) { if ($type=='') { $type = 'sociaux'; } $dir = 'bilans' . '/' . $type . '/' . substr($dateCloture,0,4); if ( !file_exists( $this->config->storage->path . '/' . $dir ) ) { mkdir($this->config->storage->path . '/' . $dir, 0777, true); } return $dir; } /** * Format XML to Array for a list of items * @param string $xml * @return array */ protected function formatList($xml) { //Parse XML to make an array $doc = new DOMDocument(); $doc->loadXML($xml); $liste_bilan_complet = $doc->getElementsByTagName('liste_bilan_complet')->item(0); $bilan_complet = $liste_bilan_complet->getElementsByTagName('bilan_complet'); $bilans = array(); if ( count($bilan_complet)>0 ) { foreach( $bilan_complet as $element ) { $bilan = array(); $num_gest = $element->getElementsByTagName('num_gest')->item(0); $bilan['num_gest']['greffe'] = $num_gest->getElementsByTagName('greffe')->item(0)->nodeValue; $bilan['num_gest']['dossier_millesime'] = $num_gest->getElementsByTagName('dossier_millesime')->item(0)->nodeValue; $bilan['num_gest']['dossier_statut'] = $num_gest->getElementsByTagName('dossier_statut')->item(0)->nodeValue; $bilan['num_gest']['dossier_chrono'] = $num_gest->getElementsByTagName('dossier_chrono')->item(0)->nodeValue; $bilan['dossier_millesime'] = $num_gest->getElementsByTagName('dossier_millesime')->item(0)->nodeValue; $bilan['dossier_statut'] = $num_gest->getElementsByTagName('dossier_statut')->item(0)->nodeValue; $bilan['dossier_chrono'] = $num_gest->getElementsByTagName('dossier_chrono')->item(0)->nodeValue; $bilan['num_siren'] = $element->getElementsByTagName('num_siren')->item(0)->nodeValue; $bilan['date_cloture'] = $element->getElementsByTagName('date_cloture')->item(0)->nodeValue; $bilan['date_cloture_iso'] = $element->getElementsByTagName('date_cloture_iso')->item(0)->nodeValue; $bilan['millesime'] = $element->getElementsByTagName('millesime')->item(0)->nodeValue; $bilan['num_depot'] = $element->getElementsByTagName('num_depot')->item(0)->nodeValue; $bilan['type_comptes'] = $element->getElementsByTagName('type_comptes')->item(0)->nodeValue; $mode_diffusion = $element->getElementsByTagName('mode_diffusion')->item(0)->getElementsByTagName('mode'); foreach($mode_diffusion as $mode) { $bilan['mode_diffusion'][] = $mode->getAttribute('type'); } //Enregistrer dans la bdd $this->dbUpdateItem($bilan); //Génération de l'index pour le tri $date = $bilan['date_cloture_iso']; if( !empty($date) ) { $key = substr($date,0,4).substr($date,5,2).substr($date,8,2).'-'.$bilan['num_depot']; //Affectation liste générale avec un index permettant le tri $bilans[$key] = $bilan; } } } krsort($bilans); return $bilans; } /** * Format XML to Array for one item * @param string $xml * @return array */ protected function formatItem($xml) { $doc = new DOMDocument(); $doc->loadXML($xml); $bilan_complet = $doc->getElementsByTagName('bilan_complet')->item(0); $bilan = array(); $bilan['num_gest'] = array(); $num_gest = $bilan_complet->getElementsByTagName('num_gest')->item(0); $bilan['num_gest']['greffe'] = $num_gest->getElementsByTagName('greffe')->item(0)->nodeValue; $bilan['num_gest']['dossier_millesime'] = $num_gest->getElementsByTagName('dossier_millesime')->item(0)->nodeValue; $bilan['num_gest']['dossier_statut'] = $num_gest->getElementsByTagName('dossier_statut')->item(0)->nodeValue; $bilan['num_gest']['dossier_chrono'] = $num_gest->getElementsByTagName('dossier_chrono')->item(0)->nodeValue; $bilan['num_siren'] = $bilan_complet->getElementsByTagName('num_siren')->item(0)->nodeValue; $bilan['date_cloture'] = $bilan_complet->getElementsByTagName('date_cloture')->item(0)->nodeValue; $bilan['date_cloture_iso'] = $bilan_complet->getElementsByTagName('date_cloture_iso')->item(0)->nodeValue; $bilan['millesime'] = $bilan_complet->getElementsByTagName('millesime')->item(0)->nodeValue; $bilan['num_depot'] = $bilan_complet->getElementsByTagName('num_depot')->item(0)->nodeValue; $bilan['type_comptes'] = $bilan_complet->getElementsByTagName('type_comptes')->item(0)->nodeValue; $bilan['url_acces'] = $bilan_complet->getElementsByTagName('url_acces')->item(0)->nodeValue; return $bilan; } /** * Update informations about an item in database * @param array $list * @return boolean */ protected function dbUpdateItem($list) { //Insert or Update $data = array( 'siren' => $list['num_siren'], 'numRC' => $list['num_gest']['dossier_millesime']. $list['num_gest']['dossier_statut'].$list['num_gest']['dossier_chrono'], //'numRC2' => '', 'numGreffe' => intval($list['num_gest']['greffe']), 'millesime' => $list['millesime'], 'num_depot' => $list['num_depot'], 'date_cloture' => $list['date_cloture_iso'], 'type_comptes' => $list['type_comptes'], 'mode_diffusion' => join(',',$list['mode_diffusion']), 'actif' => 1, ); $this->db->getProfiler()->setEnabled(true); try { $bilanM = new Application_Model_JoGreffesBilans(); $sql = $bilanM->select() ->where('siren=?', $this->siren) ->where('num_depot=?', $list['num_depot']) ->where('date_cloture=?', $list['date_cloture_iso']) //->where('type_comptes=?', $list['type_comptes']) ->order('dateInsert ASC'); $rows = $bilanM->fetchAll($sql); } catch(Zend_Db_Exception $e) { /*echo $query = $this->db->getProfiler()->getLastQueryProfile()->getQuery(); echo "\n"; $queryParams = $this->db->getProfiler()->getLastQueryProfile()->getQueryParams(); print_r($queryParams); echo "\n";*/ throw new Exception($e->getMessage()); } $this->db->getProfiler()->setEnabled(false); if ( count($rows) == 0 ) { //Add dateInsert $data['dateInsert'] = date('YmdHis'); try { $result = $bilanM->insert($data); } catch(Zend_Exception $e) { throw new Exception($e->getMessage()); } } else { //Correct multiple item $item = $rows[0]; if ( count($rows) > 1 ) { try { $result = $bilanM->delete(array( $bilanM->getAdapter()->quoteInto('siren=?', $this->siren), $bilanM->getAdapter()->quoteInto('num_depot=?', $list['num_depot']), $bilanM->getAdapter()->quoteInto('date_cloture=?', $list['date_cloture_iso']), $bilanM->getAdapter()->quoteInto('type_comptes=?', $list['type_comptes']), 'id!='.$item->id, )); } catch(Zend_Exception $e) { throw new Exception($e->getMessage()); } } try { $result = $bilanM->update($data, 'id='.$item->id); } catch(Zend_Exception $e) { throw new Exception($e->getMessage()); } } if ($result) { return true; } return false; } /** * Set file informations in database * @param string $filename * @param int $size * @param int $numberOfPage * @param string $version * @return boolean */ public function dbSetFile($filename, $size = 0, $numberOfPage = '', $version = '') { $data = array( 'pdfLink' => $filename, 'pdfSize' => $size, 'pdfPage' => $numberOfPage, 'pdfVer' => $version, 'pdfDate' => date('Ymd'), ); $where = array( 'siren='.$this->siren, 'date_cloture="'.$this->date_cloture.'"', 'type_comptes="'.$this->type_comptes.'"', ); try { $bilanM = new Application_Model_JoGreffesBilans(); $result = $bilanM->update($data, $where); } catch(Zend_Db_Adapter_Exception $e) { throw new Exception($e->getMessage()); } catch(Zend_Db_Exception $e) { throw new Exception($e->getMessage()); } if ($result) { return true; } return false; } }