diff --git a/src/app/resource/controllers/ExportController.php b/src/app/resource/controllers/ExportController.php index 597870b5763cfbd9b74db06c54a661b6c1b56be7..2ad02206b37793ac472932db83d86c6cc9195a89 100644 --- a/src/app/resource/controllers/ExportController.php +++ b/src/app/resource/controllers/ExportController.php @@ -16,15 +16,20 @@ namespace Resource\controllers; use Attachment\models\AttachmentModel; use Basket\models\BasketModel; +use Contact\models\ContactModel; use Entity\models\EntityModel; use Entity\models\ListInstanceModel; use Resource\models\ExportTemplateModel; use Resource\models\ResModel; +use Resource\models\ResourceContactModel; use Resource\models\ResourceListModel; use Respect\Validation\Validator; +use setasign\Fpdi\Tcpdf\Fpdi; use Slim\Http\Request; use Slim\Http\Response; +use SrcCore\controllers\AutoCompleteController; use SrcCore\controllers\PreparedClauseController; +use SrcCore\models\DatabaseModel; use SrcCore\models\TextFormatModel; use SrcCore\models\ValidatorModel; use Tag\models\TagModel; @@ -175,12 +180,20 @@ class ExportController 'orderBy' => [$order] ]); - $contentType = ''; if ($body['format'] == 'csv') { $file = ExportController::getCsv(['delimiter' => $body['delimiter'], 'data' => $body['data'], 'resources' => $resources]); $response->write(stream_get_contents($file)); $response = $response->withAddedHeader('Content-Disposition', 'attachment; filename=export_maarch.csv'); $contentType = 'application/vnd.ms-excel'; + } else { + $pdf = ExportController::getPdf(['data' => $body['data'], 'resources' => $resources]); + + $fileContent = $pdf->Output('', 'S'); + $finfo = new \finfo(FILEINFO_MIME_TYPE); + $contentType = $finfo->buffer($fileContent); + + $response->write($fileContent); + $response = $response->withAddedHeader('Content-Disposition', "inline; filename=maarch.pdf"); } return $response->withHeader('Content-Type', $contentType); @@ -228,12 +241,12 @@ class ExportController $csvContent[] = $resource['entwo.short_label']; } elseif ($value['value'] == 'getDestinationEntityType') { $csvContent[] = $resource['enthree.entity_type']; - } elseif ($value['value'] == 'getSender') { - //TODO - $csvContent[] = ''; + } elseif ($value['value'] == 'getSenders') { + $senders = ExportController::getSenders(['resId' => $resource['res_id']]); + $content[] = implode("\n\n", $senders); } elseif ($value['value'] == 'getRecipient') { - //TODO - $csvContent[] = ''; + $recipients = ExportController::getRecipients(['resId' => $resource['res_id']]); + $content[] = implode("\n\n", $recipients); } elseif ($value['value'] == 'getTypist') { $csvContent[] = UserModel::getLabelledUserById(['login' => $resource['typist']]); } elseif ($value['value'] == 'getAssignee') { @@ -267,74 +280,98 @@ class ExportController ValidatorModel::notEmpty($aArgs, ['data', 'resources']); ValidatorModel::arrayType($aArgs, ['data', 'resources']); - $file = fopen('php://memory', 'w'); - $delimiter = ($aArgs['delimiter'] == 'TAB' ? "\t" : $aArgs['delimiter']); + $columnsNumber = count($aArgs['data']); + $orientation = 'P'; + if ($columnsNumber > 5) { + $orientation = 'L'; + } - $csvHead = []; + $pdf = new Fpdi($orientation, 'pt'); + $pdf->setPrintHeader(false); + + $pdf->AddPage(); + $dimensions = $pdf->getPageDimensions(); + $widthNoMargins = $dimensions['w'] - $dimensions['rm'] - $dimensions['lm']; + $bottomHeight = $dimensions['h'] - $dimensions['bm']; + + $labels = []; foreach ($aArgs['data'] as $value) { - $csvHead[] = $value['label']; + $labels[] = $value['label']; } - fputcsv($file, $csvHead, $delimiter); + $pdf->SetFont('', 'B', 12); + $labelHeight = ExportController::getMaximumHeight($pdf, ['data' => $labels, 'width' => $widthNoMargins / $columnsNumber]); + foreach ($aArgs['data'] as $value) { + $pdf->MultiCell($widthNoMargins / $columnsNumber, $labelHeight, $value['label'], 1, 'L', false, 0); + } + + $pdf->SetY($pdf->GetY() + $labelHeight); + $pdf->SetFont('', '', 10); foreach ($aArgs['resources'] as $resource) { - $csvContent = []; + $content = []; foreach ($aArgs['data'] as $value) { if (empty($value['value'])) { - $csvContent[] = ''; continue; } if ($value['isFunction']) { if ($value['value'] == 'getStatus') { - $csvContent[] = $resource['status.label_status']; + $content[] = $resource['status.label_status']; } elseif ($value['value'] == 'getPriority') { - $csvContent[] = $resource['priorities.label']; + $content[] = $resource['priorities.label']; } elseif ($value['value'] == 'getCopies') { - $csvContent[] = ExportController::getCopies(['resId' => $resource['res_id']]); + $content[] = ExportController::getCopies(['resId' => $resource['res_id']]); } elseif ($value['value'] == 'getDetailLink') { - $csvContent[] = str_replace('rest/', "apps/maarch_entreprise/index.php?page=details&dir=indexing_searching&id={$resource['res_id']}", \Url::coreurl()); + $content[] = str_replace('rest/', "apps/maarch_entreprise/index.php?page=details&dir=indexing_searching&id={$resource['res_id']}", \Url::coreurl()); } elseif ($value['value'] == 'getParentFolder') { - $csvContent[] = $resource['folders.folder_name']; + $content[] = $resource['folders.folder_name']; } elseif ($value['value'] == 'getCategory') { - $csvContent[] = ResModel::getCategoryLabel(['categoryId' => $resource['category_id']]); + $content[] = ResModel::getCategoryLabel(['categoryId' => $resource['category_id']]); } elseif ($value['value'] == 'getInitiatorEntity') { - $csvContent[] = $resource['enone.short_label']; + $content[] = $resource['enone.short_label']; } elseif ($value['value'] == 'getDestinationEntity') { - $csvContent[] = $resource['entwo.short_label']; + $content[] = $resource['entwo.short_label']; } elseif ($value['value'] == 'getDestinationEntityType') { - $csvContent[] = $resource['enthree.entity_type']; - } elseif ($value['value'] == 'getSender') { - //TODO - $csvContent[] = ''; - } elseif ($value['value'] == 'getRecipient') { - //TODO - $csvContent[] = ''; + $content[] = $resource['enthree.entity_type']; + } elseif ($value['value'] == 'getSenders') { + $senders = ExportController::getSenders(['resId' => $resource['res_id']]); + $content[] = implode("\n\n", $senders); + } elseif ($value['value'] == 'getRecipients') { + $recipients = ExportController::getRecipients(['resId' => $resource['res_id']]); + $content[] = implode("\n\n", $recipients); } elseif ($value['value'] == 'getTypist') { - $csvContent[] = UserModel::getLabelledUserById(['login' => $resource['typist']]); + $content[] = UserModel::getLabelledUserById(['login' => $resource['typist']]); } elseif ($value['value'] == 'getAssignee') { - $csvContent[] = UserModel::getLabelledUserById(['login' => $resource['dest_user']]); + $content[] = UserModel::getLabelledUserById(['login' => $resource['dest_user']]); } elseif ($value['value'] == 'getTags') { - $csvContent[] = ExportController::getTags(['resId' => $resource['res_id']]); + $content[] = ExportController::getTags(['resId' => $resource['res_id']]); } elseif ($value['value'] == 'getSignatories') { - $csvContent[] = ExportController::getSignatories(['resId' => $resource['res_id']]); + $content[] = ExportController::getSignatories(['resId' => $resource['res_id']]); } elseif ($value['value'] == 'getSignatureDates') { - $csvContent[] = ExportController::getSignatureDates(['resId' => $resource['res_id']]); + $content[] = ExportController::getSignatureDates(['resId' => $resource['res_id']]); } } else { $allDates = ['doc_date', 'departure_date', 'admission_date', 'process_limit_date', 'opinion_limit_date', 'closing_date', 'sve_start_date']; if (in_array($value['value'], $allDates)) { - $csvContent[] = TextFormatModel::formatDate($resource[$value['value']]); + $content[] = TextFormatModel::formatDate($resource[$value['value']]); } else { - $csvContent[] = $resource[$value['value']]; + $content[] = $resource[$value['value']]; } } } - fputcsv($file, $csvContent, $delimiter); + if (!empty($contentHeight)) { + $pdf->SetY($pdf->GetY() + $contentHeight); + } + $contentHeight = ExportController::getMaximumHeight($pdf, ['data' => $content, 'width' => $widthNoMargins / $columnsNumber]); + if (($pdf->GetY() + $contentHeight) > $bottomHeight) { + $pdf->AddPage(); + } + foreach ($content as $value) { + $pdf->MultiCell($widthNoMargins / $columnsNumber, $contentHeight, $value, 1, 'L', false, 0); + } } - rewind($file); - - return $file; + return $pdf; } private static function getCopies(array $args) @@ -434,4 +471,141 @@ class ExportController return $dates; } + + private static function getSenders(array $args) + { + ValidatorModel::notEmpty($args, ['resId']); + ValidatorModel::intVal($args, ['resId']); + + $ext = ResModel::getExtById(['select' => ['category_id', 'address_id', 'exp_user_id', 'dest_user_id', 'is_multicontacts'], 'resId' => $args['resId']]); + + $senders = []; + if (!empty($ext)) { + if ($ext['category_id'] == 'outgoing') { + $resourcesContacts = ResourceContactModel::getFormattedByResId(['resId' => $args['resId']]); + foreach ($resourcesContacts as $resourcesContact) { + $senders[] = $resourcesContact['format']; + } + } else { + $rawContacts = []; + if ($ext['is_multicontacts'] == 'Y') { + $multiContacts = DatabaseModel::select([ + 'select' => ['contact_id', 'address_id'], + 'table' => ['contacts_res'], + 'where' => ['res_id = ?', 'mode = ?'], + 'data' => [$args['resId'], 'multi'] + ]); + foreach ($multiContacts as $multiContact) { + $rawContacts[] = [ + 'login' => $multiContact['contact_id'], + 'address_id' => $multiContact['address_id'], + ]; + } + } else { + $rawContacts[] = [ + 'login' => $ext['dest_user_id'], + 'address_id' => $ext['address_id'], + ]; + } + foreach ($rawContacts as $rawContact) { + if (!empty($rawContact['address_id'])) { + $contact = ContactModel::getOnView([ + 'select' => [ + 'is_corporate_person', 'lastname', 'firstname', 'address_num', 'address_street', 'address_town', 'address_postal_code', + 'ca_id', 'society', 'contact_firstname', 'contact_lastname', 'address_country' + ], + 'where' => ['ca_id = ?'], + 'data' => [$rawContact['address_id']] + ]); + if (isset($contact[0])) { + $contact = AutoCompleteController::getFormattedContact(['contact' => $contact[0]]); + $senders[] = $contact['contact']['otherInfo']; + } + } else { + $senders[] = UserModel::getLabelledUserById(['login' => $rawContact['login']]); + } + } + } + } + + return $senders; + } + + private static function getRecipients(array $args) + { + ValidatorModel::notEmpty($args, ['resId']); + ValidatorModel::intVal($args, ['resId']); + + $ext = ResModel::getExtById(['select' => ['category_id', 'address_id', 'exp_user_id', 'dest_user_id', 'is_multicontacts'], 'resId' => $args['resId']]); + + $recipients = []; + if (!empty($ext)) { + if ($ext['category_id'] == 'outgoing') { + $rawContacts = []; + if ($ext['is_multicontacts'] == 'Y') { + $multiContacts = DatabaseModel::select([ + 'select' => ['contact_id', 'address_id'], + 'table' => ['contacts_res'], + 'where' => ['res_id = ?', 'mode = ?'], + 'data' => [$args['resId'], 'multi'] + ]); + foreach ($multiContacts as $multiContact) { + $rawContacts[] = [ + 'login' => $multiContact['contact_id'], + 'address_id' => $multiContact['address_id'], + ]; + } + } else { + $rawContacts[] = [ + 'login' => $ext['dest_user_id'], + 'address_id' => $ext['address_id'], + ]; + } + foreach ($rawContacts as $rawContact) { + if (!empty($rawContact['address_id'])) { + $contact = ContactModel::getOnView([ + 'select' => [ + 'is_corporate_person', 'lastname', 'firstname', 'address_num', 'address_street', 'address_town', 'address_postal_code', + 'ca_id', 'society', 'contact_firstname', 'contact_lastname', 'address_country' + ], + 'where' => ['ca_id = ?'], + 'data' => [$rawContact['address_id']] + ]); + if (isset($contact[0])) { + $contact = AutoCompleteController::getFormattedContact(['contact' => $contact[0]]); + $recipients[] = $contact['contact']['otherInfo']; + } + } else { + $recipients[] = UserModel::getLabelledUserById(['login' => $rawContact['login']]); + } + } + } else { + $resourcesContacts = ResourceContactModel::getFormattedByResId(['resId' => $args['resId']]); + foreach ($resourcesContacts as $resourcesContact) { + $recipients[] = $resourcesContact['format']; + } + } + } + + return $recipients; + } + + private static function getMaximumHeight(Fpdi $pdf, array $args) + { + ValidatorModel::notEmpty($args, ['data', 'width']); + ValidatorModel::arrayType($args, ['data']); + + $maxHeight = 1; + if (!is_numeric($args['width'])) { + return $maxHeight; + } + foreach ($args['data'] as $value) { + $height = $pdf->getStringHeight($args['width'], $value); + if ($height > $maxHeight) { + $maxHeight = $height; + } + } + + return $maxHeight + 2; + } } diff --git a/src/app/resource/controllers/SummarySheetController.php b/src/app/resource/controllers/SummarySheetController.php index 753697ad4db9c032daae7eb2b5938a2b8c76a081..c17e65dd7efb9587d344e7d0a43aa542a033858f 100644 --- a/src/app/resource/controllers/SummarySheetController.php +++ b/src/app/resource/controllers/SummarySheetController.php @@ -25,7 +25,6 @@ use Note\models\NoteModel; use Priority\models\PriorityModel; use Resource\models\ResModel; use Resource\models\ResourceContactModel; -use Resource\models\ResourceListModel; use Respect\Validation\Validator; use setasign\Fpdi\Tcpdf\Fpdi; use Slim\Http\Request; diff --git a/test/unitTests/app/resource/ExportControllerTest.php b/test/unitTests/app/resource/ExportControllerTest.php index 5aa469834fa00f6323453a6b9bb570c8ced1a13b..476d2e46c3256d315fccb309b20995d93fd3320c 100644 --- a/test/unitTests/app/resource/ExportControllerTest.php +++ b/test/unitTests/app/resource/ExportControllerTest.php @@ -22,11 +22,9 @@ class ExportControllerTest extends TestCase $response = $exportController->getExportTemplates($request, new \Slim\Http\Response()); $responseBody = json_decode((string)$response->getBody()); - $this->assertInternalType('array', $responseBody->templates); - $this->assertInternalType('array', $responseBody->templates->pdf); - $this->assertInternalType('array', $responseBody->templates->pdf->data); - $this->assertInternalType('array', $responseBody->templates->csv); - $this->assertInternalType('array', $responseBody->templates->csv->data); + $this->assertNotEmpty($responseBody->templates); + $this->assertNotEmpty($responseBody->templates->pdf); + $this->assertNotEmpty($responseBody->templates->csv); } // public function testUpdateExport()