Vitefait2

Objet:


vitefait2 est une aplication permettant de réaliser un interfacage entre des pages web disposant
de champs a remplir et des tables SQL. Son intérêt est de pouvoir réaliser des aplicatons Web
sur la plate forme Zope.
Par exemple, Vitefait2 permet de réaliser très rapidement des applications de traitement de
formulaires.  Il n'est pas nécéssaire de connaître le language HTML ou PHP ou SQL : Vitefait2
utilise un language de balise simplifé qui corespond aux champs.


Vous dessinez directement votre écran avec vitefait2 puis vous demandez la génération des
programmes, c'est tout votre application est opérationnelle. Le code généré vous permet de créer
tout de suite votre table SQL (quelle que soit votre base de données) et vous pouvez exploiter
votre formulaire directement. Tout le code généré peut être modifié à tout moment par Vitefait2
(mais aussi manuellement, même si cela est moins conseillé). Vitefait2 a aussi un but didactique.
Par l'examen du code généré, il sera facile de comprendre le DTML.


Installation


Placez vitefait2.zexp dans votre dossier import, puis à partir de l'interface ZMI de Zope, lancer un
import dans le dossier root. Si vous avez déjà utilisé Gadfly connectez vous par
http://server:8080/vitefait2 et c'est tout, sinon supprimez l'objet vitefait_base puis recréez un objet
Z Gadfly Databse Connexion nommé vitefait_base et connectez vous par
http://server:8080/vitefait2.
Lors de sa première utilisation, Vitefait2 va créer la table SQL dont il a besoin pour travailler. Par
défaut ce sera du Gadfly mais il suffit que votre connexion soit en PostgreSQL (que je vous
conseille) ou autre (avec Zoper vous avez le choix) pour que Vitefait2 utilise cette base.

Commençons:


Tout d'abord trouvez un nom à votre programme. Ce nom doit respecter les conventions Zope.
Evitez les caractères spéciaux et préférez les lettres et chiffres. Afin de permettre une certaine
souplesse, Vitefait2 laissera Zope tester la validité de tous les noms que vous donnerez. En cas
d'erreur ceci vous sera indiqué lors de la génération du code ou des tables SQL.

Dessinez:


Vous dessinez directement dans la zone. Vous dessinez tel que vous le voulez le formulaire en
sortie. Ce formulaire sera formaté grâce aux espaces et retours à la ligne. 
Vous  pouvez, si vous le voulez, ajouter des balises HTML. L'option « dessin non formaté »
permet de ne pas tenir compte des espaces et retours à la ligne, dans ce cas, vous gérez vous
même le code HTML. 
A l'intérieur du dessin vous utilisez des caractères réservés pour marquer les champs.


Le mode non formaté peut être utile pour récupérer le code généré par un éditeur HTML.
Néanmoins, pour commencer, je vous conseille le dessin en ligne.
Pour un champ modifiable, mettez autant de caractères $ que nécessaires pour définir la taille
prévue pour votre champ.
Pour un nom champ non modifiable, mettez autant de § que nécessaires pour définir la taille
prévue pour votre champ.
Pour un champ de type radio (choix simple) mettez un ^.
Pour un champ de type case à cocher (choix multiple) mettez un #.
Pour un mot de passe, mettez autant de £ que la taille que nécessaires pour définir la taille
prévue pour votre champ.
Pour une liste déroulante, mettez autant de ~ que nécessaires pour définir la taille  prévue pour
votre champ.
Pour un texte long (textarea) mettez le nombre de ligne et de colonnes entre crochets sous la
forme :
[rows=x cols=y]
Le caractère \ mis devant un champ de n'importe quel type rendra ce champ « disabled », rien ne
pourra être entré dans le champs et le champ ne rendra pas ce qu'il contient au programme
chargé de traiter le formulaire.


Les touches:


Vous pouvez mettre autant de touches que vous le voulez dans votre image, vos touches doivent
être séparées par des virgules ou des retours à la ligne ou les deux. Chaque touche sera ajoutée
à votre image (à raison de 6 par ligne). 
Un traitement se mettra en route, appelant le programme correspondant à votre touche. 
Le nom des touches doit respecter les conventions Zope, de préférence mettez des caractères et
des chiffres. ATTENTION : le nom ne doit pas être ni précédé ni suivi d'espace sinon une erreur
sera indiquée à la génération.
Exemple :
Vous avez appelé votre programme « machin », vous avez défini une touche « truc ». En cliquant
sur la touche truc, vous appellerez le programme « machin_prog_truc ».


