Browse Source

Il est possible d'associer des modes de livraison aux produits ou autres objets livrables, pour limiter certains modes possibles.(par defaut tous les modes de livraison sont applicables). Prise en compte dans le calcul des couts de livraison et dans l'interface

v2
Cerdic 5 years ago
parent
commit
17b756b311
  1. 28
      base/livraison.php
  2. 39
      inc/livraison.php
  3. 3
      lang/livraisonmode_en.php
  4. 3
      lang/livraisonmode_fr.php
  5. 7
      livraison_administrations.php
  6. 40
      livraison_pipelines.php
  7. 8
      paquet.xml
  8. 52
      prive/objets/liste/livraisonmodes_associer.html
  9. 42
      prive/objets/liste/livraisonmodes_lies.html
  10. 3
      prive/squelettes/inclure/liens-livraisonmodes.html

28
base/livraison.php

@ -24,6 +24,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return;
function livraison_declarer_tables_interfaces($interfaces) {
$interfaces['table_des_tables']['livraisonmodes'] = 'livraisonmodes';
$interfaces['table_des_tables']['livraisonmodes_liens'] = 'livraisonmodes_liens';
return $interfaces;
}
@ -69,7 +70,7 @@ function livraison_declarer_tables_objets_sql($tables) {
'champs_editables' => array('titre', 'descriptif', 'zone_pays', 'zone_pays_exclus', 'zone_cp', 'zone_cp_exclus', 'taxe', 'prix_forfait_ht', 'prix_unit_ht', 'prix_poids_ht', 'prix_volume_ht'),
'champs_versionnes' => array('titre', 'descriptif', 'zone_pays', 'zone_pays_exclus', 'zone_cp', 'zone_cp_exclus', 'taxe', 'prix_forfait_ht', 'prix_unit_ht', 'prix_poids_ht', 'prix_volume_ht'),
'rechercher_champs' => array('titre'=>4,'descriptif'=>1),
'tables_jointures' => array(),
'tables_jointures' => array('spip_livraisonmodes_liens'),
'statut_textes_instituer' => array(
'prepa' => 'texte_statut_en_cours_redaction',
'prop' => 'texte_statut_propose_evaluation',
@ -142,5 +143,28 @@ function livraison_declarer_tables_objets_sql($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 livraison_declarer_tables_auxiliaires($tables) {
$tables['spip_livraisonmodes_liens'] = array(
'field' => array(
'id_livraisonmode' => 'bigint(21) DEFAULT "0" NOT NULL',
'id_objet' => 'bigint(21) DEFAULT "0" NOT NULL',
'objet' => 'VARCHAR(25) DEFAULT "" NOT NULL',
),
'key' => array(
'PRIMARY KEY' => 'id_livraisonmode,id_objet,objet',
'KEY id_livraisonmode' => 'id_livraisonmode',
)
);
?>
return $tables;
}

39
inc/livraison.php

@ -116,6 +116,16 @@ function livraison_calculer_cout($id_commande,$id_livraisonmode,$pays,$code_post
$prix = 0;
$taxe = 0;
// verifier que le mode est applicable a toutes les lignes de la commande
foreach($details as $detail){
// TODO : prevoir le multimode si certains modes ne sont applicables qu'a certains produits
if (!livraison_applicable($detail['objet'],$detail['id_objet'],$id_livraisonmode)) {
return false;
}
}
if (strlen($mode['taxe'])) {
$taxe = floatval($mode['taxe']);
}
@ -169,6 +179,33 @@ function livraison_calculer_cout($id_commande,$id_livraisonmode,$pays,$code_post
return array($prix,$taxe);
}
/**
* Verifier qu'un mode est applicable a un objet de la commande
* @param string $objet
* @param int $id_objet
* @param int $id_livraisonmode
* @return bool
*/
function livraison_applicable($objet, $id_objet, $id_livraisonmode) {
// si l'objet est immateriel c'est OK pour la livraison
$table = table_objet_sql($objet);
$primary = id_table_objet($objet);
$data = sql_fetsel("*",$table,"$primary=".intval($id_objet));
if (!isset($data['immateriel']) OR $data['immateriel']){
return true;
}
$modespossibles = sql_allfetsel('id_livraisonmode','spip_livraisonmodes_liens','objet='.sql_quote($objet).' AND id_objet='.sql_quote($id_objet));
// si aucun mode associe a l'objet, tous les modes sont possibles, donc OK
if (count($modespossibles)) {
$modespossibles = array_map('reset', $modespossibles);
if (!in_array($id_livraisonmode, $modespossibles)) {
return false;
}
}
return true;
}
/**
* Supprimer le mode de livraison d'une commande
* @param $id_commande
@ -204,7 +241,7 @@ function commande_livraison_necessaire($id_commande){
/**
* Ajouter/mettre a jout le mode et le cout de livraison de la commande
* Ajouter/mettre a jour le mode et le cout de livraison de la commande
* @param int $id_commande
* @param int $id_livraisonmode
* si pas fourni on reprend celui deja existant pour une mise a jour du cout

3
lang/livraisonmode_en.php

@ -30,6 +30,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'champ_zone_pays_explication' => 'List of ISO country codes available in this mode, separated by a comma',
'champ_zone_pays_label' => 'Delivered Countries',
// E
'explication_associer_livraisonmodes' => 'Link delivery methods if only certain methods are possible (otherwise all methods can be used)',
// I
'icone_creer_livraisonmode' => 'Create a delivery method',
'icone_modifier_livraisonmode' => 'Change this method of delivery',

3
lang/livraisonmode_fr.php

@ -30,6 +30,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'champ_zone_pays_explication' => 'Liste des codes pays ISO livrables par ce mode, séparés par une virgule',
'champ_zone_pays_label' => 'Pays livrables',
// E
'explication_associer_livraisonmodes' => 'Associer des modes de livraisons si seuls certains modes sont possibles (par défaut tous les modes de livraison sont utilisables)',
// I
'icone_creer_livraisonmode' => 'Créer un mode de livraison',
'icone_modifier_livraisonmode' => 'Modifier ce mode de livraison',

7
livraison_administrations.php

@ -25,7 +25,7 @@ function livraison_upgrade($nom_meta_base_version, $version_cible) {
$maj = array();
$maj['create'] = array(
array('maj_tables', array('spip_livraisonmodes','spip_commandes')),
array('maj_tables', array('spip_livraisonmodes','spip_livraisonmodes_liens','spip_commandes')),
array('livraison_installer_modes'),
);
@ -46,6 +46,11 @@ function livraison_upgrade($nom_meta_base_version, $version_cible) {
array('maj_tables', array('spip_commandes')),
);
// ajout table des liens pour limiter certains modes a certains produits
$maj['1.4.0'] = array(
array('maj_tables', array('spip_livraisonmodes_liens')),
);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}

40
livraison_pipelines.php

@ -30,4 +30,42 @@ function livraison_afficher_contenu_objet($flux){
}
?>
/**
* Ajout de contenu sur certaines pages,
* notamment des formulaires de liaisons entre objets
*
* @pipeline affiche_milieu
* @param array $flux Données du pipeline
* @return array Données du pipeline
*/
function livraison_affiche_milieu($flux) {
$texte = "";
$e = trouver_objet_exec($flux['args']['exec']);
// livres sur les produits et offres abonnement
if (!$e['edition']
and $table = $e['table_objet_sql']
and $primary = $e['id_table_objet'] ) {
$objet = sql_fetsel("*",$table,"$primary=".$flux['args'][$primary]);
// si l'objet est livrable (pas immateriel) proposer le choix des modes de livraison
if (isset($objet['immateriel']) and !$objet['immateriel']){
$flux['data'] .= recuperer_fond('prive/squelettes/inclure/liens-livraisonmodes', array(
'table_source' => 'livraisonmodes',
'objet' => $e['type'],
'id_objet' => $flux['args'][$e['id_table_objet']]
));
}
}
if ($texte) {
if ($p=strpos($flux['data'],"<!--affiche_milieu-->"))
$flux['data'] = substr_replace($flux['data'],$texte,$p,0);
else
$flux['data'] .= $texte;
}
return $flux;
}

8
paquet.xml

@ -1,12 +1,12 @@
<paquet
prefix="livraison"
categorie="divers"
version="2.4.2"
version="2.5.0"
etat="test"
compatibilite="[3.0.0;3.1.*]"
logo="prive/themes/spip/images/livraison-32.png"
documentation=""
schema="1.3.1"
schema="1.4.0"
>
<nom>Livraison</nom>
@ -16,13 +16,15 @@
<licence>GNU/GPL</licence>
<necessite nom="saisies" compatibilite="[1.24.0;]" />
<necessite nom="commandes" compatibilite="[1.6.13;]" />
<necessite nom="pays" compatibilite="[3.1.3;]" />
<necessite nom="pays" compatibilite="[3.1.3;]" />
<pipeline nom="autoriser" inclure="livraison_autorisations.php" />
<pipeline nom="afficher_contenu_objet" inclure="livraison_pipelines.php" />
<pipeline nom="affiche_milieu" inclure="livraison_pipelines.php" />
<pipeline nom="declarer_tables_objets_sql" inclure="base/livraison.php" />
<pipeline nom="declarer_tables_interfaces" inclure="base/livraison.php" />
<pipeline nom="declarer_tables_auxiliaires" inclure="base/livraison.php" />
<menu nom="livraisonmodes" titre="livraisonmode:titre_livraisonmodes" parent="menu_edition" icone="images/livraisonmode-16.png" action="livraisonmodes" />
</paquet>

52
prive/objets/liste/livraisonmodes_associer.html

@ -0,0 +1,52 @@
[(#SET{defaut_tri,#ARRAY{
multi titre,1,
date,-1,
id_livraisonmode,1
}})
]
#SET{exclus,#ENV**{exclus,#ENV{objet_source}|lister_objets_lies{#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}}}}
<B_liste_livraisonmodes>
#ANCRE_PAGINATION
<div class="liste-objets liste-objets-associer livraisonmodes">
<table class="spip liste">
[<caption><span class="caption"><strong>(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{livraisonmode:info_1_livraisonmode,livraisonmode:info_nb_livraisonmodes}})</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>
<tr class="first_row">
<th class="statut" scope="col">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
<th class="titre" scope="col">[(#TRI{multi titre,<:livraisonmode:champ_titre_label:>,ajax})]</th>
<th class="action" scope="col"></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_livraisonmodes(LIVRAISONMODES){!id_livraisonmode IN #GET{exclus}}{where?}{recherche?}{statut?}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{pagination #ENV{nb,10} liva}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#TITRE**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)]">
<td class="statut">[(#STATUT|puce_statut{livraisonmode})]</td>
<td class="titre">[(#LOGO_LIVRAISONMODE|image_reduire{20,20})]<a href="[(#ID_LIVRAISONMODE|generer_url_entite{livraisonmode})]">#TITRE</a></td>
<td class="action">
<button type="submit" class="button link add" name="ajouter_lien\[livraisonmode-#ID_LIVRAISONMODE-#OBJET-#ID_OBJET\]" value="+"><:livraisonmode:ajouter_lien_livraisonmode:> [(#CHEMIN_IMAGE{ajouter-12.png}|balise_img{'+'})]</button>
</td>
</tr>
</BOUCLE_liste_livraisonmodes>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
</div>
</B_liste_livraisonmodes>[(#ENV{recherche}|oui)
<div class="liste-objets liste-objets-associer livraisonmodes 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_livraisonmodes>

42
prive/objets/liste/livraisonmodes_lies.html

@ -0,0 +1,42 @@
[(#SET{defaut_tri,#ARRAY{
multi titre,1,
date,-1,
id_livraisonmode,1
}})
]
#SET{selection,#ENV**{selection,#ENV{objet_source}|lister_objets_lies{#ENV{objet},#ENV{id_objet},#ENV{_objet_lien}}}}
<B_liste_livraisonmodes>
#ANCRE_PAGINATION
<div class="liste-objets liste-objets-lies livraisonmodes">
<table class="spip liste">
[<caption><strong class="caption">(#ENV*{titre,#GRAND_TOTAL|singulier_ou_pluriel{livraisonmode:info_1_livraisonmode,livraisonmode:info_nb_livraisonmodes}})</strong></caption>]
<thead>
<tr class="first_row">
<th class="statut" scope="col">[(#TRI{statut,<span title="<:lien_trier_statut|attribut_html:>">#</span>,ajax})]</th>
<th class="titre" scope="col">[(#TRI{multi titre,<:livraisonmode:champ_titre_label:>,ajax})]</th>
<th class="action" scope="col"></th>
</tr>
</thead>
<tbody>
<BOUCLE_liste_livraisonmodes(LIVRAISONMODES){id_livraisonmode IN #GET{selection}}{statut?}
{tri #ENV{par,multi titre},#GET{defaut_tri}}{pagination #ENV{nb,10} livl}>
<tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})][ (#EXPOSE|unique)][ (#TITRE**|extraire_multi|initiale|=={#ENV{i}}|?{on}|unique)][(#ID_LIVRAISONMODE|=={#ENV{id_lien_ajoute}}|oui)append]">
<td class="statut">[(#STATUT|puce_statut{livraisonmode})]</td>
<td class="titre">[(#LOGO_LIVRAISONMODE|image_reduire{20,20})]<a href="[(#ID_LIVRAISONMODE|generer_url_entite{livraisonmode})]">#TITRE</a></td>
<td class="action">
[(#ENV{editable}|oui)
<button type="submit" class="button link delete" name="supprimer_lien\[livraisonmode-#ID_LIVRAISONMODE-#OBJET-#ID_OBJET\]" value="X"><:livraisonmode:retirer_lien_livraisonmode:> [(#CHEMIN_IMAGE{supprimer-12.png}|balise_img{'X'})]</button>
]
</td>
</tr>
</BOUCLE_liste_livraisonmodes>
</tbody>
</table>
[<p class="pagination">(#PAGINATION{prive})</p>]
[(#GRAND_TOTAL|>{3}|oui)<div class="action"><button type="submit" class="button link" name="supprimer_lien\[livraisonmode-*-#OBJET-#ID_OBJET\]" value="X"><:livraisonmode:retirer_tous_liens_livraisonmodes:> [(#CHEMIN_IMAGE{supprimer-8.png}|balise_img{'X'})]</button></div>]
</div>
</B_liste_livraisonmodes>
<div class="liste-objets liste-objets-lies livraisonmodes caption-wrap">
<strong class="caption">[(#ENV*{titre,<:livraisonmode:info_aucun_livraisonmode:>})]</strong>
</div>
<//B_liste_livraisonmodes>

3
prive/squelettes/inclure/liens-livraisonmodes.html

@ -0,0 +1,3 @@
<h2><:livraisonmode:titre_livraisonmodes:></h2>
<p class="explication"><:livraisonmode:explication_associer_livraisonmodes:></p>
<INCLURE{fond=prive/objets/editer/liens,env} />
Loading…
Cancel
Save