ABC

Automatic Business Computing

Made in Eiffel

décembre 2000

Table des Matières

Introduction 4

Installation 6

Utilisation 7

Le Tirer-lâcher 7

Démarrage 7

Les catalogues 9

Editeur 10

Documents 11

Comptabilité 14

Taxe 15

Gestion de stock 16

Gestion du personnel 17

Autres gestions 17

Tâches privilégiées 17

Devise, Fonctions de vente et Comptes 18

Modèle 18

Filtre 25

Filtres de génération 28

Utilisateurs 29

Importer Exporter 29

Importer des données 29

Exporter des données. 30

Purger le journal 30

Edition de hiérarchie 30

Adaptation 33

Traduction de l'interface 33

Préférences 33

Commandes externes. 33

Mise en service 34

Annexe 36

Préférences système 37

Préférences personnelles 39

Modèles 41

Grammaire d'importation 43

Commandes 45

ABC_lock 45

ABC_unlock 45

accounter 45

bc_translate_ABC 45

check_login_user 46

check_spelling 46

correct_spelling 46

collection_filter 46

editor_filter 47

fax_attachments 47

get_user_identity 48

html_document_filter 48

html_spool_mail 48

html_spool_printer 49

html_translate_pcx 49

html_translate_ps 49

import_data 49

is_user_root 50

mail_attachments 50

manager 50

pcx_spool_fax 50

ps_document_filter 50

ps_spool_fax 51

ps_spool_printer 51

rtf_document_filter 51

rtf_spool_mail 51

rtf_spool_printer 52

rtf_translate_pcx 52

rtf_translate_ps 52

sale_time_function 52

show_archive_filter 53

substitute 53

translate_phone_number 53

valid_email_address 54

valid_phone_number 54

valid_post_address 54

Index 54

Introduction

ABC est conçu pour minimiser l'effort requis par la gestion commerciale des PMEs. L'administration d'entreprise est évidemment indispensable. Sans cela, l'entreprise risque certainement d'échouer rapidement. Cependant, celle-ci coûte cher en temps et en énergie. Notamment, pour qui veut savoir précisément comment il vit, quels sont les en-cours, etc, mais dont le hobby n'est pas de produire du papier administratif.

Certes, l'entreprise doit faire ses factures, c'est le moins pénible, mais aussi ses commandes, publier ses listes de prix, faire ses payements gérer ses stocks. Ceci sont les documents essentiels. Il y en a bien d'autres. Leur nombre et leur forme dépendent du type d'activité. Soit, il faut bien les faire, les contrôler car une erreur peut coûter cher. De plus, il faut consigner dans la comptabilité les mouvements financiers qui y correspondent. Mais ensuite, il faut faire le suivi des débiteurs et des créances. Il faut trop souvent faire le bilan TVA.

Or, d'une part, beaucoup de documents sont liés, soit totalement soit partiellement. D'autre part presque toutes les écritures comptables sont la conséquence automatique d'un document commercial. Par exemple, une facture d'un fournisseur est, si tout se passe normalement, la version fournisseur d'un bon de commande. Certes, au passage, on peut entériner une remise exceptionnelle. Certes, cette facture il faut la payer mais pas trop tôt. Donc, ipso-facto cette facture devient une créance qu'il faudra payer à terme. Malheureusement, il ne faudra pas oublier cette échéance et faire alors un ordre de payement. Que d'opérations!

L'objectif numéro un d' ABC est de réduire tous ces travaux aux seules prises de décisions. La première prise de décision pourrait être de décider de commander à un certain fournisseur et de fixer les volumes. Le bon de commande est donc défini par l'utilisateur. La seconde étape est la réception de la facture du fournisseur. L'utilisateur doit l'approuver. Avec ABC on réalise cela en créant automatiquement l'équivalent de la facture du fournisseur à partir du bon de commande auquel il doit nécessairement se référer pour pouvoir prendre ses décisions en toute connaissance de cause. L'utilisateur pourra éventuellement fixer le délai de payement. C'est tout! La prise en compte de la créance sera automatique au niveau de la comptabilité (et le bilan mis à jour). La ventilation analytique sera également faite. Mais, ensuite, le document de payement sera automatiquement produit au bout du délai spécifié et soit imprimé soit transmis par voie électronique . Lorsque le payement sera déclenché, la décharge du compte créancier sera réalisée automatiquement au détriment du compte de liquidité utilisé pour ce faire. En résumé, il reste deux actions à charge de l'utilisateur: commander et approuver. Peut-on descendre en dessous?

Le second objectif est de minimiser les erreurs. Pour atteindre cet objectif, ABC minimise le nombre de saisie au clavier. L'essentiel des manipulations s'effectuent par tirer-lâcher. Ainsi, pour réaliser une facture pour un client, il suffit d'ouvrir l'éditeur pour ce modèle de document et de lâcher une adresse dans le trou ou le champ du destinataire. De même pour les produits fournis. Evidemment, il faudra indiquer la quantité fournie. La facture est prête. Plus court encore. Deux clients doivent recevoir la même facture. La première est réalisée comme nous venons de la décrire. Pour le second, on lâchera simplement l'adresse d'une part et d'autre part on lâchera la première facture dans le trou modèle. Le système complétera le document. Ici, une seule erreur est possible: mal fixer la quantité fournie. Peut-on descendre en dessous?

Le troisième objectif est la flexibilité. En conséquence, évidemment, le systèmes est polyglotte, il accepte plusieurs formateurs (traitement) de texte pour l'édition papier ou autre des documents et des personnalisation individuelles et collectives. Mais, au-delà, tout les modèles de document et leur comportement sont définis en fonction du mode de fonctionnement de l'entreprise. Dans la même optique, les collections, telles que les comptes terminaux, produits, adresses, peuvent être partitionnées de multiple façons. Elles peuvent ainsi être abordées selon divers points de vue. Par exemple, le comptable peut avoir un point de vue sur l'ensemble des adresses et le vendeur un autre. Le premier créera une hiérarchie selon une logique de solvabilité. Le vendeur verra des groupes de clients avec diverses potentialités. Une autre hiérarchie pourra être des classes de tarifications. La balance TVA n'est rien d'autre qu'une vue réduite sur l'ensemble des comptes focalisée sur les seules comptes concernés.

Installation

Le produit est fourni sous forme d'une archive (zip ou tar.gz) ou d'un CDRom. Si vous partez d'une archive, il faut créer un répertoire temporaire d'installation puis se positionner dans celui-ci et extraire les fichiers hors de l'archive.

Lisez ensuite le README. Ce texte donne les instructions précises à suivre en fonction de la version et de la plate-forme. Si vous faites une mise à jour, il faut impérativement faire une sauvegarde tant des données que de l'ancienne distribution!

Pour une nouvelle installation, le système offre automatiquement une période d'essai libre. Des exemples de documents sont fournis avec le produit. Ils peuvent être copiés dans l'espace des données en lieu et place de vos données. Ceci permet un premier contact avec le système avant de le définir à votre main. En effet, ABC permet une adaptation poussée mais, cette adaptation n'est vraiment possible que pour autant que l'on ait saisi le fonctionnement. Notamment, la définitions des modèles de documents et de leurs comportements n'est pas triviale. Il est donc judicieux d'utiliser ceux proposés, de les modifier pour comprendre les mécanismes avant de se lancer dans la définition des documents d'exploitation. Le kit d'installation propose plusieurs modèles prédéfinis. Il est possible d'en installer plusieurs successivement ou simultanément. En installant deux modèles très différents tels que `vente' et `association' on peut très vite apercevoir à quel point ABC est adaptable à une activité quelconque. La seule condition étant de pouvoir formuler ses propres règles.

Il est judicieux de créer un répertoire spécifique pour recevoir le produit. De plus si vous voulez installer plusieurs versions, créez un sous répertoire pour chaque version. Ainsi, vous pourrez supprimer toute les versions inutiles en supprimant simplement les répertoires superflus. ABC ne copie rien en dehors des deux répertoires qu'il réclame durant la procédure d'installation. C'est répertoires sont par défaut des sous répertoires du répertoire de travail pour Linux et de C:\abc pour Windows.

Le système est pret pour une phase d'apprentissage. Une fois celui-ci terminé, vous pourez faire la mise en service définitive. Référez vous à la procedure décrite à cette effet sous le titre ``mise en service''.

Utilisation

Le Tirer-lâcher

L'interface graphique est largement inspirée sur la métaphore du tirer-lâcher. Cette métaphore suggère l'idée qu'un objet est tiré depuis une source quelconque et que l'on transmet cet objet à un destinataire. Puis généralement, la source ne donne pas vraiment cet objet mais seulement un accès, une référence. Quand le destinataire à reçu et accepté cet objet, il peut agir dessus. Le destinataire est donc généralement un outil capable d'agir correctement sur le type d'objet reçu.

Graphiquement, ce mécanisme est mis en évidence par un curseur qui prend une forme symbolisant l'objet attaché. Un fil lie ce curseur à la source d'origine (ceci montre bien que la source reste liée). Les récepteurs typiques sont des boutons dont la forme suggère leur aptitude à recevoir l'objet transporté. Le mécanisme se déclenche en pressant puis en lâchant le bouton droit de la souris sur une source. L'objet est alors tiré. En pressant à nouveau sur ce même bouton de souris, on lâche l'objet. Si cela se fait sur un récepteur acceptant ce type d'objet, la transmission est terminée avec succès, sinon l'objet tombe à l'eau et rien ne se passe.

Ce mécanisme, quoi que encore peu usuel permet des interfaces compactes et puissantes. En effet, il n'est pas nécessaire de prévoir des mécanismes qui pour chaque source permettent d'atteindre chaque destinataire. De ce fait on évite l'explosion combinatoire de l'interface.

Démarrage

Nous supposons ici que le système est chargé de toutes les données utiles. Ceci est le cas si vous utilisez les exemples fournis, ou si vous avez déjà importé des données et défini le comportement spécifique. Ces parties sont expliquées au chapitre de la maintenance.

Au démarrage, le système présente toujours un petit panneau de contrôle.

1. Sortie

2. Aide

3. Menu des documents

4. Journal

5. Journal des stocks

6. Cataloguedes produits

7. Caalogue des adresses

8. Sauvegarde de la configuration

9. Prérences

10. Traducteur d'interface

11. Acceès à la maintance

Toutes les fenêtres ont dans le coin supérieur droit un bouton de fermeture. Le panneau principal n'échappe pas à cette règle. Cependant, celui-ci demande une confirmation avant de quitter réellement l'application. Dans tous les autres cas, la fenêtre correspondante disparaît et oublie d'éventuelles modifications faites. Ceci évite de fastidieuses opérations de confirmation. Certes une sortie non appropriée fait perdre quelques opérations. Mais vu que le volume de travail pouvant être perdu est très minime, cela justifie le choix fait.

A gauche du bouton de fermeture, le bouton d'aide donne accès à un texte d'aide correspondant a la fenêtre. Ceci est vrai pour toutes les fenêtres.

Le menu ``document'' donne accès aux listes et éditeurs pour chaque modèle de document. Le nombre de modèle n'est pas limité et peut s'étendre pendant la vie du système. Les trois bouton suivant donnent accès aux catalogues les plus importants du système. Ce sont les produits, les adresses et le journal.

Selon le travail que l'on fait le plus couramment ou celui que l'on doit interrompre, il est intéressant de mémoriser une configuration, de travail. Ceci se fait simplement en pressant le bouton de configuration (7) au bas du panneau principal. Toutes les fenetres ouvertes seront remises en place dans la meme disposition lors du prochain démarrage de l'application. Les deux boutons de restants sont réservés à la maintenance.

Le bouton de traduction (8) permet de modifier les textes associés aux éléments graphiques de l'interface utilisateur.

Le bouton de maintenance (9) permet d'accéder à des fonctions d'une part par moins usuelles mais aussi réservées aux personnes ayant un statut privilégié. Ce bouton est absent pour les personnes non autorisées.

Les catalogues

Un catalogue a deux barres d'outils. Les outils de la première permettent de chercher dans le texte de la fenêtre, d'imprimer le contenu, d'appeler et de charger l'éditeur correspondant. Les deux boutons suivant permettent de supprimer un élément du catalogue et de renommer l'un deux.

La seconde barre permet de sélectionner un mode de présentation. Le premier est un mode séquentiel. Il liste les éléments dans l'ordre alphabétique des références. Le second est le mode hiérarchique. Dans ce mode, il faut choisir une hiérarchie parmi celles définies. Pour chaque catalogue, on peut définir autant de hiérarchies que l'on veut. En particulier, on peut classer une partie seulement des éléments. Dans ce cas, les éléments non classés vont automatiquement dans une partie dite ``non classée'' . Ceci permet notamment de créer une vie particulière des comptes, qui ne reprennent que les comptes concernés par la TVA.

Dans un catalogue, chaque element est présenté par une ligne de text comprenent sont identité et une courte description qui dépend de la nature de ces éléments. Par le biais des prefenreces personnels chaque utilisateur peut, cacher les identités.

Le choix d'une hiérarchie se fait soit en tapant le nom de celle-ci dans le champ de texte de la barre d'outil, soit en tapant un ``retour'' dans cette même fenêtre. A ce moment, un dialogue apparaît permettant de sélectionner le nom voulu.

Le dernier bouton permet de créer et modifier les hiérarchies correspondant au catalogue.

Tous les éléments de la fenêtre peuvent être ``tirés'' puis ``lâchés'' ailleurs et notamment dans un document.

On ouvre et l'on ferme une hiérarchie, alternativement, par simple sélection. On peut évidemment sélectionner une suite de partie en faisant glisser la souris sur plusieurs lignes en maintenant le bouton de sélection pressé. Pour ouvrir tous les niveaux sous-jacent d'une hiérarchie, il suffit de maintenir le bouton ``ctrl'' pressé en même temps que l'on effectue une sélection simple ou multiple.

L'éditeur de hiérarchie est expliquer dans la section maintenance.

Editeur

Tous les éditeurs sont équipés d'une barre d'outil normalisée. Le premier bouton permet de charger l'élément à éditer. Sa forme laisse comprendre le type d'élément qu'il accepte. Le bouton suivant permet d'imprimer un texte présentant l'élément. Au milieux un champ présent l'identité de l'élément. A gauche de ce champ un bouton permet de vider l'éditeur. A droite, un bouton permet de sauver l'édition. Puis vient un bouton permettant d'ajouter un commentaire libre associé à l'élément. Le bouton suivant ressemble comme deux gouttes d'eau au premier de la barre d'outil. Mais sa fonction est différente. En fait il permet de charger les valeurs d'un élément compatible. Ainsi, il est possible de définir partiellement un élément puis de compléter la définition en chargeant le boutons dont question avec un élément compatible déjà complètement défini dont les valeurs peuvent être réutilisées.

Certains éditeurs peuvent avoir des champs en lecture seule. C'est le cas par exemple de l'éditeur de produit dont le champ de prix de vente est verrouillé. En effet, cette valeur est calculée au moyen de la fonction de vente associée.

Documents

Une liste est dédicacée à chaque modèle de document. A chaque liste est associé un éditeur mis en forme en fonction du modèle. Les listes de documents sont équipés de la première barre d'outil des catalogues.

La partie supérieur de l'éditeur concerne les actions applicables au document. Cette section n'est active que lorsque le document inclu est correctement édité. L'édition ayant été sauvée, le menu d'action peut être tiré. La première action est, nécessairement, de fermer le document. Cela signifie qu'il n'est plus éditable. La date de cette fermeture apparaît dans le champ dédié à cette effet. Ce champ n'est pas éditable. Les actions suivantes dépendent du concepteur du modèle. Donc, ces actions doivent refléter la complexité procédurière de l'entreprise.

Dans les cas les plus simples, l'action de fermeture peut être la première d'une séquence qui enchaîne toutes les autres jusqu'à un état final. On peut imaginer qu'un courrier ordinaire est fermé par son auteur et automatiquement expédié par lettre ou fax ou courrier électronique voir par les trois voies selon les décisions du concepteur du modèle. Mais alternativement, le concepteur peut décider que l'action d'expédition n'est pas automatique car il veut forcer l'auteur à décider la voie d'expédition.

La session suivante de l'éditeur est dédiée au champs de textes spécifiques du document. Certains d'entre eux peuvent être obligatoires. Par exemple le champ délai pour une facture. Celui-ci sera utilisé pour piloter les éventuelles rappels.

Les document proprement commerciaux, c'est à dire ceux qui concerne une liste de produits échangeables ou échangés, ont une section supplémentaire. Celle-ci comprend une ligne d'édition de ligne et la liste des produits inclus. Un récepteur permet de recevoir un produit, venant par exemple du catalogue. Si l'on ``lâche'' un produit dans ce récepteur, la ligne est presque entièrement définie. Seule reste à définir le quantité concernée. On peut évidement modifier le prix unitaire par exemple pour cause de conditions spéciales négociées. Mais, par contre, on ne peut se référer qu'à un produit connu du système. Le système de comptabilité analytique automatique en dépend.

Dans le bas de cette section, on voit apparaître les montants totaux et les taxes associées ainsi que la devise dans laquelle est libellée le document. Notons que généralement, les document tournés vers les fournisseurs seront définis implicitement en devise définie par la devise du premier produit inclu. Par contre, les documents destinés aux clients seront normalement en devise locale (devise de référence).

Il faut noter que l'on peut parfaitement créer un document destiné à un client a partir d'un document fournisseur. Le système transpose les prix dans le sens approprié en se basant sur les définitions des produits et les fonctions de vente associées.

La liste des documents montre l'état de chacun. Ceci permet de se rendre très rapidement compte des documents en suspend. Notons que tout action automatique, qui doit être faite dès qu'un document est resté plus d'un certain temps dans un état donné, peut être réalisée grâce a une action dite d'attente introduite dans la séquence des actions qui conduit au dit état. Si l'état du document est toujours le même lorsque le délai est expiré, alors l'action en attente réalisera la transition qui lui est assignée. Cette transition contient elle aussi une action à effectuer (cela peut être l'action nulle). Cette transition, si l'action est réussie, conduira dans un nouvel état. Pour une facture, l'action peut être d'envoyer un rappel automatiquement. Notons que le texte du rappel sera différent du texte original par le fait que le filtre de mise en page sera différent de celui utilisé pour la première version. En fait, le système cherche dans la table de filtre celui qui a le nom du modèle qualifié du nom de l'état. Ainsi, le concepteur des documents créera par exemple une version normale du filtre et une version qualifiée par``.attente'` . Dans tous les états le système utilisera la version de base, faute de trouver une version qualifiée de façon appropriée, sauf dans le cas ou l'on passe de l'état attente a un état de rappel. La version de rappel du filtre contiendra simplement quelques formules fixes rappelant le débiteur à ses engagements.