Un certain nombre de programmes sont générés par défaut :
(par exemple, dans le cas où votre programme s'appelle machin):
machin_prog_voir sera appelé par la touche voir et servira à voir une ligne à la table.
machin_prog_ajouter sera appelé par la touche ajouter et servira à ajouter une ligne à la table.
machin_prog_modifier sera appelé par la touche modifier et servira à modifier une où des lignes à
la table.
machin_prog_supprimer sera appelé par la touche supprimer et servira à supprimer une où des
lignes à la table.
machin_prog_lister sera appelé par la touche lister et servira à lister une où des lignes de la table.
Attention, ce programme « lister » a besoin du programme voir (dans notre exemple
machin_prog_voir) car il crée pour chaque ligne un raccourci vers cette fonction voir. 


Si vous souhaitez que la touche voir ne soit pas générée, placez un dièse à la fin.(voir#).


De même, si vous souhaitez prévoir l'appel d'un code mais sans générer automatiquement les
touches, insérez un dièse à la fin. 
Dans ce cas, vous pouvez positionner manuellement votre touche en ajoutant le code HTML
suivant:
<INPUT class="bouton" type="SUBMIT" name="machin_prog_touche" value="truc">
Dans ce cas en cliquant sur la touche vous appellerez le code « machin_prog_truc ».


Les champs:


Pour chacun des champs que vous avez préparé dans votre dessin, donnez un nom de champ
(respectez les conventions SQL, de préférence utilisez des caractères et des chiffres).
Vous pouvez ajouter un champ dans lequel s'affichera le message d'erreur, il doit s'appeler
« msg_erreur ». 
Vos champs doivent être séparées par des virgules ou des retours à la ligne ou les deux. 
Chaque champ peut être suffixé pour indiquer son type. ATTENTION : le nom ne doit pas être ni
précédé ni suivi d'espace sinon une erreur sera indiquée à la génération.
$ correspond à integer
£ correspond à float
/ correspond à date
@ correspond à blob
Chaque champ correspond à une colonne SQL (sauf msg_erreur). Si vous voulez qu'un champ
soit un champ de travail, suffixez le par un dièse.
Chaque champ commençant par k_ sera considéré comme faisant partie de la clé. 
Si aucun champ ne commence par k_ la clé sera le premier champ trouvé.
Les champs clé ne pourrons pas être modifiés. 
Si vous désirez qu'un champ non clé soit non modifiable, terminez en le nom par un point
d'exclamation (éventuellement derrière les suffixes).
NB: le point d'exclamation doit suivre le suffixe, il ne peut pas être utilisé avec un suffixe dièse.
La syntaxe peut vous paraître difficile mais pensez que les deux suffixes dièse et point
d'exclamation sont les seuls à pouvoir être complémentaires à un autre suffixe et ne peuvent pas
être suivis par un autre caractère.


Les programmes générés


Nous supposerons toujours que nous avons appelé notre programme « machin »


Machin.export sera le code généré par la fonction export
machin.html sera le code html du formulaire
machin_prog sera le code principal


machin_prog_ajouter sera le code nécéssaire aux ajouts
machin_prog_lister sera le code appelé par la fonction lister
machin_prog_modifier sera le code de la fonction modification
machin_prog_rab sera le code de la remise à blanc du formulaire
machin_prog_supprimer sera le code de suppression
machin_code_voir sera le code de visualisation


Il est déconseillé de modifier ces programmes, utilisez plutôt les exits


Les exits


Un exit est un programme que vous créez et qui aura un nom précis en fonction de l'endroit où il
sera appelé.
Ce programme n'existe pas par défaut à la génération, c'est vous qui décidez de le générer ou
non. Il peut être codé en python ou en dtml. ATTENTION: si vous codez  en DTML vous profiterez
de tous les bienfaits de l'acquisition, ce qui ne sera pas le cas en python. Python de son côté
vous permettra un code plus clair, surtout pour les tests grâce à l'instruction Metatest de vitefait2
que vous allez découvrir.
Si vous avez appelé votre programme « machin »:
machin_prog_ajout_modif_tests sera appelé en tout début des programmes ajouter et modifier.
machin_prog_ajouter_trait, machin_prog_lister_trait, machin_prog_modifier_trait,
machin_prog_supprimer_trait, machin_prog_voir_trait seront appelés avant l'appel SQL pour leur
programme respectif.
machin_prog_ajout_modif_trait sera appelé après le trait des programmes ajouter et modifier.
machin_prog_lister_trait_chaque sera appelé pour chaque ligne sql de la fonction lister.
machin_prog_ajouter_trait_fin, machin_prog_lister_trait_fin, machin_prog_modifier_trait_fin,
machin_prog_supprimer_trait_fin, machin_prog_voir_trait_fin seront appelés après l'appel SQL
pour leurs programmes respectifs sauf en cas d'erreur SQL.
machin_prog_ajouter_trait_erreur, machin_prog_lister_trait_erreur,
machin_prog_modifier_trait_erreur, machin_prog_supprimer_trait_erreur,
machin_prog_voir_trait_erreur seront appelés en cas d'erreur SQL pour leurs programmes
respectifs.
machin_prog_remplit sera appelé avant d'envoyer l'image


Tests et code


La zone tests et code va servir à créer tous les programmes d'exit précédemment décrits.
Le premier exit sera créé implicitement sans que l'on ait à indiquer son nom. Cet exit est l'exit
principal de test machin_prog_ajout_modif_tests.


Le codage d'un test:
Le test se code en python en préfixant cahque champ par « val. ». Vitefait2 a prévu une
instruction métatest. Donc, un test simple s'écrit sous la forme:


! condition_obligatoire : message d'erreur si la condition n'est pas remplie
Exemple:
! val.nom <> '' : le champ nom n'a pas été rempli
mais vous pouvez aussi coder directement en python en oubliant le signe !
Exemple:
if val.nom <> '':
        raise 'problème','msg_erreur','veuillez remplir le champ nom'
Après avoir remplit tous les tests nécéssaires, vous pouvez passer à la création d'exit
Placez /**/ seul sur une ligne pour séparer chaque programme
mettez le suffixe du nom derrière un # prog= ou mettez le nom entier derrière un #prog!
#prog=ajouter_trait_erreur crééra un programme du nom de machin_prog_ajouter_trait_erreur
#prog!machin_prog_ajouter_trait_erreur crééra un programme du nom de
machin_prog_ajouter_trait_erreur
#prog créera des programmes python, si vous préférez coder en DTML mettez #dtml à la place.
ATTENTION: coller le nom du programme à #prog= et allez à la ligne ensuite, votre nom doit
respecter les conventions Zope, #prog et #dtml doivent être en minuscule. N'oubliez surtout pas
les séparateurs de programme, sinon vos deux programmes seront regroupés en un seul ayant le
dernier nom.
Si vous voulez appeler une méthode préfixez le nom de la méthode par prg exemple :
val.bidule = prg.mamethode(val.machin) ou call prg.mamethode()
Si à partir d'un programme en python vous voulez appeler un programme en DTML codez
val.bidule = prg.nomdudtml(prg,val)
pour pouvoir bénéficier de l'acquisition.


Utiliser les conditions de recherches de _sql_lister


La méthode sql_lister permet d'ajouter des conditions de recherche. 
Vous pouvez utiliser prog_lister.
Exemple:
votre programme s'appelle truc, vous avez deux colonnes nom et prenom
val.set('eq_nom','toto')
val.set('eq_prenom','jean')
call prg.machin_prog_lister()
Autre exemple:
!not(prg.machin_sql_lister(eq_nom=val.nom)):le nom existe déjà
ce simple test vous donnera un message d'erreur si le nom est trouvé dans la table. Puissant,
non!
Chaque condition de recherche a un préfixe, les conditions sont cumulatives.
Le préfixe eq_ test l'égalité, ne_ la différence, gt_ plus grand que, ge_ plus grand ou égal, le_
plus petit ou égal, lt plus petit que, like_ fera un like SQL (exemple like_nom='%aze%' pour tous
les noms contenant aze). La comparaison like ne fonctionne pas avec une base Gadfly.


Vous pouvez ajouter des conditions de tri à votre méthode en positionnant la variable « ordre ». Si
votre programme s'appelle « bidule » la variable ordre se nommera « bidule_prog_ordre » et
comprendra l'ordre au format SQL. Si votre variable contient un point-virgule, elle sera ignorée
pour des raisons de sécurité SQL.
Exemple:
val.set('bidule_ordre','nom DESC, prenom')
pour  faire un tri descendant sur nom et ascendant sur prénom.


Variables spéciales


Toujours pour notre programme « machin », si l'on positionne « machin_affiche_pas », le prochain
affichage de l'image de « machin » sera annulé.
Si l l'on positionne vitefait_debut_affiche_pas, le code html de début  ne sera pas affiché.
Si l l'on positionne vitefait_fin_affiche_pas, le code html de fin ne sera pas affiché.
Si l'on positionne msg_erreur_box, les messages d'erreur s'afficheront dans un messagebox en
javascript.
Ces variables sont positionnées par,
en python: val.set('machin_affiche_pas','x')
en DTML: <dtml-call '' REQUEST.set('machin_affiche_pas','x') ''>
On peu aussi à tout moment remplir la zone de message d'erreur, par exemple la remise à blanc
de cette zone s'effectue par: val.set('msg_erreur','')


Méthodes diverses


vitefait_css contient la feuille de style
vitefait_debut contient le code html de début
vitefait_fin contient le code html de fin
vitefait_nb_lignes_a_afficher contient le nombre de lignes à afficher par page en mode liste
js_msg_erreur contient le javascript d'affichage du message d'erreur.


vitefait_base est la connexion à la base de données. Pour passer en connexion PostgreSQL,
MySQL ou autre type de base, supprimez cette connexion et créez une connexion du même nom
à votre base.


Dessin non formaté


Cocher cette case évite le mode dessin pur, vous mettez dans ce cas les balises HTML
nécessaires aux retours à la ligne et espaces. Ce mode peut être pratique si votre image provient
d'un composeur de pages Web.


Nom table


Par défaut nom table est égal à nom programme. Si vous êtes obligés d'utiliser plusieurs
programmes pour la même table, remplissez ce champs.


Les touches de vitefait2


Vitefait2 a été créé avec vitefait2. Il stocke tous ses programmes dans une table SQL. La gestion
SQL se fait avec les touches voir, ajouter,modifier, supprimer. La touche rab sert à remettre
l'image à blanc pour créer un nouveau programme.
gen_code set à générer tout le code, sup_code à le supprimer.
gen_table sert à générer la table SQL, sup_table à la supprimer (en utilisant le code généré).
Tester vous permet de tester directement le code généré.
Zope ouvre l'interface Zope dans le dossier des programmes générés.
Export et import vous permettent d'exporter et d'importer toutes les infos que vous avez saisies
pour votre programme. La fonction export va vous créer un document suffixé par .import (exemple:
bidule.import) dans votre dossier. La fonction import ira rechercher ce document. Comme toutes
les données de Vitefait2 sont stockées dans une base SQL ceci va être utile pour passer votre
application d'une machine à une autre. Depuis la version 2.0.8 un export est généré
automatiquement lors des ajouts et modifications.


Premier exemple  : création d'un répertoire tout simple


Nous allons créer un répertoire tout simple sur une base de données relationnelle.
Ce répertoire contiendra 3 champs : nom, prénom, téléphone
les champs noms et prénoms formeront une clé unique


nom du programme : annuaire
Dessin


Touches 


la touche voir est suivie d'un dièse, elle est utile quand on est en mode liste, mais n'apparait pas
dans les touches
Champs


Tests et code


Juste 4 tests : les champs nom,prénom et téléphones doivent être remplis et la personne ne doit
pas exister dans la table sql


Voilà c'est tout vous n'avez plus qu'à :
<h1><center>mon petit annuaire</center></h1>


nom              $$$$$$$$$$$$$$$$$$$$$$$$$


prénom           $$$$$$$$$$$$$$$$$$$$$$$$$


téléphone        $$$$$$$$$$


§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


voir#,ajouter,modifier,supprimer,lister


k_nom,k_prenom,tel,msg_erreur


! val.k_nom <> ''     : le nom n'est pas rempli
! val.k_prenom <> ''  : le prénom n'est pas rempli
! val.tel <> ''     : le téléphone n'est pas rempli
! not(prg.annuaire_sql_lister(eq_k_nom=val.k_nom,eq_k_prenom=val.k_prenom)) : la
personne est déjà saisie dans l'annuaire


1) ajouter votre programme dans la base grâce à la touche ajouter
2) générer le code avec la touche gen_code
3) générer la table sql avec la touche gen_table
4) vous pouvez tester votre programme avec la touche tester ou en tapant l'adresse:
.../vitefait2/vitefait_prog/annuaire_prog
Certes ce petit programme n'est pas très utile mais vous pouvez au moins voir la vitesse de
réalisation d'une petite appli avec vitefait2
Voici la liste des objets créés par vitefait
annuaire.export (export vitefait) : code servant à l'export vers un autre zope
annuaire_html (code html) : tout le code html de l'image
annuaire_prog (programme vitefait) : le programme principal de traitement de l'image
annuaire_prog_ajout_modif_tests : le programme contenant les tests en ajout et modif
annuaire_prog_ajouter (fonction ajout) : le code d'appel de la fonction sql ajout
annuaire_prog_lister (fonction lister)  : le code d'appel de la fonction sql ajout
annuaire_prog_modifier (fonction modifier) : le code d'appel de la fonction sql ajout
annuaire_prog_rab (programme de remise à blanc image) : fonction de remise à blanc (non
utilisée ici)
annuaire_prog_supprimer (fonction supprimer) : le code d'appel de la fonction sql ajout
annuaire_prog_voir (fonction voir) : le code d'appel de la fonction sql voir
Puis tous les ordres SQL:
annuaire_sql_ajouter (ajout dans la table) 
annuaire_sql_cretab (création de table) 
annuaire_sql_droptab (suppression de table) 
annuaire_sql_lister (liste de la table) 
annuaire_sql_modifier (mise à jour de la table) 
annuaire_sql_supprimer (suppression dans la table) 
annuaire_sql_voir (vue de la table) 




