diff --git a/database/factories/DynaformFactory.php b/database/factories/DynaformFactory.php index c790e5fda..a229a3db5 100644 --- a/database/factories/DynaformFactory.php +++ b/database/factories/DynaformFactory.php @@ -4,16 +4,18 @@ * Model factory for a dynaform. */ use Faker\Generator as Faker; +use ProcessMaker\Model\Dynaform; +use ProcessMaker\Model\Process; -$factory->define(\ProcessMaker\Model\Dynaform::class, function(Faker $faker) { +$factory->define(Dynaform::class, function(Faker $faker) { $date = $faker->dateTime(); return [ 'DYN_UID' => G::generateUniqueID(), - 'DYN_ID' => '', - 'DYN_TITLE' => '', - 'DYN_DESCRIPTION' => '', + 'DYN_ID' => $faker->unique()->numberBetween(1, 10000), + 'DYN_TITLE' => $faker->sentence(2), + 'DYN_DESCRIPTION' => $faker->sentence(5), 'PRO_UID' => function() { - $process = factory(\ProcessMaker\Model\Process::class)->create(); + $process = factory(Process::class)->create(); return $process->PRO_UID; }, 'DYN_TYPE' => 'xmlform', diff --git a/database/factories/InputDocumentFactory.php b/database/factories/InputDocumentFactory.php new file mode 100644 index 000000000..54481b00b --- /dev/null +++ b/database/factories/InputDocumentFactory.php @@ -0,0 +1,30 @@ +define(InputDocument::class, function(Faker $faker) { + return [ + 'INP_DOC_UID' => G::generateUniqueID(), + 'INP_DOC_ID' => $faker->unique()->numberBetween(1, 10000), + 'PRO_UID' => function() { + $process = factory(Process::class)->create(); + return $process->PRO_UID; + }, + 'INP_DOC_TITLE' => $faker->sentence(2), + 'INP_DOC_DESCRIPTION' => $faker->sentence(10), + 'INP_DOC_FORM_NEEDED' => 'VIRTUAL', + 'INP_DOC_ORIGINAL' => 'ORIGINAL', + 'INP_DOC_PUBLISHED' => 'PRIVATE', + 'INP_DOC_VERSIONING' => 0, + 'INP_DOC_DESTINATION_PATH' => '', + 'INP_DOC_TAGS' => 'INPUT', + 'INP_DOC_TYPE_FILE' => '.*', + 'INP_DOC_MAX_FILESIZE' => 0, + 'INP_DOC_MAX_FILESIZE_UNIT' => 'KB' + ]; +}); diff --git a/database/factories/OutputDocumentFactory.php b/database/factories/OutputDocumentFactory.php new file mode 100644 index 000000000..65efb66ea --- /dev/null +++ b/database/factories/OutputDocumentFactory.php @@ -0,0 +1,43 @@ +define(OutputDocument::class, function(Faker $faker) { + $date = $faker->dateTime(); + return [ + 'OUT_DOC_UID' => G::generateUniqueID(), + 'OUT_DOC_ID' => $faker->unique()->numberBetween(1, 10000), + 'OUT_DOC_TITLE' => $faker->sentence(2), + 'OUT_DOC_DESCRIPTION' => $faker->sentence(10), + 'OUT_DOC_FILENAME' => $faker->sentence(2), + 'OUT_DOC_TEMPLATE' => '', + 'PRO_UID' => function() { + $process = factory(Process::class)->create(); + return $process->PRO_UID; + }, + 'OUT_DOC_REPORT_GENERATOR' => 'TCPDF', + 'OUT_DOC_LANDSCAPE' => 0, + 'OUT_DOC_MEDIA' => 'Letter', + 'OUT_DOC_LEFT_MARGIN' => 20, + 'OUT_DOC_RIGHT_MARGIN' => 20, + 'OUT_DOC_TOP_MARGIN' => 20, + 'OUT_DOC_BOTTOM_MARGIN' => 20, + 'OUT_DOC_GENERATE' => 'BOTH', + 'OUT_DOC_TYPE' => 'HTML', + 'OUT_DOC_CURRENT_REVISION' => 0, + 'OUT_DOC_FIELD_MAPPING' => '', + 'OUT_DOC_VERSIONING' => 1, + 'OUT_DOC_DESTINATION_PATH' => '', + 'OUT_DOC_TAGS' => '', + 'OUT_DOC_PDF_SECURITY_ENABLED' => 0, + 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD' => '', + 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD' => '', + 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => '', + 'OUT_DOC_OPEN_TYPE' => 1 + ]; +}); diff --git a/gulliver/system/class.g.php b/gulliver/system/class.g.php index 60207b1be..319fe85f7 100644 --- a/gulliver/system/class.g.php +++ b/gulliver/system/class.g.php @@ -1639,7 +1639,7 @@ class G * @param string $sqlString The string to be escaped * @param string $DBEngine Target DBMS */ - public function sqlEscape($sqlString, $DBEngine = DB_ADAPTER) + public static function sqlEscape($sqlString, $DBEngine = DB_ADAPTER) { $DBEngine = DB_ADAPTER; switch ($DBEngine) { @@ -1748,12 +1748,12 @@ class G } //Non-quoted if (($match[1][$r][0] == '#') && (isset($result[$match[2][$r][0]]))) { - $__textoEval .= G::replaceDataField($result[$match[2][$r][0]], $result); + $__textoEval .= $result[$match[2][$r][0]]; continue; } //Non-quoted = if (($match[1][$r][0] == '=') && (isset($result[$match[2][$r][0]]))) { - $__textoEval .= G::replaceDataField($result[$match[2][$r][0]], $result); + $__textoEval .= $result[$match[2][$r][0]]; continue; } //Objects attributes diff --git a/tests/unit/gulliver/system/ReplaceDataFieldTest.php b/tests/unit/gulliver/system/ReplaceDataFieldTest.php new file mode 100644 index 000000000..231859f93 --- /dev/null +++ b/tests/unit/gulliver/system/ReplaceDataFieldTest.php @@ -0,0 +1,96 @@ + + +
+ + +THIS IS ONLY A TEST OF THE VARIABLE @#var_supplierEmail
+ + '; + + $result = [ + 'var_supplierEmail' => 'asa@qq.fds', + 'var_supplierEmail_label' => 'asa@qq.fds', + ]; + + $dbEngine = 'mysql'; + + // Replace variables in the string + $stringToCheck = G::replaceDataField($string, $result, $dbEngine); + + // Assert the @qq is not being set as an empty value + $this->assertRegExp("/asa@qq.fds/", $stringToCheck); + + // Testing with a "@qstring" value + $result = [ + 'var_supplierEmail' => '@qstring', + 'var_supplierEmail_label' => '@qstring', + ]; + + $dbEngine = 'mysql'; + + // Replace variables in the string + $stringToCheck = G::replaceDataField($string, $result, $dbEngine); + + // Assert the @qstring is not being set as an empty value + $this->assertRegExp("/@qstring/", $stringToCheck); + } + + /** + * Check that the value of "@q" followed by a string is not being set as empty when using "@=" to identify a variable + * + * @test + * @covers G::replaceDataField + */ + public function it_should_not_set_empty_when_calling_a_variable_with_equals_symbol() + { + $string = ' + + + + +THIS IS ONLY A TEST OF THE VARIABLE @=var_supplierEmail
+ + '; + + $result = [ + 'var_supplierEmail' => 'asa@qq.fds', + 'var_supplierEmail_label' => 'asa@qq.fds', + ]; + + $dbEngine = 'mysql'; + + // Replace variables in the string + $stringToCheck = G::replaceDataField($string, $result, $dbEngine); + + // Assert the @qq is not being set as an empty value + $this->assertRegExp("/asa@qq.fds/", $stringToCheck); + + // Testing with a "@qstring" value + $result = [ + 'var_supplierEmail' => '@qstring', + 'var_supplierEmail_label' => '@qstring', + ]; + + $dbEngine = 'mysql'; + + // Replace variables in the string + $stringToCheck = G::replaceDataField($string, $result, $dbEngine); + + // Assert the @qstring is not being set as an empty value + $this->assertRegExp("/@qstring/", $stringToCheck); + } +} diff --git a/tests/unit/workflow/engine/classes/ProcessesTest.php b/tests/unit/workflow/engine/classes/ProcessesTest.php new file mode 100644 index 000000000..52882c952 --- /dev/null +++ b/tests/unit/workflow/engine/classes/ProcessesTest.php @@ -0,0 +1,419 @@ +create()->first(); + $proUid = $process->PRO_UID; + + $dynaforms = factory(Dynaform::class, 6) + ->create([ + 'PRO_UID' => $proUid + ]) + ->sortBy('DYN_UID') + ->values(); + + //test with parameter false + $expected = $dynaforms->toArray(); + + $processes = new Processes(); + $actual = $processes->getDynaformRows($proUid, false); + $this->sortArrayByColumn($actual, 'DYN_UID'); + + $this->assertEquals($expected, $actual); + + //by default the method getDynaformRows removed DYN_ID column + $dynaforms->transform(function($item, $key) { + unset($item->DYN_ID); + return $item; + }); + + //test with parameter default + $expected = $dynaforms->toArray(); + + $processes = new Processes(); + $actual = $processes->getDynaformRows($proUid); + $this->sortArrayByColumn($actual, 'DYN_UID'); + + $this->assertEquals($expected, $actual); + + //test with parameter true + $expected = $dynaforms->toArray(); + + $processes = new Processes(); + $actual = $processes->getDynaformRows($proUid, true); + $this->sortArrayByColumn($actual, 'DYN_UID'); + + $this->assertEquals($expected, $actual); + } + + /** + * This check if the returned input documents are correct with the different + * parameters. + * @test + * @covers \Processes::getInputRows() + */ + public function it_should_return_input_documents() + { + $process = factory(Process::class)->create()->first(); + $proUid = $process->PRO_UID; + + $inputDocument = factory(InputDocument::class, 6) + ->create([ + 'PRO_UID' => $proUid + ]) + ->sortBy('INP_DOC_UID') + ->values(); + + //test with parameter false + $expected = $inputDocument->toArray(); + + $processes = new Processes(); + $actual = $processes->getInputRows($proUid, false); + $this->sortArrayByColumn($actual, 'INP_DOC_UID'); + + $this->assertEquals($expected, $actual); + + //by default the mnethod getInputRows removed INP_DOC_ID column + $inputDocument->transform(function($item, $key) { + unset($item->INP_DOC_ID); + return $item; + }); + + //test with parameter default + $expected = $inputDocument->toArray(); + + $processes = new Processes(); + $actual = $processes->getInputRows($proUid); + $this->sortArrayByColumn($actual, 'INP_DOC_UID'); + + $this->assertEquals($expected, $actual); + + //test with the parameter true + $expected = $inputDocument->toArray(); + + $processes = new Processes(); + $actual = $processes->getInputRows($proUid, true); + $this->sortArrayByColumn($actual, 'INP_DOC_UID'); + + $this->assertEquals($expected, $actual); + } + + /** + * This checks fi the returned output documents are correct with the differect + * parameters. + * @test + * @covers Processes::getOutputRows() + */ + public function it_should_return_output_documents() + { + $process = factory(Process::class)->create()->first(); + $proUid = $process->PRO_UID; + + $outputDocument = factory(OutputDocument::class, 6) + ->create([ + 'PRO_UID' => $proUid + ]) + ->sortBy('OUT_DOC_UID') + ->values(); + + //test with parameter false + $expected = $outputDocument->toArray(); + + $processes = new Processes(); + $actual = $processes->getOutputRows($proUid, false); + $this->sortArrayByColumn($actual, 'OUT_DOC_UID'); + + $this->assertEquals($expected, $actual); + + //by default the method getOutoutRows removed OUT_DOC_ID column + $outputDocument->transform(function($item, $key) { + unset($item->OUT_DOC_ID); + return $item; + }); + + //test with parameter default + $expected = $outputDocument->toArray(); + + $processes = new Processes(); + $actual = $processes->getOutputRows($proUid); + $this->sortArrayByColumn($actual, 'OUT_DOC_UID'); + + $this->assertEquals($expected, $actual); + + //test with parameter true + $expected = $outputDocument->toArray(); + + $processes = new Processes(); + $actual = $processes->getOutputRows($proUid, true); + $this->sortArrayByColumn($actual, 'OUT_DOC_UID'); + + $this->assertEquals($expected, $actual); + } + + /** + * This checks if the dynaforms structure is saved with the different parameters. + * @test + * @covers Processes::createDynaformRows() + */ + public function it_sholud_create_dynaform() + { + $faker = Factory::create(); + $date = $faker->datetime(); + $proUid = G::generateUniqueID(); + $expected = [ + [ + 'DYN_ID' => $faker->unique()->numberBetween(1, 10000000), + 'DYN_UID' => G::generateUniqueID(), + 'DYN_TITLE' => $faker->sentence(2), + 'DYN_DESCRIPTION' => $faker->sentence(5), + 'PRO_UID' => $proUid, + 'DYN_TYPE' => 'xmlform', + 'DYN_FILENAME' => '', + 'DYN_CONTENT' => '', + 'DYN_LABEL' => '', + 'DYN_VERSION' => 2, + 'DYN_UPDATE_DATE' => $date->format('Y-m-d H:i:s'), + '__DYN_ID_UPDATE__' => false, + ], + [ + 'DYN_ID' => $faker->unique()->numberBetween(1, 10000000), + 'DYN_UID' => G::generateUniqueID(), + 'DYN_TITLE' => $faker->sentence(2), + 'DYN_DESCRIPTION' => $faker->sentence(5), + 'PRO_UID' => $proUid, + 'DYN_TYPE' => 'xmlform', + 'DYN_FILENAME' => '', + 'DYN_CONTENT' => '', + 'DYN_LABEL' => '', + 'DYN_VERSION' => 2, + 'DYN_UPDATE_DATE' => $date->format('Y-m-d H:i:s'), + '__DYN_ID_UPDATE__' => false, + ], + ]; + $this->sortArrayByColumn($expected, 'DYN_UID'); + + $processes = new Processes(); + $processes->createDynaformRows($expected); + foreach ($expected as &$value) { + ksort($value); + unset($value['__DYN_ID_UPDATE__']); + } + + $dynaforms = Dynaform::getByProUid($proUid) + ->sortBy('DYN_UID') + ->values(); + $dynaforms->transform(function($item, $key) { + return (array) $item; + }); + $actual = $dynaforms->toArray(); + foreach ($actual as $value) { + ksort($value); + } + + $this->assertEquals($expected, $actual); + } + + /** + * This checks if the input documents structure is saved with the different + * parameters. + * @test + * @covers Processes::createInputRows() + */ + public function it_should_create_input_document() + { + $faker = Factory::create(); + $date = $faker->datetime(); + $proUid = G::generateUniqueID(); + $expected = [ + [ + 'INP_DOC_UID' => G::generateUniqueID(), + 'INP_DOC_ID' => $faker->unique()->numberBetween(1, 10000), + 'PRO_UID' => $proUid, + 'INP_DOC_TITLE' => $faker->sentence(2), + 'INP_DOC_DESCRIPTION' => $faker->sentence(10), + 'INP_DOC_FORM_NEEDED' => 'VIRTUAL', + 'INP_DOC_ORIGINAL' => 'ORIGINAL', + 'INP_DOC_PUBLISHED' => 'PRIVATE', + 'INP_DOC_VERSIONING' => 0, + 'INP_DOC_DESTINATION_PATH' => '', + 'INP_DOC_TAGS' => 'INPUT', + 'INP_DOC_TYPE_FILE' => '.*', + 'INP_DOC_MAX_FILESIZE' => 0, + 'INP_DOC_MAX_FILESIZE_UNIT' => 'KB', + '__INP_DOC_ID_UPDATE__' => false, + ], + [ + 'INP_DOC_UID' => G::generateUniqueID(), + 'INP_DOC_ID' => $faker->unique()->numberBetween(1, 10000), + 'PRO_UID' => $proUid, + 'INP_DOC_TITLE' => $faker->sentence(2), + 'INP_DOC_DESCRIPTION' => $faker->sentence(10), + 'INP_DOC_FORM_NEEDED' => 'VIRTUAL', + 'INP_DOC_ORIGINAL' => 'ORIGINAL', + 'INP_DOC_PUBLISHED' => 'PRIVATE', + 'INP_DOC_VERSIONING' => 0, + 'INP_DOC_DESTINATION_PATH' => '', + 'INP_DOC_TAGS' => 'INPUT', + 'INP_DOC_TYPE_FILE' => '.*', + 'INP_DOC_MAX_FILESIZE' => 0, + 'INP_DOC_MAX_FILESIZE_UNIT' => 'KB', + '__INP_DOC_ID_UPDATE__' => false, + ], + ]; + $this->sortArrayByColumn($expected, 'INP_DOC_UID'); + + $processes = new Processes(); + $processes->createInputRows($expected); + foreach ($expected as &$value) { + ksort($value); + unset($value['__INP_DOC_ID_UPDATE__']); + } + + $inputDocuments = InputDocument::getByProUid($proUid) + ->sortBy('INP_DOC_UID') + ->values(); + $inputDocuments->transform(function($item, $key) { + return $item->attributesToArray(); + }); + $actual = $inputDocuments->toArray(); + foreach ($actual as &$value) { + ksort($value); + } + + $this->assertEquals($expected, $actual); + } + + /** + * This checks if the output documents structure is saved with the different + * parameters. + * @test + * @covers Processes::createOutputRows() + */ + public function it_should_create_output_document() + { + $faker = Factory::create(); + $date = $faker->datetime(); + $proUid = G::generateUniqueID(); + $expected = [ + [ + 'OUT_DOC_UID' => G::generateUniqueID(), + 'OUT_DOC_ID' => $faker->unique()->numberBetween(1, 10000), + 'OUT_DOC_TITLE' => $faker->sentence(2), + 'OUT_DOC_DESCRIPTION' => $faker->sentence(10), + 'OUT_DOC_FILENAME' => $faker->sentence(2), + 'OUT_DOC_TEMPLATE' => '', + 'PRO_UID' => $proUid, + 'OUT_DOC_REPORT_GENERATOR' => 'TCPDF', + 'OUT_DOC_LANDSCAPE' => 0, + 'OUT_DOC_MEDIA' => 'Letter', + 'OUT_DOC_LEFT_MARGIN' => 20, + 'OUT_DOC_RIGHT_MARGIN' => 20, + 'OUT_DOC_TOP_MARGIN' => 20, + 'OUT_DOC_BOTTOM_MARGIN' => 20, + 'OUT_DOC_GENERATE' => 'BOTH', + 'OUT_DOC_TYPE' => 'HTML', + 'OUT_DOC_CURRENT_REVISION' => 0, + 'OUT_DOC_FIELD_MAPPING' => '', + 'OUT_DOC_VERSIONING' => 1, + 'OUT_DOC_DESTINATION_PATH' => '', + 'OUT_DOC_TAGS' => '', + 'OUT_DOC_PDF_SECURITY_ENABLED' => 0, + 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD' => '', + 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD' => '', + 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => '', + 'OUT_DOC_OPEN_TYPE' => 1, + '__OUT_DOC_ID_UPDATE__' => false, + ], + [ + 'OUT_DOC_UID' => G::generateUniqueID(), + 'OUT_DOC_ID' => $faker->unique()->numberBetween(1, 10000), + 'OUT_DOC_TITLE' => $faker->sentence(2), + 'OUT_DOC_DESCRIPTION' => $faker->sentence(10), + 'OUT_DOC_FILENAME' => $faker->sentence(2), + 'OUT_DOC_TEMPLATE' => '', + 'PRO_UID' => $proUid, + 'OUT_DOC_REPORT_GENERATOR' => 'TCPDF', + 'OUT_DOC_LANDSCAPE' => 0, + 'OUT_DOC_MEDIA' => 'Letter', + 'OUT_DOC_LEFT_MARGIN' => 20, + 'OUT_DOC_RIGHT_MARGIN' => 20, + 'OUT_DOC_TOP_MARGIN' => 20, + 'OUT_DOC_BOTTOM_MARGIN' => 20, + 'OUT_DOC_GENERATE' => 'BOTH', + 'OUT_DOC_TYPE' => 'HTML', + 'OUT_DOC_CURRENT_REVISION' => 0, + 'OUT_DOC_FIELD_MAPPING' => '', + 'OUT_DOC_VERSIONING' => 1, + 'OUT_DOC_DESTINATION_PATH' => '', + 'OUT_DOC_TAGS' => '', + 'OUT_DOC_PDF_SECURITY_ENABLED' => 0, + 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD' => '', + 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD' => '', + 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => '', + 'OUT_DOC_OPEN_TYPE' => 1, + '__OUT_DOC_ID_UPDATE__' => false, + ] + ]; + $this->sortArrayByColumn($expected, 'OUT_DOC_UID'); + + $processes = new Processes(); + $processes->createOutputRows($expected); + foreach ($expected as &$value) { + ksort($value); + unset($value['__OUT_DOC_ID_UPDATE__']); + } + + $outputDocuments = OutputDocument::getByProUid($proUid) + ->sortBy('OUT_DOC_UID') + ->values(); + $outputDocuments->transform(function($item, $key) { + return $item->attributestoArray(); + }); + $actual = $outputDocuments->toArray(); + foreach ($actual as &$value) { + ksort($value); + } + + $this->assertEquals($expected, $actual); + } +} diff --git a/tests/unit/workflow/engine/classes/SpoolRunTest.php b/tests/unit/workflow/engine/classes/SpoolRunTest.php new file mode 100644 index 000000000..6f3f728c1 --- /dev/null +++ b/tests/unit/workflow/engine/classes/SpoolRunTest.php @@ -0,0 +1,68 @@ +setData( + G::generateUniqueID(), + $faker->words(3, true), + $faker->companyEmail, + $faker->freeEmail, + $faker->text(), + $faker->dateTime()->format('Y-m-d H:i:s'), + $faker->companyEmail, + $faker->freeEmail + ); + + // Build the "to", "cc" an "bcc" values + $spoolRun->runHandleEnvelopeTo(); + + // Set a second set of data + $spoolRun->setData( + G::generateUniqueID(), + $faker->words(3, true), + $faker->companyEmail, + $faker->freeEmail, + $faker->text(), + $faker->dateTime()->format('Y-m-d H:i:s'), + $faker->companyEmail, + $faker->freeEmail + ); + + // Build the "to", "cc" an "bcc" values + $spoolRun->runHandleEnvelopeTo(); + + // Get data to check + $fileData = $spoolRun->getFileData(); + + // Asserts + $this->assertCount(1, $fileData['envelope_to']); + $this->assertCount(1, $fileData['envelope_cc']); + $this->assertCount(1, $fileData['envelope_bcc']); + } +} diff --git a/workflow/engine/classes/Processes.php b/workflow/engine/classes/Processes.php index 43cdc8ce9..6811c6546 100644 --- a/workflow/engine/classes/Processes.php +++ b/workflow/engine/classes/Processes.php @@ -1919,14 +1919,19 @@ class Processes /** - * Gets Input Documents Rows from aProcess. + * Gets Input Documents Rows from process. * * @param string $proUid + * @param boolean $unsetInpDocId * * @return array * @throws Exception + * + * @see Processes::getWorkflowData() + * @see ProcessMaker\BusinessModel\Migrator\InputDocumentsMigrator::export() + * @see ProcessMaker\Importer\Importer::saveCurrentProcess() */ - public function getInputRows($proUid) + public function getInputRows($proUid, $unsetInpDocId = true) { try { $inputList = []; @@ -1938,7 +1943,9 @@ class Processes while ($row = $dataset->getRow()) { $input = new InputDocument(); $infoInput = $input->load($row['INP_DOC_UID']); - unset($infoInput['INP_DOC_ID']); + if ($unsetInpDocId === true) { + unset($infoInput['INP_DOC_ID']); + } $inputList[] = $infoInput; $dataset->next(); } @@ -1956,6 +1963,10 @@ class Processes * * @return void * @throws Exception + * + * @see Processes::createProcessPropertiesFromData() + * @see Processes::updateProcessFromData() + * @see ProcessMaker\BusinessModel\Migrator\InputDocumentsMigrator::import() */ public function createInputRows($input) { @@ -1970,11 +1981,15 @@ class Processes //Get the INP_DOC_ID column $dataSet = BasePeer::doSelect($criteria, $con); $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); - if ($dataSet->next()) { - $inputInfo = $dataSet->getRow(); - $row['INP_DOC_ID'] = $inputInfo['INP_DOC_ID']; + if (isset($row["__INP_DOC_ID_UPDATE__"]) && $row["__INP_DOC_ID_UPDATE__"] === false) { + unset($row["__INP_DOC_ID_UPDATE__"]); } else { - $row['INP_DOC_ID'] = null; + if ($dataSet->next()) { + $inputInfo = $dataSet->getRow(); + $row['INP_DOC_ID'] = $inputInfo['INP_DOC_ID']; + } else { + $row['INP_DOC_ID'] = null; + } } BasePeer::doDelete($criteria, $con); //Prepare the insert @@ -2102,11 +2117,16 @@ class Processes * Gets the Output Documents Rows from a Process. * * @param string $proUid + * @param boolean $unsetOutDocId * * @return array * @throws Exception + * + * @see Processes::getWorkflowData() + * @see ProcessMaker\BusinessModel\Migrator\OutputDocumentsMigrator::export() + * @see ProcessMaker\Importer\Importer::saveCurrentProcess() */ - public function getOutputRows($proUid) + public function getOutputRows($proUid, $unsetOutDocId = true) { try { $outputList = []; @@ -2118,7 +2138,9 @@ class Processes while ($row = $dataset->getRow()) { $output = new OutputDocument(); $infoOutput = $output->Load($row['OUT_DOC_UID']); - unset($infoOutput['OUT_DOC_ID']); + if ($unsetOutDocId === true) { + unset($infoOutput['OUT_DOC_ID']); + } $outputList[] = $infoOutput; $dataset->next(); } @@ -2136,6 +2158,10 @@ class Processes * * @return void * @throws Exception + * + * @see Processes::createProcessPropertiesFromData() + * @see Processes::updateProcessFromData() + * @see ProcessMaker\BusinessModel\Migrator\OutputDocumentsMigrator::import() */ public function createOutputRows($output) { @@ -2150,11 +2176,15 @@ class Processes //Get the OUT_DOC_ID column $dataSet = BasePeer::doSelect($criteria, $con); $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); - if ($dataSet->next()) { - $outputInfo = $dataSet->getRow(); - $row['OUT_DOC_ID'] = $outputInfo['OUT_DOC_ID']; + if (isset($row["__OUT_DOC_ID_UPDATE__"]) && $row["__OUT_DOC_ID_UPDATE__"] === false) { + unset($row["__OUT_DOC_ID_UPDATE__"]); } else { - $row['OUT_DOC_ID'] = null; + if ($dataSet->next()) { + $outputInfo = $dataSet->getRow(); + $row['OUT_DOC_ID'] = $outputInfo['OUT_DOC_ID']; + } else { + $row['OUT_DOC_ID'] = null; + } } BasePeer::doDelete($criteria, $con); //Prepare the insert @@ -2931,11 +2961,16 @@ class Processes * Get Dynaform Rows from a Process * * @param string $proUid + * @param boolean $unsetDynId * * @return array * @throws Exception + * + * @see Processes::getWorkflowData() + * @see ProcessMaker\BusinessModel\Migrator\DynaformsMigrator::export() + * @see ProcessMaker\Importer\Importer::saveCurrentProcess() */ - public function getDynaformRows($proUid) + public function getDynaformRows($proUid, $unsetDynId = true) { try { $dynaformList = []; @@ -2947,7 +2982,9 @@ class Processes while ($row = $dataset->getRow()) { $dynaform = new Dynaform(); $infoDyn = $dynaform->Load($row['DYN_UID']); - unset($infoDyn['DYN_ID']); + if ($unsetDynId === true) { + unset($infoDyn['DYN_ID']); + } $dynaformList[] = $infoDyn; $dataset->next(); } @@ -3077,12 +3114,16 @@ class Processes } /** - * Create dynaforms for a process + * Create dynaforms for a process. * * @param array $dynaforms * * @return void * @throws Exception + * + * @see Processes::createProcessPropertiesFromData() + * @see Processes::updateProcessFromData() + * @see ProcessMaker\BusinessModel\Migrator\DynaformsMigrator::import() */ public function createDynaformRows($dynaforms) { @@ -3097,11 +3138,15 @@ class Processes //Get the DYN_ID column $dataSet = BasePeer::doSelect($criteria, $con); $dataSet->setFetchmode(ResultSet::FETCHMODE_ASSOC); - if ($dataSet->next()) { - $dynInfo = $dataSet->getRow(); - $row['DYN_ID'] = $dynInfo['DYN_ID']; + if (isset($row["__DYN_ID_UPDATE__"]) && $row["__DYN_ID_UPDATE__"] === false) { + unset($row["__DYN_ID_UPDATE__"]); } else { - $row['DYN_ID'] = null; + if ($dataSet->next()) { + $dynInfo = $dataSet->getRow(); + $row['DYN_ID'] = $dynInfo['DYN_ID']; + } else { + $row['DYN_ID'] = null; + } } BasePeer::doDelete($criteria, $con); //Prepare the insert diff --git a/workflow/engine/classes/SpoolRun.php b/workflow/engine/classes/SpoolRun.php index 7ef0547a5..1b5ac211c 100644 --- a/workflow/engine/classes/SpoolRun.php +++ b/workflow/engine/classes/SpoolRun.php @@ -91,6 +91,16 @@ class SpoolRun $this->appMsgUid = $v; } + /** + * Get the fileData property + * + * @return array + */ + public function getFileData() + { + return $this->fileData; + } + /** * get all files into spool in a list * @@ -212,32 +222,52 @@ class SpoolRun } /** - * set email parameters + * Set email parameters * - * @param string $sAppMsgUid , $sSubject, $sFrom, $sTo, $sBody, $sDate, $sCC, $sBCC, $sTemplate - * @return none + * @param string $appMsgUid + * @param string $subject + * @param string $from + * @param string $to + * @param string $body + * @param string $date + * @param string $cc + * @param string $bcc + * @param string $template + * @param array $attachments + * @param bool $contentTypeIsHtml + * @param string $error + * + * @see SpoolRun->create() + * @see SpoolRun->resendEmails() */ - public function setData($sAppMsgUid, $sSubject, $sFrom, $sTo, $sBody, $sDate = "", $sCC = "", $sBCC = "", $sTemplate = "", $aAttachment = array(), $bContentTypeIsHtml = true, $sError = "") + public function setData($appMsgUid, $subject, $from, $to, $body, $date = '', $cc = '', $bcc = '', $template = '', $attachments = [], + $contentTypeIsHtml = true, $error = '') { - $this->spoolId = $sAppMsgUid; - $this->fileData['subject'] = $sSubject; - $this->fileData['from'] = $sFrom; - $this->fileData['to'] = $sTo; - $this->fileData['body'] = $sBody; - $this->fileData['date'] = ($sDate != '' ? $sDate : date('Y-m-d H:i:s')); - $this->fileData['cc'] = $sCC; - $this->fileData['bcc'] = $sBCC; - $this->fileData['template'] = $sTemplate; - $this->fileData['attachments'] = $aAttachment; - $this->fileData['envelope_to'] = array(); - $this->fileData["contentTypeIsHtml"] = $bContentTypeIsHtml; - $this->fileData["error"] = $sError; + // Fill "fileData" property + $this->spoolId = $appMsgUid; + $this->fileData['subject'] = $subject; + $this->fileData['from'] = $from; + $this->fileData['to'] = $to; + $this->fileData['body'] = $body; + $this->fileData['date'] = (!empty($date) ? $date : date('Y-m-d H:i:s')); + $this->fileData['cc'] = $cc; + $this->fileData['bcc'] = $bcc; + $this->fileData['template'] = $template; + $this->fileData['attachments'] = $attachments; + $this->fileData["contentTypeIsHtml"] = $contentTypeIsHtml; + $this->fileData["error"] = $error; + // Initialize some values used internally + $this->fileData['envelope_to'] = []; + $this->fileData['envelope_cc'] = []; + $this->fileData['envelope_bcc'] = []; + + // Domain validation when the email engine is "OpenMail" if (array_key_exists('MESS_ENGINE', $this->config)) { - if ($this->config['MESS_ENGINE'] == 'OPENMAIL') { - if ($this->config['MESS_SERVER'] != '') { - if (($sAux = @gethostbyaddr($this->config['MESS_SERVER']))) { - $this->fileData['domain'] = $sAux; + if ($this->config['MESS_ENGINE'] === 'OPENMAIL') { + if (!empty($this->config['MESS_SERVER'])) { + if (($domain = @gethostbyaddr($this->config['MESS_SERVER']))) { + $this->fileData['domain'] = $domain; } else { $this->fileData['domain'] = $this->config['MESS_SERVER']; } @@ -818,4 +848,12 @@ class SpoolRun return $appMsgUid; } + + /** + * Run the private method "handleEnvelopeTo", this method was created in order to use in the unit tests + */ + public function runHandleEnvelopeTo() + { + $this->handleEnvelopeTo(); + } } diff --git a/workflow/engine/content/translations/english/processmaker.en.po b/workflow/engine/content/translations/english/processmaker.en.po index 05fe609f5..edc9b4484 100644 --- a/workflow/engine/content/translations/english/processmaker.en.po +++ b/workflow/engine/content/translations/english/processmaker.en.po @@ -23660,8 +23660,8 @@ msgstr "Setting SUPER privilege" # TRANSLATION # LABEL/ID_SETUP #: LABEL/ID_SETUP -msgid "ADMIN" -msgstr "ADMIN" +msgid "Admin" +msgstr "Admin" # TRANSLATION # LABEL/ID_SETUP_MAILCONF_TITLE diff --git a/workflow/engine/data/mysql/insert.sql b/workflow/engine/data/mysql/insert.sql index cfc1dc4d2..b4c490c62 100644 --- a/workflow/engine/data/mysql/insert.sql +++ b/workflow/engine/data/mysql/insert.sql @@ -60832,7 +60832,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE ( 'LABEL','ID_SETTINGS_HEARTBEAT_TITLE','en','Display Setting','2014-01-15') , ( 'LABEL','ID_SETTING_MESSAGE','en','The Settings tool was clicked','2014-01-15') , ( 'LABEL','ID_SETTING_SUPER','en','Setting SUPER privilege','2014-01-28') , -( 'LABEL','ID_SETUP','en','ADMIN','2014-01-15') , +( 'LABEL','ID_SETUP','en','Admin','2014-01-15') , ( 'LABEL','ID_SETUP_MAILCONF_TITLE','en','Test SMTP Connection','2014-01-15') , ( 'LABEL','ID_SETUP_WEBSERVICES','en','Setup','2014-01-15') , ( 'LABEL','ID_SET_A_TABLE_NAME','en','Set a Table Name','2014-01-15') , diff --git a/workflow/engine/menus/processmaker.php b/workflow/engine/menus/processmaker.php index 95e40e09f..dc37285f0 100644 --- a/workflow/engine/menus/processmaker.php +++ b/workflow/engine/menus/processmaker.php @@ -2,32 +2,9 @@ /** * processmaker.php * - * ProcessMaker Open Source Edition - * Copyright (C) 2004 - 2008 Colosa Inc.23 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see