Merged in feature/PMCORE-1388 (pull request #7374)

PMCORE-1388

Approved-by: Julio Cesar Laura Avendaño <contact@julio-laura.com>
This commit is contained in:
Paula Quispe
2020-06-13 01:35:29 +00:00
committed by Julio Cesar Laura Avendaño
36 changed files with 1689 additions and 277 deletions

View File

@@ -0,0 +1,54 @@
<?php
use Faker\Generator as Faker;
$factory->define(\ProcessMaker\Model\Documents::class, function (Faker $faker) {
$types = ['INPUT', 'OUTPUT', 'ATTACHED'];
$type = $faker->randomElement($types);
return [
'APP_DOC_UID' => G::generateUniqueID(),
'APP_DOC_FILENAME' => 'image.png',
'APP_DOC_TITLE' => '',
'APP_DOC_COMMENT' => '',
'DOC_VERSION' => 1,
'APP_UID' => G::generateUniqueID(),
'DEL_INDEX' => 1,
'DOC_UID' => G::generateUniqueID(),
'USR_UID' => G::generateUniqueID(),
'APP_DOC_TYPE' => $type,
'APP_DOC_CREATE_DATE' => $faker->date(),
'APP_DOC_INDEX' => 1,
'FOLDER_UID' => G::generateUniqueID(),
'APP_DOC_PLUGIN' => '',
'APP_DOC_TAGS' => '',
'APP_DOC_STATUS' => 'ACTIVE',
'APP_DOC_STATUS_DATE' => $faker->date(),
'APP_DOC_FIELDNAME' => '',
'APP_DOC_DRIVE_DOWNLOAD' => '',
];
});
// Create a document related to the case notes
$factory->state(\ProcessMaker\Model\Documents::class, 'case_notes', function (Faker $faker) {
return [
'APP_DOC_UID' => G::generateUniqueID(),
'APP_DOC_FILENAME' => 'image.png',
'APP_DOC_TITLE' => '',
'APP_DOC_COMMENT' => '',
'DOC_VERSION' => 1,
'APP_UID' => G::generateUniqueID(),
'DEL_INDEX' => 1,
'DOC_UID' => G::generateUniqueID(),
'USR_UID' => G::generateUniqueID(),
'APP_DOC_TYPE' => 'CASE_NOTE',
'APP_DOC_CREATE_DATE' => $faker->date(),
'APP_DOC_INDEX' => 1,
'FOLDER_UID' => G::generateUniqueID(),
'APP_DOC_PLUGIN' => '',
'APP_DOC_TAGS' => '',
'APP_DOC_STATUS' => 'ACTIVE',
'APP_DOC_STATUS_DATE' => $faker->date(),
'APP_DOC_FIELDNAME' => '',
'APP_DOC_DRIVE_DOWNLOAD' => '',
];
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

View File

@@ -3,10 +3,14 @@
namespace Tests\unit\workflow\engine\classes\model; namespace Tests\unit\workflow\engine\classes\model;
use AppNotes as ModelAppNotes; use AppNotes as ModelAppNotes;
use ProcessMaker\Model\Delegation; use Exception;
use ProcessMaker\Model\AppMessage; use Faker\Factory;
use ProcessMaker\Model\Application; use ProcessMaker\Model\Application;
use ProcessMaker\Model\AppMessage;
use ProcessMaker\Model\AppNotes; use ProcessMaker\Model\AppNotes;
use ProcessMaker\Model\Delegation;
use ProcessMaker\Model\Documents;
use ProcessMaker\Model\EmailServerModel;
use ProcessMaker\Model\User; use ProcessMaker\Model\User;
use Tests\TestCase; use Tests\TestCase;
@@ -17,6 +21,17 @@ use Tests\TestCase;
*/ */
class AppNotesTest extends TestCase class AppNotesTest extends TestCase
{ {
private $faker;
/**
* Set up method
*/
public function setUp()
{
parent::setUp();
$this->faker = Factory::create();
}
/** /**
* It test the cases notes creation * It test the cases notes creation
* *
@@ -101,4 +116,111 @@ class AppNotesTest extends TestCase
$result = $query->get()->values()->toArray(); $result = $query->get()->values()->toArray();
$this->assertNotEmpty($result); $this->assertNotEmpty($result);
} }
/**
* This test verifies the sending of the notification note with Exception.
* @test
* @covers \AppNotes::sendNoteNotification
*/
public function it_should_test_send_note_notification_with_exception()
{
//assert
$this->expectException(Exception::class);
$appNotes = new ModelAppNotes();
$appNotes->sendNoteNotification(null, null, null, null, null, null);
}
/**
* This test verifies the sending of the notification note.
* @test
* @covers \AppNotes::sendNoteNotification
*/
public function it_should_test_send_note_notification_without_user()
{
$user = User::where('USR_UID', '=', '00000000000000000000000000000001')
->get()
->first();
$application = factory(Application::class)->create();
$delegation = factory(Delegation::class)->create([
'APP_UID' => $application->APP_UID,
'USR_UID' => $user->USR_UID
]);
$params = [
$application->APP_UID,
'',
'',
$user->USR_UID,
$this->faker->email,
$delegation->DEL_INDEX
];
$appNotes = new ModelAppNotes();
$appNotes->sendNoteNotification(...$params);
//assert
$appMessage = AppMessage::where('APP_UID', '=', $application->APP_UID)->get()->first()->toArray();
$this->assertArrayHasKey('APP_UID', $appMessage);
$this->assertEquals($appMessage['APP_UID'], $application->APP_UID);
}
/**
* This test verifies the sending of the notification note with attach files.
* @test
* @covers \AppNotes::sendNoteNotification
*/
public function it_should_test_send_note_notification_with_attach_files()
{
$user = User::where('USR_UID', '=', '00000000000000000000000000000001')
->get()
->first();
$application = factory(Application::class)->create();
$delegation = factory(Delegation::class)->create([
'APP_UID' => $application->APP_UID,
'USR_UID' => $user->USR_UID
]);
$appNote = factory(AppNotes::class)->create();
$appDocument = factory(Documents::class)->create([
'APP_UID' => $application->APP_UID,
'DOC_ID' => $appNote->NOTE_ID
]);
factory(EmailServerModel::class)->create([
'MESS_DEFAULT' => 1
]);
$params = [
$application->APP_UID,
$user->USR_UID,
'',
$user->USR_UID,
$this->faker->email,
$delegation->DEL_INDEX
];
$appNotes = new ModelAppNotes();
$appNotes->sendNoteNotification(...$params);
//assert
$appMessage = AppMessage::where('APP_UID', '=', $application->APP_UID)->get()->first()->toArray();
$this->assertArrayHasKey('APP_UID', $appMessage);
$this->assertEquals($appMessage['APP_UID'], $application->APP_UID);
}
/**
* This test verify if exists attachment files.
* @test
* @covers \AppNotes::getAttachedFilesFromTheCaseNote
*/
public function it_should_test_get_attached_files_from_the_casenote()
{
$appNote = factory(AppNotes::class)->create();
$appDocument = factory(Documents::class)->create([
'DOC_ID' => $appNote->NOTE_ID
]);
$appUid = $appDocument->APP_UID;
$appNotes = new ModelAppNotes();
$result = $appNotes->getAttachedFilesFromTheCaseNote($appNote->NOTE_ID);
$this->assertNotEmpty($result);
}
} }

View File

@@ -5,6 +5,9 @@ namespace ProcessMaker\BusinessModel;
use Exception; use Exception;
use G; use G;
use ProcessMaker\Model\Application; use ProcessMaker\Model\Application;
use ProcessMaker\Model\Delegation;
use ProcessMaker\Model\Documents;
use ProcessMaker\Model\User;
use RBAC; use RBAC;
use Tests\TestCase; use Tests\TestCase;
@@ -15,6 +18,21 @@ use Tests\TestCase;
*/ */
class CasesTest extends TestCase class CasesTest extends TestCase
{ {
/**
* Set up method.
*/
public function setUp()
{
parent::setUp();
Delegation::truncate();
Documents::truncate();
Application::truncate();
User::where('USR_ID', '=', 1)
->where('USR_ID', '=', 2)
->delete();
}
/** /**
* This checks the delete case * This checks the delete case
* *
@@ -26,11 +44,11 @@ class CasesTest extends TestCase
{ {
// Set the RBAC // Set the RBAC
global $RBAC; global $RBAC;
$_SESSION['USER_LOGGED'] = '00000000000000000000000000000002'; $_SESSION['USER_LOGGED'] = G::generateUniqueID();
$RBAC = RBAC::getSingleton(PATH_DATA, session_id()); $RBAC = RBAC::getSingleton();
$RBAC->initRBAC(); $RBAC->initRBAC();
$application = factory(Application::class)->create(); $application = factory(Application::class)->create(['APP_INIT_USER' => G::generateUniqueID()]);
// Tried to delete case // Tried to delete case
$case = new Cases(); $case = new Cases();
$case->deleteCase($application->APP_UID, $_SESSION['USER_LOGGED']); $case->deleteCase($application->APP_UID, $_SESSION['USER_LOGGED']);
@@ -48,7 +66,7 @@ class CasesTest extends TestCase
// Set the RBAC // Set the RBAC
global $RBAC; global $RBAC;
$_SESSION['USER_LOGGED'] = '00000000000000000000000000000001'; $_SESSION['USER_LOGGED'] = '00000000000000000000000000000001';
$RBAC = RBAC::getSingleton(PATH_DATA, session_id()); $RBAC = RBAC::getSingleton();
$RBAC->initRBAC(); $RBAC->initRBAC();
$application = factory(Application::class)->create(['APP_STATUS' => 'TO_DO']); $application = factory(Application::class)->create(['APP_STATUS' => 'TO_DO']);
@@ -68,13 +86,50 @@ class CasesTest extends TestCase
{ {
// Set the RBAC // Set the RBAC
global $RBAC; global $RBAC;
$_SESSION['USER_LOGGED'] = '00000000000000000000000000000001'; $_SESSION['USER_LOGGED'] = G::generateUniqueID();
$RBAC = RBAC::getSingleton(PATH_DATA, session_id()); $RBAC = RBAC::getSingleton();
$RBAC->initRBAC(); $RBAC->initRBAC();
$application = factory(Application::class)->create(['APP_INIT_USER' => '00000000000000000000000000000002']); $application = factory(Application::class)->create(['APP_INIT_USER' => G::generateUniqueID()]);
// Tried to delete case // Tried to delete case
$case = new Cases(); $case = new Cases();
$case->deleteCase($application->APP_UID, $_SESSION['USER_LOGGED']); $case->deleteCase($application->APP_UID, $_SESSION['USER_LOGGED']);
} }
/**
* Review the upload file related to the case notes
*
* @covers \ProcessMaker\BusinessModel\Cases::uploadFilesInCaseNotes()
*
* @test
*/
public function it_should_upload_files_related_case_note()
{
$application = factory(Application::class)->create();
factory(Delegation::class)->states('foreign_keys')->create([
'APP_NUMBER' => $application->APP_NUMBER,
'APP_UID' => $application->APP_UID
]);
// File reference to upload
$filesReferences = [
'activityRename.gif' => PATH_TRUNK . 'tests' . PATH_SEP . 'resources' . PATH_SEP . 'images' . PATH_SEP . 'activity.gif',
];
// Path of the case
$pathCase = PATH_DB . config('system.workspace') . PATH_SEP . 'files' . PATH_SEP . $application->APP_UID . PATH_SEP;
// Upload the file
$case = new Cases();
$result = $case->uploadFilesInCaseNotes('00000000000000000000000000000001', $application->APP_UID, $filesReferences);
$this->assertNotEmpty($result['attachments']);
$result = head($result['attachments']);
$this->assertNotEmpty($result);
$this->assertArrayHasKey('APP_UID', $result);
$this->assertEquals($application->APP_UID, $result['APP_UID']);
$this->assertArrayHasKey('APP_DOC_TYPE', $result);
$this->assertEquals(Documents::DOC_TYPE_CASE_NOTE, $result['APP_DOC_TYPE']);
$this->assertArrayHasKey('APP_DOC_FILENAME', $result);
$this->assertEquals('activityRename.gif', $result['APP_DOC_FILENAME']);
// Remove the path created
G::rm_dir($pathCase);
}
} }

View File

@@ -0,0 +1,49 @@
<?php
namespace Tests\unit\workflow\engine\src\ProcessMaker\Model;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use ProcessMaker\Model\AppNotes;
use ProcessMaker\Model\Documents;
use Tests\TestCase;
/**
* Class DocumentsTest
*
* @coversDefaultClass \ProcessMaker\Model\Documents
*/
class DocumentsTest extends TestCase
{
use DatabaseTransactions;
/**
* Review get app files related to the case notes
*
* @test
*/
public function it_test_get_case_note_files()
{
$appDoc = factory(Documents::class)->states('case_notes')->create();
$doc = new Documents();
$res = $doc->getAppFiles($appDoc->APP_UID, Documents::DOC_TYPE_CASE_NOTE);
$this->assertNotEmpty($res);
}
/**
* This test verify if exists attachment files.
* @test
* @covers Documents::getAttachedFilesFromTheCaseNote
*/
public function it_should_test_get_attached_files_from_the_casenote()
{
$appNote = factory(AppNotes::class)->create();
$appDocument = factory(Documents::class)->create([
'DOC_ID' => $appNote->NOTE_ID
]);
$appUid = $appDocument->APP_UID;
$result = Documents::getAttachedFilesFromTheCaseNote($appUid);
$this->assertNotEmpty($result);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace Tests\unit\workflow\src\ProcessMaker\Util\Helpers;
use G;
use Tests\TestCase;
class SaveAppDocumentTest extends TestCase
{
/**
* It test if the file reference was uploaded
*
* @test
*/
public function it_should_copy_file_same_name()
{
$files = [
'name' => PATH_TRUNK . 'tests' . PATH_SEP . 'resources' . PATH_SEP . 'images' . PATH_SEP . 'activate.png',
'tmp_name' => PATH_TRUNK . 'tests' . PATH_SEP . 'resources' . PATH_SEP . 'images' . PATH_SEP . 'activate.png',
];
$appUid = G::generateUniqueID();
$appDocUid = G::generateUniqueID();
$pathCase = PATH_DB . config('system.workspace') . PATH_SEP . 'files' . PATH_SEP . G::getPathFromUID($appUid) . PATH_SEP;
saveAppDocument($files, $appUid, $appDocUid, 1, false);
$this->assertFileExists($pathCase . $appDocUid . '_1.png');
G::rm_dir($pathCase);
}
/**
* It test if the file reference was uploaded
*
* @test
*/
public function it_should_copy_file_different_name()
{
$files = [
'name' => 'activityRename.gif',
'tmp_name' => PATH_TRUNK . 'tests' . PATH_SEP . 'resources' . PATH_SEP . 'images' . PATH_SEP . 'activity.gif',
];
$appUid = G::generateUniqueID();
$appDocUid = G::generateUniqueID();
$pathCase = PATH_DB . config('system.workspace') . PATH_SEP . 'files' . PATH_SEP . G::getPathFromUID($appUid) . PATH_SEP;
saveAppDocument($files, $appUid, $appDocUid, 1, false);
$this->assertFileExists($pathCase . $appDocUid . '_1.gif');
G::rm_dir($pathCase);
}
}

View File

@@ -112,6 +112,43 @@ class ValidationUploadedFilesTest extends TestCase
$this->assertEquals(0, $result->getStatus()); $this->assertEquals(0, $result->getStatus());
} }
/**
* This test verify validation rules for files post in cases notes.
* @test
* @covers ::runRulesForPostFilesOfNote
*/
public function it_should_test_run_rules_for_post_files_of_note()
{
//assert for file has not exist
$file = [
'filename' => 'testDocument.pdf',
'path' => "testDocument.pdf"
];
$validation = new ValidationUploadedFiles();
$result = $validation->runRulesForPostFilesOfNote($file);
$this->assertTrue($result->fails());
//assert for file has not valid extension
$file = [
'filename' => 'projectData.json',
'path' => PATH_TRUNK . "tests/resources/projectData.json"
];
$validation = new ValidationUploadedFiles();
$result = $validation->runRulesForPostFilesOfNote($file);
$this->assertTrue($result->fails());
//assert the file exists and has valid extension
$file = [
'filename' => 'testDocument.pdf',
'path' => PATH_TRUNK . "tests/resources/testDocument.pdf"
];
$validation = new ValidationUploadedFiles();
$result = $validation->runRulesForPostFilesOfNote($file);
$this->assertFalse($result->fails());
$this->assertEmpty($result->getMessage());
$this->assertEquals(0, $result->getStatus());
}
/** /**
* It deletes the images created * It deletes the images created
*/ */

View File

@@ -2,6 +2,7 @@
use App\Jobs\EmailEvent; use App\Jobs\EmailEvent;
use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Crypt;
use ProcessMaker\BusinessModel\Cases as BmCases;
use ProcessMaker\BusinessModel\EmailServer; use ProcessMaker\BusinessModel\EmailServer;
/*----------------------------------********---------------------------------*/ /*----------------------------------********---------------------------------*/
use ProcessMaker\ChangeLog\ChangeLog; use ProcessMaker\ChangeLog\ChangeLog;
@@ -3420,16 +3421,17 @@ class WsBase
/** /**
* Add case note * Add case note
* *
* @param string caseUid : ID of the case. * @param string $caseUid, ID of the case.
* @param string processUid : ID of the process. * @param string $processUid, ID of the process.
* @param string taskUid : ID of the task. * @param string $taskUid, ID of the task.
* @param string userUid : The unique ID of the user who will add note case. * @param string $userUid, The unique ID of the user who will add note case.
* @param string note : Note of the case. * @param string $note, Note of the case.
* @param int sendMail : Optional parameter. If set to 1, will send an email to all participants in the case. * @param int $sendMail, Optional parameter. If set to 1, will send an email to all participants in the case.
* @param array $files, Optional parameter. This is an array of files.
* *
* @return $result will return an object * @return object
*/ */
public function addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1) public function addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1, $files = [])
{ {
try { try {
if (empty($caseUid)) { if (empty($caseUid)) {
@@ -3474,8 +3476,8 @@ class WsBase
} }
//Add note case //Add note case
$appNote = new AppNotes(); $appNote = new BmCases();
$response = $appNote->addCaseNote($caseUid, $userUid, $note, $sendMail); $response = $appNote->addNote($caseUid, $userUid, $note, $sendMail, $files);
//Response //Response
$result = new WsResponse(0, G::LoadTranslation("ID_COMMAND_EXECUTED_SUCCESSFULLY")); $result = new WsResponse(0, G::LoadTranslation("ID_COMMAND_EXECUTED_SUCCESSFULLY"));

View File

@@ -3017,13 +3017,15 @@ function PMFUnpauseCase ($caseUid, $delIndex, $userUid)
* @param string(32) | $userUid | ID user | The unique ID of the user who will add note case. * @param string(32) | $userUid | ID user | The unique ID of the user who will add note case.
* @param string | $note | Note of the case | Note of the case. * @param string | $note | Note of the case | Note of the case.
* @param int | $sendMail = 1 | Send mail | Optional parameter. If set to 1, will send an email to all participants in the case. * @param int | $sendMail = 1 | Send mail | Optional parameter. If set to 1, will send an email to all participants in the case.
* @param array | $files | Array of files | An array of files (full paths) to be attached to the case notes.
*
* @return int | $result | Result of the add a case note | Returns 1 if the note has been added to the case.; otherwise, returns 0 if an error occurred. * @return int | $result | Result of the add a case note | Returns 1 if the note has been added to the case.; otherwise, returns 0 if an error occurred.
* *
*/ */
function PMFAddCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1) function PMFAddCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail = 1, $files = [])
{ {
$ws = new WsBase(); $ws = new WsBase();
$result = $ws->addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail); $result = $ws->addCaseNote($caseUid, $processUid, $taskUid, $userUid, $note, $sendMail, $files);
if ($result->status_code == 0) { if ($result->status_code == 0) {
return 1; return 1;

View File

@@ -1,6 +1,7 @@
<?php <?php
use ProcessMaker\Core\System; use ProcessMaker\Core\System;
use ProcessMaker\Model\Documents;
use ProcessMaker\Util\DateTime; use ProcessMaker\Util\DateTime;
/** /**
@@ -180,21 +181,29 @@ class AppNotes extends BaseAppNotes
* @param string $noteRecipients * @param string $noteRecipients
* @param string $from * @param string $from
* @param integer $delIndex * @param integer $delIndex
* @param integer $noteId
* @return void * @return void
* @throws Exception * @throws Exception
* *
* @see AppNotes->addCaseNote() * @see AppNotes->addCaseNote()
* @see AppNotes->postNewNote() * @see AppNotes->postNewNote()
* @see workflow/engine/src/ProcessMaker/Util/helpers.php::postNote() * @see workflow/engine/src/ProcessMaker/Util/helpers.php::postNote()
*/ */
public function sendNoteNotification ($appUid, $usrUid, $noteContent, $noteRecipients, $from = '', $delIndex = 0) public function sendNoteNotification(
$appUid,
$usrUid,
$noteContent,
$noteRecipients,
$from = '',
$delIndex = 0,
$noteId = 0
)
{ {
try { try {
$configuration = System::getEmailConfiguration(); $configuration = System::getEmailConfiguration();
$msgError = ""; $msgError = "";
if (! isset( $configuration['MESS_ENABLED'] ) || $configuration['MESS_ENABLED'] != '1') { if (!isset($configuration['MESS_ENABLED']) || $configuration['MESS_ENABLED'] != '1') {
$msgError = "The default configuration wasn't defined"; $msgError = "The default configuration wasn't defined";
$configuration['MESS_ENGINE'] = ''; $configuration['MESS_ENGINE'] = '';
} }
@@ -211,20 +220,31 @@ class AppNotes extends BaseAppNotes
$cases = new Cases(); $cases = new Cases();
$fieldCase = $cases->loadCase($appUid, $delIndex); $fieldCase = $cases->loadCase($appUid, $delIndex);
$configNoteNotification['subject'] = G::LoadTranslation('ID_MESSAGE_SUBJECT_NOTE_NOTIFICATION') . " @#APP_TITLE "; $configNoteNotification['subject'] = G::LoadTranslation('ID_MESSAGE_SUBJECT_NOTE_NOTIFICATION') . " @#APP_TITLE ";
//Define the body for the notification //Define the body for the notification
$configNoteNotification['body'] = $this->getBodyCaseNote($authorName, $noteContent); $configNoteNotification['body'] = $this->getBodyCaseNote($authorName, $noteContent);
$body = nl2br(G::replaceDataField($configNoteNotification['body'], $fieldCase, 'mysql', false)); $body = nl2br(G::replaceDataField($configNoteNotification['body'], $fieldCase, 'mysql', false));
// Get the files related to the specific case note
if ($noteId !== 0) {
$attachFileLinks = $this->getAttachedFilesFromTheCaseNote($noteId);
}
if (!empty($attachFileLinks)) {
$body = $body . "<br />" . G::LoadTranslation('ID_ATTACHED_FILES') . ":&nbsp; <br />" . implode("<br />", $attachFileLinks);
}
$users = new Users(); $users = new Users();
$recipientsArray = explode(",", $noteRecipients); $recipientsArray = explode(",", $noteRecipients);
foreach ($recipientsArray as $recipientUid) { foreach ($recipientsArray as $recipientUid) {
$userInfo = $users->load($recipientUid); $userInfo = $users->load($recipientUid);
$to = ((($userInfo['USR_FIRSTNAME'] != '') || ($userInfo['USR_LASTNAME'] != '')) ? $userInfo['USR_FIRSTNAME'] . ' ' . $userInfo['USR_LASTNAME'] . ' ' : '') . '<' . $userInfo['USR_EMAIL'] . '>'; $ifUserNameDefined = $userInfo['USR_FIRSTNAME'] != '' || $userInfo['USR_LASTNAME'] != '';
$to = ($ifUserNameDefined ? $userInfo['USR_FIRSTNAME'] . ' ' . $userInfo['USR_LASTNAME'] . ' ' : '') . '<' . $userInfo['USR_EMAIL'] . '>';
$spool = new SpoolRun(); $spool = new SpoolRun();
$spool->setConfig($configuration); $spool->setConfig($configuration);
$messageArray = AppMessage::buildMessageRow(
$parameters = [
'', '',
$appUid, $appUid,
$delIndex, $delIndex,
@@ -244,7 +264,8 @@ class AppNotes extends BaseAppNotes
(isset($fieldCase['APP_NUMBER'])) ? $fieldCase['APP_NUMBER'] : 0, (isset($fieldCase['APP_NUMBER'])) ? $fieldCase['APP_NUMBER'] : 0,
(isset($fieldCase['PRO_ID'])) ? $fieldCase['PRO_ID'] : 0, (isset($fieldCase['PRO_ID'])) ? $fieldCase['PRO_ID'] : 0,
(isset($fieldCase['TAS_ID'])) ? $fieldCase['TAS_ID'] : 0 (isset($fieldCase['TAS_ID'])) ? $fieldCase['TAS_ID'] : 0
); ];
$messageArray = AppMessage::buildMessageRow(...$parameters);
$spool->create($messageArray); $spool->create($messageArray);
if ($msgError == '') { if ($msgError == '') {
@@ -252,14 +273,30 @@ class AppNotes extends BaseAppNotes
$spool->sendMail(); $spool->sendMail();
} }
} }
} }
//Send derivation notification - End
} catch (Exception $exception) { } catch (Exception $exception) {
throw $exception; throw $exception;
} }
} }
/**
* Get attached files from a specific case note
* @param int $docId
* @return array
*/
public function getAttachedFilesFromTheCaseNote(int $docId): array
{
$attachFileLinks = [];
$url = System::getServerMainPath();
$result = Documents::getFiles($docId);
foreach ($result as $item) {
$href = $url . "/cases/casesShowCaseNotes?a={$item['APP_DOC_UID']}&v={$item['DOC_VERSION']}";
$attachFileLinks[] = "<a href='{$href}'>{$item['APP_DOC_FILENAME']}</a>";
}
return $attachFileLinks;
}
public function addCaseNote($applicationUid, $userUid, $note, $sendMail) public function addCaseNote($applicationUid, $userUid, $note, $sendMail)
{ {
$response = $this->postNewNote($applicationUid, $userUid, $note, false); $response = $this->postNewNote($applicationUid, $userUid, $note, false);

View File

@@ -81,6 +81,8 @@ class AppDocumentMapBuilder
$tMap->addColumn('DOC_UID', 'DocUid', 'string', CreoleTypes::VARCHAR, true, 32); $tMap->addColumn('DOC_UID', 'DocUid', 'string', CreoleTypes::VARCHAR, true, 32);
$tMap->addColumn('DOC_ID', 'DocId', 'int', CreoleTypes::INTEGER, false, null);
$tMap->addColumn('USR_UID', 'UsrUid', 'string', CreoleTypes::VARCHAR, true, 32); $tMap->addColumn('USR_UID', 'UsrUid', 'string', CreoleTypes::VARCHAR, true, 32);
$tMap->addColumn('APP_DOC_TYPE', 'AppDocType', 'string', CreoleTypes::VARCHAR, true, 32); $tMap->addColumn('APP_DOC_TYPE', 'AppDocType', 'string', CreoleTypes::VARCHAR, true, 32);
@@ -127,7 +129,7 @@ class AppDocumentMapBuilder
$tMap->addValidator('USR_UID', 'required', 'propel.validator.RequiredValidator', '', 'User UID is required.'); $tMap->addValidator('USR_UID', 'required', 'propel.validator.RequiredValidator', '', 'User UID is required.');
$tMap->addValidator('APP_DOC_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'INPUT|OUTPUT|ATTACHED', 'Please select a valid document type.'); $tMap->addValidator('APP_DOC_TYPE', 'validValues', 'propel.validator.ValidValuesValidator', 'INPUT|OUTPUT|ATTACHED|CASE_NOTE', 'Please select a valid document type.');
$tMap->addValidator('APP_DOC_TYPE', 'required', 'propel.validator.RequiredValidator', '', 'Application Document Type is required.'); $tMap->addValidator('APP_DOC_TYPE', 'required', 'propel.validator.RequiredValidator', '', 'Application Document Type is required.');

View File

@@ -63,7 +63,9 @@ class AppNotesMapBuilder
$tMap = $this->dbMap->addTable('APP_NOTES'); $tMap = $this->dbMap->addTable('APP_NOTES');
$tMap->setPhpName('AppNotes'); $tMap->setPhpName('AppNotes');
$tMap->setUseIdGenerator(false); $tMap->setUseIdGenerator(true);
$tMap->addColumn('NOTE_ID', 'NoteId', 'int', CreoleTypes::INTEGER, true, null);
$tMap->addColumn('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32); $tMap->addColumn('APP_UID', 'AppUid', 'string', CreoleTypes::VARCHAR, true, 32);

View File

@@ -75,6 +75,12 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
*/ */
protected $doc_uid = ''; protected $doc_uid = '';
/**
* The value for the doc_id field.
* @var int
*/
protected $doc_id = 0;
/** /**
* The value for the usr_uid field. * The value for the usr_uid field.
* @var string * @var string
@@ -255,6 +261,17 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
return $this->doc_uid; return $this->doc_uid;
} }
/**
* Get the [doc_id] column value.
*
* @return int
*/
public function getDocId()
{
return $this->doc_id;
}
/** /**
* Get the [usr_uid] column value. * Get the [usr_uid] column value.
* *
@@ -616,6 +633,28 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
} // setDocUid() } // setDocUid()
/**
* Set the value of [doc_id] column.
*
* @param int $v new value
* @return void
*/
public function setDocId($v)
{
// Since the native PHP type for this column is integer,
// we will cast the input value to an int (if it is not).
if ($v !== null && !is_int($v) && is_numeric($v)) {
$v = (int) $v;
}
if ($this->doc_id !== $v || $v === 0) {
$this->doc_id = $v;
$this->modifiedColumns[] = AppDocumentPeer::DOC_ID;
}
} // setDocId()
/** /**
* Set the value of [usr_uid] column. * Set the value of [usr_uid] column.
* *
@@ -949,38 +988,40 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$this->doc_uid = $rs->getString($startcol + 7); $this->doc_uid = $rs->getString($startcol + 7);
$this->usr_uid = $rs->getString($startcol + 8); $this->doc_id = $rs->getInt($startcol + 8);
$this->app_doc_type = $rs->getString($startcol + 9); $this->usr_uid = $rs->getString($startcol + 9);
$this->app_doc_create_date = $rs->getTimestamp($startcol + 10, null); $this->app_doc_type = $rs->getString($startcol + 10);
$this->app_doc_index = $rs->getInt($startcol + 11); $this->app_doc_create_date = $rs->getTimestamp($startcol + 11, null);
$this->folder_uid = $rs->getString($startcol + 12); $this->app_doc_index = $rs->getInt($startcol + 12);
$this->app_doc_plugin = $rs->getString($startcol + 13); $this->folder_uid = $rs->getString($startcol + 13);
$this->app_doc_tags = $rs->getString($startcol + 14); $this->app_doc_plugin = $rs->getString($startcol + 14);
$this->app_doc_status = $rs->getString($startcol + 15); $this->app_doc_tags = $rs->getString($startcol + 15);
$this->app_doc_status_date = $rs->getTimestamp($startcol + 16, null); $this->app_doc_status = $rs->getString($startcol + 16);
$this->app_doc_fieldname = $rs->getString($startcol + 17); $this->app_doc_status_date = $rs->getTimestamp($startcol + 17, null);
$this->app_doc_drive_download = $rs->getString($startcol + 18); $this->app_doc_fieldname = $rs->getString($startcol + 18);
$this->sync_with_drive = $rs->getString($startcol + 19); $this->app_doc_drive_download = $rs->getString($startcol + 19);
$this->sync_permissions = $rs->getString($startcol + 20); $this->sync_with_drive = $rs->getString($startcol + 20);
$this->sync_permissions = $rs->getString($startcol + 21);
$this->resetModified(); $this->resetModified();
$this->setNew(false); $this->setNew(false);
// FIXME - using NUM_COLUMNS may be clearer. // FIXME - using NUM_COLUMNS may be clearer.
return $startcol + 21; // 21 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS). return $startcol + 22; // 22 = AppDocumentPeer::NUM_COLUMNS - AppDocumentPeer::NUM_LAZY_LOAD_COLUMNS).
} catch (Exception $e) { } catch (Exception $e) {
throw new PropelException("Error populating AppDocument object", $e); throw new PropelException("Error populating AppDocument object", $e);
@@ -1209,42 +1250,45 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
return $this->getDocUid(); return $this->getDocUid();
break; break;
case 8: case 8:
return $this->getUsrUid(); return $this->getDocId();
break; break;
case 9: case 9:
return $this->getAppDocType(); return $this->getUsrUid();
break; break;
case 10: case 10:
return $this->getAppDocCreateDate(); return $this->getAppDocType();
break; break;
case 11: case 11:
return $this->getAppDocIndex(); return $this->getAppDocCreateDate();
break; break;
case 12: case 12:
return $this->getFolderUid(); return $this->getAppDocIndex();
break; break;
case 13: case 13:
return $this->getAppDocPlugin(); return $this->getFolderUid();
break; break;
case 14: case 14:
return $this->getAppDocTags(); return $this->getAppDocPlugin();
break; break;
case 15: case 15:
return $this->getAppDocStatus(); return $this->getAppDocTags();
break; break;
case 16: case 16:
return $this->getAppDocStatusDate(); return $this->getAppDocStatus();
break; break;
case 17: case 17:
return $this->getAppDocFieldname(); return $this->getAppDocStatusDate();
break; break;
case 18: case 18:
return $this->getAppDocDriveDownload(); return $this->getAppDocFieldname();
break; break;
case 19: case 19:
return $this->getSyncWithDrive(); return $this->getAppDocDriveDownload();
break; break;
case 20: case 20:
return $this->getSyncWithDrive();
break;
case 21:
return $this->getSyncPermissions(); return $this->getSyncPermissions();
break; break;
default: default:
@@ -1275,19 +1319,20 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$keys[5] => $this->getAppUid(), $keys[5] => $this->getAppUid(),
$keys[6] => $this->getDelIndex(), $keys[6] => $this->getDelIndex(),
$keys[7] => $this->getDocUid(), $keys[7] => $this->getDocUid(),
$keys[8] => $this->getUsrUid(), $keys[8] => $this->getDocId(),
$keys[9] => $this->getAppDocType(), $keys[9] => $this->getUsrUid(),
$keys[10] => $this->getAppDocCreateDate(), $keys[10] => $this->getAppDocType(),
$keys[11] => $this->getAppDocIndex(), $keys[11] => $this->getAppDocCreateDate(),
$keys[12] => $this->getFolderUid(), $keys[12] => $this->getAppDocIndex(),
$keys[13] => $this->getAppDocPlugin(), $keys[13] => $this->getFolderUid(),
$keys[14] => $this->getAppDocTags(), $keys[14] => $this->getAppDocPlugin(),
$keys[15] => $this->getAppDocStatus(), $keys[15] => $this->getAppDocTags(),
$keys[16] => $this->getAppDocStatusDate(), $keys[16] => $this->getAppDocStatus(),
$keys[17] => $this->getAppDocFieldname(), $keys[17] => $this->getAppDocStatusDate(),
$keys[18] => $this->getAppDocDriveDownload(), $keys[18] => $this->getAppDocFieldname(),
$keys[19] => $this->getSyncWithDrive(), $keys[19] => $this->getAppDocDriveDownload(),
$keys[20] => $this->getSyncPermissions(), $keys[20] => $this->getSyncWithDrive(),
$keys[21] => $this->getSyncPermissions(),
); );
return $result; return $result;
} }
@@ -1344,42 +1389,45 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$this->setDocUid($value); $this->setDocUid($value);
break; break;
case 8: case 8:
$this->setUsrUid($value); $this->setDocId($value);
break; break;
case 9: case 9:
$this->setAppDocType($value); $this->setUsrUid($value);
break; break;
case 10: case 10:
$this->setAppDocCreateDate($value); $this->setAppDocType($value);
break; break;
case 11: case 11:
$this->setAppDocIndex($value); $this->setAppDocCreateDate($value);
break; break;
case 12: case 12:
$this->setFolderUid($value); $this->setAppDocIndex($value);
break; break;
case 13: case 13:
$this->setAppDocPlugin($value); $this->setFolderUid($value);
break; break;
case 14: case 14:
$this->setAppDocTags($value); $this->setAppDocPlugin($value);
break; break;
case 15: case 15:
$this->setAppDocStatus($value); $this->setAppDocTags($value);
break; break;
case 16: case 16:
$this->setAppDocStatusDate($value); $this->setAppDocStatus($value);
break; break;
case 17: case 17:
$this->setAppDocFieldname($value); $this->setAppDocStatusDate($value);
break; break;
case 18: case 18:
$this->setAppDocDriveDownload($value); $this->setAppDocFieldname($value);
break; break;
case 19: case 19:
$this->setSyncWithDrive($value); $this->setAppDocDriveDownload($value);
break; break;
case 20: case 20:
$this->setSyncWithDrive($value);
break;
case 21:
$this->setSyncPermissions($value); $this->setSyncPermissions($value);
break; break;
} // switch() } // switch()
@@ -1438,55 +1486,59 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
} }
if (array_key_exists($keys[8], $arr)) { if (array_key_exists($keys[8], $arr)) {
$this->setUsrUid($arr[$keys[8]]); $this->setDocId($arr[$keys[8]]);
} }
if (array_key_exists($keys[9], $arr)) { if (array_key_exists($keys[9], $arr)) {
$this->setAppDocType($arr[$keys[9]]); $this->setUsrUid($arr[$keys[9]]);
} }
if (array_key_exists($keys[10], $arr)) { if (array_key_exists($keys[10], $arr)) {
$this->setAppDocCreateDate($arr[$keys[10]]); $this->setAppDocType($arr[$keys[10]]);
} }
if (array_key_exists($keys[11], $arr)) { if (array_key_exists($keys[11], $arr)) {
$this->setAppDocIndex($arr[$keys[11]]); $this->setAppDocCreateDate($arr[$keys[11]]);
} }
if (array_key_exists($keys[12], $arr)) { if (array_key_exists($keys[12], $arr)) {
$this->setFolderUid($arr[$keys[12]]); $this->setAppDocIndex($arr[$keys[12]]);
} }
if (array_key_exists($keys[13], $arr)) { if (array_key_exists($keys[13], $arr)) {
$this->setAppDocPlugin($arr[$keys[13]]); $this->setFolderUid($arr[$keys[13]]);
} }
if (array_key_exists($keys[14], $arr)) { if (array_key_exists($keys[14], $arr)) {
$this->setAppDocTags($arr[$keys[14]]); $this->setAppDocPlugin($arr[$keys[14]]);
} }
if (array_key_exists($keys[15], $arr)) { if (array_key_exists($keys[15], $arr)) {
$this->setAppDocStatus($arr[$keys[15]]); $this->setAppDocTags($arr[$keys[15]]);
} }
if (array_key_exists($keys[16], $arr)) { if (array_key_exists($keys[16], $arr)) {
$this->setAppDocStatusDate($arr[$keys[16]]); $this->setAppDocStatus($arr[$keys[16]]);
} }
if (array_key_exists($keys[17], $arr)) { if (array_key_exists($keys[17], $arr)) {
$this->setAppDocFieldname($arr[$keys[17]]); $this->setAppDocStatusDate($arr[$keys[17]]);
} }
if (array_key_exists($keys[18], $arr)) { if (array_key_exists($keys[18], $arr)) {
$this->setAppDocDriveDownload($arr[$keys[18]]); $this->setAppDocFieldname($arr[$keys[18]]);
} }
if (array_key_exists($keys[19], $arr)) { if (array_key_exists($keys[19], $arr)) {
$this->setSyncWithDrive($arr[$keys[19]]); $this->setAppDocDriveDownload($arr[$keys[19]]);
} }
if (array_key_exists($keys[20], $arr)) { if (array_key_exists($keys[20], $arr)) {
$this->setSyncPermissions($arr[$keys[20]]); $this->setSyncWithDrive($arr[$keys[20]]);
}
if (array_key_exists($keys[21], $arr)) {
$this->setSyncPermissions($arr[$keys[21]]);
} }
} }
@@ -1532,6 +1584,10 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$criteria->add(AppDocumentPeer::DOC_UID, $this->doc_uid); $criteria->add(AppDocumentPeer::DOC_UID, $this->doc_uid);
} }
if ($this->isColumnModified(AppDocumentPeer::DOC_ID)) {
$criteria->add(AppDocumentPeer::DOC_ID, $this->doc_id);
}
if ($this->isColumnModified(AppDocumentPeer::USR_UID)) { if ($this->isColumnModified(AppDocumentPeer::USR_UID)) {
$criteria->add(AppDocumentPeer::USR_UID, $this->usr_uid); $criteria->add(AppDocumentPeer::USR_UID, $this->usr_uid);
} }
@@ -1662,6 +1718,8 @@ abstract class BaseAppDocument extends BaseObject implements Persistent
$copyObj->setDocUid($this->doc_uid); $copyObj->setDocUid($this->doc_uid);
$copyObj->setDocId($this->doc_id);
$copyObj->setUsrUid($this->usr_uid); $copyObj->setUsrUid($this->usr_uid);
$copyObj->setAppDocType($this->app_doc_type); $copyObj->setAppDocType($this->app_doc_type);

View File

@@ -25,7 +25,7 @@ abstract class BaseAppDocumentPeer
const CLASS_DEFAULT = 'classes.model.AppDocument'; const CLASS_DEFAULT = 'classes.model.AppDocument';
/** The total number of columns. */ /** The total number of columns. */
const NUM_COLUMNS = 21; const NUM_COLUMNS = 22;
/** The number of lazy-loaded columns. */ /** The number of lazy-loaded columns. */
const NUM_LAZY_LOAD_COLUMNS = 0; const NUM_LAZY_LOAD_COLUMNS = 0;
@@ -55,6 +55,9 @@ abstract class BaseAppDocumentPeer
/** the column name for the DOC_UID field */ /** the column name for the DOC_UID field */
const DOC_UID = 'APP_DOCUMENT.DOC_UID'; const DOC_UID = 'APP_DOCUMENT.DOC_UID';
/** the column name for the DOC_ID field */
const DOC_ID = 'APP_DOCUMENT.DOC_ID';
/** the column name for the USR_UID field */ /** the column name for the USR_UID field */
const USR_UID = 'APP_DOCUMENT.USR_UID'; const USR_UID = 'APP_DOCUMENT.USR_UID';
@@ -105,10 +108,10 @@ abstract class BaseAppDocumentPeer
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/ */
private static $fieldNames = array ( private static $fieldNames = array (
BasePeer::TYPE_PHPNAME => array ('AppDocUid', 'AppDocFilename', 'AppDocTitle', 'AppDocComment', 'DocVersion', 'AppUid', 'DelIndex', 'DocUid', 'UsrUid', 'AppDocType', 'AppDocCreateDate', 'AppDocIndex', 'FolderUid', 'AppDocPlugin', 'AppDocTags', 'AppDocStatus', 'AppDocStatusDate', 'AppDocFieldname', 'AppDocDriveDownload', 'SyncWithDrive', 'SyncPermissions', ), BasePeer::TYPE_PHPNAME => array ('AppDocUid', 'AppDocFilename', 'AppDocTitle', 'AppDocComment', 'DocVersion', 'AppUid', 'DelIndex', 'DocUid', 'DocId', 'UsrUid', 'AppDocType', 'AppDocCreateDate', 'AppDocIndex', 'FolderUid', 'AppDocPlugin', 'AppDocTags', 'AppDocStatus', 'AppDocStatusDate', 'AppDocFieldname', 'AppDocDriveDownload', 'SyncWithDrive', 'SyncPermissions', ),
BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID, AppDocumentPeer::APP_DOC_FILENAME, AppDocumentPeer::APP_DOC_TITLE, AppDocumentPeer::APP_DOC_COMMENT, AppDocumentPeer::DOC_VERSION, AppDocumentPeer::APP_UID, AppDocumentPeer::DEL_INDEX, AppDocumentPeer::DOC_UID, AppDocumentPeer::USR_UID, AppDocumentPeer::APP_DOC_TYPE, AppDocumentPeer::APP_DOC_CREATE_DATE, AppDocumentPeer::APP_DOC_INDEX, AppDocumentPeer::FOLDER_UID, AppDocumentPeer::APP_DOC_PLUGIN, AppDocumentPeer::APP_DOC_TAGS, AppDocumentPeer::APP_DOC_STATUS, AppDocumentPeer::APP_DOC_STATUS_DATE, AppDocumentPeer::APP_DOC_FIELDNAME, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, AppDocumentPeer::SYNC_WITH_DRIVE, AppDocumentPeer::SYNC_PERMISSIONS, ), BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID, AppDocumentPeer::APP_DOC_FILENAME, AppDocumentPeer::APP_DOC_TITLE, AppDocumentPeer::APP_DOC_COMMENT, AppDocumentPeer::DOC_VERSION, AppDocumentPeer::APP_UID, AppDocumentPeer::DEL_INDEX, AppDocumentPeer::DOC_UID, AppDocumentPeer::DOC_ID, AppDocumentPeer::USR_UID, AppDocumentPeer::APP_DOC_TYPE, AppDocumentPeer::APP_DOC_CREATE_DATE, AppDocumentPeer::APP_DOC_INDEX, AppDocumentPeer::FOLDER_UID, AppDocumentPeer::APP_DOC_PLUGIN, AppDocumentPeer::APP_DOC_TAGS, AppDocumentPeer::APP_DOC_STATUS, AppDocumentPeer::APP_DOC_STATUS_DATE, AppDocumentPeer::APP_DOC_FIELDNAME, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD, AppDocumentPeer::SYNC_WITH_DRIVE, AppDocumentPeer::SYNC_PERMISSIONS, ),
BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID', 'APP_DOC_FILENAME', 'APP_DOC_TITLE', 'APP_DOC_COMMENT', 'DOC_VERSION', 'APP_UID', 'DEL_INDEX', 'DOC_UID', 'USR_UID', 'APP_DOC_TYPE', 'APP_DOC_CREATE_DATE', 'APP_DOC_INDEX', 'FOLDER_UID', 'APP_DOC_PLUGIN', 'APP_DOC_TAGS', 'APP_DOC_STATUS', 'APP_DOC_STATUS_DATE', 'APP_DOC_FIELDNAME', 'APP_DOC_DRIVE_DOWNLOAD', 'SYNC_WITH_DRIVE', 'SYNC_PERMISSIONS', ), BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID', 'APP_DOC_FILENAME', 'APP_DOC_TITLE', 'APP_DOC_COMMENT', 'DOC_VERSION', 'APP_UID', 'DEL_INDEX', 'DOC_UID', 'DOC_ID', 'USR_UID', 'APP_DOC_TYPE', 'APP_DOC_CREATE_DATE', 'APP_DOC_INDEX', 'FOLDER_UID', 'APP_DOC_PLUGIN', 'APP_DOC_TAGS', 'APP_DOC_STATUS', 'APP_DOC_STATUS_DATE', 'APP_DOC_FIELDNAME', 'APP_DOC_DRIVE_DOWNLOAD', 'SYNC_WITH_DRIVE', 'SYNC_PERMISSIONS', ),
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, ) 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, )
); );
/** /**
@@ -118,10 +121,10 @@ abstract class BaseAppDocumentPeer
* e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0
*/ */
private static $fieldKeys = array ( private static $fieldKeys = array (
BasePeer::TYPE_PHPNAME => array ('AppDocUid' => 0, 'AppDocFilename' => 1, 'AppDocTitle' => 2, 'AppDocComment' => 3, 'DocVersion' => 4, 'AppUid' => 5, 'DelIndex' => 6, 'DocUid' => 7, 'UsrUid' => 8, 'AppDocType' => 9, 'AppDocCreateDate' => 10, 'AppDocIndex' => 11, 'FolderUid' => 12, 'AppDocPlugin' => 13, 'AppDocTags' => 14, 'AppDocStatus' => 15, 'AppDocStatusDate' => 16, 'AppDocFieldname' => 17, 'AppDocDriveDownload' => 18, 'SyncWithDrive' => 19, 'SyncPermissions' => 20, ), BasePeer::TYPE_PHPNAME => array ('AppDocUid' => 0, 'AppDocFilename' => 1, 'AppDocTitle' => 2, 'AppDocComment' => 3, 'DocVersion' => 4, 'AppUid' => 5, 'DelIndex' => 6, 'DocUid' => 7, 'DocId' => 8, 'UsrUid' => 9, 'AppDocType' => 10, 'AppDocCreateDate' => 11, 'AppDocIndex' => 12, 'FolderUid' => 13, 'AppDocPlugin' => 14, 'AppDocTags' => 15, 'AppDocStatus' => 16, 'AppDocStatusDate' => 17, 'AppDocFieldname' => 18, 'AppDocDriveDownload' => 19, 'SyncWithDrive' => 20, 'SyncPermissions' => 21, ),
BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID => 0, AppDocumentPeer::APP_DOC_FILENAME => 1, AppDocumentPeer::APP_DOC_TITLE => 2, AppDocumentPeer::APP_DOC_COMMENT => 3, AppDocumentPeer::DOC_VERSION => 4, AppDocumentPeer::APP_UID => 5, AppDocumentPeer::DEL_INDEX => 6, AppDocumentPeer::DOC_UID => 7, AppDocumentPeer::USR_UID => 8, AppDocumentPeer::APP_DOC_TYPE => 9, AppDocumentPeer::APP_DOC_CREATE_DATE => 10, AppDocumentPeer::APP_DOC_INDEX => 11, AppDocumentPeer::FOLDER_UID => 12, AppDocumentPeer::APP_DOC_PLUGIN => 13, AppDocumentPeer::APP_DOC_TAGS => 14, AppDocumentPeer::APP_DOC_STATUS => 15, AppDocumentPeer::APP_DOC_STATUS_DATE => 16, AppDocumentPeer::APP_DOC_FIELDNAME => 17, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD => 18, AppDocumentPeer::SYNC_WITH_DRIVE => 19, AppDocumentPeer::SYNC_PERMISSIONS => 20, ), BasePeer::TYPE_COLNAME => array (AppDocumentPeer::APP_DOC_UID => 0, AppDocumentPeer::APP_DOC_FILENAME => 1, AppDocumentPeer::APP_DOC_TITLE => 2, AppDocumentPeer::APP_DOC_COMMENT => 3, AppDocumentPeer::DOC_VERSION => 4, AppDocumentPeer::APP_UID => 5, AppDocumentPeer::DEL_INDEX => 6, AppDocumentPeer::DOC_UID => 7, AppDocumentPeer::DOC_ID => 8, AppDocumentPeer::USR_UID => 9, AppDocumentPeer::APP_DOC_TYPE => 10, AppDocumentPeer::APP_DOC_CREATE_DATE => 11, AppDocumentPeer::APP_DOC_INDEX => 12, AppDocumentPeer::FOLDER_UID => 13, AppDocumentPeer::APP_DOC_PLUGIN => 14, AppDocumentPeer::APP_DOC_TAGS => 15, AppDocumentPeer::APP_DOC_STATUS => 16, AppDocumentPeer::APP_DOC_STATUS_DATE => 17, AppDocumentPeer::APP_DOC_FIELDNAME => 18, AppDocumentPeer::APP_DOC_DRIVE_DOWNLOAD => 19, AppDocumentPeer::SYNC_WITH_DRIVE => 20, AppDocumentPeer::SYNC_PERMISSIONS => 21, ),
BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID' => 0, 'APP_DOC_FILENAME' => 1, 'APP_DOC_TITLE' => 2, 'APP_DOC_COMMENT' => 3, 'DOC_VERSION' => 4, 'APP_UID' => 5, 'DEL_INDEX' => 6, 'DOC_UID' => 7, 'USR_UID' => 8, 'APP_DOC_TYPE' => 9, 'APP_DOC_CREATE_DATE' => 10, 'APP_DOC_INDEX' => 11, 'FOLDER_UID' => 12, 'APP_DOC_PLUGIN' => 13, 'APP_DOC_TAGS' => 14, 'APP_DOC_STATUS' => 15, 'APP_DOC_STATUS_DATE' => 16, 'APP_DOC_FIELDNAME' => 17, 'APP_DOC_DRIVE_DOWNLOAD' => 18, 'SYNC_WITH_DRIVE' => 19, 'SYNC_PERMISSIONS' => 20, ), BasePeer::TYPE_FIELDNAME => array ('APP_DOC_UID' => 0, 'APP_DOC_FILENAME' => 1, 'APP_DOC_TITLE' => 2, 'APP_DOC_COMMENT' => 3, 'DOC_VERSION' => 4, 'APP_UID' => 5, 'DEL_INDEX' => 6, 'DOC_UID' => 7, 'DOC_ID' => 8, 'USR_UID' => 9, 'APP_DOC_TYPE' => 10, 'APP_DOC_CREATE_DATE' => 11, 'APP_DOC_INDEX' => 12, 'FOLDER_UID' => 13, 'APP_DOC_PLUGIN' => 14, 'APP_DOC_TAGS' => 15, 'APP_DOC_STATUS' => 16, 'APP_DOC_STATUS_DATE' => 17, 'APP_DOC_FIELDNAME' => 18, 'APP_DOC_DRIVE_DOWNLOAD' => 19, 'SYNC_WITH_DRIVE' => 20, 'SYNC_PERMISSIONS' => 21, ),
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, ) 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, )
); );
/** /**
@@ -238,6 +241,8 @@ abstract class BaseAppDocumentPeer
$criteria->addSelectColumn(AppDocumentPeer::DOC_UID); $criteria->addSelectColumn(AppDocumentPeer::DOC_UID);
$criteria->addSelectColumn(AppDocumentPeer::DOC_ID);
$criteria->addSelectColumn(AppDocumentPeer::USR_UID); $criteria->addSelectColumn(AppDocumentPeer::USR_UID);
$criteria->addSelectColumn(AppDocumentPeer::APP_DOC_TYPE); $criteria->addSelectColumn(AppDocumentPeer::APP_DOC_TYPE);

View File

@@ -27,6 +27,12 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
*/ */
protected static $peer; protected static $peer;
/**
* The value for the note_id field.
* @var int
*/
protected $note_id;
/** /**
* The value for the app_uid field. * The value for the app_uid field.
* @var string * @var string
@@ -101,6 +107,17 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
*/ */
protected $alreadyInValidation = false; protected $alreadyInValidation = false;
/**
* Get the [note_id] column value.
*
* @return int
*/
public function getNoteId()
{
return $this->note_id;
}
/** /**
* Get the [app_uid] column value. * Get the [app_uid] column value.
* *
@@ -232,6 +249,28 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
return $this->note_recipients; return $this->note_recipients;
} }
/**
* Set the value of [note_id] column.
*
* @param int $v new value
* @return void
*/
public function setNoteId($v)
{
// Since the native PHP type for this column is integer,
// we will cast the input value to an int (if it is not).
if ($v !== null && !is_int($v) && is_numeric($v)) {
$v = (int) $v;
}
if ($this->note_id !== $v) {
$this->note_id = $v;
$this->modifiedColumns[] = AppNotesPeer::NOTE_ID;
}
} // setNoteId()
/** /**
* Set the value of [app_uid] column. * Set the value of [app_uid] column.
* *
@@ -476,32 +515,34 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{ {
try { try {
$this->app_uid = $rs->getString($startcol + 0); $this->note_id = $rs->getInt($startcol + 0);
$this->usr_uid = $rs->getString($startcol + 1); $this->app_uid = $rs->getString($startcol + 1);
$this->note_date = $rs->getTimestamp($startcol + 2, null); $this->usr_uid = $rs->getString($startcol + 2);
$this->note_content = $rs->getString($startcol + 3); $this->note_date = $rs->getTimestamp($startcol + 3, null);
$this->note_type = $rs->getString($startcol + 4); $this->note_content = $rs->getString($startcol + 4);
$this->note_availability = $rs->getString($startcol + 5); $this->note_type = $rs->getString($startcol + 5);
$this->note_origin_obj = $rs->getString($startcol + 6); $this->note_availability = $rs->getString($startcol + 6);
$this->note_affected_obj1 = $rs->getString($startcol + 7); $this->note_origin_obj = $rs->getString($startcol + 7);
$this->note_affected_obj2 = $rs->getString($startcol + 8); $this->note_affected_obj1 = $rs->getString($startcol + 8);
$this->note_recipients = $rs->getString($startcol + 9); $this->note_affected_obj2 = $rs->getString($startcol + 9);
$this->note_recipients = $rs->getString($startcol + 10);
$this->resetModified(); $this->resetModified();
$this->setNew(false); $this->setNew(false);
// FIXME - using NUM_COLUMNS may be clearer. // FIXME - using NUM_COLUMNS may be clearer.
return $startcol + 10; // 10 = AppNotesPeer::NUM_COLUMNS - AppNotesPeer::NUM_LAZY_LOAD_COLUMNS). return $startcol + 11; // 11 = AppNotesPeer::NUM_COLUMNS - AppNotesPeer::NUM_LAZY_LOAD_COLUMNS).
} catch (Exception $e) { } catch (Exception $e) {
throw new PropelException("Error populating AppNotes object", $e); throw new PropelException("Error populating AppNotes object", $e);
@@ -706,33 +747,36 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{ {
switch($pos) { switch($pos) {
case 0: case 0:
return $this->getAppUid(); return $this->getNoteId();
break; break;
case 1: case 1:
return $this->getUsrUid(); return $this->getAppUid();
break; break;
case 2: case 2:
return $this->getNoteDate(); return $this->getUsrUid();
break; break;
case 3: case 3:
return $this->getNoteContent(); return $this->getNoteDate();
break; break;
case 4: case 4:
return $this->getNoteType(); return $this->getNoteContent();
break; break;
case 5: case 5:
return $this->getNoteAvailability(); return $this->getNoteType();
break; break;
case 6: case 6:
return $this->getNoteOriginObj(); return $this->getNoteAvailability();
break; break;
case 7: case 7:
return $this->getNoteAffectedObj1(); return $this->getNoteOriginObj();
break; break;
case 8: case 8:
return $this->getNoteAffectedObj2(); return $this->getNoteAffectedObj1();
break; break;
case 9: case 9:
return $this->getNoteAffectedObj2();
break;
case 10:
return $this->getNoteRecipients(); return $this->getNoteRecipients();
break; break;
default: default:
@@ -755,16 +799,17 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{ {
$keys = AppNotesPeer::getFieldNames($keyType); $keys = AppNotesPeer::getFieldNames($keyType);
$result = array( $result = array(
$keys[0] => $this->getAppUid(), $keys[0] => $this->getNoteId(),
$keys[1] => $this->getUsrUid(), $keys[1] => $this->getAppUid(),
$keys[2] => $this->getNoteDate(), $keys[2] => $this->getUsrUid(),
$keys[3] => $this->getNoteContent(), $keys[3] => $this->getNoteDate(),
$keys[4] => $this->getNoteType(), $keys[4] => $this->getNoteContent(),
$keys[5] => $this->getNoteAvailability(), $keys[5] => $this->getNoteType(),
$keys[6] => $this->getNoteOriginObj(), $keys[6] => $this->getNoteAvailability(),
$keys[7] => $this->getNoteAffectedObj1(), $keys[7] => $this->getNoteOriginObj(),
$keys[8] => $this->getNoteAffectedObj2(), $keys[8] => $this->getNoteAffectedObj1(),
$keys[9] => $this->getNoteRecipients(), $keys[9] => $this->getNoteAffectedObj2(),
$keys[10] => $this->getNoteRecipients(),
); );
return $result; return $result;
} }
@@ -797,33 +842,36 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{ {
switch($pos) { switch($pos) {
case 0: case 0:
$this->setAppUid($value); $this->setNoteId($value);
break; break;
case 1: case 1:
$this->setUsrUid($value); $this->setAppUid($value);
break; break;
case 2: case 2:
$this->setNoteDate($value); $this->setUsrUid($value);
break; break;
case 3: case 3:
$this->setNoteContent($value); $this->setNoteDate($value);
break; break;
case 4: case 4:
$this->setNoteType($value); $this->setNoteContent($value);
break; break;
case 5: case 5:
$this->setNoteAvailability($value); $this->setNoteType($value);
break; break;
case 6: case 6:
$this->setNoteOriginObj($value); $this->setNoteAvailability($value);
break; break;
case 7: case 7:
$this->setNoteAffectedObj1($value); $this->setNoteOriginObj($value);
break; break;
case 8: case 8:
$this->setNoteAffectedObj2($value); $this->setNoteAffectedObj1($value);
break; break;
case 9: case 9:
$this->setNoteAffectedObj2($value);
break;
case 10:
$this->setNoteRecipients($value); $this->setNoteRecipients($value);
break; break;
} // switch() } // switch()
@@ -850,43 +898,47 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
$keys = AppNotesPeer::getFieldNames($keyType); $keys = AppNotesPeer::getFieldNames($keyType);
if (array_key_exists($keys[0], $arr)) { if (array_key_exists($keys[0], $arr)) {
$this->setAppUid($arr[$keys[0]]); $this->setNoteId($arr[$keys[0]]);
} }
if (array_key_exists($keys[1], $arr)) { if (array_key_exists($keys[1], $arr)) {
$this->setUsrUid($arr[$keys[1]]); $this->setAppUid($arr[$keys[1]]);
} }
if (array_key_exists($keys[2], $arr)) { if (array_key_exists($keys[2], $arr)) {
$this->setNoteDate($arr[$keys[2]]); $this->setUsrUid($arr[$keys[2]]);
} }
if (array_key_exists($keys[3], $arr)) { if (array_key_exists($keys[3], $arr)) {
$this->setNoteContent($arr[$keys[3]]); $this->setNoteDate($arr[$keys[3]]);
} }
if (array_key_exists($keys[4], $arr)) { if (array_key_exists($keys[4], $arr)) {
$this->setNoteType($arr[$keys[4]]); $this->setNoteContent($arr[$keys[4]]);
} }
if (array_key_exists($keys[5], $arr)) { if (array_key_exists($keys[5], $arr)) {
$this->setNoteAvailability($arr[$keys[5]]); $this->setNoteType($arr[$keys[5]]);
} }
if (array_key_exists($keys[6], $arr)) { if (array_key_exists($keys[6], $arr)) {
$this->setNoteOriginObj($arr[$keys[6]]); $this->setNoteAvailability($arr[$keys[6]]);
} }
if (array_key_exists($keys[7], $arr)) { if (array_key_exists($keys[7], $arr)) {
$this->setNoteAffectedObj1($arr[$keys[7]]); $this->setNoteOriginObj($arr[$keys[7]]);
} }
if (array_key_exists($keys[8], $arr)) { if (array_key_exists($keys[8], $arr)) {
$this->setNoteAffectedObj2($arr[$keys[8]]); $this->setNoteAffectedObj1($arr[$keys[8]]);
} }
if (array_key_exists($keys[9], $arr)) { if (array_key_exists($keys[9], $arr)) {
$this->setNoteRecipients($arr[$keys[9]]); $this->setNoteAffectedObj2($arr[$keys[9]]);
}
if (array_key_exists($keys[10], $arr)) {
$this->setNoteRecipients($arr[$keys[10]]);
} }
} }
@@ -900,6 +952,10 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
{ {
$criteria = new Criteria(AppNotesPeer::DATABASE_NAME); $criteria = new Criteria(AppNotesPeer::DATABASE_NAME);
if ($this->isColumnModified(AppNotesPeer::NOTE_ID)) {
$criteria->add(AppNotesPeer::NOTE_ID, $this->note_id);
}
if ($this->isColumnModified(AppNotesPeer::APP_UID)) { if ($this->isColumnModified(AppNotesPeer::APP_UID)) {
$criteria->add(AppNotesPeer::APP_UID, $this->app_uid); $criteria->add(AppNotesPeer::APP_UID, $this->app_uid);
} }
@@ -997,6 +1053,8 @@ abstract class BaseAppNotes extends BaseObject implements Persistent
public function copyInto($copyObj, $deepCopy = false) public function copyInto($copyObj, $deepCopy = false)
{ {
$copyObj->setNoteId($this->note_id);
$copyObj->setAppUid($this->app_uid); $copyObj->setAppUid($this->app_uid);
$copyObj->setUsrUid($this->usr_uid); $copyObj->setUsrUid($this->usr_uid);

View File

@@ -25,12 +25,15 @@ abstract class BaseAppNotesPeer
const CLASS_DEFAULT = 'classes.model.AppNotes'; const CLASS_DEFAULT = 'classes.model.AppNotes';
/** The total number of columns. */ /** The total number of columns. */
const NUM_COLUMNS = 10; const NUM_COLUMNS = 11;
/** The number of lazy-loaded columns. */ /** The number of lazy-loaded columns. */
const NUM_LAZY_LOAD_COLUMNS = 0; const NUM_LAZY_LOAD_COLUMNS = 0;
/** the column name for the NOTE_ID field */
const NOTE_ID = 'APP_NOTES.NOTE_ID';
/** the column name for the APP_UID field */ /** the column name for the APP_UID field */
const APP_UID = 'APP_NOTES.APP_UID'; const APP_UID = 'APP_NOTES.APP_UID';
@@ -72,10 +75,10 @@ abstract class BaseAppNotesPeer
* e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id' * e.g. self::$fieldNames[self::TYPE_PHPNAME][0] = 'Id'
*/ */
private static $fieldNames = array ( private static $fieldNames = array (
BasePeer::TYPE_PHPNAME => array ('AppUid', 'UsrUid', 'NoteDate', 'NoteContent', 'NoteType', 'NoteAvailability', 'NoteOriginObj', 'NoteAffectedObj1', 'NoteAffectedObj2', 'NoteRecipients', ), BasePeer::TYPE_PHPNAME => array ('NoteId', 'AppUid', 'UsrUid', 'NoteDate', 'NoteContent', 'NoteType', 'NoteAvailability', 'NoteOriginObj', 'NoteAffectedObj1', 'NoteAffectedObj2', 'NoteRecipients', ),
BasePeer::TYPE_COLNAME => array (AppNotesPeer::APP_UID, AppNotesPeer::USR_UID, AppNotesPeer::NOTE_DATE, AppNotesPeer::NOTE_CONTENT, AppNotesPeer::NOTE_TYPE, AppNotesPeer::NOTE_AVAILABILITY, AppNotesPeer::NOTE_ORIGIN_OBJ, AppNotesPeer::NOTE_AFFECTED_OBJ1, AppNotesPeer::NOTE_AFFECTED_OBJ2, AppNotesPeer::NOTE_RECIPIENTS, ), BasePeer::TYPE_COLNAME => array (AppNotesPeer::NOTE_ID, AppNotesPeer::APP_UID, AppNotesPeer::USR_UID, AppNotesPeer::NOTE_DATE, AppNotesPeer::NOTE_CONTENT, AppNotesPeer::NOTE_TYPE, AppNotesPeer::NOTE_AVAILABILITY, AppNotesPeer::NOTE_ORIGIN_OBJ, AppNotesPeer::NOTE_AFFECTED_OBJ1, AppNotesPeer::NOTE_AFFECTED_OBJ2, AppNotesPeer::NOTE_RECIPIENTS, ),
BasePeer::TYPE_FIELDNAME => array ('APP_UID', 'USR_UID', 'NOTE_DATE', 'NOTE_CONTENT', 'NOTE_TYPE', 'NOTE_AVAILABILITY', 'NOTE_ORIGIN_OBJ', 'NOTE_AFFECTED_OBJ1', 'NOTE_AFFECTED_OBJ2', 'NOTE_RECIPIENTS', ), BasePeer::TYPE_FIELDNAME => array ('NOTE_ID', 'APP_UID', 'USR_UID', 'NOTE_DATE', 'NOTE_CONTENT', 'NOTE_TYPE', 'NOTE_AVAILABILITY', 'NOTE_ORIGIN_OBJ', 'NOTE_AFFECTED_OBJ1', 'NOTE_AFFECTED_OBJ2', 'NOTE_RECIPIENTS', ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, )
); );
/** /**
@@ -85,10 +88,10 @@ abstract class BaseAppNotesPeer
* e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 * e.g. self::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0
*/ */
private static $fieldKeys = array ( private static $fieldKeys = array (
BasePeer::TYPE_PHPNAME => array ('AppUid' => 0, 'UsrUid' => 1, 'NoteDate' => 2, 'NoteContent' => 3, 'NoteType' => 4, 'NoteAvailability' => 5, 'NoteOriginObj' => 6, 'NoteAffectedObj1' => 7, 'NoteAffectedObj2' => 8, 'NoteRecipients' => 9, ), BasePeer::TYPE_PHPNAME => array ('NoteId' => 0, 'AppUid' => 1, 'UsrUid' => 2, 'NoteDate' => 3, 'NoteContent' => 4, 'NoteType' => 5, 'NoteAvailability' => 6, 'NoteOriginObj' => 7, 'NoteAffectedObj1' => 8, 'NoteAffectedObj2' => 9, 'NoteRecipients' => 10, ),
BasePeer::TYPE_COLNAME => array (AppNotesPeer::APP_UID => 0, AppNotesPeer::USR_UID => 1, AppNotesPeer::NOTE_DATE => 2, AppNotesPeer::NOTE_CONTENT => 3, AppNotesPeer::NOTE_TYPE => 4, AppNotesPeer::NOTE_AVAILABILITY => 5, AppNotesPeer::NOTE_ORIGIN_OBJ => 6, AppNotesPeer::NOTE_AFFECTED_OBJ1 => 7, AppNotesPeer::NOTE_AFFECTED_OBJ2 => 8, AppNotesPeer::NOTE_RECIPIENTS => 9, ), BasePeer::TYPE_COLNAME => array (AppNotesPeer::NOTE_ID => 0, AppNotesPeer::APP_UID => 1, AppNotesPeer::USR_UID => 2, AppNotesPeer::NOTE_DATE => 3, AppNotesPeer::NOTE_CONTENT => 4, AppNotesPeer::NOTE_TYPE => 5, AppNotesPeer::NOTE_AVAILABILITY => 6, AppNotesPeer::NOTE_ORIGIN_OBJ => 7, AppNotesPeer::NOTE_AFFECTED_OBJ1 => 8, AppNotesPeer::NOTE_AFFECTED_OBJ2 => 9, AppNotesPeer::NOTE_RECIPIENTS => 10, ),
BasePeer::TYPE_FIELDNAME => array ('APP_UID' => 0, 'USR_UID' => 1, 'NOTE_DATE' => 2, 'NOTE_CONTENT' => 3, 'NOTE_TYPE' => 4, 'NOTE_AVAILABILITY' => 5, 'NOTE_ORIGIN_OBJ' => 6, 'NOTE_AFFECTED_OBJ1' => 7, 'NOTE_AFFECTED_OBJ2' => 8, 'NOTE_RECIPIENTS' => 9, ), BasePeer::TYPE_FIELDNAME => array ('NOTE_ID' => 0, 'APP_UID' => 1, 'USR_UID' => 2, 'NOTE_DATE' => 3, 'NOTE_CONTENT' => 4, 'NOTE_TYPE' => 5, 'NOTE_AVAILABILITY' => 6, 'NOTE_ORIGIN_OBJ' => 7, 'NOTE_AFFECTED_OBJ1' => 8, 'NOTE_AFFECTED_OBJ2' => 9, 'NOTE_RECIPIENTS' => 10, ),
BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ) BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, )
); );
/** /**
@@ -189,6 +192,8 @@ abstract class BaseAppNotesPeer
public static function addSelectColumns(Criteria $criteria) public static function addSelectColumns(Criteria $criteria)
{ {
$criteria->addSelectColumn(AppNotesPeer::NOTE_ID);
$criteria->addSelectColumn(AppNotesPeer::APP_UID); $criteria->addSelectColumn(AppNotesPeer::APP_UID);
$criteria->addSelectColumn(AppNotesPeer::USR_UID); $criteria->addSelectColumn(AppNotesPeer::USR_UID);

View File

@@ -230,6 +230,7 @@
<column name="APP_UID" type="VARCHAR" size="32" required="true" default=""/> <column name="APP_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="DEL_INDEX" type="INTEGER" required="true" default="0"/> <column name="DEL_INDEX" type="INTEGER" required="true" default="0"/>
<column name="DOC_UID" type="VARCHAR" size="32" required="true" default=""/> <column name="DOC_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="DOC_ID" type="INTEGER" required="false" default="0"/>
<column name="USR_UID" type="VARCHAR" size="32" required="true" default=""/> <column name="USR_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="APP_DOC_TYPE" type="VARCHAR" size="32" required="true" default=""/> <column name="APP_DOC_TYPE" type="VARCHAR" size="32" required="true" default=""/>
<column name="APP_DOC_CREATE_DATE" type="TIMESTAMP" required="true"/> <column name="APP_DOC_CREATE_DATE" type="TIMESTAMP" required="true"/>
@@ -284,7 +285,7 @@
<rule name="required" message="User UID is required."/> <rule name="required" message="User UID is required."/>
</validator> </validator>
<validator column="APP_DOC_TYPE"> <validator column="APP_DOC_TYPE">
<rule name="validValues" value="INPUT|OUTPUT|ATTACHED" message="Please select a valid document type."/> <rule name="validValues" value="INPUT|OUTPUT|ATTACHED|CASE_NOTE" message="Please select a valid document type."/>
<rule name="required" message="Application Document Type is required."/> <rule name="required" message="Application Document Type is required."/>
</validator> </validator>
<validator column="APP_DOC_CREATE_DATE"> <validator column="APP_DOC_CREATE_DATE">
@@ -3287,7 +3288,7 @@
<unique-column name="CATEGORY_ID"/> <unique-column name="CATEGORY_ID"/>
</unique> </unique>
</table> </table>
<table name="APP_NOTES"> <table name="APP_NOTES" idMethod="native">
<vendor type="mysql"> <vendor type="mysql">
<parameter name="Name" value="APP_NOTES"/> <parameter name="Name" value="APP_NOTES"/>
<parameter name="Engine" value="InnoDB"/> <parameter name="Engine" value="InnoDB"/>
@@ -3308,6 +3309,7 @@
<parameter name="Create_options" value=""/> <parameter name="Create_options" value=""/>
<parameter name="Comment" value="Application Notes"/> <parameter name="Comment" value="Application Notes"/>
</vendor> </vendor>
<column name="NOTE_ID" type="INTEGER" required="true" autoIncrement="true" unique="true"/>
<column name="APP_UID" type="VARCHAR" size="32" required="true" default=""/> <column name="APP_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="USR_UID" type="VARCHAR" size="32" required="true" default=""/> <column name="USR_UID" type="VARCHAR" size="32" required="true" default=""/>
<column name="NOTE_DATE" type="TIMESTAMP" required="true"/> <column name="NOTE_DATE" type="TIMESTAMP" required="true"/>
@@ -3318,6 +3320,9 @@
<column name="NOTE_AFFECTED_OBJ1" type="VARCHAR" size="32" default=""/> <column name="NOTE_AFFECTED_OBJ1" type="VARCHAR" size="32" default=""/>
<column name="NOTE_AFFECTED_OBJ2" type="VARCHAR" size="32" required="true" default=""/> <column name="NOTE_AFFECTED_OBJ2" type="VARCHAR" size="32" required="true" default=""/>
<column name="NOTE_RECIPIENTS" type="LONGVARCHAR"/> <column name="NOTE_RECIPIENTS" type="LONGVARCHAR"/>
<unique name="NOTE_ID">
<unique-column name="NOTE_ID"/>
</unique>
<index name="indexAppNotesDate"> <index name="indexAppNotesDate">
<index-column name="APP_UID"/> <index-column name="APP_UID"/>
<index-column name="NOTE_DATE"/> <index-column name="NOTE_DATE"/>

View File

@@ -1993,6 +1993,12 @@ msgstr "Add Data to PM table"
msgid "Add field" msgid "Add field"
msgstr "Add field" msgstr "Add field"
# TRANSLATION
# LABEL/ID_ADD_FILE
#: LABEL/ID_ADD_FILE
msgid "Add file"
msgstr "Add file"
# TRANSLATION # TRANSLATION
# LABEL/ID_ADD_HORIZONTAL_LINE # LABEL/ID_ADD_HORIZONTAL_LINE
#: LABEL/ID_ADD_HORIZONTAL_LINE #: LABEL/ID_ADD_HORIZONTAL_LINE
@@ -2575,6 +2581,18 @@ msgstr "Attach"
msgid "Attached" msgid "Attached"
msgstr "Attached" msgstr "Attached"
# TRANSLATION
# LABEL/ID_ATTACH_FILE
#: LABEL/ID_ATTACH_FILE
msgid "Attach file"
msgstr "Attach file"
# TRANSLATION
# LABEL/ID_ATTACHED_FILES
#: LABEL/ID_ATTACHED_FILES
msgid "Attached files"
msgstr "Attached files"
# TRANSLATION # TRANSLATION
# LABEL/ID_ATTRIBUTES # LABEL/ID_ATTRIBUTES
#: LABEL/ID_ATTRIBUTES #: LABEL/ID_ATTRIBUTES
@@ -25289,6 +25307,12 @@ msgstr "Error: The application {0} is not canceled."
msgid "The default configuration was not defined" msgid "The default configuration was not defined"
msgstr "The default configuration was not defined" msgstr "The default configuration was not defined"
# TRANSLATION
# LABEL/ID_THE_FILE_COULDNT_BE_UPLOADED
#: LABEL/ID_THE_FILE_COULDNT_BE_UPLOADED
msgid "The file couldnt be uploaded please review the allowed files or contact your System Administrator."
msgstr "The file couldnt be uploaded please review the allowed files or contact your System Administrator."
# TRANSLATION # TRANSLATION
# LABEL/ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED # LABEL/ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED
#: LABEL/ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED #: LABEL/ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED
@@ -27695,6 +27719,12 @@ msgstr "Yesterday"
msgid "[LABEL/ID_YES_VALUE] Yes" msgid "[LABEL/ID_YES_VALUE] Yes"
msgstr "Yes" msgstr "Yes"
# TRANSLATION
# LABEL/ID_YOUR_FILE_HAS_EXCEEDED
#: LABEL/ID_YOUR_FILE_HAS_EXCEEDED
msgid "Your file has exceeded the file maximum size that is {0}."
msgstr "Your file has exceeded the file maximum size that is {0}."
# TRANSLATION # TRANSLATION
# LABEL/ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY # LABEL/ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY
#: LABEL/ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY #: LABEL/ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY
@@ -27749,6 +27779,12 @@ msgstr "You do not select any user to import"
msgid "you have an error" msgid "you have an error"
msgstr "you have an error" msgstr "you have an error"
# TRANSLATION
# LABEL/ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION
#: LABEL/ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION
msgid "You uploaded an unsupported file extension, please review the permitted files uploaded in the wiki of ProcessMaker for the cases notes."
msgstr "You uploaded an unsupported file extension, please review the permitted files uploaded in the wiki of ProcessMaker for the cases notes."
# TRANSLATION # TRANSLATION
# LABEL/ID_ZIP_CODE # LABEL/ID_ZIP_CODE
#: LABEL/ID_ZIP_CODE #: LABEL/ID_ZIP_CODE

View File

@@ -1,4 +1,18 @@
<?php <?php
/**
* appProxy.php
*
* Controller for return information about the cases notes and summary form
*
* @link https://wiki.processmaker.com/3.2/Case_Notes
* @link https://wiki.processmaker.com/3.2/Case_Summary
*/
use ProcessMaker\BusinessModel\Cases as BmCases;
use ProcessMaker\Exception\CaseNoteUploadFile;
use ProcessMaker\Model\AppNotes as Notes;
use ProcessMaker\Model\Documents;
use ProcessMaker\Util\DateTime; use ProcessMaker\Util\DateTime;
if (!isset($_SESSION['USER_LOGGED'])) { if (!isset($_SESSION['USER_LOGGED'])) {
@@ -86,11 +100,13 @@ class AppProxy extends HttpProxyController
} else { } else {
$tasUid = $httpData->tas; $tasUid = $httpData->tas;
} }
// Get user logged
$usrUid = $_SESSION['USER_LOGGED']; $usrUid = $_SESSION['USER_LOGGED'];
// Review if the user has the permissions
$respView = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, "VIEW", $delIndex); $respView = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, "VIEW", $delIndex);
$respBlock = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, "BLOCK", $delIndex); $respBlock = $case->getAllObjectsFrom($proUid, $appUid, $tasUid, $usrUid, "BLOCK", $delIndex);
if ($respView['CASES_NOTES'] == 0 && $respBlock['CASES_NOTES'] == 0) { if ($respView['CASES_NOTES'] == 0 && $respBlock['CASES_NOTES'] == 0) {
return [ return [
'totalCount' => 0, 'totalCount' => 0,
@@ -99,27 +115,30 @@ class AppProxy extends HttpProxyController
]; ];
} }
$usrUid = isset($_SESSION['USER_LOGGED']) ? $_SESSION['USER_LOGGED'] : ""; // Get the notes
$appNotes = new AppNotes(); $appNote = new Notes();
$response = $appNotes->getNotesList($appUid, '', $httpData->start, $httpData->limit); $response = $appNote->getNotes($appUid, $httpData->start, $httpData->limit);
$response = AppNotes::applyHtmlentitiesInNotes($response); $response = AppNotes::applyHtmlentitiesInNotes($response);
// Prepare the response
$documents = new Documents();
$iterator = 0; $iterator = 0;
foreach ($response['array']['notes'] as $value) { foreach ($response['notes'] as $value) {
$response ['array']['notes'][$iterator]['NOTE_DATE'] = DateTime::convertUtcToTimeZone($value['NOTE_DATE']); $response['notes'][$iterator]['NOTE_DATE'] = DateTime::convertUtcToTimeZone($value['NOTE_DATE']);
$response['notes'][$iterator]['attachments'] = $documents->getFiles($value['NOTE_ID']);
$iterator++; $iterator++;
} }
require_once("classes/model/Application.php"); require_once("classes/model/Application.php");
$oApplication = new Application(); $application = new Application();
$aApplication = $oApplication->Load($appUid); $appInfo = $application->Load($appUid);
$response['array']['appTitle'] = $aApplication['APP_TITLE']; $response['appTitle'] = $appInfo['APP_TITLE'];
return $response['array']; return $response;
} }
/** /**
* post Note Action * Post a note
* *
* @param string $httpData->appUid (optional, if it is not passed try use $_SESSION['APPLICATION']) * @param string $httpData->appUid (optional, if it is not passed try use $_SESSION['APPLICATION'])
* @return array containg the case notes * @return array containg the case notes
@@ -143,9 +162,15 @@ class AppProxy extends HttpProxyController
$this->setSendResponse(false); $this->setSendResponse(false);
//Add note case //Add note case
$appNote = new AppNotes(); $cases = new BmCases();
try { try {
$response = $appNote->addCaseNote($appUid, $usrUid, $noteContent, intval($httpData->swSendMail)); $sendMail = intval($httpData->swSendMail);
$response = $cases->addNote($appUid, $usrUid, $noteContent, $sendMail);
} catch (CaseNoteUploadFile $e) {
$response = new stdclass();
$response->success = 'success';
$response->message = $e->getMessage();
die(G::json_encode($response));
} catch (Exception $error) { } catch (Exception $error) {
$response = new stdclass(); $response = new stdclass();
$response->success = 'success'; $response->success = 'success';

View File

@@ -57133,6 +57133,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_ADD_CUSTOM_COLUMN','en','Add Custom Column','2014-01-15') , ( 'LABEL','ID_ADD_CUSTOM_COLUMN','en','Add Custom Column','2014-01-15') ,
( 'LABEL','ID_ADD_DATA_PMTABLE','en','Add Data to PM table','2014-10-10') , ( 'LABEL','ID_ADD_DATA_PMTABLE','en','Add Data to PM table','2014-10-10') ,
( 'LABEL','ID_ADD_FIELD','en','Add field','2014-01-15') , ( 'LABEL','ID_ADD_FIELD','en','Add field','2014-01-15') ,
( 'LABEL','ID_ADD_FILE','en','Add file','2020-06-11') ,
( 'LABEL','ID_ADD_HORIZONTAL_LINE','en','Add horizontal line','2015-02-20') , ( 'LABEL','ID_ADD_HORIZONTAL_LINE','en','Add horizontal line','2015-02-20') ,
( 'LABEL','ID_ADD_LICENSE','en','Please add a new license','2014-01-15') , ( 'LABEL','ID_ADD_LICENSE','en','Please add a new license','2014-01-15') ,
( 'LABEL','ID_ADD_MESSAGE','en','Add message','2014-01-15') , ( 'LABEL','ID_ADD_MESSAGE','en','Add message','2014-01-15') ,
@@ -57232,6 +57233,8 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_ASSIGN_VARIABLES_OUT','en','Assign Variables Out','2014-01-15') , ( 'LABEL','ID_ASSIGN_VARIABLES_OUT','en','Assign Variables Out','2014-01-15') ,
( 'LABEL','ID_ATTACH','en','Attach','2014-01-15') , ( 'LABEL','ID_ATTACH','en','Attach','2014-01-15') ,
( 'LABEL','ID_ATTACHED_DB','en','Attached','2014-10-08') , ( 'LABEL','ID_ATTACHED_DB','en','Attached','2014-10-08') ,
( 'LABEL','ID_ATTACH_FILE','en','Attach file','2020-06-11') ,
( 'LABEL','ID_ATTACHED_FILES','en','Attached files','2020-06-10') ,
( 'LABEL','ID_ATTRIBUTES','en','Attributes','2014-01-15') , ( 'LABEL','ID_ATTRIBUTES','en','Attributes','2014-01-15') ,
( 'LABEL','ID_ATTRIBUTE_HAS_INVALID_ELEMENT_KEY','en','The attribute {0}, has an invalid element (incorrect keys).','2014-05-20') , ( 'LABEL','ID_ATTRIBUTE_HAS_INVALID_ELEMENT_KEY','en','The attribute {0}, has an invalid element (incorrect keys).','2014-05-20') ,
( 'LABEL','ID_AT_RISK','en','At Risk','2014-01-15') , ( 'LABEL','ID_AT_RISK','en','At Risk','2014-01-15') ,
@@ -61106,6 +61109,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_THERE_PROBLEM_SENDING_EMAIL','en','There was a problem sending the email to','2016-04-08') , ( 'LABEL','ID_THERE_PROBLEM_SENDING_EMAIL','en','There was a problem sending the email to','2016-04-08') ,
( 'LABEL','ID_THE_APPLICATION_IS_NOT_CANCELED','en','Error: The application {0} is not canceled.','2016-06-15') , ( 'LABEL','ID_THE_APPLICATION_IS_NOT_CANCELED','en','Error: The application {0} is not canceled.','2016-06-15') ,
( 'LABEL','ID_THE_DEFAULT_CONFIGURATION','en','The default configuration was not defined','2016-11-16') , ( 'LABEL','ID_THE_DEFAULT_CONFIGURATION','en','The default configuration was not defined','2016-11-16') ,
( 'LABEL','ID_THE_FILE_COULDNT_BE_UPLOADED','en','The file couldnt be uploaded please review the allowed files or contact your System Administrator.','2020-06-12') ,
( 'LABEL','ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED','en','The file size is bigger than the maximum allowed, the maximum size allowed is {0} Mbytes.','2019-02-26') , ( 'LABEL','ID_THE_FILE_SIZE_IS_BIGGER_THAN_THE_MAXIMUM_ALLOWED','en','The file size is bigger than the maximum allowed, the maximum size allowed is {0} Mbytes.','2019-02-26') ,
( 'LABEL','ID_THE_MAXIMUM_VALUE_OF_THIS_FIELD_IS','en','The maximum value of this field is {0}.','2019-02-26') , ( 'LABEL','ID_THE_MAXIMUM_VALUE_OF_THIS_FIELD_IS','en','The maximum value of this field is {0}.','2019-02-26') ,
( 'LABEL','ID_THE_MIMETYPE_EXTENSION_ERROR','en','The mime type does not correspond to the permitted extension, please verify your file.','2018-10-02') , ( 'LABEL','ID_THE_MIMETYPE_EXTENSION_ERROR','en','The mime type does not correspond to the permitted extension, please verify your file.','2018-10-02') ,
@@ -61517,6 +61521,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_YES','en','Yes','2014-01-15') , ( 'LABEL','ID_YES','en','Yes','2014-01-15') ,
( 'LABEL','ID_YESTERDAY','en','Yesterday','2014-01-15') , ( 'LABEL','ID_YESTERDAY','en','Yesterday','2014-01-15') ,
( 'LABEL','ID_YES_VALUE','en','Yes','2014-01-15') , ( 'LABEL','ID_YES_VALUE','en','Yes','2014-01-15') ,
( 'LABEL','ID_YOUR_FILE_HAS_EXCEEDED','en','Your file has exceeded the file maximum size that is 10MB.','2020-06-12') ,
( 'LABEL','ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY','en','Your image has been successfully uploaded','2014-01-15') , ( 'LABEL','ID_YOUR_IMAGE_HAS_BEEN_SUCCESSFULLY','en','Your image has been successfully uploaded','2014-01-15') ,
( 'LABEL','ID_YOUR_LICENSE','en','Your license','2014-09-18') , ( 'LABEL','ID_YOUR_LICENSE','en','Your license','2014-09-18') ,
( 'LABEL','ID_YOUR_PASSWORD_IS','en','Your password is','2014-01-15') , ( 'LABEL','ID_YOUR_PASSWORD_IS','en','Your password is','2014-01-15') ,
@@ -61526,6 +61531,7 @@ INSERT INTO TRANSLATION (TRN_CATEGORY,TRN_ID,TRN_LANG,TRN_VALUE,TRN_UPDATE_DATE
( 'LABEL','ID_YOU_DO_NOT_HAVE_PERMISSION','en','Error: You do not have permission.','2016-06-15') , ( 'LABEL','ID_YOU_DO_NOT_HAVE_PERMISSION','en','Error: You do not have permission.','2016-06-15') ,
( 'LABEL','ID_YOU_DO_NOT_SELECT_ANY_USER_TO_IMPORT','en','You do not select any user to import','2015-09-15') , ( 'LABEL','ID_YOU_DO_NOT_SELECT_ANY_USER_TO_IMPORT','en','You do not select any user to import','2015-09-15') ,
( 'LABEL','ID_YOU_HAVE_ERROR','en','you have an error','2014-01-15') , ( 'LABEL','ID_YOU_HAVE_ERROR','en','you have an error','2014-01-15') ,
( 'LABEL','ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION','en','You uploaded an unsupported file extension, please review the permitted files uploaded in the wiki of ProcessMaker for the cases notes.','2020-06-12') ,
( 'LABEL','ID_ZIP_CODE','en','Zip Code','2014-01-15') , ( 'LABEL','ID_ZIP_CODE','en','Zip Code','2014-01-15') ,
( 'LABEL','IMAGE_DETAIL','en','Image detail','2014-01-15') , ( 'LABEL','IMAGE_DETAIL','en','Image detail','2014-01-15') ,
( 'LABEL','IMPORT_LANGUAGE_ERR_NO_WRITABLE','en','The XML forms directory is not writable','2014-01-15') , ( 'LABEL','IMPORT_LANGUAGE_ERR_NO_WRITABLE','en','The XML forms directory is not writable','2014-01-15') ,

View File

@@ -120,6 +120,7 @@ CREATE TABLE `APP_DOCUMENT`
`APP_UID` VARCHAR(32) default '' NOT NULL, `APP_UID` VARCHAR(32) default '' NOT NULL,
`DEL_INDEX` INTEGER default 0 NOT NULL, `DEL_INDEX` INTEGER default 0 NOT NULL,
`DOC_UID` VARCHAR(32) default '' NOT NULL, `DOC_UID` VARCHAR(32) default '' NOT NULL,
`DOC_ID` INTEGER default 0,
`USR_UID` VARCHAR(32) default '' NOT NULL, `USR_UID` VARCHAR(32) default '' NOT NULL,
`APP_DOC_TYPE` VARCHAR(32) default '' NOT NULL, `APP_DOC_TYPE` VARCHAR(32) default '' NOT NULL,
`APP_DOC_CREATE_DATE` DATETIME NOT NULL, `APP_DOC_CREATE_DATE` DATETIME NOT NULL,
@@ -1583,6 +1584,7 @@ DROP TABLE IF EXISTS `APP_NOTES`;
CREATE TABLE `APP_NOTES` CREATE TABLE `APP_NOTES`
( (
`NOTE_ID` INTEGER NOT NULL AUTO_INCREMENT,
`APP_UID` VARCHAR(32) default '' NOT NULL, `APP_UID` VARCHAR(32) default '' NOT NULL,
`USR_UID` VARCHAR(32) default '' NOT NULL, `USR_UID` VARCHAR(32) default '' NOT NULL,
`NOTE_DATE` DATETIME NOT NULL, `NOTE_DATE` DATETIME NOT NULL,
@@ -1593,6 +1595,7 @@ CREATE TABLE `APP_NOTES`
`NOTE_AFFECTED_OBJ1` VARCHAR(32) default '', `NOTE_AFFECTED_OBJ1` VARCHAR(32) default '',
`NOTE_AFFECTED_OBJ2` VARCHAR(32) default '' NOT NULL, `NOTE_AFFECTED_OBJ2` VARCHAR(32) default '' NOT NULL,
`NOTE_RECIPIENTS` MEDIUMTEXT, `NOTE_RECIPIENTS` MEDIUMTEXT,
UNIQUE KEY `NOTE_ID` (`NOTE_ID`),
KEY `indexAppNotesDate`(`APP_UID`, `NOTE_DATE`), KEY `indexAppNotesDate`(`APP_UID`, `NOTE_DATE`),
KEY `indexAppNotesUser`(`APP_UID`, `USR_UID`) KEY `indexAppNotesUser`(`APP_UID`, `USR_UID`)
)ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Application Notes'; )ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Application Notes';

View File

@@ -0,0 +1,94 @@
<?php
/**
* Download documents related to the cases notes
*/
use ProcessMaker\BusinessModel\Cases;
if (empty($_SESSION['USER_LOGGED'])) {
G::SendMessageText(G::LoadTranslation('ID_LOGIN_TO_SEE_OUTPUTDOCS'), "WARNING");
G::header('Location: /errors/error403.php?url=' . urlencode($_SERVER['REQUEST_URI']));
die();
}
$appDocument = new AppDocument();
if (empty($_GET['a'])) {
G::header('Location: /errors/error403.php');
die();
}
if (empty($_GET['v'])) {
//Load last version of the document
$docVersion = $appDocument->getLastAppDocVersion($_GET['a']);
} else {
$docVersion = $_GET['v'];
}
$appDocument->fields = $appDocument->load($_GET['a'], $docVersion);
//Check if the document is a case note document
if ($appDocument->fields['APP_DOC_TYPE'] != 'CASE_NOTE') {
G::header('Location: /errors/error403.php');
die();
}
//Check if the user can be download the input Document
//Send the parameter v = Version
//Send the parameter a = Case UID
if ($RBAC->userCanAccess('PM_FOLDERS_ALL') != 1 && defined('DISABLE_DOWNLOAD_DOCUMENTS_SESSION_VALIDATION') && DISABLE_DOWNLOAD_DOCUMENTS_SESSION_VALIDATION == 0) {
if (!$appDocument->canDownloadInput($_SESSION['USER_LOGGED'], $_GET['a'], $docVersion)) {
G::header('Location: /errors/error403.php');
die();
}
}
//Create the Cases object
$case = new Cases();
//Get the case information to get the processUid
$processUid = $case->getCaseInfo($appDocument->fields['APP_UID'], $_SESSION['USER_LOGGED'])->pro_uid;
//Get the user authorization
$userCanAccess = $case->userAuthorization(
$_SESSION['USER_LOGGED'],
$processUid,
$appDocument->fields['APP_UID'],
['PM_ALLCASES'],
['CASES_NOTES' => 'VIEW']
);
//Check if the user has the Case Notes permissions
if ($userCanAccess['objectPermissions']['CASES_NOTES'] != 1) {
G::header('Location: /errors/error403.php');
die();
}
$appDocUid = $appDocument->getAppDocUid();
$docVersionInformation = $appDocument->getDocVersion();
$info = pathinfo($appDocument->getAppDocFilename());
$ext = (isset($info['extension']) ? $info['extension'] : '');
$download = true;
//Get the document path
$appUid = G::getPathFromUID($appDocument->fields['APP_UID']);
$file = G::getPathFromFileUID($appDocument->fields['APP_UID'], $appDocUid);
$realPath = PATH_DOCUMENT . $appUid . '/' . $file[0] . $file[1] . '_' . $docVersionInformation . '.' . $ext;
$realPath1 = PATH_DOCUMENT . $appUid . '/' . $file[0] . $file[1] . '.' . $ext;
$sw_file_exists = false;
if (file_exists($realPath)) {
$sw_file_exists = true;
} elseif (file_exists($realPath1)) {
$sw_file_exists = true;
$realPath = $realPath1;
}
if (!$sw_file_exists) {
$error_message = G::LoadTranslation('ID_ERROR_STREAMING_FILE');
G::SendMessageText($error_message, "ERROR");
G::header('Location: ' . $_SERVER['HTTP_REFERER']);
die();
} else {
$nameFile = $appDocument->fields['APP_DOC_FILENAME'];
G::streamFile($realPath, $download, $nameFile); //download
}

