New: Add hooks for project card
This commit is contained in:
parent
7bfbc4cbf3
commit
5923a754d1
@ -71,10 +71,36 @@ $date_end=dol_mktime(0,0,0,GETPOST('projectendmonth','int'),GETPOST('projectendd
|
|||||||
* Actions
|
* Actions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Cancel
|
$parameters=array('id'=>$socid, 'objcanvas'=>$objcanvas);
|
||||||
if (GETPOST("cancel") && ! empty($backtopage))
|
$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
|
||||||
|
$error=$hookmanager->error; $errors=array_merge($errors, (array) $hookmanager->errors);
|
||||||
|
|
||||||
|
if (empty($reshook))
|
||||||
{
|
{
|
||||||
if (GETPOST("comefromclone")==1)
|
|
||||||
|
// Cancel
|
||||||
|
if (GETPOST("cancel") && ! empty($backtopage))
|
||||||
|
{
|
||||||
|
if (GETPOST("comefromclone")==1)
|
||||||
|
{
|
||||||
|
$result=$object->delete($user);
|
||||||
|
if ($result > 0)
|
||||||
|
{
|
||||||
|
header("Location: index.php");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dol_syslog($object->error,LOG_DEBUG);
|
||||||
|
$mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
header("Location: ".$backtopage);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if cancel and come from clone then delete the cloned project
|
||||||
|
if (GETPOST("cancel") && (GETPOST("comefromclone")==1))
|
||||||
{
|
{
|
||||||
$result=$object->delete($user);
|
$result=$object->delete($user);
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
@ -88,273 +114,255 @@ if (GETPOST("cancel") && ! empty($backtopage))
|
|||||||
$mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
|
$mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
header("Location: ".$backtopage);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if cancel and come from clone then delete the cloned project
|
if ($action == 'add' && $user->rights->projet->creer)
|
||||||
if (GETPOST("cancel") && (GETPOST("comefromclone")==1))
|
|
||||||
{
|
|
||||||
$result=$object->delete($user);
|
|
||||||
if ($result > 0)
|
|
||||||
{
|
|
||||||
header("Location: index.php");
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dol_syslog($object->error,LOG_DEBUG);
|
|
||||||
$mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($action == 'add' && $user->rights->projet->creer)
|
|
||||||
{
|
|
||||||
$error=0;
|
|
||||||
if (empty($_POST["ref"]))
|
|
||||||
{
|
|
||||||
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Ref")).'</div>';
|
|
||||||
$error++;
|
|
||||||
}
|
|
||||||
if (empty($_POST["title"]))
|
|
||||||
{
|
|
||||||
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Label")).'</div>';
|
|
||||||
$error++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $error)
|
|
||||||
{
|
|
||||||
$error=0;
|
|
||||||
|
|
||||||
$db->begin();
|
|
||||||
|
|
||||||
$object->ref = GETPOST('ref','alpha');
|
|
||||||
$object->title = GETPOST('title'); // Do not use 'alpha' here, we want field as it is
|
|
||||||
$object->socid = GETPOST('socid','int');
|
|
||||||
$object->description = GETPOST('description'); // Do not use 'alpha' here, we want field as it is
|
|
||||||
$object->public = GETPOST('public','alpha');
|
|
||||||
$object->datec=dol_now();
|
|
||||||
$object->date_start=$date_start;
|
|
||||||
$object->date_end=$date_end;
|
|
||||||
|
|
||||||
// Fill array 'array_options' with data from add form
|
|
||||||
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
|
||||||
|
|
||||||
$result = $object->create($user);
|
|
||||||
if ($result > 0)
|
|
||||||
{
|
|
||||||
// Add myself as project leader
|
|
||||||
$result = $object->add_contact($user->id, 'PROJECTLEADER', 'internal');
|
|
||||||
if ($result < 0)
|
|
||||||
{
|
|
||||||
$langs->load("errors");
|
|
||||||
$mesg='<div class="error">'.$langs->trans($object->error).'</div>';
|
|
||||||
$error++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$langs->load("errors");
|
|
||||||
$mesg='<div class="error">'.$langs->trans($object->error).'</div>';
|
|
||||||
$error++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $error)
|
|
||||||
{
|
|
||||||
$db->commit();
|
|
||||||
|
|
||||||
header("Location:fiche.php?id=".$object->id);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$db->rollback();
|
|
||||||
|
|
||||||
$action = 'create';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$action = 'create';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer)
|
|
||||||
{
|
|
||||||
$error=0;
|
|
||||||
|
|
||||||
if (empty($ref))
|
|
||||||
{
|
|
||||||
$error++;
|
|
||||||
//$_GET["id"]=$_POST["id"]; // On retourne sur la fiche projet
|
|
||||||
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Ref")).'</div>';
|
|
||||||
}
|
|
||||||
if (empty($_POST["title"]))
|
|
||||||
{
|
|
||||||
$error++;
|
|
||||||
//$_GET["id"]=$_POST["id"]; // On retourne sur la fiche projet
|
|
||||||
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Label")).'</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
$db->begin();
|
|
||||||
|
|
||||||
if (! $error)
|
|
||||||
{
|
|
||||||
$object->oldcopy = dol_clone($object);
|
|
||||||
|
|
||||||
$old_start_date = $object->date_start;
|
|
||||||
|
|
||||||
$object->ref = GETPOST('ref','alpha');
|
|
||||||
$object->title = GETPOST('title'); // Do not use 'alpha' here, we want field as it is
|
|
||||||
$object->socid = GETPOST('socid','int');
|
|
||||||
$object->description = GETPOST('description'); // Do not use 'alpha' here, we want field as it is
|
|
||||||
$object->public = GETPOST('public','alpha');
|
|
||||||
$object->date_start = empty($_POST["project"])?'':$date_start;
|
|
||||||
$object->date_end = empty($_POST["projectend"])?'':$date_end;
|
|
||||||
|
|
||||||
// Fill array 'array_options' with data from add form
|
|
||||||
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
|
||||||
if ($ret < 0)
|
|
||||||
{
|
|
||||||
$error++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $error)
|
|
||||||
{
|
|
||||||
$result=$object->update($user);
|
|
||||||
if ($result < 0)
|
|
||||||
{
|
|
||||||
$error++;
|
|
||||||
setEventMessage($object->errors,'errors');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! $error)
|
|
||||||
{
|
|
||||||
if (GETPOST("reportdate") && ($object->date_start!=$old_start_date))
|
|
||||||
{
|
|
||||||
$result=$object->shiftTaskDate($old_start_date);
|
|
||||||
if ($result < 0)
|
|
||||||
{
|
|
||||||
$error++;
|
|
||||||
$mesg='<div class="error">'.$langs->trans("ErrorShiftTaskDate").':'.$object->error.'</div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($error)
|
|
||||||
{
|
|
||||||
$db->rollback();
|
|
||||||
$action='edit';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
$db->commit();
|
$error=0;
|
||||||
|
if (empty($_POST["ref"]))
|
||||||
|
{
|
||||||
|
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Ref")).'</div>';
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
if (empty($_POST["title"]))
|
||||||
|
{
|
||||||
|
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Label")).'</div>';
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
if (GETPOST('socid','int') > 0) $object->societe->fetch(GETPOST('socid','int'));
|
if (! $error)
|
||||||
else unset($object->societe);
|
{
|
||||||
}
|
$error=0;
|
||||||
}
|
|
||||||
|
|
||||||
// Build doc
|
$db->begin();
|
||||||
if ($action == 'builddoc' && $user->rights->projet->creer)
|
|
||||||
{
|
|
||||||
// Save last template used to generate document
|
|
||||||
if (GETPOST('model')) $object->setDocModel($user, GETPOST('model','alpha'));
|
|
||||||
|
|
||||||
$outputlangs = $langs;
|
$object->ref = GETPOST('ref','alpha');
|
||||||
if (GETPOST('lang_id'))
|
$object->title = GETPOST('title'); // Do not use 'alpha' here, we want field as it is
|
||||||
{
|
$object->socid = GETPOST('socid','int');
|
||||||
$outputlangs = new Translate("",$conf);
|
$object->description = GETPOST('description'); // Do not use 'alpha' here, we want field as it is
|
||||||
$outputlangs->setDefaultLang(GETPOST('lang_id'));
|
$object->public = GETPOST('public','alpha');
|
||||||
}
|
$object->datec=dol_now();
|
||||||
$result=project_pdf_create($db, $object, $object->modelpdf, $outputlangs);
|
$object->date_start=$date_start;
|
||||||
if ($result <= 0)
|
$object->date_end=$date_end;
|
||||||
{
|
|
||||||
dol_print_error($db,$result);
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete file in doc form
|
// Fill array 'array_options' with data from add form
|
||||||
if ($action == 'remove_file' && $user->rights->projet->creer)
|
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
||||||
{
|
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
|
||||||
|
|
||||||
if ($object->id > 0)
|
$result = $object->create($user);
|
||||||
{
|
if ($result > 0)
|
||||||
$langs->load("other");
|
{
|
||||||
$upload_dir = $conf->projet->dir_output . "/";
|
// Add myself as project leader
|
||||||
$file = $upload_dir . '/' . GETPOST('file');
|
$result = $object->add_contact($user->id, 'PROJECTLEADER', 'internal');
|
||||||
$ret=dol_delete_file($file);
|
if ($result < 0)
|
||||||
if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile')));
|
{
|
||||||
else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors');
|
$langs->load("errors");
|
||||||
}
|
$mesg='<div class="error">'.$langs->trans($object->error).'</div>';
|
||||||
}
|
$error++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$langs->load("errors");
|
||||||
|
$mesg='<div class="error">'.$langs->trans($object->error).'</div>';
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $error)
|
||||||
|
{
|
||||||
|
$db->commit();
|
||||||
|
|
||||||
|
header("Location:fiche.php?id=".$object->id);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$db->rollback();
|
||||||
|
|
||||||
|
$action = 'create';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$action = 'create';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($action == 'update' && ! $_POST["cancel"] && $user->rights->projet->creer)
|
||||||
|
{
|
||||||
|
$error=0;
|
||||||
|
|
||||||
|
if (empty($ref))
|
||||||
|
{
|
||||||
|
$error++;
|
||||||
|
//$_GET["id"]=$_POST["id"]; // On retourne sur la fiche projet
|
||||||
|
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Ref")).'</div>';
|
||||||
|
}
|
||||||
|
if (empty($_POST["title"]))
|
||||||
|
{
|
||||||
|
$error++;
|
||||||
|
//$_GET["id"]=$_POST["id"]; // On retourne sur la fiche projet
|
||||||
|
$mesg='<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Label")).'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$db->begin();
|
||||||
|
|
||||||
|
if (! $error)
|
||||||
|
{
|
||||||
|
$object->oldcopy = dol_clone($object);
|
||||||
|
|
||||||
|
$old_start_date = $object->date_start;
|
||||||
|
|
||||||
|
$object->ref = GETPOST('ref','alpha');
|
||||||
|
$object->title = GETPOST('title'); // Do not use 'alpha' here, we want field as it is
|
||||||
|
$object->socid = GETPOST('socid','int');
|
||||||
|
$object->description = GETPOST('description'); // Do not use 'alpha' here, we want field as it is
|
||||||
|
$object->public = GETPOST('public','alpha');
|
||||||
|
$object->date_start = empty($_POST["project"])?'':$date_start;
|
||||||
|
$object->date_end = empty($_POST["projectend"])?'':$date_end;
|
||||||
|
|
||||||
|
// Fill array 'array_options' with data from add form
|
||||||
|
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
|
||||||
|
if ($ret < 0)
|
||||||
|
{
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $error)
|
||||||
|
{
|
||||||
|
$result=$object->update($user);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
$error++;
|
||||||
|
setEventMessage($object->errors,'errors');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $error)
|
||||||
|
{
|
||||||
|
if (GETPOST("reportdate") && ($object->date_start!=$old_start_date))
|
||||||
|
{
|
||||||
|
$result=$object->shiftTaskDate($old_start_date);
|
||||||
|
if ($result < 0)
|
||||||
|
{
|
||||||
|
$error++;
|
||||||
|
$mesg='<div class="error">'.$langs->trans("ErrorShiftTaskDate").':'.$object->error.'</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($error)
|
||||||
|
{
|
||||||
|
$db->rollback();
|
||||||
|
$action='edit';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$db->commit();
|
||||||
|
|
||||||
|
if (GETPOST('socid','int') > 0) $object->societe->fetch(GETPOST('socid','int'));
|
||||||
|
else unset($object->societe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build doc
|
||||||
|
if ($action == 'builddoc' && $user->rights->projet->creer)
|
||||||
|
{
|
||||||
|
// Save last template used to generate document
|
||||||
|
if (GETPOST('model')) $object->setDocModel($user, GETPOST('model','alpha'));
|
||||||
|
|
||||||
|
$outputlangs = $langs;
|
||||||
|
if (GETPOST('lang_id'))
|
||||||
|
{
|
||||||
|
$outputlangs = new Translate("",$conf);
|
||||||
|
$outputlangs->setDefaultLang(GETPOST('lang_id'));
|
||||||
|
}
|
||||||
|
$result=project_pdf_create($db, $object, $object->modelpdf, $outputlangs);
|
||||||
|
if ($result <= 0)
|
||||||
|
{
|
||||||
|
dol_print_error($db,$result);
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete file in doc form
|
||||||
|
if ($action == 'remove_file' && $user->rights->projet->creer)
|
||||||
|
{
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||||
|
|
||||||
|
if ($object->id > 0)
|
||||||
|
{
|
||||||
|
$langs->load("other");
|
||||||
|
$upload_dir = $conf->projet->dir_output . "/";
|
||||||
|
$file = $upload_dir . '/' . GETPOST('file');
|
||||||
|
$ret=dol_delete_file($file);
|
||||||
|
if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile')));
|
||||||
|
else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($action == 'confirm_validate' && GETPOST('confirm') == 'yes')
|
if ($action == 'confirm_validate' && GETPOST('confirm') == 'yes')
|
||||||
{
|
{
|
||||||
$result = $object->setValid($user);
|
$result = $object->setValid($user);
|
||||||
if ($result <= 0)
|
if ($result <= 0)
|
||||||
{
|
{
|
||||||
$mesg='<div class="error">'.$object->error.'</div>';
|
$mesg='<div class="error">'.$object->error.'</div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($action == 'confirm_close' && GETPOST('confirm') == 'yes')
|
if ($action == 'confirm_close' && GETPOST('confirm') == 'yes')
|
||||||
{
|
{
|
||||||
$result = $object->setClose($user);
|
$result = $object->setClose($user);
|
||||||
if ($result <= 0)
|
if ($result <= 0)
|
||||||
{
|
{
|
||||||
$mesg='<div class="error">'.$object->error.'</div>';
|
$mesg='<div class="error">'.$object->error.'</div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($action == 'confirm_reopen' && GETPOST('confirm') == 'yes')
|
if ($action == 'confirm_reopen' && GETPOST('confirm') == 'yes')
|
||||||
{
|
{
|
||||||
$result = $object->setValid($user);
|
$result = $object->setValid($user);
|
||||||
if ($result <= 0)
|
if ($result <= 0)
|
||||||
{
|
{
|
||||||
$mesg='<div class="error">'.$object->error.'</div>';
|
$mesg='<div class="error">'.$object->error.'</div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($action == 'confirm_delete' && GETPOST("confirm") == "yes" && $user->rights->projet->supprimer)
|
if ($action == 'confirm_delete' && GETPOST("confirm") == "yes" && $user->rights->projet->supprimer)
|
||||||
{
|
{
|
||||||
$object->fetch($id);
|
$object->fetch($id);
|
||||||
$result=$object->delete($user);
|
$result=$object->delete($user);
|
||||||
if ($result > 0)
|
if ($result > 0)
|
||||||
{
|
{
|
||||||
header("Location: index.php");
|
header("Location: index.php");
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dol_syslog($object->error,LOG_DEBUG);
|
dol_syslog($object->error,LOG_DEBUG);
|
||||||
$mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
|
$mesg='<div class="error">'.$langs->trans("CantRemoveProject").'</div>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($action == 'confirm_clone' && $user->rights->projet->creer && GETPOST('confirm') == 'yes')
|
if ($action == 'confirm_clone' && $user->rights->projet->creer && GETPOST('confirm') == 'yes')
|
||||||
{
|
{
|
||||||
$clone_contacts=GETPOST('clone_contacts')?1:0;
|
$clone_contacts=GETPOST('clone_contacts')?1:0;
|
||||||
$clone_tasks=GETPOST('clone_tasks')?1:0;
|
$clone_tasks=GETPOST('clone_tasks')?1:0;
|
||||||
$clone_project_files = GETPOST('clone_project_files') ? 1 : 0;
|
$clone_project_files = GETPOST('clone_project_files') ? 1 : 0;
|
||||||
$clone_task_files = GETPOST('clone_task_files') ? 1 : 0;
|
$clone_task_files = GETPOST('clone_task_files') ? 1 : 0;
|
||||||
$clone_notes=GETPOST('clone_notes')?1:0;
|
$clone_notes=GETPOST('clone_notes')?1:0;
|
||||||
$result=$object->createFromClone($object->id,$clone_contacts,$clone_tasks,$clone_project_files,$clone_task_files,$clone_notes);
|
$result=$object->createFromClone($object->id,$clone_contacts,$clone_tasks,$clone_project_files,$clone_task_files,$clone_notes);
|
||||||
if ($result <= 0)
|
if ($result <= 0)
|
||||||
{
|
{
|
||||||
$mesg='<div class="error">'.$object->error.'</div>';
|
$mesg='<div class="error">'.$object->error.'</div>';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$object->fetch($result); // Load new object
|
$object->fetch($result); // Load new object
|
||||||
$action='edit';
|
$action='edit';
|
||||||
$comefromclone=true;
|
$comefromclone=true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -768,6 +776,11 @@ else
|
|||||||
|
|
||||||
print '</td></tr></table>';
|
print '</td></tr></table>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hook to add more things on page
|
||||||
|
$parameters=array();
|
||||||
|
$reshook=$hookmanager->executeHooks('mainCardTabAddMore',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
llxFooter();
|
llxFooter();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user