Commit b7fb9d65 authored by Henri Queneau's avatar Henri Queneau
Browse files

add files cdc

parent 6ba39688
# Guide de contribution à Maarch Capture
Tout d'abord, merci de prendre le temps de contribuer.
Voici un ensemble de lignes directrices pour contribuer à Maarch et ses produits, hébergés dans l'Organisation Maarch sur [Maarch GitLab](http://labs.maarch.org).
## Que dois-je savoir avant de commencer ?
### Contrat de contribution
Toute personne souhaitant contribuer à Maarch doit lire et signer notre [contrat de licence de contributeur](https://labs.maarch.org/maarch/MaarchCourrier/blob/master/CLA.md).
L'équipe Maarch est légalement interdite d'accepter les demandes de fusion des utilisateurs qui n'ont pas encore signé le CLA.
### A propos de Maarch
Les solutions Maarch sont des outils de gestion électronique de documents professionnel qui répondent nativement à la grande majorité des besoins en gestion opérationnelle des documents.
Ils sont publiés sous les termes de la licence gratuite et open source GNU / GPLv3. L'une des conséquences est que les logiciels Maarch sont abordables pour tout type d'organisation.
### Processus de gestion des contributions
Le succès de Maarch nous apporte de nombreux retours fonctionnels ou techniques de la part de sa communauté (utilisateurs, clients, partenaires, core team).
Maarch s'organise pour traiter au mieux ces demandes.
Selon les types de demandes ou contributions remontées, Maarch a mis en place les processus suivants :
#### Demande d'évolution
Toute demande FEAT doit être déclarée dans la forge, qu'elle soit finalement réalisée par un développeur de la core team Maarch ou un partenaire.
* Une FEAT doit être acceptée (ou refusée) avant de commencer son développement
* Comme il y a plusieurs manière d'adresser un même besoin, les développeurs discutent entre eux pour échanger sur le comment faire
#### Déclaration de bug
Tout BUG doit être déclaré et qualifié (notamment sur sa gravité) dans la forge.
* Un BUG doit être reproductible sur la version stable cible
* Si il y a une méthode de contournement temporaire possible (le temps de traiter proprement le bug), elle est indiquée dans la forge.
#### A propos de l'ingénierie logicielle
L'ingénierie logicielle Maarch est traitée depuis notre [gitlab](http://labs.maarch.org).
En voici les grands principes de fonctionnement :
##### Branche de développement
'develop' est la zone de jeu commune des développeurs de la core team Maarch :
* C'est ici qu'ils ajoutent leur code nouveau, expérimentent, suppriment le code inutile, explorent ensemble des pistes techniques et se challengent sur la bonne manière de faire.
* Bien évidement, tout code ajouté doit être accompagné de son test unitaire. N'y est donc intégré que du code relativement exploitable, utile au projet et aux autres développeurs.
* C'est une version non opérationnelle et non stable qui peut être modifiée plusieurs fois par heure.
* Cette branche ne préfigure pas d'une future version car tout peut y être remis en question à tout moment.
* Il peut y avoir un nombre illimité de branche créée à partir de celle-ci.
##### Master ou la future version
'master' est la release-candidate de la version future.
* La future version stable du produit se dessine donc dans le master. Elle est à tout moment opérationnelle, mais déclarée comme non-stable. Son code est une agrégation, sur la dernière version déclarée stable :
** du code nouveau/modifié de 'develop' déclaré comme "terminé et probablement stable" par les développeurs. On ne merge donc pas TOUT 'develop' mais seulement certaines parties validée.
** du code nouveau/modifié (et non totalement révolutionnaire) d'une commande client
** Toute demande de merge se fait par les développeurs et est acceptée (ou pas) par le "project master"
* Le lien des FEAT de la forge et GIT se donc dans le master.
* C'est sur cette branche qu'interviennent nos partenaires techniques pour les améliorations du produit (parce qu'on a validé la FEAT avec eux). Il faudra donc aussi les remonter dans 'develop' une fois accepté ici.
* C'est sur cette branche que se passent l'ensemble des tests unitaires et d'intégration.
##### Version stable
'v1.x' est la version opérationnelle et stable de Maarch Capture
* Son code représente un instant T dans 'master' qu'on a jugé prêt et stable pour déploiement chez les utilisateurs.
* À sa création, c'est donc une branche directement issue de 'master' sans rien d'autre.
* C'est cette version qui accueille les corrections de bugs et les mini-évolutions, y compris ceux issus de nos partenaires techniques sur ce qu'ils détectent et auront déclarés dans la forge.
* Tout bug corrigé ici est également déployé dans 'master' et, éventuellement si toujours pertinent, dans 'develop'.
* Cette branche est 'taguée' régulièrement pour indiquer à tous qu'il y a eu des corrections de bugs.
* C'est sur cette branche que sont passés l'ensemble des tests unitaires (créés dans 'develop'), d'intégration (créés dans 'master') et fonctionnels.
* Les montées de versions sont :
** Manuelle par Maarch pour passer d'une v1.x à une v1.y
## Comment je contribue ?
### Signaler des bugs
Cette section vous guide lors de la soumission d'un bogue pour Maarch.
En suivant ces directives, les responsables de la maintenance et la communauté comprennent votre rapport, reproduisent le comportement et trouvent des rapports connexes.
#### Avant de soumettre un bug
* Consultez la [FAQ](https://community.maarch.org/c/maarch-capture/f-a-q) sur notre site communautaire. Vous pourriez peut-être trouver la cause du problème et réparer vous-même les choses. Plus important encore, vérifiez si vous pouvez reproduire le problème dans la dernière version de Maarch.
* Déterminez dans quelle fonctionnalité posant problème doit être signalée.
* Effectuez une recherche rapide pour voir si le problème a déjà été signalé. Si c'est le cas, ajoutez un commentaire au problème existant au lieu d'ouvrir un nouveau.
Les bugs peuvent être soumis sur notre [Site communautaire](https://community.maarch.org/c/maarch-capture).
### Proposer des améliorations
Cette section vous guide lors de la soumission d'une suggestion d'amélioration pour les produits Maarch, incluant des fonctionnalités complètement nouvelles et des améliorations mineures aux fonctionnalités existantes.
En suivant ces directives, les responsables de la maintenance et la communauté comprennent votre suggestion et trouvent des suggestions connexes.
#### Avant de soumettre une amélioration
* Consultez [Community.maarch.org](http://community.maarch.org) ou [notre documentation](https://docs.maarch.org/) pour obtenir des conseils - vous pourriez découvrir que l'amélioration est déjà disponible. Plus important encore, vérifiez si vous utilisez la dernière version de Maarch Courrier.
* Effectuez une recherche rapide pour voir si l'amélioration a déjà été suggérée. Si c'est le cas, ajoutez un commentaire au ticket existant au lieu d'ouvrir un nouveau.
Les améliorations peuvent être soumises sur notre [Site communautaire](https://community.maarch.org/c/maarch-capture).
This diff is collapsed.
<?php
/******************************************************************************
**
** MAARCH CAPTURE
**
******************************************************************************/
echo
"********************************************************************************" . PHP_EOL .
"** Maarch Capture **" . PHP_EOL .
"** (c) since 2008 Maarch SAS **" . PHP_EOL .
"********************************************************************************" . PHP_EOL;
/******************************************************************************
** INIT
******************************************************************************/
set_time_limit(1800);
ini_set('max_execution_time', 1800);
ini_set('memory_limit', -1);
ini_set('mbstring.substitute_character', 'none');
set_include_path(get_include_path() . PATH_SEPARATOR . getcwd());
//set_error_handler('capture_error_handler');
define('MC_STATUS_NOT_STARTED', 1); # NotStarted
define('MC_STATUS_FAILED_ON_START', 2); # FailedOnStart
define('MC_STATUS_IN_PROGRESS', 3); # InProgress
define('MC_STATUS_ERROR', 4); # ErrorOccurred
define('MC_STATUS_STOPPED', 5); # StoppedByUser
define('MC_STATUS_COMPLETED', 6); # Completed
define('MC_STATUS_RETRYING', 7); # FailedOnStartRetrying
require_once "class/Workflow.php";
require_once "class/Batch.php";
require_once "class/Capture.php";
require_once "tools/log4php/Logger.php";
/******************************************************************************
** DEFINE COMMANDS AND ARGS
******************************************************************************/
require_once "Maarch_CLITools/ArgsParser.php";
$ArgsParser = new ArgsParser();
$CommandArgsParser = new ArgsParser();
# Commands
#*****************************************************************************
# init (BatchName [, WorkflowName, [Args...]])
# creates a new batch and initializes workflow with given workflow name or default workflow
$ArgsParser->add_command(
"init",
$aliases = array('i'),
$CommandArgsParser,
"Creates a new batch and initializes workflow with given workflow name or default workflow." . PHP_EOL
. " -BatchName : Name of batch configuration" . PHP_EOL
. " -WorkflowName : Name of workflow configuration to initialize" . PHP_EOL
);
# continue (BatchName, BatchId)
# loads an existing batch and continues process from next not completed
$ArgsParser->add_command(
"continue",
$aliases = array('c'),
$CommandArgsParser,
"Load an existing batch and continues workflow at given step name or next step." . PHP_EOL
. " -BatchName : Name of batch configuration" . PHP_EOL
. " -BatchId : Identifier of the batch" . PHP_EOL
);
# step (BatchName, BatchId, stepName)
# loads an existing batch and processes only given stepname
$ArgsParser->add_command(
"step",
$aliases = array('s'),
$CommandArgsParser,
"Load an existing batch and processes given step name." . PHP_EOL
. " -BatchName : Name of batch configuration" . PHP_EOL
. " -BatchId : Identifier of the batch" . PHP_EOL
. " -StepName : Nae of the step to process" . PHP_EOL
);
# Common arguments
#*****************************************************************************
# BatchName
$CommandArgsParser->add_arg(
"BatchName",
array(
"short" => 'b',
"long" => 'BatchName',
"default" => null,
"help" => "Batch configuration name",
"mandatory" => true
)
);
$CommandArgsParser->add_arg(
"ConfigName",
array(
"short" => 'c',
"long" => 'ConfigName',
"default" => 'Capture',
"help" => "Capture configuration name",
"mandatory" => false
)
);
/******************************************************************************
** PARSE COMMAND
******************************************************************************/
/*
return ['executable'] : name of this script
['positional'] : list of positional arguments
['command']
['command']['name'] : name of the command
['command']['opts']
['command']['opts']['executable']
['command']['opts']['positional']
['command']['opts']['xxxxxxxxxx'] :value of argument xxxxxxxxxx
*/
try {
$instrArgs = $ArgsParser->parse_args($argv);
} catch (MissingArgumentError $e) {
die($e->getMessage());
}
#echo "MaarchCapture instruction: " . print_r($instrArgs,true) . PHP_EOL;
#******************************************************************************
# CREATE OR LOAD BATCH
#******************************************************************************
$command = $instrArgs['command']['name'];
$BatchName = $instrArgs['command']['opts']['BatchName'];
$ConfigName = $instrArgs['command']['opts']['ConfigName'];
switch($command) {
case 'init':
echo "Initialize new Capture process..." . PHP_EOL;
# Add optional WorkflowName for creation
$CommandArgsParser->add_arg(
"WorkflowName",
array(
"short" => 'w',
"long" => 'WorkflowName',
"default" => null,
"help" => "Workflow name",
"mandatory" => false
)
);
/******************************************************************************
** PARSE COMMAND + DEFAULT ARGS
******************************************************************************/
try {
$commandArgs = $ArgsParser->parse_args($argv);
} catch (MissingArgumentError $e) {
die($e->getMessage());
}
/******************************************************************************
** LOAD CAPTURE APPLICATION
******************************************************************************/
echo "Instanciate new Capture processor..." . PHP_EOL;
if (file_exists("config/".$ConfigName.".xml")) {
$Capture = new Capture($ConfigName);
} else {
die($ConfigName." not found !". PHP_EOL);
}
# Store in session for modules that will acces through requests
$_SESSION['capture'] = $Capture;
$BatchId = false;
echo "Create new batch '$BatchName'..." . PHP_EOL;
$BatchId = $Capture->createBatch($BatchName);
if (!$BatchId) {
die();
}
echo "Batch created with id '$BatchId'" . PHP_EOL;
if (isset($commandArgs['command']['opts']['WorkflowName'])) {
$WorkflowName = $commandArgs['command']['opts']['WorkflowName'];
} else {
$WorkflowName = $Capture->defaultWorkflow();
}
echo "Initialize workflow '$WorkflowName'..." . PHP_EOL;
$WorkflowId = $Capture->initWorkflow($WorkflowName);
echo "Workflow initialized with id '$WorkflowId'" . PHP_EOL;
echo "Get first workflow step name..." . PHP_EOL;
$StepName = $Capture->nextStep();
echo "Next step name is '$StepName'" . PHP_EOL;
break;
case 'continue':
echo "Continue Capture process..." . PHP_EOL;
# Add required BatchId for load/process
$CommandArgsParser->add_arg(
"BatchId",
array(
"short" => 'i',
"long" => 'BatchId',
"default" => null,
"help" => "Batch identifier",
"mandatory" => true
)
);
/******************************************************************************
** PARSE COMMAND + DEFAULT ARGS
******************************************************************************/
try {
$commandArgs = $ArgsParser->parse_args($argv);
} catch (MissingArgumentError $e) {
die($e->getMessage());
}
/******************************************************************************
** LOAD CAPTURE APPLICATION
******************************************************************************/
echo "Instanciate new Capture processor..." . PHP_EOL;
if (file_exists("config/".$ConfigName.".xml")) {
$Capture = new Capture($ConfigName);
} else {
die($ConfigName." not found !". PHP_EOL);
}
# Store in session for modules that will acces through requests
$_SESSION['capture'] = $Capture;
#echo "MaarchCapture continue: " . print_r($commandArgs,true) . PHP_EOL;
$BatchId = $commandArgs['command']['opts']['BatchId'];
echo "Load batch '$BatchName' with id '$BatchId'..." . PHP_EOL;
$Batch = $Capture->loadBatch($BatchName, $BatchId);
echo "Batch loaded" . PHP_EOL;
echo "Load workflow..." . PHP_EOL;
$Workflow = $Capture->loadWorkflow();
echo "Workflow '".$Workflow->name."' loaded" . PHP_EOL;
if($Workflow->status == MC_STATUS_COMPLETED)
$Capture->endWorkflow();
echo "Get workflow next step name..." . PHP_EOL;
$StepName = $Capture->nextStep();
if(!$StepName)
$Capture->endWorkflow();
echo "Next step name is '$StepName'" . PHP_EOL;
break;
case 'step':
# Add required BatchId for load/process
$CommandArgsParser->add_arg(
"BatchId",
array(
"short" => 'i',
"long" => 'BatchId',
"default" => null,
"help" => "Batch identifier",
"mandatory" => true
)
);
# Add optional StepName
$CommandArgsParser->add_arg(
"StepName",
array(
"short" => 's',
"long" => 'StepName',
"default" => null,
"help" => "Workflow Step name",
"mandatory" => true
)
);
/******************************************************************************
** PARSE COMMAND + DEFAULT ARGS
******************************************************************************/
try {
$commandArgs = $ArgsParser->parse_args($argv);
} catch (MissingArgumentError $e) {
die($e->getMessage());
}
$BatchId = $commandArgs['command']['opts']['BatchId'];
$StepName = $commandArgs['command']['opts']['StepName'];
$Capture->loadBatch($BatchName, $BatchId);
$Capture->loadWorkflow();
$Capture->loadStepConfig($StepName);
break;
default:
die(
"MaarchCapture syntax : " . PHP_EOL
." init " . PHP_EOL
." -BatchName [name of a batch configuration)" . PHP_EOL
." -WorkflowName [name of a batch configuration]"
. PHP_EOL
." continue " . PHP_EOL
." -BatchName [name of a batch configuration]" . PHP_EOL
." -BatchId [identifier of a batch configuration]" . PHP_EOL
. PHP_EOL
." step " . PHP_EOL
." -BatchName [name of a batch configuration]" . PHP_EOL
." -BatchId [identifier of a batch configuration]" . PHP_EOL
." -StepName [name of a step in workflow]" . PHP_EOL
);
}
$inputNames = $Capture->getStepInputs($StepName);
echo "MaarchCapture step inputs: " . print_r($inputNames, true) . PHP_EOL;
foreach ($inputNames as $i => $inputName) {
# Add optional Step Input
$CommandArgsParser->add_arg(
$inputName,
array(
"short" => "A" . $i,
"long" => $inputName,
"default" => null,
"help" => "Workflow step input " . $inputName,
"mandatory" => false
)
);
}
/******************************************************************************
** PARSE COMMAND + DEFAULT ARGS + STEP ARGS
******************************************************************************/
try {
$stepArgs = $ArgsParser->parse_args($argv);
} catch (MissingArgumentError $e) {
die($e->getMessage());
}
echo "MaarchCapture step: " . print_r($stepArgs, true) . PHP_EOL;
$inputArgs = array();
foreach ($inputNames as $i => $inputName) {
if (isset($stepArgs['command']['opts'][$inputName])) {
$inputArgs[$inputName] = $stepArgs['command']['opts'][$inputName];
}
}
$Result = $Capture->processWorkflow($inputArgs);
/******************************************************************************
** ERROR HANDLER
******************************************************************************/
/*function capture_error_handler(
$errno,
$errstr,
$errfile=false,
$errline=false,
$errcontext=array()
) {
$errorlvl = 0;
switch ($errno) {
case E_NOTICE:
case E_USER_NOTICE:
$errmsg = "Notice";
$errorlvl = 0;
break;
case E_WARNING:
case E_USER_WARNING:
$errmsg = "Warning";
$errorlvl = 1;
break;
case E_DEPRECATED:
case E_USER_DEPRECATED:
$errmsg = "Deprecated";
$errorlvl = 1;
break;
case E_STRICT:
$errmsg = "Strict";
$errorlvl = 1;
break;
case E_ERROR:
case E_USER_ERROR:
default:
$errmsg = "Error";
$errorlvl = 2;
break;
}
$errmsg .= " : " . $errstr;
if($errfile)
$errmsg .= ' in ' . $errfile;
if($errline)
$errmsg .= ' on line ' . $errline;
if($errcontext)
$errmsg .= "\n" . print_r($errcontext,true);
if($Capture = $GLOBALS['MaarchCapture']) {
if($Batch = $Capture->Batch) {
$Batch->logEvent(
$errmsg,
$errorlvl,
'Maarch Capture Error Handler'
);
if($errorlvl > 1)
$Batch->error();
}
}
throw new Exception($errmsg);
}*/
?>
<?php
include_once "tools/services/PhpMailer.php";
function object2array($object)
{
$return = NULL;
if (is_array($object)) {
foreach ($object as $key => $value) {
$return[$key] = object2array($value);
}
} else {
if (is_object($object)) {
$var = get_object_vars($object);
if ($var) {
foreach ($var as $key => $value) {
$return[$key] = ($key && !$value) ? NULL : object2array($value);
}
} else {
return $object;
}
} else {
return $object;
}
}
return $return;
}
// Load config
$mailParam = simplexml_load_file('config/Mailer.xml');
$mailParam = object2array($mailParam);
$aArgsClass = [];
$aArgs['pathToLib'] = 'tools/PHPMailer/PHPMailerAutoload.php';
$theParam = $mailParam;
$theParam['mailer_class'] = 'Sendmail_PhpMailer_Service';
$mailer = new $theParam['mailer_class']($aArgsClass);
//smtp params
$aArgsSmtpParams = [];
$aArgsSmtpParams['smtp_host'] = $theParam['smtp_host'];
$aArgsSmtpParams['smtp_port'] = $theParam['smtp_port'];
$aArgsSmtpParams['domain'] = $theParam['domain'];
$aArgsSmtpParams['smtp_auth'] = (boolean) $theParam['smtp_auth'];
$aArgsSmtpParams['smtp_user'] = $theParam['smtp_user'];
$aArgsSmtpParams['smtp_password'] = $theParam['smtp_password'];
$aArgsSmtpParams['smtp_secure'] = $theParam['smtp_secure'];
foreach ($theParam['ssl_options'] as $key => $value) {
if ($value == 'false') {
$theParam['ssl_options'][$key] = false;
} elseif ($value == 'true') {
$theParam['ssl_options'][$key] = true;
}
}
//var_dump($theParam['ssl_options']);exit;
$mailer->setSMTPParams($aArgsSmtpParams);
if (isset($theParam['ssl_options'])) {
//smtp options for ssl
$mailer->setSSLOptions($theParam['ssl_options']);
}
$aArgsMailerType['mailerType'] = $theParam['type'];
$mailer->setMailerType($aArgsMailerType);
//smtp params
$aArgsSignedEmailsParams = [];
if (
(boolean) $theParam['signed_email']['enabled'] &&
$theParam['signed_email']['enabled'] <> 'false'
) {
$aArgsSignedEmailsParams['enabled'] = true;
$aArgsSignedEmailsParams['certificate_path'] = $theParam['signed_email']['certificate_path'];
$aArgsSignedEmailsParams['private_key_path'] = $theParam['signed_email']['private_key_path'];
$aArgsSignedEmailsParams['secret_private_key_password'] = $theParam['signed_email']['secret_private_key_password'];
$aArgsSignedEmailsParams['cert_chain_path'] = $theParam['signed_email']['cert_chain_path'];
} else {
$aArgsSignedEmailsParams['enabled']= false;
}
$aArgsFrom['from'] = $theParam['mailfrom'];
//setFrom
$mailer->setFrom($aArgsFrom);
$body = 'Error : <br/><br/>' . $message
. '<br/><br/>See the batch directory errors for more details : <br/><br/>'
. $batchInfos->directory . ' <br/>';
//setReplyTo
$aArgsReplyTo['replyTo'] = $theParam['mailto'];
$mailer->setReplyTo($aArgsReplyTo);
//--> Set the return path
$aArgsReturnPath['returnPath'] = $userInfo['mail'];
$mailer->setReturnPath($aArgsReturnPath);
//--> To
$to = [
'mail' => $theParam['mailto']
];
//--> Set subject
$aArgsSubj['subject'] = 'Error with MaarchCapture';
$mailer->setSubject($aArgsSubj);
$body = '<html><body>' . $body . '</body></html>';
$aArgsBody['body'] = [
[
'htmlContent' => $body,
'textContent' => '',
'isHTML' => true,
],