Skip to content
Snippets Groups Projects
rejet-prelevement.class.php 7.60 KiB
<?php
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * $Id$
 * $Source$
 *
 */

/*
  \file       htdocs/compta/prelevement/prelevement.class.php
  \ingroup    prelevement
  \brief      Fichier de la classe des prelevements
  \version    $Revision$
*/


/*!
  \class Prelevement
  \brief      Classe permettant la gestion des prelevements
*/

class RejetPrelevement
{
  var $id;
  var $db;


  /**
   *    \brief  Constructeur de la classe
   *    \param  DB          handler accs base de donnes
   *    \param  soc_idp     id societe ("" par defaut)
   *    \param  facid       id facture ("" par defaut)
   */
  function RejetPrelevement($DB, $user)
  {
    $this->db = $DB ;
    $this->user = $user;

    $this->motifs = array();
    $this->motifs[0] = "Non renseign";
    $this->motifs[1] = "Provision insuffisante";
    $this->motifs[2] = "Tirage contest";
    $this->motifs[3] = "Pas de bon  payer";
    $this->motifs[4] = "Opposition sur compte";
    $this->motifs[5] = "RIB inexploitable";

  }

  function create($user, $id, $motif, $date_rejet, $bonid)
  {
    $error = 0;
    $this->id = $id;
    $this->bon_id = $bonid;
    
    dolibarr_syslog("RejetPrelevement::Create id $id");
    
    $facs = $this->_get_list_factures();
    
    $this->db->begin();


    /* Insert la ligne de rejet dans la base */
    
    $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_rejet ";
    $sql .= " (fk_prelevement_lignes, date_rejet";
    $sql .= " , motif , fk_user_creation, date_creation)";
    $sql .= " VALUES (".$id;
    $sql .= " ,'".$this->db->idate($date_rejet)."'";
    $sql .= " ,".$motif.",". $user->id.", now())";
    
    $result=$this->db->query($sql);
    
    if (!$result)
      {
	dolibarr_syslog("RejetPrelevement::create Erreur 4");
	dolibarr_syslog("RejetPrelevement::create Erreur 4 $sql");
	$error++;
      }
    
    /* Tag la ligne de prev comme rejete */
    
    $sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_lignes ";
    $sql .= " SET statut = 3";
    $sql .= " WHERE rowid=".$id;
    
    if (! $this->db->query($sql))
      {
	dolibarr_syslog("RejetPrelevement::create Erreur 5");
	$error++;
      }
    
    
    for ($i = 0 ; $i < sizeof($facs) ; $i++)
      {	  
	$fac = new Facture($this->db);
	$fac->fetch($facs[$i]);
	
	/* Emet un paiement ngatif */

	$pai = new Paiement($this->db);

	$pai->amounts = array();
	// On remplace la virgule ventuelle par un point sinon
	// certaines install de PHP renvoie uniquement la partie
	// entiere negative

	$pai->amounts[$facs[$i]] = ereg_replace(",",".",($fac->total_ttc * -1));
	$pai->datepaye = $this->db->idate($date_rejet);
	$pai->paiementid = 3; // prlvement
	$pai->num_paiement = "Rejet";

	if ($pai->create($this->user, 1) == -1)  // on appelle en no_commit
	  {
	    $error++;
	    dolibarr_syslog("RejetPrelevement::Create Erreur creation paiement facture ".$facs[$i]);
	  }       
  
	/* Valide le paiement */

	if ($pai->valide() <> 0)
	  {
	    $error++;
	    dolibarr_syslog("RejetPrelevement::Create Erreur validation du paiement");
	  }

	/* Tag la facture comme impaye */
	dolibarr_syslog("RejetPrelevement::Create set_unpayed fac ".$fac->ref);
	$fac->set_unpayed($facs[$i]);

	/* Envoi un email  l'emetteur de la demande de prev */
	$this->_send_email($fac);
      }

    if ($error == 0)
      {
	dolibarr_syslog("RejetPrelevement::Create Commit");
	$this->db->commit();
      }
    else
      {
	dolibarr_syslog("RejetPrelevement::Create Rollback");
	$this->db->rollback();
      }

  }

