Work on workflow module.

This commit is contained in:
Laurent Destailleur 2011-06-06 19:15:44 +00:00
parent 4d0cb9df63
commit 993428e093
8 changed files with 138 additions and 18 deletions

View File

@ -95,6 +95,9 @@ clearstatcache();
$workflowcodes=array(); $workflowcodes=array();
if ($conf->propal->enabled && $conf->commande->enabled) $workflowcodes['WORKFLOW_PROPAL_AUTOCREATE_ORDER']='WORKFLOW_PROPAL_AUTOCREATE_ORDER'; if ($conf->propal->enabled && $conf->commande->enabled) $workflowcodes['WORKFLOW_PROPAL_AUTOCREATE_ORDER']='WORKFLOW_PROPAL_AUTOCREATE_ORDER';
//if ($conf->propal->enabled && $conf->facture->enabled) $workflowcodes['WORKFLOW_PROPAL_AUTOCREATE_INVOICE']='WORKFLOW_PROPAL_AUTOCREATE_INVOICE';
//if ($conf->contrat->enabled && $conf->facture->enabled) $workflowcodes['WORKFLOW_CONTRACT_AUTOCREATE_INVOICE']='WORKFLOW_CONTRACT_AUTOCREATE_INVOICE';
//if ($conf->commande->enabled && $conf->facture->enabled) $workflowcodes['WORKFLOW_ORDER_AUTOCREATE_INVOICE']='WORKFLOW_ORDER_AUTOCREATE_INVOICE';
if (sizeof($workflowcodes) > 0) if (sizeof($workflowcodes) > 0)
{ {

View File

@ -444,20 +444,25 @@ class Commande extends CommonObject
} }
/** /**
* \brief Cloture la commande * Close order
* \param user Objet utilisateur qui cloture * @param user Objet user that close
* \return int <0 if KO, >0 if OK * @return int <0 if KO, >0 if OK
*/ */
function cloture($user) function cloture($user)
{ {
global $conf; global $conf;
$error=0;
if ($user->rights->commande->valider) if ($user->rights->commande->valider)
{ {
$this->db->begin();
$now=dol_now();
$sql = 'UPDATE '.MAIN_DB_PREFIX.'commande'; $sql = 'UPDATE '.MAIN_DB_PREFIX.'commande';
$sql.= ' SET fk_statut = 3,'; $sql.= ' SET fk_statut = 3,';
$sql.= ' fk_user_cloture = '.$user->id.','; $sql.= ' fk_user_cloture = '.$user->id.',';
$sql.= ' date_cloture = '.$this->db->idate(mktime()); $sql.= ' date_cloture = '.$this->db->idate($now);
$sql.= ' WHERE rowid = '.$this->id.' AND fk_statut > 0'; $sql.= ' WHERE rowid = '.$this->id.' AND fk_statut > 0';
if ($this->db->query($sql)) if ($this->db->query($sql))
@ -466,17 +471,26 @@ class Commande extends CommonObject
include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"); include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
$interface=new Interfaces($this->db); $interface=new Interfaces($this->db);
$result=$interface->run_triggers('ORDER_CLOSE',$this,$user,$langs,$conf); $result=$interface->run_triggers('ORDER_CLOSE',$this,$user,$langs,$conf);
if ($result < 0) { if ($result < 0) { $error++; $this->errors=$interface->errors; }
$error++; $this->errors=$interface->errors;
return -1;
}
// Fin appel triggers // Fin appel triggers
return 1;
if (! $error)
{
$this->db->commit();
return 1;
}
else
{
$this->db->rollback();
return -1;
}
} }
else else
{ {
$this->error=$this->db->error(); $this->error=$this->db->lasterror();
dol_syslog($this->error, LOG_ERR); dol_syslog($this->error, LOG_ERR);
$this->db->rollback();
return -1; return -1;
} }
} }
@ -923,6 +937,7 @@ class Commande extends CommonObject
} }
else return -1; else return -1;
} }
else return -1;
} }
else return 0; else return 0;
} }

View File

