47 $this->
name = preg_replace(
'/^Interface/i',
'', get_class($this));
48 $this->family =
"core";
49 $this->
description =
"Triggers of this module allows to manage workflows";
50 $this->version = self::VERSIONS[
'prod'];
51 $this->picto =
'technic';
67 if (empty(
$conf->workflow) || empty(
$conf->workflow->enabled)) {
74 if ($action ==
'PROPAL_CLOSE_SIGNED' &&
$object instanceof
Propal) {
75 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
78 if (!empty(
$object->linkedObjectsIds[
'commande'])) {
79 if (empty(
$object->context[
'closedfromonlinesignature'])) {
80 $langs->load(
"orders");
86 include_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
87 $newobject =
new Commande($this->db);
89 $newobject->context[
'createfrompropal'] =
'createfrompropal';
90 $newobject->context[
'origin'] =
$object->element;
91 $newobject->context[
'origin_id'] =
$object->id;
93 $ret = $newobject->createFromProposal(
$object, $user);
98 $object->clearObjectLinkedCache();
105 if ($action ==
'ORDER_CLOSE') {
106 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
107 if (isModEnabled(
'invoice') &&
getDolGlobalString(
'WORKFLOW_ORDER_AUTOCREATE_INVOICE')) {
108 include_once DOL_DOCUMENT_ROOT.
'/compta/facture/class/facture.class.php';
109 '@phan-var-force Facture $object';
110 $newobject =
new Facture($this->db);
112 $newobject->context[
'createfromorder'] =
'createfromorder';
113 $newobject->context[
'origin'] =
$object->element;
114 $newobject->context[
'origin_id'] =
$object->id;
116 $ret = $newobject->createFromOrder(
$object, $user);
121 $res = $newobject->setBankAccount(
$object->thirdparty->fk_account,
true, $user);
128 $object->clearObjectLinkedCache();
135 if ($action ==
'ORDER_CLASSIFY_BILLED') {
136 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
137 if (isModEnabled(
"propal") && !empty(
$conf->workflow->enabled) &&
getDolGlobalString(
'WORKFLOW_ORDER_CLASSIFY_BILLED_PROPAL')) {
139 if (!empty(
$object->linkedObjects[
'propal'])) {
140 $totalonlinkedelements = 0;
141 foreach (
$object->linkedObjects[
'propal'] as $element) {
143 $totalonlinkedelements += $element->total_ht;
146 dol_syslog(
"Amount of linked proposals = ".$totalonlinkedelements.
", of order = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht));
148 foreach (
$object->linkedObjects[
'propal'] as $element) {
149 $ret = $element->classifyBilled($user);
158 if ($action ==
'BILL_VALIDATE') {
159 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
162 if (isModEnabled(
'order') && !empty(
$conf->workflow->enabled) &&
getDolGlobalString(
'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_ORDER')) {
164 if (!empty(
$object->linkedObjects[
'commande'])) {
165 $totalonlinkedelements = 0;
166 foreach (
$object->linkedObjects[
'commande'] as $element) {
168 $totalonlinkedelements += $element->total_ht;
171 dol_syslog(
"Amount of linked orders = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht));
173 foreach (
$object->linkedObjects[
'commande'] as $element) {
174 $ret = $element->classifyBilled($user);
181 if (isModEnabled(
"propal") && !empty(
$conf->workflow->enabled) &&
getDolGlobalString(
'WORKFLOW_INVOICE_CLASSIFY_BILLED_PROPAL')) {
183 if (!empty(
$object->linkedObjects[
'propal'])) {
184 $totalonlinkedelements = 0;
185 foreach (
$object->linkedObjects[
'propal'] as $element) {
187 $totalonlinkedelements += $element->total_ht;
190 dol_syslog(
"Amount of linked proposals = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht));
192 foreach (
$object->linkedObjects[
'propal'] as $element) {
193 $ret = $element->classifyBilled($user);
200 if (isModEnabled(
"shipping") && !empty(
$conf->workflow->enabled) &&
getDolGlobalString(
'WORKFLOW_SHIPPING_CLASSIFY_CLOSED_INVOICE')) {
202 if (!empty(
$object->linkedObjects[
'shipping'])) {
203 $totalonlinkedelements = 0;
204 foreach (
$object->linkedObjects[
'shipping'] as $element) {
206 $totalonlinkedelements += $element->total_ht;
209 dol_syslog(
"Amount of linked shipment = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht), LOG_DEBUG);
210 if ($totalonlinkedelements ==
$object->total_ht) {
211 foreach (
$object->linkedObjects[
'shipping'] as $element) {
212 $ret = $element->setClosed();
221 if (isModEnabled(
"shipping") && !empty(
$conf->workflow->enabled) &&
getDolGlobalString(
'WORKFLOW_SHIPPING_CLASSIFY_BILLED_INVOICE')) {
223 if (!empty(
$object->linkedObjects[
'shipping'])) {
224 $totalonlinkedelements = 0;
225 foreach (
$object->linkedObjects[
'shipping'] as $element) {
227 $totalonlinkedelements += $element->total_ht;
230 dol_syslog(
"Amount of linked shipment = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht), LOG_DEBUG);
231 if ($totalonlinkedelements ==
$object->total_ht) {
232 foreach (
$object->linkedObjects[
'shipping'] as $element) {
233 $ret = $element->setBilled();
243 if (isModEnabled(
'order') && isModEnabled(
'workflow') &&
getDolGlobalString(
'WORKFLOW_SUM_INVOICES_AMOUNT_CLASSIFY_BILLED_ORDER')) {
245 if (!empty(
$object->linkedObjects[
'commande']) && count(
$object->linkedObjects[
'commande']) == 1) {
246 $orderLinked = reset(
$object->linkedObjects[
'commande']);
247 $orderLinked->fetchObjectLinked($orderLinked->id,
'', $orderLinked->element);
248 if (count($orderLinked->linkedObjects[
'facture']) >= 1) {
249 $totalHTInvoices = 0;
250 $areAllInvoicesValidated =
true;
251 foreach ($orderLinked->linkedObjects[
'facture'] as $key => $invoice) {
253 $totalHTInvoices += (float) $invoice->total_ht;
255 $areAllInvoicesValidated =
false;
259 if ($areAllInvoicesValidated) {
260 $isSameTotal = (
price2num($totalHTInvoices,
'MT') ==
price2num($orderLinked->total_ht,
'MT'));
261 dol_syslog(
"Amount of linked invoices = ".$totalHTInvoices.
", of order = ".$orderLinked->total_ht.
", isSameTotal = ".(
string) $isSameTotal, LOG_DEBUG);
263 $ret = $orderLinked->classifyBilled($user);
276 if ($action ==
'BILL_SUPPLIER_VALIDATE') {
277 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
281 if ((isModEnabled(
"supplier_order") || isModEnabled(
"supplier_invoice")) &&
getDolGlobalString(
'WORKFLOW_INVOICE_AMOUNT_CLASSIFY_BILLED_SUPPLIER_ORDER')) {
283 if (!empty(
$object->linkedObjects[
'order_supplier'])) {
284 $totalonlinkedelements = 0;
285 foreach (
$object->linkedObjects[
'order_supplier'] as $element) {
287 $totalonlinkedelements += $element->total_ht;
290 dol_syslog(
"Amount of linked orders = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht));
292 foreach (
$object->linkedObjects[
'order_supplier'] as $element) {
293 $ret = $element->classifyBilled($user);
303 if (isModEnabled(
'supplier_proposal') &&
getDolGlobalString(
'WORKFLOW_INVOICE_CLASSIFY_BILLED_SUPPLIER_PROPOSAL')) {
305 if (!empty(
$object->linkedObjects[
'supplier_proposal'])) {
306 $totalonlinkedelements = 0;
307 foreach (
$object->linkedObjects[
'supplier_proposal'] as $element) {
309 $totalonlinkedelements += $element->total_ht;
312 dol_syslog(
"Amount of linked supplier proposals = ".$totalonlinkedelements.
", of supplier invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht));
314 foreach (
$object->linkedObjects[
'supplier_proposal'] as $element) {
315 $ret = $element->classifyBilled($user);
349 if (isModEnabled(
"reception") && !empty(
$conf->workflow->enabled) &&
getDolGlobalString(
'WORKFLOW_RECEPTION_CLASSIFY_BILLED_INVOICE')) {
351 if (!empty(
$object->linkedObjects[
'reception'])) {
352 $totalonlinkedelements = 0;
353 foreach (
$object->linkedObjects[
'reception'] as $element) {
354 if ($element->statut == Reception::STATUS_VALIDATED || $element->statut == Reception::STATUS_CLOSED) {
355 $totalonlinkedelements += $element->total_ht;
358 dol_syslog(
"Amount of linked reception = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht), LOG_DEBUG);
359 if ($totalonlinkedelements ==
$object->total_ht) {
360 foreach (
$object->linkedObjects[
'reception'] as $element) {
361 $ret = $element->setBilled();
374 if ($action ==
'BILL_PAYED') {
375 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
377 if (isModEnabled(
'order') &&
getDolGlobalString(
'WORKFLOW_INVOICE_CLASSIFY_BILLED_ORDER')) {
379 if (!empty(
$object->linkedObjects[
'commande'])) {
380 $totalonlinkedelements = 0;
381 foreach (
$object->linkedObjects[
'commande'] as $element) {
383 $totalonlinkedelements += $element->total_ht;
386 dol_syslog(
"Amount of linked orders = ".$totalonlinkedelements.
", of invoice = ".
$object->total_ht.
", egality is ".json_encode($totalonlinkedelements ==
$object->total_ht));
388 foreach (
$object->linkedObjects[
'commande'] as $element) {
389 $ret = $element->classifyBilled($user);
398 if (($action ==
'SHIPPING_VALIDATE') || ($action ==
'SHIPPING_CLOSED')) {
399 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
401 if (isModEnabled(
'order') && isModEnabled(
"shipping") && !empty(
$conf->workflow->enabled) &&
403 (
getDolGlobalString(
'WORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING') && ($action ==
'SHIPPING_VALIDATE')) ||
404 (
getDolGlobalString(
'WORKFLOW_ORDER_CLASSIFY_SHIPPED_SHIPPING_CLOSED') && ($action ==
'SHIPPING_CLOSED'))
407 $qtyshipped = array();
408 $qtyordred = array();
413 if (in_array(
$object->origin, array(
'order',
'commande')) &&
$object->origin_id > 0) {
414 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
416 $ret = $order->fetch(
$object->origin_id);
421 $ret = $order->fetchObjectLinked($order->id,
'commande',
null,
'shipping');
427 if (is_array($order->linkedObjects) && count($order->linkedObjects) > 0) {
428 foreach ($order->linkedObjects as $type => $shipping_array) {
429 if ($type !=
'shipping' || !is_array($shipping_array) || count($shipping_array) == 0) {
433 foreach ($shipping_array as $shipping) {
434 if ($shipping->status <= 0 || !is_array($shipping->lines) || count($shipping->lines) == 0) {
438 foreach ($shipping->lines as $shippingline) {
439 if (isset($qtyshipped[$shippingline->fk_product])) {
440 $qtyshipped[$shippingline->fk_product] += $shippingline->qty;
442 $qtyshipped[$shippingline->fk_product] = $shippingline->qty;
450 if (is_array($order->lines) && count($order->lines) > 0) {
451 foreach ($order->lines as $orderline) {
456 if (isset($qtyordred[$shippingline->fk_product])) {
457 $qtyordred[$orderline->fk_product] += $orderline->qty;
459 $qtyordred[$orderline->fk_product] = $orderline->qty;
466 $diff_array = array_diff_assoc($qtyordred, $qtyshipped);
467 if (count($diff_array) == 0) {
480 if (($action ==
'RECEPTION_VALIDATE') || ($action ==
'RECEPTION_CLOSED')) {
481 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
483 if ((isModEnabled(
"fournisseur") || isModEnabled(
"supplier_order")) && isModEnabled(
"reception") && isModEnabled(
'workflow') &&
485 (
getDolGlobalString(
'WORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION') && ($action ==
'RECEPTION_VALIDATE')) ||
486 (
getDolGlobalString(
'WORKFLOW_ORDER_CLASSIFY_RECEIVED_RECEPTION_CLOSED') && ($action ==
'RECEPTION_CLOSED'))
489 $qtyshipped = array();
490 $qtyordred = array();
495 if (in_array(
$object->origin, array(
'order_supplier',
'supplier_order',
'commandeFournisseur')) &&
$object->origin_id > 0) {
496 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
498 $ret = $order->fetch(
$object->origin_id);
503 $ret = $order->fetchObjectLinked($order->id, $order->element,
null,
'reception');
510 if (is_array($order->linkedObjects) && count($order->linkedObjects) > 0) {
511 foreach ($order->linkedObjects as $type => $shipping_array) {
512 if ($type !=
'reception' || !is_array($shipping_array) || count($shipping_array) == 0) {
516 foreach ($shipping_array as $shipping) {
517 if (!is_array($shipping->lines) || count($shipping->lines) == 0) {
521 foreach ($shipping->lines as $shippingline) {
522 $qtyshipped[$shippingline->fk_product] += $shippingline->qty;
529 if (is_array($order->lines) && count($order->lines) > 0) {
530 foreach ($order->lines as $orderline) {
535 $qtyordred[$orderline->fk_product] += $orderline->qty;
541 $diff_array = array_diff_assoc($qtyordred, $qtyshipped);
542 if (count($diff_array) == 0) {
554 if ($action ==
'TICKET_CREATE') {
555 dol_syslog(
"Trigger '".$this->
name.
"' for action '$action' launched by ".__FILE__.
". id=".
$object->id);
557 if (isModEnabled(
'contract') && isModEnabled(
'ticket') && isModEnabled(
'workflow') &&
getDolGlobalString(
'WORKFLOW_TICKET_LINK_CONTRACT') &&
getDolGlobalString(
'TICKET_PRODUCT_CATEGORY') && !empty(
$object->fk_soc)) {
558 $societe =
new Societe($this->db);
561 $contrat =
new Contrat($this->db);
562 $number_contracts_found = 0;
563 foreach ($company_ids as $company_id) {
564 $contrat->socid = $company_id;
565 $list = $contrat->getListOfContracts(
'all', array(Contrat::STATUS_DRAFT, Contrat::STATUS_VALIDATED), array(
getDolGlobalString(
'TICKET_PRODUCT_CATEGORY')), array(ContratLigne::STATUS_INITIAL, ContratLigne::STATUS_OPEN));
566 if (!is_array($list) || empty($list)) {
569 $number_contracts_found = count($list);
570 if ($number_contracts_found == 0) {
574 foreach ($list as $linked_contract) {
575 $object->setContract($linked_contract->id);
579 if ($number_contracts_found > 1 && !defined(
'NOLOGIN')) {
580 setEventMessages($langs->trans(
'TicketManyContractsLinked'),
null,
'warnings');
584 if ($number_contracts_found == 0 && !defined(
'NOLOGIN')) {
585 setEventMessages($langs->trans(
'TicketNoContractFoundToLink'),
null,
'mesgs');
589 if (isModEnabled(
'intervention') && isModEnabled(
'ticket') && isModEnabled(
'workflow') &&
getDolGlobalString(
'WORKFLOW_TICKET_CREATE_INTERVENTION')) {
591 $fichinter->socid = (int)
$object->fk_soc;
592 $fichinter->fk_project = (int)
$object->fk_project;
593 $fichinter->fk_contrat = (int)
$object->fk_contract;
595 $fichinter->user_author_id = $user->id;
598 $fichinter->origin =
$object->element;
599 $fichinter->origin_type =
$object->element;
600 $fichinter->origin_id =
$object->id;
604 $extrafields->fetch_name_optionals_label($fichinter->table_element);
605 $array_options = $extrafields->getOptionalsFromPost($fichinter->table_element);
606 $fichinter->array_options = $array_options;
608 $id = $fichinter->create($user);
634 return (
price2num($totalonlinkedelements,
'MT') ==
price2num($object_total_ht,
'MT'));