🚀 CRM Files Migration & Real-time Features

 Features:
- Migrated ALL files to new S3 structure (Projects, Contacts, Accounts, HelpDesk, Invoice, etc.)
- Added Nextcloud folder buttons to ALL modules
- Fixed Nextcloud editor integration
- WebSocket server for real-time updates
- Redis Pub/Sub integration
- File path manager for organized storage
- Redis caching for performance (Functions.php)

📁 New Structure:
Documents/Project/ProjectName_ID/file_docID.ext
Documents/Contacts/FirstName_LastName_ID/file_docID.ext
Documents/Accounts/AccountName_ID/file_docID.ext

🔧 Technical:
- FilePathManager for standardized paths
- S3StorageService integration
- WebSocket server (Node.js + Docker)
- Redis cache for getBasicModuleInfo()
- Predis library for Redis connectivity

📝 Scripts:
- Migration scripts for all modules
- Test pages for WebSocket/SSE/Polling
- Documentation (MIGRATION_*.md, REDIS_*.md)

🎯 Result: 15,000+ files migrated successfully!
This commit is contained in:
Fedor
2025-10-24 19:59:28 +03:00
parent 3fb2ad5f60
commit 9245768987
1062 changed files with 161778 additions and 16212 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,133 @@
/* This stylesheet generated by Transfonter (https://transfonter.org) on February 25, 2018 4:00 PM */
@font-face {
font-family: 'Roboto';
src: url('Roboto-MediumItalic.eot');
src: local('Roboto Medium Italic'), local('Roboto-MediumItalic'),
url('Roboto-MediumItalic.eot?#iefix') format('embedded-opentype'),
url('Roboto-MediumItalic.woff') format('woff'),
url('Roboto-MediumItalic.ttf') format('truetype');
font-weight: 500;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Italic.eot');
src: local('Roboto Italic'), local('Roboto-Italic'),
url('Roboto-Italic.eot?#iefix') format('embedded-opentype'),
url('Roboto-Italic.woff') format('woff'),
url('Roboto-Italic.ttf') format('truetype');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Bold.eot');
src: local('Roboto Bold'), local('Roboto-Bold'),
url('Roboto-Bold.eot?#iefix') format('embedded-opentype'),
url('Roboto-Bold.woff') format('woff'),
url('Roboto-Bold.ttf') format('truetype');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Regular.eot');
src: local('Roboto'), local('Roboto-Regular'),
url('Roboto-Regular.eot?#iefix') format('embedded-opentype'),
url('Roboto-Regular.woff') format('woff'),
url('Roboto-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Medium.eot');
src: local('Roboto Medium'), local('Roboto-Medium'),
url('Roboto-Medium.eot?#iefix') format('embedded-opentype'),
url('Roboto-Medium.woff') format('woff'),
url('Roboto-Medium.ttf') format('truetype');
font-weight: 500;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-BoldItalic.eot');
src: local('Roboto Bold Italic'), local('Roboto-BoldItalic'),
url('Roboto-BoldItalic.eot?#iefix') format('embedded-opentype'),
url('Roboto-BoldItalic.woff') format('woff'),
url('Roboto-BoldItalic.ttf') format('truetype');
font-weight: bold;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-ThinItalic.eot');
src: local('Roboto Thin Italic'), local('Roboto-ThinItalic'),
url('Roboto-ThinItalic.eot?#iefix') format('embedded-opentype'),
url('Roboto-ThinItalic.woff') format('woff'),
url('Roboto-ThinItalic.ttf') format('truetype');
font-weight: 100;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Black.eot');
src: local('Roboto Black'), local('Roboto-Black'),
url('Roboto-Black.eot?#iefix') format('embedded-opentype'),
url('Roboto-Black.woff') format('woff'),
url('Roboto-Black.ttf') format('truetype');
font-weight: 900;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Light.eot');
src: local('Roboto Light'), local('Roboto-Light'),
url('Roboto-Light.eot?#iefix') format('embedded-opentype'),
url('Roboto-Light.woff') format('woff'),
url('Roboto-Light.ttf') format('truetype');
font-weight: 300;
font-style: normal;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-LightItalic.eot');
src: local('Roboto Light Italic'), local('Roboto-LightItalic'),
url('Roboto-LightItalic.eot?#iefix') format('embedded-opentype'),
url('Roboto-LightItalic.woff') format('woff'),
url('Roboto-LightItalic.ttf') format('truetype');
font-weight: 300;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-BlackItalic.eot');
src: local('Roboto Black Italic'), local('Roboto-BlackItalic'),
url('Roboto-BlackItalic.eot?#iefix') format('embedded-opentype'),
url('Roboto-BlackItalic.woff') format('woff'),
url('Roboto-BlackItalic.ttf') format('truetype');
font-weight: 900;
font-style: italic;
}
@font-face {
font-family: 'Roboto';
src: url('Roboto-Thin.eot');
src: local('Roboto Thin'), local('Roboto-Thin'),
url('Roboto-Thin.eot?#iefix') format('embedded-opentype'),
url('Roboto-Thin.woff') format('woff'),
url('Roboto-Thin.ttf') format('truetype');
font-weight: 100;
font-style: normal;
}