Ce processus peut être cascadé, on peut imaginer deux ou trois rappels, suivit de la génération d'un document directement transmis à un office spécialisé dans les poursuites. En combinant les attentes, les actions simples ou en séquence, y compris la génération automatique de sous-document, il est possible de couvrir des processus très souples et complexes.

Reprenons ici l'exemple d'une commande. L'entreprise veut commander quelque chose à un tiers. Il faut émettre un bon de commande. Ceci est très vite fait et de façon sûre car le système connaît toutes les données sauf les quantités souhaitées. Fixer ces données est le seul point auquel l'opérateur doit faire attention, mis à part un rabais exceptionnel consenti par le fournisseur! Ce document est transmis automatiquement par fax par exemple. Dès réception de la marchandise, on fait passer le bon de commande dans l'état reçu. Ceci à pour conséquence de générer une facture fournisseur dans l'état ``brouillon'' . Cette facture peut être modifiée dans la mesure ou l'on a constaté une discordance entre la commande et la réception. A la réception de la facture réelle du fournisseur, une simple vérification suffira. Si l'on est d'accord en tout points, l'on fermera notre version de la facture et on la fera passer à l'état en ``attente de payement'' . Le payement sera déclenché automatiquement au bout du délai imparti par la génération d'une formule de payement. Bien sûr, aux diverses étapes, les écritures comptables nécessaires seront faites. Par exemple, à l'approbation de la facture le compte créancier sera chargé du montant approprié ainsi que des comptes TVA d'entrée. La distribution analytique des achats, peut se faire à la réception soit de la marchandise soit à la réception de la facture réelle du fournisseur. Ceci est une question de point de vue. Il faut se reporter au chapitre comptable pour une discussion des actions comptables et de la gestion des taxes.

Le chapitre de maintenance discutera en détail les diverses actions possibles et leurs usages. Il est aussi recommandé d'imprimer les définitions des modèles fournis dans les exemples et de les interpréter. Ceux-ci mettent en oeuvre des mécanismes tels que décrit ci-devant.

Certain document spéciaux peuvent être équipe d'un filtre de génération et contrôle des données contenues dans chaque spécimen. C'est le cas par exemple d'une fiche de salaire, qui sera discutée plus loin, ou d'une fiche de travail spécifique à un métier.

Un filtre de génération de donnée fonctionne sensiblement de la même manière qu'autre filtre de présentation/édition. D'un part, un spécimen du modèle est créé et les champs de donnée qu'il évoque sont remplacés par les valeurs correspondante du document en cour d'édition. Le programme associé à ce type de filtre est ensuite exécuté. Celui-ci crée un fichier de sortie contenant les valeurs à introduire ou modifier dans le document en cour d'édition juste avant la sauvegarde. A ce moment, le test de validité et de complétude du document est effectué. Si celui-ci est satisfait, alors le document est sauvegardé. Les techniques de création de tels filtres sont discutés plus loin dans la section de maintenance.

Comptabilité

Le catalogue des comptes terminaux présente la liste des comptes terminaux. Nous entendons par comptes terminaux ceux qui sont directement utilisés dans une écriture soit comme origine ou destination. Tous compte terminal a une identité unique. Il est présenté par cette identificateur et peut avoir une description complémentaire par le biais du commentaire associé (voir éditeur). On peut donc donner a un compte une identité nominative logique telle que ``caisse'' et un commentaire telle que ``1001 ...''. Le commentaire fournit ici la référence au numérotations traditionnelles (introduit par les balbutiement de la mécanographie). L'inverse est aussi possible. Au même compte ont peut donner l'identité 1001 et le commentaire ``caisse''. Rappelons au passage que chaque utilisateur peut, pour tout catalogue, cacher les identités. Ainsi, il y a devrait y avoir de quoi satisfaire tous le monde sauf peut être les autoritaires! Mais, rappelons que pour toute action comptable qui n'est pas automatique, ce sont les identificateurs qui sont utilisés. Ainsi par exemple si un payement peut ce faire par caisse, carte de crédit ou banque, si les identificateurs sont 1001, 1003, 1010 votre expert comptable sera heureux, mais l'utilisateur normal lui sera peut être un peu confus!

Comme pour les autres catalogues, on peut définir des hiérarchies (partitions) sur l'ensemble des comptes terminaux. C'est par ce biais que l'on crée des plans comptables. Bien entendu, toute partition couvre totalement l'ensemble des comptes terminaux. Les comptes globaux sont donc les parties ainsi constituées. IL est donc possible d'avoir divers points de vue sur une même réalité dans la mesure ou l'on peut affirmer que les comptes terminaux représentent la réalité!

Notons, que l'affichage d'une hiérarchie sur les comptes montre, pour autant que l'utilisateur ait les privilèges requis, la balance de chacun d'eux qu'ils soient terminaux ou globaux. En se concentrant sur le sommet d'un telle hiérarchie, construite selon des normes usuelles, on donne une vue instantanée du bilan (sans écriture de clôture bien évidemment, ceci reste de la seule responsabilité des utilisateurs).

A tout le moins, tout système devrait contenir deux hiérarchies. La première représente le plan comptable légale, la seconde représente le bilan des comptes de taxe, du moins en régime de TVA. Attention, toutes les présentations sont équivalentes et correctes du moins dans la mesure ou tous les comptes sont classés (c'est à dire que la partition automatique qui reprend tout les éléments n'ayant pas été explicitement classés est vide).

Mais on pourra ajouter divers points de vue analytiques. Lorsque l'on définit des produits, ont définit aussi des comptes spécifiques pour la comptabilité analytique. Ces comptes sont normalement créés automatiquement en respectant les règles de taxinomie définies dans le fichier des préférences systèmes. Les actions comptables automatiques engendrées par les documents permettent de maintenir cette comptabilité parfaitement à jour de façon totalement implicite.

Le catalogue des comptes à, dans sa barre d'outils, un bouton d'accès chargeable supplémentaire par rapport aux autres catalogues. Celui-ci permet de visualiser un compte quelconque.

Taxe

Parmi les actions comptables automatiques, il y a celles qui permettent d'enregistrer les flux de taxes en entrée et en sortie. Dans la définition d'un produit, on doit introduire le taux de taxe qui y correspond. Cette valeur est utilisée par les actions spécifiques de gestion des taxes (voir liste des actions).

Le système construit automatiquement des comptes d'entrée et de sortie pour chaque taux de taxe. Ainsi, les flux de taxe sont automatiquement comptabilisés sur des comptes séparés par niveau en entrée et sortie. Si il y a 5 niveaux, il y aura 10 comptes. On construira donc une hiérarchie avec ces comptes terminaux de telle sorte à disposer des données sous la forme souhaitée pour l'administration concernée. La figure suivante donne un exemple d'une telle structure.

Gestion de stock

Lors de la définition d'un produit, on peut définir le niveau du stock courant et les bornes minimum et maximum de ce stock. Si ces champs sont définis, alors, il est possible de créer des documents modèles qui permettent d'automatiser les rapprovisionnements.

Pour que ce mécanisme fonctionne, les conditions suivantes doivent être réunies.

· Certain documents ont un automate qui fait appel aux actions de stockage et de déstockage. Les uns pour constater les entrées de marchandises, les autres pour constater les sorties. (Voir la spécification des documents au chapitre de la maintenance). Grâce à ce premier mécanisme, le niveau de stock physique est automatiquement maintenu en correspondance avec la réalité, pour autant que l'un de ces documents tienne également compte de pertes éventuelles ou que l'on corrige manuellement les stocks dans de telles éventualités.

· Un document, que nous nommerons ici, modèle de commande, est défini. Il rassemble un ensemble de produits qui devraient être commandés ensembles. Cela peut être tous les produits que l'on commande nécessairement chez un même fournisseur. L'automate de ce modèle de commande est conçu de telle sorte a générer un bon de commande. Il est possible de lancer automatiquement la première transition du bon de commande ainsi générée. Cette transition peut fermer le document et le transmettre directement au fournisseur. Cependant, la prudence voudrait que l'on laisse le document généré dans l'état de brouillon de telle sorte à pouvoir le vérifier, y appliquer quelques retouches en fonction des circonstances. Puis on donnera l'ordre de transmission manuellement.

Gestion du personnel

Un document appelé ``fiche de salaire'' peut créé afin de gérer les salaires. Il s'agira d'un document de type fournisseur. En effet, l'entreprise paye un service fourni exempt de TVA. Par contre, cette prestation s'accompagne de cotisations diverses. Celle-ci diffèrent de pays à pays. Généralement une partie du montant total du document est payée au prestataire des services. Les autres parties sont cumulées dans des comptes spécifiques faisant l'objet de décomptes séparés et différés.

Ces cotes part dépendent des législations de chaque pays, branche, etc. L'exemple d'un tel document est fournit avec le produit. Il est construit sur base de la réglementation suisse. L'exemple est basé sur une entreprise prestataire de service à domicile. Dans le catalogue des produits on trouve un produit appeler ``prestation'' côté à la valeur de la rémunération dite nette de l'employé. Deux autres produits existent dans le catalogue appelé ``AVS'' et ``AC''. Celle-ci sont côtés au taux de cotisation par francs de rémunération.

Un filtre de calcul est associé à ce modèle de document. Comme décrit plus haut, ce filtre est appelé avant la fermeture du document. La seule opération que l'utilisateur doit faire, est d'introduire le produit ``prestation'' et le nombre d'heures effectuées dans ce document appelé fiche de salaire. A lapremiére transition, le filtre complète le document avec les cotisations. Dans l'exemple proposé, dés que le document est fermé, on peut lui appliquer l'événement ``payer''. Ceci entraîne la création d'une formule de paiement pour la part qui est effectivement versée à l'employé. En même temps, les comtes ``AVS'' et ``AC'' sont charger pour les montant adéquats.

Autres gestions

Les automates et les actions associées aux documents permettent d'automatoser la gestion de bien d'autres problémes. Vous trouverrez dans les exemples fournis la gestion du travail du caviste. Cette automatisation est réalisée à l'aide de deux documents. Le premier, qui est le seul manipulé directement par le caviste, est nommé: ``mise en bouteilles''. Il utilise un filtre actif, comme pour la gestion des salaires, pour générer les apports auxilliaires à la mise en bouteilles. La caviste doit seulement préciser la capacité de son tonneau et la dénomination du vin. Plus précisément, il ``tire & lache'' un produit de type vin XY en vrac dans le document, puis il spécifie la quantité, c'est a dire le volume du tonneau. Le filtre générateur de champs, ajourtera les entrants secondères, c'est à dire les bouteilles, bouchons, etc. Lorsque le travail est terminé, il fera passé le document de l'état ``en cours'' à celui de terminié. Ce changement d'état provoquera le génération du second document nommé: ``création de bouiteilles''. Ce second document n'est pas manipulé directement. Il peut meme etre totalement masqué à utilisation ordinaire.

