Maxi debug of supplier order workflow.

Add trigger ORDER_SUPPLIER_CLASSIFY_BILLED
Parameter user is added so it is defined into triggers.
This commit is contained in:
Laurent Destailleur 2016-04-09 18:50:22 +02:00
parent c2fc9ecf68
commit 27217ccccd
14 changed files with 170 additions and 86 deletions

View File

@ -2037,9 +2037,10 @@ class Propal extends CommonObject
*/
function classer_facturee()
{
global $user;
dol_syslog(__METHOD__ . " is deprecated", LOG_WARNING);
return $this->classifyBilled();
return $this->classifyBilled($user);
}
/**

View File

@ -466,7 +466,7 @@ if (empty($reshook))
else if ($action == 'classifybilled' && $user->rights->commande->creer)
{
$ret=$object->classifyBilled();
$ret=$object->classifyBilled($user);
if ($ret < 0) {
setEventMessages($object->error, $object->errors, 'errors');

View File

@ -2420,9 +2420,10 @@ class Commande extends CommonOrder
/**
* Classify the order as invoiced
*
* @return int <0 if ko, >0 if ok
* @param User $user Object user making the change
* @return int <0 if KO, >0 if OK
*/
function classifyBilled()
function classifyBilled(User $user)
{
global $conf, $user, $langs;
$error = 0;
@ -2476,9 +2477,10 @@ class Commande extends CommonOrder
*/
function classer_facturee()
{
global $user;
dol_syslog(__METHOD__ . " is deprecated", LOG_WARNING);
return $this->classifyBilled();
return $this->classifyBilled($user);
}

View File

@ -220,7 +220,7 @@ if (($action == 'create' || $action == 'add') && !$error)
{
if ($closeOrders)
{
$objectsrc->classifyBilled();
$objectsrc->classifyBilled($user);
$objectsrc->setStatut(3);
}
$lines = $objectsrc->lines;

View File

@ -234,8 +234,8 @@ function dol_print_object_info($object, $usetable=0)
else print '<br>';
}
// User creation
if (! empty($object->user_creation))
// User creation (old method using already loaded object and not id is kept for backward compatibility)
if (! empty($object->user_creation) || ! empty($object->user_creation_id))
{
if ($usetable) print '<tr><td class="titlefield">';
print $langs->trans("CreatedBy");
@ -249,7 +249,7 @@ function dol_print_object_info($object, $usetable=0)
else
{
$userstatic=new User($db);
$userstatic->fetch($object->user_creation);
$userstatic->fetch($object->user_creation_id ? $object->user_creation_id : $object->user_creation);
if ($userstatic->id) print $userstatic->getNomUrl(1);
else print $langs->trans("Unknown");
}
@ -270,8 +270,8 @@ function dol_print_object_info($object, $usetable=0)
else print '<br>';
}
// User change
if (! empty($object->user_modification))
// User change (old method using already loaded object and not id is kept for backward compatibility)
if (! empty($object->user_modification) || ! empty($object->user_modification_id))
{
if ($usetable) print '<tr><td class="titlefield">';
print $langs->trans("ModifiedBy");
@ -285,7 +285,7 @@ function dol_print_object_info($object, $usetable=0)
else
{
$userstatic=new User($db);
$userstatic->fetch($object->user_modification);
$userstatic->fetch($object->user_modification_id ? $object->user_modification_id : $object->user_modification);
if ($userstatic->id) print $userstatic->getNomUrl(1);
else print $langs->trans("Unknown");
}
@ -306,8 +306,8 @@ function dol_print_object_info($object, $usetable=0)
else print '<br>';
}
// User validation
if (! empty($object->user_validation))
// User validation (old method using already loaded object and not id is kept for backward compatibility)
if (! empty($object->user_validation) || ! empty($object->user_validation_id))
{
if ($usetable) print '<tr><td class="titlefield">';
print $langs->trans("ValidatedBy");
@ -321,7 +321,7 @@ function dol_print_object_info($object, $usetable=0)
else
{
$userstatic=new User($db);
$userstatic->fetch($object->user_validation);
$userstatic->fetch($object->user_validation_id ? $object->user_validation_id : $object->user_validation);
if ($userstatic->id) print $userstatic->getNomUrl(1);
else print $langs->trans("Unknown");
}
@ -342,8 +342,8 @@ function dol_print_object_info($object, $usetable=0)
else print '<br>';
}
// User approve
if (! empty($object->user_approve))
// User approve (old method using already loaded object and not id is kept for backward compatibility)
if (! empty($object->user_approve) || ! empty($object->user_approve_id))
{
if ($usetable) print '<tr><td class="titlefield">';
print $langs->trans("ApprovedBy");
@ -357,7 +357,7 @@ function dol_print_object_info($object, $usetable=0)
else
{
$userstatic=new User($db);
$userstatic->fetch($object->user_approve);
$userstatic->fetch($object->user_approve_id ? $object->user_approve_id : $object->user_approve);
if ($userstatic->id) print $userstatic->getNomUrl(1);
else print $langs->trans("Unknown");
}
@ -378,6 +378,34 @@ function dol_print_object_info($object, $usetable=0)
else print '<br>';
}
// User approve
if (! empty($object->user_approve_id2))
{
if ($usetable) print '<tr><td class="titlefield">';
print $langs->trans("ApprovedBy");
if ($usetable) print '</td><td>';
else print ': ';
$userstatic=new User($db);
$userstatic->fetch($object->user_approve_id2);
if ($userstatic->id) print $userstatic->getNomUrl(1);
else print $langs->trans("Unknown");
if ($usetable) print '</td></tr>';
else print '<br>';
}
// Date approve
if (! empty($object->date_approve2))
{
if ($usetable) print '<tr><td class="titlefield">';
print $langs->trans("DateApprove2");
if ($usetable) print '</td><td>';
else print ': ';
print dol_print_date($object->date_approve2, 'dayhour');
if ($deltadateforuser) print ' '.$langs->trans("CurrentHour").' &nbsp; / &nbsp; '.dol_print_date($object->date_approve2+($deltadateforuser*3600),"dayhour").' &nbsp;'.$langs->trans("ClientHour");
if ($usetable) print '</td></tr>';
else print '<br>';
}
// User close
if (! empty($object->user_cloture))
{

View File

@ -101,7 +101,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers
{
foreach($object->linkedObjects['propal'] as $element)
{
$ret=$element->classifyBilled();
$ret=$element->classifyBilled($user);
}
}
return $ret;
@ -120,7 +120,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers
{
foreach($object->linkedObjects['commande'] as $element)
{
$ret=$element->classifyBilled();
$ret=$element->classifyBilled($user);
}
}
return $ret;
@ -139,7 +139,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers
{
foreach($object->linkedObjects['commande'] as $element)
{
$ret=$element->classifyBilled();
$ret=$element->classifyBilled($user);
}
}
return $ret;

View File

@ -485,8 +485,8 @@ class InterfaceActionsAuto extends DolibarrTriggers
$langs->load("orders");
$object->actiontypecode='AC_OTH_AUTO';
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderSubmitedInDolibarr",($object->newref?$object->newref:$object->ref));
$object->actionmsg=$langs->transnoentities("OrderSubmitedInDolibarr",($object->newref?$object->newref:$object->ref));
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderSubmitedInDolibarr",($object->newref?$object->newref:$object->ref));
$object->actionmsg=$langs->transnoentities("SupplierOrderSubmitedInDolibarr",($object->newref?$object->newref:$object->ref));
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
$object->sendtoid=0;
@ -497,8 +497,8 @@ class InterfaceActionsAuto extends DolibarrTriggers
$langs->load("orders");
$object->actiontypecode='AC_OTH_AUTO';
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderReceivedInDolibarr",($object->newref?$object->newref:$object->ref));
$object->actionmsg=$langs->transnoentities("OrderReceivedInDolibarr",($object->newref?$object->newref:$object->ref));
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderReceivedInDolibarr",($object->newref?$object->newref:$object->ref));
$object->actionmsg=$langs->transnoentities("SupplierOrderReceivedInDolibarr",($object->newref?$object->newref:$object->ref));
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
$object->sendtoid=0;
@ -519,6 +519,22 @@ class InterfaceActionsAuto extends DolibarrTriggers
// Parameters $object->sendtoid defined by caller
//$object->sendtoid=0;
}
elseif ($action == 'ORDER_SUPPLIER_CLASSIFY_BILLED')
{
$langs->load("other");
$langs->load("bills");
$langs->load("orders");
$object->actiontypecode='AC_OTH_AUTO';
if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderClassifiedBilled",$object->ref);
if (empty($object->actionmsg))
{
$object->actionmsg=$langs->transnoentities("SupplierOrderClassifiedBilled",$object->ref);
$object->actionmsg.="\n".$langs->transnoentities("Author").': '.$user->login;
}
$object->sendtoid=0;
}
elseif ($action == 'BILL_SUPPLIER_VALIDATE')
{

View File

@ -492,7 +492,6 @@ class CommandeFournisseur extends CommonOrder
if (! $error)
{
$result = 1;
$this->log($user, 1, time()); // Statut 1
$this->statut = 1;
$this->ref = $num;
}
@ -701,20 +700,43 @@ class CommandeFournisseur extends CommonOrder
/**
* Class invoiced the supplier order
*
* @return int <0 si ko, >0 si ok
* @param User $user Object user making the change
* @return int <0 if KO, >0 if KO
*/
function classifyBilled()
function classifyBilled(User $user)
{
$this->db->begin();
$sql = 'UPDATE '.MAIN_DB_PREFIX.'commande_fournisseur SET billed = 1';
$sql .= ' WHERE rowid = '.$this->id.' AND fk_statut > 0 ';
if ($this->db->query($sql) )
if ($this->db->query($sql))
{
$this->billed=1;
return 1;
if (! $error)
{
// Call trigger
$result=$this->call_trigger('ORDER_SUPPLIER_CLASSIFY_BILLED',$user);
if ($result < 0) $error++;
// End call triggers
}
if (! $error)
{
$this->billed=1;
$this->db->commit();
return 1;
}
else
{
$this->db->rollback();
return -1;
}
}
else
{
dol_print_error($this->db);
$this->db->rollback();
return -1;
}
}
@ -791,8 +813,6 @@ class CommandeFournisseur extends CommonOrder
if ($this->db->query($sql))
{
$this->log($user, 2, time(), $comment); // Statut 2
if (! empty($conf->global->SUPPLIER_ORDER_AUTOADD_USER_CONTACT))
{
$result=$this->add_contact($user->id, 'SALESREPFOLL', 'internal', 1);
@ -897,7 +917,6 @@ class CommandeFournisseur extends CommonOrder
if ($this->db->query($sql))
{
$result = 0;
$this->log($user, 9, time());
if ($error == 0)
{
@ -956,7 +975,6 @@ class CommandeFournisseur extends CommonOrder
if ($this->db->query($sql))
{
$result = 0;
$this->log($user, $statut, time());
// Call trigger
$result=$this->call_trigger('ORDER_SUPPLIER_CANCEL',$user);
@ -991,21 +1009,23 @@ class CommandeFournisseur extends CommonOrder
/**
* Send a supplier order to supplier
* Submit a supplier order to supplier
*
* @param User $user User making change
* @param date $date Date
* @param int $methode Method
* @param string $comment Comment
* @return int <0 if KO, >0 if OK
* @return int <0 if KO, >0 if OK
*/
function commande($user, $date, $methode, $comment='')
{
global $langs;
dol_syslog(get_class($this)."::commande");
$result = 0;
$error = 0;
if ($user->rights->fournisseur->commande->commander)
{
$this->db->begin();
$sql = "UPDATE ".MAIN_DB_PREFIX."commande_fournisseur SET fk_statut = 3, fk_input_method=".$methode.", date_commande='".$this->db->idate($date)."'";
$sql .= " WHERE rowid = ".$this->id;
@ -1015,24 +1035,37 @@ class CommandeFournisseur extends CommonOrder
$this->statut = 3;
$this->methode_commande_id = $methode;
$this->date_commande = $this->db->idate($date);
$result = 1;
$this->log($user, 3, $date, $comment);
// Call trigger
$result=$this->call_trigger('ORDER_SUPPLIER_SUBMIT',$user);
if ($result < 0) $error++;
// End call triggers
}
else
{
$error++;
$this->error = $this->db->lasterror();
$this->errors[] = $this->db->lasterror();
$result = -1;
}
if (! $error)
{
$this->db->commit();
}
else
{
$this->db->rollback();
}
}
else
{
$result = -1;
$error++;
$this->error = $langs->trans('NotAuthorized');
$this->errors[] = $langs->trans('NotAuthorized');
dol_syslog(get_class($this)."::commande User not Authorized", LOG_ERR);
}
return $result ;
return ($error ? -1 : 1);
}
/**
@ -1933,9 +1966,22 @@ class CommandeFournisseur extends CommonOrder
{
$result = 0;
$this->statut = $statut;
$result=$this->log($user, $statut, $date, $comment);
$this->db->commit();
// Call trigger
$result=$this->call_trigger('ORDER_SUPPLIER_RECEIVE',$user);
if ($result < 0) $error++;
// End call triggers
if (! $error)
{
$this->db->commit();
}
else
{
$this->db->rollback();
$this->error=$this->db->lasterror();
$result = -1;
}
}
else
{
@ -2382,36 +2428,12 @@ class CommandeFournisseur extends CommonOrder
{
$obj = $this->db->fetch_object($result);
$this->id = $obj->rowid;
if ($obj->fk_user_author)
{
$cuser = new User($this->db);
$cuser->fetch($obj->fk_user_author);
$this->user_creation = $cuser;
}
if ($obj->fk_user_valid)
{
$vuser = new User($this->db);
$vuser->fetch($obj->fk_user_valid);
$this->user_validation = $vuser;
}
if ($obj->fk_user_modif)
{
$muser = new User($this->db);
$muser->fetch($obj->fk_user_modif);
$this->user_modification = $muser;
}
if ($obj->fk_user_approve)
{
$auser = new User($this->db);
$auser->fetch($obj->fk_user_approve);
$this->user_approve = $auser;
}
if ($obj->fk_user_approve2)
{
$a2user = new User($this->db);
$a2user->fetch($obj->fk_user_approve2);
$this->user_approve2 = $a2user;
}
if ($obj->fk_user_author) $this->user_creation_id = $obj->fk_user_author;
if ($obj->fk_user_valid) $this->user_validation_id = $obj->fk_user_valid;
if ($obj->fk_user_modif) $this->user_modification_id =$obj->fk_user_modif;
if ($obj->fk_user_approve) $this->user_approve_id = $obj->fk_user_approve;
if ($obj->fk_user_approve2) $this->user_approve_id2 = $obj->fk_user_approve2;
$this->date_creation = $this->db->idate($obj->datec);
$this->date_modification = $this->db->idate($obj->datem);
$this->date_approve = $this->db->idate($obj->datea);

View File

@ -205,22 +205,33 @@ if (empty($reshook))
if ($action == 'reopen') // no test on permission here, permission to use will depends on status
{
if (in_array($object->statut, array(1, 2, 3, 5, 6, 7, 9)) || ($object->statut == 4 && $object->billed))
if (in_array($object->statut, array(1, 2, 3, 4, 5, 6, 7, 9)))
{
if ($object->statut == 1) $newstatus=0; // Validated->Draft
else if ($object->statut == 2) $newstatus=0; // Approved->Draft
else if ($object->statut == 3) $newstatus=2; // Ordered->Approved
else if ($object->statut == 5) $newstatus=4; // Received->Received partially
else if ($object->statut == 4) $newstatus=3;
else if ($object->statut == 5)
{
//$newstatus=2; // Ordered
// TODO Can we set it to submited ?
//$newstatus=3; // Submited
// TODO If there is at least one reception, we can set to Received->Received partially
$newstatus=4; // Received partially
}
else if ($object->statut == 6) $newstatus=2; // Canceled->Approved
else if ($object->statut == 7) $newstatus=3; // Canceled->Process running
else if ($object->statut == 9) $newstatus=1; // Refused->Validated
else $newstatus = 2;
//print "old status = ".$object->statut.' new status = '.$newstatus;
$db->begin();
$result = $object->setStatus($user, $newstatus);
if ($result > 0)
{
// Currently the "Re-open" also remove the billed flag because there is no button "Set unpaid" yet.
$sql = 'UPDATE '.MAIN_DB_PREFIX.'commande_fournisseur';
$sql.= ' SET billed = 0';
$sql.= ' WHERE rowid = '.$object->id;
@ -255,7 +266,7 @@ if (empty($reshook))
*/
if ($action == 'classifybilled' && $user->rights->fournisseur->commande->creer)
{
$ret=$object->classifyBilled();
$ret=$object->classifyBilled($user);
if ($ret < 0) {
setEventMessages($object->error, $object->errors, 'errors');
}
@ -2881,7 +2892,7 @@ elseif (! empty($object->id))
}
}
}
if (in_array($object->statut, array(3, 5, 6, 7, 9)) || ($object->statut == 4 && $object->billed))
if (in_array($object->statut, array(3, 4, 5, 6, 7, 9)))
{
if ($user->rights->fournisseur->commande->commander)
{

View File

@ -120,13 +120,12 @@ if ($id > 0 || ! empty($ref))
dol_print_object_info($object, 1);
print '</td></tr></table>';
print '</div>';
}
else
{
/* Commande non trouvee */
print "Commande inexistante ou acces refuse";
/* Order not found */
print "OrderNotFound";
}
}

View File

@ -239,10 +239,10 @@ if (($action == 'create' || $action == 'add') && empty($mesgs)) {
foreach($orders_id as $fk_supplier_order) {
$supplier_order = new CommandeFournisseur($db);
if($supplier_order->fetch($fk_supplier_order)>0 && $supplier_order->statut == 5) {
if($supplier_order->classifyBilled()<0) {
if ($supplier_order->fetch($fk_supplier_order)>0 && $supplier_order->statut == 5)
{
if ($supplier_order->classifyBilled($user) < 0)
{
$db->rollback();
$action = 'create';
$_GET["origin"] = $_POST["origin"];

View File

@ -57,6 +57,7 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_RECEIVE','Supplier order request received','Executed when a supplier order is received','order_supplier',12);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_REFUSE','Supplier order request refused','Executed when a supplier order is refused','order_supplier',13);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_SENTBYMAIL','Supplier order sent by mail','Executed when a supplier order is sent by mail','order_supplier',14);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_CLASSIFY_BILLED','Supplier order set billed','Executed when a supplier order is set as billed','order_supplier',14);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_VALIDATE','Supplier invoice validated','Executed when a supplier invoice is validated','invoice_supplier',15);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_UNVALIDATE','Supplier invoice unvalidated','Executed when a supplier invoice status is set back to draft','invoice_supplier',15);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('BILL_SUPPLIER_PAYED','Supplier invoice payed','Executed when a supplier invoice is payed','invoice_supplier',16);

View File

@ -376,6 +376,7 @@ insert into llx_c_action_trigger (code,label,description,elementtype,rang) value
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_CREATE','Supplier order validated','Executed when a supplier order is validated','order_supplier',11);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_SUBMIT','Supplier order request submited','Executed when a supplier order is approved','order_supplier',12);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_RECEIVE','Supplier order request received','Executed when a supplier order is received','order_supplier',12);
insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('ORDER_SUPPLIER_CLASSIFY_BILLED','Supplier order set billed','Executed when a supplier order is set as billed','order_supplier',14);
ALTER TABLE llx_product_fournisseur_price ADD supplier_reputation varchar(10) NULL;

View File

@ -134,6 +134,9 @@ ConfirmCloneOrder=Are you sure you want to clone this order <b>%s</b> ?
DispatchSupplierOrder=Receiving supplier order %s
FirstApprovalAlreadyDone=First approval already done
SecondApprovalAlreadyDone=Second approval already done
SupplierOrderReceivedInDolibarr=Supplier order %s received %s
SupplierOrderSubmitedInDolibarr=Supplier order %s submited
SupplierOrderClassifiedBilled=Supplier order %s set billed
##### Types de contacts #####
TypeContact_commande_internal_SALESREPFOLL=Representative following-up customer order
TypeContact_commande_internal_SHIPPING=Representative following-up shipping