Autre exemple : traitement d'une demande de travaux


Cet exemple est plus complet, il s'agit du traitement d'un formulaire de demande de travaux. Ce
traitement a été réalisé pour un hôpital.
Principe : l'application est la reprise d'un formulaire papier tel qu'il existe. Elle comprend 2
modules, le module de demande de travuax aux services techniques et le module de traitement
de la demande par les services.
Le formulaire apparaissant dans les services est identique au formulaire apparaissant aux
services techniques. Le service remplit la première partie, les services techniques la deuxiéme et
ensuite renseignent une fiche produit utilisé et une fiche temps passé.
DEMANDE
Nom, service du demandeur et date de demande seront remplis automatiquement.
L'utilisateur peut changer le service en allant dans un menu déroulant.
Nature des travaux est une case à cocher (pour autre il faut préciser)
lieu d'intervention : quatres lignes
conditions spécifiques d'intervention : bouton oui/non si oui préciser : quatre lignes
Tous les champs remplis par les services techniques apparaissent quant on va rechercher la
fiche.


Le nom du programme est bons_de travaux, le nom de la table SQL est btravaux


Dessin


Touches


champs
ajouter,modifier,lister,voir#,rab
<center><h1>Demande de travaux</h1></center>

      Nom du demandeur       §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Service du demandeur   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Date de demande        §§§§§§§§§§§§§§§§

      Nature des Travaux

      ^ déplacement de mobilier, déménagement de locaux ou meuble, tv, lit

      ^ réparation et entretien de biens mobiliers et immobiliers, commode, serrure,

          barrière de lit

      ^ plomberie : débouchage de wc et lavabo, fuite de chasse d'eau, fuite de radiateur, 

          installation arrivée d'eau

      ^ électricité : changement d'ampoule, néon, prises, rallonge de cable d'antenne, 

          réparation sonnette

      ^ téléphonie : installation de téléphone ou réparation, cablage informatique

      ^ fixation de cadre, tablette de salle de bain, étagère

      ^ autre

      [rows=10 cols=80]

      Lieu d'intervention

      [rows=4 cols=80]

      conditions spécifiques d'intervention 

      ^ oui  ^ non

      [rows=4 cols=80]

