Browse Source

1er depot du plugin 'factures et devis' pour SPIP3

master
cyril@cym.fr 10 years ago
parent
commit
a36262ccf4
  1. 25
      .gitattributes
  2. 81
      base/factures.php
  3. 297
      fabrique_factures.php
  4. 53
      factures_administrations.php
  5. 113
      factures_autorisations.php
  6. 16
      factures_pipelines.php
  7. 16
      formulaires/configurer_factures.html
  8. 17
      formulaires/editer_facture.html
  9. 146
      formulaires/editer_facture.php
  10. 50
      lang/facture_fr.php
  11. 20
      lang/factures_fr.php
  12. 14
      lang/paquet-factures_fr.php
  13. 29
      paquet.xml
  14. 68
      prive/objets/contenu/facture.html
  15. 33
      prive/objets/liste/factures.html
  16. 69
      prive/objets/liste/factures_associer.html
  17. 18
      prive/objets/liste/factures_associer_fonctions.php
  18. 60
      prive/objets/liste/factures_lies.html
  19. 17
      prive/objets/liste/factures_lies_fonctions.php
  20. 7
      prive/squelettes/contenu/configurer_factures.html
  21. 30
      prive/squelettes/contenu/facture_edit.html
  22. BIN
      prive/themes/spip/images/facture-12.png
  23. BIN
      prive/themes/spip/images/facture-16.png
  24. BIN
      prive/themes/spip/images/facture-24.png
  25. BIN
      prive/themes/spip/images/facture-32.png
  26. BIN
      prive/themes/spip/images/facture-new-16.png

25
.gitattributes vendored

@ -1 +1,26 @@
* text=auto !eol
base/factures.php -text
/fabrique_factures.php -text
/factures_administrations.php -text
/factures_autorisations.php -text
/factures_pipelines.php -text
formulaires/configurer_factures.html -text
formulaires/editer_facture.html -text
formulaires/editer_facture.php -text
lang/facture_fr.php -text
lang/factures_fr.php -text
lang/paquet-factures_fr.php -text
/paquet.xml -text
prive/objets/contenu/facture.html -text
prive/objets/liste/factures.html -text
prive/objets/liste/factures_associer.html -text
prive/objets/liste/factures_associer_fonctions.php -text
prive/objets/liste/factures_lies.html -text
prive/objets/liste/factures_lies_fonctions.php -text
prive/squelettes/contenu/configurer_factures.html -text
prive/squelettes/contenu/facture_edit.html -text
prive/themes/spip/images/facture-12.png -text svneol=unset#image/png
prive/themes/spip/images/facture-16.png -text svneol=unset#image/png
prive/themes/spip/images/facture-24.png -text svneol=unset#image/png
prive/themes/spip/images/facture-32.png -text svneol=unset#image/png
prive/themes/spip/images/facture-new-16.png -text svneol=unset#image/png

81
base/factures.php

@ -0,0 +1,81 @@
<?php
/**
* Déclarations relatives à la base de données
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Déclaration des alias de tables et filtres automatiques de champs
*
* @pipeline declarer_tables_interfaces
* @param array $interfaces
* Déclarations d'interface pour le compilateur
* @return array
* Déclarations d'interface pour le compilateur
*/
function factures_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['factures'] = 'factures';
return $interfaces;
}
/**
* Déclaration des objets éditoriaux
*
* @pipeline declarer_tables_objets_sql
* @param array $tables
* Description des tables
* @return array
* Description complétée des tables
*/
function factures_declarer_tables_objets_sql($tables) {
$tables['spip_factures'] = array(
'type' => 'facture',
'principale' => "oui",
'field'=> array(
"id_facture" => "bigint(21) NOT NULL",
"id_organisation" => "int(11) DEFAULT NULL",
"id_type_document" => "int(11) NOT NULL DEFAULT '1'",
"num_facture" => "varchar(50) NOT NULL",
"num_devis" => "varchar(50) DEFAULT NULL",
"date_facture" => "datetime DEFAULT NULL",
"libelle_facture" => "mediumtext",
"conditions" => "text NOT NULL",
"reglement" => "varchar(50) DEFAULT NULL",
"delais_validite" => "int(11) DEFAULT NULL",
"fin_validite" => "datetime DEFAULT NULL",
"montant" => "decimal(18,2) DEFAULT NULL",
"nb_heures_vendues" => "decimal(18,2) DEFAULT NULL",
"nota_bene" => "mediumtext",
"maj" => "TIMESTAMP"
),
'key' => array(
"PRIMARY KEY" => "id_facture",
),
'titre' => "'' AS titre, '' AS lang",
#'date' => "",
'champs_editables' => array(),
'champs_versionnes' => array(),
'rechercher_champs' => array(),
'tables_jointures' => array(),
);
return $tables;
}
?>

297
fabrique_factures.php

