regrouper données

Eléphanteau du PHP | 15 Messages

30 août 2012, 12:09

bonjour les amis,

je dois créer un ptit logiciel de facturation et je suis bloqué.

procédure :

1. enregistrement d'un nouveau client dans table clients avec comme champs :idclient,civilite, nom,prenom, adresse, cp, ville, telportable email , teldomicile
2. le client peut avoir plusieurs factures avec comme champs : jour,mois,année,idclient,civilite,nomclient,prenomclient,adresseclient,cpclient,villeclient,libelle,détails,n_intervenant,heure_i,min_i,tauxhoraire,tauxhoraireht,tva,equivalence,totalht,totalttc,modepaiement

le client peut avoir plusieurs factures
Image

3. le client demande une attestation (générer en pdf) regroupant les détails de toutes ces factures....et c'est la ou je bloque. je vois pas trop comment faire

merci d'avance pour votre aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 août 2012, 12:26

et ?

qu'est ce que tu ne sais pas faire ?

modéliser la chose ?
la faut demander à google / ton patron des cours sur la modélisation (avec uml, merise etc etc)

afficher la chose ?


on ne fera pas ton application.

ce que tu demande ne semble pas complexe, il faut "juste" modéliser la chose.

commence par modéliser le client, avec ce que tu donne ça fait 3 tables (regarde la première forme normale lorsque l'on modélise une base de donnée :) ).
la facture tu indique des champs que tu a déjà dans la table client ! le reste une table, attention pas trois champs pour la date mais un champs date.

totale 4 tables (on peux faire plus mais ça devrait suffire).
Si tu veux des factures détaillées ça peux vite monter (par exemple des activitées, ça ajoute 2 tables etc etc).

Après coté front
- une page création client
- une page création facture
- un script php qui génére le PDF.


@ +
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

30 août 2012, 12:40

merci j'ai juste demandé de l'aide pas de faire mon application

j'ai deja une page création client et création facture. Pour créer ma facture, j'ai besoin du nom/prenomclient... que je pique dans la table clients..

ce que j'ai :

client : création, suppression, modification
factures : création,suppression,modification,génération facture en pdf
attestation client (ce que je cherche à faire) : recap des factures pour chaque clients

ce qui est délicat, c'est qu'un client peut avoir plusieurs factures c'est la ou je bloque

cdt,

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 août 2012, 12:46

ce qui est délicat, c'est qu'un client peut avoir plusieurs factures c'est la ou je bloque
d'où la modélisation correcte :)


Sans, au minimum, les tables on ne peux pas t'aider.

Sur un système modélisé correctement, il s'agit d'un simple select avec une condition http://phpdebutant.org/article63.php

ça devrait être ton cas, mais je ne peux en dire plus.


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

30 août 2012, 12:51

Bjr,
à vue de pifomètre, il me semble qu'il faudrait au moins (et encore il faudrait, pour bien faire, subdiviser la table clients...):
table clients
id_client
nom
etc
table factures
id_facture
details
table clients_factures
id_client
id_facture
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 15 Messages

30 août 2012, 19:09

bon ça avance un peu! j'utilise le method get "idclient". avec un lien sur le doc pdf. cependant j'ai un probleme avec select dans mon pdf et mon '$_GET['idclient');

Pourquoi celui-ci ne le reconnait pas?
$reponse = $bdd->query('SELECT SUM(totalttc) as montant,factures.n_intervenant,sarl,moncompte.civilite,moncompte.siret,
 factures.civilite,factures.nomclient,factures.prenomclient,factures.adresseclient,factures.cpclient,factures.villeclient,idf, heure_i, min_i, tauxhoraire
FROM factures,moncompte WHERE idclient = '$_GET['idclient');
merci d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 août 2012, 23:13

un message d'erreur ?

met la requete dans une variable et affiche la !
ton code n'est pas syntaxiquement correct tu dois donc avoir un message d'erreur !
Si ce n'est pas le cas il faut configurer php pour cela (error_reporting(E_ALL));

Il ne faut jamais utiliser une variable issu de formulaire ou d'url sans les "protéger" c'est une faille de sécurité !

code corrigé
<?php
try {
$sql = 'SELECT SUM(totalttc) as montant,factures.n_intervenant,sarl,moncompte.civilite,moncompte.siret,
 factures.civilite,factures.nomclient,factures.prenomclient,factures.adresseclient,factures.cpclient,factures.villeclient,idf, heure_i, min_i, tauxhoraire
FROM factures,moncompte WHERE idclient = '.$bdd->quote($_GET['idclient']);
$reponse = $bdd->query($sql);
}
catch(Exception $e) {
    echo 'Erreur SQL : '.$e->getMessage();
}
?>
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 229 Messages

31 août 2012, 07:03

bonjour les amis,
3. le client demande une attestation (générer en pdf) regroupant les détails de toutes ces factures....et c'est la ou je bloque. je vois pas trop comment faire

merci d'avance pour votre aide
bonjour,
fopen, fwrite (existe sous le doux nom de fputs), peut être.
file_put_contents pour une ecriture rapide.

Mais j'ai jamais utilisé. Alors pour un pdf je suis pas sûr.

Bon codage.

ViPHP
ViPHP | 2577 Messages

31 août 2012, 08:44

Bonjour,
$reponse = $bdd->query('SELECT SUM(totalttc) as montant,factures.n_intervenant,sarl,moncompte.civilite,moncompte.siret,
 factures.civilite,factures.nomclient,factures.prenomclient,factures.adresseclient,factures.cpclient,factures.villeclient,idf, heure_i, min_i, tauxhoraire
FROM factures,moncompte WHERE idclient = '$_GET['idclient');
1) Il faut préciser dans quelle table tu vas chercher idclient dans where
2) Il manque une condition pour la jointure entre factures et moncompte ou une condition sur l'idclient de la seconde table
3) la requete te retourne 1 seul ligne ou pose problème avec le sum(), et des zones sans fonction multi-ligne (max, sum...) mais mysql est tolérant.