<div class="nepasimprimer">

<hr>

<center>Partie réservée aux services techniques</center>

      Etat de l'intervention §§§§§§§§§§

      motif si refus

      \[rows=4 cols=80]

      Date prévue            §§§§§§§§§§

      Date réelle            §§§§§§§§§§
      réalisé par            §§§§§§§§§§§§§§§§§§§§

      Si société extérieure

      Nom                    §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Date devis             §§§§§§§§§§


      §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

</div>


Tests et code
!val.k_nom<>"":votre code utilisateur est erroné
# vérif si le code utilisateur est rempli
!val.service<>"":votre code service est erroné
# vérif si le service est rempli
!val.has_key('typnature'):le choix nature d'intervention n'a pas été saisi
!val.nature<>"":la nature de la demande n'est pas remplie
# vérif si la nature de demande est remplie
!val.lieu<>"":le lieu d'intervention n'est pas rempli
# vérif si le lieu d'intervention est rempli
!val.has_key('cspec'):le choix condition d'intervention n'a pas été saisi
# vérif si condition d'intervention est coché
!val.cspec=="2" or val.cspectxt <> "" :problème sur condition d'intervention ­ 1
# si la réponse est non la zone texte doit être vide
!val.cspec=="1" or val.cspectxt == "" :problème sur condition d'intervention ­ 2
# si la condition est oui la zone texte doit être remplie
!val.ear=="":fiche non modifiable - en cours
# une fois que les services techniques sont intervenus sur la fiche, elle n'est plus modifiable
/**/
#prog=ajouter_trait
!val.k_date == "":la fiche a déjà été validée
# éviter les doubles ajouts en testant si la date est encore vide
date = str(prg.ZopeTime())
val.set('k_date',date[0:16])
# mettre date et haure dans la zone date
/**/
#prog=remplit
if not(val.has_key('k_nom')) or val.k_nom == "":
    nom = str(prg.portal_membership.getAuthenticatedMember())
    val.set('k_nom',nom)
    service = prg.portal_metadirectories.members.getEntry(nom).get('Service')
    val.set('service',service)