View File

@@ -1676,3 +1676,11 @@ white-space:normal;
clear: both; clear: both;
height: 50px; height: 50px;
} }
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -1868,3 +1868,11 @@ white-space:normal;
clear: both; clear: both;
height: 50px; height: 50px;
} }
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -1705,3 +1705,11 @@ text-decoration: none;
clear: both; clear: both;
height: 50px; height: 50px;
} }
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -1250,3 +1250,11 @@ td.x-cnotes-label {
clear: both; clear: both;
height: 50px; height: 50px;
} }
.nav_list li a {
padding: 2px 2px 2px 10px;
overflow: hidden;
text-overflow: ellipsis;
width: 100px;
white-space: nowrap;
display: inline-block;
}

View File

@@ -14,6 +14,7 @@ use AppHistoryPeer;
use Application; use Application;
use ApplicationPeer; use ApplicationPeer;
use Applications; use Applications;
use AppNotes;
use AppNotesPeer; use AppNotesPeer;
use AppSolr; use AppSolr;
use BasePeer; use BasePeer;
@@ -40,12 +41,16 @@ use ProcessMaker\BusinessModel\Task as BmTask;
use ProcessMaker\BusinessModel\User as BmUser; use ProcessMaker\BusinessModel\User as BmUser;
use ProcessMaker\Core\System; use ProcessMaker\Core\System;
use ProcessMaker\Exception\UploadException; use ProcessMaker\Exception\UploadException;
use ProcessMaker\Exception\CaseNoteUploadFile;
use ProcessMaker\Model\Application as ModelApplication; use ProcessMaker\Model\Application as ModelApplication;
use ProcessMaker\Model\AppNotes as Notes;
use ProcessMaker\Model\Delegation; use ProcessMaker\Model\Delegation;
use ProcessMaker\Model\Documents;
use ProcessMaker\Plugins\PluginRegistry; use ProcessMaker\Plugins\PluginRegistry;
use ProcessMaker\Services\OAuth2\Server; use ProcessMaker\Services\OAuth2\Server;
use ProcessMaker\Util\DateTime as UtilDateTime; use ProcessMaker\Util\DateTime as UtilDateTime;
use ProcessMaker\Validation\ExceptionRestApi; use ProcessMaker\Validation\ExceptionRestApi;
use ProcessMaker\Validation\ValidationUploadedFiles;
use ProcessMaker\Validation\Validator as FileValidator; use ProcessMaker\Validation\Validator as FileValidator;
use ProcessPeer; use ProcessPeer;
use ProcessUser; use ProcessUser;
@@ -3843,6 +3848,186 @@ class Cases
return $response; return $response;
} }
/**
* Add a case note
*
* @param string $appUid
* @param string $userUid
* @param string $note
* @param bool $sendMail
* @param array $files
*
* @return array
*/
public function addNote($appUid, $userUid, $note, $sendMail = false, $files = [])
{
// Register the note
$attributes = [
"APP_UID" => $appUid,
"USR_UID" => $userUid,
"NOTE_DATE" => date("Y-m-d H:i:s"),
"NOTE_CONTENT" => $note,
"NOTE_TYPE" => "USER",
"NOTE_AVAILABILITY" => "PUBLIC",
"NOTE_RECIPIENTS" => ""
];
$newNote = Notes::create($attributes);
// Get the FK
$noteId = $newNote->NOTE_ID;
$attachments = [];
// Register the files related to the note
if (!empty($files) || !empty($_FILES["filesToUpload"])) {
$filesResponse = $this->uploadFilesInCaseNotes($userUid, $appUid, $files, $noteId);
foreach ($filesResponse['attachments'] as $key => $value) {
$attachments[$key] = [];
$attachments[$key]['APP_DOC_FILENAME'] = $value['APP_DOC_FILENAME'];
$attachments[$key]['LINK'] = "../cases/casesShowCaseNotes?a=" . $value["APP_DOC_UID"] . "&v=" . $value["DOC_VERSION"];
}
}
// Send the email
if ($sendMail) {
// Get the recipients
$case = new ClassesCases();
$p = $case->getUsersParticipatedInCase($appUid, 'ACTIVE');
$noteRecipientsList = [];
foreach ($p["array"] as $key => $userParticipated) {
if ($key != '') {
$noteRecipientsList[] = $key;
}
}
$noteRecipients = implode(",", $noteRecipientsList);
$note = stripslashes($note);
// Send the notification
$appNote = new AppNotes();
$appNote->sendNoteNotification($appUid, $userUid, $note, $noteRecipients, '', 0, $noteId);
}
// Prepare the response
$result = [];
$result['success'] = 'success';
$result['message'] = '';
$result['attachments'] = $attachments;
$result['attachment_errors'] = [];
return $result;
}
/**
* Upload file related to the case notes
*
* @param string $userUid
* @param string $appUid
* @param array $filesReferences
* @param int $noteId
*
* @return array
* @throws Exception
*/
public function uploadFilesInCaseNotes($userUid, $appUid, $filesReferences = [], $noteId = 0)
{
$files = [];
if (!empty($_FILES["filesToUpload"])) {
$upload = true;
// This format is from ext-js multipart
$filesName = !empty($_FILES["filesToUpload"]["name"]) ? $_FILES["filesToUpload"]["name"] : [];
$filesTmpName = !empty($_FILES["filesToUpload"]["tmp_name"]) ? $_FILES["filesToUpload"]["tmp_name"] : [];
$filesError = !empty($_FILES["filesToUpload"]["error"]) ? $_FILES["filesToUpload"]["error"] : [];
foreach ($filesName as $index => $value) {
if (!empty($value)) {
$files[] = [
'name' => $filesName[$index],
'tmp_name' => $filesTmpName[$index],
'error' => $filesError[$index]
];
}
}
} elseif (!empty($filesReferences)) {
$upload = false;
// Array with path references
foreach ($filesReferences as $fileIndex => $fileName) {
$nameFile = !is_numeric($fileIndex) ? basename($fileIndex) : basename($fileName);
$files[] = [
'name' => $nameFile,
'tmp_name' => $fileName,
'error' => UPLOAD_ERR_OK
];
}
}
//rules validation
foreach ($files as $key => $value) {
$entry = [
"filename" => $value['name'],
"path" => $value['tmp_name']
];
$validator = ValidationUploadedFiles::getValidationUploadedFiles()
->runRulesForPostFilesOfNote($entry);
if ($validator->fails()) {
Notes::where('NOTE_ID', '=', $noteId)->delete();
$messageError = G::LoadTranslation('ID_THE_FILE_COULDNT_BE_UPLOADED');
throw new CaseNoteUploadFile($messageError . ' ' . $validator->getMessage());
}
}
// Get the delIndex related to the case
$cases = new ClassesCases();
$delIndex = $cases->getCurrentDelegation($appUid);
// We will to register the files in the database
$response = [];
$response['attachments'] = [];
$response['attachment_errors'] = [];
if (!empty($files)) {
$i = 0;
$j = 0;
foreach ($files as $fileIndex => $fileName) {
// There is no error, the file uploaded with success
if ($fileName["error"] === UPLOAD_ERR_OK) {
$appDocUid = G::generateUniqueID();
// Upload or move the file
$isUploaded = saveAppDocument($fileName, $appUid, $appDocUid, 1, $upload);
// If the file was uploaded correctly we will to register in the DB
if ($isUploaded) {
$attributes = [
"DOC_ID" => $noteId,
"APP_DOC_UID" => $appDocUid,
"DOC_VERSION" => 1,
"APP_UID" => $appUid,
"DEL_INDEX" => $delIndex,
"USR_UID" => $userUid,
"DOC_UID" => -1,
"APP_DOC_TYPE" => 'CASE_NOTE',
"APP_DOC_CREATE_DATE" => date("Y-m-d H:i:s"),
"APP_DOC_FILENAME" => $fileName["name"]
];
Documents::create($attributes);
// List of files uploaded or copy
$response['attachments'][$i++] = $attributes;
} else {
$response['attachment_errors'][$j++] = [
'error' => 'error',
'file' => $fileName["name"]
];
}
} else {
throw new UploadException($fileName['error']);
}
}
}
return $response;
}
/** /**
* Run the validations related to an Input Document * Run the validations related to an Input Document
* *

View File

@@ -0,0 +1,21 @@
<?php
namespace ProcessMaker\Exception;
use Exception;
use Throwable;
class CaseNoteUploadFile extends Exception
{
/**
* Constructor method.
* @param string $message
* @param int $code
* @param Throwable $previous
*/
public function __construct(string $message = "", int $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
}