Le plus simple serait de faire 2 requetes : 1 avec le client et le total de la facture et une avec la liste des des factures.

Mammouth du PHP | 2278 Messages

31 août 2012, 09:37

Bjr,

pour générer du pdf, il faut aller voir soit des fonctions php, soit de fpdf, soit de r&os (cf http://www.framasoft.net/article5081.html)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

31 août 2012, 17:20

2) Il manque une condition pour la jointure entre factures et moncompte ou une condition sur l'idclient de la seconde table
3) la requete te retourne 1 seul ligne ou pose problème avec le sum(), et des zones sans fonction multi-ligne (max, sum...) mais mysql est tolérant.

Le plus simple serait de faire 2 requetes : 1 avec le client et le total de la facture et une avec la liste des des factures.
3/ sum ne s'utilise qu'avec un group by.

il serait intéressant d'avoir les structures des tables afin de mieux comprendre la chose.

commence par valider la récupération des infos, pour le PDF tu verra ensuite avec les infos de sirakawa


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

02 sept. 2012, 11:37

Bonjour à tous les amis,

bon ça a avancer, c'est ok pour la generation des pdf avec la class html2pdf.

j'ai utiliser
$sql = 'SELECT SUM(totalttc) as montant,factures.n_intervenant,sarl,moncompte.civilite,moncompte.siret,
  factures.civilite,factures.nomclient,factures.prenomclient,factures.adresseclient,factures.cpclient,factures.villeclient,idf, heure_i, min_i, tauxhoraire
 FROM factures,moncompte WHERE idclient = '.$bdd->quote($_GET['idclient']);
(merci moogli :))

Seul probleme, j'essaie d'afficher toutes les factures d'un client mais celui ci ne m'affiche qu'une seul facture alors qu'un client peut en avoir plusieurs.
merci d'avance les amis,
<?php
ob_start();
;?>