# code permettant d'aller rechercher l'utilisateur loggé et le service de l'utilisateur
# l'annuaire se trouve sous CPS
val.set('msg_erreur_box','y')
# permet d'avoir les erreurs sous forme d'une petite fenêtre en javascript
k_nom,service,k_date,typnature,typnature,typnature,typnature,typnature,typnature,
typnature,nature,lieu,cspec,cspec,cspectxt,ear,motrefus,dprev,dreel,stse,nomsoc,
ddev,msg_erreur


if val.has_key('ear'):
    if val.ear == "1":
        val.set('ear','accepté')
    elif val.ear == "2":
        val.set('ear','refusé')
    elif val.ear == "3":
        val.set('ear','en attente')
# Etat de la demande en fonction de ce qui a été coché par les services techniques
if val.has_key('stse'):
    if val.stse == '1':
        val.set('stse','services techniques')
    elif val.stse == '2':
        val.set('stse','société extérieure')
# idem pour la zone intervention services techniques ou société extérieure
/**/
#prog=service_options
for service in prg.service_sql_lister():
   if val.service == service['service']:
       print "<option SELECTED>"
   else:
       print "<option>"
   print service['service']


   print "</option>"
return printed
# la case service est une zone déroulante, le code de service_options
# la remplit avec tous les éléments trouvés dans la table SQL service
SERVICE
la fiche service est toute simple, le nom de table est table_service