  /**
   *
   *
   *
   */
  function _send_email($fac)
  {
    $userid = 0;

    $sql = "SELECT fk_user_demande";
    $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture_demande as pfd";
    $sql .= " WHERE pfd.fk_prelevement_bons = ".$this->bon_id;
    $sql .= " AND pfd.fk_facture = ".$fac->id;

    $result=$this->db->query($sql);
    if ($result)
      {
	$num = $this->db->num_rows();	
	if ($num > 0)
	  {
	    $row = $this->db->fetch_row();
	    $userid = $row[0];
	  }		
      }
    else
      {
	dolibarr_syslog("RejetPrelevement::_send_email Erreur lecture user");
      }

    if ($userid > 0)
      {
	$emuser = new User($this->db, $userid);
	$emuser->fetch();

	$subject = "Prlvement rejet";

	$soc = new Societe($this->db);
	$soc->fetch($fac->socidp);

	$sendto = $emuser->fullname." <".$emuser->email.">";
	$from = $this->user->fullname." <".$this->user->email.">";

	$message = "Bonjour,\n";
	$message .= "\nLe prlvement de la facture ".$fac->ref." pour le compte de la socit ".$soc->nom." d'un montant de ".price($fac->total_ttc).' '.$langs->trans("Currency".$conf->monnaie)." a t rejet par la banque.";

	$message .= "\n\n--\n".$this->user->fullname;	
	      
	$mailfile = new DolibarrMail($subject,
				     $sendto,
				     $from,
				     $message);
	      
	$mailfile->errors_to = $this->user->email;

	if ( $mailfile->sendfile() )
	  {
	    dolibarr_syslog("RejetPrelevement::_send_email email envoy");
	  }
	else
	  {
	    dolibarr_syslog("RejetPrelevement::_send_email Erreur envoi email");
	  }
      }
    else
      {
	dolibarr_syslog("RejetPrelevement::_send_email Userid invalide");
      }
  }  


  /**
   *    \brief      Recupre la liste des factures concernes
   *    \param      rowid       id de la facture a rcuprer
   *    \param      societe_id  id de societe
   */
  function _get_list_factures()
  {
    $arr = array();
    /*
     * Renvoie toutes les factures associe  un prlvement
     *
     */
      
    $sql = "SELECT f.rowid as facid";

    $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_facture as pf";
    $sql .= " , ".MAIN_DB_PREFIX."facture as f";

    $sql .= " WHERE pf.fk_prelevement_lignes = ".$this->id;

    $sql .= " AND pf.fk_facture = f.rowid";

    $result=$this->db->query($sql);
    if ($result)
      {
	$num = $this->db->num_rows();

	if ($num)
	  {
	    $i = 0;
	    while ($i < $num)
	      {
		$row = $this->db->fetch_row();
		$arr[$i] = $row[0];
		$i++;
	      }
	  }
	$this->db->free();
      }
    else
      {
	dolibarr_syslog("RejetPrelevement Erreur");
      }

    return $arr;

  }

  
  /**
   *    \brief      Recupre l'objet prelevement
   *    \param      rowid       id de la facture a rcuprer
   *    \param      societe_id  id de societe
   */
  function fetch($rowid)
  {

    $sql = "SELECT ".$this->db->pdate("pr.date_rejet")." as dr";
    $sql .= ", motif";
    $sql .= " FROM ".MAIN_DB_PREFIX."prelevement_rejet as pr";
    $sql .= " WHERE pr.fk_prelevement_lignes =".$rowid;
      

    if ($this->db->query($sql))
      {
	if ($this->db->num_rows())
	  {
	    $obj = $this->db->fetch_object();
	      
	    $this->id             = $rowid;
	    $this->date_rejet     = $obj->dr;
	    $this->motif          = $this->motifs[$obj->motif];

	    $this->db->free();
	    
	    return 0;
	  }
	else
	  {
	    dolibarr_syslog("RejetPrelevement::Fetch Erreur rowid=$rowid numrows=0");
	    return -1;
	  }
      }
    else
      {
	dolibarr_syslog("RejetPrelevement::Fetch Erreur rowid=$rowid");
	return -2;
      }
  }

}

?>