]> _ Git - cubeextranet.git/commitdiff
(no commit message)
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Tue, 9 Dec 2014 15:23:16 +0000 (15:23 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Tue, 9 Dec 2014 15:23:16 +0000 (15:23 +0000)
12 files changed:
inc/commons/DAO/class.common.dao.equipier.php
inc/extranet/Controlleur/class.extranet.page.chiffres.php
inc/extranet/Controlleur/class.extranet.tools.php [new file with mode: 0644]
inc/extranet/Controlleur/class.extranet.url.php
inc/extranet/Controlleur/url/_common.php [new file with mode: 0644]
inc/extranet/Controlleur/url/class.extranet.url.client.php [new file with mode: 0644]
inc/extranet/Controlleur/url/class.extranet.url.devis.php [new file with mode: 0644]
inc/extranet/Controlleur/url/class.extranet.url.facture.php [new file with mode: 0644]
inc/extranet/Controlleur/url/class.extranet.url.projet.php [new file with mode: 0644]
inc/extranet/Controlleur/url/class.extranet.url.timereport.php [new file with mode: 0644]
inc/extranet/Metier/class.extranet.entreprise.php
inc/extranet/Metier/class.extranet.tache.normale.php

index e68773bb59a940fbfe5c799e40b768b5c31443cb..b9ea72fb8ab1abcba3c4c63af5bc25b63002cb88 100644 (file)
@@ -1,47 +1,45 @@
-<?php\r
-class commonDAOEquipier extends commonDAOUtilisateur {\r
-       protected function singleton($r)\r
-       {\r
-               $utilisateur = new commonEquipier();\r
-               $utilisateur->utilisateur_id = $r->utilisateur_id;\r
-               $utilisateur->agence = $r->agence;\r
-               return parent::singleton($r);\r
-       }\r
-\r
-       public function cree($utilisateur = null)\r
-       {\r
-               $utilisateur = new commonEquipier();\r
-               $utilisateur->agence = 'Paris';\r
-               $utilisateur->grade = 1;\r
-               return parent::cree($utilisateur);\r
-       }\r
-\r
-       public function selectById($equipier_id,$table='equipiers')\r
-       {\r
-               $r = $this->con->select('SELECT * FROM '.$table.' WHERE utilisateur_id=' . $this->core->con->escape($equipier_id) . ' LIMIT 1');\r
-               return $this->singleton($r);\r
-       }\r
-\r
-       public function selectAll(){\r
-               $r=$this->con->select('SELECT * FROM equipiers');\r
-               return $this->factory($r);\r
-       }\r
-\r
-       public function getListe($q = null, $orderby = null, $sens = null, $limit = null, $search_id = true)\r
-       {\r
-               global $core;\r
-\r
-               $sql = $this->getQueryList('equipiers', $q, $orderby, $sens, $limit,false);\r
-\r
-               $r = $this->con->select($sql);\r
-               return $this->factory($r);\r
-       }\r
-\r
-       public function count()\r
-       {\r
-               $r = $this->con->select('SELECT COUNT(*) AS nb FROM equipiers');\r
-               return $r->nb;\r
-       }\r
-}\r
-\r
+<?php
+
+class commonDAOEquipier extends commonDAOUtilisateur {
+
+       protected function singleton($r) {
+               $utilisateur = new commonEquipier();
+               $utilisateur->utilisateur_id = $r->utilisateur_id;
+               $utilisateur->agence = $r->agence;
+               return parent::singleton($r);
+       }
+
+       public function cree($utilisateur = null) {
+               $utilisateur = new commonEquipier();
+               $utilisateur->agence = 'Paris';
+               $utilisateur->grade = 1;
+               return parent::cree($utilisateur);
+       }
+
+       public function selectById($equipier_id, $table = 'equipiers') {
+               $r = $this->con->select('SELECT * FROM ' . $table . ' WHERE utilisateur_id=' . $this->core->con->escape($equipier_id) . ' LIMIT 1');
+               return $this->singleton($r);
+       }
+
+       public function selectAll() {
+               $r = $this->con->select('SELECT * FROM equipiers');
+               return $this->factory($r);
+       }
+
+       public function getListe($q = null, $orderby = null, $sens = null, $limit = null, $search_id = true) {
+               global $core;
+
+               $sql = $this->getQueryList('equipiers', $q, $orderby, $sens, $limit, 'enabled = 1');
+
+               $r = $this->con->select($sql);
+               return $this->factory($r);
+       }
+
+       public function count() {
+               $r = $this->con->select('SELECT COUNT(*) AS nb FROM equipiers');
+               return $r->nb;
+       }
+
+}
+
 ?>
\ No newline at end of file
index 033d1f00705a6e27ff1f07b1a5dc6a7df5cd53b3..1326d546c4d35a61f5afd2c50a303c2e97b3fa85 100644 (file)
@@ -64,6 +64,8 @@ class extranetPageChiffres {
                $res.=self::caMensuel();\r
                $res .= self::caCategorie($chiffres, $total);\r
                $res .= self::caWorkRate($chiffres, $total);\r
+               $res .= self::caSegments($chiffres, $total);\r
+               $res .= self::caSegmentsHf($chiffres, $total);\r
                return $res;\r
        }\r
 \r
@@ -310,6 +312,8 @@ class extranetPageChiffres {
                $res .= commonPage::bf();\r
                return $res;\r
        }\r
+       \r
+       \r
 \r
        public static function caCategoriesChart($a, $datas, $type, $width, $height, $max = 7) {\r
                global $core;\r
@@ -338,7 +342,7 @@ class extranetPageChiffres {
        public static function caChart($chiffres, $encours) {\r
                global $core;\r
 \r
-               $title = __("*Evolution du chiffre d'affaire");\r
+               $title = __("Evolution du chiffre d'affaire");\r
                $chart = new cubeGoogleCharts('bvs', 940, 200);\r
                $chart->setTitle($title);\r
                $max = 0;\r
@@ -364,6 +368,141 @@ class extranetPageChiffres {
                $chart->addData($cae);\r
                return $chart->display($title);\r
        }\r
+       \r
+       public static function caSegments($chiffres, $total){\r
+               global $core;\r
+               return self::_caSegment('SELECT * FROM chiffres_types ORDER BY annee,type',__("CA par type de client"));\r
+       }\r
+       \r
+               \r
+       public static function caSegmentsHf($chiffres, $total){\r
+               global $core;\r
+               return self::_caSegment('SELECT * FROM chiffres_types_hf ORDER BY annee,type',__("CA par type de client").'<br />('.__('Hors Fluidbook').')');\r
+       }\r
+       \r
+       public static function caSegmentChart($a, $datas, $type, $width, $height, $max = 7) {\r
+               global $core;\r
+               $title = sprintf(__('Répartition pour %d'), $a);\r
+               $chart = new cubeGoogleCharts($type, $width, $height);\r
+               $chart->setTitle($title);\r
+               \r
+               $total = array_sum($datas);\r
+               $i = 1;\r
+               $others = 0;\r
+               \r
+               $types=$core->client_type;\r
+               $types[3]='TPE / PME';\r
+               \r
+               foreach ($datas as $c => $ca) {\r
+                       if($c==0){\r
+                               continue;\r
+                       }\r
+                       if ($i <= $max) {\r
+                               $chart->addData($ca, null, $types[$c]);\r
+                               $i++;\r
+                       } else {\r
+                               $others += $ca;\r
+                       }\r
+               }\r
+               if ($others > 0) {\r
+                       $chart->addData($others, null, __('Autres'));\r
+               }\r
+\r
+               return $chart->display($title);\r
+       }\r
+       \r
+       protected static function _caSegment($req,$title){\r
+       global $core;\r
+       $r = $core->con->select($req);\r
+       $segments=array();\r
+               while($r->fetch()){\r
+                       $annees[]=$r->annee;\r
+                       $segments[$r->type][$r->annee]=$r->ca;\r
+               }\r
+               \r
+               $chiffresa=array();\r
+               $chiffreta=array();\r
+               foreach($segments as $type=>$tab){\r
+\r
+               if($type==1){\r
+                       $type=3;\r
+               }\r
+                       foreach($tab as $a=>$ca){\r
+                               if(!isset($chiffresa[$a])){\r
+                                       $chiffresa[$a]=array();\r
+                                       $chiffreta[$a]=0;\r
+                               }\r
+                               if(!isset($chiffresa[$a][$type])){\r
+                                       $chiffresa[$a][$type]=0;\r
+                               }\r
+                               $chiffresa[$a][$type]+=$ca;\r
+                               $chiffreta[$a]+=$ca;\r
+                       }\r
+                       \r
+               }\r
+               \r
+               $annees=array_unique($annees);\r
+               sort($annees);\r
+               \r
+               \r
+               $res = commonPage::bh();\r
+               $res .= '<table class="liste">';\r
+               \r
+               $res .= '<tr><td colspan="' . (count($annees) + 2) . '">';\r
+               $a = date('Y') - 1;\r
+               $res .= self::caSegmentChart($a, $chiffresa[$a], 'p3', 440, 150);\r
+               $a++;\r
+               $res .= self::caSegmentChart($a, $chiffresa[$a], 'p3', 500, 200);\r
+               $res .= '</td></tr>';\r
+               \r
+               $res .= '<tr><th><strong>' . $title . '</strong></th>';\r
+               foreach ($annees as $annee) {\r
+                       $total_annee[$annee] = 0;\r
+                       $res .= '<th>' . $annee . '</th>';\r
+               }\r
+               $res .= '<th><em>' . __('Total') . '</em></th>';\r
+               $res .= '</tr>';\r
+               $i = 0;\r
+               foreach ($segments as $type => $tab) {\r
+                       $odd = (cubeMath::isOdd($i)) ? ' class="odd"' : '';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $core->client_type[$type] . '</td>';\r
+\r
+                       $total_type = 0;\r
+                       \r
+                       foreach ($annees as $annee) {\r
+                               if (isset($tab[$annee])) {\r
+                                       $ca = self::format($tab[$annee], true);\r
+                                       $part=round(($tab[$annee]/$chiffreta[$annee])*100).'%';\r
+                                       $col = $ca . ' (' . $part . ')';\r
+                                       $total_type += $tab[$annee];\r
+                                       $total_annee[$annee] += $tab[$annee];\r
+                               } else {\r
+                                       $part = '-';\r
+                                       $col = '-';\r
+                               }\r
+                               $res .= '<td>' . $col . '</td>';\r
+                       }\r
+\r
+                       $res .= '<td><em>' . self::format($total_type, true).'</em></td>';\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               $res .= '<tr><td><strong>' . __('Total') . '</strong></td>';\r
+               foreach ($annees as $annee) {\r
+                       if (isset($total_annee[$annee])) {\r
+                               $c = $total_consomme_annee[$annee];\r
+                               $p = $total_prevu_annee[$annee];\r
+                               $res .= '<td><strong>' . self::format($total_annee[$annee], true) .'</strong></td>';\r
+                       }\r
+               }\r
+               \r
+               $res .= '<td><strong><em>' . ''.'</em></strong></td>';\r
+               $res .= '</tr>';\r
+               $res .= '</table>';\r
+               $res .= commonPage::bf();\r
+               return $res;\r
+       }\r
 \r
        public static function caWorkRate($chiffres, $total) {\r
                global $core;\r
@@ -451,6 +590,4 @@ class extranetPageChiffres {
                return $res;\r
        }\r
 \r
-}\r
-\r
-?>
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/inc/extranet/Controlleur/class.extranet.tools.php b/inc/extranet/Controlleur/class.extranet.tools.php
new file mode 100644 (file)
index 0000000..b54ad27
--- /dev/null
@@ -0,0 +1,219 @@
+<?php
+
+class extranetTools {
+
+       public static function hub($args) {
+               global $core;
+               $args = cubePage::getArgs($args);
+
+               $function = array_shift($args);
+
+               if (!isset($_GET['light'])) {
+                       echo commonPage::header($args);
+               }
+
+               $cb = array('extranetTools', $function);
+               if (is_callable($cb)) {
+                       echo call_user_func($cb, $args);
+               }
+
+               if (!isset($_GET['light'])) {
+                       echo commonPage::footer();
+               }
+       }
+
+       public static function urlDecoder($args) {
+               global $js;
+               $js[] = JS_PATH.'/urldecoder.js';
+
+               global $core;
+               $res = commonPage::barre();
+               $res .= commonPage::tMain();
+               $res .= commonPage::bh();
+               $res.='<form id="urlDecoder" method="post">';
+               $res.='<table class="liste">';
+               $res.='<tr><th colspan="2"><strong>' . __('Décoder une URL') . ' (' . __('de la forme') . ' : http%3A%2F%2Fwww )</strong></th></tr>';
+               $res.='<tr><td>Collez l\'url à décoder</td><td><textarea id="input"></textarea></td></tr>';
+               $res.='<tr><td>Url décodée</td><td><textarea id="output"></textarea></td></tr>';
+               $res.='</table>';
+               $res.='</form>';
+               $res .= '</div>';
+               $res .= commonPage::bf();
+               $res .= commonPage::bMain();
+               return $res;
+       }
+
+       public static function tube($args) {
+               global $css, $js;
+
+               $css = array();
+               $js[] = JS_PATH . '/tube.js';
+               $js[] = JS_PATH . '/modernizr.js';
+
+               $url = $_GET['u'];
+               $hash = sha1($url);
+
+               $web = '/tube/' . $hash . '/';
+               $dir = ROOT . $web;
+               if (!file_exists($dir)) {
+
+                       mkdir($dir, 0777, true);
+                       $ext = files::getExtension($url);
+                       $original = $dir . 'video.' . $ext;
+                       copy($url, $original);
+
+                       require_once ROOT . '/inc/ws/Util/class.ws.tools.php';
+                       wsTools::encodeWebVideos($original);
+               }
+
+
+               $loop = isset($_GET['loop']) ? $_GET['loop'] : 0;
+               $autoplay = isset($_GET['autoplay']) ? $_GET['autoplay'] : 0;
+               $controls = isset($_GET['controls']) ? $_GET['controls'] : 1;
+
+               $fv = array('video' => $url,
+                       'autoPlay' => $autoplay == 1,
+                       'controls' => $controls == 1,
+                       'loop' => $loop == 1);
+
+               if (file_exists($dir . 'video.jpg')) {
+                       $poster = $web . 'video.jpg';
+                       $fv['poster'] = 'http://' . $_SERVER['HTTP_HOST'] . $poster;
+               }
+
+               $res = '<style type="text/css">';
+               $res.='html, body {margin: 0;padding: 0;height: 100%;color:#fff;overflow:hidden;}';
+               $res.='body{background:#000;}';
+               $res.='video{width:100%;height:100%;}';
+               $res.='#header{display:none;}';
+               $res.='</style>';
+
+               $alt = '<video width="100%" height="100%" data-src="' . $web . '"';
+               if ($controls) {
+                       $alt.=' controls="controls"';
+               }
+               if ($loop) {
+                       $alt.=' loop="loop"';
+               }
+               if ($autoplay) {
+                       $alt.=' autoplay="autoplay"';
+               }
+               if (isset($poster)) {
+                       $alt.=' poster="' . $web . 'video.jpg"';
+               }
+               $alt .= '>';
+               $alt .= '</video>';
+
+
+               $res .= cubeMedia::flash2('/swf/video.swf', '100%', '100%', $fv, 'video', '', 10, '#000000', $alt, true);
+
+               //ob_end_clean();
+               echo $res;
+               //exit;
+       }
+
+       public static function browserInfos($args) {
+               global $core;
+               global $jsnomerge;
+               global $js;
+               global $jsvar;
+
+               $jsnomerge[] = 'http://www.featureblend.com/flash_detect_1-0-4/flash_detect_min.js';
+               $js[] = JS_PATH . '/browserInfos.js';
+               $jsvar['NO_FLASH'] = __("Adobe Flash Player non détecté");
+               $res = commonPage::barre();
+               $res .= commonPage::tMain();
+               $res .= commonPage::bh();
+               $res.='<table class="liste">';
+               $res.='<tr><th colspan="2"><strong>' . __('Informations concernant votre navigateur') . '</strong></th></tr>';
+               $res.='<tr><td>' . __('Navigateur') . '</td><td>' . $_SERVER['HTTP_USER_AGENT'] . '</td></tr>';
+               $res.='<tr><td>' . __('Adresse IP') . '</td><td>' . $_SERVER['REMOTE_ADDR'] . '</td></tr>';
+               $res.='<tr><td>' . __('Adobe Flash Player') . '</td><td class="flashversion"></td></tr>';
+               $res.='</table>';
+               $res .= '</div>';
+               $res .= commonPage::bf();
+               $res .= commonPage::bMain();
+               return $res;
+       }
+
+       public static function favicon($args) {
+               global $core;
+               $res = commonPage::barre();
+               $res .= commonPage::tMain();
+               $res .= commonPage::bh();
+               $res.='<form action="' . SITE_PATH . 'tools/makeFavicon" method="post" class="notajax" enctype="multipart/form-data">';
+               $res.='<table class="liste">';
+               $res.='<tr><th><strong>' . __('Générer un favicon') . '</strong></th></tr>';
+               $res.='<tr><td>' . __('Veuillez charger une image carrée (dimensions optimales : 256x256 px)') . '</td></tr>';
+               $res.='<tr class="odd"><td><input type="file" name="file" /></td></tr>';
+               $res.='<tr><td class="right"><a href="#" class="submit">' . $core->typo->BoutonOK(__('Générer le favicon')) . '</a></td></td>';
+               $res.='</table>';
+               $res.='</form>';
+               $res .= '</div>';
+               $res .= commonPage::bf();
+               $res .= commonPage::bMain();
+               return $res;
+       }
+
+       public static function makeFavicon() {
+
+               $tmp = cubeFiles::tempdir();
+               mkdir($tmp, 0777, true);
+
+
+
+               $upload = $_FILES['file']['tmp_name'];
+
+               $icotool = new cubeCommandLine('icotool');
+               $icotool->setArg('c');
+               $icotool->setArg('o', $tmp . '/favicon.ico');
+
+               $sizes = array(16, 32, 57, 64, 72, 114, 128, 256);
+               $apple = array(114, 72, 57);
+
+
+               foreach ($sizes as $s) {
+                       if (in_array($s, $apple)) {
+                               $r = $tmp . '/favicon-ios-' . $s . '.png';
+                       } else {
+                               $r = $tmp . '/ico-' . $s . '.png';
+                       }
+                       $it = new cubeImageTools();
+                       $it->loadImage($upload);
+                       $it->resize($s, $s, 'crop', true, 'C', 'M', 'transparent');
+                       $it->output('png', $r);
+                       if (in_array($s, $apple)) {
+                               continue;
+                       }
+                       $icotool->setArg(null, $r);
+               }
+
+               $icotool->execute();
+
+               rename($tmp . '/ico-16.png', $tmp . '/favicon.png');
+
+               foreach ($sizes as $s) {
+                       if ($s == 16 || in_array($s, $apple)) {
+                               continue;
+                       }
+                       unlink($tmp . '/ico-' . $s . '.png');
+               }
+
+               $tmpfile = cubeFiles::tempnam() . '.zip';
+
+               $zip = new cubeCommandLine('zip');
+               $zip->cd($tmp);
+               $zip->setArg(null, $tmpfile);
+               $zip->setArg('0');
+               $zip->setArg('u');
+               $zip->setArg('r');
+               $zip->setArg('X');
+               $zip->setArg(null, '.');
+               $zip->execute();
+
+               cubeHTTP::downloadFile($tmpfile, 'favicon.zip');
+       }
+
+}
+
+?>
index a7144638eec7f55fa693970be17fe7f4fdd3b6c0..bd6603ece26cc820f27f604821eefd041e3590bd 100644 (file)
@@ -1,6 +1,6 @@
 <?php\r
 \r
-class extranetUrl {\r
+class extranetUrl { \r
 \r
        public static function clients($args) {\r
                global $core;\r
@@ -42,7 +42,7 @@ class extranetUrl {
                $res .= '<tr><th>' . commonUrl::orderby('#', 'entreprise_id', $settings, 'sort' . $change) . '</th>';\r
                $res .= '<th>' . commonUrl::orderby(__('Raison sociale'), 'nom', $settings, 'sort' . $change) . '</th>';\r
                $res .= '<th>' . __('Contacts') . '</th>';\r
-               $res .= '<th>' . __('Notes') . '</th>';\r
+               $res .= '<th>' . __('Type') . '</th>';\r
                $res .= '<th>' . commonUrl::orderby('<abbr title="' . __("Chiffre d'affaire") . '">CA</abbr>', 'ca', $settings, 'sort' . $change) . '</th>';\r
                $res .= '<th>' . commonUrl::orderby('Impayés', 'impaye', $settings, 'sort' . $change) . '</th>';\r
                $res .= '<th class="min"></th><th class="min"></th></tr>';\r
@@ -62,7 +62,7 @@ class extranetUrl {
                        }\r
 \r
                        $res .= '<td id="contacts_' . $client->entreprise_id . '">' . implode(', ', $contacts) . '</td>';\r
-                       $res .= '<td class="action center"><a href="#" class="popup" rel="formNotes/' . $client->entreprise_id . '">' . cubeMedia::image(IMG . '/postit.png') . '</a></td>';\r
+                       $res .= '<td class="nowrap">'.$core->client_type[$client->type].'</td>';\r
                        $res .= '<td class="nowrap">';\r
                        if ($client->ca) {\r
                                $res .= '<a href="#" class="popup" rel="clientDetailCa/' . $client->entreprise_id . '" title="' . __("Voir le détail du chiffre d'affaire") . '">' . number_format($client->ca, 0, ',', ' ') . '</a>';\r
@@ -159,8 +159,9 @@ class extranetUrl {
                $res .= '<tr><td>' . __('Ville') . '</td><td>' . form::field('ville', 30, 128, $client->ville) . '</td></tr>';\r
                $res .= '<tr><td>' . __('Pays') . '</td><td>' . form::combo('pays', cubeCountry::getList(), $client->pays) . '</td></tr>';\r
                $res .= '<tr><td>' . __('Adresse de facturaton') . '</td><td>' . form::textarea('adresse_facturation', 40, 3, $client->adresse_facturation) . '</td></tr>';\r
-               $res.='<tr><td>' . __('Site internet') . '</td><td>' . form::field('site', 30, 128, $client->site) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Site internet') . '</td><td>' . form::field('site', 30, 128, $client->site) . '</td></tr>';\r
                $res .= '<tr><td>' . __('Numéro de TVA intracommunautaire') . '</td><td>' . form::field('tva_intra', 15, 13, $client->tva_intra) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Type de société') . '</td><td>' . form::combo('type', array_flip($core->client_type), $client->type). '</td></tr>';\r
                $res .= '<tr class="light"><th colspan="2" class="light"><strong>' . __('Fluidbook Workshop') . '</strong></th></tr>';\r
                $res .= '<tr class="odd"><td>' . __('Grade') . '</td><td>' . form::combo('ws_grade', array_flip($core->ws_grades), $client->ws_grade) . '</td></tr>';\r
                if ($entreprise_id == 'new' || !$client->ws_admin) {\r
diff --git a/inc/extranet/Controlleur/url/_common.php b/inc/extranet/Controlleur/url/_common.php
new file mode 100644 (file)
index 0000000..1b991eb
--- /dev/null
@@ -0,0 +1,10 @@
+<?php\r
+$urlClasses['extranetUrlClient'] = dirname(__FILE__) . '/class.extranet.url.client.php';\r
+$urlClasses['extranetUrlFacture'] = dirname(__FILE__) . '/class.extranet.url.facture.php';\r
+$urlClasses['extranetUrlDevis'] = dirname(__FILE__) . '/class.extranet.url.devis.php';\r
+$urlClasses['extranetUrlTimereport'] = dirname(__FILE__) . '/class.extranet.url.timereport.php';\r
+$urlClasses['extranetUrlProjet'] = dirname(__FILE__) . '/class.extranet.url.projet.php';\r
+\r
+$__autoload += $urlClasses;\r
+\r
+?>
\ No newline at end of file
diff --git a/inc/extranet/Controlleur/url/class.extranet.url.client.php b/inc/extranet/Controlleur/url/class.extranet.url.client.php
new file mode 100644 (file)
index 0000000..d47605e
--- /dev/null
@@ -0,0 +1,278 @@
+<?php\r
+\r
+class extranetUrlClient{\r
+       public static function clients($args)\r
+       {\r
+               global $core;\r
+               cubePage::truePopup();\r
+               cubePage::autoComplete();\r
+               cubePage::emptyfield();\r
+               commonDroits::min(1);\r
+               $settings = $core->user->getSettings('clients');\r
+\r
+               $shortcuts = array();\r
+               $shortcuts[] = '<a href="#" class="popup" rel="formClient/new">' . $core->typo->Ajouter('Créer un nouveau client') . '</a>';\r
+               $filtres = array();\r
+               $filtres[] = new commonFiltre(__('Ayant un projet'), 'status_client_projet', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Ayant des impayés'), 'impaye', $settings['filtres']);\r
+               $res = commonPage::barre($filtres, 'filtreClients', 'clients', $shortcuts);\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeClients">';\r
+               $res .= self::listeClients();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function listeClients($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $settings = is_null($settings)?$core->user->getSettings('clients'):$settings;\r
+               $change = is_null($dashboard)?'Client':'Dashboard/' . $dashboard;\r
+               $dao = new commonDAOEntreprise($core->con);\r
+               if (isset($settings['search']) && !is_null($settings['search'])) {\r
+                       $dao->setSearch($settings['search']);\r
+               }\r
+               $dao->setFiltres($settings['filtres']);\r
+               $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
+\r
+               $res = '<table class="liste">';\r
+               $res .= '<tr><th>' . commonUrl::orderby('#', 'entreprise_id', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Raison sociale'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . __('Contacts') . '</th>';\r
+               $res .= '<th>' . __('Notes') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby('<abbr title="' . __("Chiffre d'affaire") . '">CA</abbr>', 'ca', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby('Impayés', 'impaye', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="min"></th><th class="min"></th></tr>';\r
+               $i = 0;\r
+               foreach($liste as $id => $client) {\r
+                       if (!is_array($client->contacts)) {\r
+                               fb($client);\r
+                               continue;\r
+                       }\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $client->entreprise_id . '</td>';\r
+                       $res .= '<td>' . $client->nom . '</td>';\r
+                       $contacts = array();\r
+\r
+                       foreach($client->contacts as $c) {\r
+                               $contacts[] = '<a href="#" class="popup" rel="formContact/' . $c->utilisateur_id . '">' . $c->prenom . ' ' . $c->nom . '</a>';\r
+                       }\r
+\r
+                       $res .= '<td id="contacts_' . $client->entreprise_id . '">' . implode(', ', $contacts) . '</td>';\r
+                       $res .= '<td class="action center"><a href="#" class="popup" rel="formNotes/' . $client->entreprise_id . '">' . cubeMedia::image(IMG . '/postit.png') . '</a></td>';\r
+                       $res .= '<td class="nowrap">';\r
+                       if ($client->ca) {\r
+                               $res .= '<a href="#" class="popup" rel="clientDetailCa/' . $client->entreprise_id . '" title="' . __("Voir le détail du chiffre d'affaire") . '">' . number_format($client->ca, 0, ',', ' ') . '</a>';\r
+                       }\r
+\r
+                       $res .= '</td>';\r
+                       if ($client->impaye) {\r
+                               $res .= '<td class="nowrap"><a href="#" class="popup" rel="clientDetailImpaye/' . $client->entreprise_id . '">' . number_format($client->impaye, 0, '.', ' ') . '</a></td>';\r
+                       } else {\r
+                               $res .= '<td></td>';\r
+                       }\r
+\r
+                       $res .= '<td class="action"><a href="#" class="popup" rel="formClient/' . $client->entreprise_id . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                       if (is_null($client->ca)) {\r
+                               $res .= '<td class="action"><a href="#" class="ajax" rel="supprimeClient/' . $client->entreprise_id . '" title="' . __('Êtes vous certain de vouloir supprimer ce client ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
+                       } else {\r
+                               $res .= '<td></td>';\r
+                       }\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!isset($settings['search']) || is_null($settings['search'])) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td colspan="10">';\r
+                       $res .= commonPage::pager($settings['page'], $dao->count() , $settings['par_page'], 'page' . $change . '/%d');\r
+                       $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('clients'));\r
+                       $res .= '</td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function clientDetailCa($entreprise_id)\r
+       {\r
+               global $core;\r
+               $dao = new commonDAOEntreprise($core->con);\r
+               $annees = $dao->getCaDetails($entreprise_id);\r
+               $res = '';\r
+               $i = 0;\r
+               foreach($annees as $annee => $ca) {\r
+                       $class = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $class . '><td><strong>' . $annee . '</strong></td><td>' . number_format($ca, 0, ',', ' ') . ' €</td></tr>';\r
+                       $i++;\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public static function clientDetailImpaye($entreprise_id)\r
+       {\r
+               global $core;\r
+               $dao = new extranetDAOFacture($core->con);\r
+               $daoClient = new commonDAOEntreprise($core->con);\r
+               $factures = $dao->getImpayesOfClient($entreprise_id);\r
+               $client = $daoClient->selectById($entreprise_id);\r
+               $res = '';\r
+               $i = 0;\r
+               foreach($factures as $facture) {\r
+                       $class = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $class . '>';\r
+                       $res .= '<td>' . $facture->facture_id . '</td>';\r
+                       $res .= '<td>';\r
+                       if ($facture->facture_id > 0) {\r
+                               $res .= '<a href="' . SITE_PATH . 'voirfacture/' . $facture->facture_id . '" class="popupA4">' . $facture->nom . '</a>';\r
+                       } else {\r
+                               $res .= $facture->nom ;\r
+                       }\r
+                       $res .= '</td>';\r
+                       $tva = cubeTaxes::tva($client->pays);\r
+                       $res .= '<td>' . number_format($facture->total_ht, 0, ',', '') . ' €';\r
+                       if ($tva > 0 && $tva != 'UE') {\r
+                               $res .= ' HT </td><td> ' . number_format(cubePrices::HTtoTTC($facture->total_ht, $tva), 2, ',', '') . ' € TTC';\r
+                       } else {\r
+                               $res .= '<td></td>';\r
+                       }\r
+                       $res .= '</td></tr>';\r
+                       $i++;\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public static function formClient($entreprise_id = 'new')\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $dao = new commonDAOEntreprise($core->con);\r
+               $daoUtilisateur = new commonDAOUtilisateur($core->con);\r
+               if ($entreprise_id == 'new') {\r
+                       $client = $dao->cree();\r
+               } else {\r
+                       $client = $dao->selectById($entreprise_id);\r
+               } \r
+\r
+               $res = '<tr><td>' . __('Numéro de client') . '</td><td>' . form::hidden('entreprise_id', $client->entreprise_id) . '' . $client->entreprise_id . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Raison sociale') . '</td><td>' . form::field('nom', 30, 128, $client->nom) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse') . '</td><td>' . form::textarea('adresse', 40, 3, $client->adresse) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Code postal') . '</td><td>' . form::field('code_postal', 10, 20, $client->code_postal) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Ville') . '</td><td>' . form::field('ville', 30, 128, $client->ville) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Pays') . '</td><td>' . form::combo('pays', cubeCountry::getList(), $client->pays) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse de facturation') . '</td><td>' . form::textarea('adresse_facturation', 40, 3, $client->adresse_facturation) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Numéro de TVA intracommunautaire') . '</td><td>' . form::field('tva_intra', 15, 13, $client->tva_intra) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Type de société') . '</td><td>' . form::combo('type', $core->client_type, $client->type). '</td></tr>';\r
+               $res .= '<tr class="light"><th colspan="2" class="light"><strong>' . __('Fluidbook Workshop') . '</strong></th></tr>';\r
+               $res .= '<tr class="odd"><td>' . __('Grade') . '</td><td>' . form::combo('ws_grade', array_flip($core->ws_grades), $client->ws_grade) . '</td></tr>';\r
+               if ($entreprise_id == 'new' || !$client->ws_admin) {\r
+                       $class = 'empty-field';\r
+                       $default_id = '';\r
+                       $default = __('Entrez le nom du revendeur ou de l\'administrateur');\r
+               } else {\r
+                       $class = '';\r
+                       $default_id = $client->ws_admin;\r
+                       $wsa = $daoUtilisateur->selectById($client->ws_admin, 'utilisateurs_entreprise');\r
+                       $default = $wsa->utilisateur_id . ' - ' . $wsa->rs . ' (' . $wsa->prenom . ' ' . $wsa->nom . ')';\r
+               }\r
+\r
+               $d = $dao->getWSDatas($entreprise_id);\r
+\r
+               $res .= '<tr class="odd"><td>' . __('Revendeur / Administrateur') . '</td><td>' . form::field('ws_admin_nom', 60, 128, $default, $class) . form::hidden('ws_admin', $default_id) . '</td></tr>';\r
+               if (!is_null($d)) {\r
+                       $res .= '<tr class="odd"><td>' . __('Entité facturable') . '</td><td>' . $d->facturable->prenom . ' ' . $d->facturable->nom . ' (' . $d->facturable->rs . ')</td></tr>';\r
+                       $res .= '<tr class="odd"><td>' . __('Administrateur responsable') . '</td><td>' . $d->administrateur->prenom . ' ' . $d->administrateur->nom . ' (' . $d->administrateur->rs . ')</td></tr>';\r
+               }\r
+               if ($entreprise_id == 'new') {\r
+                       $daoContact = new commonDAOClient($core->con);\r
+                       $contact = $daoContact->cree();\r
+                       $res .= '<tr><th colspan="2" class="light"><strong>' . __('Contact') . '</strong></th></tr>';\r
+                       $res .= '<tr><td>' . __('Adresse e-mail') . '</td><td>' . form::field(array('contact[email]'), 30, 128, $contact->email) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Mot de passe') . '</td><td>' . form::field(array('contact[password]'), 30, 128, $contact->password) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Prénom') . '</td><td>' . form::field(array('contact[prenom]'), 30, 128, $contact->prenom) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Nom') . '</td><td>' . form::field(array('contact[nom]'), 30, 128, $contact->nom) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Téléphone') . '</td><td>' . form::field(array('contact[telephone]'), 20, 128, $contact->telephone) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Mobile') . '</td><td>' . form::field(array('contact[mobile]'), 20, 128, $contact->mobile) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Fax') . '</td><td>' . form::field(array('contact[fax]'), 20, 128, $contact->fax) . '</td></tr>';\r
+                       $res .= '<tr><td>' . __('Langue') . '</td><td>' . form::combo(array('contact[lang]'), cubeLang::getAvailableLangs(true), $contact->lang) . '</td></tr>';\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public static function listeContacts($entreprise_id)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $dao = new commonDAOEntreprise($core->con);\r
+               $contacts = $dao->getContacts($entreprise_id);\r
+\r
+               $res = '<table class="liste light">';\r
+               $res .= '<tr class="light"><th colspan="5"><a href="" class="popup" rel="formContact/new/' . $entreprise_id . '">' . $core->typo->Contact('Ajouter un contact') . '</a></th></tr>';\r
+               $i = 0;\r
+               foreach($contacts as $contact) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td>' . trim($contact->prenom . ' ' . $contact->nom) . '</td>';\r
+                       $res .= '<td><a href="mailto:' . trim($contact->prenom . ' ' . $contact->nom) . '<' . $contact->email . '>">' . $contact->email . '</a></td>';\r
+                       $res .= '<td class="min"><a href="' . SITE_PATH . 'fichiers/' . $contact->utilisateur_id . '">FTP</a></td>';\r
+                       $res .= '<td><a class="ajax" href="#" rel="connectAs/' . $contact->utilisateur_id . '">Se connecter comme ...</a></td>';\r
+                       $res .= '<td class="right"><a href="#" rel="formContact/' . $contact->utilisateur_id . '" class="popup">' . cubeMedia::image(IMG . '/edit.png') . '</a></td></tr>';\r
+                       $i++;\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formContact($client_id = 'new', $entreprise_id = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+\r
+               $dao = new commonDAOClient($core->con);\r
+               if ($client_id == 'new') {\r
+                       $client = $dao->creeFromEntreprise($entreprise_id);\r
+               } else {\r
+                       $client = $dao->selectById($client_id);\r
+               }\r
+\r
+               $res = '<tr><td>' . __('Numéro de client') . '</td><td>' . form::hidden('grade', 0) . form::hidden('entreprise', $client->entreprise) . form::hidden('utilisateur_id', $client->utilisateur_id) . '' . $client->utilisateur_id . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse e-mail') . '</td><td>' . form::field('email', 30, 128, $client->email) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Mot de passe') . '</td><td>' . form::field('password', 30, 128, $client->password) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Prénom du contact') . '</td><td>' . form::field('prenom', 30, 128, $client->prenom) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Nom du contact') . '</td><td>' . form::field('nom', 30, 128, $client->nom) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Adresse') . '</td><td>' . form::textarea('adresse', 40, 3, $client->adresse) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Code postal') . '</td><td>' . form::field('code_postal', 10, 20, $client->code_postal) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Ville') . '</td><td>' . form::field('ville', 30, 128, $client->ville) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Pays') . '</td><td>' . form::combo('pays', cubeCountry::getList(), $client->pays) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Téléphone') . '</td><td>' . form::field('telephone', 20, 128, $client->telephone) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Mobile') . '</td><td>' . form::field('mobile', 20, 128, $client->mobile) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Fax') . '</td><td>' . form::field('fax', 20, 128, $client->fax) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Langue') . '</td><td>' . form::combo('lang', cubeLang::getAvailableLangs(true), $client->lang) . '</td></tr>';\r
+               if ($client_id != 'new') {\r
+                       $res .= '<tr><td colspan="2">' . cubeMedia::spacer(10, 10) . '</td></tr>';\r
+                       $res .= '<tr><td></td><td><a href="' . SITE_PATH . 'fichiers/' . $client->utilisateur_id . '">' . __('FTP') . '</a></td></tr>';\r
+                       $res .= '<tr><td></td><td><a class="ajax" href="#" rel="connectAs/' . $client->utilisateur_id . '">' . __('Se connecter comme ...') . '</a></td></tr>';\r
+                       $res .= '<tr><td>' . __("Paramètres de connexion à l'extranet") . '</td><td>' . __('Adresse') . ' : http://extranet.cubedesigners.com/<br />' . __("Nom d'utilisateur") . ' : ' . $client->email . '<br />' . __('Mot de passe') . ' : ' . $client->password . '</td></tr>';\r
+                       $res .= '<tr><td colspan="2">' . cubeMedia::spacer(10, 10) . '</td></tr>';\r
+                       // $res .= '<tr><td>' . __("Paramètres de connexion au FTP") . '</td><td>' . __('Serveur FTP') . ' : extranet.cubedesigners.com (ftp://extranet.cubedesigners.com)<br />' . __("Nom d'utilisateur") . ' : ' . $client->email . '<br />' . __('Mot de passe') . ' : ' . $client->password . '</td></tr>';\r
+               }\r
+               return $res;\r
+       }\r
+\r
+       public static function formNotes($utilisateur_id)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $dao = new commonDAOUtilisateur($core->con);\r
+               $utilisateur = $dao->selectById($utilisateur_id);\r
+               $res = '<tr><td colspan="2">' . form::hidden('utilisateur_id', $utilisateur_id) . '</td></tr>';\r
+               $res .= '<tr><td colspan="2">' . form::textarea('notes', 100, 30, $utilisateur->notes) . '</td></tr>';\r
+               $res .= '<tr><td colspan="2"></td></tr>';\r
+               return $res;\r
+       }\r
+\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/inc/extranet/Controlleur/url/class.extranet.url.devis.php b/inc/extranet/Controlleur/url/class.extranet.url.devis.php
new file mode 100644 (file)
index 0000000..02d9038
--- /dev/null
@@ -0,0 +1,335 @@
+<?php\r
+class extranetUrlDevis {\r
+       public static function devis($args)\r
+       {\r
+               global $core;\r
+               cubePage::truePopup();\r
+               cubePage::contextMenu();\r
+\r
+               if ($core->user->grade == 0) {\r
+                       return self::devis_client($args);\r
+               }\r
+               $settings = $core->user->getSettings('devis');\r
+               commonDroits::min(1);\r
+\r
+               $shortcuts = array();\r
+               $shortcuts[] = '<a href="' . SITE_PATH . 'editedevis/new">' . $core->typo->Ajouter('Créer un devis') . '</a>';\r
+\r
+               $filtres = array();\r
+               $filtres[] = new commonFiltre(__('Créées par'), 'equipier', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Status'), 'status_devis', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Année'), 'annee_facture', $settings['filtres']);\r
+\r
+               $res = commonPage::barre($filtres, 'filtreDevis', 'devis' , $shortcuts);\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeDevis">';\r
+               $res .= self::listeDevis();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function devis_client($args)\r
+       {\r
+               global $core;\r
+\r
+               $res = commonPage::barre();\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeDevis">';\r
+               $res .= self::listeDevis();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function listeDevis($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+\r
+               if ($core->user->grade == 0) {\r
+                       return self::listeDevisClient($dashboard, $settings);\r
+               } else {\r
+                       return self::listeDevisEquipier($dashboard, $settings);\r
+               }\r
+       }\r
+\r
+       public static function contextDevis($id)\r
+       {\r
+               global $core;\r
+               $res = '<div class="contextMenu" id="' . $id . '">';\r
+               $res .= '<ul>';\r
+               $res .= '<li class="head">' . __("Changer le status du devis") . '</li>';\r
+               foreach($core->devis_status as $k => $v) {\r
+                       if ($k == 0) {\r
+                               continue;\r
+                       }\r
+                       $res .= '<li><a href="#" rel="changeDevisStatus/$1/' . $k . '" class="ajax">' . $v . '</a></li>';\r
+                       if ($k == 2) {\r
+                               $res .= '<li><a href="#" rel="changeDevisStatus/$1/' . $k . '/createProjet" class="ajax">' . __('Valider puis créer le projet correspondant') . '</a></li>';\r
+                       }\r
+               }\r
+               $res .= '</ul></div>';\r
+               return $res;\r
+       }\r
+\r
+       public static function listeDevisEquipier($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $settings = is_null($settings)?$core->user->getSettings('devis'):$settings;\r
+               $change = is_null($dashboard)?'Devis':'Dashboard/' . $dashboard;\r
+               $context_id = is_null($dashboard)?'contextDevis':'contextDashboard_' . $dashboard;\r
+\r
+               $dao = new extranetDAODevis($core->con);\r
+               if (isset($settings['search']) && !is_null($settings['search'])) {\r
+                       $dao->setSearch($settings['search']);\r
+               }\r
+               $dao->setFiltres($settings['filtres']);\r
+               $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
+               $res = self::contextDevis($context_id);\r
+               $res .= '<table class="liste">';\r
+               $res .= '<tr><th>' . commonUrl::orderby('#', 'devis_id', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Nom'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Client'), 'client', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Crée par'), 'createur', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Date'), 'date_creation', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Montant HT'), 'total_ht', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Status'), 'status', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="min"></th><th class="min"></th><th class="min"></th></tr>';\r
+               $i = 0;\r
+               foreach($liste as $devis) {\r
+                       $droits = extranetDroits::devis($devis, 'w', false);\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $devis->devis_id . '</td>';\r
+                       $res .= '<td>' . $devis->nom . '</td>';\r
+                       $res .= '<td>' . $devis->client . '</td>';\r
+                       $res .= '<td>' . $devis->createur . '</td>';\r
+                       $res .= '<td>' . date(__('d/m/Y'), $devis->date_creation) . '</td>';\r
+                       $res .= '<td>' . $devis->total_ht . '</td>';\r
+\r
+                       if ($devis->status == 0) {\r
+                               $res .= '<td>' . $core->devis_status[$devis->status] . '</td>';\r
+                       } else {\r
+                               if ($droits) {\r
+                                       $res .= '<td><a href="#" class="openContextMenu" rel="' . $context_id . '" rev="' . $devis->devis_id . '">' . $core->devis_status[$devis->status] . '</a></td>';\r
+                               } else {\r
+                                       $res .= '<td>' . $core->devis_status[$devis->status] . '</td>';\r
+                               }\r
+                       }\r
+\r
+                       if (in_array($devis->status, array(0, 1)) && $droits) {\r
+                               $res .= '<td class="action"><a href="' . SITE_PATH . 'editedevis/' . $devis->devis_id . '" title="' . __('Editer le devis') . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                       } else {\r
+                               $res .= '<td></td>';\r
+                       }\r
+                       $res .= '<td><a href="' . SITE_PATH . 'voirdevis/' . $devis->devis_id . '" class="popupA4" title="' . __('Voir le devis') . '">' . cubeMedia::image(IMG . '/view.png') . '</a></td>';\r
+                       if ($devis->status == 0) {\r
+                               if ($droits) {\r
+                                       $res .= '<td class="action"><a href="#" class="ajax" rel="supprimeDevis/' . $devis->devis_id . '" title="' . __('Êtes vous certain de vouloir supprimer ce devis ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
+                               } else {\r
+                                       $res .= '<td></td>';\r
+                               }\r
+                       } elseif ($devis->status >= 1) {\r
+                               $res .= '<td><a href="#" class="ajax" rel="duplicateDevis/' . $devis->devis_id . '" title="' . __('Dupliquer le devis') . '">' . cubeMedia::image(IMG . '/duplicate.png') . '</a></td>';\r
+                       }\r
+\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!isset($settings['search']) || is_null($settings['search'])) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td colspan="10">';\r
+                       $res .= commonPage::pager($settings['page'], $dao->count(), $settings['par_page'], 'page' . $change . '/%d');\r
+                       $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('devis'));\r
+                       $res .= '</td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function listeDevisClient($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               cubePage::truePopup();\r
+\r
+               $dao = new extranetDAODevis($core->con);\r
+               $settings = $core->user->getSettings('devis');\r
+               $liste = $dao->getListeForEntreprise($core->user->entreprise, $settings['orderby'], $settings['sens']);\r
+               $res = '<table class="liste">';\r
+               $res .= '<th>' . commonUrl::orderby(__('Nom'), 'nom', $settings, 'sortDevis') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Date'), 'date_creation', $settings, 'sortDevis') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Montant HT'), 'total_ht', $settings, 'sortDevis') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Status'), 'status', $settings, 'sortDevis') . '</th>';\r
+               $res .= '<th class="min"></th></tr>';\r
+               $i = 0;\r
+               foreach($liste as $devis) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $devis->nom . '</td>';\r
+                       $res .= '<td>' . date(__('d/m/Y'), $devis->date_creation) . '</td>';\r
+                       $res .= '<td>' . $devis->total_ht . '</td>';\r
+                       $res .= '<td>' . $core->devis_status[$devis->status] . '</td>';\r
+                       $res .= '<td><a href="' . SITE_PATH . 'voirdevis/' . $devis->devis_id . '" class="popupA4" title="' . __('Voir le devis') . '">' . cubeMedia::image(IMG . '/view.png') . '</a></td>';\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!count($liste)) {\r
+                       $res .= '<tr><td colspan="6" class="center">' . __("Vous n'avez pour le moment aucun devis associé à votre compte") . '</td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function voirdevis($args)\r
+       {\r
+               global $core;\r
+               // Charge le devis\r
+               $dao = new extranetDAODevis($core->con);\r
+               $devis = $dao->selectById($args[1]);\r
+               // Vérification des droits en lecture de l'utilisateur\r
+               extranetDroits::devis($devis, 'r');\r
+\r
+               cubeHTTP::relayNoCache(ROOT . '/devis/' . $args[1] . '.pdf');\r
+       }\r
+\r
+       public static function editedevis($args)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $res = commonPage::barre();\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= self::formDevis($args[1]);\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function formDevis($devis_id = 'new')\r
+       {\r
+               global $core;\r
+               cubePage::autocomplete();\r
+               cubePage::emptyField();\r
+               cubePage::ui('Sortable');\r
+               commonDroits::min(1);\r
+               $dao = new extranetDAODevis($core->con);\r
+               if ($devis_id == 'new') {\r
+                       $devis = $dao->cree();\r
+               } else {\r
+                       $devis = $dao->selectById($devis_id);\r
+               }\r
+\r
+               $res = '<div id="editeDevis">';\r
+               $res .= '<form action="previewDevis" method="post">';\r
+\r
+               $res .= '<div id="devisTop">';\r
+               // Adresse\r
+               $res .= '<div id="devisAdresse">';\r
+               if ($devis->devis_id == 'new') {\r
+                       $default = __('Entrez le nom du client');\r
+                       $default_id = '';\r
+                       $class = 'empty-field';\r
+               } else {\r
+                       $default = $devis->client;\r
+                       $default_id = $devis->client_id;\r
+                       $class = '';\r
+               }\r
+\r
+               $res .= form::field('client_nom', 40, 128, $default, $class);\r
+               $res .= form::hidden('client', $default_id);\r
+               $res .= '<div id="devisAdresseDisplay">';\r
+               if ($devis->client_id) {\r
+                       $res .= self::adresse($devis->client_id, null, 'devis', $devis->adresse);\r
+               }\r
+               $res .= '</div>';\r
+               $res .= '</div>';\r
+               // Titre\r
+               $res .= '<div id="devisTitre">';\r
+               $res .= form::hidden('devis_id', $devis->devis_id);\r
+               $res .= form::textarea('nom', 40, 4, $devis->nom);\r
+               $res .= '</div>';\r
+               $res .= '</div>';\r
+\r
+               $res .= '<div id="devisMiddle">';\r
+               $res .= '<div id="devisLignes">';\r
+               // Lignes du devis\r
+               $nb_lignes = max(4, count($devis->lignes) + 2);\r
+\r
+               for($i = 0;$i < $nb_lignes;$i++) {\r
+                       if (isset($devis->lignes[$i])) {\r
+                               $titre = $devis->lignes[$i]['titre'];\r
+                               $description = $devis->lignes[$i]['description'];\r
+                               $montant = $devis->lignes[$i]['montant'];\r
+                       } else {\r
+                               $titre = $description = $montant = '';\r
+                       }\r
+                       $res .= '<div class="devisLigne">';\r
+                       $res .= '<div class="devisLigneRight">';\r
+                       $res .= form::field(array('montant[]'), 6, 15, $montant) . " €";\r
+                       $res .= '</div>';\r
+                       $res .= '<div class="devisLigneLeft">';\r
+                       $res .= form::field(array('titre[]'), 105, 256, htmlspecialchars($titre, ENT_QUOTES)) . '<br /><br />';\r
+                       $res .= form::textarea(array('description[]'), 110, 4, $description);\r
+                       $res .= '</div>';\r
+\r
+                       $res .= '</div>';\r
+               }\r
+\r
+               $res .= '</div>';\r
+               $res .= '</div>';\r
+               $res .= '<div id="devisBottom">' . cubeMedia::spacer(10, 10) . '</div>';\r
+               $res .= '<div id="devisMail">';\r
+               $res .= '<table>';\r
+               $res .= '<tr><td>' . __('De') . '</td><td>' . $core->user->prenom . ' ' . $core->user->nom . ' &lt;' . $core->user->email . '&gt;</td></tr>';\r
+               $res .= '<tr><td>' . __('Sujet') . '</td><td>' . form::field(array('email[sujet]'), 80, 128, htmlspecialchars($devis->email['sujet'], ENT_QUOTES)) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Corps') . '</td><td>' . form::textarea(array('email[corps]'), 80, 20, $devis->email['corps']) . '</td></tr>';\r
+               $res .= '</table>';\r
+               $res .= '</div>';\r
+               $res .= '<div class="right"><a href="#" class="submit">' . $core->typo->BoutonOK('Enregistrer et prévisualiser') . '</a></div>';\r
+               $res .= '</form>';\r
+               $res .= '</div>';\r
+\r
+               return $res;\r
+       }\r
+\r
+       public static function previewDevis($args)\r
+       {\r
+               global $core;\r
+\r
+               $dao = new extranetDAODevis($core->con);\r
+               $devis = $dao->selectById($args[1]);\r
+\r
+               $daoUtilisateur = new commonDAOUtilisateur($core->con);\r
+               $createur = $devis->createur = $daoUtilisateur->selectById($devis->createur_id);\r
+               $client = $devis->client = $daoUtilisateur->selectById($devis->client_id);\r
+\r
+               $res = commonPage::barre();\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<iframe src="' . SITE_PATH . 'voirdevis/' . $devis->devis_id . '/?junk=' . TIME . '" width="960" height="1000" frameborder="0"></iframe>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="devis_email">';\r
+               $res .= '<table class="liste">';\r
+               $res .= '<tr><td>' . __('De') . '</td><td>' . $createur->prenom . ' ' . $createur->nom . '&lt;' . $createur->email . '&gt;</td></tr>';\r
+               $res .= '<tr class="odd"><td>' . __('A') . '</td><td>' . $client->prenom . ' ' . $client->nom . '&lt;' . $client->email . '&gt;</td></tr>';\r
+               $res .= '<tr><td>' . __('Sujet') . '</td><td>' . $devis->email['sujet'] . '</td></tr>';\r
+               $res .= '<tr class="odd"><td>' . __('Message') . '</td><td>' . nl2br($devis->email['corps'] . "\n\n" . $createur->getSignature()) . '</td></tr>';\r
+               $res .= '<tr><td colspan="2" class="right">';\r
+               $res .= cubeMedia::spacer(40, 40) . '<a href="' . SITE_PATH . 'editedevis/' . $devis->devis_id . '">' . $core->typo->BoutonOK(__('Editer le devis')) . '</a> ';\r
+               $res .= '<a href="#" rel="expedieDevis/0/' . $devis->devis_id . '" class="ajax" title="' . __("Le devis est sur le point d'être validé, mais l'email ne sera pas envoyé. Veuillez confirmer votre choix ?") . '">' . $core->typo->BoutonOK(__('Valider sans envoyer le devis')) . '</a> ';\r
+               $res .= '<a href="#" rel="expedieDevis/1/' . $devis->devis_id . '" class="ajax" title="' . __("Le devis est sur le point d'être envoyé. Veuillez confirmer votre choix ?") . '">' . $core->typo->BoutonOK(__('Valider et envoyer le devis')) . '</a></td></tr>';\r
+               $res .= '</table>';\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/inc/extranet/Controlleur/url/class.extranet.url.facture.php b/inc/extranet/Controlleur/url/class.extranet.url.facture.php
new file mode 100644 (file)
index 0000000..eae5b45
--- /dev/null
@@ -0,0 +1,427 @@
+<?php\r
+\r
+class extranetUrlFacture {\r
+       public static function factures($args)\r
+       {\r
+               global $core;\r
+\r
+               if ($core->user->grade == 0) {\r
+                       return self::factures_client($args);\r
+               }\r
+               $settings = $core->user->getSettings('factures');\r
+\r
+               commonDroits::min(1);\r
+               $shortcuts = array();\r
+               if ($core->user->grade != 3) {\r
+                       $shortcuts[] = '<a href="' . SITE_PATH . 'editefacture/new">' . $core->typo->Ajouter('Créer une facture') . '</a>';\r
+               }\r
+               $shortcuts[] = '<a href="#" rel="formPrintFactures" title="Imprimer les factures" class="popup">' . cubeMedia::image(IMG . '/print.png') . '</a>';\r
+               $filtres = array();\r
+               $filtres[] = new commonFiltre(__('Créées par'), 'equipier', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Status'), 'status_facture', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Année'), 'annee_facture', $settings['filtres']);\r
+               $res = commonPage::barre($filtres , 'filtreFactures', 'factures', $shortcuts);\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeFactures">';\r
+               $res .= self::listeFactures();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function factures_client($args)\r
+       {\r
+               global $core;\r
+               $res = commonPage::barre();\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeFactures">';\r
+               $res .= self::listeFactures();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function contextFacture($id)\r
+       {\r
+               global $core;\r
+               $res = '<div class="contextMenu" id="' . $id . '">';\r
+               $res .= '<ul>';\r
+               $res .= '<li class="head">' . __("Changer le status de la facture") . '</li>';\r
+               foreach($core->factures_status as $k => $v) {\r
+                       if (in_array($k, array(0, 4))) {\r
+                               continue;\r
+                       }\r
+                       if ($k == 2) {\r
+                               $res .= '<li><a href="#" rel="changeFacturePaiement/$1" class="popup">' . $v . '</a></li>';\r
+                       } else {\r
+                               if ($k == 3) {\r
+                                       $title = ' title="' . __("Êtes-vous certain de vouloir annuler cette facture ? Cette action est irreversible et provoquera la création d'un avoir correpondant.") . '"';\r
+                               } else {\r
+                                       $title = '';\r
+                               }\r
+                               $res .= '<li><a href="#" rel="changeFactureStatus/$1/' . $k . '" class="ajax"' . $title . '>' . $v . '</a></li>';\r
+                       }\r
+               }\r
+               $res .= '</ul></div>';\r
+               return $res;\r
+       }\r
+\r
+       public static function listeFactures($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               if ($core->user->grade == 0) {\r
+                       return self::listeFacturesClient($dashboard, $settings);\r
+               } else {\r
+                       return self::listeFacturesEquipier($dashboard, $settings);\r
+               }\r
+       }\r
+\r
+       public static function listeFacturesEquipier($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               cubePage::truePopup();\r
+               cubePage::contextMenu();\r
+\r
+               $settings = is_null($settings)?$core->user->getSettings('factures'):$settings;\r
+               $change = is_null($dashboard)?'Facture':'Dashboard/' . $dashboard;\r
+               $context_id = is_null($dashboard)?'contextFacture':'contextDashboard_' . $dashboard;\r
+               $dao = new extranetDAOFacture($core->con);\r
+               if (isset($settings['search']) && !is_null($settings['search'])) {\r
+                       $dao->setSearch($settings['search']);\r
+               } else {\r
+                       $dao->setFiltres($settings['filtres']);\r
+               }\r
+\r
+               if ($core->user->grade != 3) {\r
+                       $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
+               } else {\r
+                       $liste = $dao->getListeCompta($settings['orderby'], $settings['sens'], $settings['limit']);\r
+               }\r
+\r
+               $res = self::contextFacture($context_id);\r
+               $res .= '<table class="liste">';\r
+               $res .= '<tr><th>' . commonUrl::orderby('#', 'facture_id', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Nom'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Client'), 'client', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Crée par'), 'createur', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Date'), 'date_creation', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Montant HT'), 'total_ht', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Status'), 'status', $settings, 'sort' . $change) . '</th><th class="min"></th><th class="min"></th><th class="min"></th></tr>';\r
+               $i = 0;\r
+               foreach($liste as $facture) {\r
+                       $droits = extranetDroits::facture($facture, 'w', false);\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $facture->facture_id . '</td>';\r
+                       $res .= '<td>' . $facture->nom . '</td>';\r
+                       $res .= '<td>' . $facture->client . '</td>';\r
+                       $res .= '<td>' . $facture->createur . '</td>';\r
+                       $res .= '<td>' . date(__('d/m/Y'), $facture->date_creation) . '</td>';\r
+                       $res .= '<td>' . $facture->total_ht . '</td>';\r
+                       if ($facture->status == 0) {\r
+                               $res .= '<td>' . $core->factures_status[$facture->status] . '</td>';\r
+                               if ($droits) {\r
+                                       $res .= '<td></td>';\r
+                                       $res .= '<td class="action"><a href="' . SITE_PATH . 'editefacture/' . $facture->facture_id . '" title="' . __('Editer la facture') . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                                       $res .= '<td class="action"><a href="#" class="ajax" rel="supprimeFacture/' . $facture->facture_id . '" title="' . __('Êtes vous certain de vouloir supprimer cette facture ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
+                               } else {\r
+                                       $res .= '<td></td><td></td>';\r
+                               }\r
+                       } elseif ($facture->status >= 1) {\r
+                               if ($facture->status < 3) {\r
+                                       if ($droits) {\r
+                                               $res .= '<td><a href="#" class="openContextMenu" rel="' . $context_id . '" rev="' . $facture->facture_id . '">' . $core->factures_status[$facture->status] . '</a></td>';\r
+                                       } else {\r
+                                               $res .= '<td>' . $core->factures_status[$facture->status] . '</td>';\r
+                                       }\r
+                               } else {\r
+                                       $title = $facture->status == 3?__("Voir l'avoir correspondant"):__("Voir la facture annulée correspondante");\r
+                                       $res .= '<td><a href="' . SITE_PATH . 'voirfacture/' . $facture->avoir . '" class="popupA4" title="' . $title . '">' . $core->factures_status[$facture->status] . '</a></td>';\r
+                               }\r
+                               if ($facture->facture_id > 0) {\r
+                                       if ($droits && $facture->status == 1) {\r
+                                               $res .= '<td>' . '<a href="' . SITE_PATH . 'editefacture/' . $facture->facture_id . '" title="' . __('Editer la facture') . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                                       } else {\r
+                                               $res .= '<td></td>';\r
+                                       }\r
+                                       $res .= '<td><a href="' . SITE_PATH . 'voirfacture/' . $facture->facture_id . '" class="popupA4" title="' . __('Voir la facture') . '">' . cubeMedia::image(IMG . '/view.png') . '</a></td>';\r
+                                       if ($facture->status != 4 && $core->user->grade != 3) {\r
+                                               $res .= '<td><a href="#" class="ajax" rel="duplicateFacture/' . $facture->facture_id . '" title="' . __('Dupliquer la facture') . '">' . cubeMedia::image(IMG . '/duplicate.png') . '</a></td>';\r
+                                       } else {\r
+                                               $res .= '<td></td>';\r
+                                       }\r
+                               } else {\r
+                                       $res .= '<td></td><td></td><td></td>';\r
+                               }\r
+                       }\r
+\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!isset($settings['search']) || is_null($settings['search'])) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td colspan="10">' ;\r
+                       if ($core->user->grade != 3) {\r
+                               $res .= commonPage::pager($settings['page'], $dao->count() , $settings['par_page'], 'page' . $change . '/%d');\r
+                       } else {\r
+                               $res .= commonPage::pager($settings['page'], $dao->countCompta() , $settings['par_page'], 'page' . $change . '/%d');\r
+                       }\r
+                       $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('factures'));\r
+                       $res .= '</td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function listeFacturesClient($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               cubePage::truePopup();\r
+               $settings = $core->user->getSettings('factures');\r
+               $dao = new extranetDAOFacture($core->con);\r
+               $liste = $dao->getListeForEntreprise($core->user->entreprise, $settings['orderby'], $settings['sens'], true);\r
+\r
+               $res = '<table class="liste">';\r
+               $res .= '<tr><th>' . commonUrl::orderby('#', 'facture_id', $settings, 'sortFacture') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Nom'), 'nom', $settings, 'sortFacture') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Date'), 'date_creation', $settings, 'sortFacture') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Montant HT'), 'total_ht', $settings, 'sortFacture') . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Status'), 'status', $settings, 'sortFacture') . '</th>';\r
+               $res .= '<th class="min"></th></tr>';\r
+               $i = 0;\r
+               foreach($liste as $facture) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $facture->numeroFacture() . '</td>';\r
+                       $res .= '<td>' . $facture->nom . '</td>';\r
+                       $res .= '<td>' . date(__('d/m/Y'), $facture->date_creation) . '</td>';\r
+                       $res .= '<td>' . $facture->total_ht . '</td>';\r
+                       $res .= '<td>' . $core->factures_status[$facture->status] . '</td>';\r
+                       $res .= '<td><a href="' . SITE_PATH . 'voirfacture/' . $facture->facture_id . '" class="popupA4" title="' . __('Voir la facture') . '">' . cubeMedia::image(IMG . '/view.png') . '</a></td>';\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!count($liste)) {\r
+                       $res .= '<tr><td colspan="6" class="center">' . __("Vous n'avez pour le moment aucune facture associée à votre compte") . '</td></tr>';\r
+               }\r
+\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formFacturePaiement($facture_id)\r
+       {\r
+               global $core;\r
+               $dao = new extranetDAOFacture($core->con);\r
+               $facture = $dao->selectById($facture_id);\r
+               $date = !$facture->date_paiement?null:$facture->date_paiement;\r
+\r
+               $res = '<tr><td>' . form::hidden('facture_id', $facture_id) . __('Date de paiement') . '</td><td>' . cubeForm::date('date_paiement', $date) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Informations de paiement') . '</td><td>' . form::textarea('informations_paiement', 40, 3, $facture->informations_paiement) . '</td></tr>';\r
+\r
+               return $res;\r
+       }\r
+\r
+       public static function voirfacture($args)\r
+       {\r
+               global $core;\r
+               // Charge la facture\r
+               $dao = new extranetDAOFacture($core->con);\r
+               $facture = $dao->selectById($args[1]);\r
+               // Vérification des droits de l'utilisateur\r
+               extranetDroits::facture($facture, 'r', true);\r
+\r
+               cubeHTTP::relayNoCache(ROOT . '/factures/' . $args[1] . '.pdf');\r
+       }\r
+\r
+       public static function editefacture($args)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $res = commonPage::barre();\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               if (isset($args[2])) {\r
+                       $res .= self::formFacture($args[1], $args[2]);\r
+               } else {\r
+                       $res .= self::formFacture($args[1]);\r
+               }\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function formFacture($facture_id = 'new', $projet_id = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               cubePage::autoComplete();\r
+               cubePage::emptyField();\r
+               cubePage::ui('Sortable');\r
+\r
+               $daoProjet = new extranetDAOProjet($core->con);\r
+               $dao = new extranetDAOFacture($core->con);\r
+\r
+               $projet_id = isset($_POST['projet_id']) && $_POST['projet_id'] > 0?$_POST['projet_id']:$projet_id;\r
+\r
+               if ($facture_id == 'new') {\r
+                       $facture = $dao->cree();\r
+               } elseif ($facture_id == 'ws') {\r
+                       $facture = $dao->cree();\r
+                       $facture->facture_id = 'ws';\r
+               } else {\r
+                       $facture = $dao->selectById($facture_id);\r
+               }\r
+\r
+               if (!is_null($projet_id) && $facture_id == 'new') {\r
+                       $projet = $daoProjet->selectById($projet_id);\r
+                       $facture->projet_id = $projet->projet_id;\r
+                       $facture->client = $projet->client;\r
+                       $facture->projet = $facture->nom = $projet->nom;\r
+                       $lignes = array();\r
+                       foreach($projet->taches as $tache) {\r
+                               $lignes[] = array('montant' => $tache->budget, 'titre' => $tache->nom, 'description' => '');\r
+                       }\r
+                       $facture->lignes = $lignes;\r
+               } elseif ($facture_id == 'ws') {\r
+                       if (is_null($projet_id)) {\r
+                               $daoClient = new commonDAOClient($core->con);\r
+                               $client = $daoClient->selectById($_POST['client_id']);\r
+                               $facture->projet_id = 'new';\r
+                               $facture->client = $client->rs;\r
+                               $facture->client_id = $client->utilisateur_id;\r
+                               $facture->projet = __('Nouveau projet');\r
+                               $facture->nom = 'Fluidbook';\r
+                       } else {\r
+                               $projet = $daoProjet->selectById($projet_id);\r
+                               $facture->projet_id = $projet->projet_id;\r
+                               $facture->client = $projet->client;\r
+                               $facture->projet = $facture->nom = $projet->nom;\r
+                       }\r
+                       $lignes = array();\r
+                       $b = $core->con->select('SELECT * FROM ws.book WHERE bid IN(' . implode(',', array_keys($_POST['book_facture'])) . ')');\r
+                       while ($b->fetch()) {\r
+                               $lignes[] = array('book' => $b->bid, 'montant' => 0, 'titre' => 'Fluidbook &laquo; ' . $b->titre . ' &raquo;', 'description' => '');\r
+                       }\r
+                       $facture->lignes = $lignes;\r
+               }\r
+\r
+               $res = '<div id="editeDevis">';\r
+               $res .= '<form action="previewFacture" method="post">';\r
+               $res .= '<div id="devisTop">';\r
+               // Adresse\r
+               if ($facture->facture_id == 'new' && is_null($projet_id)) {\r
+                       $class = 'empty-field';\r
+                       $default_id = '';\r
+                       $default = __('Entrez le nom du projet ou du client');\r
+               } else {\r
+                       $class = '';\r
+                       $default_id = $facture->projet_id;\r
+                       $default = $facture->projet_id . ' - ' . $facture->projet . ' (' . $facture->client . ')';\r
+               }\r
+\r
+               $res .= '<div id="factureAdresse">';\r
+               $res .= form::field('projet_nom', 40, 128, $default, $class);\r
+               $res .= form::hidden('projet', $default_id);\r
+               $res .= '<div id="factureAdresseDisplay">';\r
+               if ($facture->projet_id != 'new') {\r
+                       $res .= extranetUrl::adresse(null, $facture->projet_id, 'facture', $facture->adresse);\r
+               } else {\r
+                       $res .= extranetUrl::adresse($facture->client_id, null, 'facture', $facture->adresse);\r
+                       $res .= form::hidden('client', $facture->client_id);\r
+               }\r
+\r
+               $res .= '</div>';\r
+               $res .= form::textarea('texte_complementaire', 50, 2, $facture->texte_complementaire);\r
+               $res .= '</div>';\r
+               // Titre\r
+               $res .= '<div id="devisTitre">';\r
+               $res .= 'Date : ' . cubeForm::date('date_creation', $facture->date_creation) . '<br /><br />';\r
+               $res .= form::hidden('facture_id', $facture->facture_id);\r
+               $res .= form::textarea('nom', 40, 4, $facture->nom);\r
+               $res .= '</div>';\r
+               $res .= '</div>';\r
+\r
+               $res .= '<div id="devisMiddle">';\r
+               $res .= '<div id="devisLignes">';\r
+               // Lignes du devis\r
+               $nb_lignes = max(4, count($facture->lignes) + 2);\r
+\r
+               for($i = 0;$i < $nb_lignes;$i++) {\r
+                       if (isset($facture->lignes[$i])) {\r
+                               $titre = $facture->lignes[$i]['titre'];\r
+                               $description = $facture->lignes[$i]['description'];\r
+                               $montant = $facture->lignes[$i]['montant'];\r
+                               $book = isset($facture->lignes[$i]['book'])?$facture->lignes[$i]['book']:null;\r
+                       } else {\r
+                               $titre = $description = $montant = '';\r
+                       }\r
+\r
+                       $res .= '<div class="devisLigne">';\r
+\r
+                       $res .= '<div class="devisLigneRight">';\r
+                       $res .= form::field(array('montant[]'), 6, 15, $montant) . " €";\r
+                       if (isset($book) && !is_null($book)) {\r
+                               $res .= form::hidden(array('book[]'), $book) ;\r
+                       }\r
+                       $res .= '</div>';\r
+                       $res .= '<div class="devisLigneLeft">';\r
+                       $res .= form::field(array('titre[]'), 80, 256, htmlspecialchars($titre, ENT_QUOTES)) . '<br /><br />';\r
+                       $res .= form::textarea(array('description[]'), 80, 2, $description);\r
+                       $res .= '</div>';\r
+\r
+                       $res .= '</div>';\r
+               }\r
+\r
+               $res .= '</div>';\r
+               $res .= '</div>';\r
+               $res .= '<div id="devisBottom">' . cubeMedia::spacer(10, 10) . '</div>';\r
+               $res .= '<div class="right"><a href="#" class="submit">' . $core->typo->BoutonOK('Enregistrer et prévisualiser') . '</a></div>';\r
+               $res .= '</form>';\r
+               $res .= '</div>';\r
+               return $res;\r
+       }\r
+\r
+       public static function previewFacture($args)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $dao = new extranetDAOFacture($core->con);\r
+               $facture = $dao->selectById($args[1]);\r
+\r
+               $res = commonPage::barre();\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<iframe src="' . SITE_PATH . 'voirfacture/' . $facture->facture_id . '" width="960" height="1000" frameborder="0"></iframe>';\r
+\r
+               $res .= '<div class="right">' . '<a href="' . SITE_PATH . 'editefacture/' . $facture->facture_id . '">' . $core->typo->BoutonOK(__('Editer la facture')) . '</a> ';\r
+               if ($facture->status == 0) {\r
+                       $res .= '<a href="#" rel="valideFacture/' . $facture->facture_id . '" class="ajax" title="' . __("La facture est sur le point d'être validée. Elle ne sera plus éditable. Veuillez confirmer votre choix ?") . '">' . $core->typo->BoutonOK(__('Valider la facture')) . '</a>';\r
+               } else {\r
+                       $res .= '<a href="' . SITE_PATH . 'factures">' . $core->typo->BoutonOK(__('Valider la facture')) . '</a>';\r
+               }\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function formPrintFactures()\r
+       {\r
+               global $core;\r
+               $last = $core->user->getLastPrint();\r
+               $res = '';\r
+               if ($last['date']) {\r
+                       $res .= '<tr><td>' . __('Dernière factures imprimées') . ' : </td><td>' . __('Factures') . ' <a href="' . SITE_PATH . 'voirfacture/print_' . $core->user->utilisateur_id . '_' . $last['date'] . '" class="popupA4">' . $last['pages'] . ' (' . date('Y-m-d', $last['date']) . ')</a></td></tr>';\r
+               }\r
+               $res .= '<tr><td>' . __('Factures à imprimer') . '</td><td>' . form::field('factures', 20, 64) . '</td></tr>';\r
+               $res .= '<tr><td colspan="2"><em>' . __('Ex') . ' : 1;3-5;7;9 ' . __('signifie factures') . ' 1,3,4,5,7,9</em></td></tr>';\r
+               return $res;\r
+       }\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/inc/extranet/Controlleur/url/class.extranet.url.projet.php b/inc/extranet/Controlleur/url/class.extranet.url.projet.php
new file mode 100644 (file)
index 0000000..98271f0
--- /dev/null
@@ -0,0 +1,353 @@
+<?php\r
+\r
+class extranetUrlProjet {\r
+       public static function projets($args)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+\r
+               $settings = $core->user->getSettings('projets');\r
+\r
+               $shortcuts = array();\r
+               $shortcuts[] = '<a href="#" class="popup" rel="formProjet/new">' . $core->typo->Ajouter('Créer un projet') . '</a>';\r
+\r
+               $filtres = array();\r
+               $filtres[] = new commonFiltre(__('Crée par'), 'equipier', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Status'), 'status_projet', $settings['filtres']);\r
+               $filtres[] = new commonFiltre(__('Année'), 'annee', $settings['filtres']);\r
+\r
+               $res = commonPage::barre($filtres, 'filtreProjet', 'projets', $shortcuts);\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeProjets">';\r
+               $res .= self::listeProjets();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function listeProjets($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $settings = is_null($settings)?$core->user->getSettings('projets'):$settings;\r
+               $change = is_null($dashboard)?'Projet':'Dashboard/' . $dashboard;\r
+\r
+               $res = '<table class="liste">';\r
+               $res .= '<tr><th>' . commonUrl::orderby('#', 'projet_id', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Projet'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Client'), 'client', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Année'), 'annee_fin', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Chef'), 'chef', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Status'), 'status', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Facturé'), 'rapport_facturation', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby(__('Payé'), 'rapport_paiement', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby('<abbr title="' . __('Budget') . '">B</abbr>', 'budget', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th>' . commonUrl::orderby('<abbr title="' . __('Progression') . '">Pr</abbr>', 'progression', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="min"></th></tr>';\r
+\r
+               $dao = new extranetDAOProjet($core->con);\r
+               $dao->setFiltres($settings['filtres']);\r
+               if (isset($settings['search']) && !is_null($settings['search'])) {\r
+                       $dao->setSearch($settings['search']);\r
+               }\r
+               $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
+\r
+               $i = 0;\r
+               foreach($liste as $projet) {\r
+                       $droits = extranetDroits::projet($projet, false);\r
+\r
+                       $projet->progression = !$projet->progression?'-':$projet->progression . '%';\r
+                       $projet->jours_prevus = !$projet->jours_prevus?'-':$projet->jours_prevus;\r
+                       $projet->jours_consommes = !$projet->jours_consommes?'-':$projet->jours_consommes;\r
+\r
+                       $projet->budget = !$projet->budget || !$droits?'-':$projet->budget;\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>' . $projet->projet_id . '</td>';\r
+                       $res .= '<td>' . $projet->nom . '</td>';\r
+                       $res .= '<td>' . $projet->client . '</td>';\r
+                       $res .= '<td>' . $projet->annee_fin . '</td>';\r
+                       $res .= '<td>' . $projet->chef . '</td>';\r
+                       if ($droits) {\r
+                               $res .= '<td><a href="#" class="ajax" rel="changeProjetsStatus/' . $projet->projet_id . '" title="' . __('Modifier le status du projet') . '">' . $core->projets_status[$projet->status] . '</a></td>';\r
+                       } else {\r
+                               $res .= '<td>' . $core->projets_status[$projet->status] . '</td>';\r
+                       }\r
+\r
+                       $rf = $projet->rapport_facturation;\r
+                       if ($projet->budget == '-') {\r
+                               $rapport_facturation = '-';\r
+                       } elseif (!$rf) {\r
+                               $rapport_facturation = __('Non');\r
+                       } elseif ($rf == 1) {\r
+                               $rapport_facturation = __('Oui');\r
+                       } elseif ($rf < 1) {\r
+                               $rapport_facturation = __('Partie');\r
+                       } elseif ($rf > 1) {\r
+                               $rapport_facturation = __('Trop');\r
+                       }\r
+\r
+                       $rp = $projet->rapport_paiement;\r
+                       if ($projet->budget == '-') {\r
+                               $rapport_paiement = '-';\r
+                       } elseif (!$rp) {\r
+                               $rapport_paiement = __('Non') ;\r
+                       } elseif ($rp == 1) {\r
+                               $rapport_paiement = __('Oui');\r
+                       } elseif ($rp < 1) {\r
+                               $rapport_paiement = __('Partie');\r
+                       } elseif ($rp > 1) {\r
+                               $rapport_paiement = __('Trop');\r
+                       }\r
+\r
+                       $res .= '<td>';\r
+                       if ($projet->status == 1 && !$rf) {\r
+                               $res .= '<a href="' . SITE_PATH . 'editefacture/new/' . $projet->projet_id . '" title="' . __('Créer la facture pour ce projet') . '">' . $rapport_facturation . '</a>';\r
+                       } else {\r
+                               $res .= $rapport_facturation;\r
+                       }\r
+                       $res .= '</td>';\r
+                       $res .= '<td>' . $rapport_paiement . '</td>';\r
+\r
+                       $res .= '<td>' . $projet->budget . '</td>';\r
+                       // $res .= '<td>' . $projet->jours_prevus . '</td>';\r
+                       // $res .= '<td>' . $projet->jours_consommes . '</td>';\r
+                       $res .= '<td>' . $projet->progression . '</td>';\r
+                       $res .= '<td><a href="' . SITE_PATH . 'projet/' . $projet->projet_id . '">' . cubeMedia::image(IMG . '/view.png') . '</a></td>';\r
+\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               if (!isset($settings['search']) || is_null($settings['search'])) {\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '><td colspan="11">';\r
+                       $res .= commonPage::pager($settings['page'], $dao->count() , $settings['par_page'], 'page' . $change . '/%d');\r
+                       $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('projets'));\r
+                       $res .= '</td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function projet($args)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+\r
+               $shortcuts = array();\r
+               $shortcuts[] = '<a href="#" class="popup" rel="formTacheNormale/new/' . $args[1] . '">' . $core->typo->Ajouter('Créer une tâche') . '</a>';\r
+               $shortcuts[] = '<a href="#" class="popup" rel="formTacheSousTraitee/new/' . $args[1] . '">' . $core->typo->Ajouter('Créer une tâche sous-traitée') . '</a>';\r
+\r
+               $res = commonPage::barre(null, null, null, $shortcuts);\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeProjet">';\r
+               $res .= self::listeProjet($args[1]);\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function listeProjet($projet_id)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+\r
+               $res = '<table class="liste">';\r
+               $res .= '<tr><th>#</th>';\r
+               $res .= '<th><strong>' . __('Projet') . '</strong> / ' . __('Tâche') . '</th>';\r
+               $res .= '<th><strong>' . __('Client') . '</strong> / ' . __('Catégorie') . '</th>';\r
+               $res .= '<th>' . __('Année') . '</th>';\r
+               $res .= '<th>' . __('Chef de projet') . '</th>';\r
+               $res .= '<th>' . __('Status') . '</th>';\r
+               $res .= '<th><abbr title="' . __('Budget') . '">B</abbr></th>';\r
+               $res .= '<th><abbr title="' . __('Jours prévus') . '">Pl</abbr></th>';\r
+               $res .= '<th><abbr title="' . __('Jours consommés') . '">Co</abbr></th>';\r
+               $res .= '<th><abbr title="' . __('Progression') . '">Pr</abbr></th>';\r
+               $res .= '<th class="min"></th><th class="min"></th></tr>';\r
+\r
+               $dao = new extranetDAOProjet($core->con);\r
+               $projet = $dao->selectById($projet_id);\r
+\r
+               $hasFacture = $dao->hasFacture($projet_id);\r
+\r
+               $droits = extranetDroits::projet($projet, false);\r
+\r
+               $projet->progression = !$projet->progression?'-':$projet->progression . '%';\r
+               $projet->jours_prevus = !$projet->jours_prevus?'-':$projet->jours_prevus;\r
+               $projet->jours_consommes = !$projet->jours_consommes?'-':$projet->jours_consommes;\r
+\r
+               $projet->budget = !$projet->budget || !$droits?'-':$projet->budget;\r
+\r
+               $res .= '<tr class="bold">';\r
+               $res .= '<td>' . $projet->projet_id . '</td>';\r
+               $res .= '<td>' . $projet->nom . '</td>';\r
+               $res .= '<td>' . $projet->client . '</td>';\r
+               $res .= '<td>' . $projet->annee_fin . '</td>';\r
+               $res .= '<td>' . $projet->chef . '</td>';\r
+               if ($droits) {\r
+                       $res .= '<td><a href="#" class="ajax" rel="changeProjetStatus/' . $projet->projet_id . '" title="' . __('Modifier le status du projet') . '">' . $core->projets_status[$projet->status] . '</a></td>';\r
+               } else {\r
+                       $res .= '<td>' . $core->projets_status[$projet->status] . '</td>';\r
+               }\r
+               $res .= '<td>' . $projet->budget . '</td>';\r
+               $res .= '<td>' . $projet->jours_prevus . '</td>';\r
+               $res .= '<td>' . $projet->jours_consommes . '</td>';\r
+               $res .= '<td>' . $projet->progression . '</td>';\r
+               if ($droits) {\r
+                       $res .= '<td class="action"><a href="#" class="popup" rel="formProjet/' . $projet->projet_id . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                       if (!count($projet->taches) && !$hasFacture) {\r
+                               $res .= '<td class="action"><a href="#" class="ajax" rel="supprimeProjet/' . $projet->projet_id . '" title="' . __('Êtes vous certain de vouloir supprimer ce projet ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
+                       } else {\r
+                               $res .= '<td></td>';\r
+                       }\r
+               } else {\r
+                       $res .= '<td></td><td></td>';\r
+               }\r
+               $res .= '</tr>';\r
+               $i = 1;\r
+               foreach($projet->taches as $tache) {\r
+                       $tache->budget = !$tache->budget || !$droits?'-':$tache->budget;\r
+                       $odd = cubeMath::isOdd($i)?' class="odd"':'';\r
+                       $res .= '<tr' . $odd . '>';\r
+                       $res .= '<td>T' . $i . '</td>';\r
+                       $res .= '<td>' . $tache->nom . '</td>';\r
+                       $res .= '<td>' . $core->categories[$tache->categorie] . '</td>';\r
+                       $res .= '<td></td>';\r
+                       $res .= '<td></td>';\r
+                       $res .= '<td></td>';\r
+                       $res .= '<td>' . $tache->budget . '</td>';\r
+\r
+                       if ($tache instanceof extranetTacheNormale) {\r
+                               $progression = !$tache->progression?'-':$tache->progression . '%';\r
+                               $jours_prevus = !$tache->jours_prevus?'-':$tache->jours_prevus;\r
+                               $jours_consommes = !$tache->jours_consommes?'-':$tache->jours_consommes;\r
+                               $res .= '<td>' . $jours_prevus . '</td>';\r
+                               $res .= '<td>' . $jours_consommes . '</td>';\r
+                               $res .= '<td>' . $progression . '</td>';\r
+                               if ($droits) {\r
+                                       $res .= '<td class="action"><a href="#" class="popup" rel="formTacheNormale/' . $tache->tache_id . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                               } else {\r
+                                       $res .= '<td></td>';\r
+                               }\r
+                       } else {\r
+                               $res .= '<td colspan="3">' . __('Tâche sous-traitée') . '</td>';\r
+                               if ($droits) {\r
+                                       $res .= '<td class="action"><a href="#" class="popup" rel="formTacheSousTraitee/' . $tache->tache_id . '">' . cubeMedia::image(IMG . '/edit.png') . '</a></td>';\r
+                               } else {\r
+                                       $res .= '<td></td>';\r
+                               }\r
+                       }\r
+\r
+                       $res .= '<td class="action"><a href="#" class="ajax" rel="supprimeTache/' . $tache->tache_id . '" title="' . __('Supprimer cette tâche va également supprimer les timereports associés. Êtes vous certain de vouloir supprimer cette tâche ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
+\r
+                       $res .= '</tr>';\r
+                       $i++;\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formProjet($projet_id = 'new')\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+\r
+               $dao = new extranetDAOProjet($core->con);\r
+               if ($projet_id == 'new') {\r
+                       $projet = $dao->cree($core->user->utilisateur_id);\r
+               } else {\r
+                       $projet = $dao->selectById($projet_id);\r
+               }\r
+\r
+               $daoClient = new commonDAOClient($core->con);\r
+               $clients = $daoClient->getListe();\r
+\r
+               $listeClients = array();\r
+               foreach($clients as $client) {\r
+                       $listeClients[$client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')'] = $client->utilisateur_id;\r
+               }\r
+               ksort($listeClients);\r
+\r
+               $daoEquipier = new commonDAOEquipier($core->con);\r
+               $equipiers = $daoEquipier->getListe();\r
+\r
+               $listeEquipiers = array();\r
+               foreach($equipiers as $equipier) {\r
+                       $listeEquipiers[$equipier->prenom . ' ' . $equipier->nom . ' (' . $equipier->agence . ')'] = $equipier->utilisateur_id;\r
+               }\r
+\r
+               $daoDevis = new extranetDAODevis($core->con);\r
+               $devis = $daoDevis->getListeValidesLibres($projet_id);\r
+               $listeDevis = array('--' => 0);\r
+               foreach($devis as $id => $dev) {\r
+                       $listeDevis[$dev->nom] = $dev->devis_id;\r
+               }\r
+\r
+               $res = '<tr><td>' . __('Numéro de projet') . '</td><td>' . form::hidden('projet_id', $projet->projet_id) . '' . $projet->projet_id . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Nom du projet') . '</td><td>' . form::textarea('nom', 50, 3, html::escapeHTML($projet->nom)) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Chef de projet') . '</td><td>';\r
+               if ($core->user->grade > 1) {\r
+                       $res .= form::combo('chef', $listeEquipiers, $projet->chef_id);\r
+               } else {\r
+                       $res .= form::hidden('chef', $projet->chef_id) . ' ' . $projet->chef;\r
+               }\r
+               $res .= '</td></tr>';\r
+               $res .= '<tr><td>' . __('Date de début') . '</td><td>' . cubeForm::dateFree('date_debut', $projet->date_debut) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Deadline') . '</td><td>' . cubeForm::dateFree('deadline', $projet->deadline) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Date de fin') . '</td><td>' . cubeForm::dateFree('date_fin', $projet->date_fin) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Client') . '</td><td>' . form::combo('client', $listeClients, $projet->client_id) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Devis') . '</td><td>' . form::combo('devis', $listeDevis, $projet->devis) . '</td></tr>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formTache($tache)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+\r
+               $res = '<tr><td>' . __('Numéro de tâche') . '</td><td>' . form::hidden('projet', $tache->projet) . form::hidden('tache_id', $tache->tache_id) . '' . $tache->tache_id . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Catégorie') . '</td><td>' . form::combo('categorie', array_flip($core->categories), $tache->categorie) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Nom') . '</td><td>' . form::textarea('nom', 50, 3, html::escapeHTML($tache->nom)) . '</td></tr>';\r
+\r
+               return $res;\r
+       }\r
+\r
+       public static function formTacheNormale($tache_id, $projet_id = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $dao = new extranetDAOTache($core->con);\r
+               if ($tache_id == 'new') {\r
+                       $tache = $dao->creeNormale();\r
+                       $tache->projet = $projet_id;\r
+               } else {\r
+                       $tache = $dao->selectById($tache_id);\r
+               }\r
+               $res = self::formTache($tache);\r
+               $res .= '<tr><td>' . __('Taux journalier') . '</td><td>' . form::field('taux_journalier', 6, 6, $tache->taux_journalier) . '</td></tr>';\r
+               $res .= '<tr><td>' . __('Budget') . '</td><td>' . form::hidden('type', '0') . form::field('budget', 6, 6, $tache->budget) . '</td></tr>';\r
+               return $res;\r
+       }\r
+\r
+       public static function formTacheSousTraitee($tache_id, $projet_id = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $dao = new extranetDAOTache($core->con);\r
+               if ($tache_id == 'new') {\r
+                       $tache = $dao->creeSousTraitee();\r
+                       $tache->projet = $projet_id;\r
+               } else {\r
+                       $tache = $dao->selectById($tache_id);\r
+               }\r
+               $res = self::formTache($tache);\r
+               $res .= '<tr><td>' . __('Budget') . '</td><td>' . form::hidden('type', '1') . form::field('budget', 6, 6, $tache->budget) . '</td></tr>';\r
+               return $res;\r
+       }\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/inc/extranet/Controlleur/url/class.extranet.url.timereport.php b/inc/extranet/Controlleur/url/class.extranet.url.timereport.php
new file mode 100644 (file)
index 0000000..946dad6
--- /dev/null
@@ -0,0 +1,133 @@
+<?php\r
+\r
+class extranetUrlTimereport {\r
+       public static function timereport($args)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               $settings = $core->user->getSettings('timereport');\r
+               $filtres = array();\r
+               $filtres[] = new commonFiltre(__('Participants'), 'equipier_participe', $settings['filtres']);\r
+               $res = commonPage::barre($filtres, 'filtreTimereport', 'timereport', null);\r
+               $res .= commonPage::tMain();\r
+               $res .= commonPage::bh();\r
+               $res .= '<div id="listeTimereport">';\r
+               $res .= self::listeTimereport();\r
+               $res .= '</div>';\r
+               $res .= commonPage::bf();\r
+               $res .= commonPage::bMain();\r
+               return $res;\r
+       }\r
+\r
+       public static function listeTimereport($dashboard = null, $settings = null)\r
+       {\r
+               global $core;\r
+               commonDroits::min(1);\r
+               // Récupère la liste des projets\r
+               $settings = is_null($settings)?$core->user->getSettings('timereport'):$settings;\r
+               $change = is_null($dashboard)?'Timereport':'Dashboard/' . $dashboard;\r
+\r
+               $dao = new extranetDAOProjet($core->con);\r
+               if (isset($settings['search']) && !is_null($settings['search'])) {\r
+                       $dao->setSearch($settings['search']);\r
+               }\r
+               $dao->setFiltres($settings['filtres']);\r
+               $liste = $dao->getProjetsForTimereport($settings['orderby'], $settings['sens'], $settings['limit'], $core->user->utilisateur_id);\r
+               // Extrait la liste des tâches\r
+               $taches = array();\r
+               foreach($liste as $id => $projet) {\r
+                       foreach($projet->taches as $tache) {\r
+                               if ($tache instanceof extranetTacheNormale) {\r
+                                       $taches[] = $tache->tache_id;\r
+                               }\r
+                       }\r
+               }\r
+               // Fixe les limites des jours à afficher\r
+               $time = cubeDate::round(null, 'd'); // aujourd'hui\r
+               $avant = $time - (3600 * 24 * 15); // 15 jours avant\r
+               $apres = $time; // aujourd'hui\r
+               // Récupère la liste des timereports à afficher\r
+               $daoTimereport = new extranetDAOTimereport($core->con);\r
+               $timereports = $daoTimereport->getListe($taches, $core->user->utilisateur_id, array('start' => $avant, 'end' => $apres));\r
+               // Affiche le tableau\r
+               $res = '<table class="liste listeTimereport">';\r
+               $res .= '<tr><th class="normal">' . commonUrl::orderby('#', 'projet_id', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="normal">' . commonUrl::orderby(__('Projet'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="normal">' . commonUrl::orderby(__('Client'), 'client', $settings, 'sort' . $change) . '</th>';\r
+               for($date = $avant;$date <= $apres;$date += 3600 * 24) {\r
+                       $res .= '<th>' . date('d', $date) . '' . cubeMedia::spacer(16, 1, '', 'spacer') . '</th>';\r
+               }\r
+               $res .= '<th class="normal info">' . commonUrl::orderby('<abbr title="' . __('Progression') . '">Pr</abbr>', 'progression', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="normal info">' . commonUrl::orderby('<abbr title="' . __('Jours consommés') . '">Co</abbr>', 'jours_consommes', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '<th class="normal info">' . commonUrl::orderby('<abbr title="' . __('Jours prévus') . '">Pl</abbr>', 'jours_prevus', $settings, 'sort' . $change) . '</th>';\r
+               $res .= '</tr>';\r
+\r
+               foreach($liste as $projet) {\r
+                       $res .= '<tr class="bold">';\r
+                       $res .= '<td class="normal">' . $projet->projet_id . '</td>';\r
+                       $res .= '<td class="normal">' . $projet->nom . '</td>';\r
+                       $res .= '<td class="normal">' . $projet->client . '</td>';\r
+                       for($date = $avant;$date <= $apres;$date += 3600 * 24) {\r
+                               $cc = self::getClassOfDay($date);\r
+                               $class = ($cc == '')?'':' class="' . $cc . '"';\r
+                               $res .= '<td' . $class . '></td>';\r
+                       }\r
+                       $projet->progression = !$projet->progression?'-':$projet->progression . '%';\r
+                       $projet->jours_prevus = !$projet->jours_prevus?'-':$projet->jours_prevus;\r
+                       $projet->jours_consommes = !$projet->jours_consommes?'-':$projet->jours_consommes;\r
+                       $res .= '<td class="normal info"><span id="progress_projet_' . $projet->projet_id . '">' . $projet->progression . '</span></td>';\r
+                       $res .= '<td class="normal info"><span id="consommees_projet_' . $projet->projet_id . '">' . $projet->jours_consommes . '</span></td>';\r
+                       $res .= '<td class="normal info">' . $projet->jours_prevus . '</td>';\r
+                       $res .= '</tr>';\r
+                       $i = 1;\r
+                       foreach($projet->taches as $tache) {\r
+                               if ($tache instanceof extranetTacheNormale) {\r
+                                       $res .= '<tr class="odd">';\r
+                                       $res .= '<td class="normal">T' . $i . '</td>';\r
+                                       $res .= '<td class="normal">' . $tache->nom . '</td>';\r
+                                       $res .= '<td class="normal">' . $core->categories[$tache->categorie] . '</td>';\r
+                                       for($date = $avant;$date <= $apres;$date += (3600 * 24)) {\r
+                                               $hh = isset($timereports[$tache->tache_id][$date])?$timereports[$tache->tache_id][$date]->heures:'';\r
+                                               $c = ($hh == '')?'':'filled';\r
+                                               $cc = trim(self::getClassOfDay($date) . ' ' . $c);\r
+                                               $class = ($cc == '')?'':' class="' . $cc . '"';\r
+                                               $res .= '<td' . $class . '>' . form::field(array('timereport', 't_' . $date . '_' . $tache->tache_id), 1, 2, $hh, 'timereport_field') . '</td>';\r
+                                       }\r
+                                       $tache->progression = !$tache->progression?'-':$tache->progression . '%';\r
+                                       $tache->jours_prevus = !$tache->jours_prevus?'-':$tache->jours_prevus;\r
+                                       $tache->jours_consommes = !$tache->jours_consommes?'-':$tache->jours_consommes;\r
+                                       $res .= '<td class="normal info"><span id="progress_' . $tache->tache_id . '">' . $tache->progression . '</span></td>';\r
+                                       $res .= '<td class="normal info"><span id="consommees_' . $tache->tache_id . '">' . $tache->jours_consommes . '</span></td>';\r
+                                       $res .= '<td class="normal info">' . $tache->jours_prevus . '</td>';\r
+                                       $res .= '</tr>';\r
+                                       $i++;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (!isset($settings['search']) || is_null($settings['search'])) {\r
+                       $res .= '<tr><td colspan="22"> ';\r
+                       $res .= commonPage::pager($settings['page'], $dao->countActifs(), $settings['par_page'], 'page' . $change . '/%d');\r
+                       $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('projets'));\r
+                       $res .= ' </td></tr>';\r
+               }\r
+               $res .= '</table>';\r
+               return $res;\r
+       }\r
+\r
+       public static function getClassOfDay($date)\r
+       {\r
+               $aujourdhui = cubeDate::round(null, 'd');\r
+               $highlight = ($date == $aujourdhui);\r
+               $we = (date('N', $date) >= 6);\r
+               if ($highlight) {\r
+                       return 'highlight';\r
+               }\r
+               if ($we) {\r
+                       return 'we';\r
+               }\r
+               return '';\r
+       }\r
+}\r
+\r
+?>
\ No newline at end of file
index 1f4f220ee8d043a122699d3179723deb7aaccf09..0ad4a9d8d851c560105bf9a499b1828d998c8b50 100644 (file)
@@ -13,6 +13,7 @@ class commonEntreprise extends cubeMetier {
        protected $adresse_facturation;\r
        protected $ws_admin;\r
        protected $ws_grade;\r
+       protected $type;\r
        // Composés\r
        protected $ca;\r
        protected $impaye;\r
index 90b698ed7df48507b02efe281d70b3c370b1ca83..69a5c4ff512f39bc0b20012d6c3e8490727de17d 100644 (file)
@@ -5,6 +5,7 @@ class extranetTacheNormale extends extranetTache {
        protected $jours_prevus;\r
        protected $progression;\r
        protected $jours_consommes;\r
+       protected $books;\r
 }\r
 \r
 ?>
\ No newline at end of file