From 1dbff05bdc0b79709f854756b516f4371baba153 Mon Sep 17 00:00:00 2001 From: Paula Quispe Date: Thu, 18 Nov 2021 13:31:30 -0400 Subject: [PATCH 1/9] PMCORE-3537 --- .../model/map/OutputDocumentMapBuilder.php | 4 + .../classes/model/om/BaseOutputDocument.php | 118 +++++++++++++++++- .../model/om/BaseOutputDocumentPeer.php | 28 +++-- workflow/engine/config/schema.xml | 2 + workflow/engine/data/mysql/schema.sql | 2 + 5 files changed, 144 insertions(+), 10 deletions(-) diff --git a/workflow/engine/classes/model/map/OutputDocumentMapBuilder.php b/workflow/engine/classes/model/map/OutputDocumentMapBuilder.php index 61edd953d..d97dc833d 100644 --- a/workflow/engine/classes/model/map/OutputDocumentMapBuilder.php +++ b/workflow/engine/classes/model/map/OutputDocumentMapBuilder.php @@ -117,6 +117,10 @@ class OutputDocumentMapBuilder $tMap->addColumn('OUT_DOC_OPEN_TYPE', 'OutDocOpenType', 'int', CreoleTypes::INTEGER, false, null); + $tMap->addColumn('OUT_DOC_HEADER', 'OutDocHeader', 'string', CreoleTypes::LONGVARCHAR, false, null); + + $tMap->addColumn('OUT_DOC_FOOTER', 'OutDocFooter', 'string', CreoleTypes::LONGVARCHAR, false, null); + $tMap->addValidator('OUT_DOC_UID', 'maxLength', 'propel.validator.MaxLengthValidator', '32', 'Output Document UID can be no larger than 32 in size'); $tMap->addValidator('OUT_DOC_UID', 'required', 'propel.validator.RequiredValidator', '', 'Output Document UID is required.'); diff --git a/workflow/engine/classes/model/om/BaseOutputDocument.php b/workflow/engine/classes/model/om/BaseOutputDocument.php index d20ebd538..55b25f078 100644 --- a/workflow/engine/classes/model/om/BaseOutputDocument.php +++ b/workflow/engine/classes/model/om/BaseOutputDocument.php @@ -183,6 +183,18 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent */ protected $out_doc_open_type = 1; + /** + * The value for the out_doc_header field. + * @var string + */ + protected $out_doc_header; + + /** + * The value for the out_doc_footer field. + * @var string + */ + protected $out_doc_footer; + /** * Flag to prevent endless save loop, if this object is referenced * by another object which falls in this transaction. @@ -483,6 +495,28 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent return $this->out_doc_open_type; } + /** + * Get the [out_doc_header] column value. + * + * @return string + */ + public function getOutDocHeader() + { + + return $this->out_doc_header; + } + + /** + * Get the [out_doc_footer] column value. + * + * @return string + */ + public function getOutDocFooter() + { + + return $this->out_doc_footer; + } + /** * Set the value of [out_doc_uid] column. * @@ -1055,6 +1089,50 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent } // setOutDocOpenType() + /** + * Set the value of [out_doc_header] column. + * + * @param string $v new value + * @return void + */ + public function setOutDocHeader($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->out_doc_header !== $v) { + $this->out_doc_header = $v; + $this->modifiedColumns[] = OutputDocumentPeer::OUT_DOC_HEADER; + } + + } // setOutDocHeader() + + /** + * Set the value of [out_doc_footer] column. + * + * @param string $v new value + * @return void + */ + public function setOutDocFooter($v) + { + + // Since the native PHP type for this column is string, + // we will cast the input to a string (if it is not). + if ($v !== null && !is_string($v)) { + $v = (string) $v; + } + + if ($this->out_doc_footer !== $v) { + $this->out_doc_footer = $v; + $this->modifiedColumns[] = OutputDocumentPeer::OUT_DOC_FOOTER; + } + + } // setOutDocFooter() + /** * Hydrates (populates) the object variables with values from the database resultset. * @@ -1124,12 +1202,16 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent $this->out_doc_open_type = $rs->getInt($startcol + 25); + $this->out_doc_header = $rs->getString($startcol + 26); + + $this->out_doc_footer = $rs->getString($startcol + 27); + $this->resetModified(); $this->setNew(false); // FIXME - using NUM_COLUMNS may be clearer. - return $startcol + 26; // 26 = OutputDocumentPeer::NUM_COLUMNS - OutputDocumentPeer::NUM_LAZY_LOAD_COLUMNS). + return $startcol + 28; // 28 = OutputDocumentPeer::NUM_COLUMNS - OutputDocumentPeer::NUM_LAZY_LOAD_COLUMNS). } catch (Exception $e) { throw new PropelException("Error populating OutputDocument object", $e); @@ -1411,6 +1493,12 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent case 25: return $this->getOutDocOpenType(); break; + case 26: + return $this->getOutDocHeader(); + break; + case 27: + return $this->getOutDocFooter(); + break; default: return null; break; @@ -1457,6 +1545,8 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent $keys[23] => $this->getOutDocPdfSecurityOwnerPassword(), $keys[24] => $this->getOutDocPdfSecurityPermissions(), $keys[25] => $this->getOutDocOpenType(), + $keys[26] => $this->getOutDocHeader(), + $keys[27] => $this->getOutDocFooter(), ); return $result; } @@ -1566,6 +1656,12 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent case 25: $this->setOutDocOpenType($value); break; + case 26: + $this->setOutDocHeader($value); + break; + case 27: + $this->setOutDocFooter($value); + break; } // switch() } @@ -1693,6 +1789,14 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent $this->setOutDocOpenType($arr[$keys[25]]); } + if (array_key_exists($keys[26], $arr)) { + $this->setOutDocHeader($arr[$keys[26]]); + } + + if (array_key_exists($keys[27], $arr)) { + $this->setOutDocFooter($arr[$keys[27]]); + } + } /** @@ -1808,6 +1912,14 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent $criteria->add(OutputDocumentPeer::OUT_DOC_OPEN_TYPE, $this->out_doc_open_type); } + if ($this->isColumnModified(OutputDocumentPeer::OUT_DOC_HEADER)) { + $criteria->add(OutputDocumentPeer::OUT_DOC_HEADER, $this->out_doc_header); + } + + if ($this->isColumnModified(OutputDocumentPeer::OUT_DOC_FOOTER)) { + $criteria->add(OutputDocumentPeer::OUT_DOC_FOOTER, $this->out_doc_footer); + } + return $criteria; } @@ -1912,6 +2024,10 @@ abstract class BaseOutputDocument extends BaseObject implements Persistent $copyObj->setOutDocOpenType($this->out_doc_open_type); + $copyObj->setOutDocHeader($this->out_doc_header); + + $copyObj->setOutDocFooter($this->out_doc_footer); + $copyObj->setNew(true); diff --git a/workflow/engine/classes/model/om/BaseOutputDocumentPeer.php b/workflow/engine/classes/model/om/BaseOutputDocumentPeer.php index 81062b038..42aec8b53 100644 --- a/workflow/engine/classes/model/om/BaseOutputDocumentPeer.php +++ b/workflow/engine/classes/model/om/BaseOutputDocumentPeer.php @@ -25,7 +25,7 @@ abstract class BaseOutputDocumentPeer const CLASS_DEFAULT = 'classes.model.OutputDocument'; /** The total number of columns. */ - const NUM_COLUMNS = 26; + const NUM_COLUMNS = 28; /** The number of lazy-loaded columns. */ const NUM_LAZY_LOAD_COLUMNS = 0; @@ -109,6 +109,12 @@ abstract class BaseOutputDocumentPeer /** the column name for the OUT_DOC_OPEN_TYPE field */ const OUT_DOC_OPEN_TYPE = 'OUTPUT_DOCUMENT.OUT_DOC_OPEN_TYPE'; + /** the column name for the OUT_DOC_HEADER field */ + const OUT_DOC_HEADER = 'OUTPUT_DOCUMENT.OUT_DOC_HEADER'; + + /** the column name for the OUT_DOC_FOOTER field */ + const OUT_DOC_FOOTER = 'OUTPUT_DOCUMENT.OUT_DOC_FOOTER'; + /** The PHP to DB Name Mapping */ private static $phpNameMap = null; @@ -120,10 +126,10 @@ abstract class BaseOutputDocumentPeer * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' */ private static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('OutDocUid', 'OutDocId', 'OutDocTitle', 'OutDocDescription', 'OutDocFilename', 'OutDocTemplate', 'ProUid', 'OutDocReportGenerator', 'OutDocLandscape', 'OutDocMedia', 'OutDocLeftMargin', 'OutDocRightMargin', 'OutDocTopMargin', 'OutDocBottomMargin', 'OutDocGenerate', 'OutDocType', 'OutDocCurrentRevision', 'OutDocFieldMapping', 'OutDocVersioning', 'OutDocDestinationPath', 'OutDocTags', 'OutDocPdfSecurityEnabled', 'OutDocPdfSecurityOpenPassword', 'OutDocPdfSecurityOwnerPassword', 'OutDocPdfSecurityPermissions', 'OutDocOpenType', ), - BasePeer::TYPE_COLNAME => array (OutputDocumentPeer::OUT_DOC_UID, OutputDocumentPeer::OUT_DOC_ID, OutputDocumentPeer::OUT_DOC_TITLE, OutputDocumentPeer::OUT_DOC_DESCRIPTION, OutputDocumentPeer::OUT_DOC_FILENAME, OutputDocumentPeer::OUT_DOC_TEMPLATE, OutputDocumentPeer::PRO_UID, OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR, OutputDocumentPeer::OUT_DOC_LANDSCAPE, OutputDocumentPeer::OUT_DOC_MEDIA, OutputDocumentPeer::OUT_DOC_LEFT_MARGIN, OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN, OutputDocumentPeer::OUT_DOC_TOP_MARGIN, OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN, OutputDocumentPeer::OUT_DOC_GENERATE, OutputDocumentPeer::OUT_DOC_TYPE, OutputDocumentPeer::OUT_DOC_CURRENT_REVISION, OutputDocumentPeer::OUT_DOC_FIELD_MAPPING, OutputDocumentPeer::OUT_DOC_VERSIONING, OutputDocumentPeer::OUT_DOC_DESTINATION_PATH, OutputDocumentPeer::OUT_DOC_TAGS, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS, OutputDocumentPeer::OUT_DOC_OPEN_TYPE, ), - BasePeer::TYPE_FIELDNAME => array ('OUT_DOC_UID', 'OUT_DOC_ID', 'OUT_DOC_TITLE', 'OUT_DOC_DESCRIPTION', 'OUT_DOC_FILENAME', 'OUT_DOC_TEMPLATE', 'PRO_UID', 'OUT_DOC_REPORT_GENERATOR', 'OUT_DOC_LANDSCAPE', 'OUT_DOC_MEDIA', 'OUT_DOC_LEFT_MARGIN', 'OUT_DOC_RIGHT_MARGIN', 'OUT_DOC_TOP_MARGIN', 'OUT_DOC_BOTTOM_MARGIN', 'OUT_DOC_GENERATE', 'OUT_DOC_TYPE', 'OUT_DOC_CURRENT_REVISION', 'OUT_DOC_FIELD_MAPPING', 'OUT_DOC_VERSIONING', 'OUT_DOC_DESTINATION_PATH', 'OUT_DOC_TAGS', 'OUT_DOC_PDF_SECURITY_ENABLED', 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD', 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD', 'OUT_DOC_PDF_SECURITY_PERMISSIONS', 'OUT_DOC_OPEN_TYPE', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ) + BasePeer::TYPE_PHPNAME => array ('OutDocUid', 'OutDocId', 'OutDocTitle', 'OutDocDescription', 'OutDocFilename', 'OutDocTemplate', 'ProUid', 'OutDocReportGenerator', 'OutDocLandscape', 'OutDocMedia', 'OutDocLeftMargin', 'OutDocRightMargin', 'OutDocTopMargin', 'OutDocBottomMargin', 'OutDocGenerate', 'OutDocType', 'OutDocCurrentRevision', 'OutDocFieldMapping', 'OutDocVersioning', 'OutDocDestinationPath', 'OutDocTags', 'OutDocPdfSecurityEnabled', 'OutDocPdfSecurityOpenPassword', 'OutDocPdfSecurityOwnerPassword', 'OutDocPdfSecurityPermissions', 'OutDocOpenType', 'OutDocHeader', 'OutDocFooter', ), + BasePeer::TYPE_COLNAME => array (OutputDocumentPeer::OUT_DOC_UID, OutputDocumentPeer::OUT_DOC_ID, OutputDocumentPeer::OUT_DOC_TITLE, OutputDocumentPeer::OUT_DOC_DESCRIPTION, OutputDocumentPeer::OUT_DOC_FILENAME, OutputDocumentPeer::OUT_DOC_TEMPLATE, OutputDocumentPeer::PRO_UID, OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR, OutputDocumentPeer::OUT_DOC_LANDSCAPE, OutputDocumentPeer::OUT_DOC_MEDIA, OutputDocumentPeer::OUT_DOC_LEFT_MARGIN, OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN, OutputDocumentPeer::OUT_DOC_TOP_MARGIN, OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN, OutputDocumentPeer::OUT_DOC_GENERATE, OutputDocumentPeer::OUT_DOC_TYPE, OutputDocumentPeer::OUT_DOC_CURRENT_REVISION, OutputDocumentPeer::OUT_DOC_FIELD_MAPPING, OutputDocumentPeer::OUT_DOC_VERSIONING, OutputDocumentPeer::OUT_DOC_DESTINATION_PATH, OutputDocumentPeer::OUT_DOC_TAGS, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS, OutputDocumentPeer::OUT_DOC_OPEN_TYPE, OutputDocumentPeer::OUT_DOC_HEADER, OutputDocumentPeer::OUT_DOC_FOOTER, ), + BasePeer::TYPE_FIELDNAME => array ('OUT_DOC_UID', 'OUT_DOC_ID', 'OUT_DOC_TITLE', 'OUT_DOC_DESCRIPTION', 'OUT_DOC_FILENAME', 'OUT_DOC_TEMPLATE', 'PRO_UID', 'OUT_DOC_REPORT_GENERATOR', 'OUT_DOC_LANDSCAPE', 'OUT_DOC_MEDIA', 'OUT_DOC_LEFT_MARGIN', 'OUT_DOC_RIGHT_MARGIN', 'OUT_DOC_TOP_MARGIN', 'OUT_DOC_BOTTOM_MARGIN', 'OUT_DOC_GENERATE', 'OUT_DOC_TYPE', 'OUT_DOC_CURRENT_REVISION', 'OUT_DOC_FIELD_MAPPING', 'OUT_DOC_VERSIONING', 'OUT_DOC_DESTINATION_PATH', 'OUT_DOC_TAGS', 'OUT_DOC_PDF_SECURITY_ENABLED', 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD', 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD', 'OUT_DOC_PDF_SECURITY_PERMISSIONS', 'OUT_DOC_OPEN_TYPE', 'OUT_DOC_HEADER', 'OUT_DOC_FOOTER', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, ) ); /** @@ -133,10 +139,10 @@ abstract class BaseOutputDocumentPeer * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ private static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('OutDocUid' => 0, 'OutDocId' => 1, 'OutDocTitle' => 2, 'OutDocDescription' => 3, 'OutDocFilename' => 4, 'OutDocTemplate' => 5, 'ProUid' => 6, 'OutDocReportGenerator' => 7, 'OutDocLandscape' => 8, 'OutDocMedia' => 9, 'OutDocLeftMargin' => 10, 'OutDocRightMargin' => 11, 'OutDocTopMargin' => 12, 'OutDocBottomMargin' => 13, 'OutDocGenerate' => 14, 'OutDocType' => 15, 'OutDocCurrentRevision' => 16, 'OutDocFieldMapping' => 17, 'OutDocVersioning' => 18, 'OutDocDestinationPath' => 19, 'OutDocTags' => 20, 'OutDocPdfSecurityEnabled' => 21, 'OutDocPdfSecurityOpenPassword' => 22, 'OutDocPdfSecurityOwnerPassword' => 23, 'OutDocPdfSecurityPermissions' => 24, 'OutDocOpenType' => 25, ), - BasePeer::TYPE_COLNAME => array (OutputDocumentPeer::OUT_DOC_UID => 0, OutputDocumentPeer::OUT_DOC_ID => 1, OutputDocumentPeer::OUT_DOC_TITLE => 2, OutputDocumentPeer::OUT_DOC_DESCRIPTION => 3, OutputDocumentPeer::OUT_DOC_FILENAME => 4, OutputDocumentPeer::OUT_DOC_TEMPLATE => 5, OutputDocumentPeer::PRO_UID => 6, OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR => 7, OutputDocumentPeer::OUT_DOC_LANDSCAPE => 8, OutputDocumentPeer::OUT_DOC_MEDIA => 9, OutputDocumentPeer::OUT_DOC_LEFT_MARGIN => 10, OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN => 11, OutputDocumentPeer::OUT_DOC_TOP_MARGIN => 12, OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN => 13, OutputDocumentPeer::OUT_DOC_GENERATE => 14, OutputDocumentPeer::OUT_DOC_TYPE => 15, OutputDocumentPeer::OUT_DOC_CURRENT_REVISION => 16, OutputDocumentPeer::OUT_DOC_FIELD_MAPPING => 17, OutputDocumentPeer::OUT_DOC_VERSIONING => 18, OutputDocumentPeer::OUT_DOC_DESTINATION_PATH => 19, OutputDocumentPeer::OUT_DOC_TAGS => 20, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED => 21, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD => 22, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD => 23, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS => 24, OutputDocumentPeer::OUT_DOC_OPEN_TYPE => 25, ), - BasePeer::TYPE_FIELDNAME => array ('OUT_DOC_UID' => 0, 'OUT_DOC_ID' => 1, 'OUT_DOC_TITLE' => 2, 'OUT_DOC_DESCRIPTION' => 3, 'OUT_DOC_FILENAME' => 4, 'OUT_DOC_TEMPLATE' => 5, 'PRO_UID' => 6, 'OUT_DOC_REPORT_GENERATOR' => 7, 'OUT_DOC_LANDSCAPE' => 8, 'OUT_DOC_MEDIA' => 9, 'OUT_DOC_LEFT_MARGIN' => 10, 'OUT_DOC_RIGHT_MARGIN' => 11, 'OUT_DOC_TOP_MARGIN' => 12, 'OUT_DOC_BOTTOM_MARGIN' => 13, 'OUT_DOC_GENERATE' => 14, 'OUT_DOC_TYPE' => 15, 'OUT_DOC_CURRENT_REVISION' => 16, 'OUT_DOC_FIELD_MAPPING' => 17, 'OUT_DOC_VERSIONING' => 18, 'OUT_DOC_DESTINATION_PATH' => 19, 'OUT_DOC_TAGS' => 20, 'OUT_DOC_PDF_SECURITY_ENABLED' => 21, 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD' => 22, 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD' => 23, 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => 24, 'OUT_DOC_OPEN_TYPE' => 25, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, ) + BasePeer::TYPE_PHPNAME => array ('OutDocUid' => 0, 'OutDocId' => 1, 'OutDocTitle' => 2, 'OutDocDescription' => 3, 'OutDocFilename' => 4, 'OutDocTemplate' => 5, 'ProUid' => 6, 'OutDocReportGenerator' => 7, 'OutDocLandscape' => 8, 'OutDocMedia' => 9, 'OutDocLeftMargin' => 10, 'OutDocRightMargin' => 11, 'OutDocTopMargin' => 12, 'OutDocBottomMargin' => 13, 'OutDocGenerate' => 14, 'OutDocType' => 15, 'OutDocCurrentRevision' => 16, 'OutDocFieldMapping' => 17, 'OutDocVersioning' => 18, 'OutDocDestinationPath' => 19, 'OutDocTags' => 20, 'OutDocPdfSecurityEnabled' => 21, 'OutDocPdfSecurityOpenPassword' => 22, 'OutDocPdfSecurityOwnerPassword' => 23, 'OutDocPdfSecurityPermissions' => 24, 'OutDocOpenType' => 25, 'OutDocHeader' => 26, 'OutDocFooter' => 27, ), + BasePeer::TYPE_COLNAME => array (OutputDocumentPeer::OUT_DOC_UID => 0, OutputDocumentPeer::OUT_DOC_ID => 1, OutputDocumentPeer::OUT_DOC_TITLE => 2, OutputDocumentPeer::OUT_DOC_DESCRIPTION => 3, OutputDocumentPeer::OUT_DOC_FILENAME => 4, OutputDocumentPeer::OUT_DOC_TEMPLATE => 5, OutputDocumentPeer::PRO_UID => 6, OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR => 7, OutputDocumentPeer::OUT_DOC_LANDSCAPE => 8, OutputDocumentPeer::OUT_DOC_MEDIA => 9, OutputDocumentPeer::OUT_DOC_LEFT_MARGIN => 10, OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN => 11, OutputDocumentPeer::OUT_DOC_TOP_MARGIN => 12, OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN => 13, OutputDocumentPeer::OUT_DOC_GENERATE => 14, OutputDocumentPeer::OUT_DOC_TYPE => 15, OutputDocumentPeer::OUT_DOC_CURRENT_REVISION => 16, OutputDocumentPeer::OUT_DOC_FIELD_MAPPING => 17, OutputDocumentPeer::OUT_DOC_VERSIONING => 18, OutputDocumentPeer::OUT_DOC_DESTINATION_PATH => 19, OutputDocumentPeer::OUT_DOC_TAGS => 20, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED => 21, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD => 22, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD => 23, OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS => 24, OutputDocumentPeer::OUT_DOC_OPEN_TYPE => 25, OutputDocumentPeer::OUT_DOC_HEADER => 26, OutputDocumentPeer::OUT_DOC_FOOTER => 27, ), + BasePeer::TYPE_FIELDNAME => array ('OUT_DOC_UID' => 0, 'OUT_DOC_ID' => 1, 'OUT_DOC_TITLE' => 2, 'OUT_DOC_DESCRIPTION' => 3, 'OUT_DOC_FILENAME' => 4, 'OUT_DOC_TEMPLATE' => 5, 'PRO_UID' => 6, 'OUT_DOC_REPORT_GENERATOR' => 7, 'OUT_DOC_LANDSCAPE' => 8, 'OUT_DOC_MEDIA' => 9, 'OUT_DOC_LEFT_MARGIN' => 10, 'OUT_DOC_RIGHT_MARGIN' => 11, 'OUT_DOC_TOP_MARGIN' => 12, 'OUT_DOC_BOTTOM_MARGIN' => 13, 'OUT_DOC_GENERATE' => 14, 'OUT_DOC_TYPE' => 15, 'OUT_DOC_CURRENT_REVISION' => 16, 'OUT_DOC_FIELD_MAPPING' => 17, 'OUT_DOC_VERSIONING' => 18, 'OUT_DOC_DESTINATION_PATH' => 19, 'OUT_DOC_TAGS' => 20, 'OUT_DOC_PDF_SECURITY_ENABLED' => 21, 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD' => 22, 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD' => 23, 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => 24, 'OUT_DOC_OPEN_TYPE' => 25, 'OUT_DOC_HEADER' => 26, 'OUT_DOC_FOOTER' => 27, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, ) ); /** @@ -289,6 +295,10 @@ abstract class BaseOutputDocumentPeer $criteria->addSelectColumn(OutputDocumentPeer::OUT_DOC_OPEN_TYPE); + $criteria->addSelectColumn(OutputDocumentPeer::OUT_DOC_HEADER); + + $criteria->addSelectColumn(OutputDocumentPeer::OUT_DOC_FOOTER); + } const COUNT = 'COUNT(OUTPUT_DOCUMENT.OUT_DOC_UID)'; diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 277e4f3c8..e0f4d9d57 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -1002,6 +1002,8 @@ + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 369bb9af2..6573beb31 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -477,6 +477,8 @@ CREATE TABLE `OUTPUT_DOCUMENT` `OUT_DOC_PDF_SECURITY_OWNER_PASSWORD` VARCHAR(32) default '', `OUT_DOC_PDF_SECURITY_PERMISSIONS` VARCHAR(150) default '', `OUT_DOC_OPEN_TYPE` INTEGER default 1, + `OUT_DOC_HEADER` MEDIUMTEXT, + `OUT_DOC_FOOTER` MEDIUMTEXT, PRIMARY KEY (`OUT_DOC_UID`), UNIQUE KEY `INDEX_OUT_DOC_ID` (`OUT_DOC_ID`) )ENGINE=InnoDB DEFAULT CHARSET='utf8'; From 64e31ffa6337a4ec8a1d0689f83c2950069f1601 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Thu, 2 Dec 2021 13:32:13 -0400 Subject: [PATCH 2/9] PMCORE-3538 BE: Change the API for save and return the header and footer properties --- database/factories/OutputDocumentFactory.php | 4 +- .../workflow/engine/classes/ProcessesTest.php | 4 + .../BusinessModel/EmailServerTest.php | 54 ++-- .../GmailOAuth/GmailOAuthTest.php | 9 +- .../BusinessModel/OutputDocument.php | 242 ++++++++---------- 5 files changed, 144 insertions(+), 169 deletions(-) diff --git a/database/factories/OutputDocumentFactory.php b/database/factories/OutputDocumentFactory.php index 65efb66ea..68ef77090 100644 --- a/database/factories/OutputDocumentFactory.php +++ b/database/factories/OutputDocumentFactory.php @@ -38,6 +38,8 @@ $factory->define(OutputDocument::class, function(Faker $faker) { 'OUT_DOC_PDF_SECURITY_OPEN_PASSWORD' => '', 'OUT_DOC_PDF_SECURITY_OWNER_PASSWORD' => '', 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => '', - 'OUT_DOC_OPEN_TYPE' => 1 + 'OUT_DOC_OPEN_TYPE' => 1, + 'OUT_DOC_HEADER' => null, + 'OUT_DOC_FOOTER' => null ]; }); diff --git a/tests/unit/workflow/engine/classes/ProcessesTest.php b/tests/unit/workflow/engine/classes/ProcessesTest.php index e8fa446cc..513efa943 100644 --- a/tests/unit/workflow/engine/classes/ProcessesTest.php +++ b/tests/unit/workflow/engine/classes/ProcessesTest.php @@ -378,6 +378,8 @@ class ProcessesTest extends TestCase 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => '', 'OUT_DOC_OPEN_TYPE' => 1, '__OUT_DOC_ID_UPDATE__' => false, + 'OUT_DOC_FOOTER' => null, + 'OUT_DOC_HEADER' => null ], [ 'OUT_DOC_UID' => G::generateUniqueID(), @@ -407,6 +409,8 @@ class ProcessesTest extends TestCase 'OUT_DOC_PDF_SECURITY_PERMISSIONS' => '', 'OUT_DOC_OPEN_TYPE' => 1, '__OUT_DOC_ID_UPDATE__' => false, + 'OUT_DOC_FOOTER' => null, + 'OUT_DOC_HEADER' => null ] ]; $this->sortArrayByColumn($expected, 'OUT_DOC_UID'); diff --git a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/EmailServerTest.php b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/EmailServerTest.php index 536211b6e..49f703875 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/EmailServerTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/BusinessModel/EmailServerTest.php @@ -280,33 +280,35 @@ class EmailServerTest extends TestCase public function it_should_test_the_send_test_mail_method() { $string = ini_get("sendmail_path"); - if (!is_executable($string)) { - $this->markTestIncomplete($string . " not found"); + //in current versions this value has extra parameters and must be cleaned + $result = explode(" ", $string); + $path = $result[0]; + if (is_executable($path)) { + // The data that will be sent to the method + $data = [ + "FROM_EMAIL" => "admin@processmaker.com", + "FROM_NAME" => "Administrator", + "MESS_ENGINE" => "MAIL", + "MESS_SERVER" => "localhost", + "MESS_PORT" => 25, + "MESS_ACCOUNT" => "admin@processmaker.com", + "MESS_PASSWORD" => "", + "TO" => "admin@processmaker.com", + "MESS_RAUTH" => true + ]; + + // Create the EmailServer object + $emailServer = new EmailServer(); + // Call the sendTestMail method + $result = $emailServer->sendTestMail($data); + + // Assert the status is true + $this->assertTrue($result['status']); + // Assert the success is true + $this->assertTrue($result['success']); + // Assert the message of the result + $this->assertEquals('**ID_MAIL_TEST_SUCCESS**', $result['msg']); } - // The data that will be sent to the method - $data = [ - "FROM_EMAIL" => "admin@processmaker.com", - "FROM_NAME" => "Administrator", - "MESS_ENGINE" => "MAIL", - "MESS_SERVER" => "localhost", - "MESS_PORT" => 25, - "MESS_ACCOUNT" => "admin@processmaker.com", - "MESS_PASSWORD" => "", - "TO" => "admin@processmaker.com", - "MESS_RAUTH" => true - ]; - - // Create the EmailServer object - $emailServer = new EmailServer(); - // Call the sendTestMail method - $result = $emailServer->sendTestMail($data); - - // Assert the status is true - $this->assertTrue($result['status']); - // Assert the success is true - $this->assertTrue($result['success']); - // Assert the message of the result - $this->assertEquals('**ID_MAIL_TEST_SUCCESS**', $result['msg']); } /** diff --git a/tests/unit/workflow/engine/src/ProcessMaker/GmailOAuth/GmailOAuthTest.php b/tests/unit/workflow/engine/src/ProcessMaker/GmailOAuth/GmailOAuthTest.php index e7def48be..4abecedc7 100644 --- a/tests/unit/workflow/engine/src/ProcessMaker/GmailOAuth/GmailOAuthTest.php +++ b/tests/unit/workflow/engine/src/ProcessMaker/GmailOAuth/GmailOAuthTest.php @@ -13,6 +13,7 @@ use ProcessMaker\GmailOAuth\GmailOAuth; use ProcessMaker\Model\User; use RBAC; use Tests\TestCase; +use BadMethodCallException; class GmailOAuthTest extends TestCase { @@ -248,7 +249,6 @@ class GmailOAuthTest extends TestCase */ public function it_should_send_an_email_test_with_PHPMailerOAuth() { - $this->markTestIncomplete('Please solve the error related to Exception'); $faker = $this->faker; $gmailOauth = new GmailOAuth(); @@ -273,8 +273,11 @@ class GmailOAuthTest extends TestCase $gmailOauth->setSenderEmail($faker->email); $gmailOauth->setMailTo($faker->email); $gmailOauth->setSendTestMail(1); - $result = $gmailOauth->sendTestMailWithPHPMailerOAuth(); - $this->assertTrue($result instanceof PHPMailerOAuth); + + //We cannot get a valid 'refresh token', therefore we wait for an exception + //when trying to send a email. + $this->expectException(BadMethodCallException::class); + $gmailOauth->sendTestMailWithPHPMailerOAuth(); } /** diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php index 83a404309..3e76040e8 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php @@ -1,87 +1,57 @@ addSelectColumn(\OutputDocumentPeer::OUT_DOC_UID); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TYPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::PRO_UID); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_LANDSCAPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_MEDIA); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_LEFT_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TOP_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_GENERATE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TYPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_CURRENT_REVISION); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_FIELD_MAPPING); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_VERSIONING); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_DESTINATION_PATH); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TAGS); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_OPEN_TYPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TITLE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_DESCRIPTION); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_FILENAME); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TEMPLATE); - $oCriteria->add(\OutputDocumentPeer::PRO_UID, $sProcessUID); - $oDataset = \OutputDocumentPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - $outputDocArray = array(); - while ($aRow = $oDataset->getRow()) { - if (($aRow['OUT_DOC_TITLE'] == null) || ($aRow['OUT_DOC_TITLE'] == "")) { - // There is no transaltion for this Document name, try to get/regenerate the label - $outputDocument = new \OutputDocument(); - $outputDocumentObj = $outputDocument->load($aRow['OUT_DOC_UID']); - $aRow['OUT_DOC_TITLE'] = $outputDocumentObj['OUT_DOC_TITLE']; - $aRow['OUT_DOC_DESCRIPTION'] = $outputDocumentObj['OUT_DOC_DESCRIPTION']; - } else { - $outputDocArray[] = array('out_doc_uid' => $aRow['OUT_DOC_UID'], - 'out_doc_title' => $aRow['OUT_DOC_TITLE'], - 'out_doc_description' => $aRow['OUT_DOC_DESCRIPTION'], - 'out_doc_filename' => $aRow['OUT_DOC_FILENAME'], - 'out_doc_template' => $aRow['OUT_DOC_TEMPLATE'], - 'out_doc_report_generator' => $aRow['OUT_DOC_REPORT_GENERATOR'], - 'out_doc_landscape' => $aRow['OUT_DOC_LANDSCAPE'], - 'out_doc_media' => $aRow['OUT_DOC_MEDIA'], - 'out_doc_left_margin' => $aRow['OUT_DOC_LEFT_MARGIN'], - 'out_doc_right_margin' => $aRow['OUT_DOC_RIGHT_MARGIN'], - 'out_doc_top_margin' => $aRow['OUT_DOC_TOP_MARGIN'], - 'out_doc_bottom_margin' => $aRow['OUT_DOC_BOTTOM_MARGIN'], - 'out_doc_generate' => $aRow['OUT_DOC_GENERATE'], - 'out_doc_type' => $aRow['OUT_DOC_TYPE'], - 'out_doc_current_revision' => $aRow['OUT_DOC_CURRENT_REVISION'], - 'out_doc_field_mapping' => $aRow['OUT_DOC_FIELD_MAPPING'], - 'out_doc_versioning' => $aRow['OUT_DOC_VERSIONING'], - 'out_doc_destination_path' => $aRow['OUT_DOC_DESTINATION_PATH'], - 'out_doc_tags' => $aRow['OUT_DOC_TAGS'], - 'out_doc_pdf_security_enabled' => $aRow['OUT_DOC_PDF_SECURITY_ENABLED'], - 'out_doc_pdf_security_permissions' => $aRow['OUT_DOC_PDF_SECURITY_PERMISSIONS'], - "out_doc_open_type" => $aRow["OUT_DOC_OPEN_TYPE"]); + $result = []; + $outputDocuments = ModelOutputDocument::select() + ->where('PRO_UID', '=', $proUid) + ->get(); + foreach ($outputDocuments as $value) { + if (!empty($value->OUT_DOC_TITLE)) { + $result[] = [ + 'out_doc_uid' => $value->OUT_DOC_UID, + 'out_doc_title' => $value->OUT_DOC_TITLE, + 'out_doc_description' => $value->OUT_DOC_DESCRIPTION, + 'out_doc_filename' => $value->OUT_DOC_FILENAME, + 'out_doc_template' => $value->OUT_DOC_TEMPLATE, + 'out_doc_report_generator' => $value->OUT_DOC_REPORT_GENERATOR, + 'out_doc_landscape' => $value->OUT_DOC_LANDSCAPE, + 'out_doc_media' => $value->OUT_DOC_MEDIA, + 'out_doc_left_margin' => $value->OUT_DOC_LEFT_MARGIN, + 'out_doc_right_margin' => $value->OUT_DOC_RIGHT_MARGIN, + 'out_doc_top_margin' => $value->OUT_DOC_TOP_MARGIN, + 'out_doc_bottom_margin' => $value->OUT_DOC_BOTTOM_MARGIN, + 'out_doc_generate' => $value->OUT_DOC_GENERATE, + 'out_doc_type' => $value->OUT_DOC_TYPE, + 'out_doc_current_revision' => $value->OUT_DOC_CURRENT_REVISION, + 'out_doc_field_mapping' => $value->OUT_DOC_FIELD_MAPPING, + 'out_doc_versioning' => $value->OUT_DOC_VERSIONING, + 'out_doc_destination_path' => $value->OUT_DOC_DESTINATION_PATH, + 'out_doc_tags' => $value->OUT_DOC_TAGS, + 'out_doc_pdf_security_enabled' => $value->OUT_DOC_PDF_SECURITY_ENABLED, + 'out_doc_pdf_security_permissions' => $value->OUT_DOC_PDF_SECURITY_PERMISSIONS, + 'out_doc_open_type' => $value->OUT_DOC_OPEN_TYPE, + 'out_doc_header' => json_decode($value->OUT_DOC_HEADER), + 'out_doc_footer' => json_decode($value->OUT_DOC_FOOTER) + ]; } - $oDataset->next(); } - return $outputDocArray; + return $result; } catch (Exception $e) { throw $e; } @@ -89,83 +59,51 @@ class OutputDocument /** * Return a single output document of a project - * @param string $sProcessUID - * @param string $sOutputDocumentUID + * @param string $proUid + * @param string $outDocUid * @return array * * @access public */ - public function getOutputDocument($sProcessUID = '', $sOutputDocumentUID = '') + public function getOutputDocument($proUid = '', $outDocUid = '') { try { - $sDelimiter = \DBAdapter::getStringDelimiter(); - $oCriteria = new \Criteria('workflow'); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_UID); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TYPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::PRO_UID); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_REPORT_GENERATOR); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_LANDSCAPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_MEDIA); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_LEFT_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_RIGHT_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TOP_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_BOTTOM_MARGIN); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_GENERATE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TYPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_CURRENT_REVISION); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_FIELD_MAPPING); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_VERSIONING); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_DESTINATION_PATH); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TAGS); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_ENABLED); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OPEN_PASSWORD); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_OWNER_PASSWORD); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_PDF_SECURITY_PERMISSIONS); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_OPEN_TYPE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TITLE); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_DESCRIPTION); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_FILENAME); - $oCriteria->addSelectColumn(\OutputDocumentPeer::OUT_DOC_TEMPLATE); - $oCriteria->add(\OutputDocumentPeer::OUT_DOC_UID, $sOutputDocumentUID); - $oCriteria->add(\OutputDocumentPeer::PRO_UID, $sProcessUID); - $oDataset = \OutputDocumentPeer::doSelectRS($oCriteria); - $oDataset->setFetchmode(\ResultSet::FETCHMODE_ASSOC); - $oDataset->next(); - $outputDocArray = array(); - while ($aRow = $oDataset->getRow()) { - if (($aRow['OUT_DOC_TITLE'] == null) || ($aRow['OUT_DOC_TITLE'] == "")) { - // There is no transaltion for this Document name, try to get/regenerate the label - $outputDocument = new \OutputDocument(); - $outputDocumentObj = $outputDocument->load($aRow['OUT_DOC_UID']); - $aRow['OUT_DOC_TITLE'] = $outputDocumentObj['OUT_DOC_TITLE']; - $aRow['OUT_DOC_DESCRIPTION'] = $outputDocumentObj['OUT_DOC_DESCRIPTION']; - } else { - $outputDocArray = array('out_doc_uid' => $aRow['OUT_DOC_UID'], - 'out_doc_title' => $aRow['OUT_DOC_TITLE'], - 'out_doc_description' => $aRow['OUT_DOC_DESCRIPTION'], - 'out_doc_filename' => $aRow['OUT_DOC_FILENAME'], - 'out_doc_template' => $aRow['OUT_DOC_TEMPLATE'], - 'out_doc_report_generator' => $aRow['OUT_DOC_REPORT_GENERATOR'], - 'out_doc_landscape' => $aRow['OUT_DOC_LANDSCAPE'], - 'out_doc_media' => $aRow['OUT_DOC_MEDIA'], - 'out_doc_left_margin' => $aRow['OUT_DOC_LEFT_MARGIN'], - 'out_doc_right_margin' => $aRow['OUT_DOC_RIGHT_MARGIN'], - 'out_doc_top_margin' => $aRow['OUT_DOC_TOP_MARGIN'], - 'out_doc_bottom_margin' => $aRow['OUT_DOC_BOTTOM_MARGIN'], - 'out_doc_generate' => $aRow['OUT_DOC_GENERATE'], - 'out_doc_type' => $aRow['OUT_DOC_TYPE'], - 'out_doc_current_revision' => $aRow['OUT_DOC_CURRENT_REVISION'], - 'out_doc_field_mapping' => $aRow['OUT_DOC_FIELD_MAPPING'], - 'out_doc_versioning' => $aRow['OUT_DOC_VERSIONING'], - 'out_doc_destination_path' => $aRow['OUT_DOC_DESTINATION_PATH'], - 'out_doc_tags' => $aRow['OUT_DOC_TAGS'], - 'out_doc_pdf_security_enabled' => $aRow['OUT_DOC_PDF_SECURITY_ENABLED'], - 'out_doc_pdf_security_permissions' => $aRow['OUT_DOC_PDF_SECURITY_PERMISSIONS'], - "out_doc_open_type" => $aRow["OUT_DOC_OPEN_TYPE"]); + $result = []; + $outputDocuments = ModelOutputDocument::select() + ->where('PRO_UID', '=', $proUid) + ->where('OUT_DOC_UID', '=', $outDocUid) + ->get(); + foreach ($outputDocuments as $value) { + if (!empty($value->OUT_DOC_TITLE)) { + $result = [ + 'out_doc_uid' => $value->OUT_DOC_UID, + 'out_doc_title' => $value->OUT_DOC_TITLE, + 'out_doc_description' => $value->OUT_DOC_DESCRIPTION, + 'out_doc_filename' => $value->OUT_DOC_FILENAME, + 'out_doc_template' => $value->OUT_DOC_TEMPLATE, + 'out_doc_report_generator' => $value->OUT_DOC_REPORT_GENERATOR, + 'out_doc_landscape' => $value->OUT_DOC_LANDSCAPE, + 'out_doc_media' => $value->OUT_DOC_MEDIA, + 'out_doc_left_margin' => $value->OUT_DOC_LEFT_MARGIN, + 'out_doc_right_margin' => $value->OUT_DOC_RIGHT_MARGIN, + 'out_doc_top_margin' => $value->OUT_DOC_TOP_MARGIN, + 'out_doc_bottom_margin' => $value->OUT_DOC_BOTTOM_MARGIN, + 'out_doc_generate' => $value->OUT_DOC_GENERATE, + 'out_doc_type' => $value->OUT_DOC_TYPE, + 'out_doc_current_revision' => $value->OUT_DOC_CURRENT_REVISION, + 'out_doc_field_mapping' => $value->OUT_DOC_FIELD_MAPPING, + 'out_doc_versioning' => $value->OUT_DOC_VERSIONING, + 'out_doc_destination_path' => $value->OUT_DOC_DESTINATION_PATH, + 'out_doc_tags' => $value->OUT_DOC_TAGS, + 'out_doc_pdf_security_enabled' => $value->OUT_DOC_PDF_SECURITY_ENABLED, + 'out_doc_pdf_security_permissions' => $value->OUT_DOC_PDF_SECURITY_PERMISSIONS, + 'out_doc_open_type' => $value->OUT_DOC_OPEN_TYPE, + 'out_doc_header' => json_decode($value->OUT_DOC_HEADER), + 'out_doc_footer' => json_decode($value->OUT_DOC_FOOTER) + ]; } - $oDataset->next(); } - return $outputDocArray; + return $result; } catch (Exception $e) { throw $e; } @@ -181,6 +119,19 @@ class OutputDocument */ public function addOutputDocument($sProcessUID, $outputDocumentData) { + if (empty($outputDocumentData['out_doc_header'])) { + $outputDocumentData['out_doc_header'] = []; + } + if (isset($outputDocumentData['out_doc_header'])) { + $outputDocumentData['out_doc_header'] = json_encode($outputDocumentData['out_doc_header']); + } + if (empty($outputDocumentData['out_doc_footer'])) { + $outputDocumentData['out_doc_footer'] = []; + } + if (isset($outputDocumentData['out_doc_footer'])) { + $outputDocumentData['out_doc_footer'] = json_encode($outputDocumentData['out_doc_footer']); + } + $pemission = $outputDocumentData['out_doc_pdf_security_permissions']; $pemission = explode("|", $pemission); foreach ($pemission as $row) { @@ -244,6 +195,19 @@ class OutputDocument */ public function updateOutputDocument($sProcessUID, $outputDocumentData, $sFlag, $sOutputDocumentUID = '') { + if (empty($outputDocumentData['out_doc_header'])) { + $outputDocumentData['out_doc_header'] = []; + } + if (isset($outputDocumentData['out_doc_header'])) { + $outputDocumentData['out_doc_header'] = json_encode($outputDocumentData['out_doc_header']); + } + if (empty($outputDocumentData['out_doc_footer'])) { + $outputDocumentData['out_doc_footer'] = []; + } + if (isset($outputDocumentData['out_doc_footer'])) { + $outputDocumentData['out_doc_footer'] = json_encode($outputDocumentData['out_doc_footer']); + } + $oConnection = \Propel::getConnection(\OutputDocumentPeer::DATABASE_NAME); $pemission = $outputDocumentData['out_doc_pdf_security_permissions']; $pemission = explode("|", $pemission); From beacac5a5b27a370e36ceb18440e09d6ff7612ee Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Mon, 17 Jan 2022 09:44:48 -0400 Subject: [PATCH 3/9] PMCORE-3540 BE: Generate a output document using the header, footer and pagination defined --- .../src/ProcessMaker/PDF/BasicStructTest.php | 317 +++++++++++++++++ .../src/ProcessMaker/PDF/FooterStructTest.php | 317 +++++++++++++++++ .../src/ProcessMaker/PDF/HeaderStructTest.php | 311 ++++++++++++++++ .../PDF/TCPDFHeaderFooterTest.php | 173 +++++++++ .../engine/classes/model/OutputDocument.php | 73 +++- .../src/ProcessMaker/PDF/BasicStruct.php | 336 ++++++++++++++++++ .../src/ProcessMaker/PDF/FooterStruct.php | 11 + .../src/ProcessMaker/PDF/HeaderStruct.php | 11 + .../ProcessMaker/PDF/TCPDFHeaderFooter.php | 242 +++++++++++++ 9 files changed, 1788 insertions(+), 3 deletions(-) create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/PDF/BasicStructTest.php create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/PDF/FooterStructTest.php create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/PDF/HeaderStructTest.php create mode 100644 tests/unit/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooterTest.php create mode 100644 workflow/engine/src/ProcessMaker/PDF/BasicStruct.php create mode 100644 workflow/engine/src/ProcessMaker/PDF/FooterStruct.php create mode 100644 workflow/engine/src/ProcessMaker/PDF/HeaderStruct.php create mode 100644 workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php diff --git a/tests/unit/workflow/engine/src/ProcessMaker/PDF/BasicStructTest.php b/tests/unit/workflow/engine/src/ProcessMaker/PDF/BasicStructTest.php new file mode 100644 index 000000000..1dbbc9f75 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/PDF/BasicStructTest.php @@ -0,0 +1,317 @@ +faker = Factory::create(); + $this->mock = $this->getMockForTrait('ProcessMaker\PDF\BasicStruct'); + } + + /** + * tearDown method. + */ + public function tearDown() + { + parent::tearDown(); + } + + /** + * This test the getLogo method. + * @covers ProcessMaker\PDF\BasicStruct::getLogo() + * @test + */ + public function it_should_test_the_method_getLogo() + { + $this->assertTrue(is_string($this->mock->getLogo())); + } + + /** + * This test the getLogoWidth method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoWidth() + * @test + */ + public function it_should_test_the_method_getLogoWidth() + { + $this->assertTrue(is_float($this->mock->getLogoWidth())); + } + + /** + * This test the getLogoPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoPositionX() + * @test + */ + public function it_should_test_the_method_getLogoPositionX() + { + $this->assertTrue(is_float($this->mock->getLogoPositionX())); + } + + /** + * This test the getLogoPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoPositionY() + * @test + */ + public function it_should_test_the_method_getLogoPositionY() + { + $this->assertTrue(is_float($this->mock->getLogoPositionY())); + } + + /** + * This test the getTitle method. + * @covers ProcessMaker\PDF\BasicStruct::getTitle() + * @test + */ + public function it_should_test_the_method_getTitle() + { + $this->assertTrue(is_string($this->mock->getTitle())); + } + + /** + * This test the getTitleFontSize method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontSize() + * @test + */ + public function it_should_test_the_method_getTitleFontSize() + { + $this->assertTrue(is_float($this->mock->getTitleFontSize())); + } + + /** + * This test the getTitleFontPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontPositionX() + * @test + */ + public function it_should_test_the_method_getTitleFontPositionX() + { + $this->assertTrue(is_float($this->mock->getTitleFontPositionX())); + } + + /** + * This test the getTitleFontPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontPositionY() + * @test + */ + public function it_should_test_the_method_getTitleFontPositionY() + { + $this->assertTrue(is_float($this->mock->getTitleFontPositionY())); + } + + /** + * This test the getPageNumber method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumber() + * @test + */ + public function it_should_test_the_method_getPageNumber() + { + $this->assertTrue(is_bool($this->mock->getPageNumber())); + } + + /** + * This test the getPageNumberTitle method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberTitle() + * @test + */ + public function it_should_test_the_method_getPageNumberTitle() + { + $this->assertTrue(is_string($this->mock->getPageNumberTitle())); + } + + /** + * This test the getPageNumberTotal method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberTotal() + * @test + */ + public function it_should_test_the_method_getPageNumberTotal() + { + $this->assertTrue(is_bool($this->mock->getPageNumberTotal())); + } + + /** + * This test the getPageNumberPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberPositionX() + * @test + */ + public function it_should_test_the_method_getPageNumberPositionX() + { + $this->assertTrue(is_float($this->mock->getPageNumberPositionX())); + } + + /** + * This test the getPageNumberPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberPositionY() + * @test + */ + public function it_should_test_the_method_getPageNumberPositionY() + { + $this->assertTrue(is_float($this->mock->getPageNumberPositionY())); + } + + /** + * This test the setTitle method. + * @covers ProcessMaker\PDF\BasicStruct::setTitle() + * @test + */ + public function it_should_test_the_method_setTitle() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setTitle($this->faker->title)); + } + + /** + * This test the setTitleFontSize method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontSize() + * @test + */ + public function it_should_test_the_method_setTitleFontSize() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setTitleFontSize($this->faker->randomFloat())); + } + + /** + * This test the setTitleFontPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontPositionX() + * @test + */ + public function it_should_test_the_method_setTitleFontPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setTitleFontPositionX($this->faker->randomFloat())); + } + + /** + * This test the setTitleFontPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontPositionY() + * @test + */ + public function it_should_test_the_method_setTitleFontPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setTitleFontPositionY($this->faker->randomFloat())); + } + + /** + * This test the setLogo method. + * @covers ProcessMaker\PDF\BasicStruct::setLogo() + * @test + */ + public function it_should_test_the_method_setLogo() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setLogo($this->faker->word)); + } + + /** + * This test the setLogoWidth method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoWidth() + * @test + */ + public function it_should_test_the_method_setLogoWidth() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setLogoWidth($this->faker->randomFloat())); + } + + /** + * This test the setLogoPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoPositionX() + * @test + */ + public function it_should_test_the_method_setLogoPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setLogoPositionX($this->faker->randomFloat())); + } + + /** + * This test the setLogoPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoPositionY() + * @test + */ + public function it_should_test_the_method_setLogoPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setLogoPositionY($this->faker->randomFloat())); + } + + /** + * This test the setPageNumber method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumber() + * @test + */ + public function it_should_test_the_method_setPageNumber() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setPageNumber($this->faker->boolean)); + } + + /** + * This test the setPageNumberTitle method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberTitle() + * @test + */ + public function it_should_test_the_method_setPageNumberTitle() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setPageNumberTitle($this->faker->title)); + } + + /** + * This test the setPageNumberTotal method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberTotal() + * @test + */ + public function it_should_test_the_method_setPageNumberTotal() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setPageNumberTotal($this->faker->boolean)); + } + + /** + * This test the setPageNumberPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberPositionX() + * @test + */ + public function it_should_test_the_method_setPageNumberPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setPageNumberPositionX($this->faker->randomFloat())); + } + + /** + * This test the setPageNumberPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberPositionY() + * @test + */ + public function it_should_test_the_method_setPageNumberPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->mock->setPageNumberPositionY($this->faker->randomFloat())); + } + +} diff --git a/tests/unit/workflow/engine/src/ProcessMaker/PDF/FooterStructTest.php b/tests/unit/workflow/engine/src/ProcessMaker/PDF/FooterStructTest.php new file mode 100644 index 000000000..11f82d0fa --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/PDF/FooterStructTest.php @@ -0,0 +1,317 @@ +faker = Factory::create(); + $this->object = new FooterStruct(); + } + + /** + * tearDown method. + */ + public function tearDown() + { + parent::tearDown(); + } + + /** + * This test the getLogo method. + * @covers ProcessMaker\PDF\BasicStruct::getLogo() + * @test + */ + public function it_should_test_the_method_getLogo() + { + $this->assertTrue(is_string($this->object->getLogo())); + } + + /** + * This test the getLogoWidth method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoWidth() + * @test + */ + public function it_should_test_the_method_getLogoWidth() + { + $this->assertTrue(is_float($this->object->getLogoWidth())); + } + + /** + * This test the getLogoPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoPositionX() + * @test + */ + public function it_should_test_the_method_getLogoPositionX() + { + $this->assertTrue(is_float($this->object->getLogoPositionX())); + } + + /** + * This test the getLogoPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoPositionY() + * @test + */ + public function it_should_test_the_method_getLogoPositionY() + { + $this->assertTrue(is_float($this->object->getLogoPositionY())); + } + + /** + * This test the getTitle method. + * @covers ProcessMaker\PDF\BasicStruct::getTitle() + * @test + */ + public function it_should_test_the_method_getTitle() + { + $this->assertTrue(is_string($this->object->getTitle())); + } + + /** + * This test the getTitleFontSize method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontSize() + * @test + */ + public function it_should_test_the_method_getTitleFontSize() + { + $this->assertTrue(is_float($this->object->getTitleFontSize())); + } + + /** + * This test the getTitleFontPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontPositionX() + * @test + */ + public function it_should_test_the_method_getTitleFontPositionX() + { + $this->assertTrue(is_float($this->object->getTitleFontPositionX())); + } + + /** + * This test the getTitleFontPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontPositionY() + * @test + */ + public function it_should_test_the_method_getTitleFontPositionY() + { + $this->assertTrue(is_float($this->object->getTitleFontPositionY())); + } + + /** + * This test the getPageNumber method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumber() + * @test + */ + public function it_should_test_the_method_getPageNumber() + { + $this->assertTrue(is_bool($this->object->getPageNumber())); + } + + /** + * This test the getPageNumberTitle method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberTitle() + * @test + */ + public function it_should_test_the_method_getPageNumberTitle() + { + $this->assertTrue(is_string($this->object->getPageNumberTitle())); + } + + /** + * This test the getPageNumberTotal method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberTotal() + * @test + */ + public function it_should_test_the_method_getPageNumberTotal() + { + $this->assertTrue(is_bool($this->object->getPageNumberTotal())); + } + + /** + * This test the getPageNumberPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberPositionX() + * @test + */ + public function it_should_test_the_method_getPageNumberPositionX() + { + $this->assertTrue(is_float($this->object->getPageNumberPositionX())); + } + + /** + * This test the getPageNumberPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberPositionY() + * @test + */ + public function it_should_test_the_method_getPageNumberPositionY() + { + $this->assertTrue(is_float($this->object->getPageNumberPositionY())); + } + + /** + * This test the setTitle method. + * @covers ProcessMaker\PDF\BasicStruct::setTitle() + * @test + */ + public function it_should_test_the_method_setTitle() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitle($this->faker->title)); + } + + /** + * This test the setTitleFontSize method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontSize() + * @test + */ + public function it_should_test_the_method_setTitleFontSize() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitleFontSize($this->faker->randomFloat())); + } + + /** + * This test the setTitleFontPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontPositionX() + * @test + */ + public function it_should_test_the_method_setTitleFontPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitleFontPositionX($this->faker->randomFloat())); + } + + /** + * This test the setTitleFontPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontPositionY() + * @test + */ + public function it_should_test_the_method_setTitleFontPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitleFontPositionY($this->faker->randomFloat())); + } + + /** + * This test the setLogo method. + * @covers ProcessMaker\PDF\BasicStruct::setLogo() + * @test + */ + public function it_should_test_the_method_setLogo() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogo($this->faker->word)); + } + + /** + * This test the setLogoWidth method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoWidth() + * @test + */ + public function it_should_test_the_method_setLogoWidth() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogoWidth($this->faker->randomFloat())); + } + + /** + * This test the setLogoPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoPositionX() + * @test + */ + public function it_should_test_the_method_setLogoPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogoPositionX($this->faker->randomFloat())); + } + + /** + * This test the setLogoPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoPositionY() + * @test + */ + public function it_should_test_the_method_setLogoPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogoPositionY($this->faker->randomFloat())); + } + + /** + * This test the setPageNumber method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumber() + * @test + */ + public function it_should_test_the_method_setPageNumber() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumber($this->faker->boolean)); + } + + /** + * This test the setPageNumberTitle method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberTitle() + * @test + */ + public function it_should_test_the_method_setPageNumberTitle() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberTitle($this->faker->title)); + } + + /** + * This test the setPageNumberTotal method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberTotal() + * @test + */ + public function it_should_test_the_method_setPageNumberTotal() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberTotal($this->faker->boolean)); + } + + /** + * This test the setPageNumberPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberPositionX() + * @test + */ + public function it_should_test_the_method_setPageNumberPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberPositionX($this->faker->randomFloat())); + } + + /** + * This test the setPageNumberPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberPositionY() + * @test + */ + public function it_should_test_the_method_setPageNumberPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberPositionY($this->faker->randomFloat())); + } + +} diff --git a/tests/unit/workflow/engine/src/ProcessMaker/PDF/HeaderStructTest.php b/tests/unit/workflow/engine/src/ProcessMaker/PDF/HeaderStructTest.php new file mode 100644 index 000000000..6d018d8b4 --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/PDF/HeaderStructTest.php @@ -0,0 +1,311 @@ +faker = Factory::create(); + $this->object = new HeaderStruct(); + } + + /** + * tearDown method. + */ + public function tearDown() + { + parent::tearDown(); + } + + /** + * This test the getLogo method. + * @covers ProcessMaker\PDF\BasicStruct::getLogo() + * @test + */ + public function it_should_test_the_method_getLogo() + { + $this->assertTrue(is_string($this->object->getLogo())); + } + + /** + * This test the getLogoWidth method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoWidth() + * @test + */ + public function it_should_test_the_method_getLogoWidth() + { + $this->assertTrue(is_float($this->object->getLogoWidth())); + } + + /** + * This test the getLogoPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoPositionX() + * @test + */ + public function it_should_test_the_method_getLogoPositionX() + { + $this->assertTrue(is_float($this->object->getLogoPositionX())); + } + + /** + * This test the getLogoPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getLogoPositionY() + * @test + */ + public function it_should_test_the_method_getLogoPositionY() + { + $this->assertTrue(is_float($this->object->getLogoPositionY())); + } + + /** + * This test the getTitle method. + * @covers ProcessMaker\PDF\BasicStruct::getTitle() + * @test + */ + public function it_should_test_the_method_getTitle() + { + $this->assertTrue(is_string($this->object->getTitle())); + } + + /** + * This test the getTitleFontSize method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontSize() + * @test + */ + public function it_should_test_the_method_getTitleFontSize() + { + $this->assertTrue(is_float($this->object->getTitleFontSize())); + } + + /** + * This test the getTitleFontPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontPositionX() + * @test + */ + public function it_should_test_the_method_getTitleFontPositionX() + { + $this->assertTrue(is_float($this->object->getTitleFontPositionX())); + } + + /** + * This test the getTitleFontPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getTitleFontPositionY() + * @test + */ + public function it_should_test_the_method_getTitleFontPositionY() + { + $this->assertTrue(is_float($this->object->getTitleFontPositionY())); + } + + /** + * This test the getPageNumber method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumber() + * @test + */ + public function it_should_test_the_method_getPageNumber() + { + $this->assertTrue(is_bool($this->object->getPageNumber())); + } + + /** + * This test the getPageNumberTitle method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberTitle() + * @test + */ + public function it_should_test_the_method_getPageNumberTitle() + { + $this->assertTrue(is_string($this->object->getPageNumberTitle())); + } + + /** + * This test the getPageNumberTotal method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberTotal() + * @test + */ + public function it_should_test_the_method_getPageNumberTotal() + { + $this->assertTrue(is_bool($this->object->getPageNumberTotal())); + } + + /** + * This test the getPageNumberPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberPositionX() + * @test + */ + public function it_should_test_the_method_getPageNumberPositionX() + { + $this->assertTrue(is_float($this->object->getPageNumberPositionX())); + } + + /** + * This test the getPageNumberPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::getPageNumberPositionY() + * @test + */ + public function it_should_test_the_method_getPageNumberPositionY() + { + $this->assertTrue(is_float($this->object->getPageNumberPositionY())); + } + + /** + * This test the setTitle method. + * @covers ProcessMaker\PDF\BasicStruct::setTitle() + * @test + */ + public function it_should_test_the_method_setTitle() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitle($this->faker->title)); + } + + /** + * This test the setTitleFontSize method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontSize() + * @test + */ + public function it_should_test_the_method_setTitleFontSize() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitleFontSize($this->faker->randomFloat())); + } + + /** + * This test the setTitleFontPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontPositionX() + * @test + */ + public function it_should_test_the_method_setTitleFontPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitleFontPositionX($this->faker->randomFloat())); + } + + /** + * This test the setTitleFontPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setTitleFontPositionY() + * @test + */ + public function it_should_test_the_method_setTitleFontPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setTitleFontPositionY($this->faker->randomFloat())); + } + + /** + * This test the setLogo method. + * @covers ProcessMaker\PDF\BasicStruct::setLogo() + * @test + */ + public function it_should_test_the_method_setLogo() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogo($this->faker->word)); + } + + /** + * This test the setLogoWidth method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoWidth() + * @test + */ + public function it_should_test_the_method_setLogoWidth() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogoWidth($this->faker->randomFloat())); + } + + /** + * This test the setLogoPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoPositionX() + * @test + */ + public function it_should_test_the_method_setLogoPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogoPositionX($this->faker->randomFloat())); + } + + /** + * This test the setLogoPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setLogoPositionY() + * @test + */ + public function it_should_test_the_method_setLogoPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setLogoPositionY($this->faker->randomFloat())); + } + + /** + * This test the setPageNumber method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumber() + * @test + */ + public function it_should_test_the_method_setPageNumber() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumber($this->faker->boolean)); + } + + /** + * This test the setPageNumberTitle method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberTitle() + * @test + */ + public function it_should_test_the_method_setPageNumberTitle() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberTitle($this->faker->title)); + } + + /** + * This test the setPageNumberTotal method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberTotal() + * @test + */ + public function it_should_test_the_method_setPageNumberTotal() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberTotal($this->faker->boolean)); + } + + /** + * This test the setPageNumberPositionX method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberPositionX() + * @test + */ + public function it_should_test_the_method_setPageNumberPositionX() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberPositionX($this->faker->randomFloat())); + } + + /** + * This test the setPageNumberPositionY method. + * @covers ProcessMaker\PDF\BasicStruct::setPageNumberPositionY() + * @test + */ + public function it_should_test_the_method_setPageNumberPositionY() + { + $this->faker->numberBetween(400, 500); + $this->assertEmpty($this->object->setPageNumberPositionY($this->faker->randomFloat())); + } + +} diff --git a/tests/unit/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooterTest.php b/tests/unit/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooterTest.php new file mode 100644 index 000000000..86270cd5d --- /dev/null +++ b/tests/unit/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooterTest.php @@ -0,0 +1,173 @@ +object = new TCPDFHeaderFooter('P', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); + $this->object->SetCreator(PDF_CREATOR); + $this->object->SetAuthor('admin'); + $this->object->SetTitle('test'); + $this->object->SetSubject('test.pdf'); + $this->object->SetCompression(true); + $this->setHeaderData(); + $this->setFooterData(); + } + + /** + * tearDown method. + */ + protected function tearDown() + { + parent::tearDown(); + } + + /** + * Setting data for header configuration. + */ + private function setHeaderData() + { + $header = new stdClass(); + $header->logo = PATH_TRUNK . "/vendor/tecnickcom/tcpdf/examples/images/logo_example.jpg"; + $header->logoWidth = 10; + $header->logoPositionX = 50; + $header->logoPositionY = 0; + $header->title = "Test1 Test1"; + $header->titleFontSize = 60; + $header->titleFontPositionX = 10; + $header->titleFontPositionY = 0; + $header->pageNumber = true; + $header->pageNumberTitle = "Pages"; + $header->pageNumberTotal = true; + $header->pageNumberPositionX = 10; + $header->pageNumberPositionY = 0; + + $struct = $this->object->getHeaderStruct(); + $struct->setLogo($header->logo); + $struct->setLogoWidth($header->logoWidth); + $struct->setLogoPositionX($header->logoPositionX); + $struct->setLogoPositionY($header->logoPositionY); + + $struct->setTitle($header->title); + $struct->setTitleFontSize($header->titleFontSize); + $struct->setTitleFontPositionX($header->titleFontPositionX); + $struct->setTitleFontPositionY($header->titleFontPositionY); + + $struct->setPageNumber($header->pageNumber); + $struct->setPageNumberTitle($header->pageNumberTitle); + $struct->setPageNumberTotal($header->pageNumberTotal); + $struct->setPageNumberPositionX($header->pageNumberPositionX); + $struct->setPageNumberPositionY($header->pageNumberPositionY); + } + + /** + * Setting data for footer configuration. + */ + private function setFooterData() + { + $footer = new stdClass(); + $footer->logo = PATH_TRUNK . "/vendor/tecnickcom/tcpdf/examples/images/logo_example.jpg"; + $footer->logoWidth = 15; + $footer->logoPositionX = 10; + $footer->logoPositionY = 0; + $footer->title = "Hola mundo como estas"; + $footer->titleFontSize = 20; + $footer->titleFontPositionX = 0; + $footer->titleFontPositionY = 5; + $footer->pageNumber = true; + $footer->pageNumberTitle = "Pages"; + $footer->pageNumberTotal = true; + $footer->pageNumberPositionX = 40; + $footer->pageNumberPositionY = 5; + + $struct = $this->object->getFooterStruct(); + $struct->setLogo($footer->logo); + $struct->setLogoWidth($footer->logoWidth); + $struct->setLogoPositionX($footer->logoPositionX); + $struct->setLogoPositionY($footer->logoPositionY); + + $struct->setTitle($footer->title); + $struct->setTitleFontSize($footer->titleFontSize); + $struct->setTitleFontPositionX($footer->titleFontPositionX); + $struct->setTitleFontPositionY($footer->titleFontPositionY); + + $struct->setPageNumber($footer->pageNumber); + $struct->setPageNumberTitle($footer->pageNumberTitle); + $struct->setPageNumberTotal($footer->pageNumberTotal); + $struct->setPageNumberPositionX($footer->pageNumberPositionX); + $struct->setPageNumberPositionY($footer->pageNumberPositionY); + } + + /** + * This test the getHeaderStruct() method. + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::getHeaderStruct() + * @test + */ + public function it_should_test_the_getHeaderStruct() + { + $result = $this->object->getHeaderStruct(); + $this->assertNotNull($result); + $this->assertEquals(HeaderStruct::class, get_class($result)); + } + + /** + * This test the getFooterStruct() method. + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::getFooterStruct() + * @test + */ + public function it_should_test_the_getFooterStruct() + { + $result = $this->object->getFooterStruct(); + $this->assertNotNull($result); + $this->assertEquals(FooterStruct::class, get_class($result)); + } + + /** + * This test the Header() method override. + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::Header() + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::buildHeaderLogo() + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::buildHeaderTitle() + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::buildHeaderPageNumber() + * @test + */ + public function it_should_test_the_Header() + { + $this->object->AddPage(); + $result = $this->object->Header(); + $this->assertEmpty($result); + } + + /** + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::Footer() + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::buildFooterLogo() + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::buildFooterTitle() + * @covers ProcessMaker\PDF\TCPDFHeaderFooter::buildFooterPageNumber() + * @test + */ + public function it_should_test_the_Footer() + { + $this->object->AddPage(); + $result = $this->object->Footer(); + $this->assertEmpty($result); + } + +} diff --git a/workflow/engine/classes/model/OutputDocument.php b/workflow/engine/classes/model/OutputDocument.php index a55b1098e..50058c698 100644 --- a/workflow/engine/classes/model/OutputDocument.php +++ b/workflow/engine/classes/model/OutputDocument.php @@ -2,6 +2,7 @@ use Illuminate\Filesystem\Filesystem; use ProcessMaker\Core\System; +use ProcessMaker\PDF\TCPDFHeaderFooter; class OutputDocument extends BaseOutputDocument { @@ -879,7 +880,7 @@ class OutputDocument extends BaseOutputDocument $content = str_replace("margin-left", "text-indent", $content); // Instance the TCPDF library - $pdf = new TCPDF($orientation, PDF_UNIT, $media, true, 'UTF-8', false); + $pdf = new TCPDFHeaderFooter($orientation, PDF_UNIT, $media, true, 'UTF-8', false); // Set document information $pdf->SetCreator(PDF_CREATOR); @@ -896,8 +897,10 @@ class OutputDocument extends BaseOutputDocument $margins["bottom"] = ($margins["bottom"] >= 0) ? $margins["bottom"] : PDF_MARGIN_BOTTOM; // Set margins configuration - $pdf->setPrintHeader(false); - $pdf->setPrintFooter(false); + $headerOptions = $this->setHeaderOptions($pdf); + $footerOptions = $this->setFooterOptions($pdf); + $pdf->setPrintHeader($headerOptions); + $pdf->setPrintFooter($footerOptions); $pdf->SetLeftMargin($margins['left']); $pdf->SetTopMargin($margins['top']); $pdf->SetRightMargin($margins['right']); @@ -1362,4 +1365,68 @@ class OutputDocument extends BaseOutputDocument // Save the CSS file file_put_contents(K_PATH_FONTS . 'fonts.css', $css); } + + /** + * Set and build if header options exist. + * @param TCPDFHeaderFooter $pdf + * @return bool + */ + private function setHeaderOptions(TCPDFHeaderFooter $pdf): bool + { + if (empty($this->out_doc_header)) { + return false; + } + $header = json_decode($this->out_doc_header); + + $struct = $pdf->getHeaderStruct(); + + $struct->setLogo($header->logo); + $struct->setLogoWidth($header->logoWidth); + $struct->setLogoPositionX($header->logoPositionX); + $struct->setLogoPositionY($header->logoPositionY); + + $struct->setTitle($header->title); + $struct->setTitleFontSize($header->titleFontSize); + $struct->setTitleFontPositionX($header->titleFontPositionX); + $struct->setTitleFontPositionY($header->titleFontPositionY); + + $struct->setPageNumber($header->pageNumber); + $struct->setPageNumberTitle($header->pageNumberTitle); + $struct->setPageNumberTotal($header->pageNumberTotal); + $struct->setPageNumberPositionX($header->pageNumberPositionX); + $struct->setPageNumberPositionY($header->pageNumberPositionY); + return true; + } + + /** + * Set and build if footer options exist. + * @param TCPDFHeaderFooter $pdf + * @return bool + */ + private function setFooterOptions(TCPDFHeaderFooter $pdf): bool + { + if (empty($this->out_doc_footer)) { + return false; + } + $footer = json_decode($this->out_doc_footer); + + $struct = $pdf->getFooterStruct(); + + $struct->setLogo($footer->logo); + $struct->setLogoWidth($footer->logoWidth); + $struct->setLogoPositionX($footer->logoPositionX); + $struct->setLogoPositionY($footer->logoPositionY); + + $struct->setTitle($footer->title); + $struct->setTitleFontSize($footer->titleFontSize); + $struct->setTitleFontPositionX($footer->titleFontPositionX); + $struct->setTitleFontPositionY($footer->titleFontPositionY); + + $struct->setPageNumber($footer->pageNumber); + $struct->setPageNumberTitle($footer->pageNumberTitle); + $struct->setPageNumberTotal($footer->pageNumberTotal); + $struct->setPageNumberPositionX($footer->pageNumberPositionX); + $struct->setPageNumberPositionY($footer->pageNumberPositionY); + return true; + } } diff --git a/workflow/engine/src/ProcessMaker/PDF/BasicStruct.php b/workflow/engine/src/ProcessMaker/PDF/BasicStruct.php new file mode 100644 index 000000000..a357e3259 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/PDF/BasicStruct.php @@ -0,0 +1,336 @@ +logo; + } + + /** + * Get logoWidth property. + * @return float + */ + public function getLogoWidth(): float + { + return $this->logoWidth; + } + + /** + * Get logoPositionX property. + * @return float + */ + public function getLogoPositionX(): float + { + return $this->logoPositionX; + } + + /** + * Get logoPositionY property. + * @return float + */ + public function getLogoPositionY(): float + { + return $this->logoPositionY; + } + + /** + * Get title property. + * @return string + */ + public function getTitle(): string + { + return $this->title; + } + + /** + * Get titleFontSize property. + * @return float + */ + public function getTitleFontSize(): float + { + return $this->titleFontSize; + } + + /** + * Get titleFontPositionX property. + * @return float + */ + public function getTitleFontPositionX(): float + { + return $this->titleFontPositionX; + } + + /** + * Get titleFontPositionY property. + * @return float + */ + public function getTitleFontPositionY(): float + { + return $this->titleFontPositionY; + } + + /** + * Get pageNumber property. + * @return bool + */ + public function getPageNumber(): bool + { + return $this->pageNumber; + } + + /** + * Get pageNumberTitle property. + * @return string + */ + public function getPageNumberTitle(): string + { + return $this->pageNumberTitle; + } + + /** + * Get pageNumberTotal property. + * @return bool + */ + public function getPageNumberTotal(): bool + { + return $this->pageNumberTotal; + } + + /** + * Get pageNumberPositionX property. + * @return float + */ + public function getPageNumberPositionX(): float + { + return $this->pageNumberPositionX; + } + + /** + * Get pageNumberPositionY property. + * @return float + */ + public function getPageNumberPositionY(): float + { + return $this->pageNumberPositionY; + } + + /** + * Set property title. + * @param string $title + * @return void + */ + public function setTitle(string $title): void + { + $this->title = $title; + } + + /** + * Set property titleFontSize. + * @param float $titleFontSize + * @return void + */ + public function setTitleFontSize(float $titleFontSize): void + { + $this->titleFontSize = $titleFontSize; + } + + /** + * Set property titleFontPositionX. + * @param float $titleFontPositionX + * @return void + */ + public function setTitleFontPositionX(float $titleFontPositionX): void + { + $this->titleFontPositionX = $titleFontPositionX; + } + + /** + * Set property titleFontPositionY. + * @param float $titleFontPositionY + * @return void + */ + public function setTitleFontPositionY(float $titleFontPositionY): void + { + $this->titleFontPositionY = $titleFontPositionY; + } + + /** + * Set property logo. + * @param string $logo + * @return void + */ + public function setLogo(string $logo): void + { + $this->logo = $logo; + } + + /** + * Set property logoWidth. + * @param float $logoWidth + * @return void + */ + public function setLogoWidth(float $logoWidth): void + { + $this->logoWidth = $logoWidth; + } + + /** + * Set property logoPositionX. + * @param float $logoPositionX + * @return void + */ + public function setLogoPositionX(float $logoPositionX): void + { + $this->logoPositionX = $logoPositionX; + } + + /** + * Set property logoPositionY. + * @param float $logoPositionY + * @return void + */ + public function setLogoPositionY(float $logoPositionY): void + { + $this->logoPositionY = $logoPositionY; + } + + /** + * Set property pageNumber. + * @param bool $pageNumber + * @return void + */ + public function setPageNumber(bool $pageNumber): void + { + $this->pageNumber = $pageNumber; + } + + /** + * Set property pageNumberTitle. + * @param string $pageNumberTitle + * @return void + */ + public function setPageNumberTitle(string $pageNumberTitle): void + { + $this->pageNumberTitle = $pageNumberTitle; + } + + /** + * Set property pageNumberTotal. + * @param bool $pageNumberTotal + * @return void + */ + public function setPageNumberTotal(bool $pageNumberTotal): void + { + $this->pageNumberTotal = $pageNumberTotal; + } + + /** + * Set property pageNumberPositionX. + * @param float $pageNumberPositionX + * @return void + */ + public function setPageNumberPositionX(float $pageNumberPositionX): void + { + $this->pageNumberPositionX = $pageNumberPositionX; + } + + /** + * Set property pageNumberPositionY. + * @param float $pageNumberPositionY + * @return void + */ + public function setPageNumberPositionY(float $pageNumberPositionY): void + { + $this->pageNumberPositionY = $pageNumberPositionY; + } + +} diff --git a/workflow/engine/src/ProcessMaker/PDF/FooterStruct.php b/workflow/engine/src/ProcessMaker/PDF/FooterStruct.php new file mode 100644 index 000000000..773cf2955 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/PDF/FooterStruct.php @@ -0,0 +1,11 @@ +headerStruct = new HeaderStruct(); + $this->footerStruct = new FooterStruct(); + } + + /** + * Destructor of the class. + */ + public function __destruct() + { + parent::__destruct(); + } + + /** + * Gets an object that contains the properties of the header. + * @return HeaderStruct + */ + public function getHeaderStruct(): HeaderStruct + { + return $this->headerStruct; + } + + /** + * Gets an object that contains the properties of the footer. + * @return FooterStruct + */ + public function getFooterStruct(): FooterStruct + { + return $this->footerStruct; + } + + /** + * This method is used to render the page header. + * This method has been overwritten. + */ + public function Header() + { + $heights = []; + $struct = $this->getHeaderStruct(); + + if (empty($this->originalMargins)) { + $this->originalMargins = $this->getMargins(); + } + $margins = $this->originalMargins; + + $this->buildHeaderLogo($struct, $margins, $heights); + $this->buildHeaderTitle($struct, $margins, $heights); + $this->buildHeaderPageNumber($struct, $margins, $heights); + + //page adjust + $newHeight = max($heights); + $this->SetTopMargin($newHeight); + } + + /** + * Build header logo. + * @param HeaderStruct $struct + * @param array $margins + * @param array $heights + * @return void + */ + private function buildHeaderLogo(HeaderStruct $struct, array $margins, array &$heights): void + { + $path = $struct->getLogo(); + if (!file_exists($path)) { + return; + } + $pathinfo = pathinfo($path); + $imageSize = getimagesize($path); + $extension = $pathinfo['extension']; + $x = $struct->getLogoPositionX() + $margins['left']; + $y = $struct->getLogoPositionY() + $margins['top']; + $width = $struct->getLogoWidth(); + $this->Image($path, $x, $y, $width, 0, $extension, '', '', false, 300, '', false, false, 0, false, false, false); + $newImageHeight = ($width * $imageSize[0] / $imageSize[1]); + $heights[] = $margins['top'] + $newImageHeight; + } + + /** + * Build header title. + * @param HeaderStruct $struct + * @param array $margins + * @param array $heights + * @return void + */ + private function buildHeaderTitle(HeaderStruct $struct, array $margins, array &$heights): void + { + $string = $struct->getTitle(); + $x = $struct->getTitleFontPositionX() + $margins['left']; + $y = $struct->getTitleFontPositionY() + $margins['top']; + $fontSize = $struct->getTitleFontSize(); + $this->SetXY($x, $y); + $this->SetFont('helvetica', 'B', $fontSize); + $this->MultiCell(0, 0, $string, 0, 'L', false, 1, '', '', true, 0, false, true, 0, 'T', false); + $heights[] = $margins['top'] + ($this->getCellHeight($fontSize, false)) / 2; + } + + /** + * Build header page number. + * @param HeaderStruct $struct + * @param array $margins + * @param array $heights + * @return void + */ + private function buildHeaderPageNumber(HeaderStruct $struct, array $margins, array &$heights): void + { + if ($struct->getPageNumber() === true) { + $pageString = empty($struct->getPageNumberTitle()) ? 'Page ' : $struct->getPageNumberTitle() . ' '; + $pageNumberTotal = $struct->getPageNumberTotal() === true ? ' / ' . $this->getAliasNbPages() : ''; + $string = $pageString . $this->getAliasNumPage() . $pageNumberTotal; + $x = $struct->getPageNumberPositionX() + $margins['left']; + $y = $struct->getPageNumberPositionY() + $margins['top']; + $fontSize = 8; + $this->SetXY($x, $y); + $this->SetFont('helvetica', 'I', $fontSize); + $this->Cell(0, 0, $string, 0, 0, '', false, '', 0, false, 'T', 'M'); + $heights[] = $margins['top'] + ($this->getCellHeight($fontSize, false)) / 2; + } + } + + /** + * This method is used to render the page footer. + * This method has been overwritten. + */ + public function Footer() + { + $struct = $this->getFooterStruct(); + + if (empty($this->originalMargins)) { + $this->originalMargins = $this->getMargins(); + } + $margins = $this->originalMargins; + + //page adjust + $this->SetY(-1 * ($margins['bottom'])); + $currentY = $this->GetY(); + + $this->buildFooterLogo($margins, $currentY, $struct); + $this->buildFooterTitle($margins, $currentY, $struct); + $this->buildFooterPageNumber($margins, $currentY, $struct); + } + + /** + * Build footer logo. + * @param array $margins + * @param float $currentY + * @param HeaderStruct $struct + * @return void + */ + private function buildFooterLogo(array $margins, float $currentY, FooterStruct $struct): void + { + $path = $struct->getLogo(); + if (!file_exists($path)) { + return; + } + $pathinfo = pathinfo($path); + $extension = $pathinfo['extension']; + $x = $struct->getLogoPositionX() + $margins['left']; + $y = $struct->getLogoPositionY() + $currentY; + $width = $struct->getLogoWidth(); + $this->Image($path, $x, $y, $width, 0, $extension, '', '', false, 300, '', false, false, 0, false, false, false); + } + + /** + * Build footer title. + * @param array $margins + * @param float $currentY + * @param HeaderStruct $struct + * @return void + */ + private function buildFooterTitle(array $margins, float $currentY, FooterStruct $struct): void + { + $string = $struct->getTitle(); + $x = $struct->getTitleFontPositionX() + $margins['left']; + $y = $struct->getTitleFontPositionY() + $currentY; + $fontSize = $struct->getTitleFontSize(); + $this->SetXY($x, $y); + $this->SetFont('helvetica', 'B', $fontSize); + $this->MultiCell(0, 0, $string, 0, 'L', false, 1, '', '', true, 0, false, true, 0, 'T', false); + } + + /** + * Build footer page number. + * @param array $margins + * @param float $currentY + * @param HeaderStruct $struct + * @return void + */ + private function buildFooterPageNumber(array $margins, float $currentY, FooterStruct $struct): void + { + if ($struct->getPageNumber() === true) { + $pageString = empty($struct->getPageNumberTitle()) ? 'Page ' : $struct->getPageNumberTitle() . ' '; + $pageNumberTotal = $struct->getPageNumberTotal() === true ? ' / ' . $this->getAliasNbPages() : ''; + $string = $pageString . $this->getAliasNumPage() . $pageNumberTotal; + $x = $struct->getPageNumberPositionX() + $margins['left']; + $y = $struct->getPageNumberPositionY() + $currentY; + $fontSize = 8; + $this->SetXY($x, $y); + $this->SetFont('helvetica', 'I', $fontSize); + $this->Cell(0, 0, $string, 0, 0, '', false, '', 0, false, 'T', 'M'); + } + } + +} From 511c39b27ca2d7ffbb5e27931d4ffba9fffb41bb Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Wed, 9 Feb 2022 12:51:47 -0400 Subject: [PATCH 4/9] PMCORE-3657 OutputDocuments compatibility does not work --- .../engine/classes/model/OutputDocument.php | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/workflow/engine/classes/model/OutputDocument.php b/workflow/engine/classes/model/OutputDocument.php index d50874cb3..260459045 100644 --- a/workflow/engine/classes/model/OutputDocument.php +++ b/workflow/engine/classes/model/OutputDocument.php @@ -1387,21 +1387,21 @@ class OutputDocument extends BaseOutputDocument $struct = $pdf->getHeaderStruct(); - $struct->setLogo($header->logo); - $struct->setLogoWidth($header->logoWidth); - $struct->setLogoPositionX($header->logoPositionX); - $struct->setLogoPositionY($header->logoPositionY); + $struct->setLogo($header->logo ?? ''); + $struct->setLogoWidth($header->logoWidth ?? 0); + $struct->setLogoPositionX($header->logoPositionX ?? 0); + $struct->setLogoPositionY($header->logoPositionY ?? 0); - $struct->setTitle($header->title); - $struct->setTitleFontSize($header->titleFontSize); - $struct->setTitleFontPositionX($header->titleFontPositionX); - $struct->setTitleFontPositionY($header->titleFontPositionY); + $struct->setTitle($header->title ?? ''); + $struct->setTitleFontSize($header->titleFontSize ?? 0); + $struct->setTitleFontPositionX($header->titleFontPositionX ?? 0); + $struct->setTitleFontPositionY($header->titleFontPositionY ?? 0); - $struct->setPageNumber($header->pageNumber); - $struct->setPageNumberTitle($header->pageNumberTitle); - $struct->setPageNumberTotal($header->pageNumberTotal); - $struct->setPageNumberPositionX($header->pageNumberPositionX); - $struct->setPageNumberPositionY($header->pageNumberPositionY); + $struct->setPageNumber($header->pageNumber ?? false); + $struct->setPageNumberTitle($header->pageNumberTitle ?? ''); + $struct->setPageNumberTotal($header->pageNumberTotal ?? false); + $struct->setPageNumberPositionX($header->pageNumberPositionX ?? 0); + $struct->setPageNumberPositionY($header->pageNumberPositionY ?? 0); return true; } @@ -1419,21 +1419,21 @@ class OutputDocument extends BaseOutputDocument $struct = $pdf->getFooterStruct(); - $struct->setLogo($footer->logo); - $struct->setLogoWidth($footer->logoWidth); - $struct->setLogoPositionX($footer->logoPositionX); - $struct->setLogoPositionY($footer->logoPositionY); + $struct->setLogo($footer->logo ?? ''); + $struct->setLogoWidth($footer->logoWidth ?? 0); + $struct->setLogoPositionX($footer->logoPositionX ?? 0); + $struct->setLogoPositionY($footer->logoPositionY ?? 0); - $struct->setTitle($footer->title); - $struct->setTitleFontSize($footer->titleFontSize); - $struct->setTitleFontPositionX($footer->titleFontPositionX); - $struct->setTitleFontPositionY($footer->titleFontPositionY); + $struct->setTitle($footer->title ?? ''); + $struct->setTitleFontSize($footer->titleFontSize ?? 0); + $struct->setTitleFontPositionX($footer->titleFontPositionX ?? 0); + $struct->setTitleFontPositionY($footer->titleFontPositionY ?? 0); - $struct->setPageNumber($footer->pageNumber); - $struct->setPageNumberTitle($footer->pageNumberTitle); - $struct->setPageNumberTotal($footer->pageNumberTotal); - $struct->setPageNumberPositionX($footer->pageNumberPositionX); - $struct->setPageNumberPositionY($footer->pageNumberPositionY); + $struct->setPageNumber($footer->pageNumber ?? false); + $struct->setPageNumberTitle($footer->pageNumberTitle ?? ''); + $struct->setPageNumberTotal($footer->pageNumberTotal ?? false); + $struct->setPageNumberPositionX($footer->pageNumberPositionX ?? 0); + $struct->setPageNumberPositionY($footer->pageNumberPositionY ?? 0); return true; } } From e6bca9bb0502e29ff99fd00f4962f1d11e8f1c98 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Tue, 12 Apr 2022 10:15:22 -0400 Subject: [PATCH 5/9] PMCORE-3783 Variables is not working for footers and headers --- .../engine/classes/model/OutputDocument.php | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/workflow/engine/classes/model/OutputDocument.php b/workflow/engine/classes/model/OutputDocument.php index 260459045..a668228bf 100644 --- a/workflow/engine/classes/model/OutputDocument.php +++ b/workflow/engine/classes/model/OutputDocument.php @@ -898,8 +898,8 @@ class OutputDocument extends BaseOutputDocument $margins["bottom"] = ($margins["bottom"] >= 0) ? $margins["bottom"] : PDF_MARGIN_BOTTOM; // Set margins configuration - $headerOptions = $this->setHeaderOptions($pdf); - $footerOptions = $this->setFooterOptions($pdf); + $headerOptions = $this->setHeaderOptions($pdf, $fields); + $footerOptions = $this->setFooterOptions($pdf, $fields); $pdf->setPrintHeader($headerOptions); $pdf->setPrintFooter($footerOptions); $pdf->SetLeftMargin($margins['left']); @@ -1376,9 +1376,10 @@ class OutputDocument extends BaseOutputDocument /** * Set and build if header options exist. * @param TCPDFHeaderFooter $pdf + * @param array $fields * @return bool */ - private function setHeaderOptions(TCPDFHeaderFooter $pdf): bool + private function setHeaderOptions(TCPDFHeaderFooter $pdf, array $fields): bool { if (empty($this->out_doc_header)) { return false; @@ -1387,18 +1388,18 @@ class OutputDocument extends BaseOutputDocument $struct = $pdf->getHeaderStruct(); - $struct->setLogo($header->logo ?? ''); + $struct->setLogo(G::replaceDataField($header->logo ?? '', $fields)); $struct->setLogoWidth($header->logoWidth ?? 0); $struct->setLogoPositionX($header->logoPositionX ?? 0); $struct->setLogoPositionY($header->logoPositionY ?? 0); - $struct->setTitle($header->title ?? ''); + $struct->setTitle(G::replaceDataField($header->title ?? '', $fields)); $struct->setTitleFontSize($header->titleFontSize ?? 0); $struct->setTitleFontPositionX($header->titleFontPositionX ?? 0); $struct->setTitleFontPositionY($header->titleFontPositionY ?? 0); $struct->setPageNumber($header->pageNumber ?? false); - $struct->setPageNumberTitle($header->pageNumberTitle ?? ''); + $struct->setPageNumberTitle(G::replaceDataField($header->pageNumberTitle ?? '', $fields)); $struct->setPageNumberTotal($header->pageNumberTotal ?? false); $struct->setPageNumberPositionX($header->pageNumberPositionX ?? 0); $struct->setPageNumberPositionY($header->pageNumberPositionY ?? 0); @@ -1408,9 +1409,10 @@ class OutputDocument extends BaseOutputDocument /** * Set and build if footer options exist. * @param TCPDFHeaderFooter $pdf + * @param array $fields * @return bool */ - private function setFooterOptions(TCPDFHeaderFooter $pdf): bool + private function setFooterOptions(TCPDFHeaderFooter $pdf, array $fields): bool { if (empty($this->out_doc_footer)) { return false; @@ -1419,18 +1421,18 @@ class OutputDocument extends BaseOutputDocument $struct = $pdf->getFooterStruct(); - $struct->setLogo($footer->logo ?? ''); + $struct->setLogo(G::replaceDataField($footer->logo ?? '', $fields)); $struct->setLogoWidth($footer->logoWidth ?? 0); $struct->setLogoPositionX($footer->logoPositionX ?? 0); $struct->setLogoPositionY($footer->logoPositionY ?? 0); - $struct->setTitle($footer->title ?? ''); + $struct->setTitle(G::replaceDataField($footer->title ?? '', $fields)); $struct->setTitleFontSize($footer->titleFontSize ?? 0); $struct->setTitleFontPositionX($footer->titleFontPositionX ?? 0); $struct->setTitleFontPositionY($footer->titleFontPositionY ?? 0); $struct->setPageNumber($footer->pageNumber ?? false); - $struct->setPageNumberTitle($footer->pageNumberTitle ?? ''); + $struct->setPageNumberTitle(G::replaceDataField($footer->pageNumberTitle ?? '', $fields)); $struct->setPageNumberTotal($footer->pageNumberTotal ?? false); $struct->setPageNumberPositionX($footer->pageNumberPositionX ?? 0); $struct->setPageNumberPositionY($footer->pageNumberPositionY ?? 0); From db242fdab20981853670879a8ee70bcc2a346a7e Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Fri, 13 May 2022 12:16:30 -0400 Subject: [PATCH 6/9] PMCORE-3830 Header and Footer Logo add spaces in the Output document. --- workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php b/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php index b13d18c89..ed69bacdc 100644 --- a/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php +++ b/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php @@ -110,7 +110,7 @@ class TCPDFHeaderFooter extends TCPDF $y = $struct->getLogoPositionY() + $margins['top']; $width = $struct->getLogoWidth(); $this->Image($path, $x, $y, $width, 0, $extension, '', '', false, 300, '', false, false, 0, false, false, false); - $newImageHeight = ($width * $imageSize[0] / $imageSize[1]); + $newImageHeight = ($width * $imageSize[1] / $imageSize[0]); $heights[] = $margins['top'] + $newImageHeight; } From 3b0a0108f1b191a427ab7c93ba87abd7b43f761c Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Fri, 13 May 2022 13:49:38 -0400 Subject: [PATCH 7/9] PMCORE-3788 Footer and header always are disabled --- .../src/ProcessMaker/BusinessModel/OutputDocument.php | 3 +++ .../Services/Api/Project/OutputDocuments.php | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php b/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php index 3e76040e8..e1366738e 100644 --- a/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php +++ b/workflow/engine/src/ProcessMaker/BusinessModel/OutputDocument.php @@ -173,6 +173,9 @@ class OutputDocument } $outDocUid = $oOutputDocument->create($outputDocumentData); $outputDocumentData = array_change_key_case($outputDocumentData, CASE_LOWER); + $outputDocumentData['out_doc_header'] = json_decode($outputDocumentData['out_doc_header']); + $outputDocumentData['out_doc_footer'] = json_decode($outputDocumentData['out_doc_footer']); + $this->updateOutputDocument($sProcessUID, $outputDocumentData, 1, $outDocUid); //Return unset($outputDocumentData["PRO_UID"]); diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project/OutputDocuments.php b/workflow/engine/src/ProcessMaker/Services/Api/Project/OutputDocuments.php index 281fa1397..eeb0ac337 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project/OutputDocuments.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project/OutputDocuments.php @@ -243,5 +243,15 @@ class OutputDocumentStructure * @var int {@from body} {@choice 0,1} */ public $out_doc_open_type; + + /** + * @var array {@from body} + */ + public $out_doc_header; + + /** + * @var array {@from body} + */ + public $out_doc_footer; } From 65d9ad3bd4846428ed61c29cf5be53b1fbf45170 Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Mon, 30 May 2022 09:00:40 -0400 Subject: [PATCH 8/9] PMCORE-3852 Header and Footer are displaying in spite of that options were disabled --- workflow/engine/classes/model/OutputDocument.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/workflow/engine/classes/model/OutputDocument.php b/workflow/engine/classes/model/OutputDocument.php index a668228bf..df339b4f4 100644 --- a/workflow/engine/classes/model/OutputDocument.php +++ b/workflow/engine/classes/model/OutputDocument.php @@ -902,6 +902,11 @@ class OutputDocument extends BaseOutputDocument $footerOptions = $this->setFooterOptions($pdf, $fields); $pdf->setPrintHeader($headerOptions); $pdf->setPrintFooter($footerOptions); + // Important: footer position depends on header enable + if ($footerOptions === true) { + $pdf->setPrintHeader(true); + } + $pdf->SetLeftMargin($margins['left']); $pdf->SetTopMargin($margins['top']); $pdf->SetRightMargin($margins['right']); @@ -1385,6 +1390,9 @@ class OutputDocument extends BaseOutputDocument return false; } $header = json_decode($this->out_doc_header); + if ($header->enableHeader === false) { + return false; + } $struct = $pdf->getHeaderStruct(); @@ -1418,6 +1426,9 @@ class OutputDocument extends BaseOutputDocument return false; } $footer = json_decode($this->out_doc_footer); + if ($footer->enableFooter === false) { + return false; + } $struct = $pdf->getFooterStruct(); From afe865c5a4cd78ab723df350371f037c5991a05d Mon Sep 17 00:00:00 2001 From: Roly Gutierrez Date: Tue, 31 May 2022 13:09:47 -0400 Subject: [PATCH 9/9] PMCORE-3851 'Footer section' appears in the top of Document when the margin is equal to 0 (zero) --- workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php b/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php index ed69bacdc..076d409ce 100644 --- a/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php +++ b/workflow/engine/src/ProcessMaker/PDF/TCPDFHeaderFooter.php @@ -170,7 +170,8 @@ class TCPDFHeaderFooter extends TCPDF $margins = $this->originalMargins; //page adjust - $this->SetY(-1 * ($margins['bottom'])); + $bottom = $margins['bottom'] <= 0 ? 1 : $margins['bottom']; + $this->SetY(-1 * $bottom); $currentY = $this->GetY(); $this->buildFooterLogo($margins, $currentY, $struct);