Cet exemple à pour seule prétention de montrer une voie pour aborder toute sorte de probléme de manutention de service et meme des problèmes de productions.

Tâches privilégiées

Devise, Fonctions de vente et Comptes

Ces trois collections ne sont accessibles que par le menu de maintenance pour des raisons de sécurité. En effet, seule un responsable de gestion peut modifier les cours des devises, ajouter ou supprimer des comptes, altérer les fonctions de vente. La manipulation de ces outils d'édition ne présente cependant aucune difficulté. Il faut cependant noter que ces collections sont aussi accessibles par tous les utilisateurs mais en mode de lecture seule.

Modèle

Tout document est édité en partant d'un modèle. Les modèles doivent être définis par un responsable privilégié du système. La définition d'un mode comprend trois sections. Dans un premier temps, il faut choisir la classe de base du document, puis il faudra définir les champs de textes et enfin définir l'automate associé. Quatre classes de document sont reconnues actuellement: lettre, fournisseur, client, payement. La classe des lettres est la plus simple. Elle ne comprend que des champs de textes. Les classes client et fournisseur ont une liste de produits et des notions de valeurs et taxes. Et sont différenciées par la façon dont elles calculent leurs valeurs. La classe dite des payements sert à des actions après vente ou achat. Elle a des notions de valeur. L'usage le plus évident de cette classe est bien entendu de créer des formulaires de payement d'où le nom.

Tout document à une identification ou référence. Tout document à une identification unique pour son type. Le modèle définit le type référence. L'on peut choisir soit une numération continue absolue, soit une numérotation continue par année. En outre cette numérotation peut être précédée d'un préfixe. Il faut cependant noter que l'on ne peut changer le système de référence que si le classeur correspondant est vide, ceci pour une raison de cohérence.

Les documents commerciaux de type client ou fournisseur comprennent une liste de produits concernés avec pour chaque ligne une quantité, un prix unitaire, etc. Un tel document a une valeur et éventuellement un montant de taxe associé. La valeur du document plus la taxe donne une valeur totale. Pour de tels documents, il est nécessaire de préciser le régime de taxation. Soit ce régime doit être défini par l'utilisateur au moment de la rédaction d'un exemplaire, soit le modèle force un régime. Typiquement, on peut définir un modèle de facture-export tel que ces documents sont d'office hors taxe. Dans cette même section, on peut forcer une devise autre que la devise de référence. Notons au passage que la devise de référence à la vente est la devise de référence locale (voir devise). Alors que la devise implicite à l'achat est la devise du premier produit de la liste. L'assertion que les produits d'un fournisseur sont tous vendus dans une même devise à été faite.

L'étape suivante consiste à définir les champs spécifiques. Un champ peut être obligatoire ou facultatif. Le systeme supporte trois type de champs: text, ou numérique (entier ou réel). Les champs numérique peuvent etre des vecteurs (un suite de valeurs). Les champs de textes peuvent contenir une ou plusieurs lignes. Un champ de text peut avoir une longueur infinie, Il suffit de lui attribuer un texte tournant. La liste des champs définis présente un champ facultatif entre crochet carrés. Les champs à multiples lignes indiquent leur nombre de lignes et ils sont souvent suivis du caractère @ s'ils sont potentiellement sans limites. Pour modifier la définition d'un champ, il suffit de le sélectionner.

Ensuite la définition du comportement du document. En fonction de l'évolution d'une affaire, on fait évoluer l'état d'un document. On peut par exemple associer à une facture client les états: brouillon, approuvé, transmis, rappel, payer. A chaque état, on peut associer certains événements reconnus. Par exemple, une facture transmise accepte au moins deux événements: payement, délai-d'attente-expiré. Le premier événement conduira à l'état payé après avoir engendré l'action comptable qui traduit cet événement. Le document a donc un comportement automatique en fonction de ses états et événements reconnus.

Il existe un choix d'action possible.

· Fermer: fige le contenu éditable du document. Cette action est une precondition à certainnes autres actions. Par contre, elle ne peut intervenir avant certainnes autres. Au moment de la fermeture, le document est daté.Toute les action comtable exige un document fermé. Pour les autres actions, une spécification est donnée pour celles qui exige une precondition.

· Signer: cette action ajoute la signature de l'utilisateur. Pour que cette action aboutisse, il faut qu'un fichier graphique compréhensible par l'outil de mise en page (filtre de mise en page) soit présent dans le sous répertoire de donnée ``signature''. Notons au passage que l'on peut préférer apposer sa signature manuscrite sur les documents postés, mais par contre, la signature ``électronique'' est préférable pour les versions ``faxées'' directement par modem.Précondition: le document est fermé.

· stocker: cette action permet de maniputer les compteurs de stocks physiques lors d'acquistion de biens.

· déstocker: c'est l'action complémentaire à la précédente. Elle est destinée à réduire les stocks lors des opérations de sortie de marchandises.

· Comptabiliser en achat ou en vente: ces actions permettent d'enregistrer un mouvement de produit d'un compte d'achat (vente) vers un compte créancier (débiteur) correspondant au fournisseur (client, qui peut être le ``comptoir'').

· Comptabilité analytique: ces opérations sont complémentaires aux précédentes. Elle permettent de distribuer les achats et ventes sur des comptes spécifiques. Si vous autorisez la création automatique des comptes produits (voir préférences) ceux-ci sont créés dès que nécessaire par les actions dont question ici. Sinon, vous devez définir manuellement vos comptes produits lors de la définition de ceux-ci ou vous priver des capacités du système de comptabilité analytique ce qui n'est pas recommandable.

· Comptabilité des taxes: Ces actions gèrent, dans le contexte d'achat ou de vente, de distribuer des montants de taxe par niveau d'imposition. Ces actions sont indispensables pour tout assujetti à la TVA afin de pouvoir faire une déclaration fiscale en deux minutes.

