// $action=$_GET['p']??'home'; $err=''; // if($_SERVER['REQUEST_METHOD']==='POST'){ // check_csrf(); // if($action==='client-save'){ // $id=(int)($_POST['id']??0);$v=[trim($_POST['nom']??''),trim($_POST['adresse']??''),trim($_POST['code_postal']??''),trim($_POST['ville']??''),trim($_POST['telephone']??''),trim($_POST['email']??''),trim($_POST['siret']??''),trim($_POST['tva_intracom']??'')]; // if(!$v[0])$err='Le nom est obligatoire.';else {if($id){$v[]=$id;$pdo->prepare('UPDATE clients SET nom=?,adresse=?,code_postal=?,ville=?,telephone=?,email=?,siret=?,tva_intracom=? WHERE id=?')->execute($v);}else $pdo->prepare('INSERT INTO clients(nom,adresse,code_postal,ville,telephone,email,siret,tva_intracom) VALUES(?,?,?,?,?,?,?,?)')->execute($v);header('Location: index.php?p=clients');exit;} // } // if($action==='quote-save'){ // $id=(int)($_POST['id']??0);$client=(int)($_POST['client_id']??0);$date=$_POST['date_devis']?:date('Y-m-d');$valid=max(1,(int)($_POST['validite_jours']??30));$type=in_array($_POST['type']??'',['PLAT','BOBINE','STANDARD'],true)?$_POST['type']:'STANDARD'; // $pdo->beginTransaction();try{ // if($id){$pdo->prepare('UPDATE devis SET type=?,client_id=?,date_devis=?,validite_jours=?,reference_client=?,commercial=?,objet=?,statut=?,commentaire=?,conditions=? WHERE id=?')->execute([$type,$client,$date,$valid,$_POST['reference_client']?:null,$_POST['commercial']?:null,$_POST['objet']?:null,$_POST['statut'],$_POST['commentaire']?:null,$_POST['conditions']?:null,$id]);$pdo->prepare('DELETE FROM devis_lignes WHERE devis_id=?')->execute([$id]);} // else{$pdo->prepare('INSERT INTO devis(type,client_id,date_devis,validite_jours,reference_client,commercial,objet,statut,commentaire,conditions) VALUES(?,?,?,?,?,?,?,?,?,?)')->execute([$type,$client,$date,$valid,$_POST['reference_client']?:null,$_POST['commercial']?:null,$_POST['objet']?:null,$_POST['statut'],$_POST['commentaire']?:null,$_POST['conditions']?:null]);$id=(int)$pdo->lastInsertId();$pdo->prepare('UPDATE devis SET numero=? WHERE id=?')->execute(['DEV-'.date('Y').'-'.str_pad((string)$id,5,'0',STR_PAD_LEFT),$id]);} // $ht=0;$tax=0;$q=$pdo->prepare('INSERT INTO devis_lignes(devis_id,ordre,designation,description,quantite,unite,prix_unitaire,remise,tva,total_ht,prix_mille,prix_total) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)'); // foreach($_POST['designation']??[] as $i=>$label){$label=trim($label);if(!$label)continue;$qty=max(0,(float)($_POST['quantite'][$i]??0));$pu=max(0,(float)($_POST['prix_unitaire'][$i]??0));$disc=min(100,max(0,(float)($_POST['remise'][$i]??0)));$vat=max(0,(float)($_POST['tva'][$i]??20));$line=round($qty*$pu*(1-$disc/100),2);$tax+=round($line*$vat/100,2);$ht+=$line;$q->execute([$id,$i+1,$label,$_POST['description'][$i]??null,$qty,$_POST['unite'][$i]??'u',$pu,$disc,$vat,$line,$qty?round($pu*1000,2):0,$line]);} // $pdo->prepare('UPDATE devis SET total_ht=?,total_tva=?,total_ttc=? WHERE id=?')->execute([$ht,$tax,$ht+$tax,$id]);$pdo->commit();header('Location: index.php?p=quotes');exit; // }catch(Throwable $e){$pdo->rollBack();throw $e;} // } // } // function layout(string $title,string $body):void{echo ''.h($title).' — Devis
'.$body.'
';} // $body='
'.h($err).'
'; // if($action==='clients'){ // $edit=null;if(isset($_GET['edit'])){$s=$pdo->prepare('SELECT * FROM clients WHERE id=?');$s->execute([(int)$_GET['edit']]);$edit=$s->fetch();} // $body='

Clients

'.($edit?'Modifier':'Ajouter').' un client