<style type="text/css">
page {font-family:dejavusans;}
page_footer {font-family:dejavusans;}
table {vertical-align:top;border-collapse:collapse;width:100%;}
table.border td {border:1px #000;padding:3mm 1mm;}
table.border th,td.black {background:#000;color:#fff;padding:0.5mm 5mm;border:solid 1px #fff;text-align:center;}
td.right{text-align:right;}
.div1 { border: solid 1mm black; border-radius: 5mm;text-align: center;}
</style>
<?php
include('connect.php');
$sql = 'SELECT SUM(totalttc) as montant,factures.n_intervenant,sarl,moncompte.civilite,moncompte.siret,
 factures.civilite,factures.nomclient,factures.prenomclient,factures.adresseclient,factures.jour,factures.mois,factures.annee,factures.cpclient,factures.villeclient,idf, heure_i, min_i, tauxhoraire
FROM factures,moncompte WHERE idclient = '.$bdd->quote($_GET['idc']);
$reponse = $bdd->query($sql);
while($donnees=$reponse->fetch())
{
?>
<page backtop="5mm" backleft="5mm" backright="10mm" backbottom="5mm">
<page_footer><em><hr><?php echo $donnees['sarl']; ?> - SIRET : <?php echo $donnees['siret']; ?><br>Membre d’une AGA, le r&eacute;glement des honoraires par ch&eacute;que est accept&eacute;.</em></page_footer>
<div class="div div1"><h4>ATTESTATION FISCALE SERVICE &Agrave; LA PERSONNE ANNEE <?php echo date('Y'); ?></h4></div><br>
<table>
<tr><td style="width:70%;"><img src="logo3.jpg"></td></tr>
<tr><td style="width:70%;">&nbsp;</td><td style="width:30%;">A Blois, le <?php echo date ('d/m/Y');?></td></tr>
<tr><td style="width:70%;"><br></td><td style="width:30%;"><br></td></tr>
<tr>
<td style="width:70%;"><b><?php echo $donnees['sarl']; ?></b><br><?php echo  $donnees['civilite']. $donnees['n_intervenant']; ?><br>29 rue de flandres<br>41000 blois<br><br>
Tel. : 09 53 18 98 51<br>Tel. : 06 70 20 88 13<br>www.a6tclic.fr<br>[email protected]<br><br>
Agrement: N/211008/F/041/S/031<br>Date d'obtention : 21/10/2008<br><br></td>
<td style="width:30%;">
<b><?php echo $donnees['civilite']. "&nbsp;".$donnees['nomclient']."&nbsp;" .$donnees['prenomclient'] ;?></b><br>
<?php echo $donnees['adresseclient'];?><br><?php echo $donnees['cpclient'];?> <?php echo $donnees['villeclient'];?><br>
</td></tr>
</table><br><br>
<?php echo  $donnees['civilite']. $donnees['n_intervenant']; ?>, responsable de l'organisme agr&eacute;&eacute; A6tcliC, certifie que <b><?php echo $donnees['civilite']."&nbsp;" .$donnees['nomclient']."&nbsp;" .$donnees['prenomclient'].
' ('.$donnees['adresseclient']."&nbsp;" .$donnees['cpclient']."&nbsp;" .$donnees['villeclient'].') ';?></b>a b&eacute;n&eacute;fici&eacute; d'une aide &agrave; domicile dans le cadre des Services &agrave; la Personne.
<br><br><br>
Montant total des interventions effectivement acquitt&eacute;es ouvrant droit &agrave; r&eacute;duction ou cr&eacute;dit d'imp&ocirc;t :<b><?php echo $donnees['montant']; ?> Euros</b> <br><br>
Montant total r&eacute;gl&eacute; avec des CESU (Ch&egrave;ques Emploi Service Universels) pr&eacute;financ&eacute;s : <br><br>
ASSISTANCE INFORMATIQUE : <b><?php echo $donnees['montant']; ?> Euros</b> <br><br><br>
D&eacute;tail des prestations concern&eacute;es pour l'ann&eacute;e <?php echo date('Y'); ?> : <br><br>
<table class="border"><thead><tr>
<th style="width:20%;">DATE</th>
<th style="width:45%;">INTERVENANT - N&deg; FACTURE</th>
<th style="width:10%;">DUREE</th>
<th style="width:10%;">TX HOR.</th>
</tr></thead>
<tr>
<td align="center"><?php echo $donnees['n_intervenant']." - facture n&deg;".$donnees['idf']; ?></td>
<td align="center"><?php echo $donnees['heure_i']. "H".$donnees['min_i']; ?></td>
<td align="center"><?php echo $donnees['tauxhoraire']; ?></td>
</tr>

</table>
</page>
<?php
}
?>


<?php
	$content= ob_get_clean();
	require('html2pdf/html2pdf.class.php');
	$pdf = new HTML2PDF('P', 'A4', 'fr','UTF-8');
	$pdf->pdf->SetDisplayMode('real');
	$pdf->WriteHTML($content);
    $pdf->Output("facture:".$_GET['idfac']." de ".$_GET['nomcl']." de ".$_GET['prenomcl'].".pdf","D");
		
?>

Eléphanteau du PHP | 15 Messages

03 sept. 2012, 13:08

up :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

03 sept. 2012, 15:15

test ta requete seule dans un client SQL !

SUM ne s'utilise qu'avec un group by !

@+
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2577 Messages

03 sept. 2012, 15:41

SUM ne s'utilise qu'avec un group by !
Lorsque sum(), count()... est utilisé sans group by, cela retourne une seule ligne en faisant le group by sur toutes les lignes. Le group by sert justement à avoir des calculs intermédiaires sur les clés indiquée dans le group by.

Normalement, SQL n'accepte pas : select sum(mt), id_client, non_client group by id_client
mais select sum(mt), id_client, X(non_client) group by id_client avec X vaut first, last, max ou min.
ou select sum(mt), id_client, non_client group by id_client , nom_client

Dans sa grande bonté mysql le tolère et renseigne nom_client "au hasard" (pas grave car identique / id_client)

Edit dans le cas qui nous intéresse, il faut virer le sum pour avoir le détail et faire le sum pour avoir le total : donc 2 requetes à prévoir.
Autrement, j'ai oublié le from dans mon sql^^.