· Payement : un choix d'action pour les payements fournisseurs et client existe tant pour le payement partiel ou total. Ces payements peuvent se faire par diverses voies, tels que la poste, banque carte de crédit ou caisse. On définit ces voies de payement dans l'action en ``tirant-lâchant'' les comptes correspondant dans la liste appropriée. Si une seule voie est définie, alors l'action correspondante est automatique. Sinon, au temps de l'exécution, l'utilisateur devra sélectionner la voie appropriée. Notons, qu'un niveau de paiement partiel (dans l'intervalle [0..1]) peut être définit d'avance. Dans ce cas l'action est automatique et peut être introduite dans une séquence. Cette technique est notamment utile pour la gestion des salaires ou certaine partie de salaire sont payée au salarié et d'autres à divers caisses de prévoyance sociales.

· Attendre: cette action permet de déclencher un événement automatique après un certain délai pour autant que le document soit dans l'état voulu au moment de l'expiration du délai. Par exemple, l'envoi d'un rappel pour un facture client encore en ``attente'' de payement, ou une facture fournisseur qui arrive à échéance. L'action automatique est définie par une transition que l'on tire depuis la liste des transitions possibles pour un état donné. Si la condition initiale est satisfaite, l'action est donc réalisée automatiquement et le document se retrouve dans l'état défini par la transition. Il est bien entendu qu'une action d'attente n'accepte que des actions parfaitement automatiques. Par exemple, une action d'attente n'accepte pas une transition dont l'action est un envoi en mode manuel.

· Séquence: cette dernière action permet d'enchaîner plusieurs actions. Elle n'accepte que des actions automatiques. Elle permet de simplifier grandement un automate. Par exemple, un formulaire de payement peut n'avoir qu'un état initial, une seule transition vers un état final. La transition évoque une action composite qui réalise les étapes suivantes: fermer, envoyer, comptabiliser-le-payement.

· Générer: cette ultime action permet de générer automatiquement un document et éventuellement de lui faire exécuter une des transitions existantes dans l'état initial du document généré. Reprenons les exemples précédents. Quand une facture fournisseur arrive à échéance, un document de payement est généré et l' unique transition de ce document est activée. Ceci termine le cycle d'action propre au suivi des factures des fournisseurs. Ainsi, la dernière action réellement effectuée par un utilisateur est d'approuver la facture. (Il vaut mieux ne pas automatiser cette action!)

· Envoyer: cette action envoit automatiquement ou sur confirmation manuelle une version du document par poste et ou par fax et ou par courrier électronique. La mise en page et le canal de distribution sont déterminés par le fichier des préférences et un script spécifique à chaque plate-forme. Ces scripts peuvent être modifiés à volonté par le responsable de l'installation notamment en fonction des configurations matérielles.Précondition: le document est fermé.

· auto_stockage: cette action est semblable à une action `générer' en ce qu'elle génère un autre document. Mais elle diffère de la précédente dans la façon dont elle génère les lignes-produit du document ainsi généré. Pour chaque ligne de produit inclue dans le document source, elle crée une ligne dans le document généré (typiquement un bon de commande), si le niveau de stock du produit concerné est sous le seuil inférieur. Le niveau de commande est calculé de telle sorte à attendre le niveau supérieur augmenté du minimum nécessaire pour être compatible avec la résolution quantitative du produit. Le document ainsi généré contient finalement autant de lignes que de produits mentionnés, dans le document source, moins les produits dont le stock actuel est suffisant. L'action peut aussi lancer la première transition. Cependant, la prudence voudrait qu'un tel document ne soit pas transmis automatiquement sans un ultime contrôle d'un agent responsable.

· retro_action: cette action permet de transmettre, à un document géniteur (voir commande générer), un événement. Si, le document géniteur est dans état qui reconnait l'événement transmis, alors, il effectue les action correspondantes à cette événement et effectue la transition correspondante. Ce type de mécanisme permet de bloquer un document tant qu'in sosu document n'as pa attein un certain stade. On trouve sont usage dans les problémes de suivi de production, la gestion de stock. L'exemple de gestion de stock fourni fait appel à cette action pour débloquer le document générateur de bon de commande.

Sortie: cette action permet d'exporter des données correspondant à l'état actuel du document. Ces exportations ce fondent sur le meme mechanisme que la production des vues des documents. Cela signifie que ces données sont exportées par substitution des variables metionnée dans un document modèle rédiger dans un des language supportés. Soit actuellement html, latex, rtf et bc. Typiquement, les exemples de mise en bouteille et de production des fichers de salaire utilisent ce méchanisme. Puis précisément ils utilisent une séquence: sortir, commande et entrée.

commande: xxxxxxxxxxxx

Entrée: xxxxxxxxxx

Précondition: le document est ouvert.

Le traitement d'un document, commence toujours par un même état initial. Nous l'appellerons l'état ``brouillon'' . Par exemple, un bon de commande peut avoir au delà du brouillon initial, les états signé, attente, relance, reçu. Un tel document passe du brouillon à l'état signé après la séquence d'actions: fermé, signé. Le passage de signé à attente passe à l'état signé après la séquence d'action: envoyer, attendre. De cet état, deux voies sont possibles. La première voie correspond au déroulement espéré où la livraison se passe dans les délais souhaités. La seconde voie correspond à un débordement des délais. Dans le premier cas, l'utilisateur fera passer le document à l'état reçu à la réception des produits. Dans le second cas, le système fera passer le document à l'état ``relance-automatique'' en exécutant un action d'envoi du document. Notons en passant, que la composition de l'image (papier, fax, courrier-électronique) de ce document dépend de l'état du document. Donc, la version de relance peut comporter une note spéciale. Quant à l'action qui permet d'arriver en l'état reçu, elle peut consister à générer une facture fournisseur.

Lorsque l'on définit une séquence d'actions, il est important de considérer les risques d'échec de chacune des actions. Par exemple, une action d'envoi peut toujours échouer parce que l'adresse associée ne comprend d'adresse valable pour le media considéré. Une séquence telle que: attendre puis envoyer est mauvaise. En effet, l'action d'attente est lancée alors que la transmission ne s'est pas faite. Ceci n'a d'une part pas de sens, mais en plus, cela conduira à placer deux demandes d'attente automatiques dans la seconde et se terminera avec un message d'erreur sans importance dans ce cas mais néanmoins perturbatrice pour l'utilisateur. Par contre, la séquence envoyer, attendre est saine, car dans ce cas l'action d'attente ne sera lancée que si l'envoi se passe bien.

Une séquence d'action ne peut comprendre que des actions parfaitement automatiques. Ainsi, une action de payement fournisseur peut souvent être inclue dans une séquence car il est parfaitement plausible de définir un seul compte à débiter. Par contre, une payement client peut comporter une indétermination entre plusieurs voies de payement: caisse, banques, poste, carte de crédit. Dans ce dernier cas, l'utilisateur devra choisir un compte manuellement. Il est cependant possible d'adopter une autre conception dans laquelle on définit des événements différents en fonction de la voie de payement adoptée par le client. Dans cette solution, on peut créer des séquences différentes pour chaque voie. Rappelons également que la première action sur un document est obligatoirement sa fermeture. Une fermeture est nécessairement la première action d'une séquence. Notez au passage qu'une fermeture peut échouer. En effet, on ne peut fermer un document que lorsqu'il peut être considéré comme complet.

La définition du comportement se fait grâce à la partie inférieure de l'outil de modélisation. Tout en bas, on trouve à gauche la liste des états déjà existants. A droite, la liste des événements possibles pour l'état sélectionné. Au dessus, se trouve l'éditeur de transition. En double cliquant un événement existant, on charge l'éditeur de transition pour modification.

Quatre champs se succèdent dans l'éditeur de transition. Ce sont les champs correspondants à:

1. L'état initial: soit un état déjà existant soit une nouvel état à créer. Ce champ peut être rempli en tirant une état existant.

2. L'événement: une étiquette qui définit le nom de l'événement qui déclenche la transition

3. L'action: définit l'action qui doit être exécutée pour l'événement correspondant. Ce champ peut être édité manuellement, mais il est bien plus simple de tirer un mode depuis la liste des actions possibles que l'on trouve dans la barre des outils. Dès qu'une action est insérée dans ce champ, elle peut être tirée et lâchée dans un éditeur d'action pour en préciser les paramètres. Ces éditeurs ont une configuration qui dépend du type d'action.

4. La destination: définit l'état final atteint après que l'action se soit terminée de façon satisfaisante.

Sous l'éditeur de transition on trouve un champ qui définit l'état initial du document. Ce champ doit contenir une état existant, normalement non terminal!

L'éditeur d'action comprend toujours une section pour définir les utilisateurs autorisés. Si cette section reste vide, cela signifie que tous peuvent exécuter l'action. Pour remplir la liste, il suffit de tirer les utilisateurs autorisés depuis la liste des utilisateurs reconnus.

Les actions comptables demandent généralement de définir un ou plusieurs comptes soit comme source soit comme destination. Ces listes sont elles aussi définies en tirant des comptes depuis la liste de ceux-ci ou toute autre source de compte telle que l'éditeur correspondant. Il faut noter que pour les actions comptables n'est automatique que si sa liste de compte possible ne comprend qu'un compte. Par exemple, si un payement client peut se faire soit par banque ou par caisse, il y a indétermination. L'action ne peut se faire automatiquement. L'utilisateur devra choisir la voie qui a été effectivement utilisée par le client. Il faut également noter que le second terme d'une transaction comptable enregistrée par une telle action est définie, en fonction de son sous-type dans les préférences. Ils est évidemment impératif que cela soit défini dans les préférences systèmes. Il est en effet impératif que ce type d'écriture soit le même quelque soit l'utilisateur.

Pour éditeur une action d'attente, il est nécessaire de définir la transition engendrée. Cette transition doit nécessairement provenir du même modèle. Pour tirer cette transition, il suffit de sélectionner l'état de départ de cette transition, qui est normalement l'état final de la transition en cours de définition, puis de tirer la transition voulue dans l'ensemble des transitions possibles présentées. Il ne faut pas double-cliquer la ligne correspondant à cette transition car cela changerait la cible de l'éditeur de transition. C'est d'ailleurs la justification du recours au double-clic pour charger l'éditeur. En effet, un ``simple-clic'' est trop vite arrivé.

Filtre

Pour transmettre une image d'un document ABC, il faut lui donner une forme compatible avec le support de transmission, papier, fax, courrier-électronique, et avec les traditions de présentation. Les outils actuels de mise en forme s'appellent des traitements de texte. Le système utilise les traitements de texte existants pour produire les versions textuelles d'un document en fonction de sont état courant. Il faut donc préparer pour chaque modèle de document un ou plusieurs filtres capables de générer l'image transmise au destinataire. Un filtre, n'est rien qu'une version générique du document pour un état donné. Une version générique a tous les attributs de présentation de l'image recherchée, mais les valeurs spécifiques sont remplacées par des symboles de substitution. La dénomination exacte des symboles est visible en actionnant le bouton .

Supposons que vous ayez défini un document appelé courrier. Celui contient seulement un destinataire et deux champs obligatoires nommés concerne et corps. La version générique comprendra, en plus des éléments fixes tels qu'un logo, entête et pied de page, les symboles nécessaires pour le transport par la poste. Les symboles concernés sont: name, firstname, place, city, cp, country. Notez qu'il n'y a pas d'obligation de tout utiliser. Pour des courriers nationaux, le symbole ``country'' n'est pas utile. Ceci dépend de la modélisation choisie. Soit on crée des modèles différenciés pour des courriers en fonction de diverses destinations, soit on a un seul modèle et l'on utilise un adressage excessif pour être sûr d'être complet. On peut également dans ce dernier cas utiliser les capacités du traitement de texte a réaliser certains assemblages conditionnels.

On placera ensuite le symbole de la date. Il est recommandé, sauf pour des raisons très particulières, d'utiliser la date du système ABC et non celle du traitement de texte. En effet, lorsque vous fermez votre document, il est automatiquement daté. Il est, normalement, envoyé dans la foulée et les délais, gérés automatiquement par le système, démarrent en même temps. La date qui sera inscrite sur la version papier sera bien celle qui fait référence dans le système de gestion. Si, vous devez renvoyer une seconde copie du document dix jours plus tard, la date doit rester la même en tous cas pour un document tel qu'une facture.

On placera ensuite les symboles ``concerne'' et ``corps'' muni des attributs typographiques souhaité. Rappelons que le corps du courrier peut avoir une longueur quelconque et peut donc s'étendre sur plusieurs paragraphes même si dans la version générique, il est représenté par un petit symbole.

Il est de bon ton d'ajouter à tout le moins le nom du signataire et selon le style de la société son prénom. Ceci est réalisé en plaçant les symboles: ``SignedByName'' et ``SignedByFirstname''.

Il est également possible d'ajouter la signature électronique en plaçant le symbole: ``graphicSignature''. Cette façon de faire n'est peut être pas souhaitable pour une version papier pour laquelle la signature manuscrite est souhaitable, mais elle est très judicieuse pour la version fax. Notons à ce sujet que ceci ne fonctionne que si, pour les personnes autorisées à signer, il y a un fichier graphique dans le répertoire des signatures correspondant à l'identité du signataire et que le format graphique est compris par le traitement de texte.

La liste des symboles présentés par l'outil d'édition des modèles ne présente que la partie logique du symbole de substitution. Dans le texte d'un document générique, chaque symbole doit être entouré d'un préfixe et d'un suffixe tel que les symboles ne puissent pas être confondu avec un mot ordinaires. Ces éléments sont définis dans préférences au niveau système. Dans les exemples fournis pour le processeur ``latex''1 le préfixe est ``+§'' et le suffixe est ``§+''. Le symbole date doit donc être écrit dans le filtre générique sous la forme: ``+§date§+'' (sans les guillemets). Ces affixes doivent être choisis soigneusement pour éviter toute confusion et surtout en fonction des séquences de contrôle du traitement de texte choisi.

La description des lignes de produits doit elle aussi être signalée de façon particulière. Pour ``latex'', dans l'exemple fourni, la description générique d'une telle ligne est préfixée par ``\$\$\$'' .

Attention, si un document comprend des vecteurs (suite de valeurs) numériques leurs nommage suit une règle particulière. Soit un champ numérique nommé ``X'' avec 4 valeurs. Ce champs produit 4 variables de substitution nommées: ``X.1'', ``X.2'',``X.3'', ``X.4''.

Les fichiers filtres doivent être placés dans des répertoires en conformité avec les définitions données dans les préférences systèmes à cet effet. La première définition donne le répertoire de base. Ce répertoire doit contenir un sous répertoire au nom de chaque processeur utilisé en fonction du canal de transmission. Le système connaît 3 canaux: poste, fax, e-mail, et un pseudo canal pour les archives papier.

Chaque modèle doit avoir au moins un filtre qui porte son nom. Un modèle peut avoir plusieurs version en fonction de l'état du document. Ces versions sont différenciées par l'ajout d'une extension au nom du filtre. Cette extension est formée d'un ``.'' et du nom de l'état. Notez bien que ce nom l'état est celui du document au moment de l'action et non celui après la transition entraînée par le succès de l'action. Si une facture en attente normale de payement dans un état ``attente'', action qui consiste à renvoyer un rappel se fait au sein d'une transition de ``attente'' à rappel. Le filtre de publication utilisera la version ``facture.attente'' et non pas ``facture.rappel''. En effet l'état rappel ne sera en place qu'après l'action.

Filtres de génération

Un filtre de génération peut être défini pour chaque modèle de document. Un sous répertoire de filtre contient ses filtres. Par défaut ce sous répertoire s'appel ``bc''. S'il existe un tel filtre pour un modèle donné, celui-ci est invoqué juste avant la sauvegarde du spécimen. La substitution des variable se fait comme pour tout autre filtre. Mais, le filtre peut généré de nouvelle donnée que le système va utiliser pour compléter ou corriger le document en court d'édition. L'appel à un tel filtre ce fait au travers d'une procédure de commande XX_translate_ABC. XX représentant le nom d'un processeur. La terminaison ABC signifie que les données générée doivent être comprise par ABC.

ABC comprend le format suivant:

identifiant `:' valeur

L'identifiant est soit le nom d'un variable de texte reçue, soit le mot ``line_'' immédiatement suivit d'un nombre entier représentant un numéro de ligne, exemple ``line_2''. Pour une champ de texte, la valeur fournie remplacera le valeur présente dans le formulaire de saisie. Pour un ligne du tableau de produit les règles sont les suivantes.

Si le numéro de ligne invoqué est plus grand que le nombre de ligne existant dans le formulaire de saisie, alors, le système tente de créer un ligne supplémentaire à la suite de celles déjà existantes. Sinon, le système tente de modifier un ligne existante.

La valeur pour ligne de produit est un suite variable d'arguments. Le premier argument défini une quantité. Pour modifier une ligne existante, cette argument suffit. L'argument suivant est l'identifiant d'un produit. Il va de soit que cette valeur doit exister comme identifiant d'un produit. Ces deux premiers arguments suffisent pour créer un nouvelle ligne. Cependant il peut être suivi d'un troisième argument qui redéfinit la prix unitaire. Si un quatrième argument suit, celui-ci redéfinit le modifier. Rappelons que le modificateur implicite vaut 1 et qu'il est facteur de l'équation: prix_total = prix_unitaire * quantité * modificateur.

Le mécanisme à été éprouvé sous Linux avec l'utilitaire bc. L'exemple d'un tel filtre est fourni pour la création de fiches de salaire à la ``mode'' Suisse. Il à l'allure suivante.

$$$ q=+$quantity$+ ; pu=+$price$+

print "net:", q*pu*(1-(0.0505+0.015)), "\n"

print "line_100: ", q*pu, " AVS_PATRON" , "\n"

print "line_101: ", q*pu, " AVS_EMPLOYE" , "\n"

print "line_102: ", q*pu, " AC_PATRON" , "\n"

print "line_103: ", q*pu, " AC_EMPLOYE" , "\n"

halt

La premier ligne permet de recevoir toutes les lignes produit de la fiche salaire. Le filtre ici espère que la seule ligne, ou du moins la dernière, soit le nombre d'heures effectuées. La variable q vaut alors ce nombres d'heures et put vaut le prix unitaire. Le filtre produit une première ligne qui représente le montant dit ``net''. Cette valeur ira dans le champs de même étiquette. Le filtre produit ensuite quatre lignes étiquetées ``ligne_100'' .. ``ligne_103'' qui seront ajoutées aux lignes existantes. Ces lignes font appel à quatre pseudo produits qui en fait sont des cotisations sociale dont la valeur dépend du salaire théorique donné par q*pu. La dernière ligne force la terminaison du programme bc.

Actuellement, nous ne connaissons pas de programme équivalent à bc sur la plate-forme MS-windows. Nous seront reconnaissant vis-à-vis de toute personne qui pourra combler cette lacune en nous informant de l'existence d'un tel équivalent et de ces condition d'accès.

Ce qui précède peut effrayer quelque peu les non initiés aux malignités de l'informatique. Or il est vrai que ABC est destiné avant tout aux entrepreneurs et non au ``gourou'' de la micro-informatique. Pour résoudre cette contradiction apparente il y a deux solutions. La première consiste à recopier les exemples fournis et à modifier le minimum pour qu'ils fonctionnent avec votre logo en lieu et place du nôtre ainsi qu'en remplaçant nos noms et adresses. La seconde solution consiste à bien comprendre que cette opération ne doit se faire qu'une fois lors de la mise en place du système puis, éventuellement après deux ans parce que l'on veut changer de style. Dans cette optique, l'entrepreneur efficace peut faire appel à un sous-traitant spécialisé qui lui connaît, toutes les ficelles des traitements de textes et qui devrait aussi pouvoir réaliser la description des modèles.

Utilisateurs

Pour définir une liste d'utilisateurs, il suffit de tirer les adresses correspondantes depuis la liste. Si l'identité de la personne ainsi captée ne correspond pas au nom d'un utilisateur au sens du système d'exploitation de la machine, il suffit, soit de corriger cette différence au niveau de la liste des adresses, soit de tirer la nouvelle entrée, depuis la liste des utilisateurs, dans l'outil de renommage et de lui affecter le nom connu du système d'exploitation.

Notons ici que pour les systèmes tel que Windows9X qui ne peuvent pas gérer des utilisateurs multiples, le seul usage sensé de la notion d'utilisateur est de définir un pseudo utilisateur représentant la société. Ce pseudo utilisateur sera affecté aux actions qui ne doivent s'exécuter qu'en mode automatique après un certain délai. Pour lever cette protection sous Windows9X, il suffit de définir une variable d'environnement USER = root.

Il existe un utilisateur privilégié implicite qui peut tout faire. Ceci permet d'effeadministrateurctuer des actions qui ne parviendrait pas à passer en automatique. Cet utilisateur est l'administrateur système.

Importer Exporter

Importer des données

Le système permet d'importer des données extérieures existant sous forme de texte. On peut, actuellement importer des données concernant, les adresses, produits, fonctions de vente et les transactions. La fonction d'importation a deux usages. Le premier est d'importer des données initiales en provenance d'un système existant. Les secondes permettent des mises à jour notamment en intégrant des listes de produits des fournisseurs. Un paramètre de préférence permet de définir si les éléments importés remplacent automatiquement les éléments de même identité. La règle implicite est de demander une confirmation pour toute substitution d'éléments.

La grammaire jointe en annexe définit la syntaxe des textes importables. Un exemple est aussi fourni dans le répertoire des exemples.

Exporter des données.

L'exportation poursuit également deux buts. Le premier est de produire un texte permettant une élaboration facile de listes de prix. La seconde est de permettre de passer à une révision majeure de système, pour laquelle des changements de structure de donnée nécessiterait une opération d'exportation-importation au niveau système. Ceci est une provision indispensable pour un système évolutif.

Purger le journal

Il est de bonne tradition comptable de régulièrement faire quelques écritures dites de clôture et de tirer un bilan. Ces opérations faites, on considère que le journal des transactions antérieures est figé. Les écritures correspondantes n'ont alors plus d'intérêt pour la gestion courante. De plus une liste énorme ralenti le système. Il est donc utile d'éliminer les écritures qui ne sont plus d'actualité. La purge du journal permet cette opération. Notons, cependant que contrairement à bien d'autres système, cette opération est réversible puisque la purge du journal produit une version textuelle sous une forme qui peut être reprise par l'outil d'importation de donnée.

Les opérations d'import-export, peuvent éventuellement être utilisées dans des exercices de simulation. Dans ce cas, il est impératif de travailler dans un environnement de données strictement séparèes de l'environnement d'exploitation.

Edition de hiérarchie

Un editor de hiérarchie est associé à chaque catalogue. Il accessible par le bouton en forme de clef mecanique. La première ligne d'outil est semblable à celle des autres éditeurs. Seul un nouveau bouton(1) , permettant le tri alphabétique d'un groupe terminale, apparait en plus.

Pour avoir accès à la liste des hiérarchies existantes, il suffit presser la touche retour (¿) dans le champs d'entete(2). Une liste(3) apparait dans laquelle on puet sélectionner un élément. On peut aussi saisir directement le nom de la hiérarchie souhaitée.

Les hiérarchies de ABC, répondent au concept de partition. En conséquence, pour créer une nouvelle partie il faut définir au moins un élément inclu. Pour ce faire, on écrit d'abord le non de la mouvelle partie dans le second champs(1) de texte de cet éditeur. Puis il faut tire un élément ou une partie provenant du panneau inférieur ou un élément appartenant à la collection provenant d'une autre source. On lache le contenu saisi dans le grand trou rond(2) à gauche de la nouvelle étiquette.

La nouvelle partie apparait dans le panneau inférieur au plus haut niveau. On ensuite tirer cette partie pour la lacher dans un partie de partie existante. On peut aussi définir une nouvelle étiquette et tirer la nouvelle partie dans le trou, round à nouveau, de la ligne d'edition de nouvelle partie. Dans ce cas le trou rond prend la form de fente symbolisant une partie (ligne de séapration). Ceci montre que la partie en cours de définition ne peut contenir que d'autres parties.

Ce trou prend alors une forme corresondant au type d'entité reçu. Ceci assure que la partie créer sera homogéme. Soit elle contiendra des élément de la collection, soit d'autre partie. On peut également tirer un ensemble d'élémenst, provenant par exemple de la liste aphabétique de la colletion. Lorsque l'on est satisfait des éléments placer dans cette nouvelle partie, on presse le boutton de confirmation (3) à droite de la nouvelle étiquette.

Il est ensuite possible de déplacer directement des parties ou des éléments dans le panneau inférieur au moyen du tirer & laché. Il faut noter ici que l'on ne peut déplacer ou supprimer la partie ``non classée''. Celle-ci est gérée automatiquement. Elle dsiparait d'elle meme dès que tous les éléments sont classés.

Privilèges de l'administrateur système

L'administrateur système de la machine sur laquelle les données du système ABC sont stockées, peut réaliser certaines opérations normalement refusées. User de ces privilèges est dangereux. Il ne faut les utiliser qu'après mure réflexion.

Essentiellement, l'administrateur peut faire deux choses. En premier, il peut supprimer n'importe quel entité, appartenant à une collection quelconque. Cela se fait par`tiré-laché' sur la corbeille.

D'autre part, l'administrateur peut forcer un changement d'état d'un document. Cette opération est réaliser en tapant un retour chariot `¿' sur le champs d'état. Un menu apparaît qui permet de choisir un état possible pour ce document. En choisissant parmi ceux-ci, on force cet état sans aucune action associée. Cette méthode, permet par exemple de forcer un document dans un état final `annulé'. Ceci permet de liquider un document que l'on ne peut faire évoluer conformément à la réalité suite à une faute de conception de l'automate associé à ce type de document. On peut ensuite, après avoir corrigé l'automate, créer un nouveau spéciment de document en partant de celui que l'on vient d'éliminer afin de poursuivre l'action dans de bonnes conditions. D'un point de vue des contrôles légaux cette solution est correct, car il reste une trace d'un document annulé ce qui peut aisément ce justifier, alors qu'il trou dans les références est plus gênant.

Adaptation

Traduction de l'interface

Chaque utilisateur peut choisir un dictionnaire qui contient les traductions des éléments de l'interface. Mais, au delà chacun peut modifier ce dictionnaire. Ceci se fait à l'aide d'une fenêtre graphique accessible depuis le panneau principal par le bouton .

Le bouton ``selection'' déclenche le mécanisme de sélection. Un curseur en croix apparaît. Il suffit de le déplacer au dessus de l'élément graphique à modifier puis de presser à nouveau le bouton de sélection de la souris pour charger l'éditeur de traduction. Celui-ci travaille selon deux modes. Le mode générique ou le mode spécifique. Si le sélecteur générique est enfoncé, les traductions faites s'appliquent à tous les éléments portant la même identité sauf si une définition spécifique est trouvé pour un contexte donné. Le mode spécifique ne s'applique qu'à un élément dans un contexte. On peut ainsi décider que l'étiquette générique du bouton  soit ``sortir'' mais que dans le contexte du panneau principale, son étiquette soit ``quitter l'application''.

Lorsque l'on a édité une traduction, il suffit de taper ¿ pour que la traduction prenne place dans le contexte de référence. Il faut cependant noter que l'effet générique n'est appliqué qu'au prochain lancement de l'application.

Préférences

Au démarrage, le système charge les préférences de l'utilisateur, puis les préférences collectives aussi appelées préférences systèmes. Dans cet ordre, les préférences collectives prévalent sur les préférences individuelles. Si un utilisateur n'a pas de fichier propre de préférences, le système utilise un fichier nommer ``def_pref.txt'' qui doit se trouver dans le répertoire des données. Le fichier de préférences est rechercher dans le répertoire de base de l'utilisateur. Ce fichier doit se nommer ``preferences.txt''. On peut aussi définir un autre nom de fichier en ajoutant dans la ligne de commande une option: -preference=non_fichier. Cette façon de faire est d'ailleurs la seule valable sous Windows9X qui n'a pas de notion de répertoire de base d'un utilisateur.

Des exemples raisonnables et complets de fichier de préférences systèmes et individuels sont fournis dans la distribution.

Commandes externes.

ABC doit passer certaines commandes vers le système d'exploitation. Ces commandes, sont toutes faites au travers de fichiers de programmes de commandes. Ceci permet une adaptation facile a l'environnement et permet des personnalisations supplémentaires. Le système est distribué avec une version opérationnel de chacune des commandes nécessaires. Elle sont reprises en annexe avec un commentaire éventuel.

Mise en service

Nous supposons ici que le système fonction actuellement avec une base de donnée correspondant à un exemple fourni plus des données personnelles. Dans ce contexte voici une procédure à suivre globalement pour passer à la mise en service réel.

Il faut ensuite importer votre état réel comptable. Si vous possédez un logiciel de comptabilité, il doit pouvoir vous fournir un fichier de texte qui comprend le nom et le solde de chaque compte. De plus la mise en page doit vous permettre de déduire les comptes positifs et négatifs (actif = +, passif = -). Pour certain logiciel vous trouverez dans le répertoire ``resources/tools'' un petit programme de conversion. Si par exemple vous utilisez ``winway'' , depuis un terminal tapez la commande:

perl winway votre_fichier_rapport_winway > comptes.txt

Si votre logiciel ne correspond pas à l'un de ceux pour lesquels un tel filtre existe, il vous faudra faire un conversion manuel. Pour cela, prenez exemple sur le fichier d'importation ``import.txt'' qui à servi à créer votre environnement d'exercice. Il se trouve dans le répertoire de vos données ou sous ``resources/examples/*/import.txt''.

Il faut ensuite éditer le fichier que vous venez d'exportez depuis l'application ABC. Dans ce fichier de texte, vous remplacez la section des comptes par ceux que vous venez de préparer. Ensuite, dans ce fichier, vous supprimer les hiérarchies que vous n'utilisez pas et la section transactions.

La section document peut aussi être supprimée sauf si vous ne désirez repartir de numéros de référence particuliers. Si tel est le cas, Il faut garder un exemplaire de chaque document en état dit d'``archive''. Vous numérotez cette exemplaire avec la valeur initiale que vous souhaitez moins un.

Si vous n'avez pas supprimer toute les adresses, produits et devises inutiles, vous pouvez encore le faire maintenant. Cependant, dans ce contexte vous devez également supprimer manuellement, dans les hiérarchies, toutes références à une entité que vous supprimé.

Ce travail étant terminez, vous êtes prés a ré-importez vos données. Ceci peut se faire en appelant la programme de base ABC, puis en allant sous maintenance et importer. Mais il est plus confortable d'ouvrir un terminal et de lancer la commande:

<chemin d'accès>/import_abc <le fichier d'exportation modifier> <le répertoire de donnée>.

Le chemin d'accès est le même que pour le programme principal.

Il se peux que le programme d'importation détecte quelque erreurs dans votre fichier. Dans ce cas il ne produit aucun résultat à l'exception de messages d'erreur qui permettent de corriger le fichier source. Dès que l'importation est terminée, vous pouvez relancer le programme principal ABC. Vérifiez toutes vos données, surtout comptable. Si vous n'êtes pas satisfait, quittez à nouveau l'application, supprimez le fichier ``business.dmp'', et corriger votre fichier d'importation.

Annexe

Préférences système

--Document layout source type

-----------------------------

--Define the source format of document templates. Each document specimen is

--first build on the basis of such a template.

--Currently supported: HTML, Latex

archive_format: html

mail_format: html

fax_format: html

poste_format: html

--Viewer

---------

--Define a conversion format, for final publication. A specimen is first bold

--in the same format as its template. But, it my be then converted into an other

--format more suitable for the final media.This final format must be compatible

--with the final media. For example, an html format is perfec for E-mail's. But

--On UNIX system, Postscript (ps) is better for printing.

mail_view: html

fax_view: ps

paper_view: ps

video_view: ps

-- Directories

filter_directory: +/filters

graphic_signatures: +/signatures

archive_directory: +/archives

--This is a system preferences definition file.

--=============================================

--The syntax is :

-- comment := `--' any thing up to the end of the line

-- definition := label `:' any thing to the end of the line

-- label := a simple alpha-numeric string or a quoted string like "send_action.cur"

-- a special character is needed like the `.' in this example.

-- NOTE: Priviliged items must be defined in such a file named "sys_pref.txt"and located

-- in the same directory as the data corresponding to them.

-- The system preferences file is automatically loaded after the personnal preferences.

-- Thus priviliged definition overide any personnal definitions.

-- Files and directories path can be specified in

-- 1) absolute mode i.e: /home/managment/data... or C:\managment\data