View File

@@ -6,6 +6,101 @@ use Illuminate\Database\Eloquent\Model;
class AppNotes extends Model class AppNotes extends Model
{ {
// Set our table name
protected $table = 'APP_NOTES'; protected $table = 'APP_NOTES';
// No timestamps
public $timestamps = false; public $timestamps = false;
// Primary key
protected $primaryKey = 'NOTE_ID';
// The IDs are auto-incrementing
public $incrementing = true;
/**
* The model's default values for attributes.
*
* @var array
*/
protected $attributes = [
'NOTE_TYPE' => 'USER',
'NOTE_ORIGIN_OBJ' => '',
'NOTE_AFFECTED_OBJ1' => '',
'NOTE_AFFECTED_OBJ2' => ''
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'APP_UID',
'USR_UID',
'NOTE_DATE',
'NOTE_CONTENT',
'NOTE_TYPE',
'NOTE_AVAILABILITY',
'NOTE_ORIGIN_OBJ',
'NOTE_AFFECTED_OBJ1',
'NOTE_AFFECTED_OBJ2',
'NOTE_RECIPIENTS'
];
/**
* Scope a query to filter an specific case
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $appUid
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeAppUid($query, string $appUid)
{
return $query->where('APP_UID', $appUid);
}
/**
* Return the documents related to the case
*
* @param string $appUid
* @param int $start
* @param int $limit
* @param string $dir
*
* @return array
*/
public static function getNotes(string $appUid, $start = 0, $limit = 25, $dir = 'DESC')
{
$query = AppNotes::query()->select([
'NOTE_ID',
'APP_UID',
'NOTE_DATE',
'NOTE_CONTENT',
'NOTE_TYPE',
'NOTE_AVAILABILITY',
'USERS.USR_UID',
'USERS.USR_USERNAME',
'USERS.USR_FIRSTNAME',
'USERS.USR_LASTNAME'
]);
$query->leftJoin('USERS', function ($join) {
$join->on('USERS.USR_UID', '=', 'APP_NOTES.USR_UID');
});
$query->appUid($appUid);
$query->orderBy('NOTE_DATE', $dir);
// Add pagination to the query
$query->offset($start)->limit($limit);
$results = $query->get();
$notes = [];
$notes['notes'] = [];
$results->each(function ($item, $key) use (&$notes) {
$row = $item->toArray();
$row['NOTE_CONTENT'] = stripslashes($row['NOTE_CONTENT']);
$notes['notes'][] = $row;
});
// Add the total of rows to return
$notes['totalCount'] = $limit;
return $notes;
}
} }