touches : voir,ajouter,modifier,supprimer,lister
champs : service, msg_erreur
<center><h1>Fichier des service</h1></center>

Service $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


TRAITEMENT PAR LES SERVICES TECHNIQUES
Le nom du programme est bons_de travauxST, le nom de la table SQL est btravaux
la fiche est la même que la précédente mais les services techniques remplissent la deuxième
partie. Ils sont d'office en mode modification sur la fiche.
DESSIN


touches


champs
<center><h1>Traitement de demande de travaux</h1></center>

      Nom du demandeur       §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§ Téléphone et Bip §§§§§§§§§§§§§§§ §§§§

      Service du demandeur   §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Date de demande        §§§§§§§§§§§§§§§§

      Nature des Travaux

      \^ déplacement de mobilier, déménagement de locaux ou meuble, tv, lit

      \^ réparation et entretien de biens mobiliers et immobiliers, commode, serrure,

          barrière de lit

      \^ plomberie : débouchage de wc et lavabo, fuite de chasse d'eau, fuite de radiateur,

          installation arrivée d'eau

      \^ électricité : changement d'ampoule, néon, prises, rallonge de cable d'antenne,

          réparation sonnette

      \^ téléphonie : installation de téléphone ou réparation, cablage informatique

      \^ fixation de cadre, tablette de salle de bain, étagère

      \^ autre

      \[rows=10 cols=80]

      Lieu d'intervention

      \[rows=4 cols=80]

      conditions spécifiques d'intervention §§§

      \[rows=4 cols=80]

