diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 48756a8828c..af32f12c8e0 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -612,14 +612,15 @@ if (empty($reshook)) // Close proposal else if ($action == 'setstatut' && $user->rights->propal->cloturer && ! GETPOST('cancel','alpha')) { - if (! GETPOST('statut')) { + if (! GETPOST('statut','int')) { setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("CloseAs")), null, 'errors'); $action = 'statut'; } else { // prevent browser refresh from closing proposal several times if ($object->statut == Propal::STATUS_VALIDATED) { - $result=$object->cloture($user, GETPOST('statut','int'), GETPOST('note_private','alpha')); + $newprivatenote = dol_concatdesc($object->note_private, GETPOST('note_private','alpha')); + $result=$object->cloture($user, GETPOST('statut','int'), $newprivatenote); if ($result < 0) { setEventMessages($object->error, $object->errors, 'errors'); diff --git a/htdocs/comm/propal/class/api_proposals.class.php b/htdocs/comm/propal/class/api_proposals.class.php index b49baf164ca..e13b9b71b90 100644 --- a/htdocs/comm/propal/class/api_proposals.class.php +++ b/htdocs/comm/propal/class/api_proposals.class.php @@ -90,7 +90,7 @@ class Proposals extends DolibarrApi * @param string $sortorder Sort order * @param int $limit Limit for list * @param int $page Page number - * @param string $thirdparty_ids Thirdparty ids to filter commercial proposal of. Example: '1' or '1,2,3' {@pattern /^[0-9,]*$/i} + * @param string $thirdparty_ids Thirdparty ids to filter commercial proposal of. Example: '1' or '1,2,3' {@pattern /^2|3$/i} * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.datec:<:'20160101')" * @return array Array of order objects */ @@ -507,6 +507,48 @@ class Proposals extends DolibarrApi ); } + /** + * Close (Accept or refuse) a quote / commercial proposal + * + * @param int $id Commercial proposal ID + * @param int $status Must be 2 (accepted) or 3 (refused) {@min 2}{@max 3} + * @param string $note_private Add this mention to the private note + * @param int $notrigger Disabled triggers + * + * @url POST {id}/close + * + * @return array + */ + function close($id, $status, $note_private='', $notrigger=0) + { + if(! DolibarrApiAccess::$user->rights->propal->creer) { + throw new RestException(401); + } + $result = $this->propal->fetch($id); + if( ! $result ) { + throw new RestException(404, 'Commercial Proposal not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('propal',$this->propal->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + $result = $this->propal->cloture(DolibarrApiAccess::$user, $status, $note_private, $notrigger); + if ($result == 0) { + throw new RestException(500, 'Error nothing done. May be object is already closed'); + } + if ($result < 0) { + throw new RestException(500, 'Error when closing Commercial Proposal: '.$this->propal->error); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'Commercial Proposal closed (Ref='.$this->propal->ref.')' + ) + ); + } + /** * Validate fields before create or update object * diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index cd5f81783b7..61aa2a3ddb6 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1505,48 +1505,6 @@ class Propal extends CommonObject } } - /** - * Update value of extrafields on the proposal - * - * @param User $user Object user that modify - * @return int <0 if ko, >0 if ok - */ - function update_extrafields($user) - { - global $conf, $hookmanager; - - $action='update'; - $error = 0; - - // Actions on extra fields (by external module or standard code) - // TODO le hook fait double emploi avec le trigger !! - $hookmanager->initHooks(array('propaldao')); - $parameters=array('id'=>$this->id); - $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if (empty($reshook)) - { - if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used - { - $result=$this->insertExtraFields(); - if ($result < 0) - { - $error++; - } - } - } - else if ($reshook < 0) $error++; - - if (!$error) - { - return 1; - } - else - { - return -1; - } - - } - /** * Set status to validated * @@ -2258,7 +2216,7 @@ class Propal extends CommonObject * @param User $user Object user that close * @param int $statut Statut * @param string $note Comment - * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * @param int $notrigger 1=Does not execute triggers, 0=Execute triggers * @return int <0 if KO, >0 if OK */ function cloture($user, $statut, $note, $notrigger=0) @@ -2297,7 +2255,7 @@ class Propal extends CommonObject return -2; } } - if ($statut == self::STATUS_BILLED) + if ($statut == self::STATUS_BILLED) // Why this ? { $trigger_name='PROPAL_CLASSIFY_BILLED'; } diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 79109ff511a..4cda7e931d4 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1077,11 +1077,12 @@ class Commande extends CommonOrder * Load an object from a proposal and create a new order into database * * @param Object $object Object source + * @param User $user User making creation * @return int <0 if KO, 0 if nothing done, 1 if OK */ - function createFromProposal($object) + function createFromProposal($object, User $user) { - global $conf,$user,$hookmanager; + global $conf, $hookmanager; dol_include_once('/core/class/extrafields.class.php'); @@ -3048,48 +3049,6 @@ class Commande extends CommonOrder } } - /** - * Update value of extrafields on order - * - * @param User $user Object user that modify - * @return int <0 if ko, >0 if ok - */ - function update_extrafields($user) - { - global $hookmanager, $conf; - - $action='create'; - $error = 0; - - // Actions on extra fields (by external module or standard code) - // TODO le hook fait double emploi avec le trigger !! - $hookmanager->initHooks(array('orderdao')); - $parameters=array('id'=>$this->id); - $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if (empty($reshook)) - { - if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used - { - $result=$this->insertExtraFields(); - if ($result < 0) - { - $error++; - } - } - } - else if ($reshook < 0) $error++; - - if (!$error) - { - return 1; - } - else - { - return -1; - } - - } - /** * Delete the customer order * diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 6452c689215..826d13fecd6 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -747,7 +747,7 @@ class Facture extends CommonInvoice * @param int $invertdetail Reverse sign of amounts for lines * @return int <0 if KO, >0 if OK */ - function createFromCurrent($user,$invertdetail=0) + function createFromCurrent(User $user, $invertdetail=0) { global $conf; @@ -948,11 +948,12 @@ class Facture extends CommonInvoice * Load an object from an order and create a new invoice into database * * @param Object $object Object source + * @param User $user Object user * @return int <0 if KO, 0 if nothing done, 1 if OK */ - function createFromOrder($object) + function createFromOrder($object, User $user) { - global $user,$hookmanager; + global $hookmanager; $error=0; diff --git a/htdocs/core/triggers/interface_20_modWorkflow_WorkflowManager.class.php b/htdocs/core/triggers/interface_20_modWorkflow_WorkflowManager.class.php index bfa0efad8e6..c25e1ae9ad7 100644 --- a/htdocs/core/triggers/interface_20_modWorkflow_WorkflowManager.class.php +++ b/htdocs/core/triggers/interface_20_modWorkflow_WorkflowManager.class.php @@ -65,7 +65,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers $newobject->context['origin'] = $object->element; $newobject->context['origin_id'] = $object->id; - $ret=$newobject->createFromProposal($object); + $ret=$newobject->createFromProposal($object, $user); if ($ret < 0) { $this->error=$newobject->error; $this->errors[]=$newobject->error; } return $ret; } @@ -84,7 +84,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers $newobject->context['origin'] = $object->element; $newobject->context['origin_id'] = $object->id; - $ret=$newobject->createFromOrder($object); + $ret=$newobject->createFromOrder($object, $user); if ($ret < 0) { $this->error=$newobject->error; $this->errors[]=$newobject->error; } return $ret; } @@ -117,11 +117,11 @@ class InterfaceWorkflowManager extends DolibarrTriggers } } - // classify billed order & billed propososal + // classify billed order & billed propososal if ($action == 'BILL_VALIDATE') { dol_syslog( "Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id ); - + // First classify billed the order to allow the proposal classify process if (! empty($conf->commande->enabled) && ! empty($conf->global->WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER)) { @@ -144,7 +144,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers } return $ret; } - + // Second classify billed the proposal. if (! empty($conf->propal->enabled) && ! empty($conf->global->WORKFLOW_INVOICE_CLASSIFY_BILLED_PROPAL)) { @@ -167,7 +167,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers } return $ret; } - + } // Invoice classify billed order @@ -234,7 +234,7 @@ class InterfaceWorkflowManager extends DolibarrTriggers } } } - + //Build array of quantity ordered by product if (is_array($order->lines) && count($order->lines)>0) { foreach($order->lines as $orderline) { diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 6ddd5d2fc18..29f48f03d35 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -1304,44 +1304,6 @@ class SupplierProposal extends CommonObject } } - /** - * Update value of extrafields on the proposal - * - * @param User $user Object user that modify - * @return int <0 if ko, >0 if ok - */ - function update_extrafields($user) - { - $action='update'; - - // Actions on extra fields (by external module or standard code) - $hookmanager->initHooks(array('supplier_proposaldao')); - $parameters=array('id'=>$this->id); - $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if (empty($reshook)) - { - if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used - { - $result=$this->insertExtraFields(); - if ($result < 0) - { - $error++; - } - } - } - else if ($reshook < 0) $error++; - - if (!$error) - { - return 1; - } - else - { - return -1; - } - - } - /** * Set status to validated * diff --git a/htdocs/webservices/server_invoice.php b/htdocs/webservices/server_invoice.php index 2150017577b..c93605ab2ea 100644 --- a/htdocs/webservices/server_invoice.php +++ b/htdocs/webservices/server_invoice.php @@ -555,7 +555,7 @@ function createInvoice($authentication,$invoice) if (empty($invoice['id']) && empty($invoice['ref']) && empty($invoice['ref_ext'])) { $error++; $errorcode='KO'; $errorlabel="Invoice id or ref or ref_ext is mandatory."; } - + if (! $error) { $new_invoice=new Facture($db); @@ -568,13 +568,13 @@ function createInvoice($authentication,$invoice) $new_invoice->statut= Facture::STATUS_DRAFT; // We start with status draft $new_invoice->fk_project=$invoice['project_id']; $new_invoice->date_creation=$now; - + //take mode_reglement and cond_reglement from thirdparty $soc = new Societe($db); $res=$soc->fetch($new_invoice->socid); if ($res > 0) { $new_invoice->mode_reglement_id = ! empty($invoice['payment_mode_id'])?$invoice['payment_mode_id']:$soc->mode_reglement_id; - $new_invoice->cond_reglement_id = $soc->cond_reglement_id; + $new_invoice->cond_reglement_id = $soc->cond_reglement_id; } else $new_invoice->mode_reglement_id = $invoice['payment_mode_id']; @@ -677,12 +677,12 @@ function createInvoiceFromOrder($authentication,$id_order='', $ref_order='', $re if (empty($id_order) && empty($ref_order) && empty($ref_ext_order)) { $error++; $errorcode='KO'; $errorlabel="order id or ref or ref_ext is mandatory."; } - + ////////////////////// if (! $error) { $fuser->getrights(); - + if ($fuser->rights->commande->lire) { $order=new Commande($db); @@ -695,19 +695,19 @@ function createInvoiceFromOrder($authentication,$id_order='', $ref_order='', $re $error++; $errorcode='PERMISSION_DENIED'; $errorlabel=$order->socid.'User does not have permission for this request'; } - + if(!$error) { - + $newobject=new Facture($db); - $result = $newobject->createFromOrder($order); - + $result = $newobject->createFromOrder($order, $fuser); + if ($result < 0) { $error++; dol_syslog("Webservice server_invoice:: invoice creation from order failed", LOG_ERR); } - + } } else @@ -722,7 +722,7 @@ function createInvoiceFromOrder($authentication,$id_order='', $ref_order='', $re $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request'; } } - + if ($error) { $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel)); @@ -731,7 +731,7 @@ function createInvoiceFromOrder($authentication,$id_order='', $ref_order='', $re { $objectresp= array('result'=>array('result_code'=>'OK', 'result_label'=>''),'id'=>$newobject->id,'ref'=>$newobject->ref,'ref_ext'=>$newobject->ref_ext); } - + return $objectresp; } @@ -761,20 +761,20 @@ function updateInvoice($authentication,$invoice) if (empty($invoice['id']) && empty($invoice['ref']) && empty($invoice['ref_ext'])) { $error++; $errorcode='KO'; $errorlabel="Invoice id or ref or ref_ext is mandatory."; } - + if (! $error) { $objectfound=false; - + $object=new Facture($db); $result=$object->fetch($invoice['id'],$invoice['ref'],$invoice['ref_ext'], ''); - + if (!empty($object->id)) { - + $objectfound=true; - + $db->begin(); - + if (isset($invoice['status'])) { if ($invoice['status'] == Facture::STATUS_DRAFT) @@ -784,7 +784,7 @@ function updateInvoice($authentication,$invoice) if ($invoice['status'] == Facture::STATUS_VALIDATED) { $result = $object->validate($fuser); - + if ($result >= 0) { // Define output language @@ -794,13 +794,13 @@ function updateInvoice($authentication,$invoice) } if ($invoice['status'] == Facture::STATUS_CLOSED) { - $result = $object->set_paid($fuser,$invoice->close_code,$invoice->close_note); + $result = $object->set_paid($fuser,$invoice->close_code,$invoice->close_note); } if ($invoice['status'] == Facture::STATUS_ABANDONED) $result = $object->set_canceled($fuser,$invoice->close_code,$invoice->close_note); } } - + if ((! $error) && ($objectfound)) { $db->commit(); @@ -823,12 +823,12 @@ function updateInvoice($authentication,$invoice) $errorlabel='Invoice id='.$invoice['id'].' ref='.$invoice['ref'].' ref_ext='.$invoice['ref_ext'].' cannot be found'; } } - + if ($error) { $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel)); } - + return $objectresp; }