Work on workflow module.
This commit is contained in:
parent
4d0cb9df63
commit
993428e093
@ -95,6 +95,9 @@ clearstatcache();
|
||||
|
||||
$workflowcodes=array();
|
||||
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)
|
||||
{
|
||||
|
||||
@ -444,20 +444,25 @@ class Commande extends CommonObject
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Cloture la commande
|
||||
* \param user Objet utilisateur qui cloture
|
||||
* \return int <0 if KO, >0 if OK
|
||||
* Close order
|
||||
* @param user Objet user that close
|
||||
* @return int <0 if KO, >0 if OK
|
||||
*/
|
||||
function cloture($user)
|
||||
{
|
||||
global $conf;
|
||||
$error=0;
|
||||
|
||||
if ($user->rights->commande->valider)
|
||||
{
|
||||
$this->db->begin();
|
||||
|
||||
$now=dol_now();
|
||||
|
||||
$sql = 'UPDATE '.MAIN_DB_PREFIX.'commande';
|
||||
$sql.= ' SET fk_statut = 3,';
|
||||
$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';
|
||||
|
||||
if ($this->db->query($sql))
|
||||
@ -466,17 +471,26 @@ class Commande extends CommonObject
|
||||
include_once(DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php");
|
||||
$interface=new Interfaces($this->db);
|
||||
$result=$interface->run_triggers('ORDER_CLOSE',$this,$user,$langs,$conf);
|
||||
if ($result < 0) {
|
||||
$error++; $this->errors=$interface->errors;
|
||||
return -1;
|
||||
}
|
||||
if ($result < 0) { $error++; $this->errors=$interface->errors; }
|
||||
// Fin appel triggers
|
||||
return 1;
|
||||
|
||||
if (! $error)
|
||||
{
|
||||
$this->db->commit();
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->db->rollback();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->error=$this->db->error();
|
||||
$this->error=$this->db->lasterror();
|
||||
dol_syslog($this->error, LOG_ERR);
|
||||
|
||||
$this->db->rollback();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -923,6 +937,7 @@ class Commande extends CommonObject
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
else return 0;
|
||||
}
|
||||
|
||||
@ -779,6 +779,7 @@ if ($action == 'confirm_close' && $confirm == 'yes' && $user->rights->commande->
|
||||
$object->fetch($id); // Load order and lines
|
||||
|
||||
$result = $object->cloture($user);
|
||||
if ($result < 0) $mesgs=$object->errors;
|
||||
}
|
||||
|
||||
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'));
|
||||
|
||||
if ($mesg) print $mesg.'<br>';
|
||||
dol_htmloutput_errors($mesg,$mesgs);
|
||||
|
||||
$soc = new Societe($db);
|
||||
if ($socid) $res=$soc->fetch($socid);
|
||||
@ -1423,7 +1424,7 @@ else
|
||||
|
||||
if ($id > 0 || ! empty($ref))
|
||||
{
|
||||
if ($mesg) print $mesg.'<br>';
|
||||
dol_htmloutput_errors($mesg,$mesgs);
|
||||
|
||||
$product_static=new Product($db);
|
||||
|
||||
|
||||
@ -512,7 +512,7 @@ if ($action == 'add' && $user->rights->facture->creer)
|
||||
$object->socid=GETPOST('socid');
|
||||
|
||||
$db->begin();
|
||||
|
||||
|
||||
$error=0;
|
||||
|
||||
// Replacement invoice
|
||||
@ -1148,7 +1148,7 @@ if ($_POST['addfile'])
|
||||
{
|
||||
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;
|
||||
$upload_dir = $vardir.'/temp/';
|
||||
|
||||
|
||||
@ -136,11 +136,11 @@ class Facture extends CommonObject
|
||||
|
||||
/**
|
||||
* 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 notrigger 1=Does not execute triggers, 0 otherwise
|
||||
* @param forceduedate 1=Do not recalculate due date from payment condition but force it with value
|
||||
* @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)
|
||||
{
|
||||
@ -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)
|
||||
* @param withpicto Add picto into link
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
<?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
|
||||
* 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');
|
||||
$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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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.
|
||||
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_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
|
||||
@ -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.
|
||||
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_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
|
||||
Loading…
Reference in New Issue
Block a user