<div class="nepasimprimer">

<hr>

<center>Partie réservée aux services techniques</center>

      Etat de l'intervention ^ acceptée ^ refusée ^ en attente

      motif si refus

      [rows=4 cols=80]

      Date prévue            $$$$$$$$$$

      Date réelle            $$$$$$$$$$

      réalisé par            # services techniques  # société extérieure

      Si société extérieure

      Nom                    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

      Date devis             $$$$$$$$$$

      §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


modifier,lister,voir#,fournitures,temps


tests et code
!val.has_key('ear'):l'état d'intervention n'a pas été saisi
# vérif si l'état de l'intervention a été coché
!val.ear<>"2" or val.motrefus <> "" :demande acceptée avec un motif de refus
# si la demande est acceptée le motif de refus doit être vide
!val.ear=="2" or val.motrefus == "" :problème refusée sans motif
# si la demande est refusée, le motif de refus doit être rempli
/**/
#prog=remplit
if val.has_key('k_nom'):
  if val.k_nom <> "":
    tel = prg.portal_metadirectories.members.getEntry(val.k_nom).get('Telephone')
    bip = prg.portal_metadirectories.members.getEntry(val.k_nom).get('Bip')
    lsttel = ''
    for t in tel:
       lsttel = lsttel + t + ' '
    val.set('Telephone',lsttel)
    val.set('Bip',bip)
# recherche des zones téléphone et bip dans l'annuaire CPS
if val.has_key('cspec'):
    if val.cspec == "1":
        val.set('cspec','oui')
    elif val.cspec == "2":
        val.set('cspec','non')
# la case à cocher conditions spécifique d'intervention devient oui ou non
val.set("eq_ear","")
print prg.vitefait_debut(prg,val)
val.set('vitefait_debut_affiche_pas','1')
print "<center><b>Demandes en attente de prise en compte</b></center>"
print prg.bonsDeTravauxST_prog_lister(prg,val)
# affichage des demandes en attente avec un titre
return printed
# on va lister toutes les demandes qui n'ont pas été traitées
/**/
#prog=voir_trait_fin
k_nom,Telephone#,Bip#,service,k_date,typnature,typnature,typnature,typnature,
typnature,typnature,typnature,nature,lieu,cspec,cspectxt,ear,ear,ear,motrefus,dprev,
dreel,stse,stse,nomsoc,ddev,msg_erreur


val.SESSION.set("typnature",val.typnature)
# conservation de typnature pour toute la session ce type de champs ne renvoyant
# pas sa valeur
/**/
#prog=modifier_trait
if val.cspec == "oui":
    val.set('cspec','1')
elif val.cspec == "non":
    val.set('cspec','2')
# traitement inverse du précédent sur condition spécifique d'intervention
val.set('typnature',val.SESSION['typnature'])
# pour rendre la valeur typnature remplie (ce type de champs ne rendant pas sa valeur 
# quand il est protégé


/**/
#prog=fournitures
if val.k_nom <> "":
    val.set("bonsDeTravauxST_affiche_pas","o")
    print prg.bonsDeTravauxFournitures_prog(prg,val)
    return printed
# si la touche fournitures est cochée, on appelle le programme bonsDeTravauxFournitures
/**/
#prog=temps
if val.k_nom <> "":
    val.set("bonsDeTravauxST_affiche_pas","o")
    print prg.bonsDeTravauxTemps_prog(prg,val)
    return printed