'; // foreach(['nom'=>'Nom / société','adresse'=>'Adresse','code_postal'=>'Code postal','ville'=>'Ville','telephone'=>'Téléphone','email'=>'E-mail','siret'=>'SIRET','tva_intracom'=>'TVA intracom.'] as $k=>$label)$body.='
'; // $body.='
'; // foreach($pdo->query('SELECT * FROM clients ORDER BY nom') as $r)$body.='';$body.='
ClientCoordonnées
'.h($r['nom']).''.h($r['email']).' · '.h($r['telephone']).'
'.h($r['ville']).'
Modifier
';layout('Clients',$body);exit; // } // if($action==='quote-edit'){ // $d=null;$lines=[];if(isset($_GET['id'])){$s=$pdo->prepare('SELECT * FROM devis WHERE id=?');$s->execute([(int)$_GET['id']]);$d=$s->fetch();$s=$pdo->prepare('SELECT * FROM devis_lignes WHERE devis_id=? ORDER BY ordre');$s->execute([$d['id']]);$lines=$s->fetchAll();} // $clients=$pdo->query('SELECT id,nom FROM clients ORDER BY nom')->fetchAll();$sel=(int)($d['client_id']??0); // $body='

'.($d?'Modifier':'Nouveau').' devis

'; // foreach(['type'=>'Type','date_devis'=>'Date','validite_jours'=>'Validité (jours)','reference_client'=>'Référence client','commercial'=>'Commercial','objet'=>'Objet','statut'=>'Statut'] as $k=>$label){$val=$d[$k]??(['type'=>'STANDARD','date_devis'=>date('Y-m-d'),'validite_jours'=>30,'statut'=>'BROUILLON'][$k]??'');$body.='
';if($k==='type')$body.='';else $body.='';if($k==='type')foreach(['STANDARD','PLAT','BOBINE'] as $x)$body.='';if($k==='type'||$k==='statut'){$opts=$k==='statut'?['BROUILLON','ENVOYE','ACCEPTE','REFUSE','EXPIRE']:[];foreach($opts as $x)$body.='';$body.='';}$body.='
';} // $body.='

Lignes de devis

'; // if(!$lines)$lines=[[]];foreach($lines as $l){$body.='';foreach(['designation'=>'text','quantite'=>'number','unite'=>'text','prix_unitaire'=>'number','remise'=>'number','tva'=>'number'] as $k=>$type)$body.='';$body.='';}$body.='
DésignationQtéUnitéPrix unitaire HTRemise %TVA %
'; // layout('Éditeur devis',$body);exit; // } // if($action==='quote-save'){http_response_code(405);exit;} // if($action==='quotes'){ // $body='

Historique des devis

+ Nouveau devis
'; // foreach($pdo->query('SELECT d.*,c.nom FROM devis d JOIN clients c ON c.id=d.client_id ORDER BY d.id DESC') as $r)$body.='';$body.='
NuméroTypeDateClientStatutHTTTC
'.h($r['numero']).''.h($r['type']).''.h($r['date_devis']).''.h($r['nom']).''.h($r['statut']).''.euro($r['total_ht']).''.euro($r['total_ttc']).'Modifier · PDF
';layout('Historique',$body);exit; // } // if($action==='print'&&isset($_GET['id'])){ // $s=$pdo->prepare('SELECT d.*,c.nom,c.adresse,c.code_postal,c.ville,c.email,c.telephone,c.siret,c.tva_intracom FROM devis d JOIN clients c ON c.id=d.client_id WHERE d.id=?');$s->execute([(int)$_GET['id']]);$d=$s->fetch();if(!$d){http_response_code(404);exit('Introuvable');}$s=$pdo->prepare('SELECT * FROM devis_lignes WHERE devis_id=? ORDER BY ordre');$s->execute([$d['id']]);$body='

DEVIS '.h($d['numero']).'

'.h($d['date_devis']).' · Valable '.$d['validite_jours'].' jours

'.h($d['nom']).'

'.h($d['adresse']).'
'.h($d['code_postal']).' '.h($d['ville']).'

'.h($d['objet']).'

';foreach($s as $l)$body.='';$body.='
DésignationQtéPU HTTotal HT
'.h($l['designation']).''.h($l['quantite']).' '.h($l['unite']).''.euro($l['prix_unitaire']).''.euro($l['total_ht']).'
Total HT : '.euro($d['total_ht']).'
TVA : '.euro($d['total_tva']).'

Total TTC : '.euro($d['total_ttc']).'

'.nl2br(h($d['conditions'])).'

';layout('Devis '.$d['numero'],$body);exit; // } // $n=(int)$pdo->query('SELECT COUNT(*) FROM devis')->fetchColumn();$c=(int)$pdo->query('SELECT COUNT(*) FROM clients')->fetchColumn();$body='

Tableau de bord

Suivi de vos clients et propositions commerciales.

+ Nouveau devis
Devis enregistrés
'.$n.'
Clients
'.$c.'

Derniers devis

Voir l’historique des devis →
';layout('Accueil',$body);