Correction sur gestion facture remplacement

This commit is contained in:
Laurent Destailleur 2006-09-10 13:10:39 +00:00
parent 280ee38b9d
commit 7a051a2b28
5 changed files with 113 additions and 98 deletions

View File

@ -275,10 +275,26 @@ if ($_POST['action'] == 'add')
if ($_POST['fac_replacement'] > 0) if ($_POST['fac_replacement'] > 0)
{ {
// Si facture remplacement // Si facture remplacement
$result=$facture->fetch($_POST['fac_replacement']); $datefacture = mktime(12, 0 , 0, $_POST['remonth'], $_POST['reday'], $_POST['reyear']);
//print "xxx".$result." ".$facture->socidp; $result=$facture->fetch($_POST['fac_replacement']);
$facid = $facture->create_clone('replace',$user);
$facture->date = $datefacture;
$facture->note_public = trim($_POST['note_public']);
$facture->note = trim($_POST['note']);
$facture->ref_client = $_POST['ref_client'];
$facture->modelpdf = $_POST['model'];
$facture->projetid = $_POST['projetid'];
$facture->cond_reglement_id = $_POST['cond_reglement_id'];
$facture->mode_reglement_id = $_POST['mode_reglement_id'];
$facture->remise_absolue = $_POST['remise_absolue'];
$facture->remise_percent = $_POST['remise_percent'];
// Propriétés particulieres a facture de remplacement
$facture->fk_facture_source = $_POST['fac_replacement'];
$facture->type = 1;
$facid=$facture->create_clone($user);
} }
else else
{ {
@ -662,7 +678,8 @@ if ($_POST['action'] == 'confirm_delete' && $_POST['confirm'] == 'yes')
if ($user->rights->facture->supprimer) if ($user->rights->facture->supprimer)
{ {
$fac = new Facture($db); $fac = new Facture($db);
$result = $fac->delete($_GET['facid']); $result = $fac->fetch($_GET['facid']);
$result = $fac->delete();
if ($result > 0) if ($result > 0)
{ {
Header('Location: '.$_SERVER["PHP_SELF"]); Header('Location: '.$_SERVER["PHP_SELF"]);
@ -1622,7 +1639,7 @@ else
$facreplaced->fetch($fac->fk_facture_source); $facreplaced->fetch($fac->fk_facture_source);
print ' ('.$langs->transnoentities("ReplaceInvoice",$facreplaced->getNomUrl(1)).')'; print ' ('.$langs->transnoentities("ReplaceInvoice",$facreplaced->getNomUrl(1)).')';
} }
$facidnext=$fac->getIdNextInvoice(); $facidnext=$fac->getIdReplacingInvoice();
if ($facidnext > 0) if ($facidnext > 0)
{ {
$facthatreplace=new Facture($db); $facthatreplace=new Facture($db);

View File

@ -243,7 +243,7 @@ if ($socid > 0)
$sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON f.rowid=pf.fk_facture'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiement_facture as pf ON f.rowid=pf.fk_facture';
$sql.= " WHERE f.fk_soc = s.idp AND s.idp = ".$societe->id; $sql.= " WHERE f.fk_soc = s.idp AND s.idp = ".$societe->id;
$sql.= ' GROUP BY f.rowid'; $sql.= ' GROUP BY f.rowid';
$sql.= " ORDER BY f.datef DESC"; $sql.= " ORDER BY f.datef DESC, f.datec DESC";
$resql=$db->query($sql); $resql=$db->query($sql);
if ($resql) if ($resql)
@ -355,7 +355,7 @@ if ($socid > 0)
} }
} }
print '<a class="butAction" href="'.DOL_URL_ROOT.'/comm/action/fiche.php?action=create&socid='.$objsoc->id.'">'.$langs->trans("AddAction").'</a>'; print '<a class="butAction" href="'.DOL_URL_ROOT.'/comm/action/fiche.php?action=create&socid='.$socid.'">'.$langs->trans("AddAction").'</a>';
if ($user->rights->societe->contact->creer) if ($user->rights->societe->contact->creer)
{ {

View File

@ -123,11 +123,11 @@ class Facture extends CommonObject
global $langs,$conf,$mysoc; global $langs,$conf,$mysoc;
// Nettoyage paramètres // Nettoyage paramètres
if (! $this->type) $this->type = 0 ; if (! $this->type) $this->type = 0;
$this->ref_client=trim($this->ref_client); $this->ref_client=trim($this->ref_client);
$this->note=trim($this->note); $this->note=trim($this->note);
$this->note_public=trim($this->note_public); $this->note_public=trim($this->note_public);
if (! $this->remise) $this->remise = 0 ; if (! $this->remise) $this->remise = 0;
if (! $this->mode_reglement_id) $this->mode_reglement_id = 0; if (! $this->mode_reglement_id) $this->mode_reglement_id = 0;
$this->brouillon = 1; $this->brouillon = 1;
@ -138,45 +138,6 @@ class Facture extends CommonObject
$this->db->begin(); $this->db->begin();
// Verification paramètres
if ($this->type == 1) // si remplacement
{
// Controle que facture source connue
if ($this->fk_facture_source <= 0)
{
$this->error=$langs->trans("ErrorFieldRequired",$langs->trans("InvoiceReplacement"));
$this->db->rollback();
return -10;
}
// Charge la facture source a remplacer
$facreplaced=new Facture($this->db);
$result=$facreplaced->fetch($this->fk_facture_source);
if ($result <= 0)
{
$this->error=$langs->trans("ErrorBadInvoice");
$this->db->rollback();
return -11;
}
// Controle que facture source non deja remplacee
$idreplacement=$facreplaced->getIdNextInvoice();
if ($idreplacement != 0)
{
$this->error=$langs->trans("ErrorInvoiceAlreadyReplaced",$facreplaced->ref);
$this->db->rollback();
return -12;
}
$result=$facreplaced->set_canceled($user,'replaced','');
if ($result < 0)
{
$this->error=$facreplaced->error." sql=".$sql;
$this->db->rollback();
return -13;
}
}
// Facture récurrente // Facture récurrente
if ($this->fac_rec > 0) if ($this->fac_rec > 0)
{ {
@ -200,7 +161,6 @@ class Facture extends CommonObject
// Insertion dans la base // Insertion dans la base
$socid = $this->socidp; $socid = $this->socidp;
$number = $this->number;
$amount = $this->amount; $amount = $this->amount;
$remise = $this->remise; $remise = $this->remise;
@ -340,33 +300,22 @@ class Facture extends CommonObject
/** /**
* \brief Création de la facture en base depuis une autre * \brief Création de la facture en base depuis une autre
* \param facidsrc Id facture source
* \param invertdetail Inverse le signe des lignes details
* \param user Object utilisateur qui crée * \param user Object utilisateur qui crée
* \return int <0 si ko, >0 si ok * \return int <0 si ko, >0 si ok
*/ */
function create_clone($reason='',$user) function create_clone($user,$invertdetail=0)
{ {
// Charge facture source // Charge facture source
$facture=new Facture($this->db); $facture=new Facture($this->db);
if ($reason == 'replace') $facture->fk_facture_source = $this->fk_facture_source;
{ $facture->type = $this->type;
$facture->fk_facture_source = $this->id; $facture->socidp = $this->socidp;
$facture->type = 1; $facture->date = $this->date;
} $facture->note_public = $this->note_public;
else $facture->note = $this->note;
{ $facture->ref_client = $this->ref_client;
$facture->type = $this->type; $facture->modelpdf = $this->modelpdf;
}
$facture->socidp = $this->socidp;
$facture->number = $this->number;
$facture->date = $this->date;
$facture->note_public = $this->note_public;
$facture->note = $this->note;
$facture->ref_client = $this->ref_client;
$facture->modelpdf = $this->modelpdf;
$facture->projetid = $this->projetid; $facture->projetid = $this->projetid;
$facture->cond_reglement_id = $this->cond_reglement_id; $facture->cond_reglement_id = $this->cond_reglement_id;
$facture->mode_reglement_id = $this->mode_reglement_id; $facture->mode_reglement_id = $this->mode_reglement_id;
@ -374,6 +323,7 @@ class Facture extends CommonObject
$facture->remise_absolue = $this->remise_absolue; $facture->remise_absolue = $this->remise_absolue;
$facture->remise_percent = $this->remise_percent; $facture->remise_percent = $this->remise_percent;
$facture->lignes = $this->lignes; // Tableau des lignes de factures $facture->lignes = $this->lignes; // Tableau des lignes de factures
$facture->products = $this->lignes; // Tant que products encore utilisé
if ($invertdetail) if ($invertdetail)
{ {
@ -387,7 +337,7 @@ class Facture extends CommonObject
} }
} }
dolibarr_syslog("Facture::create_clone invertdetail=$invertdetail socidp=".$this->socidp); dolibarr_syslog("Facture::create_clone invertdetail=$invertdetail socidp=".$this->socidp." nboflines=".sizeof($facture->lignes));
$facid = $facture->create($user); $facid = $facture->create($user);
@ -731,10 +681,12 @@ class Facture extends CommonObject
* \param rowid Id de la facture à supprimer * \param rowid Id de la facture à supprimer
* \return int <0 si ko, >0 si ok * \return int <0 si ko, >0 si ok
*/ */
function delete($rowid) function delete($rowid=0)
{ {
global $user,$langs,$conf; global $user,$langs,$conf;
if (! $rowid) $rowid=$this->id;
dolibarr_syslog("Facture.class::delete rowid=".$rowid); dolibarr_syslog("Facture.class::delete rowid=".$rowid);
$this->db->begin(); $this->db->begin();
@ -1024,6 +976,48 @@ class Facture extends CommonObject
{ {
$this->db->begin(); $this->db->begin();
// Verification paramètres
if ($this->type == 1) // si remplacement
{
// Controle que facture source connue
if ($this->fk_facture_source <= 0)
{
$this->error=$langs->trans("ErrorFieldRequired",$langs->trans("InvoiceReplacement"));
$this->db->rollback();
return -10;
}
// Charge la facture source a remplacer
$facreplaced=new Facture($this->db);
$result=$facreplaced->fetch($this->fk_facture_source);
if ($result <= 0)
{
$this->error=$langs->trans("ErrorBadInvoice");
$this->db->rollback();
return -11;
}
// Controle que facture source non deja remplacee
$idreplacement=$facreplaced->getIdReplacingInvoice();
if ($idreplacement != 0)
{
$facreplacement=new Facture($this->db);
$facreplacement->fetch($idreplacement);
$this->error=$langs->trans("ErrorInvoiceAlreadyReplaced",$facreplaced->ref,$facreplacement->ref);
$this->db->rollback();
return -12;
}
$result=$facreplaced->set_canceled($user,'replaced','');
if ($result < 0)
{
$this->error=$facreplaced->error." sql=".$sql;
$this->db->rollback();
return -13;
}
}
// on vérifie si la facture est en numérotation provisoire // on vérifie si la facture est en numérotation provisoire
$facref = substr($this->ref, 1, 4); $facref = substr($this->ref, 1, 4);
@ -1073,21 +1067,21 @@ class Facture extends CommonObject
{ {
// On renomme repertoire facture ($this->ref = ancienne ref, $numfa = nouvelle ref) // On renomme repertoire facture ($this->ref = ancienne ref, $numfa = nouvelle ref)
// afin de ne pas perdre les fichiers attachés // afin de ne pas perdre les fichiers attachés
$facref = sanitize_string($this->ref); $facref = sanitize_string($this->ref);
$snumfa = sanitize_string($numfa); $snumfa = sanitize_string($numfa);
$dirsource = $conf->facture->dir_output.'/'.$facref; $dirsource = $conf->facture->dir_output.'/'.$facref;
$dirdest = $conf->facture->dir_output.'/'.$snumfa; $dirdest = $conf->facture->dir_output.'/'.$snumfa;
if (file_exists($dirsource)) if (file_exists($dirsource))
{ {
dolibarr_syslog("Facture::set_valid() renommage rep ".$dirsource." en ".$dirdest); dolibarr_syslog("Facture::set_valid() renommage rep ".$dirsource." en ".$dirdest);
if (@rename($dirsource, $dirdest)) if (@rename($dirsource, $dirdest))
{ {
dolibarr_syslog("Renommage ok"); dolibarr_syslog("Renommage ok");
// Suppression ancien fichier PDF dans nouveau rep // Suppression ancien fichier PDF dans nouveau rep
dol_delete_file($conf->facture->dir_output.'/'.$snumfa.'/'.$facref.'.*'); dol_delete_file($conf->facture->dir_output.'/'.$snumfa.'/'.$facref.'.*');
} }
} }
} }
@ -1208,22 +1202,25 @@ class Facture extends CommonObject
} }
} }
/** /**
* *
* *
*/ */
function set_draft($userid) function set_draft($userid)
{ {
$sql = "UPDATE ".MAIN_DB_PREFIX."facture SET fk_statut = 0"; dolibarr_syslog("Facture.class::set_draft rowid=".$this->id);
$sql .= " WHERE rowid = $this->id;";
if ($this->db->query($sql) ) $sql = "UPDATE ".MAIN_DB_PREFIX."facture SET fk_statut = 0";
$sql.= " WHERE rowid = ".$this->id;
if ($this->db->query($sql))
{ {
return 1; return 1;
} }
else else
{ {
dolibarr_print_error($this->db); $this->error=$this->db->error();
return -1;
} }
} }
@ -1750,11 +1747,12 @@ class Facture extends CommonObject
* \brief Renvoie l'id de la facture qui la remplace * \brief Renvoie l'id de la facture qui la remplace
* \return int <0 si ko, 0 si aucune facture ne remplace, id facture sinon * \return int <0 si ko, 0 si aucune facture ne remplace, id facture sinon
*/ */
function getIdNextInvoice() function getIdReplacingInvoice()
{ {
$sql = 'SELECT rowid'; $sql = 'SELECT rowid';
$sql.= ' FROM '.MAIN_DB_PREFIX.'facture'; $sql.= ' FROM '.MAIN_DB_PREFIX.'facture';
$sql.= ' WHERE fk_facture_source = '.$this->id; $sql.= ' WHERE fk_facture_source = '.$this->id;
$sql.= ' AND fk_statut > 0';
$resql=$this->db->query($sql); $resql=$this->db->query($sql);
if ($resql) if ($resql)
{ {
@ -2204,7 +2202,7 @@ class Facture extends CommonObject
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."paiement_facture as pf ON f.rowid = pf.fk_facture";
$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as ff ON f.rowid = ff.fk_facture_source"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as ff ON f.rowid = ff.fk_facture_source";
$sql.= " WHERE f.fk_statut = 1 AND f.paye = 0 AND pf.fk_paiement IS NULL"; $sql.= " WHERE f.fk_statut = 1 AND f.paye = 0 AND pf.fk_paiement IS NULL";
$sql.= " AND ff.rowid IS NULL"; $sql.= " AND IFNULL(ff.fk_statut,0) = 0"; // Doit renvoyé vrai si pas de jointure trouvé ou si jointure vers statut à 0
if ($socid > 0) $sql.=" AND f.fk_soc = ".$socid; if ($socid > 0) $sql.=" AND f.fk_soc = ".$socid;
$sql.= " ORDER BY f.facnumber"; $sql.= " ORDER BY f.facnumber";

View File

@ -80,7 +80,7 @@ ErrorVATIntraNotConfigured=Intracommunautary VAT number not yet defined
ErrorNoPaiementModeConfigured=No paiment mode yet defined ErrorNoPaiementModeConfigured=No paiment mode yet defined
ErrorCreateBankAccount=Creat a bank account then go to Setup panel of Invoice module to define paiement modes ErrorCreateBankAccount=Creat a bank account then go to Setup panel of Invoice module to define paiement modes
ErrorBillNotFound=Invoice %s does not exists ErrorBillNotFound=Invoice %s does not exists
ErrorInvoiceAlreadyReplaced=Error, invoice %s has already been replaced ErrorInvoiceAlreadyReplaced=Error, invoice %s has already been replaced by invoice %s
ErrorDiscountAlreadyUsed=Error, discount already used ErrorDiscountAlreadyUsed=Error, discount already used
BillFrom=From BillFrom=From
BillTo=Bill to BillTo=Bill to

View File

@ -80,7 +80,7 @@ ErrorVATIntraNotConfigured=Num
ErrorNoPaiementModeConfigured=Aucun mode de règlement défini ErrorNoPaiementModeConfigured=Aucun mode de règlement défini
ErrorCreateBankAccount=Créer un compte bancaire puis aller dans la configuration du module facture pour définir les modes de règlement ErrorCreateBankAccount=Créer un compte bancaire puis aller dans la configuration du module facture pour définir les modes de règlement
ErrorBillNotFound=Facture %s inexistante ErrorBillNotFound=Facture %s inexistante
ErrorInvoiceAlreadyReplaced=Erreur, la facture %s a déjà été remplacée ErrorInvoiceAlreadyReplaced=Erreur, la facture %s a déjà été remplacée par la facture %s
ErrorDiscountAlreadyUsed=Erreur, la remise a déjà été attribuée ErrorDiscountAlreadyUsed=Erreur, la remise a déjà été attribuée
BillFrom=Émetteur BillFrom=Émetteur
BillTo=Adressé à BillTo=Adressé à