# si la touche temps est cochée, on appelle le programme bonsDeTravauxTemps
PROGRAMME FOURNITURES
nom : bonsDeTravauxFournitures, table SQL : btravauxfour
dessin


touches : voir#,ajouter,modifier,supprimer,temps,fiche
champs : k_nom,service,k_date,fourniture,qte,msg_erreur


Tests et code:
/**/
#prog=remplit
val.set("eq_k_nom",val.k_nom)
val.set("eq_k_date",val.k_date)
print prg.bonsDeTravauxFournitures_prog_lister(prg,val)
return printed
# liste de toutes les fournitures correspondant à la fiche en cours
/**/
#prog=fourniture_options
for produit in prg.produits_sql_lister():
   print "<option>"
   print produit['libprod']
   print "</option>"
return printed
# remplissage de la zone déroulante produit à partir de la table produit
/**/
#prog=temps
val.set('bonsDeTravauxFournitures_affiche_pas','o')
print prg.bonsDeTravauxTemps_prog(prg,val)
return printed
<center><h1>Traitement de demande de travaux</h1></center>

      Nom du demandeur       §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Service du demandeur   §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Date de demande        §§§§§§§§§§§§§§§§

<hr>

<table>

<tr>

<td>Fournitures nécéssaires</td><td>Quantité</td>

</tr>

<tr>

<td>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</td><td>$$$$$$$$$$</td>

</tr>

</table>

§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


# si la touche temps est cochée appelle du programme temps
/**/
#prog=fiche
val.set('bonsDeTravauxFournitures_affiche_pas','o')
print prg.bonsDeTravauxST_prog(prg,val)
return printed
# si la touche fiche est cochée retour au programme fiche
PROGRAMME PRODUITS
nom du programme : produits, nom table : table_produits
dessin


Touches : voir#,ajouter,modifier,supprimer,lister
champs : k_numprod,libprod,msg_erreur
PROGRAMME TEMPS
nom du programme : bonsDeTravauxTemps, table sql : btravauxtemps


Touches: voir#,ajouter,modifier,supprimer,fournitures,fiche
Champs: k_nom,service,k_date,agent,temps,msg_erreur
tests et code :
/**/
#prog=remplit
val.set("eq_k_nom",val.k_nom)
<center><h1>Fichier des produits</h1></center>

Code Produit    $$$$$$

Libellé produit $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


<center><h1>Traitement de demande de travaux</h1></center>

      Nom du demandeur       §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Service du demandeur   §§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

      Date de demande        §§§§§§§§§§§§§§§§

<hr>

<table>

<tr>

<td>Nom de l'agent</td><td>Temps</td>

</tr>

<tr>

<td>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</td><td>$$$$$$$$$$
</td>

</tr>

</table>

§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§


val.set("eq_k_date",val.k_date)
print prg.bonsDeTravauxTemps_prog_lister(prg,val)
return printed
# liste de toutes les fiches temps du dossier en cours
/**/
#prog=agent_options
for agent in prg.agents_sql_lister():
   print "<option>"
   print agent['k_nomagent']+' '+agent['k_prenomagent']
   print "</option>"
return printed
# remplissage de la zone déroulante agent à partir de la table sql agent
/**/
#prog=fournitures
val.set('bonsDeTravauxTemps_affiche_pas','o')
print prg.bonsDeTravauxFournitures_prog(prg,val)
return printed
# si la touche fournitures a été cochée, appel du programme fourniture
/**/
#prog=fiche
val.set('bonsDeTravauxTemps_affiche_pas','o')
print prg.bonsDeTravauxST_prog(prg,val)
return printed
# si la touche fiche a été cochée appel du programme correspondant à la fiche
# la variable  bonsDeTravauxTemps_affiche_pas est positionnée pour ne pas
# réafficher la fiche temps derrière
PROGRAMME AGENT
Nom du programme : agents, table SQL : table_agents
dessin


touches : voir#,ajouter,modifier,supprimer,lister
champs : 
k_nomagent,k_prenomagent,msg_erreur
<center><h1>Fichier des agents</h1></center>

nom agent       $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

prénom agent    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§