View File

@@ -0,0 +1,148 @@
<?php
namespace ProcessMaker\Model;
use Illuminate\Database\Eloquent\Model;
class Documents extends Model
{
// Set our table name
protected $table = 'APP_DOCUMENT';
// No timestamps
public $timestamps = false;
// Primary key
protected $primaryKey = 'NOTE_ID';
// The IDs are auto-incrementing
public $incrementing = false;
// Valid AppDocType's
const DOC_TYPE_ATTACHED = 'ATTACHED';
const DOC_TYPE_CASE_NOTE = 'CASE_NOTE';
const DOC_TYPE_INPUT = 'INPUT';
const DOC_TYPE_OUTPUT = 'OUTPUT';
/**
* The model's default values for attributes.
*
* @var array
*/
protected $attributes = [
'APP_DOC_TITLE' => '',
'APP_DOC_COMMENT' => '',
'DOC_UID' => '-1',
'FOLDER_UID' => '',
'APP_DOC_PLUGIN' => '',
'APP_DOC_TAGS' => '',
'APP_DOC_FIELDNAME' => '',
'APP_DOC_DRIVE_DOWNLOAD' => 'a:0:{}',
'SYNC_WITH_DRIVE' => 'UNSYNCHRONIZED',
'SYNC_PERMISSIONS' => '',
'APP_DOC_STATUS_DATE' => '',
];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'DOC_ID',
'APP_DOC_UID',
'DOC_VERSION',
'APP_DOC_FILENAME',
'APP_UID',
'DEL_INDEX',
'DOC_UID',
'USR_UID',
'APP_DOC_TYPE',
'APP_DOC_CREATE_DATE',
'APP_DOC_INDEX',
'FOLDER_UID',
'APP_DOC_STATUS',
];
/**
* Scope a query to filter an specific case
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param string $appUid
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeAppUid($query, string $appUid)
{
return $query->where('APP_UID', $appUid);
}
/**
* Scope a query to filter an specific reference file
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param int $docId
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeDocId($query, int $docId)
{
return $query->where('DOC_ID', $docId);
}
/**
* Return the documents related to the case
*
* @param string $appUid
* @param string $type
*
* @return array
*/
public static function getAppFiles(string $appUid, $type = 'CASE_NOTES')
{
$query = Documents::query()->select();
$query->appUid($appUid);
$query->where('APP_DOC_TYPE', $type);
$results = $query->get();
$documentList = [];
$results->each(function ($item, $key) use (&$documentList) {
$documentList[] = $item->toArray();
});
return $documentList;
}
/**
* Get attached files from the case note.
*
* @param string $appUid
*
* @return object
*/
public static function getAttachedFilesFromTheCaseNote(string $appUid)
{
$result = Documents::select('APP_DOCUMENT.APP_DOC_UID', 'APP_DOCUMENT.DOC_VERSION', 'APP_DOCUMENT.APP_DOC_FILENAME')
->join('APP_NOTES', function($join) use($appUid) {
$join->on('APP_NOTES.NOTE_ID', '=', 'APP_DOCUMENT.DOC_ID')
->where('APP_DOCUMENT.APP_UID', '=', $appUid);
})
->get();
return $result;
}
/**
* Return the documents related to the specific DOC_ID
*
* @param int $docId
*
* @return array
*/
public static function getFiles(int $docId)
{
$query = Documents::query()->select(['APP_DOC_UID', 'APP_DOC_FILENAME', 'DOC_VERSION']);
$query->docId($docId);
$results = $query->get();
$documentList = [];
$results->each(function ($item, $key) use (&$documentList) {
$row = $item->toArray();
$row['LINK'] = "../cases/casesShowCaseNotes?a=" . $row["APP_DOC_UID"] . "&v=" . $row["DOC_VERSION"];
$documentList[] = $row;
});
return $documentList;
}
}

