Commit f8b93531 authored by Matthieu Marcillaud's avatar Matthieu Marcillaud
Browse files

Import initial du plugin «Codes de réductions», créé en 2017.

Il déclare un objet éditorial spécifique (spip_codereducs) et des fonctions
pour intéragir avec un panier.
parents
Pipeline #129 failed with stages
in 36 seconds
<?php
/**
* Déclarations relatives à la base de données
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\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 codereduc_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['codereducs'] = 'codereducs';
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 codereduc_declarer_tables_objets_sql($tables) {
$tables['spip_codereducs'] = array(
'type' => 'codereduc',
'principale' => 'oui',
'page' => false,
'field'=> array(
'id_codereduc' => 'bigint(21) NOT NULL',
'titre' => 'text NOT NULL DEFAULT ""',
'code' => 'varchar(25) NOT NULL DEFAULT ""',
'reduction' => 'decimal(4,4) not null default 0',
'date_debut' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'date_fin' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'tables_liees' => 'text NOT NULL DEFAULT ""',
'quantite' => 'bigint(21) NOT NULL DEFAULT 0',
'quantite_utilisee' => 'bigint(21) NOT NULL DEFAULT 0',
'date' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'statut' => 'varchar(20) DEFAULT "0" NOT NULL',
'maj' => 'TIMESTAMP'
),
'key' => array(
'PRIMARY KEY' => 'id_codereduc',
'KEY statut' => 'statut',
),
'titre' => 'titre AS titre, "" AS lang',
'date' => 'date',
'champs_editables' => array('titre', 'code', 'reduction', 'date_debut', 'date_fin', 'tables_liees', 'quantite'),
'champs_versionnes' => array('titre', 'code', 'reduction', 'date_debut', 'date_fin', 'tables_liees', 'quantite'),
'rechercher_champs' => array("titre" => 1, "code" => 1),
'tables_jointures' => array('spip_codereducs_liens'),
'statut_textes_instituer' => array(
'prop' => 'texte_statut_propose_evaluation',
'publie' => 'texte_statut_publie',
'refuse' => 'texte_statut_refuse',
'poubelle' => 'texte_statut_poubelle',
),
'statut'=> array(
array(
'champ' => 'statut',
'publie' => 'publie',
'previsu' => 'publie,prop,prepa',
'post_date' => 'date',
'exception' => array('statut','tout')
)
),
'texte_changer_statut' => 'codereduc:texte_changer_statut_codereduc',
);
return $tables;
}
/**
* Déclaration des tables secondaires (liaisons)
*
* @pipeline declarer_tables_auxiliaires
* @param array $tables
* Description des tables
* @return array
* Description complétée des tables
*/
function codereduc_declarer_tables_auxiliaires($tables) {
$tables['spip_codereducs_liens'] = array(
'field' => array(
'id_codereduc' => 'bigint(21) DEFAULT "0" NOT NULL',
'id_objet' => 'bigint(21) DEFAULT "0" NOT NULL',
'objet' => 'VARCHAR(25) DEFAULT "" NOT NULL',
'vu' => 'VARCHAR(6) DEFAULT "non" NOT NULL',
),
'key' => array(
'PRIMARY KEY' => 'id_codereduc,id_objet,objet',
'KEY id_codereduc' => 'id_codereduc',
)
);
return $tables;
}
<?php
/**
* Fichier gérant l'installation et désinstallation du plugin Codes de réduction
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\Installation
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fonction d'installation et de mise à jour du plugin Codes de réduction.
*
* @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 codereduc_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(array('maj_tables', array('spip_codereducs', 'spip_codereducs_liens')));
$maj['1.0.1'] = array(
array('maj_tables', array('spip_codereducs'))
);
$maj['1.0.2'] = array(
array('sql_alter', 'TABLE spip_codereducs change remise reduction decimal(4,4) not null default 0'),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
/**
* Fonction de désinstallation du plugin Codes de réduction.
*
* @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 codereduc_vider_tables($nom_meta_base_version) {
sql_drop_table('spip_codereducs');
sql_drop_table('spip_codereducs_liens');
# Nettoyer les liens courants (le génie optimiser_base_disparus se chargera de nettoyer toutes les tables de liens)
sql_delete('spip_documents_liens', sql_in('objet', array('codereduc')));
sql_delete('spip_mots_liens', sql_in('objet', array('codereduc')));
sql_delete('spip_auteurs_liens', sql_in('objet', array('codereduc')));
# Nettoyer les versionnages et forums
sql_delete('spip_versions', sql_in('objet', array('codereduc')));
sql_delete('spip_versions_fragments', sql_in('objet', array('codereduc')));
sql_delete('spip_forum', sql_in('objet', array('codereduc')));
effacer_meta($nom_meta_base_version);
}
<?php
/**
* Définit les autorisations du plugin Codes de réduction
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\Autorisations
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Fonction d'appel pour le pipeline
* @pipeline autoriser */
function codereduc_autoriser() {
}
// -----------------
// Objet codereducs
/**
* Autorisation de voir un élément de menu (codereducs)
*
* @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_codereducs_menu_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de créer (codereduc)
*
* @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_codereduc_creer_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de voir (codereduc)
*
* @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_codereduc_voir_dist($faire, $type, $id, $qui, $opt) {
return true;
}
/**
* Autorisation de modifier (codereduc)
*
* @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_codereduc_modifier_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
/**
* Autorisation de supprimer (codereduc)
*
* @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_codereduc_supprimer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
/**
* Autorisation de lier/délier l'élément (codereducs)
*
* @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_associercodereducs_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint'];
}
<?php
/**
* Fonctions utiles au plugin Codes de réduction
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function codereduc_objets_en_clair($tables_liees) {
$tables_liees = explode(',',$tables_liees);
foreach ($tables_liees as $k=>$v) {
$tables_liees[$k] = _T(objet_info($v, 'texte_objets'));
}
$tables_liees = implode(', ',$tables_liees);
return $tables_liees;
}
function codereduc_afficher_reduction($reduction) {
return sprintf("%.2f",round($reduction * 100.0, 2)).'%';
}
function codereduc_afficher_reduction_si($reduction) {
if ($reduction>=0.01) {
return codereduc_afficher_reduction($reduction);
}
return '';
}
function codereduc_filtrer_tables($tables) {
foreach ($tables as $k=>$v) {
if (!in_array($k, array('spip_abo_offres','spip_produits'))) {
unset($tables[$k]);
}
}
return $tables;
}
function codereduc_reduire_prix($prix, $reduction) {
if ($reduction>=0.01) {
$prix -= $reduction * $prix;
}
return $prix;
}
\ No newline at end of file
<?php
/**
* Utilisations de pipelines par Codes de réduction
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\Pipelines
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Verifier le code de reduction applique a une commande lors de son remplissage depuis un panier
* @param array $flux
* @return array
*/
function codereduc_post_edition($flux) {
if ($flux['args']['table'] == 'spip_commandes'
and $flux['args']['action'] == 'remplir_commande'
and $id_commande = $flux['args']['id_objet']) {
include_spip('inc/codereduc');
codereduc_verifier_commande($id_commande);
}
return $flux;
}
/**
* Optimiser la base de données
*
* Supprime les liens orphelins de l'objet vers quelqu'un et de quelqu'un vers l'objet.
* Supprime les objets à la poubelle.
*
* @pipeline optimiser_base_disparus
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function codereduc_optimiser_base_disparus($flux) {
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('codereduc'=>'*'), '*');
sql_delete('spip_codereducs', "statut='poubelle' AND maj < " . $flux['args']['date']);
return $flux;
}
<?php
/**
* Distribuer un code de reduction
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\Distribuer
*/
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/**
* Distribuer un code de reduction = en compter le nombre d'utilisation
* @param $id_codereduc
* @param $detail
* @param $commande
* @return bool|string
*/
function distribuer_codereduc_dist($id_codereduc, $detail, $commande){
if ($detail['statut']=='attente'){
// compter les usages du code de reduction, pour les cas ou le nombre est limite
$nb = $detail['quantite'];
while ($nb-->0){
sql_update('spip_codereducs',array('quantite_utilisee'=>'quantite_utilisee+1'),'id_codereduc='.intval($id_codereduc));
}
return 'envoye';
}
return false;
}
\ No newline at end of file
<div class='formulaire_spip formulaire_editer formulaire_#FORM formulaire_#FORM-#ENV{id_codereduc,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_codereduc" value="#ENV{id_codereduc}" />
<div class="editer-groupe">
[(#SAISIE{input, titre, obligatoire=oui,
label=<:codereduc:champ_titre_label:>})]
[(#SAISIE{input, code, obligatoire=oui,
label=<:codereduc:champ_code_label:>})]
[(#SAISIE{input, reduction, obligatoire=oui,
label=<:codereduc:champ_reduction_label:>})]
[(#SAISIE{date, date_debut,
label=<:codereduc:champ_date_debut_label:>})]
[(#SAISIE{date, date_fin,
label=<:codereduc:champ_date_fin_label:>})]
[(#SAISIE{input, quantite,
label=<:codereduc:champ_quantite_label:>})]
<div class="editer editer_tables_liees">
<label><:codereduc:champ_tables_liees_label:></label>
<INCLURE{fond=formulaires/inc-choisir-codereduc-tables-liees,selected=#ENV*{tables_liees},name=tables_liees} />
</div>
</div>
[(#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>
<?php
/**
* Gestion du formulaire de d'édition de codereduc
*
* @plugin Codes de réduction
* @copyright 2017
* @author Nursit
* @licence GNU/GPL
* @package SPIP\Codereduc\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_codereduc
* Identifiant du codereduc. 'new' pour un nouveau codereduc.
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un codereduc 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 codereduc, 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_codereduc_identifier_dist($id_codereduc = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
return serialize(array(intval($id_codereduc)));
}
/**
* Chargement du formulaire d'édition de codereduc
*
* Déclarer les champs postés et y intégrer les valeurs par défaut
*
* @uses formulaires_editer_objet_charger()
*
* @param int|string $id_codereduc
* Identifiant du codereduc. 'new' pour un nouveau codereduc.
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un codereduc 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 codereduc, 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_codereduc_charger_dist($id_codereduc = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$valeurs = formulaires_editer_objet_charger('codereduc', $id_codereduc, '', $lier_trad, $retour, $config_fonc, $row, $hidden);
$valeurs['reduction'] = round(100.0 * floatval($valeurs['reduction']), 2);
$valeurs['tables_liees'] = explode(',', $valeurs['tables_liees']);
if ($valeurs['quantite'] == 0) {
$valeurs['quantite'] = '';
}
return $valeurs;
}
/**
* Vérifications du formulaire d'édition de codereduc
*
* Vérifier les champs postés et signaler d'éventuelles erreurs
*
* @uses formulaires_editer_objet_verifier()
*
* @param int|string $id_codereduc
* Identifiant du codereduc. 'new' pour un nouveau codereduc.
* @param string $retour
* URL de redirection après le traitement
* @param int $lier_trad
* Identifiant éventuel d'un codereduc 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 codereduc, 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_codereduc_verifier_dist($id_codereduc = 'new', $retour = '', $lier_trad = 0, $config_fonc = '', $row = array(), $hidden = '') {
$erreurs = array();
$verifier = charger_fonction('verifier', 'inc');
foreach (array('date_debut', 'date_fin') AS $champ) {
$normaliser = null;
if ($erreur = $verifier(_request($champ), 'date', array('normaliser'=>'datetime'), $normaliser)) {
$erreurs[$champ] = $erreur;
// si une valeur de normalisation a ete transmis, la prendre.
} elseif (!is_null($normaliser)) {
set_request($champ, $normaliser);
// si pas de normalisation ET pas de date soumise, il ne faut pas tenter d'enregistrer ''
} else {
set_request($champ, null);
}
}
$erreurs += formulaires_editer_objet_verifier('codereduc', $id_codereduc, array('titre', 'code', 'tables_liees'));
if (!isset($erreurs['code'])) {
$code = _request('code');
if (sql_countsel('spip_codereducs','code='.sql_quote($code).' AND id_codereduc!='.intval($id_codereduc))){
$erreurs['code'] = _T('codereduc:erreur_code_pas_unique');
}
}
return $erreurs;
}
/**