@ -779,6 +779,7 @@ if ($action == 'confirm_close' && $confirm == 'yes' && $user->rights->commande->
$object->fetch($id); // Load order and lines $object->fetch($id); // Load order and lines
$result = $object->cloture($user); $result = $object->cloture($user);
if ($result < 0) $mesgs=$object->errors;
} }
if ($action == 'confirm_cancel' && $confirm == 'yes' && $user->rights->commande->valider) if ($action == 'confirm_cancel' && $confirm == 'yes' && $user->rights->commande->valider)
@ -1123,7 +1124,7 @@ if ($action == 'create' && $user->rights->commande->creer)
{ {
print_fiche_titre($langs->trans('CreateOrder')); print_fiche_titre($langs->trans('CreateOrder'));
if ($mesg) print $mesg.'<br>'; dol_htmloutput_errors($mesg,$mesgs);
$soc = new Societe($db); $soc = new Societe($db);
if ($socid) $res=$soc->fetch($socid); if ($socid) $res=$soc->fetch($socid);
@ -1423,7 +1424,7 @@ else
if ($id > 0 || ! empty($ref)) if ($id > 0 || ! empty($ref))
{ {
if ($mesg) print $mesg.'<br>'; dol_htmloutput_errors($mesg,$mesgs);
$product_static=new Product($db); $product_static=new Product($db);

View File

@ -1148,7 +1148,7 @@ if ($_POST['addfile'])
{ {
require_once(DOL_DOCUMENT_ROOT."/lib/files.lib.php"); require_once(DOL_DOCUMENT_ROOT."/lib/files.lib.php");
// Set tmp user directory TODO Use a dedicated directory for temp mails files // Set tmp user directory
$vardir=$conf->user->dir_output."/".$user->id; $vardir=$conf->user->dir_output."/".$user->id;
$upload_dir = $vardir.'/temp/'; $upload_dir = $vardir.'/temp/';

View File

@ -136,11 +136,11 @@ class Facture extends CommonObject
/** /**
* Create invoice in database * Create invoice in database
* Note: this->ref can be set or empty. If empty, we will use "(PROV)"
* @param user Object user that create * @param user Object user that create
* @param notrigger 1=Does not execute triggers, 0 otherwise * @param notrigger 1=Does not execute triggers, 0 otherwise
* @param forceduedate 1=Do not recalculate due date from payment condition but force it with value * @param forceduedate 1=Do not recalculate due date from payment condition but force it with value
* @return int <0 if KO, >0 if OK * @return int <0 if KO, >0 if OK
* @remarks this->ref can be set or empty. If empty, we will use "(PROV)"
*/ */
function create($user,$notrigger=0,$forceduedate=0) function create($user,$notrigger=0,$forceduedate=0)
{ {
@ -602,6 +602,84 @@ class Facture extends CommonObject
} }
} }
/**
* Load an object from an order and create a new invoice into database
* @param object Object source
* @return int <0 if KO, 0 if nothing done, 1 if OK
*/
function createFromOrder($object)
{
global $conf,$user,$langs;
$error=0;
// Closed order
$this->date = dol_now();
$this->source = 0;
for ($i = 0 ; $i < sizeof($object->lines) ; $i++)
{
$line = new FactureLigne($this->db);
$line->libelle = $object->lines[$i]->libelle;
$line->desc = $object->lines[$i]->desc;
$line->price = $object->lines[$i]->price;
$line->subprice = $object->lines[$i]->subprice;
$line->tva_tx = $object->lines[$i]->tva_tx;
$line->localtax1_tx = $object->lines[$i]->localtax1_tx;
$line->localtax2_tx = $object->lines[$i]->localtax2_tx;
$line->qty = $object->lines[$i]->qty;
$line->fk_remise_except = $object->lines[$i]->fk_remise_except;
$line->remise_percent = $object->lines[$i]->remise_percent;
$line->fk_product = $object->lines[$i]->fk_product;
$line->info_bits = $object->lines[$i]->info_bits;
$line->product_type = $object->lines[$i]->product_type;
$line->rang = $object->lines[$i]->rang;
$line->special_code = $object->lines[$i]->special_code;
$line->fk_parent_line = $object->lines[$i]->fk_parent_line;
$this->lines[$i] = $line;
}
$this->socid = $object->socid;
$this->fk_project = $object->fk_project;
$this->cond_reglement_id = $object->cond_reglement_id;
$this->mode_reglement_id = $object->mode_reglement_id;
$this->availability_id = $object->availability_id;
$this->demand_reason_id = $object->demand_reason_id;
$this->date_livraison = $object->date_livraison;
$this->fk_delivery_address = $object->fk_delivery_address;
$this->contact_id = $object->contactid;
$this->ref_client = $object->ref_client;
$this->note = $object->note;
$this->note_public = $object->note_public;
$this->origin = $object->element;
$this->origin_id = $object->id;
$ret = $this->create($user);
if ($ret > 0)
{
// Hooks
if (! empty($object->hooks['objectcard']))
{
foreach($object->hooks['objectcard'] as $module)
{
$result = $module->createfrom($object,$ret,$this->element);
if ($result < 0) $error++;
}
}
if (! $error)
{
return 1;
}
else return -1;
}
else return -1;
}
/** /**
* Return clicable link of object (with eventually picto) * Return clicable link of object (with eventually picto)
* @param withpicto Add picto into link * @param withpicto Add picto into link

View File

@ -1,5 +1,6 @@
<?php <?php
/* Copyright (C) 2010 Regis Houssin <regis@dolibarr.fr> /* Copyright (C) 2010 Regis Houssin <regis@dolibarr.fr>
* Copyright (C) 2011 Laurent Destailleur <eldy@users.sourceforge.net>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -104,11 +105,27 @@ class InterfaceWorkflowManager
{ {
include_once(DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'); include_once(DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php');
$order = new Commande($this->db); $order = new Commande($this->db);
return $order->createFromProposal($object,0); $ret=$order->createFromProposal($object,0);
if ($ret < 0) { $this->error=$invoice->error; $this->errors[]=$invoice->error; }
return $ret;
} }
} }
return 0; // Order to invoice
if ($action == 'ORDER_CLOSE')
{
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
if (! empty($conf->facture->enabled) && ! empty($conf->global->WORKFLOW_ORDER_AUTOCREATE_INVOICE))
{
include_once(DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php');
$invoice = new Facture($this->db);
$ret=$invoice->createFromOrder($object,0);
if ($ret < 0) { $this->error=$invoice->error; $this->errors[]=$invoice->error; }
return $ret;
}
}
return 0;
} }
} }

View File

@ -4,3 +4,6 @@ WorkflowSetup=Workflow module setup
WorkflowDesc=This module is desinged to modify the behaviour of automatic actions into application. By default, workflow is opened (you make thing in order you want). You can enabled automatic actions that you are interesting in. WorkflowDesc=This module is desinged to modify the behaviour of automatic actions into application. By default, workflow is opened (you make thing in order you want). You can enabled automatic actions that you are interesting in.
ThereIsNoWorkflowToModify=There is no workflow you can modify for module you have activated. ThereIsNoWorkflowToModify=There is no workflow you can modify for module you have activated.
descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Create a customer order automatically after a commercial proposal is signed descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Create a customer order automatically after a commercial proposal is signed
descWORKFLOW_PROPAL_AUTOCREATE_INVOICE=Create a customer invoice automatically after a commercial proposal is signed
descWORKFLOW_CONTRACT_AUTOCREATE_INVOICE=Create a customer invoice automatically after a contract is validated
descWORKFLOW_ORDER_AUTOCREATE_INVOICE=Create a customer invoice automatically after a customer order is closed

View File

@ -4,3 +4,6 @@ WorkflowSetup=Configuration du module workflow
WorkflowDesc=Ce module vous permet de modifier le comportement d'enchainement automatisé. Par défaut, le workflow est ouvert et non imposé. A vous d'activer les liens automatiques qui vous intéressent. WorkflowDesc=Ce module vous permet de modifier le comportement d'enchainement automatisé. Par défaut, le workflow est ouvert et non imposé. A vous d'activer les liens automatiques qui vous intéressent.
ThereIsNoWorkflowToModify=Il n'y a pas de flux workflow modifiable pour les modules que vous avez activés. ThereIsNoWorkflowToModify=Il n'y a pas de flux workflow modifiable pour les modules que vous avez activés.
descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Créer une commande client automatiquement à la signature d'une proposition commerciale descWORKFLOW_PROPAL_AUTOCREATE_ORDER=Créer une commande client automatiquement à la signature d'une proposition commerciale
descWORKFLOW_PROPAL_AUTOCREATE_INVOICE=Créer une facture client automatiquement à la signature d'une proposition commerciale
descWORKFLOW_CONTRACT_AUTOCREATE_INVOICE=Créer une facture client automatiquement à la validation d'un contrat
descWORKFLOW_ORDER_AUTOCREATE_INVOICE=Créer une facture client automatiquement à la cloture d'une commande client