View File

@@ -601,3 +601,42 @@ function getMysqlVersion()
return $mysqlVersion; return $mysqlVersion;
} }
/**
* Move the uploaded file to the documents folder
*
* @param array $file
* @param string $appUid
* @param string $appDocUid
* @param int $version
* @param bool $upload
*
* @return string
*/
function saveAppDocument($file, $appUid, $appDocUid, $version = 1, $upload = true)
{
try {
$info = pathinfo($file["name"]);
$extension = ((isset($info["extension"])) ? $info["extension"] : "");
$fileName = $appDocUid . "_" . $version . "." . $extension;
$pathCase = PATH_DATA_SITE . 'files' . PATH_SEP . G::getPathFromUID($appUid) . PATH_SEP;
$response = false;
if ($upload) {
G::uploadFile(
$file["tmp_name"],
$pathCase,
$fileName
);
$response = true;
} else {
G::verifyPath($pathCase, true);
$response = copy($file["tmp_name"], $pathCase . $fileName);
}
return $response;
} catch (Exception $e) {
throw $e;
}
}

View File

@@ -27,6 +27,16 @@ class ValidationUploadedFiles
*/ */
private $fails = []; private $fails = [];
/**
* Return this constant when rule is invalid.
*/
private const INVALID = true;
/**
* Return this constant when rule is valid.
*/
private const VALID = false;
/** /**
* Check if the loaded files comply with the validation rules, add here if you * Check if the loaded files comply with the validation rules, add here if you
* want more validation rules. * want more validation rules.
@@ -280,6 +290,110 @@ class ValidationUploadedFiles
return $validator->validate(); return $validator->validate();
} }
/**
* Check if the loaded files comply with the validation rules, add here if you
* want more validation rules.
* Accept per argument an array or object that contains a "filename" and "path" values.
* The rules are verified in the order in which they have been added.
*
* @param array|object $file
* @return Validator
*/
public function runRulesForPostFilesOfNote($file)
{
$validator = new Validator();
//rule: file exists
$rule = $validator->addRule();
$rule->validate($file, function($file) use($rule) {
$path = isset($file->path) ? $file->path : "";
$filesystem = new Filesystem();
if (!$filesystem->exists($path)) {
$rule->message(G::LoadTranslation('ID_NOT_EXISTS_FILE'));
return self::INVALID;
}
return self::VALID;
})
->status(400)
->log(function($rule) {
/**
* Levels supported by MonologProvider is:
* 100 "DEBUG"
* 200 "INFO"
* 250 "NOTICE"
* 300 "WARNING"
* 400 "ERROR"
* 500 "CRITICAL"
* 550 "ALERT"
* 600 "EMERGENCY"
*/
Bootstrap::registerMonologPhpUploadExecution('phpUpload', $rule->getStatus(), $rule->getMessage(), $rule->getData()->filename);
});
//rule: extensions
$rule = $validator->addRule();
$rule->validate($file, function($file) use($rule) {
$filesystem = new Filesystem();
$extension = strtolower($filesystem->extension($file->filename));
$extensions = [
'pdf', 'gif', 'jpg', 'png', 'doc', 'docx', 'xls', 'xlsx', 'txt', 'mp4', 'mpv', 'mpeg', 'mpg', 'mov'
];
if (!in_array($extension, $extensions)) {
$rule->message(G::LoadTranslation('ID_YOU_UPLOADED_AN_UNSUPPORTED_FILE_EXTENSION'));
return self::INVALID;
}
return self::VALID;
})
->status(400)
->log(function($rule) {
/**
* Levels supported by MonologProvider is:
* 100 "DEBUG"
* 200 "INFO"
* 250 "NOTICE"
* 300 "WARNING"
* 400 "ERROR"
* 500 "CRITICAL"
* 550 "ALERT"
* 600 "EMERGENCY"
*/
Bootstrap::registerMonologPhpUploadExecution('phpUpload', $rule->getStatus(), $rule->getMessage(), $rule->getData()->filename);
});
//rule: file size
$rule = $validator->addRule();
$rule->validate($file, function($file) use($rule) {
$path = isset($file->path) ? $file->path : "";
$filesystem = new Filesystem();
$limitSize = '10M';
$size = $filesystem->size($path);
$phpShorthandByte = new PhpShorthandByte();
$postMaxSizeBytes = $phpShorthandByte->valueToBytes($limitSize);
if ($size > $postMaxSizeBytes) {
$rule->message(G::LoadTranslation('ID_YOUR_FILE_HAS_EXCEEDED', [$limitSize]));
return self::INVALID;
}
return self::VALID;
})
->status(400)
->log(function($rule) {
/**
* Levels supported by MonologProvider is:
* 100 "DEBUG"
* 200 "INFO"
* 250 "NOTICE"
* 300 "WARNING"
* 400 "ERROR"
* 500 "CRITICAL"
* 550 "ALERT"
* 600 "EMERGENCY"
*/
Bootstrap::registerMonologPhpUploadExecution('phpUpload', $rule->getStatus(), $rule->getMessage(), $rule->getData()->filename);
});
return $validator->validate();
}
/** /**
* Get the first error and call the argument function. * Get the first error and call the argument function.
* *

View File

@@ -4,8 +4,9 @@ var storeNotes;
var appUid; var appUid;
var title; var title;
var summaryWindowOpened = false; var summaryWindowOpened = false;
var toolTipChkSendMail; var toolTipChkSendMail;
var caseNotesForm;
var uploadItemsSize = 5;
function closeCaseNotesWindow(){ function closeCaseNotesWindow(){
if(Ext.get("caseNotesWindowPanel")){ if(Ext.get("caseNotesWindowPanel")){
@@ -39,7 +40,7 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
url: "../appProxy/getNotesList?appUid=" + appUid + "&delIndex=" + delIndex + "&pro=" + proUid + "&tas=" + taskUid, url: "../appProxy/getNotesList?appUid=" + appUid + "&delIndex=" + delIndex + "&pro=" + proUid + "&tas=" + taskUid,
root: 'notes', root: 'notes',
totalProperty: 'totalCount', totalProperty: 'totalCount',
fields: ['USR_USERNAME','USR_FIRSTNAME','USR_LASTNAME','USR_FULL_NAME','NOTE_DATE','NOTE_CONTENT', 'USR_UID', 'user'], fields: ['USR_USERNAME','USR_FIRSTNAME','USR_LASTNAME','USR_FULL_NAME','NOTE_DATE','NOTE_CONTENT', 'USR_UID','USR_EMAIL', 'attachments', 'user'],
baseParams:{ baseParams:{
start:0, start:0,
limit:startRecord+loadSize limit:startRecord+loadSize
@@ -117,7 +118,8 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
'<td class="x-cnotes-label"><img border="0" src="../users/users_ViewPhotoGrid?pUID={USR_UID}" width="40" height="40"/></td>' + '<td class="x-cnotes-label"><img border="0" src="../users/users_ViewPhotoGrid?pUID={USR_UID}" width="40" height="40"/></td>' +
'<td class="x-cnotes-name">'+ '<td class="x-cnotes-name">'+
'<p class="user-from">{user}</p>'+ '<p class="user-from">{user}</p>'+
'<p style="width: 370px; overflow-x:auto; height: 80px;", class="x-editable x-message">{NOTE_CONTENT}</p> '+ '<div style="width: 370px; overflow-x:auto; height: 80px;" class="x-editable x-message"><p>{NOTE_CONTENT}</p>'+
'<ul class="nav_list"><li>{files}</li></ul></div>' +
'<p class="x-editable"><small>'+_('ID_POSTED_AT')+'<i> {NOTE_DATE}</i></small></p>'+ '<p class="x-editable"><small>'+_('ID_POSTED_AT')+'<i> {NOTE_DATE}</i></small></p>'+
'</td>' + '</td>' +
'</tr>' + '</tr>' +
@@ -126,15 +128,16 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
itemSelector: 'div.x-cnotes-source', itemSelector: 'div.x-cnotes-source',
overClass: 'x-cnotes-over', overClass: 'x-cnotes-over',
selectedClass: 'x-cnotes-selected', selectedClass: 'x-cnotes-selected',
singleSelect: true, singleSelect: false,
prepareData: function(data){ prepareData: function(data){
//data.shortName = Ext.util.Format.ellipsis(data.name, 15); var i;
//data.sizeString = Ext.util.Format.fileSize(data.size); data.user = _FNF(data.USR_EMAIL, data.USR_FIRSTNAME, data.USR_LASTNAME);
//data.dateString = data.lastmod.format("m/d/Y g:i a");
data.user = _FNF(data.USR_USERNAME, data.USR_FIRSTNAME, data.USR_LASTNAME);
data.NOTE_CONTENT = data.NOTE_CONTENT.replace(/\n/g,' <br/>'); data.NOTE_CONTENT = data.NOTE_CONTENT.replace(/\n/g,' <br/>');
data.files = "";
for (i = 0; i < data.attachments.length; i += 1) {
data.files += "<a href='" + data.attachments[i].LINK + "' title='" + data.attachments[i].APP_DOC_FILENAME + "'>" + data.attachments[i].APP_DOC_FILENAME + "</a>";
}
return data; return data;
}, },
@@ -171,12 +174,101 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
} }
] ]
}); });
/**
* Factory to create upload files field dinamically
* @return {Object}
*/
function uploadFileFactory () {
return {
xtype: 'fileuploadfield',
emptyText: '',
fieldLabel: _('ID_ATTACH_FILE'),
buttonText: _('ID_SELECT_FILE'),
name: 'filesToUpload[]',
allowBlank: true,
width : '70%',
validator: function (filePath) {
var flag = false;
if (caseNotesWindow.isVisible() === false || filePath === "") {
return true;
}
filePath = filePath.replace(/^\s|\s$/g, ""); //trims string
if (filePath.match(/([^\/\\]+)\.(pdf|gif|jpg|png|doc|docx|xls|xlsx|txt|mp4|mpv|mpeg|mpg|mov)$/i)) {
flag = true;
} else {
messageError = _('ID_ERROR_UPLOADING_IMAGE_TYPE');
PMExt.notify(_('ID_ERROR'), messageError);
flag = false;
this.setRawValue(null);
}
return flag;
}
};
};
// Cases notes form to insert coments and attach files
caseNotesForm = new Ext.FormPanel({
width: 462,
anchor: '100%',
baseCls: 'x-plain',
fileUpload: true,
items:
[
{
text : _('ID_NEW_NOTE'),
xtype : 'textarea',
id : 'caseNoteText',
name : 'caseNoteText',
width : '98%',
height : 100,
hideLabel: true,
maxLengthText : 1500,
allowBlank :false,
selectOnFocus :true,
enableKeyEvents: true,
listeners : {
scope : this,
keyup : updateTextCtr,
keydown: updateTextCtr,
'change': function(field, newVal, oldVal) {
var textAreaValue = newVal.replace(/^\s+/,'').replace(/\s+$/,'');
field.setValue(textAreaValue.trim());
Ext.getCmp('caseNoteText').focus(false, 200);
}
}
}
],
buttons:
[
{
text: _('ID_ADD_FILE'),
id: 'btnAddFile',
type: 'button',
handler: function () {
var uploadFields = caseNotesForm.findByType('fileuploadfield');
if (uploadFields.length >= 1 && uploadFields.length < uploadItemsSize) {
if (uploadFields[uploadFields.length - 1].getValue() !== "") {
caseNotesForm.add(uploadFileFactory());
caseNotesForm.doLayout();
caseNotesWindow.doLayout();
} else {
messageError = _('ID_PLEASE_SELECT_FILES_TO_UPLOAD');
PMExt.notify(_('ID_ERROR'), messageError);
}
}
if (uploadFields.length === uploadItemsSize - 1) {
this.setDisabled(true);
}
}
}
]
});
caseNotesWindow = new Ext.Window({ caseNotesWindow = new Ext.Window({
title: _('ID_CASES_NOTES'), //Title of the Window title: _('ID_CASES_NOTES'), //Title of the Window
id: 'caseNotesWindowPanel', //ID of the Window Panel id: 'caseNotesWindowPanel', //ID of the Window Panel
width: 480, //Width of the Window width: 480, //Width of the Window
resizable: true, //Resize of the Window, if false - it cannot be resized resizable: false, //Resize of the Window, if false - it cannot be resized
closable: true, //Hide close button of the Window closable: true, //Hide close button of the Window
modal: modalSw, //When modal:true it make the window modal and mask everything behind it when displayed modal: modalSw, //When modal:true it make the window modal and mask everything behind it when displayed
//iconCls: 'ICON_CASES_NOTES', //iconCls: 'ICON_CASES_NOTES',
@@ -203,33 +295,7 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
} }
} }
], ],
tbar:[ tbar:[caseNotesForm],
new Ext.form.TextArea({
text : _('ID_NEW_NOTE'),
xtype : 'textarea',
id : 'caseNoteText',
name : 'caseNoteText',
width : 440,
grow : true,
height : 100,
growMin: 100,
growMax: 80,
maxLengthText : 1500,
allowBlank :false,
selectOnFocus :true,
enableKeyEvents: true,
listeners : {
scope : this,
keyup : updateTextCtr,
keydown: updateTextCtr,
'change': function(field, newVal, oldVal){
var textAreaValue = newVal.replace(/^\s+/,'').replace(/\s+$/,'');
field.setValue(textAreaValue.trim());
Ext.getCmp('caseNoteText').focus(false, 200);
}
}
})
],
rowtbar: [ rowtbar: [
[ [
{ {
@@ -281,6 +347,9 @@ function openCaseNotesWindow(appUid1, delIndex, modalSw, appTitle, proUid, taskU
this.loadMask = new Ext.LoadMask(this.body, { this.loadMask = new Ext.LoadMask(this.body, {
msg:_('ID_LOADING') msg:_('ID_LOADING')
}); });
caseNotesForm.add(uploadFileFactory());
caseNotesForm.doLayout();
caseNotesWindow.doLayout();
}, },
close:function(){ close:function(){
if (typeof(parent.setFlag) != 'undefined') { if (typeof(parent.setFlag) != 'undefined') {
@@ -320,6 +389,7 @@ function updateTextCtr(body, event) {
function newNoteHandler() function newNoteHandler()
{ {
var i;
newNoteAreaActive = newNoteAreaActive ? false : true; newNoteAreaActive = newNoteAreaActive ? false : true;
if (newNoteAreaActive) { if (newNoteAreaActive) {
Ext.getCmp('addCancelBtn').setText(''); Ext.getCmp('addCancelBtn').setText('');
@@ -349,6 +419,14 @@ function newNoteHandler()
document.getElementById('countChar').style.display = 'block'; document.getElementById('countChar').style.display = 'block';
Ext.getCmp('caseNoteText').focus(); Ext.getCmp('caseNoteText').focus();
Ext.getCmp('caseNoteText').reset(); Ext.getCmp('caseNoteText').reset();
uploadFields = caseNotesForm.findByType('fileuploadfield');
// clean the first upload field
uploadFields[0].setRawValue(null);
for (i = 1; i < uploadFields.length; i += 1) {
caseNotesForm.remove(uploadFields[i]);
}
caseNotesForm.doLayout();
Ext.getCmp('btnAddFile').setDisabled(false);
document.getElementById('countChar').innerHTML = '1500'; document.getElementById('countChar').innerHTML = '1500';
caseNotesWindow.doLayout(); caseNotesWindow.doLayout();
} }
@@ -356,81 +434,76 @@ function newNoteHandler()
caseNotesWindow.doLayout(); caseNotesWindow.doLayout();
} }
function sendNote() function sendNote(){
{
var noteText = Ext.getCmp('caseNoteText').getValue(); var noteText = Ext.getCmp('caseNoteText').getValue();
if (noteText == "") { if (noteText == "") {
return false; return false;
} }
newNoteHandler(); newNoteHandler();
Ext.getCmp('caseNoteText').focus(); Ext.getCmp('caseNoteText').focus();
Ext.getCmp('caseNoteText').reset(); Ext.getCmp('caseNoteText').reset();
Ext.getCmp('caseNoteText').setDisabled(true); Ext.getCmp('caseNoteText').setDisabled(true);
Ext.getCmp('sendBtn').setDisabled(true); Ext.getCmp('sendBtn').setDisabled(true);
Ext.getCmp('addCancelBtn').setDisabled(true); Ext.getCmp('addCancelBtn').setDisabled(true);
statusBarMessage( _('ID_CASES_NOTE_POSTING'), true); statusBarMessage( _('ID_CASES_NOTE_POSTING'), true);
Ext.Ajax.request({
url : '../appProxy/postNote' , caseNotesForm.getForm().submit({
params : { clientValidation: true,
appUid: appUid, url: '../appProxy/postNote',
noteText: noteText, params: {
swSendMail: (Ext.getCmp("chkSendMail").checked == true)? 1 : 0 appUid: appUid,
}, noteText: noteText,
success: function ( result, request ) { swSendMail: (Ext.getCmp("chkSendMail").checked === true) ? 1 : 0
var data = Ext.util.JSON.decode(result.responseText); },
if(data.success=="success"){ success: function ( result, request ) {
Ext.getCmp('caseNoteText').setDisabled(false); var data = Ext.util.JSON.decode(request.response.responseText);
Ext.getCmp('sendBtn').setDisabled(false); if(data.success=="success"){
Ext.getCmp('addCancelBtn').setDisabled(false); Ext.getCmp('caseNoteText').setDisabled(false);
if (data.message != '') { Ext.getCmp('sendBtn').setDisabled(false);
Ext.Msg.show({ Ext.getCmp('addCancelBtn').setDisabled(false);
if (data.message != '') {
Ext.Msg.show({
title : _('ID_CASES_NOTE_POST_ERROR'),
msg : data.message,
icon : Ext.MessageBox.WARNING,
buttons : Ext.Msg.OK,
fn : function(btn) {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true);
storeNotes.load();
}
});
} else {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true);
storeNotes.load();
}
} else if (data.lostSession) {
Ext.Msg.show({
title : _('ID_CASES_NOTE_POST_ERROR'), title : _('ID_CASES_NOTE_POST_ERROR'),
msg : data.message, msg : data.message,
icon : Ext.MessageBox.WARNING, icon : Ext.MessageBox.ERROR,
buttons : Ext.Msg.OK, buttons : Ext.Msg.OK,
fn : function(btn) { fn : function(btn) {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true); try {
storeNotes.load(); prnt = parent.parent;
top.location = top.location;
} catch (err) {
parent.location = parent.location;
}
} }
}); });
} else { } else {
statusBarMessage( _('ID_CASES_NOTE_POST_SUCCESS'), false,true); Ext.getCmp('caseNoteText').setDisabled(false);
storeNotes.load(); Ext.getCmp('sendBtn').setDisabled(false);
} Ext.getCmp('addCancelBtn').setDisabled(false);
} else if (data.lostSession) { statusBarMessage( _('ID_CASES_NOTE_POST_ERROR'), false,false);
Ext.Msg.show({ Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_ERROR'), data.message);
title : _('ID_CASES_NOTE_POST_ERROR'),
msg : data.message,
icon : Ext.MessageBox.ERROR,
buttons : Ext.Msg.OK,
fn : function(btn) {
try
{
prnt = parent.parent;
top.location = top.location;
}
catch (err)
{
parent.location = parent.location;
}
}
});
} else {
Ext.getCmp('caseNoteText').setDisabled(false);
Ext.getCmp('sendBtn').setDisabled(false);
Ext.getCmp('addCancelBtn').setDisabled(false);
statusBarMessage( _('ID_CASES_NOTE_POST_ERROR'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_ERROR'), data.message);
}
},
failure: function ( result, request) {
statusBarMessage( _('ID_CASES_NOTE_POST_FAILED'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_FAILED'), result.responseText);
} }
},
failure: function ( result, request) {
statusBarMessage( _('ID_CASES_NOTE_POST_FAILED'), false,false);
Ext.MessageBox.alert(_('ID_CASES_NOTE_POST_FAILED'), result.responseText);
}
}); });
} }

View File

@@ -974,6 +974,7 @@ if (!defined('EXECUTE_BY_CRON')) {
$noLoginFiles[] = 'cases_SaveData'; $noLoginFiles[] = 'cases_SaveData';
$noLoginFiles[] = 'cases_Derivate'; $noLoginFiles[] = 'cases_Derivate';
$noLoginFiles[] = 'cases_NextStep'; $noLoginFiles[] = 'cases_NextStep';
$noLoginFiles[] = 'casesShowCaseNotes';
$noLoginFiles[] = 'genericAjax'; $noLoginFiles[] = 'genericAjax';
$noLoginFiles[] = 'casesSaveDataView'; $noLoginFiles[] = 'casesSaveDataView';
$noLoginFiles[] = 'propelTableAjax'; $noLoginFiles[] = 'propelTableAjax';