-- 2) through environment variable; i.e: $MY_DATA/filter

-- 3) relatively to the data directory (the one you supplie in the command line); i.e: +/filter

-- Import_filter

----------------

replace_all: true

date_expression: "['0'..'3'] '0'..'9' '/' ['0'|'1'] '0'..'9' '/' ["19"|"20"] 2('0'..'9')"

telephone_number_expression: "'#'*('+')+(+['0'..'9']'-')+('0'..'9')"

fax_number_expression: "'%'*('+')+(+('0'..'9')'-')+('0'..'9')"

shortening_expression: "+['a'..'z']+'.'"

currency_symbol_expression: "'$'|'£'"

email_expression_lex: "'<'+$P'@'+$P '>'"

-- Printing_filter_definitions

--============================

British_date_order: false

export_field_separator:" "

bounded_string_after:<|

bounded_string_before:|>

latex_model_postfix: .tex

-- Document implicite field names

"list_quantity_field": quantity

"list_label_field": label

"list_price_field": price

"list_price_with_duty_field": priceWithDuty

"list_duty_rate_field": dutyRate

"list_value_field": value

"list_duty_field": duty

"list_total_with_duty_field": totalWithDuty

"latex_list_descriptor_begin": \$\$\$+

"latex_list_descriptor_end": +\$\$\$\\

"latex_line_table_end": \\

latex_field_bound_begin: +§

latex_field_bound_end: §+

html_field_bound_begin: +$

html_field_bound_end: $+

html_list_descriptor_begin : $$$

html_model_postfix : .html

html_line_table_begin :"<tr>"

html_line_table_end : "</tr>"

no_graphic_signup: +/signatures/no_graphic_signup.jpg

-- Accounting_defaults and temporary accounts

----------------------------------------------

auto_create_creancier: true

auto_create_debitor: true

auto_create_analytic_account: true

discount_mode: true

bracket_negative : false

troncating_amount: false

rounding_amount: true

duty_included_mode: false

number_of_decimals: 2

accounting_resolution: 0.01

resolution_amount: 0.5

line_resolution_amount : ""

document_resolution_amount : ""

duty_line_resolution_amount : ""

document_duty_resolution_amount : ""

--Stock management

--

second_iteration_tolerance: 0.1

--Address extra fields

address_option_1: notes

--------address_option_2: actions

-- List of authorized personal titles ( shot of full form )

-- If commented out Any identifier for full form and any

-- expression conform to `shortening_expression'

-- will be accepted

-- If specified, each alternative must be separated by `|'

valid_personal_titles: Monsieur|Madame|Mister|Miss|Herr|Lady|M.|Mdme.

valid_entreprise_titles: AG|Co.|Asbl.|SA|Agence|asbl.

-- Special document field

--========================

-- Field used to overwrite the default wait action time

delay_field_name: delai

-- Field to be used in document listing as short description

subject_field_name: concerne

-- Accounting implicite and defaults

in_duty_account_prefix: TVA_A_

out_duty_account_prefix: TVA_V_

in_tmp_duty_account: achat

out_tmp_duty_account: vente

buy_account: achat

sale_account: vente

-- The following definition are used only if you specifiy that the system

-- must automatically create input and output account for each new product.

-- If the prefix is the same for both sale and purchase then only one

-- positive account is created.

-- Les deux definitions suivante ne sont utilisées que si le système peut créer

