You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

174 lines
5.2 KiB

<?php
/**
* Fonctions du plugin Commandes relatives aux échéances attendues
*
* @plugin Commandes
* @copyright 2014
* @author Ateliers CYM, Matthieu Marcillaud, Les Développements Durables
* @licence GPL 3
* @package SPIP\Commandes\Fonctions
**/
// Sécurité
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Lister un à un les paiements des échéances prévus
*
* @param array $echeances
* Tableau des échéances décrites suivant ce qu'on attend pour les commandes :
* ```
* array(
* array('montant' => 40, 'montant_ht' => 33.33, 'nb' => 2),
* array('montant' => 50),
* )
* ```
* @return array
* Retourne un tableau listant uniquement les montants un par un :
* ```
* array(array('montant' => 40, 'montant_ht' => 33.33), array('montant' => 40, 'montant_ht' => 33.33), array('montant' => 50, 'montant_ht' => 50))
* ```
**/
function commandes_lister_paiements_echeances($echeances) {
$paiements_echeances = array();
// Pour chaque montant d'échéance, s'il y a un nombre on rajoute le montant N fois
foreach ($echeances as $echeance) {
$montant = floatval($echeance['montant']);
$montant_ht = $montant;
if (isset($echeance['montant_ht'])) {
$montant_ht = floatval($echeance['montant_ht']);
}
$paiement = array('montant' => $montant, 'montant_ht' => $montant_ht);
if (!isset($echeance['nb']) or !$nb = intval($echeance['nb'])){
$nb = 1;
}
while ($nb-->0) {
$paiements_echeances[] = $paiement;
}
}
return $paiements_echeances;
}
/**
* Lister un à un les montants des échéances prévus
* idem commandes_lister_paiements_echeances mais retourne uniquement le montant (ttc) pour chaque echeance, et pas un tableau
* @deprecated
*
* @param array $echeances
* @return array
* Retourne un tableau listant uniquement les montants un par un :
* ```
* array(40, 40, 50)
* ```
**/
function commandes_lister_montants_echeances($echeances){
$paiements = commandes_lister_paiements_echeances($echeances);
$montants_echeances = array();
foreach ($paiements as $paiement) {
$montants_echeances[] = $paiement['montant'];
}
return $montants_echeances;
}
function commandes_nb_echeances_payees($id_commande) {
$nb_paiements = 0;
if (
defined('_DIR_PLUGIN_BANK')
and $transactions_commande = intval(sql_countsel('spip_transactions',array('id_commande = '.$id_commande, 'statut = "ok"')))
) {
$nb_paiements += $transactions_commande;
}
return $nb_paiements;
}
/**
* Trouver la prochaine échéance à payer pour une commande
*
* @param int $id_commande
* Identifiant de la commande
* @param array|float $echeances
* Montant unique ou tableau décrivant des échéances complexes
* @return array|bool
* Retourne la description de la prochaine échéance
**/
function commandes_trouver_prochaine_echeance_desc($id_commande, $echeances=null, $ignorer_derniere=false) {
static $prochaines_echeances = array();
$id_commande = intval($id_commande);
// Si on a déjà la réponse dans ce hit PHP, on retourne
if (isset($prochaines_echeances[$id_commande][$ignorer_derniere])
and $prochaines_echeances[$id_commande][$ignorer_derniere]) {
return $prochaines_echeances[$id_commande][$ignorer_derniere];
}
// S'il n'y a pas d'échéances, on va les chercher
if (
is_null($echeances)
and $echeances = sql_getfetsel('echeances', 'spip_commandes', 'id_commande = ' . intval($id_commande))
) {
$echeances = unserialize($echeances);
}
// Si on a bien des échéances au final
if ($echeances) {
// Si les échéances sont uniques, toujours les mêmes, sans taxe, c'est facile
if (!is_array($echeances)) {
$prochaine = array('montant' => floatval($echeances));
$prochaine['montant_ht'] = $prochaine['montant'];
}
// Sinon on va chercher a combien de paiements payés on en est déjà
// afin de trouver le montant de la prochaine échéance
else {
// On cherche le nombre de paiements valides pour cette commande
$nb_paiements = commandes_nb_echeances_payees($id_commande);
// Si on cherche à tester la dernière transaction, il faut l'ignorer
if ($ignorer_derniere) {
$nb_paiements = $nb_paiements - 1;
}
// On liste les montants
$paiements_echeances = commandes_lister_paiements_echeances($echeances);
// Si le nombre déjà payé est supérieur à la liste on prend le dernier
if ($nb_paiements >= count($paiements_echeances)) {
$prochaine = end($paiements_echeances);
}
else {
$prochaine = $paiements_echeances[$nb_paiements];
}
// Histoire d'être sûr
$prochaine = array_map('floatval', $prochaine);
}
// Si on a un montant correct
if ($prochaine and isset($prochaine['montant']) and $prochaine['montant'] > 0) {
$prochaines_echeances[$id_commande][$ignorer_derniere] = $prochaine;
return $prochaine;
}
}
// On a rien trouvé avant
return false;
}
/**
* @deprecated
* @param $id_commande
* @param null $echeances
* @param bool $ignorer_derniere
* @return bool|mixed
*/
function commandes_trouver_prochaine_echeance($id_commande, $echeances=null, $ignorer_derniere=false) {
$echeance = commandes_trouver_prochaine_echeance_desc($id_commande, $echeances, $ignorer_derniere);
if ($echeance and isset($echeance['montant'])) {
return $echeance['montant'];
}
return false;
}