@ -0,0 +1,297 @@
<?php
/**
* Fichier généré par la Fabrique de plugin v5
* le 2013-04-03 19:46:31
*
* Ce fichier de sauvegarde peut servir à recréer
* votre plugin avec le plugin «Fabrique» qui a servi à le créer.
*
* Bien évidemment, les modifications apportées ultérieurement
* par vos soins dans le code de ce plugin généré
* NE SERONT PAS connues du plugin «Fabrique» et ne pourront pas
* être recréées par lui !
*
* La «Fabrique» ne pourra que régénerer le code de base du plugin
* avec les informations dont il dispose.
*
**/
if (!defined("_ECRIRE_INC_VERSION")) return;
$data = array (
'fabrique' =>
array (
'version' => 5,
),
'paquet' =>
array (
'nom' => 'Factures & devis',
'slogan' => 'Facturer et faire des devis avec SPIP',
'description' => 'Factures & devis permet d\'éditer, imprimer, archiver facilement vos devis et factures.',
'prefixe' => 'factures',
'version' => '1.0.0',
'auteur' => 'Cyril Marion',
'auteur_lien' => '',
'licence' => 'GNU/GPL',
'categorie' => 'divers',
'etat' => 'dev',
'compatibilite' => '[3.0.7;3.0.*]',
'documentation' => '',
'administrations' => 'on',
'schema' => '1.0.0',
'formulaire_config' => 'on',
'formulaire_config_titre' => '',
'fichiers' =>
array (
0 => 'autorisations',
1 => 'pipelines',
),
'inserer' =>
array (
'paquet' => '',
'administrations' =>
array (
'maj' => '',
'desinstallation' => '',
'fin' => '',
),
'base' =>
array (
'tables' =>
array (
'fin' => '',
),
),
),
'scripts' =>
array (
'pre_copie' => '',
'post_creation' => '',
),
'exemples' => '',
),
'objets' =>
array (
0 =>
array (
'nom' => 'Factures',
'nom_singulier' => 'Facture',
'genre' => 'masculin',
'logo_variantes' => '',
'table' => 'spip_factures',
'cle_primaire' => 'id_facture',
'cle_primaire_sql' => 'bigint(21) NOT NULL',
'table_type' => 'facture',
'champs' =>
array (
0 =>
array (
'nom' => 'Id organisation',
'champ' => 'id_organisation',
'sql' => 'int(11) DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
1 =>
array (
'nom' => 'Id type document',
'champ' => 'id_type_document',
'sql' => 'int(11) NOT NULL DEFAULT \'1\'',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
3 =>
array (
'nom' => 'Num facture',
'champ' => 'num_facture',
'sql' => 'varchar(50) NOT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
4 =>
array (
'nom' => 'Num devis',
'champ' => 'num_devis',
'sql' => 'varchar(50) DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
5 =>
array (
'nom' => 'Date facture',
'champ' => 'date_facture',
'sql' => 'datetime DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
7 =>
array (
'nom' => 'Libelle facture',
'champ' => 'libelle_facture',
'sql' => 'mediumtext',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
8 =>
array (
'nom' => 'Conditions',
'champ' => 'conditions',
'sql' => 'text NOT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
9 =>
array (
'nom' => 'Reglement',
'champ' => 'reglement',
'sql' => 'varchar(50) DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
10 =>
array (
'nom' => 'Delais validite',
'champ' => 'delais_validite',
'sql' => 'int(11) DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
11 =>
array (
'nom' => 'Fin validite',
'champ' => 'fin_validite',
'sql' => 'datetime DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
13 =>
array (
'nom' => 'Montant',
'champ' => 'montant',
'sql' => 'decimal(18,2) DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
15 =>
array (
'nom' => 'Nb heures vendues',
'champ' => 'nb_heures_vendues',
'sql' => 'decimal(18,2) DEFAULT NULL',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
16 =>
array (
'nom' => 'Nota bene',
'champ' => 'nota_bene',
'sql' => 'mediumtext',
'recherche' => '',
'saisie' => '',
'explication' => '',
'saisie_options' => '',
),
),
'champ_titre' => '',
'champ_date' => '',
'statut' => '',
'chaines' =>
array (
'titre_objets' => 'Factures',
'titre_objet' => 'Facture',
'info_aucun_objet' => 'Aucun facture',
'info_1_objet' => 'Un facture',
'info_nb_objets' => '@nb@ factures',
'icone_creer_objet' => 'Créer un facture',
'icone_modifier_objet' => 'Modifier ce facture',
'titre_logo_objet' => 'Logo de ce facture',
'titre_langue_objet' => 'Langue de ce facture',
'titre_objets_rubrique' => 'Factures de la rubrique',
'info_objets_auteur' => 'Les factures de cet auteur',
'retirer_lien_objet' => 'Retirer ce facture',
'retirer_tous_liens_objets' => 'Retirer tous les factures',
'ajouter_lien_objet' => 'Ajouter ce facture',
'texte_ajouter_objet' => 'Ajouter un facture',
'texte_creer_associer_objet' => 'Créer et associer un facture',
'texte_changer_statut_objet' => 'Ce facture est :',
),
'table_liens' => '',
'vue_liens' =>
array (
0 => 'spip_auteurs',
1 => 'spip_contacts',
2 => 'spip_organisations',
),
'roles' => '',
'auteurs_liens' => '',
'vue_auteurs_liens' => '',
'autorisations' =>
array (
'objet_creer' => '',
'objet_voir' => '',
'objet_modifier' => '',
'objet_supprimer' => '',
'associerobjet' => '',
),
'boutons' =>
array (
0 => 'menu_edition',
1 => 'outils_rapides',
),
),
),
'images' =>
array (
'paquet' =>
array (
'logo' =>
array (
0 =>
array (
'extension' => '',
'contenu' => '',
),
),
),
'objets' =>
array (
0 =>
array (
'logo' =>
array (
0 =>
array (
'extension' => 'png',
'contenu' => 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABAxJREFUeNq8V1tME0EUvdsWLG21UnzwLg9FLMHgI6JAqIKJ/mj8IvFbEhM14iPxFY3gBz5iNHyoUfk1wJ9KTIgKEdFqUARFI9qIIoqBSEILGPva9c7SXWfp7rYW9CSTmbmzO3PuuXNndhmO40DAjaamaqwqscyDKMEwjAbxg2PZup0VFZfCPi8QuN7YWJWcmHimtLBQHxMTw0RLoPvNGzAaDNDd2+v1BwJHK8OQ0AgNJFK5buXKOTE6HQOEVJSlf2AA0tPSYEVeXqxOqz2Lqh6KlIDVYDBoiB4zKQRevx9SUlIgz2YjJGpvNDYeioTArBQCHxIgJSkxEZbn5sbqdLpaDPEROQI6ocGyrOhBS2srX6ehF3q9HpwfP4ovzDWZIN9mA0dnJ9/fUl4umdBkNIJrYgLi4uL4/iIkwXJcbF9f3+lrDQ2wa8eOc7IEaA82l5VJJs2yWkOYC8/QWUSQmZ4OTqcTMrOyAEPK2xYuXjxF4t27vdhVIQAzRyaSxVSEz/394B4fF+0ZSMzj9carh4CbDQoAVswCUqajq6eHVSZAheDBw4dgW7YMBoeGYBy9SE9N5dUZ/Po1ZNL5ZjNY0btXvb18vyA/Hz5hKv7yeGB5Tg70oH3Thg3iGooEOEqBcrudr8kuppGTna3otfAOQYLFIrEL85I11BUIttva22HtmjW8Vx70hECr0cASJPAeNxi/MTMy4Nv37+I4DXIQEfvwyAjfLwuSU1WA3gMbS0v5uqiwMOSF5KSkP7FG6dVgy82VZAqrpgCRR2DY3tHB15b4eDBiXtOxT0lOBpfbDROY6zSyMe1GR0dhzOWS2Mg5siAhIcIQBAmUlpRIUwvljgSEnBxEBcKGAP4tVENA74HHT57M6sIlxcUREMDFaYmKiookDzocjhBbpGNsJCHgpp2E5EW5yZSgNvbX5wDBuvXrJQ8+e/o0xKY09vruJfj04jbfDgQCcOuedurU9PlMdbuvurFZX3Xlw0HVu0DuXlC7K+gxsvie44fB6/HCr8mf8HNiEibdk6RmsD/X8eg++e48qHgdz5RAxuptcLn2vKiAVjulgM/n4xjWRw6Q+rC34UwIfO66E6UC9IRyi6ikGj1mVVLAiwpw/0GBgX+twNuWOvjS1SzaiZfDwZ1OYExIVVDAiwr45RWYvglfPn8eQkCwDXXegn0nj8l5yPfRQ6iqqY5egQL8FlBD7I/toodyMCflyI6HU8DpGhsrMJvNmnBn++DLZqUYBxV4gAqc+msF6lvb2i7Y7Xa9xWJRJZG2amsYBZZKxom6Ab+f49iAhwHWRyvA0HHfX1NDmO3Ekqf61TvSZDpQfYKJYg8I4+N4FM8LIUADySh/+w/fvBj8jVfCB/INqzIu3gW/BRgAh/RYXDg93aEAAAAASUVORK5CYII=',
),
),
),
),
),
);
?>

53
factures_administrations.php

@ -0,0 +1,53 @@
<?php
/**
* Fichier gérant l'installation et désinstallation du plugin Factures &amp; devis
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Installation
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Fonction d'installation et de mise à jour du plugin Factures &amp; devis.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @param string $version_cible
* Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
* @return void
**/
function factures_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(array('maj_tables', array('spip_factures')));
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin Factures &amp; devis.
*
* @param string $nom_meta_base_version
* Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
* @return void
**/
function factures_vider_tables($nom_meta_base_version) {
sql_drop_table("spip_factures");
# Nettoyer les versionnages et forums
sql_delete("spip_versions", sql_in("objet", array('facture')));
sql_delete("spip_versions_fragments", sql_in("objet", array('facture')));
sql_delete("spip_forum", sql_in("objet", array('facture')));
effacer_meta($nom_meta_base_version);
}
?>

113
factures_autorisations.php

@ -0,0 +1,113 @@
<?php
/**
* Définit les autorisations du plugin Factures &amp; devis
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Autorisations
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Fonction d'appel pour le pipeline
* @pipeline autoriser */
function factures_autoriser(){}
// -----------------
// Objet factures
/**
* Autorisation de voir un élément de menu (factures)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_factures_menu_dist($faire, $type, $id, $qui, $opt){
return true;
}
/**
* Autorisation de voir le bouton d'accès rapide de création (facture)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_facturecreer_menu_dist($faire, $type, $id, $qui, $opt){
return autoriser('creer', 'facture', '', $qui, $opt);
}
/**
* Autorisation de créer (facture)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_facture_creer_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de voir (facture)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_facture_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de modifier (facture)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_facture_modifier_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de supprimer (facture)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_facture_supprimer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' AND !$qui['restreint'];
}
?>

16
factures_pipelines.php

@ -0,0 +1,16 @@
<?php
/**
* Utilisations de pipelines par Factures &amp; devis
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
?>

16
formulaires/configurer_factures.html

@ -0,0 +1,16 @@
<div class="formulaire_spip formulaire_configurer formulaire_#FORM">
<h3 class="titrem"><:factures:cfg_titre_parametrages:></h3>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#ENV{action}">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
<input type="hidden" name="_meta_casier" value="factures" />
<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
</div>
</form>
</div>

17
formulaires/editer_facture.html

@ -0,0 +1,17 @@
<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_facture,nouveau}'>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV**{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[(#ENV{editable})
<form method='post' action='#ENV{action}'><div>
#ACTION_FORMULAIRE{#ENV{action}}
<input type='hidden' name='id_facture' value='#ENV{id_facture}' />
<ul>
</ul>
[(#REM) ajouter les saisies supplementaires : extra et autre, a cet endroit ]
<!--extra-->
<p class="boutons"><input type='submit' class='submit' value='<:bouton_enregistrer:>' /></p>
</div></form>
]
</div>

146
formulaires/editer_facture.php

@ -0,0 +1,146 @@
<?php
/**
* Gestion du formulaire de d'édition de facture
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Formulaires
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/actions');
include_spip('inc/editer');
/**
* Identifier le formulaire en faisant abstraction des paramètres qui ne représentent pas l'objet edité
*
* @param int|string $id_facture
* Identifiant du facture. 'new' pour un nouveau facture.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le facture créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un facture source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du facture, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return string
* Hash du formulaire
*/
function formulaires_editer_facture_identifier_dist($id_facture='new', $retour='', $associer_objet='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return serialize(array(intval($id_facture), $associer_objet));
}
/**
* Chargement du formulaire d'édition de facture
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_facture
* Identifiant du facture. 'new' pour un nouveau facture.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le facture créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un facture source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du facture, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Environnement du formulaire
*/
function formulaires_editer_facture_charger_dist($id_facture='new', $retour='', $associer_objet='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$valeurs = formulaires_editer_objet_charger('facture',$id_facture,'',$lier_trad,$retour,$config_fonc,$row,$hidden);
return $valeurs;
}
/**
* Vérifications du formulaire d'édition de facture
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_facture
* Identifiant du facture. 'new' pour un nouveau facture.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le facture créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un facture source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du facture, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Tableau des erreurs
*/
function formulaires_editer_facture_verifier_dist($id_facture='new', $retour='', $associer_objet='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
return formulaires_editer_objet_verifier('facture',$id_facture);
}
/**
* Traitement du formulaire d'édition de facture
*
* Traiter les champs postés
*
* @uses formulaires_editer_objet_traiter()
*
* @param int|string $id_facture
* Identifiant du facture. 'new' pour un nouveau facture.
* @param string $retour
* URL de redirection après le traitement
* @param string $associer_objet
* Éventuel `objet|x` indiquant de lier le facture créé à cet objet,
* tel que `article|3`
* @param int $lier_trad
* Identifiant éventuel d'un facture source d'une traduction
* @param string $config_fonc
* Nom de la fonction ajoutant des configurations particulières au formulaire
* @param array $row
* Valeurs de la ligne SQL du facture, si connu
* @param string $hidden
* Contenu HTML ajouté en même temps que les champs cachés du formulaire.
* @return array
* Retours des traitements
*/
function formulaires_editer_facture_traiter_dist($id_facture='new', $retour='', $associer_objet='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
$res = formulaires_editer_objet_traiter('facture',$id_facture,'',$lier_trad,$retour,$config_fonc,$row,$hidden);
// Un lien a prendre en compte ?
if ($associer_objet AND $id_facture = $res['id_facture']) {
list($objet, $id_objet) = explode('|', $associer_objet);
if ($objet AND $id_objet AND autoriser('modifier', $objet, $id_objet)) {
include_spip('action/editer_liens');
objet_associer(array('facture' => $id_facture), array($objet => $id_objet));
if (isset($res['redirect'])) {
$res['redirect'] = parametre_url ($res['redirect'], "id_lien_ajoute", $id_facture, '&');
}
}
}
return $res;
}
?>

50
lang/facture_fr.php

@ -0,0 +1,50 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'ajouter_lien_facture' => 'Ajouter ce facture',
// I
'icone_creer_facture' => 'Créer un facture',
'icone_modifier_facture' => 'Modifier ce facture',
'info_1_facture' => 'Un facture',
'info_aucun_facture' => 'Aucun facture',
'info_factures_auteur' => 'Les factures de cet auteur',
'info_nb_factures' => '@nb@ factures',
// L
'label_conditions' => 'Conditions',
'label_date_facture' => 'Date facture',
'label_delais_validite' => 'Delais validite',
'label_fin_validite' => 'Fin validite',
'label_id_organisation' => 'Id organisation',
'label_id_type_document' => 'Id type document',
'label_libelle_facture' => 'Libelle facture',
'label_montant' => 'Montant',
'label_nb_heures_vendues' => 'Nb heures vendues',
'label_nota_bene' => 'Nota bene',
'label_num_devis' => 'Num devis',
'label_num_facture' => 'Num facture',
'label_reglement' => 'Reglement',
// R
'retirer_lien_facture' => 'Retirer ce facture',
'retirer_tous_liens_factures' => 'Retirer tous les factures',
// T
'texte_ajouter_facture' => 'Ajouter un facture',
'texte_changer_statut_facture' => 'Ce facture est :',
'texte_creer_associer_facture' => 'Créer et associer un facture',
'titre_facture' => 'Facture',
'titre_factures' => 'Factures',
'titre_factures_rubrique' => 'Factures de la rubrique',
'titre_langue_facture' => 'Langue de ce facture',
'titre_logo_facture' => 'Logo de ce facture',
);
?>

20
lang/factures_fr.php

@ -0,0 +1,20 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// F
'factures_titre' => 'Factures & devis',
// C
'cfg_exemple' => 'Exemple',
'cfg_exemple_explication' => 'Explication de cet exemple',
'cfg_titre_parametrages' => 'Paramétrages',
// T
'titre_page_configurer_factures' => 'Factures & devis',
);
?>

14
lang/paquet-factures_fr.php

@ -0,0 +1,14 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) return;
$GLOBALS[$GLOBALS['idx_lang']] = array(
// F
'factures_description' => 'Factures & devis permet d\'éditer, imprimer, archiver facilement vos devis et factures.',
'factures_nom' => 'Factures & devis',
'factures_slogan' => 'Facturer et faire des devis avec SPIP',
);
?>

29
paquet.xml

@ -0,0 +1,29 @@
<paquet
prefix="factures"
categorie="divers"
version="1.0.0"
etat="dev"
compatibilite="[3.0.7;3.0.*]"
logo=""
documentation=""
schema="1.0.0"
>
<!--
Paquet généré le 2013-04-03 19:46:31
-->
<nom>Factures &amp; devis</nom>
<auteur>Cyril Marion</auteur>
<licence>GNU/GPL</licence>
<necessite nom="saisies" compatibilite="[1.24.0;]" />
<pipeline nom="autoriser" inclure="factures_autorisations.php" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/factures.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/factures.php" />
<menu nom="factures" titre="facture:titre_factures" parent="menu_edition" icone="images/facture-16.png" action="factures" />
<menu nom="facture_creer" titre="facture:icone_creer_facture" parent="outils_rapides" icone="images/facture-new-16.png" action="facture_edit" parametres="new=oui" />
</paquet>

68
prive/objets/contenu/facture.html

@ -0,0 +1,68 @@
<BOUCLE_facture(FACTURES){id_facture}>
[<div class="champ contenu_id_organisation[ (#ID_ORGANISATION*|strlen|?{'',vide})]">
<label><:facture:label_id_organisation:> : </label>
<span dir='#LANG_DIR' class='#EDIT{id_organisation} id_organisation'>(#ID_ORGANISATION)</span>
</div>]
[<div class="champ contenu_id_type_document[ (#ID_TYPE_DOCUMENT*|strlen|?{'',vide})]">
<label><:facture:label_id_type_document:> : </label>
<span dir='#LANG_DIR' class='#EDIT{id_type_document} id_type_document'>(#ID_TYPE_DOCUMENT)</span>
</div>]
[<div class="champ contenu_num_facture[ (#NUM_FACTURE*|strlen|?{'',vide})]">
<label><:facture:label_num_facture:> : </label>
<span dir='#LANG_DIR' class='#EDIT{num_facture} num_facture'>(#NUM_FACTURE)</span>
</div>]
[<div class="champ contenu_num_devis[ (#NUM_DEVIS*|strlen|?{'',vide})]">
<label><:facture:label_num_devis:> : </label>
<span dir='#LANG_DIR' class='#EDIT{num_devis} num_devis'>(#NUM_DEVIS)</span>
</div>]
[<div class="champ contenu_date_facture[ (#DATE_FACTURE*|strlen|?{'',vide})]">
<label><:facture:label_date_facture:> : </label>
<span dir='#LANG_DIR' class='#EDIT{date_facture} date_facture'>(#DATE_FACTURE)</span>
</div>]
[<div class="champ contenu_libelle_facture[ (#LIBELLE_FACTURE*|strlen|?{'',vide})]">
<label><:facture:label_libelle_facture:> : </label>
<span dir='#LANG_DIR' class='#EDIT{libelle_facture} libelle_facture'>(#LIBELLE_FACTURE)</span>
</div>]
[<div class="champ contenu_conditions[ (#CONDITIONS*|strlen|?{'',vide})]">
<label><:facture:label_conditions:> : </label>
<span dir='#LANG_DIR' class='#EDIT{conditions} conditions'>(#CONDITIONS)</span>
</div>]
[<div class="champ contenu_reglement[ (#REGLEMENT*|strlen|?{'',vide})]">
<label><:facture:label_reglement:> : </label>
<span dir='#LANG_DIR' class='#EDIT{reglement} reglement'>(#REGLEMENT)</span>
</div>]
[<div class="champ contenu_delais_validite[ (#DELAIS_VALIDITE*|strlen|?{'',vide})]">
<label><:facture:label_delais_validite:> : </label>
<span dir='#LANG_DIR' class='#EDIT{delais_validite} delais_validite'>(#DELAIS_VALIDITE)</span>
</div>]
[<div class="champ contenu_fin_validite[ (#FIN_VALIDITE*|strlen|?{'',vide})]">
<label><:facture:label_fin_validite:> : </label>
<span dir='#LANG_DIR' class='#EDIT{fin_validite} fin_validite'>(#FIN_VALIDITE)</span>
</div>]
[<div class="champ contenu_montant[ (#MONTANT*|strlen|?{'',vide})]">
<label><:facture:label_montant:> : </label>
<span dir='#LANG_DIR' class='#EDIT{montant} montant'>(#MONTANT)</span>
</div>]
[<div class="champ contenu_nb_heures_vendues[ (#NB_HEURES_VENDUES*|strlen|?{'',vide})]">
<label><:facture:label_nb_heures_vendues:> : </label>
<span dir='#LANG_DIR' class='#EDIT{nb_heures_vendues} nb_heures_vendues'>(#NB_HEURES_VENDUES)</span>
</div>]
[<div class="champ contenu_nota_bene[ (#NOTA_BENE*|strlen|?{'',vide})]">
<label><:facture:label_nota_bene:> : </label>
<span dir='#LANG_DIR' class='#EDIT{nota_bene} nota_bene'>(#NOTA_BENE)</span>
</div>]
</BOUCLE_facture>

33
prive/objets/liste/factures.html

@ -0,0 +1,33 @@
[(#SET{defaut_tri,#ARRAY{
id_facture,1,
points,-1
}})]<B_liste_factures>
#ANCRE_PAGINATION
<div class="liste-objets factures">
<table class='spip liste'>
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{facture:info_1_facture,facture:info_nb_factures}})</strong></caption>]
<thead>
<tr class='first_row'>
<th class='picto' scope='col'></th>
<th class='' scope='col'>[(#TRI{,<:facture:label_:>,ajax})]</th>
<th class='id' scope='col'>[(#TRI{id_facture,<:info_numero_abbreviation:>,ajax})]</th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_factures(FACTURES){id_organisation?}{id_type_document?}{id_mot?}{id_auteur?}{where?}{recherche?}{tri #ENV{par,num },#GET{defaut_tri}}{par }{pagination #ENV{nb,10}}>
<tr class='[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]'>
<td class='picto'>[(#CHEMIN_IMAGE{facture-16.png}|balise_img)]</td>
<td class=' principale'>[(#LOGO_FACTURE|image_reduire{20,26})]<a href="[(#ID_FACTURE|generer_url_entite{facture})]" title="<:info_numero_abbreviation|attribut_html:> #ID_FACTURE">[(#RANG). ]#</a></td>
<td class='id'>[(#AUTORISER{modifier,facture,#ID_FACTURE}|?{
<a href="[(#URL_ECRIRE{facture_edit,id_facture=#ID_FACTURE})]">#ID_FACTURE</a>,
#ID_FACTURE
})]</td>
</tr>
</BOUCLE_liste_factures>
</tbody>
</table>
[<p class='pagination'>(#PAGINATION{prive})</p>]
</div>
</B_liste_factures>[
<div class="liste-objets factures caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
]<//B_liste_factures>

69
prive/objets/liste/factures_associer.html

@ -0,0 +1,69 @@
[(#SET{defaut_tri,#ARRAY{
multi id_organisation,1,
id_facture,1
}})
]
#SET{exclus,#ENV**{exclus,#ENV{objet_source}|lister_objets_lies{#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}}}}
#SET{debut,#ENV{debutfaca,#EVAL{_request("debutfaca");}}}
<B_liste_factures>
[(#REM) En cas de pagination indirecte @32, il faut refaire le set car la boucle
a mis a jour la valeur avec la page reelle]
#SET{debut,#ENV{debutfaca,#EVAL{_request("debutfaca");}}}
#SET{afficher_lettres,#TRI|=={'multi id_organisation'}|oui}
#ANCRE_PAGINATION
<div class="liste-objets liste-objets-associer factures">
<table class='spip liste'>
[<caption><span class="caption"><strong>(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{facture:info_1_facture,facture:info_nb_factures}})</strong>
<span class="recherche">
<label for="recherche-#ENV{id}"><:info_rechercher_02:></label>
<input type="text" class="recherche" name="recherche" id="recherche-#ENV{id}" value="#ENV{recherche}" />
<input type="submit" class="tout_voir" name="tout_voir" value="<:info_tout_afficher:>" />
</span>
</span>
</caption>]
<thead>
#SET{p,''}
<BOUCLE_lettre(FACTURES){tout}{!id_facture IN #GET{exclus}}{where?}{recherche?}
{tri #ENV{par,multi id_organisation},#GET{defaut_tri}}{id_facture==#GET{afficher_lettres}|?{'.*','A'}}>[
(#ID_ORGANISATION**|extraire_multi|initiale|unique|oui)
[(#SET{p,#GET{p}|concat{
#SELF|parametre_url{debutfaca,@#ID_FACTURE}|ancre_url{paginationfaca}|afficher_initiale{#ID_ORGANISATION**|extraire_multi|initiale{},#COMPTEUR_BOUCLE,#GET{debut},#ENV{nb,10}}
}})]
]#SAUTER{#ENV{nb,10}|moins{#COMPTEUR_BOUCLE|=={1}|?{2,1}}}</BOUCLE_lettre>[
(#SET{p,
#GET{p}|concat{
#REM|afficher_initiale{#REM,#TOTAL_BOUCLE,#GET{debut},#ENV{nb,10}}
}
})]</B_lettre>
[<tr><td colspan="3"><p class='pagination'>(#GET{p})</p></td></tr>]
<tr class='first_row'>
<th class='id_organisation' scope='col'>[(#TRI{multi id_organisation,<:facture:label_id_organisation:>,ajax})]</th>
<th class='action' scope='col'></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_factures(FACTURES){!id_facture IN #GET{exclus}}{where?}{recherche?}
{tri #ENV{par,multi id_organisation},#GET{defaut_tri}}{pagination #ENV{nb,10} faca}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#ID_ORGANISATION**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)]">
<td class='id_organisation'>[(#LOGO_FACTURE|image_reduire{20,20})]<a href="[(#ID_FACTURE|generer_url_entite{facture})]">#ID_ORGANISATION</a></td>
<td class='action'>
<button class="button link add" name="ajouter_lien\[facture-#ID_FACTURE-#OBJET-#ID_OBJET\]" value="+"><:facture:ajouter_lien_facture:> [(#CHEMIN_IMAGE{ajouter-12.png}|balise_img{'+'})]</button>
</td>
</tr>
</BOUCLE_liste_factures>
</tbody>
</table>
[<p class='pagination'>(#PAGINATION{prive})</p>]
</div>
</B_liste_factures>[(#ENV{recherche}|oui)
<div class="liste-objets liste-objets-associer factures caption-wrap">
<span class="caption"><strong>[(#VAL{info_recherche_auteur_zero}|_T{#ARRAY{cherche_auteur,#ENV{recherche}}})]</strong>
<span class="recherche">
<label for="recherche-#ENV{id}"><:info_rechercher_02:></label>
<input type="text" class="recherche" name="recherche" id="recherche-#ENV{id}" value="#ENV{recherche}" />
<input type="submit" class="tout_voir" name="tout_voir" value="<:info_tout_afficher:>" />
</span>
</span>
</div>
]<//B_liste_factures>

18
prive/objets/liste/factures_associer_fonctions.php

@ -0,0 +1,18 @@
<?php
/**
* Fonctions du squelette associé
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
// pour initiale et afficher_initiale
include_spip('prive/objets/liste/auteurs_fonctions');
?>

60
prive/objets/liste/factures_lies.html

@ -0,0 +1,60 @@
[(#SET{defaut_tri,#ARRAY{
multi id_organisation,1,
id_facture,1
}})
]
#SET{selection,#ENV**{selection,#ENV{objet_source}|lister_objets_lies{#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}}}}
#SET{debut,#ENV{debutfacl,#EVAL{_request("debutfacl");}}}
<B_liste_factures>
[(#REM) En cas de pagination indirecte @32, il faut refaire le set car la boucle
a mis a jour la valeur avec la page reelle]
#SET{debut,#ENV{debutfacl,#EVAL{_request("debutfacl");}}}
#SET{afficher_lettres,#TRI|=={'multi id_organisation'}|oui}
#ANCRE_PAGINATION
<div class="liste-objets liste-objets-lies factures">
<table class='spip liste'>
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{facture:info_1_facture,facture:info_nb_factures}})</strong></caption>]
<thead>
#SET{p,''}
<BOUCLE_lettre(FACTURES){tout}{id_facture IN #GET{selection}}{where?}
{tri #ENV{par,multi id_organisation},#GET{defaut_tri}}{id_facture==#GET{afficher_lettres}|?{'.*','A'}}>[
(#ID_ORGANISATION**|extraire_multi|initiale|unique|oui)
[(#SET{p,#GET{p}|concat{
#SELF|parametre_url{debutfacl,@#ID_FACTURE}|ancre_url{paginationfacl}|afficher_initiale{#ID_ORGANISATION**|extraire_multi|initiale{},#COMPTEUR_BOUCLE,#GET{debut},#ENV{nb,10}}
}})]
]#SAUTER{#ENV{nb,10}|moins{#COMPTEUR_BOUCLE|=={1}|?{2,1}}}</BOUCLE_lettre>[
(#SET{p,
#GET{p}|concat{
#REM|afficher_initiale{#REM,#TOTAL_BOUCLE,#GET{debut},#ENV{nb,10}}
}
})]</B_lettre>
[<tr><td colspan="4"><p class='pagination'>(#GET{p})</p></td></tr>]
<tr class='first_row'>
<th class='id_organisation' scope='col'>[(#TRI{multi id_organisation,<:facture:label_id_organisation:>,ajax})]</th>
<th class='action' scope='col'></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_factures(FACTURES){id_facture IN #GET{selection}}
{tri #ENV{par,multi id_organisation},#GET{defaut_tri}}{pagination #ENV{nb,10} facl}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#ID_ORGANISATION**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)][(#ID_FACTURE|=={#ENV{id_lien_ajoute}}|oui)append]">
<td class='id_organisation'>[(#LOGO_FACTURE|image_reduire{20,20})]<a href="[(#ID_FACTURE|generer_url_entite{facture})]">#ID_ORGANISATION</a></td>
<td class='action'>
[(#ENV{editable}|oui)
<button class="button link delete" name="supprimer_lien\[facture-#ID_FACTURE-#OBJET-#ID_OBJET\]" value="X"><:facture:retirer_lien_facture:> [(#CHEMIN_IMAGE{supprimer-12.png}|balise_img{'X'})]</button>
]
</td>
</tr>
</BOUCLE_liste_factures>
</tbody>
</table>
[<p class='pagination'>(#PAGINATION{prive})</p>]
[(#GRAND_TOTAL|>{3}|oui)<div class="action"><button class="button link" name="supprimer_lien\[facture-*-#OBJET-#ID_OBJET\]" value="X"><:facture:retirer_tous_liens_factures:> [(#CHEMIN_IMAGE{supprimer-8.png}|balise_img{'X'})]</button></div>]
</div>
</B_liste_factures>
<div class="liste-objets liste-objets-lies FACTURES caption-wrap">
<strong class="caption">[(#ENV*{titre,<:facture:info_aucun_facture:>})]</strong>
</div>
<//B_liste_factures>

17
prive/objets/liste/factures_lies_fonctions.php

@ -0,0 +1,17 @@
<?php
/**
* Fonctions du squelette associé
*
* @plugin Factures &amp; devis
* @copyright 2013
* @author Cyril Marion
* @licence GNU/GPL
* @package SPIP\Factures\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
// pour initiale et afficher_initiale
include_spip('prive/objets/liste/auteurs_fonctions');
?>

7
prive/squelettes/contenu/configurer_factures.html

@ -0,0 +1,7 @@
[(#AUTORISER{configurer,_factures}|sinon_interdire_acces)]
<h1 class="grostitre"><:factures:titre_page_configurer_factures:></h1>
<div class="ajax">
#FORMULAIRE_CONFIGURER_FACTURES
</div>

30
prive/squelettes/contenu/facture_edit.html

@ -0,0 +1,30 @@
[(#ID_OBJET|oui)
[(#AUTORISER{modifier,facture,#ID_FACTURE}|sinon_interdire_acces)]
][(#ID_OBJET|non)
[(#AUTORISER{creer,facture}|sinon_interdire_acces)]
]
#SET{redirect,#ENV{redirect}|sinon{#ID_FACTURE|?{#ID_FACTURE|generer_url_entite{facture},#URL_ECRIRE{factures}}}}
<div class='cadre-formulaire-editer'>
<div class="entete-formulaire">
[(#ID_FACTURE|oui)
[(#GET{redirect}|icone_verticale{Retour,facture,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
]
[
[(#ID_FACTURE|?{<:facture:icone_modifier_facture:>,<:facture:icone_creer_facture:>})]
<h1>(#ENV{titre,#INFO_ID_ORGANISATION{facture,#ID_FACTURE}|sinon{<:info_sans_titre:>}})</h1>
]
</div>
#SET{redirect,#ENV{redirect,#ID_FACTURE|generer_url_entite{facture}}}
[(#ENV{retourajax,''}|oui)
#SET{redirect,'javascript:if (window.jQuery) jQuery(".entete-formulaire .retour a").followLink();'}
<div class="ajax">
]
[(#FORMULAIRE_EDITER_FACTURE{#ENV{id_facture,oui}, #GET{redirect}, #ENV{associer_objet}})]
[(#ENV{retourajax,''}|oui)
</div>
<script type="text/javascript">/*<!\[CDATA\[*/reloadExecPage('#ENV{exec}');/*\]\]>*/</script>
]
</div>

BIN
prive/themes/spip/images/facture-12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 B

BIN
prive/themes/spip/images/facture-16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 B

BIN
prive/themes/spip/images/facture-24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
prive/themes/spip/images/facture-32.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
prive/themes/spip/images/facture-new-16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

Loading…
Cancel
Save