-- automatiquement les comptes analytique pour chaque nouveau produit (Ce

-- comportement est celui qui est suggéré par les définitions d'orgines).

-- Si les prefixes d'achat et de vente sont égaux, alors le système créera un

-- seul compte positif pour chaque produit.

product_out_account_prefix: S_

product_in_account_prefix: E_

Préférences personnelles

--Ceci est un fichire qui permet de définir les preférences personnels.

--la syntaxe est la suivante:

-- commentaire := `--' suivit de n'importe quoi jusqu'à la fin de la ligne

-- definition := étiquette `:' suivit de n'importe quoi jusqu'à la fin de la ligne

-- étiquette := une suite de caractère aplha-numérique ou une chaine de caractères quelconques entre gillement. ex: "send.ext"

-- si des caractéres spéciaux sont nécessaires tel que `.'.

--

-- REMARQUES:

-- Les éléments priviliégiés sont définis dans le fichier `data/sys_pref.txt'

-- `data' signifier le répertoire qui contient les données. C'est le répertoire qui est

-- donné en fin de la ligne de commande. Le fichier sys_pref.txt est chargé en second. En

-- conséquence, ces définitions écrasent celles du fichier personnel.

-- Les repertoires et fichiers peuvent etre définis

-- 1) en mode absolu: /home/gestion/data

-- 2)par une variable d'environement: $MES_AFFAIRE/filtres ( ne fonctionne pas sous

-- windows actuellement)

-- 3)relativement au rertoire des données par la notation: +/filtres

--

--

-- Action names

----------------

SIGN_ACTION : signer

UNLOAD_ACTION : décharge compte débiteur

SALE_ACCOUNTING_ACTION : comtabilité vente

IN_DUTY_ACTION : comtabilité TVA achat

OUT_DUTY_ACTION : comtabilité TVA vente

LOST_ACTION : Perte

PAYMENT_ACTION : Payement

SEND_ACTION : Envoyer

SEND_CC_ACTION : Envoyer copies

CLOSE_ACTION : fermer

COMPOSITE_ACTION : séquence

WAIT_ACTION : attendre

NULL_ACTION : Rien

STOCK_ACTION : Stocker

UNSTOCK_ACTION : Déstocker

BUY_ACCOUNTING_ACTION : comptabilité achat

PART_PAYMENT_CREANCIER_ACTION : paymement partiel créancier

PAYMENT_CREANCIER_ACTION : paymement créancier

ANALYTIC_SALE_ACTION : Ventilation analytique vente

ANALYTIC_BUY_ACTION : Ventilation analytique achat

GENERATE_ACTION : Génération document suivant

BACK_ACTION : Rétroaction

ARCHIVE_ACTION : Archivage

AUTOSTOCK_ACTION : Approvisionnement automatique

-- Nom des classes des documents

--------------------------------

SALE_DOC: client

LETTER: lettre

SUPPLIER_DOC: fournisseur

PAYMENT: payement

-- Nom des modes de reférence pour documents

--------------------------------------------

NUMERIC_REF: réf. numerique

YEAR_NUMERIC_REF: année-nombre

-- System message

------------------

processing_wait_queue: traitement de la file d'attente

unclassified : non classé

Can_not_manage_that_widget: Ne peut traiter cet élément

saving_data: sauvegarde des données

lisence_request_preambule: Remplissez le nom du propriétaire, l'identifiant des modèles de document, puis le code reçu d'Abstraction ou notre représentant.

"partition_for_catalogue:":partition pour catalogue

archive: archive

catalogue_show_identifier : catalogue_show_identifier

CORRUPTED_COMPONENT:COMPOSANT_CORROMPU

Can_change_base_type_currently: On ne peut chager la type de base(actuelllement)

Can_not_manage_that_widget: ce type d'élément est non modifiable

Invalid_input_account: compte de entrée non valable

Invalid_output_account: compte de sortie non valable

Invalid_product_label: étiquette non valable

Invalid_quantity_label: quantité non acceptable

Invalid_resolution: résolution non valible

This_widget_should_not_be_tranlated: élément non modifiable

Unknown_item: élément unconnu

Unknown_user_or_permission_denied: usager inconnu ou permission non accordée

action_number: numéro d'action

action_should_be_automatic_but_is_not: l'action devrait etre automatique, mais ne l'est pas

action_was: l'action était

archive: archive

archive_not_found: archive non trouvée

backup_error: erreur de sauvegarde

bad_date: mauvaise date

bad_document_type: mauvais type de document

bad_numeric_value: mauvais valeur numérique

balance: balance

can_not_open_interface_dico: dictionaire d'interface inaccessible

can_not_write_file: ne peut écrire le fichier

compilation_error: erreur de compilation

content_invalid_product_reference: référence invalide

data_file_write_locked: base de donnée veroulliée

data_not_found_in: donnée non trouvée en

document_not_closed: document non fermé

document_pattern_does_not_exists: modéle inexistant

does_not_exists: n'existe pas

errors: erreur

export_error: error d'exportation

field_generation_error: erreur du genérateur de champs extérieur

file_does_not_exists: fichier inexistant

file_error: erreur de fichier

file_not_readable: fichier non lisible

filter_command_succed_but_no_output_file_exists: commandde filtrage acceptée, mais pas de fichier de résultat!

filter_directory_not_fount: répertoire des filter non trouvé

for: pour

ilegal_model: modèle ilégale

image_file: fichier image

import_error: erreur d'importation

invalid_currency_reference: référence non valable à une devise

invalid_email_address: adresse de courrier électronique erronée

invalid_email_number: adresse de courrier électronique erronée

invalid_fax_number: adresse de fax erronée

invalid_identifier: identifiant non valible

invalid_lisence: lisence non valible

invalid_phone_number numéro de téléphone erronée

invalid_post_address: adresse postale erronée

invalide_lower_stock: borne inférieur de stock erronée

invalide_lower_upper_range_stock: fourchette de stock erronée

invalide_resolution: resolution erronée

invalide_stock: error de stock

invalide_upper_stock: borne supérieur de stock erronée

is_not_automatic: n'est pas automatique

looking_at: cheché(e) à

missing_label: étiquette manquante

model_no_read_permission: accès en lecture refusé sur le modèle

model_not_found: modéle non trouvé

no_interface_dictonnary_in_use: pas de dictionnaire d'interface actif

no_such_action: action unconnue

other_action_pending: autre action en cours

pattern_data_not_found_in: modél non trouvé dans

pattern_file_write_locked: base de donnée des modéles veroulliées.

paymentNumber: Numéro de payment

paymentType: type de paiement

price_should_be_a_number: le prix doit etre un nombre

partition_for_catalogue : partition pour

product_line_fields: champs de ligne de produit

quantity_out_of_resolution: quantité hors résolution

report: report

saving_data: sauvegarde des données

states: états

supplie_file_name: fournissez un nom de fichier

sys_backup_file_exists_and_is_not_a_directory: le non pour le répertoire de sauvegarde est bloqué par un fichier ordinaire!

system_error_on: erreur system sur

this_is_a_directotry: ceci est un répertoire

time_out_action_fail_for: action, en file d'attente, à échoué

toolkit_error: error sur la boite à outil graphique (X-windos)

transfer: transfert

transition_processing_erreur_check_model: erreur sur traitement de transition. Verifiez le modèle

unacceptable_name: nom inacceptable

unclassified_label: non classé

unknown_error: erreur unconnue

unknown_generated_product: produit généré inconnu

unprintable_attribute: attribut non imprimable

unvalid_document: document non valible

wait_actions_done: actions d'attente terminée

when_opennig_file: en ouvrant le fichier

wrong_Date: mauvaise date

MAILLING : Mailling

write_locked : écriture verouillée

No matching element : Rien ne correspond

-- Répertoires et fichiers

help_directory: $ABC_DELIVERY/resources/help/french

interface_dictionary: +/french_interface.dmp

-- Directories and files

------------------------

pixmap_directory: $ABC_DELIVERY/resources/pixmaps/

window_config_data: $HOME/abc.cnf

--Colors & Font & geometry

---------------------------

drag_corrector: 3

scrolling_list_font: -adobe-courier-medium-r-normal--12-120-75-75-m-70-iso8859-1

label_font: -adobe-courier-bold-r-normal--12-120-75-75-m-70-iso8859-1

default_font: -adobe-courier-bold-r-normal--12-120-75-75-m-70-iso8859-1

read_write_field_color: ""

must_read_write_field_color: ""

read_only_field_color: ""

background_color: ""

label_background_color: ""

menu_color: ""

scroll_list_color: ""

default_color: "grey"

field_height: ""

tool_bar_widget_distance : 1

label_help_width : 120

vertical_label_offset: 0

vertical_space_between_fields: 0

horizontal_space_between_fields: 0

--Text Editor

-------------

editor: nedit

--Accounting journal

--------------------

destination_account_first: false

-- Pixmaps

----------

hash_table.cur: state.cur

numeric_field_builder.cur: textf.cur

watch.cur: watch.cur

"ABC.ico": abc.ico

"account.cur" : balance.cur

"account_builder_wind.bm": balance.bm

"account_builder_wind_dot.bm": baladot.bm

"account_terminal.cur": balance.cur

"account_terminal.bm": balance.bm

"accounting_root.cur": partition.cur

"accounts_wind": Comptes

"accounts_wind.ico": accounts.ico

"action.bm" : action.bm

"actionls.bm" : actionls.bm

"showlist.bm" : showlist.bm

"address.bm": address.bm

"address.cur": address.cur

"action.cur" : action.cur

"address.cur": address.cur

"address_editor_wind.bm": address.bm

address_editor_wind: Adresse

"address_editor_wind.ico" : adresses.ico

"address_editor_wind.ico": addr_edit.ico

"address_editor_wind_dot.bm": persodot.bm

"addressed_document_editor_wind.bm" :document.bm

"addressed_document_editor_wind.ico": document.ico

"addressed_document_editor_wind_dot.bm": documdot.bm

"addresses_wind" : Adresse

"addresses_wind.ico": addresses.ico

"any.bm" : any.bm

"arrayed_root_partition.cur": partition.cur

"attach.bm": attach.bm

" back_action.cur": action.cur

"balance.bm": balance.bm

"baladot.bm": baladot.bm

"bigtower.bm":bigtower.bm

"buy_doc_line.cur": doc_line.cur

"clear.bm" : clear.bm

"close_action.cur": action.cur

"comment.bm" : comment.bm

"composite_action.cur": action.cur

"composite_action.cur": action.cur

"control_panel_wind" : ABC

"control_panel_wind.ico": base.ico

"cross.cur": cross.cur

"currency.bm" : currency.bm

"currency.cur" : currency.cur

"discount_sale_function.cur": function.cur

"documdot.bm": documdot.bm

"filter.bm" : filter.bm

"filter_button.bm": filter.bm

"function.bm" : function.bm

"functdot.bm" : functdot.bm

"generate_action.cur": action.cur

"help.bm" :help.bm

"in_duty_action.cur": action.cur

"journal_record.cur": transact.cur

"journal_wind" : journal

"journal_wind.ico" : journal.ico

"journal_wind.ico": journal.ico

"langue.bm" : langue.bm

"letter.cur": document.cur

"linemode.bm" : linemode.bm

lisence_wind: License

"lisence_wind.ico": accounts.ico

"list.bm" : list.bm

"load_doc.bm" : load_doc.bm

"lost_action.cur": action.cur

"maint.bm" : maint.bm

"namer.bm" : namer.bm

must_field_color: lightblue

"no_tick.bm" : no_tick.bm

"ok_tick.bm" : ok_tick.bm

"out_duty_action.cur": action.cur

"part_lost_action.cur": action.cur

"part_payement_creancier.cur": action.cur

"part_payment_creancier_action.cur": action.cur

"partition.bm" : partition.bm

"partition_editor_wind.bm": partition.bm

"partition_editor_wind_dot.bm" : partidot.bm

"partition_for_catalogue:" : partition pour:

"pattern.bm" : pattern.bm

"pattedot.bm": pattedot.bm

"pattern.cur": pattern.cur

"pattern_editor_wind.bm": pattern.bm

"pattern_editor_wind_dot.bm": pattedot.bm

"pattern_editor_wind.ico" : pattern.ico

"payment.cur":document.cur

"payment_action.cur": action.cur

"payment_creancier_action.cur": action.cur

"persodot.bm: addresot.bm

"person.bm": address.bm

"product.bm" : product.bm

"product_catalogue_wind" : Catalogue

"catalogue_wind.ico" : catalog.ico

"product_catalogue_wind.ico": catalog.ico

"product_editor_wind.bm": product.bm

"product_editor_wind.ico": product.ico

"product_editor_wind_dot.bm": produdot.bm

"quit.bm" : quit.bm

"renamer_wind.bm": namer.bm

"renamer_wind_dot.bm": namerdot.bm

"run.bm" : run.bm

"sale_accounting_action.cur": action.cur

"sale_doc.cur": document.cur

"sale_doc_line.cur": doc_line.cur

"sale_function_editor_wind.bm": function.bm

"sale_function_editor_wind_dot.bm": functdot.bm

"saved.bm" : saved.bm

"unsaved.bm": unsaved.bm

"search.bm" : search.bm

"send_action.cur": action.cur

"send_action.cur": action.cur

"send_cc_action.cur" : action.cur

"show_account_wind.bm": balance.bm

"sign_action.cur": action.cur

"subglobal_account.cur": partition.cur

"supplier_doc.cur": document.cur

"terminal_global_account.cur": partition.cur

"tower.bm" : tower.bm

"transfer.bm": transfer.bm

"transition.cur": transit.cur

"transition.bm": transit.bm

"trash.bm" : trash.bm

"treemode.bm" : treemode.bm

"unclassified_accounts.cur": partition.cur

"unknown.bm" : unknown.bm

"analytic_sale_action.cur": action.cur

"autostock_action.cur": action.cur

"analytic_buy_action.cur": action.cur

"buy_accounting_action.cur": action.cur

"null_action.cur": action.cur

"stock_action.cur": action.cur

"unstock_action.cur": action.cur

"unload_action.cur": action.cur

"wait_action.cur": action.cur

"wait_cursor.cur": watch.cur

price.bm : price.bm

prefer.bm : prefer.bm

sorthole.bm : sorthole.bm

stock.bm : stock.bm

stockmov.bm : stockmov.bm

partition_for_catalogue : partition pour

show_product_motion_wind.bm : prodpart.bm

no_fax_number : pas de numero fax

html_model_postfix : .html

showmove.bm : product.bm

check_spelling : check_spelling

lisence.ico : lisence.ico

expiration : expiration

transact.cur : transact.cur

hide.bm : hide.bm

product.cur : product.cur

prodpart.bm : prodpart.bm

produdot.bm : produdot.bm

balance.cur : balance.cur

"show_balance_wind.bm": balance.bm

stock_journal_wind.ico : journal.ico

terminal_partition.cur : partition.cur

CORRUPTED_COMPONENT:COMPOSANT_CORROMPU

Can_change_base_type_currently: On ne peut chager la type de base(actuelllement)

Can_not_manage_that_widget: ce type d'élément est non modifiable

Invalid_input_account: compte de entrée non valable

Invalid_output_account: compte de sortie non valable

Invalid_product_label: étiquette non valable

Invalid_quantity_label: quantité non acceptable

Invalid_resolution: résolution non valible

This_widget_should_not_be_tranlated: élément non modifiable

Unknown_item: élément unconnu

Unknown_user_or_permission_denied: usager inconnu ou permission non accordée

action_number: numéro d'action

action_should_be_automatic_but_is_not: l'action devrait etre automatique, mais ne l'est pas

action_was: l'action était

archive: archive

archive_not_found: archive non trouvée

backup_error: erreur de sauvegarde

bad_date: mauvaise date

bad_document_type: mauvais type de document

bad_numeric_value: mauvais valeur numérique

balance: balance

can_not_open_interface_dico: dictionaire d'interface inaccessible

can_not_write_file: ne peut écrire le fichier

compilation_error: erreur de compilation

content_invalid_product_reference: référence invalide

data_file_write_locked: base de donnée veroulliée

data_not_found_in: donnée non trouvée en

document_not_closed: document non fermé

document_pattern_does_not_exists: modéle inexistant

does_not_exists: n'existe pas

errors: erreur

export_error: error d'exportation

field_generation_error: erreur du genérateur de champs extérieur

file_does_not_exists: fichier inexistant

file_error: erreur de fichier

file_not_readable: fichier non lisible

filter_command_succed_but_no_output_file_exists: commandde filtrage acceptée, mais pas de fichier de résultat!

filter_directory_not_fount: répertoire des filter non trouvé

for: pour

ilegal_model: modèle ilégale

image_file: fichier image

import_error: erreur d'importation

invalid_currency_reference: référence non valable à une devise

invalid_email_address: adresse de courrier électronique erronée

invalid_email_number: adresse de courrier électronique erronée

invalid_fax_number: adresse de fax erronée

invalid_identifier: identifiant non valible

invalid_lisence: lisence non valible

invalid_phone_number numéro de téléphone erronée

invalid_post_address: adresse postale erronée

invalide_lower_stock: borne inférieur de stock erronée

invalide_lower_upper_range_stock: fourchette de stock erronée

invalide_resolution: resolution erronée

invalide_stock: error de stock

invalide_upper_stock: borne supérieur de stock erronée

is_not_automatic: n'est pas automatique

looking_at: cheché(e) à

missing_label: étiquette manquante

model_no_read_permission: accès en lecture refusé sur le modèle

model_not_found: modéle non trouvé

no_interface_dictonnary_in_use: pas de dictionnaire d'interface actif

no_such_action: action unconnue

other_action_pending: autre action en cours

pattern_data_not_found_in: modél non trouvé dans

pattern_file_write_locked: base de donnée des modéles veroulliées.

paymentNumber: Numéro de payment

paymentType: type de paiement

price_should_be_a_number: le prix doit etre un nombre

product_line_fields: champs de ligne de produit

quantity_out_of_resolution: quantité hors résolution

report: report

saving_data: sauvegarde des données

states: états

supplie_file_name: fournissez un nom de fichier

sys_backup_file_exists_and_is_not_a_directory: le non pour le répertoire de sauvegarde est bloqué par un fichier ordinaire!

system_error_on: erreur system sur

this_is_a_directotry: ceci est un répertoire

time_out_action_fail_for: action, en file d'attente, à échoué

toolkit_error: error sur la boite à outil graphique (X-windos)

transfer: transfert

transition_processing_erreur_check_model: erreur sur traitement de transition. Verifiez le modèle

unacceptable_name: nom inacceptable

unclassified_label: non classé

unknown_error: erreur unconnue

unknown_generated_product: produit généré inconnu

unprintable_attribute: attribut non imprimable

unvalid_document: document non valible

wait_actions_done: actions d'attente terminée

when_opennig_file: en ouvrant le fichier

wrong_Date: mauvaise date

MAILLING : Mailling

write_locked : écriture verouillée

No matching element : Rien ne correspond

Modèles

Voici quelques exemples de modèles de documents. Les textes présentés sont ceux obtenus en pressant la touche d'impression-filtrage de l'éditeur de modèle.

LETTER

state_control:

start_state: brouillon

états:

brouillon:

fermer:

action: CLOSE_ACTION

destination: pret

pret:

envoyer:

action: SEND_ACTION

mail: False

poste: False

fax: False

or_mode: False

automatic: False

copies: 0

destination: fait

archive:

fait:

private_type: lettre

Lettre

SUPPLIER_DOC

state_control:

start_state: brouillon

états:

brouillon:

accepte:

action: COMPOSITE_ACTION

sequences:

CLOSE_ACTION

SEND_ACTION

mail: False

poste: True

fax: False

or_mode: False

automatic: True

copies: 1

ANALYTIC_BUY_ACTION

IN_DUTY_ACTION

BUY_ACCOUNTING_ACTION

WAIT_ACTION

start_state: acceptée

event: expire

delai: 10

destination: acceptée

archive:

payée:

acceptée:

expire:

action: COMPOSITE_ACTION

sequences:

GENERATE_ACTION

generated_document: paiement

PAYMENT_CREANCIER_ACTION

destination: payée

private_type: facture_fournisseur

duty_free: False

fix_duty_mode: False

currency_rate: 0

Facture-fournisseur

Grammaire d'importation

IMPORT_TOP : [CURRENCY_LIST_B] [ACCOUNT_LIST_B] [SALE_FUNCTION_LIST_B] [ADDRESS_LIST_B] [PRODUCT_LIST_B] [FOLDER_LIST_B] [TRANSACTION_LIST_B] END

CURRENCY_LIST_B : CURRENCIES [CURRENCY_LIST]

CURRENCY_LIST : CURRENCY_DESCR ..

CURRENCY_DESCR : RECORD_LABEL : CURRENCY_SYMBOLE NUMERIC_VALUE NUMERIC_VALUE [COMMENT_DESCR]

RECORD_LABEL : BOUNDED_IDENTIFIER | SIMPLE_IDENTIFIER | QUOTED_IDENTIFIER

CURRENCY_SYMBOLE : SYMBOL | CURRENCY_SPECIAL

COMMENT_DESCR : COMMENT = DESCRIPTION

DESCRIPTION : BOUNDED_STRING | QUOTED_STRING | VALUE_IDENTIFIER

ACCOUNT_LIST_B : ACCOUNTS [ACCOUNT_LIST] [PARTITION_LIST_B]

ACCOUNT_LIST : ACCOUNT_TYPE ..

ACCOUNT_TYPE : POSITVE_ACCOUNT_DESCR | NEGATIVE_ACCOUNT_DESCR | POSITIVE_ONLY_ACCOUNT_DESCR | NEGATIVE_ONLY_ACCOUNT_DESCR

POSITVE_ACCOUNT_DESCR : RECORD_LABEL : + [NUMERIC_VALUE] [COMMENT_DESCR]

NEGATIVE_ACCOUNT_DESCR : RECORD_LABEL : - [NUMERIC_VALUE] [COMMENT_DESCR]

POSITIVE_ONLY_ACCOUNT_DESCR : RECORD_LABEL : >= [NUMERIC_VALUE] [COMMENT_DESCR]

NEGATIVE_ONLY_ACCOUNT_DESCR : RECORD_LABEL : <= [NUMERIC_VALUE] [COMMENT_DESCR]

PARTITION_LIST_B : PARTITIONS [PARTITION_LIST]

PARTITION_LIST : SUBPARTITION_TYPE ..

SUBPARTITION_TYPE : PARTITION_DESCR | TERMINAL_PARTITION_DESCR

PARTITION_DESCR : ITEM_LABEL : { PARTITION_LIST }

ITEM_LABEL : QUOTED_STRING | VALUE_IDENTIFIER | BOUNDED_STRING

TERMINAL_PARTITION_DESCR : ITEM_LABEL : [ MEMBER_LIST ]

MEMBER_LIST : DESCRIPTION "," ..

SALE_FUNCTION_LIST_B : SALE_FUNCTIONS [SALE_FUNCTION_LIST]

SALE_FUNCTION_LIST : SALE_FUNCTION_SUBTYPE ..

SALE_FUNCTION_SUBTYPE : DISCOUNT_SALE_F_DESCR | COMPLEX_SALE_F_DESCR

DISCOUNT_SALE_F_DESCR : RECORD_LABEL : NUMERIC_VALUE NUMERIC_VALUE [NUMERIC_VALUE] [COMMENT_DESCR]

COMPLEX_SALE_F_DESCR : RECORD_LABEL : DESCRIPTION

ADDRESS_LIST_B : ADDRESSES [ADDRESS_LIST] [PARTITION_LIST_B]

ADDRESS_LIST : ADDRESS_DESCR ..

ADDRESS_DESCR : RECORD_LABEL : ADDRESS_TYPE ADDRESS_IDENT_DESCR POST_ADDRESS_DESCR [PHONE_NUMBER] [FAX_NUMBER] [EMAIL] [MEMBER_LIST_B] [OPTION_LIST_B] [COMMENT_DESCR]

ADDRESS_TYPE : RESERVED_ADDRESS_SHORTENING | RESERVED_ADDRESS_WORD | BOUNDED_ADDRESS_TITLE

ADDRESS_IDENT_DESCR : DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION

POST_ADDRESS_DESCR : DESCRIPTION DESCRIPTION DESCRIPTION DESCRIPTION

MEMBER_LIST_B : [ MEMBER_LIST ]

OPTION_LIST_B : OPTIONS = [ OPTION_LIST ]

OPTION_LIST : OPTION_DESCR "," ..

OPTION_DESCR : DESCRIPTION : DESCRIPTION

PRODUCT_LIST_B : PRODUCTS [PRODUCT_LIST] [PARTITION_LIST_B]

PRODUCT_LIST : PRODUCT_DESCR ..

PRODUCT_DESCR : RECORD_LABEL : [CURRENCY_SYMBOLE] NUMERIC_VALUE DESCRIPTION SALE_FUNCTION_TYPES NUMERIC_VALUE NUMERIC_VALUE [NUMERIC_VALUE] [NUMERIC_VALUE] [NUMERIC_VALUE] DESCRIPTION DESCRIPTION [COMMENT_DESCR]

SALE_FUNCTION_TYPES : SALE_FUNCTION_ID | SALE_FUNCTION_VALUE

FOLDER_LIST_B : FOLDERS [FOLDER_LIST]

FOLDER_LIST : FOLDER_CONTENT ..

FOLDER_CONTENT : FOLDER_TYPE [ [DOCUMENT_LIST] ]

FOLDER_TYPE : CUSTOMER_DESCR | SUPPLIER_DESCR | LETTER_DESCR | PAYMENT_DESCR

CUSTOMER_DESCR : RECORD_LABEL : SALE_DOC REFERENCE_TYPE [COMMENT_DESCR]

REFERENCE_TYPE : YEAR_NUMERIC_REF_DESCR | NUMERIC_REF_DESCR

YEAR_NUMERIC_REF_DESCR : YEAR_NUMERIC_REF DESCRIPTION

NUMERIC_REF_DESCR : NUMERIC_REF DESCRIPTION

SUPPLIER_DESCR : RECORD_LABEL : SUPPLIER_DOC REFERENCE_TYPE [COMMENT_DESCR]

LETTER_DESCR : RECORD_LABEL : LETTER REFERENCE_TYPE [COMMENT_DESCR]

PAYMENT_DESCR : RECORD_LABEL : PAYMENT REFERENCE_TYPE [COMMENT_DESCR]

DOCUMENT_LIST : DOCUMENT_DESCR ..

DOCUMENT_DESCR : RECORD_LABEL : DESCRIPTION [MEMBER_LIST_B] DESCRIPTION DOCUMENT_BODY

DOCUMENT_BODY : LIVE_DOCUMENT | ARCHIVE_DOCUMENT

LIVE_DOCUMENT : [DATE_TEXT] TAGGED_TEXT_LIST_B [PRODUCT_DOC_DESCR]

TAGGED_TEXT_LIST_B : [ [TAGGED_TEXT_LIST] ]

TAGGED_TEXT_LIST : TAGGED_TEXT_DESCR "," ..

TAGGED_TEXT_DESCR : DESCRIPTION : DESCRIPTION

PRODUCT_DOC_DESCR : DOCUMENT_VALUE_SUMMERY DOC_LINE_LIST_B [NUMERIC_VALUE]

DOCUMENT_VALUE_SUMMERY : CURRENCY_SYMBOLE NUMERIC_VALUE NUMERIC_VALUE [NUMERIC_VALUE]

DOC_LINE_LIST_B : [ DOC_LINE_LIST ]

DOC_LINE_LIST : DOC_LINE_DESCR "," ..

DOC_LINE_DESCR : NUMERIC_VALUE DESCRIPTION NUMERIC_VALUE NUMERIC_VALUE

ARCHIVE_DOCUMENT : DESCRIPTION

TRANSACTION_LIST_B : TRANSACTIONS [TRANSACTION_LIST]

TRANSACTION_LIST : TRANSACTION_DESCR ..

TRANSACTION_DESCR : DATE_TEXT ACCOUNT_ID ACCOUNT_ID DESCRIPTION NUMERIC_VALUE

ACCOUNT_ID : QUOTED_STRING | VALUE_IDENTIFIER | BOUNDED_STRING

Commandes

ABC_lock

#!/usr/bin/perl

# lock

# This script is intended to lock the conccurent access to the data.

# DON'T SCRATCH-IT.

use Fcntl ':flock'; # import LOCK_* constants

open(DATA, @ARGV[0] . ".owner");

flock(DATA,LOCK_EX+LOCK_NB);

$success = $?;

if ($success eq 0) {

if (!(-e @ARGV[0]. ".owner")) {

system('whoami > ' . @ARGV[0] . '.owner');

$success=$?;

}

elsif ( -o @ARGV[0] . ".owner") {

#print "Auto-goal\n";

$success=2;

}

else {

#print "locked by some other person\n";

$success=1;

};

flock(DATA,LOCK_UN);

close(DATA);

}

else {

#print "write access\n";

$success=3;

};

exit ($success);

ABC_unlock

#!/usr/bin/perl

# unlock

# Unlock data file.

# DON'T SCRATCH IT

system('rm ' . @ARGV[0] . '.owner');

exit ($?);

accounter

#!/usr/bin/perl

eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

if $running_under_some_shell;

# this emulates #! processing on NIH machines.

# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;

# process any FOO=bar switches

if ($ENV{'ABC_SECURITY'} eq '') {

$ExitValue = 0;

}

else {

$ExitValue = system('groups | grep -q ABC');

# print "la " .($ExitValue/256 )."\n";

}

exit ($ExitValue/256 );

bc_translate_ABC

#!/usr/bin/perl

if (-e "$ENV{'ABC_DATA'}" .'/filters/bc/'.@ARGV[0].".pm") {

$cmd="perl "."$ENV{'ABC_DATA'}" .'/filters/bc/'.@ARGV[0].".pm";

}

elsif ( -e "$ENV{'ABC_DATA'}" .'/filters/bc/'.@ARGV[0].".awk") {

$cmd='awk -f '."$ENV{'ABC_DATA'}".'/filters/bc/'.@ARGV[0].".awk";

}

else

{$cmd="bc -q"};

#print $cmd . " " . @ARGV[1] ." > " . @ARGV[2]."\n";

system ($cmd . " " . @ARGV[1] ." > " . @ARGV[2]);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

check_login_user

#!/usr/bin/perl

eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

if $running_under_some_shell;

# this emulates #! processing on NIH machines.

# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;

# process any FOO=bar switches

$, = ' '; # set output field separator

$\ = "\n"; # set output record separator

$FS = ':';

open(PWD,'/etc/passwd');

while (<PWD>) {

($Fld1) = split(/[:\n]/, $_, 9999);

if ($Fld1 eq @ARGV[0]) {exit(0)}

}

exit(1)

check_spelling

#!/usr/bin/perl

system ('test `cat '.@ARGV[0].' | aspell -a -d francais | grep "^[#&]" | wc -l` -eq 0');

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result'); exit($status);

exit($status);

correct_spelling

#!/bin/sh

test -e /usr/bin/xterm && terminal=/usr/bin/xterm

test -e /usr/bin/konsole && terminal=/usr/bin/konsole

$terminal -e aspell check --lang=francais $1

status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result'); exit($status);

collection_filter

#!/usr/bin/perl

# collection_filter

system ("umask 0");

$, = ' '; # set output field separator

$\ = "\n"; # set output record separator

$fn = @ARGV[0];

line: while (<>) {

if (/passif[ ,\t]+[+,-.,0-9]+/) {

system ('perl '."$ENV{'ABC_DELIVERY'}".'/resources/perl/bin/bilan.pm ' . $fn . '> /tmp/'."$ENV{'USER'}".'/bilan.html');

system ("$ENV{'BROWZER'}".' /tmp/'."$ENV{'USER'}".'/bilan.html');

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

}

if (/partition [:, ,\t]+TVA|partition [:, ,\t]+VAT/) {

system ('perl '."$ENV{'ABC_DELIVERY'}".'/resources/perl/bin/duty.pm ' . $fn . '> /tmp/'.$ENV{'USER'}.'/duty.txt');

system ("$ENV{'TEXT_VIEWER'}".' /tmp/'."$ENV{'USER'}".'/duty.txt');

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

}

}

#print ("$ENV{'TEXT_VIEWER'}".' '.$fn."\n");

system ("$ENV{'TEXT_VIEWER'}".' '.$fn);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

editor_filter

#!/usr/bin/perl

# editor_filter

# Display the edited component

system ("$ENV{'TEXT_VIEWER'}".' ' . @ARGV[0] );

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

fax_attachments

#!/usr/bin/perl

# specify the attachments .

$result = "";

$i = 0;

while ($i < $#ARGV + 1) {

open(FILE,@ARGV[$i]);

($Fld1) = readline(<FILE>);

# print "read file type for " . @ARGV[$i] ."\n";

# print "read file first line: " . $Fld1 ."\n";

@line1 = split(/ /,$Fld1);

@fn = split(/[\/\\]/, $ARGV[$i], 9999);

$fn = @fn[$#fn];

# print "fn: " . $fn ."\n";

if ($line1[0] eq "%!PS-Adobe-3.0") {

$result=$result." ".@ARGV[$i];

}

elsif ($line1[1] eq "html") {

system('html2ps '.@ARGV[$i].' > /tmp/'.$fn);

$result=$result." /tmp/".$fn;

}

elsif ($line1[1] eq "jpg") {

@fn=split(/[\.]/, $fn, 9999).".pbm";

system('convert '.$ARGV[$i].' pbm:/tmp/'.$fn[1]);

$result=$result." /tmp/".$fn;;

}

elsif ($line1[1] eq "gif") {

@fn=split(/[\.]/, $fn, 9999).".pbm";

system('convert '.$ARGV[$i].' pbm:/tmp/'.$fn[1]);

$result=$result." /tmp/".$fn;;

}

else {

$result=$result." ".$ARGV[$i];

};

$i++;

}

print $result;

get_user_identity

#!/bin/sh

# get_user_identity

export USER=`whoami`

html_document_filter

#!/usr/bin/perl

#

#

#

system("$ENV{'BROWZER'}" . " @ARGV[0]");

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

html_spool_mail

#!/usr/bin/perl

# spool_mail

# Send mail trought the MIME multimedia $MAILER mail utility.

# Check il you have the $MAILER package.

# If not install them.

# $1 is the target E-mail address. $2 is the html main text file xxx.htm.

# following arguments are attachment files.

# PATH=$PATH:`echo $0 | awk 'BEGIN{FS="/"}{ll=length($NF);print substr($0,1,length($0)-ll-1)}'`

umask 000;

chdir '/tmp';

$from="EntrepriseEmail";

$subject="SUBJECT" ; #"`cat $2| gawk '/subject/ {sub(/subject:/,""); gsub(/ /,"_");print}'`"

$to=$ARGV[0];

$text=$ARGV[1];

shift; shift; # skip arguments 1 and 2

$i = 0;

while ($i <= $#ARGV) { $args = $args." ".$ARGV[$i], $i++}

#print "attachments ".$args."\n";

$attach_cmd = "$ENV{'ABC_DELIVERY'}".'/resources/perl/bin/mail_attachments '.$args;

#print "attachments command ".$attach_cmd."\n";

system ("$ENV{'MAILER'}".' -b -S 10000000 -e "base64" -s '.$subject.' -F '.$from.' -t "'.$to.'" -f '.$text.' -m text/html '.`$attach_cmd`);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

html_spool_printer

#!/usr/bin/perl

eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

if $running_under_some_shell;

# this emulates #! processing on NIH machines.

# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;

# process any FOO=bar switches

$[ = 1; # set array base to 1

for ($i = 1; $i <= ($ARGV[0]); $i++) {

system("$ENV{'BROWZER'}" . ' /print("'.$ARGV[2].'")');

}

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

html_translate_pcx

#!/usr/bin/perl

system ('gswin32c -dSAFER -dNOPAUSE -sDEVICE=pcx256 -sOUTPUTFILE='.$ARGV[1].' -q - <'.$ARGV[0]);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result'); exit($status);

html_translate_ps

#!/usr/bin/perl

# Translate html version of a document into it's Poscript version

#

system ('html2ps '. $ARGV[0] ." > ".$ARGV[1]);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

import_data

#!/usr/bin/perl

system ("$ENV{'ABC_DELIVERY'}".'/bin/import_abc ' . $ARGV[0]." ". $ARGV[1]. " ". $ARGV[2]. " ". $ARGV[3]);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

is_user_root

#!/bin/sh

# is_user_root

# Return success status if the user is the computer system manager.

test `id -u` = 0

mail_attachments

#!/usr/bin/perl

# specify the attachment for $MAILER.

$result="";

$i = 0;

while ($i < $#ARGV + 1) {

open(FILE,@ARGV[$i]);

($Fld1) = readline(<FILE>);

# print "read file type for " . @ARGV[$i] ."\n";

# print "read file first line: " . $Fld1 ."\n";

@line1 = split(/ /,$Fld1);

if ($line1[0] eq "%!PS-Adobe-3.0") {

$m="application/postscript";

}

elsif ($line1[1] eq "html") {

$m="text/html";

}

elsif ($line1[1] eq "jpg") {

$m="image/jpeg";

}

elsif ($line1[1] eq "gif") {

$m="image/gif";

}

else {

$m="text/plain";

};

@Fld = split(/[\/\\]/, $ARGV[$i], 9999);

$d= $Fld[$#Fld];

# print "d: ".$d."\n";

$fx=' -n -m '.$m.' -D '.$d.' -f '.$ARGV[$i];

# print "fx1: ".$fx."\n";

$result=$result.$fx;

$i++;

}

print ($result);

manager

#!/bin/sh

# manager

# Currently, a manager is user member of the groupe ABC

(test "$ABC_SECURITY" = "" || groups | grep ABC ) >> /dev/null

pcx_spool_fax

#!/usr/bin/perl

system('echo " /V1 /NMANAGER /SNFAX /T1 /FI'.%2.' /AA | '.%1.' | " > fax.tmp');

system("$ENV{'FAXER'}".' /Ifax.tmp');

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

ps_document_filter

#!/usr/bin/perl

#

#

#

print ("$ENV{'PS_VIEWER'}" . " @ARGV[0]" . "\n");

system("$ENV{'PS_VIEWER'}" . " @ARGV[0]");

print ("status " . $? . "\n");

$status=$? ;

if ($status != -1) {

$status=$status/256;

print ("status " . $status) . "\n";} ;

exit($status);

ps_spool_fax

#!/usr/bin/perl

#print faxing

#--MS_WIN system(echo " /V1 /T0 /NMANAGER /SNFAX /FI".$ARGV[1]." /AA | ".$ARGV[0]." | " > fax.tmp");

#--MS_WIN $cmd =

#--MS_WIN system ("$ENV{'FAXER'}".' /Ifax.tmp');

#--MS_WIN $status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result'); exit($status);

$to=$ARGV[0]; #--UNIX

$text=$ARGV[1]; #--UNIX

shift; shift; # skip arguments 1 and 2 #--UNIX

$i = 0; #--UNIX

while ($i <= $#ARGV) { $args = $args." ".$ARGV[$i], $i++} #--UNIX

#print "attachments ".$args."\n"; #--UNIX

$attach_cmd = "$ENV{'ABC_DELIVERY'}".'/resources/perl/bin/fax_attachments '.$args; #--UNIX

system ("$ENV{'$FAXER'}".' '.$to.' '.$text.' '.$attach_cmd); #--UNIX

$status=$?/256; #--UNIX

#--MS_WIN system('echo '.$status.'>sys_result'); #--UNIX

exit($status); #--UNIX

ps_spool_printer

#!/bin/sh

umask 000

n=$1; shift;

lpr -\#$n $* # > /dev/null

rtf_document_filter

#!/usr/bin/perl

#

#

#

system("$ENV{'RTF_VIEWER'}" . " @ARGV[0]");

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

rtf_spool_mail

#!/usr/bin/perl

# spool_mail

# Send mail trought the MIME multimedia $MAILER mail utility.

# Check il you have the $MAILER package.

# If not install them.

# $1 is the target E-mail address. $2 is the html main text file xxx.htm.

# following arguments are attachment files.

# PATH=$PATH:`echo $0 | awk 'BEGIN{FS="/"}{ll=length($NF);print substr($0,1,length($0)-ll-1)}'`

umask 000;

chdir '/tmp';

$from="EntrepriseEmail";

$subject="SUBJECT" ; #"`cat $2| gawk '/subject/ {sub(/subject:/,""); gsub(/ /,"_");print}'`"

$to=$ARGV[0];

system ('echo Seen attachments > '."$ENV{'SCRATCH_PATH'}".'seeatt.txt');

$text="$ENV{'SCRATCH_PATH'}".'seeatt.txt';

shift; # skip arguments 1 and then put every thing in attachment even the real text

$i = 0;

while ($i <= $#ARGV) { $args = $args." ".$ARGV[$i], $i++}

#print "attachments ".$args."\n";

$attach_cmd = "$ENV{'ABC_DELIVERY'}".'/resources/perl/bin/mail_attachments '.$args;

system ("$ENV{'$MAILER'}".' -b -S 10000000 -e "base64" -s '.$subject.' -F '.$from.' -t "'.$to.'" -f '.$text.' -m text/html '.`$attach_cmd`);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

rtf_spool_printer

#!/usr/bin/perl

eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

if $running_under_some_shell;

# this emulates #! processing on NIH machines.

# (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;

# process any FOO=bar switches

$[ = 1; # set array base to 1

for ($i = 1; $i <= ($ARGV[0]); $i++) {

system("$ENV{'RTF_VIEWER'}" . ' -Mprint '.$ARGV[2]);

}

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result');

exit($status);

rtf_translate_pcx

#!/usr/bin/perl

system ('gswin32c -dSAFER -dNOPAUSE -sDEVICE=pcx256 -sOUTPUTFILE='.$ARGV[1].' -q - <'.$ARGV[0]);

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result'); exit($status);

rtf_translate_ps

#!/usr/bin/perl

#

#

system("$ENV{'RTF_VIEWER'}" . ' -macro print_rtf -pass '. @ARGV[0]); #--UNIX

system('mv '.@ARGV[0].'.ps ' ."@ARGV[1]"); #--UNIX

$status=$?/256; #--UNIX

#--MS_WIN system('echo '1 >sys_result');

exit($status);

sale_time_function

#!/usr/bin/perl

if (@ARGV[2] == "a") {

$r=1;

$d = time;

$d1 = 946681200 ; # date --date '01/01/2000' +%s

$d2 = 978303600 ; # date --date '01/01/2001' +%s

if (( $d1 < $d ) && ( $d < $d2 )) {$r=0.5};

print $r ;

}

else {print "1"} ;

exit 0;

show_archive_filter

#!/usr/bin/perl

#

#

#

$fn = @ARGV[0];

open(FILE,@ARGV[0]);

($Fld1) = readline(<FILE>);

print "read " . $Fld1 ."\n";

@line1 = split(/ /,$Fld1);

print "line1 " . $line1[1] ."\n";

if ($line1[0] eq "%!PS-Adobe-3.0") {

system("$ENV{'PS_VIEWER'}".' ' .$fn);

}

elsif ($line1[1] eq "html") {

system("$ENV{'BROWZER'}".' '. $fn);

}

else {

system("$ENV{'TEXT_VIEWER'}".' '. $fn);

};

substitute

#!/usr/bin/perl

$old=$ARGV[0];

$new=$ARGV[1];

shift;

shift;

while ($i < $#ARGV + 1) {

# print "new file " .$i." " .$ARGV[$i]."\n";

open(FIL_IN,$ARGV[$i]);

open(FIL_OUT,">".$ARGV[$i].".tmp");

select(FIL_OUT);

while(<FIL_IN>){

s/$old/$new/;

print ;

}

close (FIL_IN);

close (FIL_OUT);

rename ($ARGV[$i].".tmp",$ARGV[$i]);

$i++;

};

$status=$?/256;

#--MS_WIN system('echo '.$status.'>sys_result'); exit($status);

translate_phone_number

../../resources/perl/bin/valid_email_address: Fichier ou répertoire inexistant

valid_email_address

../../resources/perl/bin/valid_phone_number: Fichier ou répertoire inexistant

valid_phone_number

../../resources/perl/bin/valid_post_address: Fichier ou répertoire inexistant

valid_post_address

../../resources/perl/bin/valid_post_address: Fichier ou répertoire inexistant

Index

A

action 11

action comptable 15

action d'attente 25

actions 15

actions comptables 15

affichage hiérarchique 15

analytiques 21

Attendre 22

attente 13

attributs typographiques 27

automatique 21

B

bilan 30

C

catalogue 9

champs 20

texte spécifique 12

champs de texte 20

charger 10

choix d'action 21

choix d'une hiérarchie 9

classer 9

clôture 30

commandes

systéme 34

Commandes 45

comportement 24

Comptabilisé 21

comptes 14

comptes d'entrée et de sortie 16

comptes terminaux 16

concevoir un document 13

construition automatique 16

créer et modifier les hiérarchies 9

cycle d'action 22

D

date 26

date de fermeture 11

devise 13

Devise 18

dictionnaire 33

distribution

analytiques 13

É

échéance 22

écriture comptable 13

éditeur d'action 24

E

Envoyer 22

É

état 20

état d'un document 20

état initial 23

étiquette 33

événement 20

F

Fermer 21

fermeture 12

Filtre 25

Filtre de génération 28

flux

taxes 15

fonction 18

G

Générer 22

générer 23

générique 25

H

hiérarchie 16

I

identification 19

image d'un document 25

import-export 30

importation 43

L

lecture seule 10

liste

produits 20

liste de produits 20

liste des symboles 27

M

mode hiérarchique 9

modèle 20

modèle de document 11

N

numération 19

P

Payement 21

plan comptable légale 15

Préférences 39

préférences

système

individuel 33

publier 25

R

rappel 12

relance automatique 23

risques d'échec 23

S

sélection multiple 10

Séquence

suite

cascade 22

signature 21, 27

Signer 21

sous-traitant 29

symbole 25

systéme d'expoitation 34

T

taux de taxe 15

traduction 33

traitement de texte 26

transition d'attente 25

TVA 13, 21

U

utilisateur

login 29

utilisateur autorisé 24

V

version 13

vue analytique 15

W

Windows9X 29, 33