2019-10-22 13:52:18 +02:00
< ? php
/* Copyright ( C ) 2019 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
* the Free Software Foundation ; either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http :// www . gnu . org / licenses />.
*/
/**
* \file mo_production . php
* \ingroup mrp
* \brief Page to make production on a MO
*/
//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Do not create database handler $db
//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Do not load object $user
//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); // Do not load object $mysoc
//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); // Do not load object $langs
//if (! defined('NOSCANGETFORINJECTION')) define('NOSCANGETFORINJECTION','1'); // Do not check injection attack on GET parameters
//if (! defined('NOSCANPOSTFORINJECTION')) define('NOSCANPOSTFORINJECTION','1'); // Do not check injection attack on POST parameters
//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); // Do not check CSRF attack (test on referer + on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on).
//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Do not roll the Anti CSRF token (used if MAIN_SECURITY_CSRF_WITH_TOKEN is on)
//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK','1'); // Do not check style html tag into posted data
//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no need to load and show top and left menu
//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php
//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); // Do not load ajax.lib.php library
//if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session). This include the NOIPCHECK too.
//if (! defined('NOIPCHECK')) define('NOIPCHECK','1'); // Do not check IP defined into conf $dolibarr_main_restrict_ip
//if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT','auto'); // Force lang to a particular value
//if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE','aloginmodule'); // Force authentication handler
//if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN',1); // The main.inc.php does not make a redirect if not logged, instead show simple error message
//if (! defined("FORCECSP")) define('FORCECSP','none'); // Disable all Content Security Policies
// Load Dolibarr environment
require '../main.inc.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formcompany.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formfile.class.php' ;
require_once DOL_DOCUMENT_ROOT . '/core/class/html.formprojet.class.php' ;
2020-02-12 21:31:49 +01:00
require_once DOL_DOCUMENT_ROOT . '/projet/class/project.class.php' ;
2020-01-03 15:01:14 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php' ;
2020-01-02 22:05:35 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php' ;
2020-01-08 19:04:00 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/entrepot.class.php' ;
2020-01-13 12:30:48 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/productlot.class.php' ;
2020-01-04 15:20:10 +01:00
require_once DOL_DOCUMENT_ROOT . '/product/stock/class/mouvementstock.class.php' ;
2019-10-22 13:52:18 +02:00
dol_include_once ( '/mrp/class/mo.class.php' );
dol_include_once ( '/mrp/lib/mrp_mo.lib.php' );
// Load translation files required by the page
2020-03-22 12:31:27 +01:00
$langs -> loadLangs ( array ( " mrp " , " stocks " , " other " , " productbatch " ));
2019-10-22 13:52:18 +02:00
// Get parameters
2019-11-07 12:59:59 +01:00
$id = GETPOST ( 'id' , 'int' );
2019-10-22 13:52:18 +02:00
$ref = GETPOST ( 'ref' , 'alpha' );
2019-11-07 12:59:59 +01:00
$action = GETPOST ( 'action' , 'aZ09' );
2019-10-22 13:52:18 +02:00
$confirm = GETPOST ( 'confirm' , 'alpha' );
$cancel = GETPOST ( 'cancel' , 'aZ09' );
2019-11-07 12:59:59 +01:00
$contextpage = GETPOST ( 'contextpage' , 'aZ' ) ? GETPOST ( 'contextpage' , 'aZ' ) : 'mocard' ; // To manage different context of search
2019-10-22 13:52:18 +02:00
$backtopage = GETPOST ( 'backtopage' , 'alpha' );
//$lineid = GETPOST('lineid', 'int');
2020-01-08 19:04:00 +01:00
$collapse = GETPOST ( 'collapse' , 'aZ09comma' );
2019-10-22 13:52:18 +02:00
// Initialize technical objects
2019-11-07 12:59:59 +01:00
$object = new Mo ( $db );
2019-10-22 13:52:18 +02:00
$extrafields = new ExtraFields ( $db );
2019-11-07 12:59:59 +01:00
$diroutputmassaction = $conf -> mrp -> dir_output . '/temp/massgeneration/' . $user -> id ;
$hookmanager -> initHooks ( array ( 'mocard' , 'globalcard' )); // Note that conf->hooks_modules contains array
2019-10-22 13:52:18 +02:00
// Fetch optionals attributes and labels
$extrafields -> fetch_name_optionals_label ( $object -> table_element );
2019-11-07 12:59:59 +01:00
$search_array_options = $extrafields -> getOptionalsFromPost ( $object -> table_element , '' , 'search_' );
2019-10-22 13:52:18 +02:00
// Initialize array of search criterias
2020-08-28 21:27:50 +02:00
$search_all = GETPOST ( " search_all " , 'alpha' );
2019-11-07 12:59:59 +01:00
$search = array ();
foreach ( $object -> fields as $key => $val )
2019-10-22 13:52:18 +02:00
{
2019-11-07 12:59:59 +01:00
if ( GETPOST ( 'search_' . $key , 'alpha' )) $search [ $key ] = GETPOST ( 'search_' . $key , 'alpha' );
2019-10-22 13:52:18 +02:00
}
2019-11-07 12:59:59 +01:00
if ( empty ( $action ) && empty ( $id ) && empty ( $ref )) $action = 'view' ;
2019-10-22 13:52:18 +02:00
// Load object
2019-11-07 12:59:59 +01:00
include DOL_DOCUMENT_ROOT . '/core/actions_fetchobject.inc.php' ; // Must be include, not include_once.
2019-10-22 13:52:18 +02:00
// Security check - Protection if external user
2019-11-22 15:35:19 +01:00
//if ($user->socid > 0) accessforbidden();
2019-10-31 20:46:31 +01:00
//if ($user->socid > 0) $socid = $user->socid;
2020-06-18 01:09:30 +02:00
$isdraft = (( $object -> status == $object :: STATUS_DRAFT ) ? 1 : 0 );
$result = restrictedArea ( $user , 'mrp' , $object -> id , 'mrp_mo' , '' , 'fk_soc' , 'rowid' , $isdraft );
2019-10-22 13:52:18 +02:00
2019-11-07 12:59:59 +01:00
$permissionnote = $user -> rights -> mrp -> write ; // Used by the include of actions_setnotes.inc.php
$permissiondellink = $user -> rights -> mrp -> write ; // Used by the include of actions_dellink.inc.php
$permissiontoadd = $user -> rights -> mrp -> write ; // Used by the include of actions_addupdatedelete.inc.php and actions_lineupdown.inc.php
2019-11-09 20:23:31 +01:00
$permissiontodelete = $user -> rights -> mrp -> delete || ( $permissiontoadd && isset ( $object -> status ) && $object -> status == $object :: STATUS_DRAFT );
2019-11-22 15:13:30 +01:00
$upload_dir = $conf -> mrp -> multidir_output [ isset ( $object -> entity ) ? $object -> entity : 1 ];
2019-10-22 13:52:18 +02:00
2019-12-20 15:31:05 +01:00
$permissiontoproduce = $permissiontoadd ;
2019-10-22 13:52:18 +02:00
2020-01-07 19:08:35 +01:00
2019-10-22 13:52:18 +02:00
/*
* Actions
*/
2019-11-07 12:59:59 +01:00
$parameters = array ();
$reshook = $hookmanager -> executeHooks ( 'doActions' , $parameters , $object , $action ); // Note that $action and $object may have been modified by some hooks
2019-10-22 13:52:18 +02:00
if ( $reshook < 0 ) setEventMessages ( $hookmanager -> error , $hookmanager -> errors , 'errors' );
if ( empty ( $reshook ))
{
2019-11-07 12:59:59 +01:00
$error = 0 ;
2019-10-22 13:52:18 +02:00
$backurlforlist = dol_buildpath ( '/mrp/mo_list.php' , 1 );
if ( empty ( $backtopage ) || ( $cancel && empty ( $id ))) {
//var_dump($backurlforlist);exit;
if ( empty ( $id ) && (( $action != 'add' && $action != 'create' ) || $cancel )) $backtopage = $backurlforlist ;
2020-01-02 22:05:35 +01:00
else $backtopage = DOL_URL_ROOT . '/mrp/mo_production.php?id=' . ( $id > 0 ? $id : '__ID__' );
2019-10-22 13:52:18 +02:00
}
2019-11-07 12:59:59 +01:00
$triggermodname = 'MRP_MO_MODIFY' ; // Name of trigger action code to execute when we modify record
2019-10-22 13:52:18 +02:00
// Actions cancel, add, update, delete or clone
include DOL_DOCUMENT_ROOT . '/core/actions_addupdatedelete.inc.php' ;
// Actions when linking object each other
include DOL_DOCUMENT_ROOT . '/core/actions_dellink.inc.php' ;
// Actions when printing a doc from card
include DOL_DOCUMENT_ROOT . '/core/actions_printing.inc.php' ;
2019-11-09 21:09:19 +01:00
2019-11-09 20:23:31 +01:00
// Actions to send emails
2019-12-02 09:38:16 +01:00
$triggersendname = 'MO_SENTBYMAIL' ;
2019-11-09 20:23:31 +01:00
$autocopy = 'MAIN_MAIL_AUTOCOPY_MO_TO' ;
$trackid = 'mo' . $object -> id ;
include DOL_DOCUMENT_ROOT . '/core/actions_sendmails.inc.php' ;
2019-11-09 21:09:19 +01:00
2019-10-22 13:52:18 +02:00
// Action to move up and down lines of object
//include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once
if ( $action == 'set_thirdparty' && $permissiontoadd )
{
$object -> setValueFrom ( 'fk_soc' , GETPOST ( 'fk_soc' , 'int' ), '' , '' , 'date' , '' , $user , 'MO_MODIFY' );
}
if ( $action == 'classin' && $permissiontoadd )
{
$object -> setProject ( GETPOST ( 'projectid' , 'int' ));
}
2020-01-03 15:01:14 +01:00
2020-01-07 19:08:35 +01:00
if ( $action == 'confirm_reopen' ) {
$result = $object -> setStatut ( $object :: STATUS_INPROGRESS , 0 , '' , 'MRP_REOPEN' );
}
2020-02-12 22:45:27 +01:00
if ( $action == 'confirm_addconsumeline' && GETPOST ( 'addconsumelinebutton' )) {
$moline = new MoLine ( $db );
// Line to produce
$moline -> fk_mo = $object -> id ;
2020-02-21 17:53:37 +01:00
$moline -> qty = GETPOST ( 'qtytoadd' , 'int' ); ;
2020-02-12 22:45:27 +01:00
$moline -> fk_product = GETPOST ( 'productidtoadd' , 'int' );
$moline -> role = 'toconsume' ;
$moline -> position = 0 ;
2020-02-21 17:53:37 +01:00
$resultline = $moline -> create ( $user , false ); // Never use triggers here
2020-02-12 22:45:27 +01:00
if ( $resultline <= 0 ) {
$error ++ ;
setEventMessages ( $moline -> error , $molines -> errors , 'errors' );
}
$action = '' ;
}
2020-01-08 17:56:02 +01:00
if ( in_array ( $action , array ( 'confirm_consumeorproduce' , 'confirm_consumeandproduceall' ))) {
2020-01-04 15:20:10 +01:00
$stockmove = new MouvementStock ( $db );
$labelmovement = GETPOST ( 'inventorylabel' , 'alphanohtml' );
$codemovement = GETPOST ( 'inventorycode' , 'alphanohtml' );
2020-01-03 15:01:14 +01:00
$db -> begin ();
// Process line to consume
2020-01-10 00:03:10 +01:00
foreach ( $object -> lines as $line ) {
2020-01-03 15:01:14 +01:00
if ( $line -> role == 'toconsume' ) {
$tmpproduct = new Product ( $db );
$tmpproduct -> fetch ( $line -> fk_product );
2020-01-10 00:03:10 +01:00
$i = 1 ;
2020-01-03 15:01:14 +01:00
while ( GETPOSTISSET ( 'qty-' . $line -> id . '-' . $i )) {
2020-01-07 22:17:40 +01:00
$qtytoprocess = price2num ( GETPOST ( 'qty-' . $line -> id . '-' . $i ));
if ( $qtytoprocess != 0 ) {
// Check warehouse is set if we should have to
if ( GETPOSTISSET ( 'idwarehouse-' . $line -> id . '-' . $i )) { // If there is a warehouse to set
2020-01-10 00:03:10 +01:00
if ( ! ( GETPOST ( 'idwarehouse-' . $line -> id . '-' . $i ) > 0 )) { // If there is no warehouse set.
2020-01-07 22:17:40 +01:00
$langs -> load ( " errors " );
setEventMessages ( $langs -> trans ( " ErrorFieldRequiredForProduct " , $langs -> transnoentitiesnoconv ( " Warehouse " ), $tmpproduct -> ref ), null , 'errors' );
$error ++ ;
}
2020-01-10 00:03:10 +01:00
if ( $tmpproduct -> status_batch && ( ! GETPOST ( 'batch-' . $line -> id . '-' . $i ))) {
2020-01-07 22:17:40 +01:00
$langs -> load ( " errors " );
setEventMessages ( $langs -> trans ( " ErrorFieldRequiredForProduct " , $langs -> transnoentitiesnoconv ( " Batch " ), $tmpproduct -> ref ), null , 'errors' );
$error ++ ;
}
}
$idstockmove = 0 ;
2020-01-10 00:03:10 +01:00
if ( ! $error && GETPOST ( 'idwarehouse-' . $line -> id . '-' . $i ) > 0 ) {
2020-01-07 22:17:40 +01:00
// Record stock movement
$id_product_batch = 0 ;
$stockmove -> origin = $object ;
$idstockmove = $stockmove -> livraison ( $user , $line -> fk_product , GETPOST ( 'idwarehouse-' . $line -> id . '-' . $i ), $qtytoprocess , 0 , $labelmovement , dol_now (), '' , '' , GETPOST ( 'batch-' . $line -> id . '-' . $i ), $id_product_batch , $codemovement );
if ( $idstockmove < 0 ) {
$error ++ ;
setEventMessages ( $stockmove -> error , $stockmove -> errors , 'errors' );
}
}
2020-01-10 00:03:10 +01:00
if ( ! $error ) {
2020-01-07 22:17:40 +01:00
$pos = 0 ;
// Record consumption
$moline = new MoLine ( $db );
$moline -> fk_mo = $object -> id ;
$moline -> position = $pos ;
$moline -> fk_product = $line -> fk_product ;
$moline -> fk_warehouse = GETPOST ( 'idwarehouse-' . $line -> id . '-' . $i );
$moline -> qty = $qtytoprocess ;
$moline -> batch = GETPOST ( 'batch-' . $line -> id . '-' . $i );
$moline -> role = 'consumed' ;
$moline -> fk_mrp_production = $line -> id ;
$moline -> fk_stock_movement = $idstockmove ;
$moline -> fk_user_creat = $user -> id ;
$resultmoline = $moline -> create ( $user );
if ( $resultmoline <= 0 ) {
$error ++ ;
setEventMessages ( $moline -> error , $moline -> errors , 'errors' );
}
$pos ++ ;
}
}
2020-01-03 15:01:14 +01:00
$i ++ ;
}
}
}
// Process line to produce
2020-01-10 00:03:10 +01:00
foreach ( $object -> lines as $line ) {
2020-01-03 15:01:14 +01:00
if ( $line -> role == 'toproduce' ) {
$tmpproduct = new Product ( $db );
$tmpproduct -> fetch ( $line -> fk_product );
2020-01-10 00:03:10 +01:00
$i = 1 ;
2020-01-03 15:01:14 +01:00
while ( GETPOSTISSET ( 'qtytoproduce-' . $line -> id . '-' . $i )) {
2020-01-07 22:17:40 +01:00
$qtytoprocess = price2num ( GETPOST ( 'qtytoproduce-' . $line -> id . '-' . $i ));
if ( $qtytoprocess != 0 ) {
// Check warehouse is set if we should have to
if ( GETPOSTISSET ( 'idwarehousetoproduce-' . $line -> id . '-' . $i )) { // If there is a warehouse to set
2020-01-10 00:03:10 +01:00
if ( ! ( GETPOST ( 'idwarehousetoproduce-' . $line -> id . '-' . $i ) > 0 )) { // If there is no warehouse set.
2020-01-07 22:17:40 +01:00
$langs -> load ( " errors " );
setEventMessages ( $langs -> trans ( " ErrorFieldRequiredForProduct " , $langs -> transnoentitiesnoconv ( " Warehouse " ), $tmpproduct -> ref ), null , 'errors' );
$error ++ ;
}
2020-01-10 00:03:10 +01:00
if ( $tmpproduct -> status_batch && ( ! GETPOST ( 'batchtoproduce-' . $line -> id . '-' . $i ))) {
2020-01-07 22:17:40 +01:00
$langs -> load ( " errors " );
setEventMessages ( $langs -> trans ( " ErrorFieldRequiredForProduct " , $langs -> transnoentitiesnoconv ( " Batch " ), $tmpproduct -> ref ), null , 'errors' );
$error ++ ;
}
}
2020-01-09 22:14:39 +01:00
2020-01-07 22:17:40 +01:00
$idstockmove = 0 ;
2020-01-10 00:03:10 +01:00
if ( ! $error && GETPOST ( 'idwarehousetoproduce-' . $line -> id . '-' . $i ) > 0 ) {
2020-01-07 22:17:40 +01:00
// Record stock movement
$id_product_batch = 0 ;
$stockmove -> origin = $object ;
2020-01-08 17:56:02 +01:00
$idstockmove = $stockmove -> reception ( $user , $line -> fk_product , GETPOST ( 'idwarehousetoproduce-' . $line -> id . '-' . $i ), $qtytoprocess , 0 , $labelmovement , '' , '' , GETPOST ( 'batchtoproduce-' . $line -> id . '-' . $i ), dol_now (), $id_product_batch , $codemovement );
2020-01-07 22:17:40 +01:00
if ( $idstockmove < 0 ) {
$error ++ ;
setEventMessages ( $stockmove -> error , $stockmove -> errors , 'errors' );
}
}
2020-01-10 00:03:10 +01:00
if ( ! $error ) {
2020-01-07 22:17:40 +01:00
$pos = 0 ;
// Record production
$moline = new MoLine ( $db );
$moline -> fk_mo = $object -> id ;
$moline -> position = $pos ;
$moline -> fk_product = $line -> fk_product ;
$moline -> fk_warehouse = GETPOST ( 'idwarehousetoproduce-' . $line -> id . '-' . $i );
$moline -> qty = $qtytoprocess ;
$moline -> batch = GETPOST ( 'batchtoproduce-' . $line -> id . '-' . $i );
$moline -> role = 'produced' ;
$moline -> fk_mrp_production = $line -> id ;
$moline -> fk_stock_movement = $idstockmove ;
$moline -> fk_user_creat = $user -> id ;
$resultmoline = $moline -> create ( $user );
if ( $resultmoline <= 0 ) {
$error ++ ;
setEventMessages ( $moline -> error , $moline -> errors , 'errors' );
}
$pos ++ ;
}
2020-01-03 15:01:14 +01:00
}
$i ++ ;
}
}
}
2020-01-10 00:03:10 +01:00
if ( ! $error ) {
2020-01-07 19:08:35 +01:00
$consumptioncomplete = true ;
$productioncomplete = true ;
if ( GETPOST ( 'autoclose' , 'int' )) {
2020-01-10 00:03:10 +01:00
foreach ( $object -> lines as $line ) {
2020-01-07 19:08:35 +01:00
if ( $line -> role == 'toconsume' ) {
$arrayoflines = $object -> fetchLinesLinked ( 'consumed' , $line -> id );
$alreadyconsumed = 0 ;
2020-01-10 00:03:10 +01:00
foreach ( $arrayoflines as $line2 ) {
2020-01-07 19:08:35 +01:00
$alreadyconsumed += $line2 [ 'qty' ];
}
if ( $alreadyconsumed < $line -> qty ) {
$consumptioncomplete = false ;
}
}
if ( $line -> role == 'toproduce' ) {
$arrayoflines = $object -> fetchLinesLinked ( 'produced' , $line -> id );
$alreadyproduced = 0 ;
2020-01-10 00:03:10 +01:00
foreach ( $arrayoflines as $line2 ) {
2020-01-07 19:08:35 +01:00
$alreadyproduced += $line2 [ 'qty' ];
}
if ( $alreadyproduced < $line -> qty ) {
$productioncomplete = false ;
}
}
}
2020-05-21 15:05:19 +02:00
} else {
2020-01-07 19:08:35 +01:00
$consumptioncomplete = false ;
$productioncomplete = false ;
}
2020-01-03 15:01:14 +01:00
// Update status of MO
2020-01-07 19:08:35 +01:00
dol_syslog ( " consumptioncomplete = " . $consumptioncomplete . " productioncomplete = " . $productioncomplete );
//var_dump("consumptioncomplete = ".$consumptioncomplete." productioncomplete = ".$productioncomplete);
if ( $consumptioncomplete && $productioncomplete ) {
2020-01-06 03:41:45 +01:00
$result = $object -> setStatut ( $object :: STATUS_PRODUCED , 0 , '' , 'MRP_MO_PRODUCED' );
2020-01-07 19:08:35 +01:00
} else {
$result = $object -> setStatut ( $object :: STATUS_INPROGRESS , 0 , '' , 'MRP_MO_PRODUCED' );
2020-01-06 03:41:45 +01:00
}
if ( $result <= 0 ) {
$error ++ ;
setEventMessages ( $object -> error , $object -> errors , 'errors' );
2020-01-04 15:20:10 +01:00
}
2020-01-03 15:01:14 +01:00
}
if ( $error ) {
$action = str_replace ( 'confirm_' , '' , $action );
$db -> rollback ();
} else {
$db -> commit ();
2020-01-07 22:01:55 +01:00
// Redirect to avoid to action done a second time if we make a back from browser
header ( " Location: " . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id );
exit ;
2020-01-03 15:01:14 +01:00
}
}
2020-05-20 23:15:18 +02:00
// Action close produced
if ( $action == 'confirm_produced' && $confirm == 'yes' && $permissiontoadd )
{
$result = $object -> setStatut ( $object :: STATUS_PRODUCED , 0 , '' , 'MRP_MO_PRODUCED' );
if ( $result >= 0 )
{
// Define output language
if ( empty ( $conf -> global -> MAIN_DISABLE_PDF_AUTOUPDATE ))
{
$outputlangs = $langs ;
$newlang = '' ;
if ( $conf -> global -> MAIN_MULTILANGS && empty ( $newlang ) && GETPOST ( 'lang_id' , 'aZ09' )) $newlang = GETPOST ( 'lang_id' , 'aZ09' );
if ( $conf -> global -> MAIN_MULTILANGS && empty ( $newlang )) $newlang = $object -> thirdparty -> default_lang ;
if ( ! empty ( $newlang )) {
$outputlangs = new Translate ( " " , $conf );
$outputlangs -> setDefaultLang ( $newlang );
}
$model = $object -> modelpdf ;
$ret = $object -> fetch ( $id ); // Reload to get new records
$object -> generateDocument ( $model , $outputlangs , 0 , 0 , 0 );
}
2020-05-21 15:05:19 +02:00
} else {
2020-05-20 23:15:18 +02:00
setEventMessages ( $object -> error , $object -> errors , 'errors' );
}
}
2019-10-22 13:52:18 +02:00
}
/*
* View
*/
2019-11-07 12:59:59 +01:00
$form = new Form ( $db );
$formproject = new FormProjets ( $db );
2020-01-02 22:05:35 +01:00
$formproduct = new FormProduct ( $db );
2020-01-08 19:04:00 +01:00
$tmpwarehouse = new Entrepot ( $db );
2020-01-13 12:30:48 +01:00
$tmpbatch = new Productlot ( $db );
2019-10-22 13:52:18 +02:00
2020-03-22 17:06:59 +01:00
$help_url = 'EN:Module_Manufacturing_Orders|FR:Module_Ordres_de_Fabrication' ;
llxHeader ( '' , $langs -> trans ( 'Mo' ), $help_url , '' , 0 , 0 , array ( '/mrp/js/lib_dispatch.js.php' ));
2019-10-22 13:52:18 +02:00
// Part to show record
if ( $object -> id > 0 && ( empty ( $action ) || ( $action != 'edit' && $action != 'create' )))
{
2019-11-09 20:23:31 +01:00
$res = $object -> fetch_thirdparty ();
$res = $object -> fetch_optionals ();
2019-10-22 13:52:18 +02:00
$head = moPrepareHead ( $object );
dol_fiche_head ( $head , 'production' , $langs -> trans ( " MO " ), - 1 , $object -> picto );
$formconfirm = '' ;
// Confirmation to delete
if ( $action == 'delete' )
{
2019-11-07 12:59:59 +01:00
$formconfirm = $form -> formconfirm ( $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id , $langs -> trans ( 'DeleteMo' ), $langs -> trans ( 'ConfirmDeleteMo' ), 'confirm_delete' , '' , 0 , 1 );
2019-10-22 13:52:18 +02:00
}
// Confirmation to delete line
if ( $action == 'deleteline' )
{
$formconfirm = $form -> formconfirm ( $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&lineid=' . $lineid , $langs -> trans ( 'DeleteLine' ), $langs -> trans ( 'ConfirmDeleteLine' ), 'confirm_deleteline' , '' , 0 , 1 );
}
// Clone confirmation
if ( $action == 'clone' ) {
// Create an array for form
$formquestion = array ();
2019-11-07 12:59:59 +01:00
$formconfirm = $form -> formconfirm ( $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id , $langs -> trans ( 'ToClone' ), $langs -> trans ( 'ConfirmCloneMo' , $object -> ref ), 'confirm_clone' , $formquestion , 'yes' , 1 );
2019-10-22 13:52:18 +02:00
}
2020-02-12 22:45:27 +01:00
// Confirmation of validation
if ( $action == 'validate' )
2019-10-22 13:52:18 +02:00
{
2020-02-12 22:45:27 +01:00
// We check that object has a temporary ref
$ref = substr ( $object -> ref , 1 , 4 );
if ( $ref == 'PROV' ) {
$object -> fetch_product ();
$numref = $object -> getNextNumRef ( $object -> fk_product );
} else {
$numref = $object -> ref ;
}
$text = $langs -> trans ( 'ConfirmValidateMo' , $numref );
/* if ( ! empty ( $conf -> notification -> enabled ))
{
require_once DOL_DOCUMENT_ROOT . '/core/class/notify.class.php' ;
$notify = new Notify ( $db );
$text .= '<br>' ;
$text .= $notify -> confirmMessage ( 'BOM_VALIDATE' , $object -> socid , $object );
} */
2019-11-07 12:59:59 +01:00
$formquestion = array ();
2020-02-12 22:45:27 +01:00
if ( ! empty ( $conf -> mrp -> enabled ))
{
$langs -> load ( " mrp " );
require_once DOL_DOCUMENT_ROOT . '/product/class/html.formproduct.class.php' ;
$formproduct = new FormProduct ( $db );
$forcecombo = 0 ;
if ( $conf -> browser -> name == 'ie' ) $forcecombo = 1 ; // There is a bug in IE10 that make combo inside popup crazy
$formquestion = array (
// 'text' => $langs->trans("ConfirmClone"),
// array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1),
// array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1),
);
}
$formconfirm = $form -> formconfirm ( $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id , $langs -> trans ( 'Validate' ), $text , 'confirm_validate' , $formquestion , 0 , 1 , 220 );
2019-10-22 13:52:18 +02:00
}
// Call Hook formConfirm
2020-01-28 12:00:27 +01:00
$parameters = array ( 'formConfirm' => $formconfirm , 'lineid' => $lineid );
2019-10-22 13:52:18 +02:00
$reshook = $hookmanager -> executeHooks ( 'formConfirm' , $parameters , $object , $action ); // Note that $action and $object may have been modified by hook
2019-11-07 12:59:59 +01:00
if ( empty ( $reshook )) $formconfirm .= $hookmanager -> resPrint ;
elseif ( $reshook > 0 ) $formconfirm = $hookmanager -> resPrint ;
2019-10-22 13:52:18 +02:00
// Print form confirm
print $formconfirm ;
// Object card
// ------------------------------------------------------------
2019-11-07 12:59:59 +01:00
$linkback = '<a href="' . dol_buildpath ( '/mrp/mo_list.php' , 1 ) . '?restore_lastsearch_values=1' . ( ! empty ( $socid ) ? '&socid=' . $socid : '' ) . '">' . $langs -> trans ( " BackToList " ) . '</a>' ;
2019-10-22 13:52:18 +02:00
2019-11-07 12:59:59 +01:00
$morehtmlref = '<div class="refidno">' ;
2019-10-22 13:52:18 +02:00
/*
// Ref bis
$morehtmlref .= $form -> editfieldkey ( " RefBis " , 'ref_client' , $object -> ref_client , $object , $user -> rights -> mrp -> creer , 'string' , '' , 0 , 1 );
$morehtmlref .= $form -> editfieldval ( " RefBis " , 'ref_client' , $object -> ref_client , $object , $user -> rights -> mrp -> creer , 'string' , '' , null , null , '' , 1 ); */
// Thirdparty
2019-11-09 20:23:31 +01:00
$morehtmlref .= $langs -> trans ( 'ThirdParty' ) . ' : ' . ( is_object ( $object -> thirdparty ) ? $object -> thirdparty -> getNomUrl ( 1 ) : '' );
2019-10-22 13:52:18 +02:00
// Project
2019-11-07 12:59:59 +01:00
if ( ! empty ( $conf -> projet -> enabled ))
2019-10-22 13:52:18 +02:00
{
$langs -> load ( " projects " );
2019-11-07 12:59:59 +01:00
$morehtmlref .= '<br>' . $langs -> trans ( 'Project' ) . ' ' ;
2019-11-09 20:23:31 +01:00
if ( $permissiontoadd )
2019-10-22 13:52:18 +02:00
{
if ( $action != 'classify' )
2019-11-07 12:59:59 +01:00
$morehtmlref .= '<a class="editfielda" href="' . $_SERVER [ 'PHP_SELF' ] . '?action=classify&id=' . $object -> id . '">' . img_edit ( $langs -> transnoentitiesnoconv ( 'SetProject' )) . '</a> : ' ;
2019-10-22 13:52:18 +02:00
if ( $action == 'classify' ) {
2019-11-09 20:23:31 +01:00
//$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->fk_soc, $object->fk_project, 'projectid', 0, 0, 1, 1);
2019-11-07 12:59:59 +01:00
$morehtmlref .= '<form method="post" action="' . $_SERVER [ 'PHP_SELF' ] . '?id=' . $object -> id . '">' ;
$morehtmlref .= '<input type="hidden" name="action" value="classin">' ;
2019-12-18 23:12:31 +01:00
$morehtmlref .= '<input type="hidden" name="token" value="' . newToken () . '">' ;
2019-11-09 20:23:31 +01:00
$morehtmlref .= $formproject -> select_projects ( $object -> fk_soc , $object -> fk_project , 'projectid' , 0 , 0 , 1 , 0 , 1 , 0 , 0 , '' , 1 );
2019-11-07 12:59:59 +01:00
$morehtmlref .= '<input type="submit" class="button valignmiddle" value="' . $langs -> trans ( " Modify " ) . '">' ;
$morehtmlref .= '</form>' ;
2019-10-22 13:52:18 +02:00
} else {
2019-11-09 20:23:31 +01:00
$morehtmlref .= $form -> form_project ( $_SERVER [ 'PHP_SELF' ] . '?id=' . $object -> id , $object -> fk_soc , $object -> fk_project , 'none' , 0 , 0 , 0 , 1 );
2019-10-22 13:52:18 +02:00
}
} else {
2019-11-07 12:59:59 +01:00
if ( ! empty ( $object -> fk_project )) {
2019-10-22 13:52:18 +02:00
$proj = new Project ( $db );
$proj -> fetch ( $object -> fk_project );
2019-11-07 12:59:59 +01:00
$morehtmlref .= $proj -> getNomUrl ();
2019-10-22 13:52:18 +02:00
} else {
2019-11-07 12:59:59 +01:00
$morehtmlref .= '' ;
2019-10-22 13:52:18 +02:00
}
}
}
2019-11-07 12:59:59 +01:00
$morehtmlref .= '</div>' ;
2019-10-22 13:52:18 +02:00
dol_banner_tab ( $object , 'ref' , $linkback , 1 , 'ref' , 'ref' , $morehtmlref );
print '<div class="fichecenter">' ;
print '<div class="fichehalfleft">' ;
print '<div class="underbanner clearboth"></div>' ;
2019-11-09 20:23:31 +01:00
print '<table class="border centpercent tableforfield">' . " \n " ;
2019-10-22 13:52:18 +02:00
// Common attributes
2019-11-09 20:23:31 +01:00
$keyforbreak = 'fk_warehouse' ;
2019-10-22 13:52:18 +02:00
unset ( $object -> fields [ 'fk_project' ]);
unset ( $object -> fields [ 'fk_soc' ]);
2019-11-07 12:59:59 +01:00
include DOL_DOCUMENT_ROOT . '/core/tpl/commonfields_view.tpl.php' ;
2019-10-22 13:52:18 +02:00
// Other attributes
2019-11-07 12:59:59 +01:00
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php' ;
2019-10-22 13:52:18 +02:00
print '</table>' ;
print '</div>' ;
print '</div>' ;
print '<div class="clearboth"></div>' ;
dol_fiche_end ();
2019-12-20 15:31:05 +01:00
2020-02-21 17:53:37 +01:00
if ( ! in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' )))
2020-01-02 22:05:35 +01:00
{
print '<div class="tabsAction">' ;
$parameters = array ();
// Note that $action and $object may be modified by hook
$reshook = $hookmanager -> executeHooks ( 'addMoreActionsButtons' , $parameters , $object , $action );
if ( empty ( $reshook )) {
2020-02-12 22:45:27 +01:00
// Validate
if ( $object -> status == $object :: STATUS_DRAFT )
{
if ( $permissiontoadd )
{
if ( empty ( $object -> table_element_line ) || ( is_array ( $object -> lines ) && count ( $object -> lines ) > 0 ))
{
print '<a class="butAction" href="' . $_SERVER [ 'PHP_SELF' ] . '?id=' . $object -> id . '&action=validate">' . $langs -> trans ( " Validate " ) . '</a>' ;
2020-05-21 15:05:19 +02:00
} else {
2020-02-12 22:45:27 +01:00
$langs -> load ( " errors " );
print '<a class="butActionRefused" href="" title="' . $langs -> trans ( " ErrorAddAtLeastOneLineFirst " ) . '">' . $langs -> trans ( " Validate " ) . '</a>' ;
}
}
}
2020-01-08 17:56:02 +01:00
// Consume or produce
2020-01-02 22:05:35 +01:00
if ( $object -> status == Mo :: STATUS_VALIDATED || $object -> status == Mo :: STATUS_INPROGRESS ) {
if ( $permissiontoproduce ) {
2020-01-08 17:56:02 +01:00
print '<a class="butAction" href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=consumeorproduce">' . $langs -> trans ( 'ConsumeOrProduce' ) . '</a>' ;
2020-01-02 22:05:35 +01:00
} else {
2020-01-08 17:56:02 +01:00
print '<a class="butActionRefused classfortooltip" href="#" title="' . $langs -> trans ( " NotEnoughPermissions " ) . '">' . $langs -> trans ( 'ConsumeOrProduce' ) . '</a>' ;
2020-01-02 22:05:35 +01:00
}
2020-01-07 19:08:35 +01:00
} elseif ( $object -> status == Mo :: STATUS_DRAFT ) {
2020-01-08 17:56:02 +01:00
print '<a class="butActionRefused classfortooltip" href="#" title="' . $langs -> trans ( " ValidateBefore " ) . '">' . $langs -> trans ( 'ConsumeOrProduce' ) . '</a>' ;
2019-12-20 15:31:05 +01:00
}
2020-01-02 22:05:35 +01:00
// ConsumeAndProduceAll
if ( $object -> status == Mo :: STATUS_VALIDATED || $object -> status == Mo :: STATUS_INPROGRESS ) {
if ( $permissiontoproduce ) {
print '<a class="butAction" href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=consumeandproduceall">' . $langs -> trans ( 'ConsumeAndProduceAll' ) . '</a>' ;
} else {
print '<a class="butActionRefused classfortooltip" href="#" title="' . $langs -> trans ( " NotEnoughPermissions " ) . '">' . $langs -> trans ( 'ConsumeAndProduceAll' ) . '</a>' ;
}
2020-01-07 19:08:35 +01:00
} elseif ( $object -> status == Mo :: STATUS_DRAFT ) {
2020-01-02 22:05:35 +01:00
print '<a class="butActionRefused classfortooltip" href="#" title="' . $langs -> trans ( " ValidateBefore " ) . '">' . $langs -> trans ( 'ConsumeAndProduceAll' ) . '</a>' ;
2019-12-20 15:31:05 +01:00
}
2020-01-07 19:08:35 +01:00
2020-02-11 16:51:38 +01:00
// Cancel - Reopen
if ( $permissiontoadd )
{
if ( $object -> status == $object :: STATUS_VALIDATED || $object -> status == $object :: STATUS_INPROGRESS )
{
2020-05-20 23:15:18 +02:00
// TODO If production is already > 1, show only close, else show cancel
print '<a class="butAction" href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=confirm_produced&confirm=yes">' . $langs -> trans ( " Close " ) . '</a>' . " \n " ;
2020-02-11 16:51:38 +01:00
print '<a class="butActionDelete" href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=confirm_close&confirm=yes">' . $langs -> trans ( " Cancel " ) . '</a>' . " \n " ;
}
if ( $object -> status == $object :: STATUS_CANCELED )
{
print '<a class="butAction" href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=confirm_reopen&confirm=yes">' . $langs -> trans ( " Re-Open " ) . '</a>' . " \n " ;
}
if ( $object -> status == $object :: STATUS_PRODUCED ) {
if ( $permissiontoproduce ) {
print '<a class="butAction" href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=confirm_reopen">' . $langs -> trans ( 'ReOpen' ) . '</a>' ;
} else {
print '<a class="butActionRefused classfortooltip" href="#" title="' . $langs -> trans ( " NotEnoughPermissions " ) . '">' . $langs -> trans ( 'ReOpen' ) . '</a>' ;
}
2020-01-07 19:08:35 +01:00
}
}
2019-12-20 15:31:05 +01:00
}
2020-01-02 22:05:35 +01:00
print '</div>' ;
2019-12-20 15:31:05 +01:00
}
2020-02-12 22:45:27 +01:00
if ( in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' , 'addconsumeline' )))
2020-01-02 22:05:35 +01:00
{
2020-06-08 23:12:45 +02:00
print '<form method="POST" action="' . $_SERVER [ " PHP_SELF " ] . '">' ;
2020-01-02 22:05:35 +01:00
print '<input type="hidden" name="token" value="' . newToken () . '">' ;
2020-01-03 15:01:14 +01:00
print '<input type="hidden" name="action" value="confirm_' . $action . '">' ;
2020-01-02 22:05:35 +01:00
print '<input type="hidden" name="backtopage" value="' . $backtopage . '">' ;
print '<input type="hidden" name="id" value="' . $id . '">' ;
2020-03-22 12:31:27 +01:00
// Note: closing form is add end of page
2020-01-02 22:05:35 +01:00
2020-02-12 22:45:27 +01:00
if ( in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) {
$defaultstockmovementlabel = GETPOST ( 'inventorylabel' , 'alphanohtml' ) ? GETPOST ( 'inventorylabel' , 'alphanohtml' ) : $langs -> trans ( " ProductionForRef " , $object -> ref );
//$defaultstockmovementcode = GETPOST('inventorycode', 'alphanohtml') ? GETPOST('inventorycode', 'alphanohtml') : $object->ref.'_'.dol_print_date(dol_now(), 'dayhourlog');
$defaultstockmovementcode = GETPOST ( 'inventorycode' , 'alphanohtml' ) ? GETPOST ( 'inventorycode' , 'alphanohtml' ) : $langs -> trans ( " ProductionForRef " , $object -> ref );
2020-06-08 23:12:45 +02:00
print '<div class="center' . ( in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' )) ? ' formconsumeproduce' : '' ) . '">' ;
2020-02-12 22:45:27 +01:00
print '<span class="opacitymedium hideonsmartphone">' . $langs -> trans ( " ConfirmProductionDesc " , $langs -> transnoentitiesnoconv ( " Confirm " )) . '<br></span>' ;
2020-06-25 01:07:30 +02:00
print '<span class="fieldrequired">' . $langs -> trans ( " InventoryCode " ) . ':</span> <input type="text" class="maxwidth200" name="inventorycode" value="' . $defaultstockmovementcode . '"> ' ;
print '<span class="clearbothonsmartphone"></span>' ;
print $langs -> trans ( " MovementLabel " ) . ': <input type="text" class="minwidth300" name="inventorylabel" value="' . $defaultstockmovementlabel . '"><br><br>' ;
2020-02-12 22:45:27 +01:00
print '<input type="checkbox" id="autoclose" name="autoclose" value="1"' . ( GETPOSTISSET ( 'inventorylabel' ) ? ( GETPOST ( 'autoclose' ) ? ' checked="checked"' : '' ) : ' checked="checked"' ) . '> <label for="autoclose">' . $langs -> trans ( " AutoCloseMO " ) . '</label><br>' ;
print '<input class="button" type="submit" value="' . $langs -> trans ( " Confirm " ) . '" name="confirm">' ;
print ' ' ;
print '<input class="button" type="submit" value="' . $langs -> trans ( " Cancel " ) . '" name="cancel">' ;
2020-06-08 23:12:45 +02:00
print '<br><br>' ;
2020-02-12 22:45:27 +01:00
print '</div>' ;
2020-06-08 23:12:45 +02:00
2020-02-12 22:45:27 +01:00
print '<br>' ;
}
2020-01-02 22:05:35 +01:00
}
2019-12-20 15:31:05 +01:00
2019-10-22 13:52:18 +02:00
/*
* Lines
*/
2020-01-08 19:04:00 +01:00
$collapse = 1 ;
2019-10-22 13:52:18 +02:00
2019-11-07 12:59:59 +01:00
if ( ! empty ( $object -> table_element_line ))
2019-10-22 13:52:18 +02:00
{
// Show object lines
2019-12-20 15:31:05 +01:00
//$result = $object->getLinesArray();
$object -> fetchLines ();
2019-10-22 13:52:18 +02:00
2019-12-20 15:31:05 +01:00
print '<div class="fichecenter">' ;
print '<div class="fichehalfleft">' ;
print '<div class="clearboth"></div>' ;
2020-02-12 22:45:27 +01:00
$newlinetext = '<a href="' . $_SERVER [ " PHP_SELF " ] . '?id=' . $object -> id . '&action=addconsumeline">' . $langs -> trans ( " AddNewConsumeLines " ) . '</a>' ;
print load_fiche_titre ( $langs -> trans ( 'Consumption' ), '' , '' , 0 , '' , '' , $newlinetext );
2019-12-09 00:06:51 +01:00
2019-10-22 13:52:18 +02:00
print '<div class="div-table-responsive-no-min">' ;
2020-04-26 23:52:23 +02:00
print '<table class="noborder noshadow centpercent nobottom">' ;
2019-12-09 00:06:51 +01:00
2019-12-20 15:31:05 +01:00
print '<tr class="liste_titre">' ;
print '<td>' . $langs -> trans ( " Product " ) . '</td>' ;
2020-01-08 19:04:00 +01:00
print '<td class="right">' . $langs -> trans ( " Qty " ) . '</td>' ;
print '<td class="right">' . $langs -> trans ( " QtyAlreadyConsumed " ) . '</td>' ;
2020-01-04 15:20:10 +01:00
print '<td>' ;
2020-01-08 19:04:00 +01:00
if ( $collapse || in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) print $langs -> trans ( " Warehouse " );
2020-01-04 15:20:10 +01:00
print '</td>' ;
2020-01-02 22:05:35 +01:00
if ( $conf -> productbatch -> enabled ) {
print '<td>' ;
2020-01-08 19:04:00 +01:00
if ( $collapse || in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) print $langs -> trans ( " Batch " );
2020-01-02 22:05:35 +01:00
print '</td>' ;
}
2019-12-20 15:31:05 +01:00
print '</tr>' ;
2019-12-09 00:06:51 +01:00
2020-02-12 22:45:27 +01:00
if ( $action == 'addconsumeline' ) {
2020-04-22 21:41:56 +02:00
print '<!-- Add line to consume -->' . " \n " ;
2020-02-12 22:45:27 +01:00
print '<tr class="liste_titre">' ;
print '<td>' ;
2020-02-20 17:44:03 +01:00
print $form -> select_produits ( '' , 'productidtoadd' , '' , 0 , 0 , - 1 , 2 , '' , 0 , array (), 0 , '1' , 0 , 'maxwidth300' );
2020-02-12 22:45:27 +01:00
print '</td>' ;
2020-03-22 17:06:59 +01:00
print '<td class="right"><input type="text" name="qtytoadd" value="1" class="width50 right"></td>' ;
2020-02-12 22:45:27 +01:00
print '<td class="right"></td>' ;
print '<td>' ;
2020-04-22 12:56:52 +02:00
print '<input type="submit" class="button buttongen" name="addconsumelinebutton" value="' . $langs -> trans ( " Add " ) . '">' ;
2020-02-12 22:45:27 +01:00
print '</td>' ;
if ( $conf -> productbatch -> enabled ) {
print '<td></td>' ;
}
print '</tr>' ;
}
2019-12-20 15:31:05 +01:00
if ( ! empty ( $object -> lines ))
{
2020-01-08 19:04:00 +01:00
$nblinetoconsume = 0 ;
2020-02-21 17:53:37 +01:00
foreach ( $object -> lines as $line ) {
2020-01-08 19:04:00 +01:00
if ( $line -> role == 'toconsume' ) {
$nblinetoconsume ++ ;
}
}
$nblinetoconsumecursor = 0 ;
2020-02-21 17:53:37 +01:00
foreach ( $object -> lines as $line ) {
2019-12-20 15:31:05 +01:00
if ( $line -> role == 'toconsume' ) {
2020-01-08 19:04:00 +01:00
$nblinetoconsumecursor ++ ;
2019-12-20 15:31:05 +01:00
$tmpproduct = new Product ( $db );
$tmpproduct -> fetch ( $line -> fk_product );
2020-01-02 22:05:35 +01:00
2020-01-07 19:08:35 +01:00
$arrayoflines = $object -> fetchLinesLinked ( 'consumed' , $line -> id );
2020-01-03 15:01:14 +01:00
$alreadyconsumed = 0 ;
2020-02-21 17:53:37 +01:00
foreach ( $arrayoflines as $line2 ) {
2020-01-07 19:08:35 +01:00
$alreadyconsumed += $line2 [ 'qty' ];
2020-01-03 15:01:14 +01:00
}
2020-01-02 22:05:35 +01:00
print '<tr>' ;
2019-12-20 15:31:05 +01:00
print '<td>' . $tmpproduct -> getNomUrl ( 1 ) . '</td>' ;
2020-07-08 18:09:35 +02:00
print '<td class="right nowraponall">' ;
2020-01-03 15:01:14 +01:00
$help = '' ;
2020-01-10 00:03:10 +01:00
if ( $line -> qty_frozen ) $help .= ( $help ? '<br>' : '' ) . '<strong>' . $langs -> trans ( " QuantityFrozen " ) . '</strong>: ' . yn ( 1 ) . ' (' . $langs -> trans ( " QuantityConsumedInvariable " ) . ')' ;
if ( $line -> disable_stock_change ) $help .= ( $help ? '<br>' : '' ) . '<strong>' . $langs -> trans ( " DisableStockChange " ) . '</strong>: ' . yn ( 1 ) . ' (' . (( $tmpproduct -> type == Product :: TYPE_SERVICE && empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES )) ? $langs -> trans ( " NoStockChangeOnServices " ) : $langs -> trans ( " DisableStockChangeHelp " )) . ')' ;
2020-01-03 15:01:14 +01:00
if ( $help ) {
2020-01-08 19:04:00 +01:00
print $form -> textwithpicto ( $line -> qty , $help , - 1 );
2020-01-03 15:01:14 +01:00
} else {
print $line -> qty ;
}
print '</td>' ;
2020-01-08 19:04:00 +01:00
print '<td class="right">' ;
2020-01-07 20:28:21 +01:00
if ( $alreadyconsumed ) {
2020-01-08 19:04:00 +01:00
print '<script>' ;
print ' jQuery ( document ) . ready ( function () {
2020-01-07 20:28:21 +01:00
jQuery ( " #expandtoproduce'. $line->id .' " ) . click ( function () {
console . log ( " Expand mrp_production line '. $line->id .' " );
2020-01-08 19:04:00 +01:00
jQuery ( " .expanddetail'. $line->id .' " ) . toggle (); ' ;
2020-01-13 12:30:48 +01:00
if ( $nblinetoconsume == $nblinetoconsumecursor ) { // If it is the last line
2020-01-08 19:04:00 +01:00
print 'if (jQuery("#tablelines").hasClass("nobottom")) { jQuery("#tablelines").removeClass("nobottom"); } else { jQuery("#tablelines").addClass("nobottom"); }' ;
}
print '
2020-01-07 20:28:21 +01:00
});
}); ' ;
2020-01-08 19:04:00 +01:00
print '</script>' ;
if ( empty ( $conf -> use_javascript_ajax )) print '<a href="' . $_SERVER [ " PHP_SELF " ] . '?collapse=' . $collapse . ',' . $line -> id . '">' ;
print img_picto ( $langs -> trans ( " ShowDetails " ), " chevron-down " , 'id="expandtoproduce' . $line -> id . '"' );
if ( empty ( $conf -> use_javascript_ajax )) print '</a>' ;
2020-01-13 12:30:48 +01:00
} else {
if ( $nblinetoconsume == $nblinetoconsumecursor ) { // If it is the last line
print '<script>jQuery("#tablelines").removeClass("nobottom");</script>' ;
}
2020-01-07 20:28:21 +01:00
}
2020-01-08 19:04:00 +01:00
print ' ' . $alreadyconsumed ;
print '</td>' ;
2020-02-21 17:53:37 +01:00
print '<td>' ; // Warehouse
2020-01-07 20:28:21 +01:00
print '</td>' ;
2020-01-02 22:05:35 +01:00
if ( $conf -> productbatch -> enabled ) {
2020-01-10 00:03:10 +01:00
print '<td></td>' ; // Lot
2020-01-02 22:05:35 +01:00
}
2019-12-20 15:31:05 +01:00
print '</tr>' ;
2020-01-02 22:05:35 +01:00
// Show detailed of already consumed with js code to collapse
2020-02-21 17:53:37 +01:00
foreach ( $arrayoflines as $line2 ) {
2020-01-08 19:04:00 +01:00
print '<tr class="expanddetail' . $line -> id . ' hideobject opacitylow">' ;
print '<td>' ;
print dol_print_date ( $line2 [ 'date' ], 'dayhour' );
print '</td>' ;
print '<td></td>' ;
print '<td class="right">' . $line2 [ 'qty' ] . '</td>' ;
2020-07-08 18:09:35 +02:00
print '<td class="tdoverflowmax150">' ;
2020-01-08 19:04:00 +01:00
if ( $line2 [ 'fk_warehouse' ] > 0 ) {
2020-03-22 17:06:59 +01:00
$result = $tmpwarehouse -> fetch ( $line2 [ 'fk_warehouse' ]);
if ( $result > 0 ) print $tmpwarehouse -> getNomUrl ( 1 );
2020-01-13 12:30:48 +01:00
}
print '</td>' ;
// Lot Batch
print '<td>' ;
if ( $line2 [ 'batch' ] != '' ) {
$tmpbatch -> fetch ( 0 , $line2 [ 'fk_product' ], $line2 [ 'batch' ]);
print $tmpbatch -> getNomUrl ( 1 );
2020-01-08 19:04:00 +01:00
}
print '</td>' ;
print '</tr>' ;
}
2020-01-02 22:05:35 +01:00
2020-01-08 17:56:02 +01:00
if ( in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) {
2020-01-03 15:01:14 +01:00
$i = 1 ;
2020-04-22 21:41:56 +02:00
print '<!-- Enter line to consume -->' . " \n " ;
2020-01-02 22:05:35 +01:00
print '<tr>' ;
print '<td>' . $langs -> trans ( " ToConsume " ) . '</td>' ;
2020-01-08 03:08:12 +01:00
$preselected = ( GETPOSTISSET ( 'qty-' . $line -> id . '-' . $i ) ? GETPOST ( 'qty-' . $line -> id . '-' . $i ) : max ( 0 , $line -> qty - $alreadyconsumed ));
2020-02-21 17:53:37 +01:00
if ( $action == 'consumeorproduce' && ! GETPOSTISSET ( 'qty-' . $line -> id . '-' . $i )) $preselected = 0 ;
2020-03-22 12:31:27 +01:00
print '<td class="right"><input type="text" class="width50 right" name="qty-' . $line -> id . '-' . $i . '" value="' . $preselected . '"></td>' ;
2020-01-02 22:05:35 +01:00
print '<td></td>' ;
print '<td>' ;
if ( $tmpproduct -> type == Product :: TYPE_PRODUCT || ! empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES )) {
2020-01-03 15:01:14 +01:00
if ( empty ( $line -> disable_stock_change )) {
2020-04-22 21:41:56 +02:00
$preselected = ( GETPOSTISSET ( 'idwarehouse-' . $line -> id . '-' . $i ) ? GETPOST ( 'idwarehouse-' . $line -> id . '-' . $i ) : ( $tmpproduct -> fk_default_warehouse > 0 ? $tmpproduct -> fk_default_warehouse : 'ifone' ));
print $formproduct -> selectWarehouses ( $preselected , 'idwarehouse-' . $line -> id . '-' . $i , '' , 1 , 0 , $line -> fk_product , '' , 1 , 0 , null , 'maxwidth300' );
2020-01-03 15:01:14 +01:00
} else {
print '<span class="opacitymedium">' . $langs -> trans ( " DisableStockChange " ) . '</span>' ;
}
} else {
print '<span class="opacitymedium">' . $langs -> trans ( " NoStockChangeOnServices " ) . '</span>' ;
2020-01-02 22:05:35 +01:00
}
2020-01-13 12:30:48 +01:00
// Lot / Batch
2020-01-02 22:05:35 +01:00
print '</td>' ;
if ( $conf -> productbatch -> enabled ) {
print '<td>' ;
if ( $tmpproduct -> status_batch ) {
2020-01-03 15:01:14 +01:00
$preselected = ( GETPOSTISSET ( 'batch-' . $line -> id . '-' . $i ) ? GETPOST ( 'batch-' . $line -> id . '-' . $i ) : '' );
print '<input type="text" class="width50" name="batch-' . $line -> id . '-' . $i . '" value="' . $preselected . '">' ;
2020-01-02 22:05:35 +01:00
}
print '</td>' ;
}
print '</tr>' ;
}
2019-12-20 15:31:05 +01:00
}
}
2019-10-22 13:52:18 +02:00
}
2019-12-20 15:31:05 +01:00
print '</table>' ;
print '</div>' ;
print '</div>' ;
print '<div class="fichehalfright">' ;
print '<div class="clearboth"></div>' ;
print load_fiche_titre ( $langs -> trans ( 'Production' ), '' , '' );
print '<div class="div-table-responsive-no-min">' ;
2020-01-08 19:04:00 +01:00
print '<table id="tablelinestoproduce" class="noborder noshadow nobottom centpercent">' ;
2019-12-20 15:31:05 +01:00
print '<tr class="liste_titre">' ;
print '<td>' . $langs -> trans ( " Product " ) . '</td>' ;
2020-01-08 19:04:00 +01:00
print '<td class="right">' . $langs -> trans ( " Qty " ) . '</td>' ;
print '<td class="right">' . $langs -> trans ( " QtyAlreadyProduced " ) . '</td>' ;
2020-01-04 15:20:10 +01:00
print '<td>' ;
2020-01-08 19:04:00 +01:00
if ( $collapse || in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) print $langs -> trans ( " Warehouse " );
2020-01-04 15:20:10 +01:00
print '</td>' ;
2020-01-02 22:05:35 +01:00
if ( $conf -> productbatch -> enabled ) {
print '<td>' ;
2020-01-08 19:04:00 +01:00
if ( $collapse || in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) print $langs -> trans ( " Batch " );
2020-01-02 22:05:35 +01:00
print '</td>' ;
2020-03-22 17:06:59 +01:00
print '<td></td>' ;
2020-01-02 22:05:35 +01:00
}
2019-12-20 15:31:05 +01:00
print '</tr>' ;
if ( ! empty ( $object -> lines ))
2019-10-22 13:52:18 +02:00
{
2020-01-08 19:04:00 +01:00
$nblinetoproduce = 0 ;
2020-02-21 17:53:37 +01:00
foreach ( $object -> lines as $line ) {
2020-01-08 19:04:00 +01:00
if ( $line -> role == 'toproduce' ) {
$nblinetoproduce ++ ;
}
}
$nblinetoproducecursor = 0 ;
2020-02-21 17:53:37 +01:00
foreach ( $object -> lines as $line ) {
2019-12-20 15:31:05 +01:00
if ( $line -> role == 'toproduce' ) {
2020-04-10 10:59:32 +02:00
$i = 1 ;
2020-03-22 17:06:59 +01:00
2020-01-08 19:04:00 +01:00
$nblinetoproducecursor ++ ;
2019-12-20 15:31:05 +01:00
$tmpproduct = new Product ( $db );
$tmpproduct -> fetch ( $line -> fk_product );
2020-01-03 15:01:14 +01:00
2020-01-07 19:08:35 +01:00
$arrayoflines = $object -> fetchLinesLinked ( 'produced' , $line -> id );
2020-01-03 15:01:14 +01:00
$alreadyproduced = 0 ;
2020-02-21 17:53:37 +01:00
foreach ( $arrayoflines as $line2 ) {
2020-01-07 19:08:35 +01:00
$alreadyproduced += $line2 [ 'qty' ];
2020-01-03 15:01:14 +01:00
}
2020-03-22 17:06:59 +01:00
$suffix = '_' . $line -> id ;
print '<!-- Line to dispatch ' . $suffix . ' -->' . " \n " ;
// hidden fields for js function
print '<input id="qty_ordered' . $suffix . '" type="hidden" value="' . $line -> qty . '">' ;
print '<input id="qty_dispatched' . $suffix . '" type="hidden" value="' . $alreadyproduced . '">' ;
2020-01-03 15:01:14 +01:00
print '<tr>' ;
2019-12-20 15:31:05 +01:00
print '<td>' . $tmpproduct -> getNomUrl ( 1 ) . '</td>' ;
2020-01-08 19:04:00 +01:00
print '<td class="right">' . $line -> qty . '</td>' ;
2020-07-08 18:09:35 +02:00
print '<td class="right nowraponall">' ;
2020-01-07 20:28:21 +01:00
if ( $alreadyproduced ) {
print '<script>' ;
print ' jQuery ( document ) . ready ( function () {
2020-01-08 19:04:00 +01:00
jQuery ( " #expandtoproduce'. $line->id .' " ) . click ( function () {
2020-01-07 20:28:21 +01:00
console . log ( " Expand mrp_production line '. $line->id .' " );
2020-01-08 19:04:00 +01:00
jQuery ( " .expanddetailtoproduce'. $line->id .' " ) . toggle (); ' ;
if ( $nblinetoproduce == $nblinetoproducecursor ) {
print 'if (jQuery("#tablelinestoproduce").hasClass("nobottom")) { jQuery("#tablelinestoproduce").removeClass("nobottom"); } else { jQuery("#tablelinestoproduce").addClass("nobottom"); }' ;
}
print '
2020-01-07 20:28:21 +01:00
});
}); ' ;
print '</script>' ;
if ( empty ( $conf -> use_javascript_ajax )) print '<a href="' . $_SERVER [ " PHP_SELF " ] . '?collapse=' . $collapse . ',' . $line -> id . '">' ;
2020-01-08 19:04:00 +01:00
print img_picto ( $langs -> trans ( " ShowDetails " ), " chevron-down " , 'id="expandtoproduce' . $line -> id . '"' );
2020-01-07 20:28:21 +01:00
if ( empty ( $conf -> use_javascript_ajax )) print '</a>' ;
}
2020-01-08 19:04:00 +01:00
print ' ' . $alreadyproduced ;
print '</td>' ;
2020-02-21 17:53:37 +01:00
print '<td>' ; // Warehouse
2020-01-07 20:28:21 +01:00
print '</td>' ;
2020-01-02 22:05:35 +01:00
if ( $conf -> productbatch -> enabled ) {
2020-01-10 00:03:10 +01:00
print '<td></td>' ; // Lot
2020-03-22 17:06:59 +01:00
print '<td></td>' ;
2020-01-02 22:05:35 +01:00
}
2019-12-20 15:31:05 +01:00
print '</tr>' ;
2020-01-08 19:04:00 +01:00
// Show detailed of already consumed with js code to collapse
2020-02-21 17:53:37 +01:00
foreach ( $arrayoflines as $line2 ) {
2020-01-08 19:04:00 +01:00
print '<tr class="expanddetailtoproduce' . $line -> id . ' hideobject opacitylow">' ;
print '<td>' ;
print dol_print_date ( $line2 [ 'date' ], 'dayhour' );
print '</td>' ;
print '<td></td>' ;
print '<td class="right">' . $line2 [ 'qty' ] . '</td>' ;
2020-07-08 18:09:35 +02:00
print '<td class="tdoverflowmax150">' ;
2020-01-08 19:04:00 +01:00
if ( $line2 [ 'fk_warehouse' ] > 0 ) {
2020-03-22 17:06:59 +01:00
$result = $tmpwarehouse -> fetch ( $line2 [ 'fk_warehouse' ]);
if ( $result > 0 ) print $tmpwarehouse -> getNomUrl ( 1 );
2020-01-13 12:30:48 +01:00
}
print '</td>' ;
2020-03-22 17:06:59 +01:00
if ( $conf -> productbatch -> enabled ) {
print '<td>' ;
if ( $line2 [ 'batch' ] != '' ) {
$tmpbatch -> fetch ( 0 , $line2 [ 'fk_product' ], $line2 [ 'batch' ]);
print $tmpbatch -> getNomUrl ( 1 );
}
print '</td>' ;
print '<td></td>' ;
2020-01-08 19:04:00 +01:00
}
print '</tr>' ;
}
2020-01-08 17:56:02 +01:00
if ( in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' ))) {
2020-03-22 17:06:59 +01:00
print '<tr name="batch_' . $line -> id . '_' . $i . '">' ;
2020-01-02 22:05:35 +01:00
print '<td>' . $langs -> trans ( " ToProduce " ) . '</td>' ;
2020-01-08 03:08:12 +01:00
$preselected = ( GETPOSTISSET ( 'qtytoproduce-' . $line -> id . '-' . $i ) ? GETPOST ( 'qtytoproduce-' . $line -> id . '-' . $i ) : max ( 0 , $line -> qty - $alreadyproduced ));
2020-02-21 17:53:37 +01:00
if ( $action == 'consumeorproduce' && ! GETPOSTISSET ( 'qtytoproduce-' . $line -> id . '-' . $i )) $preselected = 0 ;
2020-03-22 17:06:59 +01:00
print '<td class="right"><input type="text" class="width50 right" id="qtytoproduce-' . $line -> id . '-' . $i . '" name="qtytoproduce-' . $line -> id . '-' . $i . '" value="' . $preselected . '"></td>' ;
2020-01-02 22:05:35 +01:00
print '<td></td>' ;
print '<td>' ;
if ( $tmpproduct -> type == Product :: TYPE_PRODUCT || ! empty ( $conf -> global -> STOCK_SUPPORTS_SERVICES )) {
2020-01-03 15:01:14 +01:00
$preselected = ( GETPOSTISSET ( 'idwarehousetoproduce-' . $line -> id . '-' . $i ) ? GETPOST ( 'idwarehousetoproduce-' . $line -> id . '-' . $i ) : ( $object -> fk_warehouse > 0 ? $object -> fk_warehouse : 'ifone' ));
2020-04-22 21:41:56 +02:00
print $formproduct -> selectWarehouses ( $preselected , 'idwarehousetoproduce-' . $line -> id . '-' . $i , '' , 1 , 0 , $line -> fk_product , '' , 1 , 0 , null , 'maxwidth300 csswarehouse_' . $line -> id . '_' . $i );
2020-01-08 03:08:12 +01:00
} else {
print '<span class="opacitymedium">' . $langs -> trans ( " NoStockChangeOnServices " ) . '</span>' ;
2020-01-02 22:05:35 +01:00
}
print '</td>' ;
if ( $conf -> productbatch -> enabled ) {
print '<td>' ;
if ( $tmpproduct -> status_batch ) {
2020-01-03 15:01:14 +01:00
$preselected = ( GETPOSTISSET ( 'batchtoproduce-' . $line -> id . '-' . $i ) ? GETPOST ( 'batchtoproduce-' . $line -> id . '-' . $i ) : '' );
print '<input type="text" class="width50" name="batchtoproduce-' . $line -> id . '-' . $i . '" value="' . $preselected . '">' ;
2020-01-02 22:05:35 +01:00
}
print '</td>' ;
2020-03-22 17:06:59 +01:00
print '<td>' ;
if ( $tmpproduct -> status_batch ) {
$type = 'batch' ;
print img_picto ( $langs -> trans ( 'AddStockLocationLine' ), 'split.png' , 'class="splitbutton" onClick="addDispatchLine(' . $line -> id . ', \'' . $type . '\', \'qtymissing\')"' );
}
print '</td>' ;
2020-01-02 22:05:35 +01:00
}
print '</tr>' ;
}
2019-12-20 15:31:05 +01:00
}
}
2019-10-22 13:52:18 +02:00
}
2019-12-20 15:31:05 +01:00
print '</table>' ;
print '</div>' ;
print '</div>' ;
2019-10-22 13:52:18 +02:00
print '</div>' ;
}
2020-02-12 22:45:27 +01:00
if ( in_array ( $action , array ( 'consumeorproduce' , 'consumeandproduceall' , 'addconsumeline' )))
2019-10-22 13:52:18 +02:00
{
2020-01-02 22:05:35 +01:00
print " </form> \n " ;
2019-10-22 13:52:18 +02:00
}
}
// End of page
llxFooter ();
$db -> close ();