Compare commits
59 Commits
production
...
production
| Author | SHA1 | Date | |
|---|---|---|---|
| ec0aba426c | |||
| 6a30d5a004 | |||
| c68347419a | |||
| a1c8efcbb7 | |||
| 3c115c19cb | |||
| 9b82a799e3 | |||
| fa1405ea67 | |||
| 86e872e14d | |||
| 8d382deb82 | |||
| 54f80a72f4 | |||
| ebd98b58d2 | |||
| 3ee3d29866 | |||
| 398f411773 | |||
|
|
63c9740576 | ||
|
|
58097e38e5 | ||
| bd62810b7b | |||
| 198a6c9c1b | |||
| 3ad8f287da | |||
| c97b5dfab3 | |||
| 82e487cece | |||
| 409f0857de | |||
| bdff3b0331 | |||
|
|
181c5d2e79 | ||
|
|
3a8eb35681 | ||
|
|
a2ca034507 | ||
|
|
22c4c1d8eb | ||
|
|
049efcfe2c | ||
|
|
7422890c87 | ||
| b8ae0f1e48 | |||
|
|
3321ec6966 | ||
|
|
e6d7cd329c | ||
| b2ff0cc6bd | |||
|
|
486357834b | ||
|
|
7c4fd6b3eb | ||
|
|
4569c4e8c5 | ||
| 2faa2bfd87 | |||
| 7d8b61cb1d | |||
|
|
4dd8b224e3 | ||
|
|
8f8f1965d8 | ||
|
|
d744c7c9da | ||
|
|
9bd15afb8c | ||
|
|
1f762c759d | ||
|
|
b564001471 | ||
|
|
101af3951e | ||
|
|
e4717ec95a | ||
|
|
2950fed400 | ||
|
|
aa71d04f17 | ||
|
|
de0ed31ccb | ||
|
|
de5023e283 | ||
|
|
9a7f44f0c0 | ||
|
|
39f7cb6247 | ||
|
|
fd2754c9eb | ||
|
|
69eea552fb | ||
|
|
4db0935d71 | ||
|
|
c144fbed37 | ||
|
|
f46dcf75da | ||
|
|
5f9a3a9c24 | ||
|
|
e1816f8590 | ||
|
|
9f8c3dc8ec |
53
.gitignore
vendored
53
.gitignore
vendored
@ -1,11 +1,46 @@
|
|||||||
*
|
# Dépendances (tous niveaux)
|
||||||
|
**/node_modules/
|
||||||
|
**/vendor/
|
||||||
|
**/bower_components/
|
||||||
|
|
||||||
|
# Artifacts de build / caches (tous niveaux)
|
||||||
|
**/dist/
|
||||||
|
**/build/
|
||||||
|
**/.cache/
|
||||||
|
**/.parcel-cache/
|
||||||
|
**/.vite/
|
||||||
|
**/coverage/
|
||||||
|
**/.next/
|
||||||
|
**/.nuxt/
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
|
||||||
|
# Fichiers d'environnement
|
||||||
|
.env
|
||||||
|
.env.*.local
|
||||||
|
docker-compose.yml
|
||||||
|
|
||||||
|
# Fichiers système / IDE
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
.idea/
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
# Dumps & fichiers sensibles courants
|
||||||
*.sql
|
*.sql
|
||||||
|
|
||||||
!.gitignore
|
# Spécifiques Nextcloud (si jamais présents dans le repo)
|
||||||
|
data/
|
||||||
!calendar/
|
config/
|
||||||
!gestion/
|
themes/
|
||||||
!Jenkinsfile
|
apps-external/
|
||||||
|
.updater-*
|
||||||
!calendar/**
|
occ
|
||||||
!gestion/**
|
autotest.sh
|
||||||
|
tests/
|
||||||
|
coverage/
|
||||||
|
|||||||
9
Jenkinsfile
vendored
9
Jenkinsfile
vendored
@ -9,5 +9,14 @@ pipeline {
|
|||||||
sudo su jenkins -c "git stash && git pull origin staging" '''
|
sudo su jenkins -c "git stash && git pull origin staging" '''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage ("deploy to prod dv-thanato") {
|
||||||
|
when { branch 'production-dv-thanato' }
|
||||||
|
agent { label 'apache && dev'}
|
||||||
|
steps {
|
||||||
|
input 'Do you approve deployment?'
|
||||||
|
sh ''' ssh -i ${SOTTYE_DVTHANATO_SSHKEY} ${SOTTYE_DVTHANATO_SSHUSER}@${SOTTYE_DVTHANATO_IPSERVER} "cd ${SOTTYE_DVTHANATO_PATH} && git pull origin production-dv-thanato" '''
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'routes' => [
|
'routes' => [
|
||||||
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
|
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
|
||||||
@ -97,6 +98,7 @@ return [
|
|||||||
|
|
||||||
// generation attestation pacemaker, rapport de soins, de bijoux
|
// generation attestation pacemaker, rapport de soins, de bijoux
|
||||||
['name' => 'page#saveAttestationPacemaker', 'url' => '/saveAttestationPacemaker', 'verb' => 'POST'],
|
['name' => 'page#saveAttestationPacemaker', 'url' => '/saveAttestationPacemaker', 'verb' => 'POST'],
|
||||||
|
['name' => 'page#saveAttestationAbsentPacemaker', 'url' => '/saveAttestationAbsentPacemaker', 'verb' => 'POST'],
|
||||||
['name' => 'page#saveRapportSoin', 'url' => '/saveRapportSoin', 'verb' => 'POST'],
|
['name' => 'page#saveRapportSoin', 'url' => '/saveRapportSoin', 'verb' => 'POST'],
|
||||||
['name' => 'page#saveRapportBijoux', 'url' => '/saveRapportBijoux', 'verb' => 'POST'],
|
['name' => 'page#saveRapportBijoux', 'url' => '/saveRapportBijoux', 'verb' => 'POST'],
|
||||||
|
|
||||||
@ -181,5 +183,7 @@ return [
|
|||||||
//invoice controller
|
//invoice controller
|
||||||
['name' => 'invoice#sendInvoicePdfViaMail', 'url' => '/invoice/{factureId}/sendInvoicePdfViaMail', 'verb' => 'POST'],
|
['name' => 'invoice#sendInvoicePdfViaMail', 'url' => '/invoice/{factureId}/sendInvoicePdfViaMail', 'verb' => 'POST'],
|
||||||
['name' => 'invoice#getInvoicePdfContent', 'url' => '/invoice/{factureId}/getInvoicePdfContent', 'verb' => 'GET'],
|
['name' => 'invoice#getInvoicePdfContent', 'url' => '/invoice/{factureId}/getInvoicePdfContent', 'verb' => 'GET'],
|
||||||
|
|
||||||
|
['name' => 'page#apiReloadFec', 'url' => '/apiReloadFec', 'verb' => 'POST' ],
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
"symfony/framework-bundle": "^5.4"
|
"symfony/framework-bundle": "^5.4"
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"setasign/fpdf": "^1.8"
|
"setasign/fpdf": "^1.8",
|
||||||
|
"dompdf/dompdf": "^3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
292
gestion/composer.lock
generated
292
gestion/composer.lock
generated
@ -4,8 +4,296 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "79912f1c84e373fcd7778fb095176063",
|
"content-hash": "2cbec79cf4e2f6e464d23e0fd4df0b09",
|
||||||
"packages": [
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "dompdf/dompdf",
|
||||||
|
"version": "v3.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dompdf/dompdf.git",
|
||||||
|
"reference": "a51bd7a063a65499446919286fb18b518177155a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/dompdf/dompdf/zipball/a51bd7a063a65499446919286fb18b518177155a",
|
||||||
|
"reference": "a51bd7a063a65499446919286fb18b518177155a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"dompdf/php-font-lib": "^1.0.0",
|
||||||
|
"dompdf/php-svg-lib": "^1.0.0",
|
||||||
|
"ext-dom": "*",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"masterminds/html5": "^2.0",
|
||||||
|
"php": "^7.1 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-gd": "*",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-zip": "*",
|
||||||
|
"mockery/mockery": "^1.3",
|
||||||
|
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5",
|
||||||
|
"symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gd": "Needed to process images",
|
||||||
|
"ext-gmagick": "Improves image processing performance",
|
||||||
|
"ext-imagick": "Improves image processing performance",
|
||||||
|
"ext-zlib": "Needed for pdf stream compression"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Dompdf\\": "src/"
|
||||||
|
},
|
||||||
|
"classmap": [
|
||||||
|
"lib/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-2.1"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The Dompdf Community",
|
||||||
|
"homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
|
||||||
|
"homepage": "https://github.com/dompdf/dompdf",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/dompdf/dompdf/issues",
|
||||||
|
"source": "https://github.com/dompdf/dompdf/tree/v3.1.0"
|
||||||
|
},
|
||||||
|
"time": "2025-01-15T14:09:04+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dompdf/php-font-lib",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dompdf/php-font-lib.git",
|
||||||
|
"reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
|
||||||
|
"reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"php": "^7.1 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"FontLib\\": "src/FontLib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-2.1-or-later"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The FontLib Community",
|
||||||
|
"homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A library to read, parse, export and make subsets of different types of font files.",
|
||||||
|
"homepage": "https://github.com/dompdf/php-font-lib",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/dompdf/php-font-lib/issues",
|
||||||
|
"source": "https://github.com/dompdf/php-font-lib/tree/1.0.1"
|
||||||
|
},
|
||||||
|
"time": "2024-12-02T14:37:59+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dompdf/php-svg-lib",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dompdf/php-svg-lib.git",
|
||||||
|
"reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
|
||||||
|
"reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"php": "^7.1 || ^8.0",
|
||||||
|
"sabberworm/php-css-parser": "^8.4"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Svg\\": "src/Svg"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-3.0-or-later"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The SvgLib Community",
|
||||||
|
"homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A library to read, parse and export to PDF SVG files.",
|
||||||
|
"homepage": "https://github.com/dompdf/php-svg-lib",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/dompdf/php-svg-lib/issues",
|
||||||
|
"source": "https://github.com/dompdf/php-svg-lib/tree/1.0.0"
|
||||||
|
},
|
||||||
|
"time": "2024-04-29T13:26:35+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "masterminds/html5",
|
||||||
|
"version": "2.10.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/Masterminds/html5-php.git",
|
||||||
|
"reference": "fcf91eb64359852f00d921887b219479b4f21251"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251",
|
||||||
|
"reference": "fcf91eb64359852f00d921887b219479b4f21251",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-dom": "*",
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Masterminds\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Matt Butcher",
|
||||||
|
"email": "technosophos@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Matt Farina",
|
||||||
|
"email": "matt@mattfarina.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Asmir Mustafic",
|
||||||
|
"email": "goetas@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "An HTML5 parser and serializer.",
|
||||||
|
"homepage": "http://masterminds.github.io/html5-php",
|
||||||
|
"keywords": [
|
||||||
|
"HTML5",
|
||||||
|
"dom",
|
||||||
|
"html",
|
||||||
|
"parser",
|
||||||
|
"querypath",
|
||||||
|
"serializer",
|
||||||
|
"xml"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/Masterminds/html5-php/issues",
|
||||||
|
"source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
|
||||||
|
},
|
||||||
|
"time": "2025-07-25T09:04:22+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "sabberworm/php-css-parser",
|
||||||
|
"version": "v8.9.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
|
||||||
|
"reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d8e916507b88e389e26d4ab03c904a082aa66bb9",
|
||||||
|
"reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-iconv": "*",
|
||||||
|
"php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41",
|
||||||
|
"rawr/cross-data-providers": "^2.0.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-mbstring": "for parsing UTF-8 CSS"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "9.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Sabberworm\\CSS\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Raphael Schweikert"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Oliver Klee",
|
||||||
|
"email": "github@oliverklee.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jake Hotson",
|
||||||
|
"email": "jake.github@qzdesign.co.uk"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Parser for CSS Files written in PHP",
|
||||||
|
"homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
|
||||||
|
"keywords": [
|
||||||
|
"css",
|
||||||
|
"parser",
|
||||||
|
"stylesheet"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
|
||||||
|
"source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.9.0"
|
||||||
|
},
|
||||||
|
"time": "2025-07-11T13:20:48+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "setasign/fpdf",
|
"name": "setasign/fpdf",
|
||||||
"version": "1.8.5",
|
"version": "1.8.5",
|
||||||
@ -4782,5 +5070,5 @@
|
|||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": [],
|
"platform": [],
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.3.0"
|
"plugin-api-version": "2.6.0"
|
||||||
}
|
}
|
||||||
|
|||||||
1
gestion/js/943.app.js
Normal file
1
gestion/js/943.app.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -8,7 +8,7 @@ abstract class BddConstant
|
|||||||
const DEFAULT_TABLE_PREFIX = "*PREFIX*";
|
const DEFAULT_TABLE_PREFIX = "*PREFIX*";
|
||||||
const DEFAULT_CLIENT_GROUP_NAME = "Nom du groupe";
|
const DEFAULT_CLIENT_GROUP_NAME = "Nom du groupe";
|
||||||
const DEFAULT_ADMIN_ID_NEXTCLOUD = 'admin';
|
const DEFAULT_ADMIN_ID_NEXTCLOUD = 'admin';
|
||||||
const DEFAULT_ADMIN_APP_ID_NEXTCLOUD = "Johann";
|
const DEFAULT_ADMIN_APP_ID_NEXTCLOUD = "Vanessa";
|
||||||
|
|
||||||
const ISLEAVEPROPERTYONVCALENDAR = "ISLEAVE";
|
const ISLEAVEPROPERTYONVCALENDAR = "ISLEAVE";
|
||||||
|
|
||||||
|
|||||||
@ -109,7 +109,8 @@ class InvoiceController extends Controller
|
|||||||
$message->attach($content);
|
$message->attach($content);
|
||||||
$message->setSubject("Facture");
|
$message->setSubject("Facture");
|
||||||
|
|
||||||
$signature = $this->mailerService->getFooterContent();
|
$signature = $this->mailerService->getFooterContent( $this->getUserNameForEmailSignature());
|
||||||
|
|
||||||
|
|
||||||
$message->setHtmlBody(
|
$message->setHtmlBody(
|
||||||
"<p>Bonjour.</p>".
|
"<p>Bonjour.</p>".
|
||||||
@ -128,4 +129,10 @@ class InvoiceController extends Controller
|
|||||||
}
|
}
|
||||||
return new DataResponse("E-mail envoyé avec succès à ".$email.".", 200, ['Content-Type' => 'application/json']);
|
return new DataResponse("E-mail envoyé avec succès à ".$email.".", 200, ['Content-Type' => 'application/json']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getUserNameForEmailSignature (){
|
||||||
|
$configs = json_decode($this->gestionRepository->getConfiguration(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD));
|
||||||
|
$currentConfig = $configs[0];
|
||||||
|
return $currentConfig->nom . " " . $currentConfig->prenom;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
7
gestion/lib/Exception/TemplateException.php
Normal file
7
gestion/lib/Exception/TemplateException.php
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace OCA\Gestion\Exception;
|
||||||
|
|
||||||
|
class TemplateException extends \Exception
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -17,4 +17,9 @@ class PriceHelpers
|
|||||||
return number_format($price,2,'.','');
|
return number_format($price,2,'.','');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function formatDecimalPriceWithCurrency($price,$currency = '€')
|
||||||
|
{
|
||||||
|
return self::formatDecimalPrice($price) . $currency;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
52
gestion/lib/Migration/Version20001Date20250812120000.php
Normal file
52
gestion/lib/Migration/Version20001Date20250812120000.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace OCA\Gestion\Migration;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use OCP\DB\ISchemaWrapper;
|
||||||
|
use OCP\Migration\IOutput;
|
||||||
|
use OCP\Migration\SimpleMigrationStep;
|
||||||
|
use OCP\IDBConnection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migration pour ajouter le champ is_tva à la table oc_gestion_client
|
||||||
|
*/
|
||||||
|
class Version20001Date20250812120000 extends SimpleMigrationStep
|
||||||
|
{
|
||||||
|
private IDbConnection $db;
|
||||||
|
public function __construct(IDbConnection $db)
|
||||||
|
{
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param IOutput $output
|
||||||
|
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
|
||||||
|
* @param array $options
|
||||||
|
* @return null|ISchemaWrapper
|
||||||
|
*/
|
||||||
|
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper
|
||||||
|
{
|
||||||
|
/** @var ISchemaWrapper $schema */
|
||||||
|
$schema = $schemaClosure();
|
||||||
|
$tableprefix = "gestion_";
|
||||||
|
// Vérifier si la table existe
|
||||||
|
if ($schema->hasTable($tableprefix.'client')) {
|
||||||
|
$table = $schema->getTable($tableprefix.'client');
|
||||||
|
// Ajouter le champ is_tva s'il n'existe pas déjà
|
||||||
|
if (!$table->hasColumn('is_tva')) {
|
||||||
|
$table->addColumn('is_tva', 'smallint', [
|
||||||
|
'notnull' => true,
|
||||||
|
'default' => 1,
|
||||||
|
'comment' => 'Indique si le client est assujetti à la TVA (1=oui, 0=non)',
|
||||||
|
'unsigned' => true,
|
||||||
|
'length' => 1
|
||||||
|
]);
|
||||||
|
$output->info('Champ is_tva ajouté à la table gestion_client');
|
||||||
|
return $schema;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -29,12 +29,14 @@ namespace OCA\Gestion\Service\Certificate;
|
|||||||
use DateTime;
|
use DateTime;
|
||||||
use DateTimeImmutable;
|
use DateTimeImmutable;
|
||||||
use OCA\Gestion\Db\Bdd;
|
use OCA\Gestion\Db\Bdd;
|
||||||
|
use OCP\Files\IRootFolder;
|
||||||
use OCA\Gestion\Helpers\DateHelpers;
|
use OCA\Gestion\Helpers\DateHelpers;
|
||||||
use OCA\Gestion\Service\Certificate\PdfHandler\CareCertificatePdfHandler;
|
use OCA\Gestion\Service\Certificate\PdfHandler\CareCertificatePdfHandler;
|
||||||
use OCA\Gestion\Service\Certificate\PdfHandler\PacemakerCertificatePdfHandler;
|
use OCA\Gestion\Service\Certificate\PdfHandler\PacemakerCertificatePdfHandler;
|
||||||
use OCP\Files\IRootFolder;
|
use OCA\Gestion\Service\Certificate\PdfHandler\PacemakerAbsentCertificatePdfHandler;
|
||||||
|
|
||||||
class CertificateService {
|
class CertificateService
|
||||||
|
{
|
||||||
/** @var Bdd */
|
/** @var Bdd */
|
||||||
private $gestionBdd;
|
private $gestionBdd;
|
||||||
|
|
||||||
@ -44,87 +46,105 @@ class CertificateService {
|
|||||||
private const DEFAULT_NEXTCLOUD_ADMIN = "admin";
|
private const DEFAULT_NEXTCLOUD_ADMIN = "admin";
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Bdd $gestionBdd,
|
Bdd $gestionBdd,
|
||||||
IRootFolder $rootFolder) {
|
IRootFolder $rootFolder
|
||||||
|
) {
|
||||||
$this->gestionBdd = $gestionBdd;
|
$this->gestionBdd = $gestionBdd;
|
||||||
$this->rootFolder = $rootFolder;
|
$this->rootFolder = $rootFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function signatureImageExists(){
|
private function signatureImageExists()
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
||||||
try{
|
try {
|
||||||
if(isset($storage)){
|
if(isset($storage)) {
|
||||||
$storage->get("/.gestion/sign.png");
|
$storage->get("/.gestion/sign.png");
|
||||||
$signatureExist = true;
|
$signatureExist = true;
|
||||||
}else{
|
} else {
|
||||||
$signatureExist = false;
|
$signatureExist = false;
|
||||||
}
|
}
|
||||||
|
} catch(\OCP\Files\NotFoundException $e) {
|
||||||
|
$signatureExist = false;
|
||||||
}
|
}
|
||||||
catch(\OCP\Files\NotFoundException $e) {
|
return $signatureExist;
|
||||||
|
}
|
||||||
|
private function tamponImageExist()
|
||||||
|
{
|
||||||
|
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
||||||
|
try {
|
||||||
|
if(isset($storage)) {
|
||||||
|
$storage->get("/.gestion/sign.jpg"); // tampon image
|
||||||
|
$signatureExist = true;
|
||||||
|
} else {
|
||||||
|
$signatureExist = false;
|
||||||
|
}
|
||||||
|
} catch(\OCP\Files\NotFoundException $e) {
|
||||||
$signatureExist = false;
|
$signatureExist = false;
|
||||||
}
|
}
|
||||||
return $signatureExist;
|
return $signatureExist;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLogo(){
|
private function getLogo()
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
||||||
try{
|
|
||||||
try {
|
try {
|
||||||
if(isset($storage)){
|
try {
|
||||||
|
if(isset($storage)) {
|
||||||
$file = $storage->get('/.gestion/logo.png');
|
$file = $storage->get('/.gestion/logo.png');
|
||||||
}else{
|
} else {
|
||||||
return "nothing";
|
return "nothing";
|
||||||
}
|
}
|
||||||
} catch(\OCP\Files\NotFoundException $e) {
|
} catch(\OCP\Files\NotFoundException $e) {
|
||||||
$file = $storage->get('/.gestion/logo.jpeg');
|
$file = $storage->get('/.gestion/logo.jpeg');
|
||||||
}
|
}
|
||||||
}
|
} catch(\OCP\Files\NotFoundException $e) {
|
||||||
catch(\OCP\Files\NotFoundException $e) {
|
|
||||||
return "nothing";
|
return "nothing";
|
||||||
}
|
}
|
||||||
return base64_encode($file->getContent());
|
return base64_encode($file->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function setDevisOfDefuntDefaultValue($devisOfDefunt){
|
private function setDevisOfDefuntDefaultValue($devisOfDefunt)
|
||||||
|
{
|
||||||
$devisOfDefunt["devis_date"] = new DateTimeImmutable($devisOfDefunt["devis_date"]);
|
$devisOfDefunt["devis_date"] = new DateTimeImmutable($devisOfDefunt["devis_date"]);
|
||||||
$locationOfDevis = "";
|
$locationOfDevis = "";
|
||||||
if($devisOfDefunt['lieu_nom'] != null){
|
if($devisOfDefunt['lieu_nom'] != null) {
|
||||||
$locationOfDevis .= $devisOfDefunt['lieu_nom'];
|
$locationOfDevis .= $devisOfDefunt['lieu_nom'];
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['lieu_adresse'] != null){
|
if($devisOfDefunt['lieu_adresse'] != null) {
|
||||||
$locationOfDevis .= " ". $devisOfDefunt['lieu_adresse'];
|
$locationOfDevis .= " ". $devisOfDefunt['lieu_adresse'];
|
||||||
}
|
}
|
||||||
$devisOfDefunt['location_of_devis'] = $locationOfDevis;
|
$devisOfDefunt['location_of_devis'] = $locationOfDevis;
|
||||||
if($devisOfDefunt['thanato_nom'] == null){
|
if($devisOfDefunt['thanato_nom'] == null) {
|
||||||
$devisOfDefunt['thanato_nom'] = "";
|
$devisOfDefunt['thanato_nom'] = "";
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['thanato_prenom'] == null){
|
if($devisOfDefunt['thanato_prenom'] == null) {
|
||||||
$devisOfDefunt['thanato_prenom'] = "";
|
$devisOfDefunt['thanato_prenom'] = "";
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['thanato_reference'] == null){
|
if($devisOfDefunt['thanato_reference'] == null) {
|
||||||
$devisOfDefunt['thanato_reference'] = "";
|
$devisOfDefunt['thanato_reference'] = "";
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['client_nom'] == null){
|
if($devisOfDefunt['client_nom'] == null) {
|
||||||
$devisOfDefunt['client_nom'] = "";
|
$devisOfDefunt['client_nom'] = "";
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['client_prenom'] == null){
|
if($devisOfDefunt['client_prenom'] == null) {
|
||||||
$devisOfDefunt['client_prenom'] = "";
|
$devisOfDefunt['client_prenom'] = "";
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['client_entreprise'] == null){
|
if($devisOfDefunt['client_entreprise'] == null) {
|
||||||
$devisOfDefunt['client_entreprise'] = "";
|
$devisOfDefunt['client_entreprise'] = "";
|
||||||
}
|
}
|
||||||
if($devisOfDefunt['client_adresse'] == null){
|
if($devisOfDefunt['client_adresse'] == null) {
|
||||||
$devisOfDefunt['client_adresse'] = "";
|
$devisOfDefunt['client_adresse'] = "";
|
||||||
}
|
}
|
||||||
return $devisOfDefunt;
|
return $devisOfDefunt;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateCareCertificate($defuntId,$idNextCloud){
|
public function generateCareCertificate($defuntId, $idNextCloud)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
$devisOfDefunt = $this->gestionBdd->getDevisOfDefunt($defuntId);
|
$devisOfDefunt = $this->gestionBdd->getDevisOfDefunt($defuntId);
|
||||||
if($devisOfDefunt == null){
|
if($devisOfDefunt == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$devisOfDefunt["configuration"] = $currentConfig;
|
$devisOfDefunt["configuration"] = $currentConfig;
|
||||||
@ -135,60 +155,71 @@ class CertificateService {
|
|||||||
$pdfFilename = $this->GetCareCertificateFilename($devisOfDefunt);
|
$pdfFilename = $this->GetCareCertificateFilename($devisOfDefunt);
|
||||||
$filenamePath = $clean_folder.$careCertificateFolder.$pdfFilename.'.pdf';
|
$filenamePath = $clean_folder.$careCertificateFolder.$pdfFilename.'.pdf';
|
||||||
$pdf = new CareCertificatePdfHandler();
|
$pdf = new CareCertificatePdfHandler();
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$signatureImageExist = $this->signatureImageExists();
|
$signatureImageExist = $this->signatureImageExists();
|
||||||
$pdf->SetCareCertificateData($devisOfDefunt,$logo,$signatureImageExist);
|
$tamponImageExist = $this->tamponImageExist();
|
||||||
|
$pdf->SetCareCertificateData($devisOfDefunt, $logo, $signatureImageExist, $tamponImageExist);
|
||||||
$pdf->SetCareCertificate();
|
$pdf->SetCareCertificate();
|
||||||
try {
|
try {
|
||||||
$storage->newFolder($folderDestination);
|
$storage->newFolder($folderDestination);
|
||||||
|
} catch(\OCP\Files\NotPermittedException $e) {
|
||||||
}
|
}
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
}
|
|
||||||
$pdfContent = $pdf->Output('','S');
|
|
||||||
$storage->newFile($filenamePath);
|
$storage->newFile($filenamePath);
|
||||||
$pdfFile = $storage->get($filenamePath);
|
$pdfFile = $storage->get($filenamePath);
|
||||||
$pdfFile->putContent($pdfContent);
|
$pdfFile->putContent($pdfContent);
|
||||||
return $filenamePath;
|
return $filenamePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getCareCertificateFolder($devisOfDefunt){
|
private function getCareCertificateFolder($devisOfDefunt)
|
||||||
|
{
|
||||||
$careCertificateFolder = 'CLIENTS/'
|
$careCertificateFolder = 'CLIENTS/'
|
||||||
.mb_strtoupper($devisOfDefunt["client_nom"],'UTF-8')
|
.mb_strtoupper($devisOfDefunt["client_nom"], 'UTF-8')
|
||||||
.'/DEFUNTS/'
|
.'/DEFUNTS/'
|
||||||
.mb_strtoupper($devisOfDefunt["defunt_nom"],'UTF-8').'/'
|
.mb_strtoupper($devisOfDefunt["defunt_nom"], 'UTF-8').'/'
|
||||||
.'ATTESTATION/';
|
.'ATTESTATION/';
|
||||||
|
|
||||||
return $careCertificateFolder;
|
return $careCertificateFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function GetCareCertificateFilename($devisOfDefunt){
|
private function GetCareCertificateFilename($devisOfDefunt)
|
||||||
$filename = 'ATTESTATION_SOIN_'.mb_strtoupper($devisOfDefunt['defunt_nom'],'UTF-8');
|
{
|
||||||
|
$filename = 'ATTESTATION_SOIN_'.mb_strtoupper($devisOfDefunt['defunt_nom'], 'UTF-8');
|
||||||
return $filename;
|
return $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getPacemakerCertificateFolder($devisOfDefunt){
|
private function getPacemakerCertificateFolder($devisOfDefunt)
|
||||||
|
{
|
||||||
$folder = 'CLIENTS/'
|
$folder = 'CLIENTS/'
|
||||||
.mb_strtoupper($devisOfDefunt["client_nom"],'UTF-8')
|
.mb_strtoupper($devisOfDefunt["client_nom"], 'UTF-8')
|
||||||
.'/DEFUNTS/'
|
.'/DEFUNTS/'
|
||||||
.mb_strtoupper($devisOfDefunt["defunt_nom"],'UTF-8').'/'
|
.mb_strtoupper($devisOfDefunt["defunt_nom"], 'UTF-8').'/'
|
||||||
.'ATTESTATION/';
|
.'ATTESTATION/';
|
||||||
|
|
||||||
return $folder;
|
return $folder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getPacemakerCertificateFilename($devisOfDefunt){
|
private function getPacemakerCertificateFilename($devisOfDefunt)
|
||||||
$filename = 'ATTESTATION_PACEMAKER_'.mb_strtoupper($devisOfDefunt['defunt_nom'],'UTF-8');
|
{
|
||||||
|
$filename = 'ATTESTATION_PACEMAKER_'.mb_strtoupper($devisOfDefunt['defunt_nom'], 'UTF-8');
|
||||||
return $filename;
|
return $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generatePacemakerCertificate($defuntId,$idNextCloud){
|
private function getPacemakerAbsentCertificateFilename($devisOfDefunt)
|
||||||
|
{
|
||||||
|
$filename = 'ATTESTATION_ABSENCE_PACEMAKER_'.mb_strtoupper($devisOfDefunt['defunt_nom'], 'UTF-8');
|
||||||
|
return $filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generatePacemakerCertificate($defuntId, $idNextCloud)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
$devisOfDefunt = $this->gestionBdd->getDevisOfDefunt($defuntId);
|
$devisOfDefunt = $this->gestionBdd->getDevisOfDefunt($defuntId);
|
||||||
if($devisOfDefunt == null){
|
if($devisOfDefunt == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$devisOfDefunt["configuration"] = $currentConfig;
|
$devisOfDefunt["configuration"] = $currentConfig;
|
||||||
@ -199,21 +230,55 @@ class CertificateService {
|
|||||||
$pdfFilename = $this->getPacemakerCertificateFilename($devisOfDefunt);
|
$pdfFilename = $this->getPacemakerCertificateFilename($devisOfDefunt);
|
||||||
$filenamePath = $clean_folder.$pacemakerCertificateFolder.$pdfFilename.'.pdf';
|
$filenamePath = $clean_folder.$pacemakerCertificateFolder.$pdfFilename.'.pdf';
|
||||||
$pdf = new PacemakerCertificatePdfHandler();
|
$pdf = new PacemakerCertificatePdfHandler();
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$signatureImageExist = $this->signatureImageExists();
|
$signatureImageExist = $this->signatureImageExists();
|
||||||
$pdf->SetPacemakerCertificateData($devisOfDefunt,$logo,$signatureImageExist);
|
$tamponImageExist = $this->tamponImageExist();
|
||||||
|
$pdf->SetPacemakerCertificateData($devisOfDefunt, $logo, $signatureImageExist, $tamponImageExist);
|
||||||
$pdf->SetPacemakerCertificate();
|
$pdf->SetPacemakerCertificate();
|
||||||
try {
|
try {
|
||||||
$storage->newFolder($folderDestination);
|
$storage->newFolder($folderDestination);
|
||||||
|
} catch(\OCP\Files\NotPermittedException $e) {
|
||||||
}
|
}
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
}
|
|
||||||
$pdfContent = $pdf->Output('','S');
|
|
||||||
$storage->newFile($filenamePath);
|
$storage->newFile($filenamePath);
|
||||||
$pdfFile = $storage->get($filenamePath);
|
$pdfFile = $storage->get($filenamePath);
|
||||||
$pdfFile->putContent($pdfContent);
|
$pdfFile->putContent($pdfContent);
|
||||||
return $filenamePath;
|
return $filenamePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function generatePacemakerAbsentCertificate($defuntId, $idNextCloud)
|
||||||
|
{
|
||||||
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
|
$currentConfig = $configs[0];
|
||||||
|
$logo = $this->getLogo();
|
||||||
|
$devisOfDefunt = $this->gestionBdd->getDevisOfDefunt($defuntId);
|
||||||
|
if($devisOfDefunt == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
$devisOfDefunt["configuration"] = $currentConfig;
|
||||||
|
$devisOfDefunt = $this->setDevisOfDefuntDefaultValue($devisOfDefunt);
|
||||||
|
$clean_folder = html_entity_decode(string: $currentConfig->path).'/';
|
||||||
|
$pacemakerCertificateFolder = $this->getPacemakerCertificateFolder($devisOfDefunt);
|
||||||
|
$folderDestination = $clean_folder.$pacemakerCertificateFolder;
|
||||||
|
$pdfFilename = $this->getPacemakerAbsentCertificateFilename($devisOfDefunt);
|
||||||
|
$filenamePath = $clean_folder.$pacemakerCertificateFolder.$pdfFilename.'.pdf';
|
||||||
|
$pdf = new PacemakerAbsentCertificatePdfHandler();
|
||||||
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
|
$signatureImageExist = $this->signatureImageExists();
|
||||||
|
$tamponImageExist = $this->tamponImageExist();
|
||||||
|
$pdf->SetPacemakerCertificateData($devisOfDefunt, $logo, $signatureImageExist, $tamponImageExist);
|
||||||
|
$pdf->SetPacemakerCertificate();
|
||||||
|
try {
|
||||||
|
$storage->newFolder($folderDestination);
|
||||||
|
} catch(\OCP\Files\NotPermittedException $e) {
|
||||||
|
}
|
||||||
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
|
$storage->newFile($filenamePath);
|
||||||
|
$pdfFile = $storage->get($filenamePath);
|
||||||
|
$pdfFile->putContent($pdfContent);
|
||||||
|
return $filenamePath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,12 +37,13 @@ class CareCertificatePdfHandler extends FPDF {
|
|||||||
private $devisOfDefunt = [];
|
private $devisOfDefunt = [];
|
||||||
private $logo = null;
|
private $logo = null;
|
||||||
private $signatureImageExist = false;
|
private $signatureImageExist = false;
|
||||||
|
private $tamponImageExist = false;
|
||||||
private $imagePath = "/var/www/html/data/admin/files/.gestion/";
|
private $imagePath = "/var/www/html/data/admin/files/.gestion/";
|
||||||
|
|
||||||
function Header()
|
function Header()
|
||||||
{
|
{
|
||||||
if($this->logo != "nothing"){
|
if($this->logo != "nothing"){
|
||||||
$this->Image($this->imagePath."logo.png", 10, 10, 75, 25);
|
$this->Image($this->imagePath."logo.png", 4, 2, 50, 35);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
$this->Cell(55,30,'');
|
$this->Cell(55,30,'');
|
||||||
@ -51,15 +52,16 @@ class CareCertificatePdfHandler extends FPDF {
|
|||||||
function Footer()
|
function Footer()
|
||||||
{
|
{
|
||||||
$this->SetY(-18);
|
$this->SetY(-18);
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->legal_one)), 0, 'C');
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->legal_one)), 0, 'C');
|
||||||
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->adresse)), 0,'C');
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->adresse)), 0,'C');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetCareCertificateData(array $devisOfDefunt,$logo = null,$signatureImageExist = false){
|
public function SetCareCertificateData(array $devisOfDefunt,$logo = null,$signatureImageExist = false , $tamponImageExist = false){
|
||||||
$this->devisOfDefunt = $devisOfDefunt;
|
$this->devisOfDefunt = $devisOfDefunt;
|
||||||
$this->logo = $logo;
|
$this->logo = $logo;
|
||||||
$this->signatureImageExist = $signatureImageExist;
|
$this->signatureImageExist = $signatureImageExist;
|
||||||
|
$this->tamponImageExist = $tamponImageExist;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetCareCertificate(){
|
public function SetCareCertificate(){
|
||||||
@ -71,38 +73,42 @@ class CareCertificatePdfHandler extends FPDF {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private function SetSigning(){
|
private function SetSigning(){
|
||||||
$this->SetXY(140,$this->GetY() + 15);
|
$this->SetXY(140,$this->GetY() + 12);
|
||||||
$this->Cell(0,10,'Cachet et signature');
|
//$this->Cell(0,10,'Cachet et signature');
|
||||||
|
|
||||||
|
if($this->tamponImageExist){
|
||||||
|
$this->Image($this->imagePath."sign.jpg", 120, $this->GetY() + 9, 80, 35);
|
||||||
|
}
|
||||||
|
|
||||||
if($this->signatureImageExist){
|
if($this->signatureImageExist){
|
||||||
$this->Image($this->imagePath."sign.png", 135, $this->GetY() + 12, 60, 40);
|
$this->Image($this->imagePath."sign.png", 140, $this->GetY() + 42, 40, 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function SetCareCertificateContent(){
|
private function SetCareCertificateContent(){
|
||||||
$this->SetFont('ComicSans', '', 14);
|
$this->SetFont('Arial', '', 14);
|
||||||
$this->MultiCell(0,7,FileExportHelpers::FormatTextForExport('La Société '. $this->devisOfDefunt['configuration']->entreprise. ' habilitée sous le numéro ' . $this->devisOfDefunt['thanato_reference'] . ', certifie par la présente que : '));
|
$this->MultiCell(0,7,FileExportHelpers::FormatTextForExport('La Société '. $this->devisOfDefunt['configuration']->entreprise. ' habilitée sous le numéro ' . $this->devisOfDefunt['thanato_reference'] . ', certifie par la présente que : '));
|
||||||
$this->SetFont('ComicSans', 'B', 14);
|
$this->SetFont('Arial', 'B', 14);
|
||||||
$this->Cell(0,12, 'Mr/Mme ' . FileExportHelpers::FormatTextForExport($this->devisOfDefunt['thanato_nom'] . ' ' . $this->devisOfDefunt['thanato_prenom']),0,1);
|
$this->Cell(0,12, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['thanato_nom'] . ' ' . $this->devisOfDefunt['thanato_prenom']),0,1);
|
||||||
$this->SetFont('ComicSans', '', 14);
|
$this->SetFont('Arial', '', 14);
|
||||||
$this->MultiCell(0,7, FileExportHelpers::FormatTextForExport('Employé(e) au sein de notre société et titulaire du diplôme national de Thanatopracteur, a effectué des soins de conservation sur le corps du défunt :'));
|
$this->MultiCell(0,7, FileExportHelpers::FormatTextForExport('Employé(e) au sein de notre société et titulaire du diplôme national de Thanatopracteur, a effectué des soins de conservation sur le corps du défunt :'));
|
||||||
$this->SetFont('ComicSans', 'B', 14);
|
$this->SetFont('Arial', 'B', 14);
|
||||||
$this->Cell(0,12, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_nom']),0,1);
|
$this->Cell(0,12, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_nom']),0,1);
|
||||||
$this->SetFont('ComicSans', '', 14);
|
$this->SetFont('Arial', '', 14);
|
||||||
$this->Cell(0,12, FileExportHelpers::FormatTextForExport("Qui reposait à l'adresse suivante") . ' : ',0,1);
|
// $this->Cell(0,12, FileExportHelpers::FormatTextForExport("Qui reposait à l'adresse suivante") . ' : ',0,1);
|
||||||
$this->SetFont('ComicSans', 'B', 14);
|
// $this->SetFont('Arial', 'B', 14);
|
||||||
$this->MultiCell(0,6, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['location_of_devis']));
|
// $this->MultiCell(0,6, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['location_of_devis']));
|
||||||
$this->SetFont('ComicSans', '', 14);
|
$this->SetFont('Arial', '', 14);
|
||||||
$this->Cell(0,12, FileExportHelpers::FormatTextForExport("La présente attestation est établie pour faire valoir ce que de droit."),0,5);
|
$this->Cell(0,12, FileExportHelpers::FormatTextForExport("La présente attestation est établie pour faire valoir ce que de droit."),0,5);
|
||||||
$this->Ln(5);
|
$this->Ln(5);
|
||||||
$this->MultiAlignCell(120,7,FileExportHelpers::FormatTextForExport('Fait à '). FileExportHelpers::FormatTextForExport($this->devisOfDefunt['configuration']->adresse),0);
|
$this->MultiAlignCell(160,7,FileExportHelpers::FormatTextForExport('Fait à '). FileExportHelpers::FormatTextForExport($this->devisOfDefunt['location_of_devis']),0);
|
||||||
$this->SetX(140);
|
$this->SetXY(140, $this->GetY() + 10);
|
||||||
$this->Cell(0,7,'le '. $this->devisOfDefunt['devis_date']->format('d/m/Y'),0);
|
$this->Cell(0,7,'Le '. $this->devisOfDefunt['devis_date']->format('d/m/Y'),0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function SetCareCertificateTitle(){
|
private function SetCareCertificateTitle(){
|
||||||
$this->SetY(60);
|
$this->SetY(60);
|
||||||
$this->SetFont('ComicSans', 'B', 20);
|
$this->SetFont('Arial', 'B', 20);
|
||||||
$this->Cell(0, 10, 'ATTESTATION DE SOINS DE CONSERVATION', 0, 1,'C');
|
$this->Cell(0, 10, 'ATTESTATION DE SOINS DE CONSERVATION', 0, 1,'C');
|
||||||
$this->Ln(20);
|
$this->Ln(20);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,239 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
/**
|
||||||
|
* Calendar App
|
||||||
|
*
|
||||||
|
* @copyright 2021 Anna Larch <anna.larch@gmx.net>
|
||||||
|
*
|
||||||
|
* @author Anna Larch <anna.larch@gmx.net>
|
||||||
|
* @author Richard Steinmetz <richard@steinmetz.cloud>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 3 of the License, or any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public
|
||||||
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OCA\Gestion\Service\Certificate\PdfHandler;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
use FPDF;
|
||||||
|
use OCA\Gestion\Helpers\DateHelpers;
|
||||||
|
use OCA\Gestion\Helpers\FileExportHelpers;
|
||||||
|
use OCA\Gestion\Helpers\PriceHelpers;
|
||||||
|
|
||||||
|
class PacemakerAbsentCertificatePdfHandler extends FPDF
|
||||||
|
{
|
||||||
|
private $devisOfDefunt = [];
|
||||||
|
private $logo = null;
|
||||||
|
private $signatureImageExist = false;
|
||||||
|
private $tamponImageExist = false;
|
||||||
|
private $imagePath = "/var/www/html/data/admin/files/.gestion/";
|
||||||
|
|
||||||
|
public function Header()
|
||||||
|
{
|
||||||
|
if ($this->logo != "nothing") {
|
||||||
|
$this->Image($this->imagePath . "logo.png", 10, 10, 50, 35);
|
||||||
|
}
|
||||||
|
|
||||||
|
// En-tête avec les informations de l'entreprise - SOUS le logo
|
||||||
|
$this->SetXY(10, 50); // Position sous le logo
|
||||||
|
$this->SetFont('Arial', 'B', 12);
|
||||||
|
$this->Cell(0, 5, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['configuration']->entreprise), 0, 1);
|
||||||
|
$this->SetFont('Arial', '', 10);
|
||||||
|
$this->MultiCell(0, 4, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['configuration']->adresse), 0, 'L');
|
||||||
|
|
||||||
|
if (isset($this->devisOfDefunt['configuration']->telephone)) {
|
||||||
|
$this->Cell(0, 4, 'Tel : ' . FileExportHelpers::FormatTextForExport($this->devisOfDefunt['configuration']->telephone), 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->devisOfDefunt['thanato_reference'])) {
|
||||||
|
$this->Cell(0, 4, 'Habilitation : ' . FileExportHelpers::FormatTextForExport($this->devisOfDefunt['thanato_reference']), 0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->devisOfDefunt['configuration']->siret)) {
|
||||||
|
$this->Cell(0, 4, 'Siret : ' . FileExportHelpers::FormatTextForExport($this->devisOfDefunt['configuration']->siret), 0, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function Footer()
|
||||||
|
{
|
||||||
|
$this->SetY(-15);
|
||||||
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->legal_one)), 0, 'C');
|
||||||
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->adresse)), 0, 'C');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function SetPacemakerCertificateData(array $devisOfDefunt, $logo = null, $signatureImageExist = false, $tamponImageExist = false)
|
||||||
|
{
|
||||||
|
$this->devisOfDefunt = $devisOfDefunt;
|
||||||
|
$this->logo = $logo;
|
||||||
|
$this->signatureImageExist = $signatureImageExist;
|
||||||
|
$this->tamponImageExist = $tamponImageExist;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function SetPacemakerCertificate()
|
||||||
|
{
|
||||||
|
$this->AddPage();
|
||||||
|
$this->SetMargins(left: 20, top: 0, right: 20);
|
||||||
|
$this->SetPacemakerCertificateTitle();
|
||||||
|
$this->SetPacemakerCertificateContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function SetPacemakerCertificateContent()
|
||||||
|
{
|
||||||
|
$this->SetY(100); // Position réduite après le titre
|
||||||
|
|
||||||
|
$this->SetFont('Arial', '', 12);
|
||||||
|
|
||||||
|
// Déterminer le genre selon la civilité
|
||||||
|
$civilite = isset($this->devisOfDefunt['thanato_civilite']) ? $this->devisOfDefunt['thanato_civilite'] : 'Madame';
|
||||||
|
$pronom = 'Je soussignée';
|
||||||
|
$profession = 'thanatopractrice diplômée';
|
||||||
|
|
||||||
|
// Adaptation selon la civilité
|
||||||
|
if (strtolower($civilite) === 'monsieur' || strtolower($civilite) === 'm.' || strtolower($civilite) === 'mr') {
|
||||||
|
$pronom = 'Je soussigné';
|
||||||
|
$profession = 'thanatopracteur diplômé';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Texte principal avec genre adapté
|
||||||
|
$mainText = $pronom . ', ' . $civilite . ' ' .
|
||||||
|
mb_convert_encoding($this->devisOfDefunt['thanato_prenom'], 'ISO-8859-1', 'UTF-8'). ' ' .mb_convert_encoding($this->devisOfDefunt['thanato_nom'], 'ISO-8859-1', 'UTF-8').
|
||||||
|
', ' . $profession . ', certifie ne pas avoir constaté, à la palpation, la présence d\'un pacemaker pour :';
|
||||||
|
|
||||||
|
$this->MultiCell(0, 6, FileExportHelpers::FormatTextForExport($mainText));
|
||||||
|
$this->Ln(8);
|
||||||
|
|
||||||
|
// Nom du défunt
|
||||||
|
$this->SetFont('Arial', 'B', 12);
|
||||||
|
$this->Cell(20, 8, 'Nom :', 0, 0);
|
||||||
|
$this->SetFont('Arial', '', 12);
|
||||||
|
$this->Cell(0, 8, FileExportHelpers::FormatTextForExport(mb_convert_encoding($this->devisOfDefunt['defunt_nom'], 'ISO-8859-1', 'UTF-8')), 0, 1);
|
||||||
|
$this->Ln(3);
|
||||||
|
|
||||||
|
// Date
|
||||||
|
$this->SetFont('Arial', 'B', 12);
|
||||||
|
$this->Cell(20, 8, 'Date :', 0, 0);
|
||||||
|
$this->SetFont('Arial', '', 12);
|
||||||
|
if (isset($this->devisOfDefunt['devis_date'])) {
|
||||||
|
$this->Cell(0, 8, $this->devisOfDefunt['devis_date']->format('d/m/Y'), 0, 1);
|
||||||
|
} else {
|
||||||
|
$this->Cell(0, 8, '', 0, 1);
|
||||||
|
}
|
||||||
|
$this->Ln(3);
|
||||||
|
|
||||||
|
// Lieu d'intervention
|
||||||
|
$this->SetFont('Arial', 'B', 12);
|
||||||
|
$this->Cell(40, 8, 'Lieu d\'intervention :', 0, 0);
|
||||||
|
$this->SetFont('Arial', '', 12);
|
||||||
|
$lieu = isset($this->devisOfDefunt['lieu_intervention']) ?
|
||||||
|
$this->devisOfDefunt['lieu_intervention'] :
|
||||||
|
$this->devisOfDefunt['location_of_devis'];
|
||||||
|
|
||||||
|
// Utiliser MultiCell pour permettre le retour à la ligne
|
||||||
|
$this->SetX(20); // Retour au début de la ligne
|
||||||
|
$this->SetFont('Arial', 'B', 12);
|
||||||
|
$this->Cell(40, 8, 'Lieu d\'intervention :', 0, 1); // 1 pour aller à la ligne suivante
|
||||||
|
$this->SetFont('Arial', '', 12);
|
||||||
|
$this->MultiCell(0, 6, FileExportHelpers::FormatTextForExport($lieu), 0, 'L');
|
||||||
|
|
||||||
|
// Signatures et cachet - juste après le lieu d'intervention
|
||||||
|
$this->Ln(15); // Petit espace après le lieu d'intervention
|
||||||
|
|
||||||
|
if ($this->signatureImageExist) {
|
||||||
|
$this->Image($this->imagePath."sign.png", 140, $this->GetY(), 40, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($this->tamponImageExist) {
|
||||||
|
$this->SetXY(120, $this->GetY() + 20); // Augmenté de 5 à 20 pour plus d'espace
|
||||||
|
$this->Image($this->imagePath."sign.jpg", 120, $this->GetY(), 80, 35);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function SetPacemakerCertificateTitle()
|
||||||
|
{
|
||||||
|
$this->SetY(y: 85); // Titre plus bas pour éviter l'en-tête
|
||||||
|
$this->SetFont('Arial', 'B', 16);
|
||||||
|
$this->Cell(0, 10, FileExportHelpers::FormatTextForExport('ATTESTATION D\'ABSENCE DE PACEMAKER'), 0, 1, 'C');
|
||||||
|
$this->Ln(5); // Espace réduit après le titre
|
||||||
|
}
|
||||||
|
|
||||||
|
public function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
||||||
|
{
|
||||||
|
// Store reset values for (x,y) positions
|
||||||
|
$x = $this->GetX() + $w;
|
||||||
|
$y = $this->GetY();
|
||||||
|
|
||||||
|
// Make a call to FPDF's MultiCell
|
||||||
|
$this->MultiCell($w, $h, $text, $border, $align, $fill);
|
||||||
|
|
||||||
|
// Reset the line position to the right, like in Cell
|
||||||
|
if ($ln == 0) {
|
||||||
|
$this->SetXY($x, $y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function NbLines($w, $txt)
|
||||||
|
{
|
||||||
|
// Compute the number of lines a MultiCell of width w will take
|
||||||
|
if (!isset($this->CurrentFont)) {
|
||||||
|
$this->Error('No font has been set');
|
||||||
|
}
|
||||||
|
$cw = $this->CurrentFont['cw'];
|
||||||
|
if ($w == 0) {
|
||||||
|
$w = $this->w - $this->rMargin - $this->x;
|
||||||
|
}
|
||||||
|
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
||||||
|
$s = str_replace("\r", '', (string) $txt);
|
||||||
|
$nb = strlen($s);
|
||||||
|
if ($nb > 0 && $s[$nb - 1] == "\n") {
|
||||||
|
$nb--;
|
||||||
|
}
|
||||||
|
$sep = -1;
|
||||||
|
$i = 0;
|
||||||
|
$j = 0;
|
||||||
|
$l = 0;
|
||||||
|
$nl = 1;
|
||||||
|
while ($i < $nb) {
|
||||||
|
$c = $s[$i];
|
||||||
|
if ($c == "\n") {
|
||||||
|
$i++;
|
||||||
|
$sep = -1;
|
||||||
|
$j = $i;
|
||||||
|
$l = 0;
|
||||||
|
$nl++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($c == ' ') {
|
||||||
|
$sep = $i;
|
||||||
|
}
|
||||||
|
$l += $cw[$c];
|
||||||
|
if ($l > $wmax) {
|
||||||
|
if ($sep == -1) {
|
||||||
|
if ($i == $j) {
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$i = $sep + 1;
|
||||||
|
}
|
||||||
|
$sep = -1;
|
||||||
|
$j = $i;
|
||||||
|
$l = 0;
|
||||||
|
$nl++;
|
||||||
|
} else {
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -32,129 +32,147 @@ use OCA\Gestion\Helpers\DateHelpers;
|
|||||||
use OCA\Gestion\Helpers\FileExportHelpers;
|
use OCA\Gestion\Helpers\FileExportHelpers;
|
||||||
use OCA\Gestion\Helpers\PriceHelpers;
|
use OCA\Gestion\Helpers\PriceHelpers;
|
||||||
|
|
||||||
class PacemakerCertificatePdfHandler extends FPDF {
|
class PacemakerCertificatePdfHandler extends FPDF
|
||||||
|
{
|
||||||
|
|
||||||
private $devisOfDefunt = [];
|
private $devisOfDefunt = [];
|
||||||
private $logo = null;
|
private $logo = null;
|
||||||
private $signatureImageExist = false;
|
private $signatureImageExist = false;
|
||||||
|
private $tamponImageExist = false;
|
||||||
private $imagePath = "/var/www/html/data/admin/files/.gestion/";
|
private $imagePath = "/var/www/html/data/admin/files/.gestion/";
|
||||||
|
|
||||||
function Header()
|
function Header()
|
||||||
{
|
{
|
||||||
if($this->logo != "nothing"){
|
if ($this->logo != "nothing") {
|
||||||
$this->Image($this->imagePath."logo.png", 10, 10, 75, 25);
|
$this->Image($this->imagePath . "logo.png", 4, 2, 50, 35);
|
||||||
}
|
} else {
|
||||||
else{
|
$this->Cell(55, 30, '');
|
||||||
$this->Cell(55,30,'');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Footer()
|
function Footer()
|
||||||
{
|
{
|
||||||
$this->SetY(-18);
|
$this->SetY(-18);
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->legal_one)), 0, 'C');
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->legal_one)), 0, 'C');
|
||||||
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->adresse)), 0,'C');
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode($this->devisOfDefunt['configuration']->adresse)), 0, 'C');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetPacemakerCertificateData(array $devisOfDefunt,$logo = null,$signatureImageExist = false){
|
public function SetPacemakerCertificateData(array $devisOfDefunt, $logo = null, $signatureImageExist = false , $tamponImageExist = false)
|
||||||
|
{
|
||||||
$this->devisOfDefunt = $devisOfDefunt;
|
$this->devisOfDefunt = $devisOfDefunt;
|
||||||
$this->logo = $logo;
|
$this->logo = $logo;
|
||||||
$this->signatureImageExist = $signatureImageExist;
|
$this->signatureImageExist = $signatureImageExist;
|
||||||
|
$this->tamponImageExist = $tamponImageExist;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetPacemakerCertificate(){
|
public function SetPacemakerCertificate()
|
||||||
|
{
|
||||||
$this->AddPage();
|
$this->AddPage();
|
||||||
$this->SetMargins(left:20,top:0,right:20);
|
$this->SetMargins(left: 20, top: 0, right: 20);
|
||||||
$this->SetPacemakerCertificateTitle();
|
$this->SetPacemakerCertificateTitle();
|
||||||
$this->SetPacemakerCertificateContent();
|
$this->SetPacemakerCertificateContent();
|
||||||
$this->SetSigning();
|
$this->SetSigning();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function SetSigning(){
|
private function SetSigning()
|
||||||
$this->SetXY(140,$this->GetY() + 15);
|
{
|
||||||
$this->Cell(0,10,'Cachet et signature');
|
$this->SetXY(140, $this->GetY() + 12);
|
||||||
|
// $this->Cell(0, 10, 'Cachet et signature');
|
||||||
|
|
||||||
if($this->signatureImageExist){
|
if($this->tamponImageExist){
|
||||||
$this->Image($this->imagePath."sign.png", 135, $this->GetY() + 12, 60, 40);
|
$this->Image($this->imagePath."sign.jpg", 120, $this->GetY() + 9, 80, 35);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->signatureImageExist) {
|
||||||
|
$this->Image($this->imagePath."sign.png", 140, $this->GetY() + 42, 40, 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function SetPacemakerCertificateContent(){
|
private function SetPacemakerCertificateContent()
|
||||||
$this->SetFont('ComicSans', '', 14);
|
{
|
||||||
$this->MultiCell(0,7,FileExportHelpers::FormatTextForExport('La Société '. $this->devisOfDefunt['configuration']->entreprise. ' habilitée sous le numéro ' . $this->devisOfDefunt['thanato_reference'] . ', certifie par la présente que : '));
|
$this->SetFont('Arial', '', 14);
|
||||||
$this->SetFont('ComicSans', 'B', 14);
|
$this->MultiCell(0, 7, FileExportHelpers::FormatTextForExport('La Société ' . $this->devisOfDefunt['configuration']->entreprise . ' habilitée sous le numéro ' . $this->devisOfDefunt['thanato_reference'] . ', certifie par la présente que : '));
|
||||||
$this->Cell(0,12, 'Mr/Mme ' . FileExportHelpers::FormatTextForExport($this->devisOfDefunt['thanato_nom'] . ' ' . $this->devisOfDefunt['thanato_prenom']),0,1);
|
$this->SetFont('Arial', 'B', 14);
|
||||||
$this->SetFont('ComicSans', '', 14);
|
$this->Cell(0, 12,FileExportHelpers::FormatTextForExport($this->devisOfDefunt['thanato_nom'] . ' ' . $this->devisOfDefunt['thanato_prenom']), 0, 1);
|
||||||
$this->MultiCell(0,7, FileExportHelpers::FormatTextForExport('Employé(e) au sein de notre société et titulaire du diplôme national de Thanatopracteur, a retiré ce jour, la prothèse fonctionnant à pile implantée sur le corps du défunt :'));
|
$this->SetFont('Arial', '', 14);
|
||||||
$this->SetFont('ComicSans', 'B', 14);
|
$this->MultiCell(0, 7, FileExportHelpers::FormatTextForExport('Employé(e) au sein de notre société et titulaire du diplôme national de Thanatopracteur, a retiré ce jour, une prothèse fonctionnant au moyen d\'une pile implantée dans le corps du défunt :'));
|
||||||
$this->Cell(0,12, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_nom']),0,1);
|
$this->SetFont('Arial', 'B', 14);
|
||||||
$this->SetFont('ComicSans', '', 14);
|
$this->Cell(0, 12, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_nom']), 0, 1);
|
||||||
$this->Cell(0,12, FileExportHelpers::FormatTextForExport("Qui reposait à l'adresse suivante") . ' : ',0,1);
|
//$this->SetFont('Arial', '', 14);
|
||||||
$this->SetFont('ComicSans', 'B', 14);
|
//$this->Cell(0, 12, FileExportHelpers::FormatTextForExport("Qui reposait à l'adresse suivante") . ' : ', 0, 1);
|
||||||
$this->MultiCell(0,6, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['location_of_devis']));
|
//$this->SetFont('Arial', 'B', 14);
|
||||||
$this->Ln(6);
|
//$this->MultiCell(0, 6, FileExportHelpers::FormatTextForExport($this->devisOfDefunt['location_of_devis']));
|
||||||
$this->SetFont('ComicSans', '', 14);
|
// $this->Ln(6);
|
||||||
$this->Cell(0,6,
|
$this->SetFont('Arial', '', 14);
|
||||||
FileExportHelpers::FormatTextForExport("Numéro de série : ").
|
$this->Cell(
|
||||||
FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_reference_pacemaker']),0,1);
|
0,
|
||||||
$this->Cell(0,6,
|
6,
|
||||||
FileExportHelpers::FormatTextForExport("Marque du produit : ").
|
FileExportHelpers::FormatTextForExport("Numéro de série : ") .
|
||||||
FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_product_brand']),0,1);
|
FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_reference_pacemaker']),
|
||||||
$this->Cell(0,12, FileExportHelpers::FormatTextForExport("La présente attestation est établie pour faire valoir ce que de droit."),0,5);
|
0,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
$this->Cell(
|
||||||
|
0,
|
||||||
|
6,
|
||||||
|
FileExportHelpers::FormatTextForExport("Marque du produit : ") .
|
||||||
|
FileExportHelpers::FormatTextForExport($this->devisOfDefunt['defunt_product_brand']),
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
$this->Cell(0, 12, FileExportHelpers::FormatTextForExport("La présente attestation est établie pour faire valoir ce que de droit."), 0, 5);
|
||||||
$this->Ln(5);
|
$this->Ln(5);
|
||||||
|
|
||||||
$this->MultiAlignCell(120,7,FileExportHelpers::FormatTextForExport('Fait à '). FileExportHelpers::FormatTextForExport($this->devisOfDefunt['configuration']->adresse),0);
|
$this->MultiAlignCell(160, 7, FileExportHelpers::FormatTextForExport('Fait à ') . FileExportHelpers::FormatTextForExport($this->devisOfDefunt['location_of_devis']), 0);
|
||||||
$this->SetX(140);
|
$this->SetXY(140, $this->GetY() + 10);
|
||||||
$this->Cell(0,7,'le '. $this->devisOfDefunt['devis_date']->format('d/m/Y'),0);
|
$this->Cell(0, 7, 'Le ' . $this->devisOfDefunt['devis_date']->format('d/m/Y'), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function SetPacemakerCertificateTitle(){
|
private function SetPacemakerCertificateTitle()
|
||||||
|
{
|
||||||
$this->SetY(y: 50);
|
$this->SetY(y: 50);
|
||||||
$this->SetFont('ComicSans', 'B', 20);
|
$this->SetFont('Arial', 'B', 20);
|
||||||
$this->Cell(0,10,'ATTESTATION DE RETRAIT DE LA',0,1,'C');
|
$this->Cell(0, 10, 'ATTESTATION DE RETRAIT DE LA', 0, 1, 'C');
|
||||||
$this->Cell(0,10,'PROTHESE FONCTIONNANT A PILE',0,1,'C');
|
$this->Cell(0, 10, 'PROTHESE FONCTIONNANT A PILE', 0, 1, 'C');
|
||||||
$this->Ln(20);
|
$this->Ln(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
function MultiAlignCell($w,$h,$text,$border=0,$ln=0,$align='L',$fill=false)
|
function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
||||||
{
|
{
|
||||||
// Store reset values for (x,y) positions
|
// Store reset values for (x,y) positions
|
||||||
$x = $this->GetX() + $w;
|
$x = $this->GetX() + $w;
|
||||||
$y = $this->GetY();
|
$y = $this->GetY();
|
||||||
|
|
||||||
// Make a call to FPDF's MultiCell
|
// Make a call to FPDF's MultiCell
|
||||||
$this->MultiCell($w,$h,$text,$border,$align,$fill);
|
$this->MultiCell($w, $h, $text, $border, $align, $fill);
|
||||||
|
|
||||||
// Reset the line position to the right, like in Cell
|
// Reset the line position to the right, like in Cell
|
||||||
if( $ln==0 )
|
if ($ln == 0) {
|
||||||
{
|
$this->SetXY($x, $y);
|
||||||
$this->SetXY($x,$y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function NbLines($w, $txt)
|
function NbLines($w, $txt)
|
||||||
{
|
{
|
||||||
// Compute the number of lines a MultiCell of width w will take
|
// Compute the number of lines a MultiCell of width w will take
|
||||||
if(!isset($this->CurrentFont))
|
if (!isset($this->CurrentFont))
|
||||||
$this->Error('No font has been set');
|
$this->Error('No font has been set');
|
||||||
$cw = $this->CurrentFont['cw'];
|
$cw = $this->CurrentFont['cw'];
|
||||||
if($w==0)
|
if ($w == 0)
|
||||||
$w = $this->w-$this->rMargin-$this->x;
|
$w = $this->w - $this->rMargin - $this->x;
|
||||||
$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
|
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
||||||
$s = str_replace("\r",'',(string)$txt);
|
$s = str_replace("\r", '', (string) $txt);
|
||||||
$nb = strlen($s);
|
$nb = strlen($s);
|
||||||
if($nb>0 && $s[$nb-1]=="\n")
|
if ($nb > 0 && $s[$nb - 1] == "\n")
|
||||||
$nb--;
|
$nb--;
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$j = 0;
|
$j = 0;
|
||||||
$l = 0;
|
$l = 0;
|
||||||
$nl = 1;
|
$nl = 1;
|
||||||
while($i<$nb)
|
while ($i < $nb) {
|
||||||
{
|
|
||||||
$c = $s[$i];
|
$c = $s[$i];
|
||||||
if($c=="\n")
|
if ($c == "\n") {
|
||||||
{
|
|
||||||
$i++;
|
$i++;
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$j = $i;
|
$j = $i;
|
||||||
@ -162,24 +180,20 @@ class PacemakerCertificatePdfHandler extends FPDF {
|
|||||||
$nl++;
|
$nl++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if($c==' ')
|
if ($c == ' ')
|
||||||
$sep = $i;
|
$sep = $i;
|
||||||
$l += $cw[$c];
|
$l += $cw[$c];
|
||||||
if($l>$wmax)
|
if ($l > $wmax) {
|
||||||
{
|
if ($sep == -1) {
|
||||||
if($sep==-1)
|
if ($i == $j)
|
||||||
{
|
|
||||||
if($i==$j)
|
|
||||||
$i++;
|
$i++;
|
||||||
}
|
} else
|
||||||
else
|
$i = $sep + 1;
|
||||||
$i = $sep+1;
|
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$j = $i;
|
$j = $i;
|
||||||
$l = 0;
|
$l = 0;
|
||||||
$nl++;
|
$nl++;
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
return $nl;
|
return $nl;
|
||||||
|
|||||||
@ -27,32 +27,31 @@ declare(strict_types=1);
|
|||||||
namespace OCA\Gestion\Service\Devis\Pdf;
|
namespace OCA\Gestion\Service\Devis\Pdf;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use \FPDF;
|
use FPDF;
|
||||||
use OCA\Gestion\Helpers\FileExportHelpers;
|
use OCA\Gestion\Helpers\FileExportHelpers;
|
||||||
use OCA\Gestion\Helpers\PriceHelpers;
|
use OCA\Gestion\Helpers\PriceHelpers;
|
||||||
|
|
||||||
class DevisPdfHandler extends FPDF {
|
class DevisPdfHandler extends FPDF
|
||||||
|
{
|
||||||
private $multipleDevisData = [];
|
private $multipleDevisData = [];
|
||||||
private $devisData = [];
|
private $devisData = [];
|
||||||
private $logo = null;
|
private $logo = null;
|
||||||
private $logoPath = "/var/www/html/data/admin/files/.gestion/";
|
private $logoPath = "/var/www/html/data/admin/files/.gestion/";
|
||||||
function Header()
|
public function Header()
|
||||||
{
|
{
|
||||||
if($this->logo != "nothing"){
|
if ($this->logo != "nothing") {
|
||||||
$this->Image($this->logoPath."logo.png", 10, 10, 75, 25);
|
$this->Image($this->logoPath . "logo.png", 4, 2, 50, 35);
|
||||||
}
|
} else {
|
||||||
else{
|
$this->Cell(55, 30, '');
|
||||||
$this->Cell(55,30,'');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
function Footer()
|
public function Footer()
|
||||||
{
|
{
|
||||||
$this->SetY(-40);
|
$this->SetY(-40);
|
||||||
$this->SetFont('ComicSans', '', 7);
|
$this->SetFont('ComicSans', '', 7);
|
||||||
$this->MultiCell(0,5,utf8_decode(html_entity_decode('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal ( Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.')));
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal ( Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.')));
|
||||||
$this->Ln(1);
|
$this->Ln(1);
|
||||||
$this->MultiCell(0,5,utf8_decode(html_entity_decode('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du code de commerce ).
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire sera due sur présentation de justificatifs ( articles L.441-3 et L.441-6 du code de commerce ).
|
||||||
')));
|
')));
|
||||||
|
|
||||||
$this->SetY(-15);
|
$this->SetY(-15);
|
||||||
@ -60,32 +59,37 @@ class DevisPdfHandler extends FPDF {
|
|||||||
$this->Cell(0, 10, utf8_decode(html_entity_decode($this->devisData['configuration']->legal_one)), 0, 0, 'C');
|
$this->Cell(0, 10, utf8_decode(html_entity_decode($this->devisData['configuration']->legal_one)), 0, 0, 'C');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetDevisPdfData(array $devisData,$logo = null){
|
public function SetDevisPdfData(array $devisData, $logo = null)
|
||||||
|
{
|
||||||
$this->devisData = $devisData;
|
$this->devisData = $devisData;
|
||||||
$this->logo = $logo;
|
$this->logo = $logo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetMultipleDevisPdfData(array $multipleDevisData,$logo = null){
|
public function SetMultipleDevisPdfData(array $multipleDevisData, $logo = null)
|
||||||
|
{
|
||||||
$this->multipleDevisData = $multipleDevisData;
|
$this->multipleDevisData = $multipleDevisData;
|
||||||
$this->logo = $logo;
|
$this->logo = $logo;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawDevisCompanyAndClientInfo(){
|
private function DrawDevisCompanyAndClientInfo()
|
||||||
|
{
|
||||||
$this->SetY(40);
|
$this->SetY(40);
|
||||||
$this->SetFont('ComicSans', '', 12);
|
$this->SetFont('ComicSans', '', 12);
|
||||||
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['configuration']->entreprise), 0, 0);
|
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['configuration']->entreprise), 0, 0);
|
||||||
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['client_nom']), 0, 1,'R');
|
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['client_nom']), 0, 1, 'R');
|
||||||
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['configuration_adresse']), 0, 0);
|
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['configuration_adresse']), 0, 0);
|
||||||
$this->Cell(0, 7, trim(FileExportHelpers::FormatTextForExport($this->devisData['client_real_adress'])), 0, 1,'R');
|
$this->Cell(0, 7, trim(FileExportHelpers::FormatTextForExport($this->devisData['client_real_adress'])), 0, 1, 'R');
|
||||||
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['configuration_adresse_city']), 0, 0);border:
|
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport($this->devisData['configuration_adresse_city']), 0, 0);
|
||||||
$this->Cell(0, 7, trim(FileExportHelpers::FormatTextForExport($this->devisData['client_adress_city'])), 0, 1,'R');
|
border:
|
||||||
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport('Tél : ') . FileExportHelpers::FormatTextForExport($this->devisData['configuration']->telephone),0,0);
|
$this->Cell(0, 7, trim(FileExportHelpers::FormatTextForExport($this->devisData['client_adress_city'])), 0, 1, 'R');
|
||||||
$this->Cell(0, 7, 'Siret: ' . $this->devisData['siret'], 0, 1,'R');
|
$this->Cell(0, 7, FileExportHelpers::FormatTextForExport('Tél : ') . FileExportHelpers::FormatTextForExport($this->devisData['configuration']->telephone), 0, 0);
|
||||||
|
$this->Cell(0, 7, 'Siret: ' . $this->devisData['siret'], 0, 1, 'R');
|
||||||
$this->Cell(0, 7, 'Mail : ' . $this->devisData['configuration']->mail, 0, 1);
|
$this->Cell(0, 7, 'Mail : ' . $this->devisData['configuration']->mail, 0, 1);
|
||||||
$this->Ln(3);
|
$this->Ln(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawDevisInfoTable(){
|
private function DrawDevisInfoTable()
|
||||||
|
{
|
||||||
$this->SetFont('ComicSans', 'B', 11);
|
$this->SetFont('ComicSans', 'B', 11);
|
||||||
$this->Cell(30, 7, 'DATE', 1, 0, 'C');
|
$this->Cell(30, 7, 'DATE', 1, 0, 'C');
|
||||||
$this->Cell(80, 7, 'CLIENT', 1, 0, 'C');
|
$this->Cell(80, 7, 'CLIENT', 1, 0, 'C');
|
||||||
@ -99,11 +103,12 @@ class DevisPdfHandler extends FPDF {
|
|||||||
$this->Ln(8);
|
$this->Ln(8);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawArticlesTable(){
|
private function DrawArticlesTable()
|
||||||
|
{
|
||||||
$this->SetLineWidth(0.1);
|
$this->SetLineWidth(0.1);
|
||||||
$this->Rect(10, 105, 190, 100, "D");
|
$this->Rect(10, 105, 190, 100, "D");
|
||||||
// cadre titre des colonnes
|
// cadre titre des colonnes
|
||||||
$this->Line(10, 115, 200,115);
|
$this->Line(10, 115, 200, 115);
|
||||||
// les traits verticaux colonnes
|
// les traits verticaux colonnes
|
||||||
$this->Line(35, 105, 35, 205);
|
$this->Line(35, 105, 35, 205);
|
||||||
$this->Line(135, 105, 135, 205);
|
$this->Line(135, 105, 135, 205);
|
||||||
@ -111,76 +116,94 @@ class DevisPdfHandler extends FPDF {
|
|||||||
$this->Line(175, 105, 175, 205);
|
$this->Line(175, 105, 175, 205);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawArticlesTableHeader(){
|
private function DrawArticlesTableHeader()
|
||||||
$tvaValue = $this->devisData["configuration"]->tva_default;
|
{
|
||||||
$this->SetFont('ComicSans','',10);
|
$tvaDefault = $this->devisData["configuration"]->tva_default;
|
||||||
$this->SetXY( 10,106 );
|
$clientTvaStatus = isset($this->devisData["tva"]) ? (int)$this->devisData["tva"] : 1;
|
||||||
$this->Cell( 20, 8, "Date", 0, 0, 'C');
|
|
||||||
|
|
||||||
$this->SetXY( 35,106 );
|
// Déterminer le libellé TVA selon le statut du client
|
||||||
$this->Cell( 100, 8, "Description", 0, 0, 'C');
|
$tvaLabel = ($clientTvaStatus === 0) ? "TVA 0%" : "TVA " . $tvaDefault . "%";
|
||||||
|
|
||||||
$this->SetXY( 135,106 );
|
|
||||||
$this->Cell( 20, 8, "Prix Uni. HT", 0, 0, 'C');
|
|
||||||
|
|
||||||
$this->SetXY( 155,106 );
|
|
||||||
$this->Cell( 20, 8, 'TVA ' . $tvaValue . '%', 0, 0, 'C');
|
|
||||||
|
|
||||||
$this->SetXY( 175,106 );
|
|
||||||
$this->Cell( 25, 8, "Prix Uni. TTC", 0, 0, 'C');
|
|
||||||
|
|
||||||
|
$this->SetFont('ComicSans', '', 10);
|
||||||
|
$this->SetXY(10, 106);
|
||||||
|
$this->Cell(20, 8, "Date", 0, 0, 'C');
|
||||||
|
$this->SetXY(35, 106);
|
||||||
|
$this->Cell(100, 8, "Description", 0, 0, 'C');
|
||||||
|
$this->SetXY(135, 106);
|
||||||
|
$this->Cell(20, 8, "Prix Uni. HT", 0, 0, 'C');
|
||||||
|
$this->SetXY(155, 106);
|
||||||
|
$this->Cell(20, 8, $tvaLabel, 0, 0, 'C');
|
||||||
|
$this->SetXY(175, 106);
|
||||||
|
$this->Cell(25, 8, "Prix Uni. TTC", 0, 0, 'C');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function DrawArticlesTableValueAndReturnTotalPrice(){
|
public function DrawArticlesTableValueAndReturnTotalPrice()
|
||||||
$this->SetFont('ComicSans','',10);
|
{
|
||||||
$tvaValue = $this->devisData["configuration"]->tva_default;
|
$this->SetFont('ComicSans', '', 10);
|
||||||
|
$tvaDefault = $this->devisData["configuration"]->tva_default;
|
||||||
|
$clientTvaStatus = isset($this->devisData["tva"]) ? (int)$this->devisData["tva"] : 1;
|
||||||
|
|
||||||
|
// Déterminer le taux de TVA à appliquer selon le statut du client
|
||||||
|
$tvaValue = ($clientTvaStatus === 0) ? 0 : $tvaDefault;
|
||||||
|
$tvaLabel = ($clientTvaStatus === 0) ? "0%" : $tvaDefault . "%";
|
||||||
|
|
||||||
$totalHt = 0;
|
$totalHt = 0;
|
||||||
$totalTtc = 0;
|
$totalTtc = 0;
|
||||||
$totalTva = 0;
|
$totalTva = 0;
|
||||||
$products = $this->devisData["products"];
|
$products = $this->devisData["products"];
|
||||||
$yValue = 116;
|
$yValue = 116;
|
||||||
foreach($products as $product){
|
|
||||||
|
foreach ($products as $product) {
|
||||||
$valueHt = $product['produit_price'] * $product['quantite'];
|
$valueHt = $product['produit_price'] * $product['quantite'];
|
||||||
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt,$tvaValue);
|
|
||||||
$totalHt+=$valueHt;
|
// Calculer la TVA selon le statut du client
|
||||||
$totalTtc+=$valueTtc;
|
if ($clientTvaStatus === 0) {
|
||||||
|
// Client exonéré - pas de TVA
|
||||||
|
$valueTtc = $valueHt;
|
||||||
|
$tvaAmount = 0;
|
||||||
|
} else {
|
||||||
|
// Client soumis à la TVA - utiliser le calcul normal
|
||||||
|
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue);
|
||||||
|
$tvaAmount = $valueTtc - $valueHt;
|
||||||
|
}
|
||||||
|
|
||||||
|
$totalHt += $valueHt;
|
||||||
|
$totalTtc += $valueTtc;
|
||||||
|
$totalTva += $tvaAmount;
|
||||||
|
|
||||||
$productDescription = $product["produit_description"];
|
$productDescription = $product["produit_description"];
|
||||||
$dateValue = "";
|
$dateValue = "";
|
||||||
if($product === end($products)){
|
if ($product === end($products)) {
|
||||||
$dateValue = $this->devisData['devis_date'];
|
$dateValue = $this->devisData['devis_date'];
|
||||||
$productDescription .= " de " . FileExportHelpers::GetSexeLabel($this->devisData['defunt_sexe']) . ' '. $this->devisData["defunt_nom"];
|
$productDescription .= " de " . FileExportHelpers::GetSexeLabel($this->devisData['defunt_sexe']) . ' ' . $this->devisData["defunt_nom"];
|
||||||
}
|
}
|
||||||
$tvaAmount = $valueTtc - $valueHt;
|
|
||||||
$this->SetXY( 10,$yValue );
|
|
||||||
$this->Cell(20, 6, $dateValue, 0,0);
|
|
||||||
|
|
||||||
$this->SetXY( 35,$yValue );
|
$this->SetXY(10, $yValue);
|
||||||
$this->MultiAlignCell(100, 6, utf8_decode(html_entity_decode($productDescription)),0,'0',);
|
$this->Cell(20, 6, $dateValue, 0, 0);
|
||||||
|
$this->SetXY(35, $yValue);
|
||||||
$this->SetXY( 135,$yValue );
|
$this->MultiAlignCell(100, 6, utf8_decode(html_entity_decode($productDescription)), 0, '0', );
|
||||||
$this->Cell(20, 6, number_format($valueHt,2,'.','').chr(128), 0, 0, 'C');
|
$this->SetXY(135, $yValue);
|
||||||
|
$this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C');
|
||||||
$this->SetXY( 155,$yValue );
|
$this->SetXY(155, $yValue);
|
||||||
$this->Cell(20, 6, number_format($tvaAmount,2,'.','').chr(128), 0, 0, 'C');
|
$this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C');
|
||||||
|
$this->SetXY(175, $yValue);
|
||||||
$this->SetXY( 175,$yValue );
|
$this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C');
|
||||||
$this->Cell(25, 6, number_format($valueTtc,2,'.','').chr(128), 0, 1, 'C');
|
|
||||||
$yValue += 12;
|
$yValue += 12;
|
||||||
$totalTva += $tvaAmount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
"TOTAL HT" => $totalHt,
|
"TOTAL HT" => $totalHt,
|
||||||
"TVA ".$tvaValue. "%" => $totalTva,
|
"TVA " . $tvaLabel => $totalTva,
|
||||||
"TOTAL TTC" => $totalTtc
|
"TOTAL TTC" => $totalTtc
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawBankAndTotalPriceInfo($totalPriceArray){
|
private function DrawBankAndTotalPriceInfo($totalPriceArray)
|
||||||
|
{
|
||||||
$this->SetY(210);
|
$this->SetY(210);
|
||||||
$this->SetFont('ComicSans', '', 9);
|
$this->SetFont('ComicSans', '', 9);
|
||||||
$this->MultiCell(0,5,utf8_decode(html_entity_decode("Paiement à votre convenance par chèque à l'ordre de ". $this->devisData['configuration']->entreprise)));
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode("Paiement à votre convenance par chèque à l'ordre de " . $this->devisData['configuration']->entreprise)));
|
||||||
$this->MultiCell(0,5,utf8_decode(html_entity_decode("en indiquant le numéro de facture, ou par virement :")));
|
$this->MultiCell(0, 5, utf8_decode(html_entity_decode("en indiquant le numéro de facture, ou par virement :")));
|
||||||
|
|
||||||
$this->Ln(1);
|
$this->Ln(1);
|
||||||
|
|
||||||
@ -193,28 +216,30 @@ class DevisPdfHandler extends FPDF {
|
|||||||
$this->Cell($ibanWidth, 7, 'Code SWIFT : AGRI FR PP 836', 1, 1, 'C');
|
$this->Cell($ibanWidth, 7, 'Code SWIFT : AGRI FR PP 836', 1, 1, 'C');
|
||||||
|
|
||||||
//TABLE HT
|
//TABLE HT
|
||||||
$ibanLastPositionX = $ibanCursorX+$ibanWidth + 20;
|
$ibanLastPositionX = $ibanCursorX + $ibanWidth + 20;
|
||||||
$startOfArrayX = $ibanLastPositionX;
|
$startOfArrayX = $ibanLastPositionX;
|
||||||
$startOfArrayY = $ibanCursorY;
|
$startOfArrayY = $ibanCursorY;
|
||||||
foreach($totalPriceArray as $label => $price){
|
foreach ($totalPriceArray as $label => $price) {
|
||||||
$this->SetXY($startOfArrayX,$startOfArrayY);
|
$this->SetXY($startOfArrayX, $startOfArrayY);
|
||||||
$this->Cell(40, 7, $label, 1, 1, 'C');
|
$this->Cell(40, 7, $label, 1, 1, 'C');
|
||||||
$this->SetXY($startOfArrayX + 40,$startOfArrayY);
|
$this->SetXY($startOfArrayX + 40, $startOfArrayY);
|
||||||
$this->Cell(40, 7, number_format($price,2,'.','').chr(128), 1, 1, 'C');
|
$this->Cell(40, 7, number_format($price, 2, '.', '') . chr(128), 1, 1, 'C');
|
||||||
$startOfArrayY += 7;
|
$startOfArrayY += 7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetMultipleDevisContent(){
|
public function SetMultipleDevisContent()
|
||||||
foreach($this->multipleDevisData as $devisData){
|
{
|
||||||
|
foreach ($this->multipleDevisData as $devisData) {
|
||||||
$this->devisData = $devisData;
|
$this->devisData = $devisData;
|
||||||
$this->SetDevisContent();
|
$this->SetDevisContent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function SetDevisContent(){
|
public function SetDevisContent()
|
||||||
|
{
|
||||||
$this->AddPage();
|
$this->AddPage();
|
||||||
$this->SetMargins(10,0,10);
|
$this->SetMargins(10, 0, 10);
|
||||||
$this->DrawDevisCompanyAndClientInfo();
|
$this->DrawDevisCompanyAndClientInfo();
|
||||||
$this->DrawDevisInfoTable();
|
$this->DrawDevisInfoTable();
|
||||||
$this->DrawArticlesTable();
|
$this->DrawArticlesTable();
|
||||||
@ -223,45 +248,45 @@ class DevisPdfHandler extends FPDF {
|
|||||||
$this->DrawBankAndTotalPriceInfo($totalPriceValue);
|
$this->DrawBankAndTotalPriceInfo($totalPriceValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
function MultiAlignCell($w,$h,$text,$border=0,$ln=0,$align='L',$fill=false)
|
public function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
||||||
{
|
{
|
||||||
// Store reset values for (x,y) positions
|
// Store reset values for (x,y) positions
|
||||||
$x = $this->GetX() + $w;
|
$x = $this->GetX() + $w;
|
||||||
$y = $this->GetY();
|
$y = $this->GetY();
|
||||||
|
|
||||||
// Make a call to FPDF's MultiCell
|
// Make a call to FPDF's MultiCell
|
||||||
$this->MultiCell($w,$h,$text,$border,$align,$fill);
|
$this->MultiCell($w, $h, $text, $border, $align, $fill);
|
||||||
|
|
||||||
// Reset the line position to the right, like in Cell
|
// Reset the line position to the right, like in Cell
|
||||||
if( $ln==0 )
|
if ($ln == 0) {
|
||||||
{
|
$this->SetXY($x, $y);
|
||||||
$this->SetXY($x,$y);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function NbLines($w, $txt)
|
public function NbLines($w, $txt)
|
||||||
{
|
{
|
||||||
// Compute the number of lines a MultiCell of width w will take
|
// Compute the number of lines a MultiCell of width w will take
|
||||||
if(!isset($this->CurrentFont))
|
if (!isset($this->CurrentFont)) {
|
||||||
$this->Error('No font has been set');
|
$this->Error('No font has been set');
|
||||||
|
}
|
||||||
$cw = $this->CurrentFont['cw'];
|
$cw = $this->CurrentFont['cw'];
|
||||||
if($w==0)
|
if ($w == 0) {
|
||||||
$w = $this->w-$this->rMargin-$this->x;
|
$w = $this->w - $this->rMargin - $this->x;
|
||||||
$wmax = ($w-2*$this->cMargin)*1000/$this->FontSize;
|
}
|
||||||
$s = str_replace("\r",'',(string)$txt);
|
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
||||||
|
$s = str_replace("\r", '', (string) $txt);
|
||||||
$nb = strlen($s);
|
$nb = strlen($s);
|
||||||
if($nb>0 && $s[$nb-1]=="\n")
|
if ($nb > 0 && $s[$nb - 1] == "\n") {
|
||||||
$nb--;
|
$nb--;
|
||||||
|
}
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$j = 0;
|
$j = 0;
|
||||||
$l = 0;
|
$l = 0;
|
||||||
$nl = 1;
|
$nl = 1;
|
||||||
while($i<$nb)
|
while ($i < $nb) {
|
||||||
{
|
|
||||||
$c = $s[$i];
|
$c = $s[$i];
|
||||||
if($c=="\n")
|
if ($c == "\n") {
|
||||||
{
|
|
||||||
$i++;
|
$i++;
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$j = $i;
|
$j = $i;
|
||||||
@ -269,26 +294,26 @@ class DevisPdfHandler extends FPDF {
|
|||||||
$nl++;
|
$nl++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if($c==' ')
|
if ($c == ' ') {
|
||||||
$sep = $i;
|
$sep = $i;
|
||||||
|
}
|
||||||
$l += $cw[$c];
|
$l += $cw[$c];
|
||||||
if($l>$wmax)
|
if ($l > $wmax) {
|
||||||
{
|
if ($sep == -1) {
|
||||||
if($sep==-1)
|
if ($i == $j) {
|
||||||
{
|
|
||||||
if($i==$j)
|
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
else
|
} else {
|
||||||
$i = $sep+1;
|
$i = $sep + 1;
|
||||||
|
}
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$j = $i;
|
$j = $i;
|
||||||
$l = 0;
|
$l = 0;
|
||||||
$nl++;
|
$nl++;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return $nl;
|
return $nl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,9 @@ declare(strict_types=1);
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace OCA\Gestion\Service\Devis\Pdf;
|
namespace OCA\Gestion\Service\Devis\Pdf;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../../../../vendor/autoload.php';
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use OCA\Gestion\Constants\DevisExportTypeConstant;
|
use OCA\Gestion\Constants\DevisExportTypeConstant;
|
||||||
@ -33,7 +35,8 @@ use OCA\Gestion\Helpers\DateHelpers;
|
|||||||
use OCA\Gestion\Helpers\FileExportHelpers;
|
use OCA\Gestion\Helpers\FileExportHelpers;
|
||||||
use OCP\Files\IRootFolder;
|
use OCP\Files\IRootFolder;
|
||||||
|
|
||||||
class DevisPdfService {
|
class DevisPdfService
|
||||||
|
{
|
||||||
/** @var Bdd */
|
/** @var Bdd */
|
||||||
private $gestionBdd;
|
private $gestionBdd;
|
||||||
|
|
||||||
@ -43,48 +46,53 @@ class DevisPdfService {
|
|||||||
private const DEFAULT_NEXTCLOUD_ADMIN = "admin";
|
private const DEFAULT_NEXTCLOUD_ADMIN = "admin";
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Bdd $gestionBdd,
|
Bdd $gestionBdd,
|
||||||
IRootFolder $rootFolder) {
|
IRootFolder $rootFolder
|
||||||
|
) {
|
||||||
$this->gestionBdd = $gestionBdd;
|
$this->gestionBdd = $gestionBdd;
|
||||||
$this->rootFolder = $rootFolder;
|
$this->rootFolder = $rootFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLogo(){
|
private function getLogo()
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
||||||
try{
|
|
||||||
try {
|
try {
|
||||||
if(isset($storage)){
|
try {
|
||||||
|
if (isset($storage)) {
|
||||||
$file = $storage->get('/.gestion/logo.png');
|
$file = $storage->get('/.gestion/logo.png');
|
||||||
}else{
|
} else {
|
||||||
return "nothing";
|
return "nothing";
|
||||||
}
|
}
|
||||||
} catch(\OCP\Files\NotFoundException $e) {
|
} catch (\OCP\Files\NotFoundException $e) {
|
||||||
$file = $storage->get('/.gestion/logo.jpeg');
|
$file = $storage->get('/.gestion/logo.jpeg');
|
||||||
}
|
}
|
||||||
}
|
} catch (\OCP\Files\NotFoundException $e) {
|
||||||
catch(\OCP\Files\NotFoundException $e) {
|
|
||||||
return "nothing";
|
return "nothing";
|
||||||
}
|
}
|
||||||
|
|
||||||
return base64_encode($file->getContent());
|
return base64_encode($file->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDevisPdfFilename($devisData){
|
private function getDevisPdfFilename($devisData)
|
||||||
|
{
|
||||||
$filename = "DEVIS-";
|
$filename = "DEVIS-";
|
||||||
$defuntNom = str_replace(' ',' ',$devisData['defunt_nom']);
|
$defuntNom = str_replace(' ', ' ', $devisData['defunt_nom']);
|
||||||
$devisLocation = str_replace(' ',' ',$devisData['lieu_nom']);
|
$devisLocation = str_replace(' ', ' ', $devisData['lieu_nom']);
|
||||||
return $filename.$defuntNom.'-'.$devisLocation;
|
return $filename . $defuntNom . '-' . $devisLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function formatMultipleDevisToPdfFormat($multipleDevisData,$configuration){
|
private function formatMultipleDevisToPdfFormat($multipleDevisData, $configuration)
|
||||||
foreach($multipleDevisData as &$devis){
|
{
|
||||||
$devis = $this->formatDevisDataToPdfDataFormat($devis,$configuration);
|
foreach ($multipleDevisData as &$devis) {
|
||||||
|
$devis = $this->formatDevisDataToPdfDataFormat($devis, $configuration);
|
||||||
}
|
}
|
||||||
return $multipleDevisData;
|
return $multipleDevisData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function formatDevisDataToPdfDataFormat($devis,$configuration){
|
private function formatDevisDataToPdfDataFormat($devis, $configuration)
|
||||||
|
{
|
||||||
$devisDate = $devis['devis_date'];
|
$devisDate = $devis['devis_date'];
|
||||||
$devisDate = DateTime::createFromFormat('Y-m-d',$devisDate);
|
$tva = isset($devis["tva"]) ? $devis["tva"] : 1;
|
||||||
|
$devisDate = DateTime::createFromFormat('Y-m-d', $devisDate);
|
||||||
$devisDate = $devisDate->format('d-m-Y');
|
$devisDate = $devisDate->format('d-m-Y');
|
||||||
$devis['devis_date'] = $devisDate;
|
$devis['devis_date'] = $devisDate;
|
||||||
$devis['configuration'] = $configuration;
|
$devis['configuration'] = $configuration;
|
||||||
@ -93,6 +101,7 @@ class DevisPdfService {
|
|||||||
$firstClient = $this->gestionBdd->getFirstClient();
|
$firstClient = $this->gestionBdd->getFirstClient();
|
||||||
$devis["siret"] = $firstClient != null ? $firstClient['legal_one'] : '';
|
$devis["siret"] = $firstClient != null ? $firstClient['legal_one'] : '';
|
||||||
$devis["products"] = $products;
|
$devis["products"] = $products;
|
||||||
|
$devis["tva"] = $tva;
|
||||||
$clientAdresses = FileExportHelpers::GetAddressAndCityFromAddress($devis["client_adresse"]);
|
$clientAdresses = FileExportHelpers::GetAddressAndCityFromAddress($devis["client_adresse"]);
|
||||||
$devis["client_real_adress"] = $clientAdresses["address"];
|
$devis["client_real_adress"] = $clientAdresses["address"];
|
||||||
$devis["client_adress_city"] = $clientAdresses["city"];
|
$devis["client_adress_city"] = $clientAdresses["city"];
|
||||||
@ -102,33 +111,33 @@ class DevisPdfService {
|
|||||||
return $devis;
|
return $devis;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateDevisPdfByDevisId($devisId,$idNextCloud){
|
public function generateDevisPdfByDevisId($devisId, $idNextCloud)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
$devisPdfData = $this->gestionBdd->getDevisPdfDataByDevisId($devisId);
|
$devisPdfData = $this->gestionBdd->getDevisPdfDataByDevisId($devisId);
|
||||||
if($devisPdfData == null){
|
if ($devisPdfData == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$devisPdfDataFormatted = $this->formatDevisDataToPdfDataFormat($devisPdfData,$currentConfig);
|
$devisPdfDataFormatted = $this->formatDevisDataToPdfDataFormat($devisPdfData, $currentConfig);
|
||||||
$clean_folder = html_entity_decode(string: $currentConfig->path).'/';
|
$clean_folder = html_entity_decode(string: $currentConfig->path) . '/';
|
||||||
$devisPdfFolders = $this->getDevisPdfFolder($devisPdfDataFormatted,$clean_folder);
|
$devisPdfFolders = $this->getDevisPdfFolder($devisPdfDataFormatted, $clean_folder);
|
||||||
$pdf = new DevisPdfHandler();
|
$pdf = new DevisPdfHandler();
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$pdf->SetDevisPdfData($devisPdfDataFormatted,$logo);
|
$pdf->SetDevisPdfData($devisPdfDataFormatted, $logo);
|
||||||
$pdf->SetDevisContent();
|
$pdf->SetDevisContent();
|
||||||
$pdfContent = $pdf->Output('','S');
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
$pdfFilename = $this->getDevisPdfFilename($devisPdfDataFormatted);
|
$pdfFilename = $this->getDevisPdfFilename($devisPdfDataFormatted);
|
||||||
$filenames = [];
|
$filenames = [];
|
||||||
foreach($devisPdfFolders as $folder){
|
foreach ($devisPdfFolders as $folder) {
|
||||||
try {
|
try {
|
||||||
$storage->newFolder($folder);
|
$storage->newFolder($folder);
|
||||||
|
} catch (\OCP\Files\NotPermittedException $e) {
|
||||||
}
|
}
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
$ff_pdf = $folder . $pdfFilename . '.pdf';
|
||||||
}
|
|
||||||
$ff_pdf = $folder.$pdfFilename.'.pdf';
|
|
||||||
$storage->newFile($ff_pdf);
|
$storage->newFile($ff_pdf);
|
||||||
$file_pdf = $storage->get($ff_pdf);
|
$file_pdf = $storage->get($ff_pdf);
|
||||||
$file_pdf->putContent($pdfContent);
|
$file_pdf->putContent($pdfContent);
|
||||||
@ -137,45 +146,71 @@ class DevisPdfService {
|
|||||||
return $filenames;
|
return $filenames;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDevisPdfFolder(array $devisPdfData,$racinePath){
|
private function getDevisPdfFolder(array $devisPdfData, $racinePath)
|
||||||
$clientRacineFolder = $racinePath.'CLIENTS/'.strtoupper($devisPdfData["client_nom"]).'/';
|
{
|
||||||
$defuntsFolder = $clientRacineFolder.'DEFUNTS/'.strtoupper($devisPdfData['defunt_nom']).'/'.'DEVIS'.'/';
|
$clientRacineFolder = $racinePath . 'CLIENTS/' . strtoupper($devisPdfData["client_nom"]) . '/';
|
||||||
|
$defuntsFolder = $clientRacineFolder . 'DEFUNTS/' . strtoupper($devisPdfData['defunt_nom']) . '/' . 'DEVIS' . '/';
|
||||||
$devisDate = $devisPdfData['devis_date'];
|
$devisDate = $devisPdfData['devis_date'];
|
||||||
$devisDatetime = new DateTime($devisDate);
|
$devisDatetime = new DateTime($devisDate);
|
||||||
$devisDateYear = $devisDatetime->format('Y');
|
$devisDateYear = $devisDatetime->format('Y');
|
||||||
$devisMonth = DateHelpers::GetDateWithFormatDayAndMonthPlainString($devisPdfData['devis_date']);
|
$devisMonth = DateHelpers::GetDateWithFormatDayAndMonthPlainString($devisPdfData['devis_date']);
|
||||||
$devisByYearFolder = $clientRacineFolder."$devisDateYear".'/'.$devisMonth.'/'.'DEVIS'.'/';
|
$devisByYearFolder = $clientRacineFolder . "$devisDateYear" . '/' . $devisMonth . '/' . 'DEVIS' . '/';
|
||||||
return [
|
return [
|
||||||
$defuntsFolder,
|
$defuntsFolder,
|
||||||
$devisByYearFolder
|
$devisByYearFolder
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Genere simplement le dossier de defunt et client pour le devis pour le user connecter
|
||||||
|
*/
|
||||||
|
public function generateClientAndDefuntFolder($devisId, $idNextCloud)
|
||||||
|
{
|
||||||
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
|
$currentConfig = $configs[0];
|
||||||
|
$devisPdfData = $this->gestionBdd->getDevisPdfDataByDevisId($devisId);
|
||||||
|
if ($devisPdfData == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private function GetMultipleDevisFilename($multipleDevisData,$month,$year,$type = DevisExportTypeConstant::TYPE_SINGLE){
|
$clean_folder = html_entity_decode(string: $currentConfig->path) . '/';
|
||||||
|
$devisPdfDataFormatted = $this->formatDevisDataToPdfDataFormat($devisPdfData, $currentConfig);
|
||||||
|
$devisPdfFolders = $this->getDevisPdfFolder($devisPdfDataFormatted, $clean_folder);
|
||||||
|
|
||||||
|
foreach ($devisPdfFolders as $folder) {
|
||||||
|
try {
|
||||||
|
$storage->newFolder($folder);
|
||||||
|
} catch (\OCP\Files\NotPermittedException $e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function GetMultipleDevisFilename($multipleDevisData, $month, $year, $type = DevisExportTypeConstant::TYPE_SINGLE)
|
||||||
|
{
|
||||||
$filename = "";
|
$filename = "";
|
||||||
foreach($multipleDevisData as $devis){
|
foreach ($multipleDevisData as $devis) {
|
||||||
if($type == DevisExportTypeConstant::TYPE_SINGLE){
|
if ($type == DevisExportTypeConstant::TYPE_SINGLE) {
|
||||||
$filename = mb_strtoupper($devis["client_nom"],'UTF-8');
|
$filename = mb_strtoupper($devis["client_nom"], 'UTF-8');
|
||||||
|
} else {
|
||||||
|
$filename = mb_strtoupper($devis["group_name"], 'UTF-8');
|
||||||
}
|
}
|
||||||
else{
|
$filename .= $month != 0 ? '_' . DateHelpers::GetMonthPlainString($month) : '';
|
||||||
$filename = mb_strtoupper($devis["group_name"],'UTF-8');
|
$filename .= "_" . $year;
|
||||||
}
|
|
||||||
$filename .= $month != 0 ? '_'.DateHelpers::GetMonthPlainString($month) :'';
|
|
||||||
$filename .= "_".$year;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return $filename;
|
return $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateMultipleDevisPdfByClientAndMonthYear($clientId,$month,$year,$type,$idNextCloud){
|
public function generateMultipleDevisPdfByClientAndMonthYear($clientId, $month, $year, $type, $idNextCloud)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
if($type == DevisExportTypeConstant::TYPE_SINGLE){
|
if ($type == DevisExportTypeConstant::TYPE_SINGLE) {
|
||||||
$multipleDevisData = $this->gestionBdd->getDevisPdfDataByClientAndMonthYear($clientId,$month,$year,$currentConfig);
|
$multipleDevisData = $this->gestionBdd->getDevisPdfDataByClientAndMonthYear($clientId, $month, $year, $currentConfig);
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$multipleDevisData = $this->gestionBdd->getDevisPdfDataByClientGroupFacturationAndMonthYear(
|
$multipleDevisData = $this->gestionBdd->getDevisPdfDataByClientGroupFacturationAndMonthYear(
|
||||||
$clientId,
|
$clientId,
|
||||||
$month,
|
$month,
|
||||||
@ -183,30 +218,28 @@ class DevisPdfService {
|
|||||||
$currentConfig
|
$currentConfig
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if(empty($multipleDevisData)){
|
if (empty($multipleDevisData)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$multipleDevisDataFormatted = $this->formatMultipleDevisToPdfFormat($multipleDevisData,$currentConfig);
|
$multipleDevisDataFormatted = $this->formatMultipleDevisToPdfFormat($multipleDevisData, $currentConfig);
|
||||||
if($type == DevisExportTypeConstant::TYPE_SINGLE){
|
if ($type == DevisExportTypeConstant::TYPE_SINGLE) {
|
||||||
$clientFolderName = mb_strtoupper($multipleDevisDataFormatted[0]["client_nom"] ?? "-","UTF-8");
|
$clientFolderName = mb_strtoupper($multipleDevisDataFormatted[0]["client_nom"] ?? "-", "UTF-8");
|
||||||
}
|
} else {
|
||||||
else{
|
$clientFolderName = mb_strtoupper($multipleDevisDataFormatted[0]["group_name"] ?? "-", "UTF-8");
|
||||||
$clientFolderName = mb_strtoupper($multipleDevisDataFormatted[0]["group_name"] ?? "-","UTF-8");
|
|
||||||
}
|
}
|
||||||
$pdf = new DevisPdfHandler();
|
$pdf = new DevisPdfHandler();
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$pdf->SetMultipleDevisPdfData($multipleDevisDataFormatted,$logo);
|
$pdf->SetMultipleDevisPdfData($multipleDevisDataFormatted, $logo);
|
||||||
$pdf->SetMultipleDevisContent();
|
$pdf->SetMultipleDevisContent();
|
||||||
$racinePath = html_entity_decode(string: $currentConfig->path).'/';
|
$racinePath = html_entity_decode(string: $currentConfig->path) . '/';
|
||||||
$clientRacineFolder = $racinePath.'CLIENTS/'.$clientFolderName.'/';
|
$clientRacineFolder = $racinePath . 'CLIENTS/' . $clientFolderName . '/';
|
||||||
$filename = 'DEVIS'.'_'.$this->GetMultipleDevisFilename($multipleDevisDataFormatted,$month,$year,$type);
|
$filename = 'DEVIS' . '_' . $this->GetMultipleDevisFilename($multipleDevisDataFormatted, $month, $year, $type);
|
||||||
$filenamePath = $clientRacineFolder.$filename.'.pdf';
|
$filenamePath = $clientRacineFolder . $filename . '.pdf';
|
||||||
$pdfContent = $pdf->Output('','S');
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
try {
|
try {
|
||||||
$storage->newFolder($clientRacineFolder);
|
$storage->newFolder($clientRacineFolder);
|
||||||
}
|
} catch (\OCP\Files\NotPermittedException $e) {
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
|
||||||
}
|
}
|
||||||
$storage->newFile($filenamePath);
|
$storage->newFile($filenamePath);
|
||||||
$file_pdf = $storage->get($filenamePath);
|
$file_pdf = $storage->get($filenamePath);
|
||||||
|
|||||||
@ -34,6 +34,7 @@ use OCA\Gestion\Db\Bdd;
|
|||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
use OCA\Gestion\Helpers\VCalendarHelpers;
|
use OCA\Gestion\Helpers\VCalendarHelpers;
|
||||||
|
use OCA\Gestion\Service\Devis\Pdf\DevisPdfService;
|
||||||
|
|
||||||
class GestionService
|
class GestionService
|
||||||
{
|
{
|
||||||
@ -48,15 +49,22 @@ class GestionService
|
|||||||
|
|
||||||
private $userConnectedUuid;
|
private $userConnectedUuid;
|
||||||
|
|
||||||
|
/** @var DevisPdfService */
|
||||||
|
private $devisPdfService;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Bdd $gestionBdd,
|
Bdd $gestionBdd,
|
||||||
LoggerInterface $logger,
|
LoggerInterface $logger,
|
||||||
TalkService $talkService,
|
TalkService $talkService,
|
||||||
IUserSession $userSession
|
IUserSession $userSession,
|
||||||
|
DevisPdfService $devisPdfService
|
||||||
|
|
||||||
) {
|
) {
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->gestionBdd = $gestionBdd;
|
$this->gestionBdd = $gestionBdd;
|
||||||
$this->talkService = $talkService;
|
$this->talkService = $talkService;
|
||||||
|
$this->devisPdfService = $devisPdfService;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->userConnectedUuid = $userSession->getUser()->getUID();
|
$this->userConnectedUuid = $userSession->getUser()->getUID();
|
||||||
} catch (Exception) {
|
} catch (Exception) {
|
||||||
@ -325,6 +333,7 @@ class GestionService
|
|||||||
$devisTalkMessage = $this->gestionBdd->getDevisTalkRoomMessage($devisId, $userName);
|
$devisTalkMessage = $this->gestionBdd->getDevisTalkRoomMessage($devisId, $userName);
|
||||||
$this->talkService->sendDevisTalkNotifications($devisTalkMessage, $userName, $this->userConnectedUuid);
|
$this->talkService->sendDevisTalkNotifications($devisTalkMessage, $userName, $this->userConnectedUuid);
|
||||||
$this->gestionBdd->createDevisTrajetFromVCalendar($devisId, $userName);
|
$this->gestionBdd->createDevisTrajetFromVCalendar($devisId, $userName);
|
||||||
|
$this->devisPdfService->generateDevisPdfByDevisId($devisId , $this->userConnectedUuid);
|
||||||
} catch (\OC\OCS\Exception $e) {
|
} catch (\OC\OCS\Exception $e) {
|
||||||
$this->logger->debug("Error while handling created calendar object: " . $e->getMessage());
|
$this->logger->debug("Error while handling created calendar object: " . $e->getMessage());
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
@ -332,6 +341,7 @@ class GestionService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private function GetThanatoNameFromVCalendarString($vCalendarString)
|
private function GetThanatoNameFromVCalendarString($vCalendarString)
|
||||||
{
|
{
|
||||||
$thanatoName = $this->getPrincipalUsernameFromVCalendarString($vCalendarString);
|
$thanatoName = $this->getPrincipalUsernameFromVCalendarString($vCalendarString);
|
||||||
|
|||||||
126
gestion/lib/Service/HtmlToPdfService.php
Normal file
126
gestion/lib/Service/HtmlToPdfService.php
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace OCA\Gestion\Service;
|
||||||
|
|
||||||
|
use Throwable;
|
||||||
|
use Dompdf\Dompdf;
|
||||||
|
use Dompdf\Options;
|
||||||
|
use OCA\Gestion\Exception\TemplateException;
|
||||||
|
|
||||||
|
class HtmlToPdfService
|
||||||
|
{
|
||||||
|
private $templatesPath;
|
||||||
|
private $assetsPath;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->templatesPath = __DIR__ . '/../../templates/pdf/';
|
||||||
|
$this->assetsPath = '/var/www/html/data/admin/files/.gestion/';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generatePdf($templateName, $data, $options = [])
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$htmlContent = $this->renderPhpTemplate($templateName, $data);
|
||||||
|
return $this->convertToPdf($htmlContent, $options);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
error_log('HtmlToPdfService Error: ' . $e->getMessage());
|
||||||
|
throw new TemplateException('Erreur génération PDF: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rend un template PHP avec les données
|
||||||
|
*/
|
||||||
|
private function renderPhpTemplate($templateName, $data)
|
||||||
|
{
|
||||||
|
$templateFile = $this->templatesPath . $templateName . '.php';
|
||||||
|
|
||||||
|
if (!file_exists($templateFile)) {
|
||||||
|
throw new TemplateException("Template introuvable: " . $templateFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$templateData = array_merge($data, [
|
||||||
|
'logo_base64' => $this->getLogoBase64()
|
||||||
|
]);
|
||||||
|
|
||||||
|
extract($templateData);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
include $templateFile;
|
||||||
|
return ob_get_clean();
|
||||||
|
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
ob_end_clean();
|
||||||
|
throw new TemplateException("Erreur lors du rendu du template: " . $e->getMessage(), 0, $e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Récupère le logo en base64
|
||||||
|
*/
|
||||||
|
private function getLogoBase64()
|
||||||
|
{
|
||||||
|
$logoPath = $this->assetsPath . 'logo.png';
|
||||||
|
|
||||||
|
if (file_exists($logoPath)) {
|
||||||
|
return base64_encode(file_get_contents($logoPath));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retour d'un pixel transparent si pas de logo
|
||||||
|
return 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convertit HTML en PDF
|
||||||
|
*/
|
||||||
|
private function convertToPdf($htmlContent, $options = [])
|
||||||
|
{
|
||||||
|
$dompdfOptions = new Options();
|
||||||
|
$dompdfOptions->set('defaultFont', 'DejaVu Sans');
|
||||||
|
$dompdfOptions->set('isRemoteEnabled', true);
|
||||||
|
$dompdfOptions->set('isHtml5ParserEnabled', true);
|
||||||
|
$dompdfOptions->set('enable_css_float', true);
|
||||||
|
$dompdfOptions->set('enable_font_subsetting', true);
|
||||||
|
|
||||||
|
$paper = $options['paper'] ?? 'A4';
|
||||||
|
$orientation = $options['orientation'] ?? 'portrait';
|
||||||
|
|
||||||
|
$dompdf = new Dompdf($dompdfOptions);
|
||||||
|
$dompdf->loadHtml($htmlContent);
|
||||||
|
$dompdf->setPaper($paper, $orientation);
|
||||||
|
$dompdf->render();
|
||||||
|
|
||||||
|
return $dompdf->output();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateInvoiceFilename($factureData, $prefix = 'FACTURE')
|
||||||
|
{
|
||||||
|
$numero = str_pad($factureData['num'] ?? '', 6, '0', STR_PAD_LEFT);
|
||||||
|
$month = str_pad($factureData['month'] ?? date('m'), 2, '0', STR_PAD_LEFT);
|
||||||
|
$year = $factureData['year'] ?? date('Y');
|
||||||
|
|
||||||
|
return "{$prefix}_{$numero}_{$month}_{$year}.pdf";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debug template PHP
|
||||||
|
*/
|
||||||
|
public function debugTemplate($templateName, $data)
|
||||||
|
{
|
||||||
|
echo "=== DONNÉES REÇUES ===\n";
|
||||||
|
var_dump($data);
|
||||||
|
|
||||||
|
echo "\n=== TEMPLATE PHP UTILISÉ ===\n";
|
||||||
|
$templateFile = $this->templatesPath . $templateName . '.php';
|
||||||
|
echo "Fichier: $templateFile\n";
|
||||||
|
echo "Existe: " . (file_exists($templateFile) ? "OUI" : "NON") . "\n";
|
||||||
|
|
||||||
|
echo "\n=== HTML GÉNÉRÉ ===\n";
|
||||||
|
$html = $this->renderPhpTemplate($templateName, $data);
|
||||||
|
echo substr($html, 0, 2000) . "...\n";
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -27,7 +27,7 @@ declare(strict_types=1);
|
|||||||
namespace OCA\Gestion\Service\InvoiceGroupPdfHandler;
|
namespace OCA\Gestion\Service\InvoiceGroupPdfHandler;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use \FPDF;
|
use FPDF;
|
||||||
use OCA\Gestion\Helpers\FileExportHelpers;
|
use OCA\Gestion\Helpers\FileExportHelpers;
|
||||||
use OCA\Gestion\Helpers\PriceHelpers;
|
use OCA\Gestion\Helpers\PriceHelpers;
|
||||||
|
|
||||||
@ -50,15 +50,16 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
|
|
||||||
public $thereIsOrderOrCaseNumber = false;
|
public $thereIsOrderOrCaseNumber = false;
|
||||||
public $startingYOfArticlesTable = 100;
|
public $startingYOfArticlesTable = 100;
|
||||||
public int $maxArticlePerPage = 19;
|
public int $maxArticlePerPage = 7;
|
||||||
public $additionalArticlesLineBasedOnMultiline = 0;
|
public $additionalArticlesLineBasedOnMultiline = 0;
|
||||||
public $interLigneHeader = 5;
|
public $interLigneHeader = 5;
|
||||||
|
public $hasTva = true;
|
||||||
|
|
||||||
function Header()
|
public function Header()
|
||||||
{
|
{
|
||||||
if ($this->logo != "nothing") {
|
if ($this->logo != "nothing") {
|
||||||
$this->Image($this->logoPath . "logo.png", 2, 10, 75, 25);
|
$this->Image($this->logoPath . "logo.png", 4, 2, 50, 35);
|
||||||
$this->AddWatermark();
|
//$this->AddWatermark();
|
||||||
} else {
|
} else {
|
||||||
$this->Cell(55, 30, '');
|
$this->Cell(55, 30, '');
|
||||||
}
|
}
|
||||||
@ -66,8 +67,19 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$this->DrawInvoiceCompanyAndClientInfo();
|
$this->DrawInvoiceCompanyAndClientInfo();
|
||||||
$this->DrawInvoiceInfoTable();
|
$this->DrawInvoiceInfoTable();
|
||||||
}
|
}
|
||||||
function AddWatermark()
|
|
||||||
|
public function SafeTextForPdf($text)
|
||||||
{
|
{
|
||||||
|
if (empty($text)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$text = html_entity_decode($text, ENT_QUOTES | ENT_HTML401, 'UTF-8');
|
||||||
|
return iconv('UTF-8', 'ISO-8859-1//IGNORE', $text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function AddWatermark()
|
||||||
|
{
|
||||||
|
try {
|
||||||
$this->SetAlpha(0.2);
|
$this->SetAlpha(0.2);
|
||||||
|
|
||||||
$imagePath = $this->logoPath . "filigrane_pdf.png";
|
$imagePath = $this->logoPath . "filigrane_pdf.png";
|
||||||
@ -89,9 +101,13 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
// Ajouter l'image en filigrane
|
// Ajouter l'image en filigrane
|
||||||
$this->Image($imagePath, $x, $y, $width, $height); // Chemin, position x, position y, largeur, hauteur
|
$this->Image($imagePath, $x, $y, $width, $height); // Chemin, position x, position y, largeur, hauteur
|
||||||
$this->SetAlpha(0.1); // Définir l'opacité
|
$this->SetAlpha(0.1); // Définir l'opacité
|
||||||
|
} catch (\Throwable $th) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function SetAlpha($alpha)
|
}
|
||||||
|
|
||||||
|
public function SetAlpha($alpha)
|
||||||
{
|
{
|
||||||
// Appliquer la transparence au document
|
// Appliquer la transparence au document
|
||||||
$this->SetFillColor(255, 255, 255, $alpha * 255);
|
$this->SetFillColor(255, 255, 255, $alpha * 255);
|
||||||
@ -106,21 +122,21 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Footer()
|
public function Footer()
|
||||||
{
|
{
|
||||||
$this->SetY(-34);
|
$this->SetY(-34);
|
||||||
$this->SetFont('ComicSans', '', 7);
|
$this->SetFont('Arial', '', 7);
|
||||||
|
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal ')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal '));
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('(Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('(Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.'));
|
||||||
|
|
||||||
$this->Ln(1);
|
$this->Ln(1);
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire'));
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('sera due sur présentation de justificatifs (articles L.441-3 et L.441-6 du code de commerce).')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('sera due sur présentation de justificatifs (articles L.441-3 et L.441-6 du code de commerce).'));
|
||||||
|
|
||||||
$this->SetY(-10);
|
$this->SetY(-10);
|
||||||
$this->SetFont('ComicSans', '', 7);
|
$this->SetFont('Arial', '', 7);
|
||||||
$this->Cell(0, 10, utf8_decode(html_entity_decode($this->factureData['configuration']->legal_one)), 0, 0, 'C');
|
$this->Cell(0, 10, $this->SafeTextForPdf($this->factureData['configuration']->legal_one), 0, 0, 'C');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function InvoicePdfFactory(array $factureData, $logo = null)
|
public function InvoicePdfFactory(array $factureData, $logo = null)
|
||||||
@ -132,6 +148,8 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$this->devisCountToGet = ($this->devisCount <= $this->maxArticlePerPage) ? $this->devisCount : $this->maxArticlePerPage;
|
$this->devisCountToGet = ($this->devisCount <= $this->maxArticlePerPage) ? $this->devisCount : $this->maxArticlePerPage;
|
||||||
$this->devisList = $this->factureData['devis'];
|
$this->devisList = $this->factureData['devis'];
|
||||||
$this->logo = $logo;
|
$this->logo = $logo;
|
||||||
|
// Déterminer si la TVA est applicable
|
||||||
|
$this->hasTva = isset($factureData['is_tva']) ? $factureData['is_tva'] : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function GetInvoiceFilename()
|
public function GetInvoiceFilename()
|
||||||
@ -167,7 +185,7 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
public function DrawInvoiceCompanyInfo()
|
public function DrawInvoiceCompanyInfo()
|
||||||
{
|
{
|
||||||
$this->SetY(40);
|
$this->SetY(40);
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($this->factureData['configuration']->entreprise), 0, 1);
|
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($this->factureData['configuration']->entreprise), 0, 1);
|
||||||
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($this->factureData['configuration_adresse']), 0, 1);
|
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($this->factureData['configuration_adresse']), 0, 1);
|
||||||
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($this->factureData['configuration_adresse_city']), 0, 1);
|
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport($this->factureData['configuration_adresse_city']), 0, 1);
|
||||||
@ -176,7 +194,7 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
public function DrawInvoiceClientInfo()
|
public function DrawInvoiceClientInfo()
|
||||||
{
|
{
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$clientName = $this->factureData['group_name'];
|
$clientName = $this->factureData['group_name'];
|
||||||
$clientInfoXAxis = 135;
|
$clientInfoXAxis = 135;
|
||||||
|
|
||||||
@ -245,11 +263,22 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
||||||
$this->Cell(0, $this->interLigneHeader, trim(FileExportHelpers::FormatTextForExport($this->factureData['client_adress_city'])));
|
$this->Cell(0, $this->interLigneHeader, trim(FileExportHelpers::FormatTextForExport($this->factureData['client_adress_city'])));
|
||||||
|
|
||||||
|
// Gestion Siret ou TVA intracommunautaire selon is_tva
|
||||||
|
if ($this->hasTva) {
|
||||||
|
// Avec TVA : afficher le Siret
|
||||||
if ($this->factureData['siret']) {
|
if ($this->factureData['siret']) {
|
||||||
$clientInfoYAxis += $this->interLigneHeader;
|
$clientInfoYAxis += $this->interLigneHeader;
|
||||||
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
||||||
$this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']);
|
$this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Sans TVA : afficher N° TVA intracommunautaire
|
||||||
|
$clientInfoYAxis += $this->interLigneHeader;
|
||||||
|
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
||||||
|
$tvaIntracommu = isset($this->factureData['client_tva_intracommu']) ? $this->factureData['client_tva_intracommu'] : '';
|
||||||
|
$this->Cell(0, $this->interLigneHeader, 'TVA intracom : ' . $tvaIntracommu);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -266,15 +295,15 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$factureDateEcheance->modify('last day of next month');
|
$factureDateEcheance->modify('last day of next month');
|
||||||
$factureDateEcheance = $factureDateEcheance->format('d-m-Y');
|
$factureDateEcheance = $factureDateEcheance->format('d-m-Y');
|
||||||
|
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$this->Cell(25, 7, 'DATE', 1, 0, 'C');
|
$this->Cell(25, 7, 'DATE', 1, 0, 'C');
|
||||||
$this->Cell(104, 7, 'CLIENT', 1, 0, 'C');
|
$this->Cell(104, 7, 'CLIENT', 1, 0, 'C');
|
||||||
$this->Cell(39, 7, 'FACTURE', 1, 0, 'C');
|
$this->Cell(39, 7, 'FACTURE', 1, 0, 'C');
|
||||||
$this->Cell(36, 7, 'ECHEANCE', 1, 1, 'C');
|
$this->Cell(36, 7, 'ECHEANCE', 1, 1, 'C');
|
||||||
|
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$this->Cell(25, 7, $factureDatePaiement, 1, 0, 'C');
|
$this->Cell(25, 7, $factureDatePaiement, 1, 0, 'C');
|
||||||
$this->Cell(104, 7, utf8_decode(html_entity_decode($this->factureData['group_name'])), 1, 0, 'C');
|
$this->Cell(104, 7, $this->SafeTextForPdf($this->factureData['group_name']), 1, 0, 'C');
|
||||||
$this->Cell(39, 7, $this->factureData['num'], 1, 0, 'C');
|
$this->Cell(39, 7, $this->factureData['num'], 1, 0, 'C');
|
||||||
$this->Cell(36, 7, $factureDateEcheance, 1, 1, 'C');
|
$this->Cell(36, 7, $factureDateEcheance, 1, 1, 'C');
|
||||||
|
|
||||||
@ -294,11 +323,16 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$this->Line(3, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName, 207, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName);
|
$this->Line(3, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName, 207, $this->startingYOfArticlesTable + $gapBetweenStartingOfArticlesTableAndColumnName);
|
||||||
// les traits verticaux colonnes
|
// les traits verticaux colonnes
|
||||||
$additionalMargRight = 1;
|
$additionalMargRight = 1;
|
||||||
$endingLine = 233 + $additionnalheight;
|
$endingLine = $this->startingYOfArticlesTable + $tableHeight;
|
||||||
$this->Line(27 + $additionalMargRight, $this->startingYOfArticlesTable, 27 + $additionalMargRight, $endingLine);
|
$this->Line(27 + $additionalMargRight, $this->startingYOfArticlesTable, 27 + $additionalMargRight, $endingLine);
|
||||||
$this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine);
|
$this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine);
|
||||||
|
|
||||||
|
if ($this->hasTva) {
|
||||||
$this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine);
|
$this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine);
|
||||||
$this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine);
|
$this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine);
|
||||||
|
} else {
|
||||||
|
$this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function DrawArticlesTableHeader()
|
public function DrawArticlesTableHeader()
|
||||||
@ -306,9 +340,9 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$additionalMargRight = 1;
|
$additionalMargRight = 1;
|
||||||
$tvaValue = $this->factureData["configuration"]->tva_default;
|
$tvaValue = $this->factureData["configuration"]->tva_default;
|
||||||
$columnNameY = $this->startingYOfArticlesTable - 1.5;
|
$columnNameY = $this->startingYOfArticlesTable - 1.5;
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$this->SetXY(12 + $additionalMargRight, $columnNameY);
|
$this->SetXY(35 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(7, 10, "Date", 0, 0, 'C');
|
$this->Cell(7, 10, "", 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(30 + $additionalMargRight, $columnNameY);
|
$this->SetXY(30 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(100, 10, "Description", 0, 0, 'C');
|
$this->Cell(100, 10, "Description", 0, 0, 'C');
|
||||||
@ -316,25 +350,32 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$this->SetXY(143 + $additionalMargRight, $columnNameY);
|
$this->SetXY(143 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C');
|
$this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C');
|
||||||
|
|
||||||
|
if ($this->hasTva) {
|
||||||
$this->SetXY(163 + $additionalMargRight, $columnNameY);
|
$this->SetXY(163 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(20, 10, 'TVA ' . $tvaValue . '%', 0, 0, 'C');
|
$this->Cell(20, 10, 'TVA ' . $tvaValue . '%', 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(185, $columnNameY);
|
$this->SetXY(185, $columnNameY);
|
||||||
$this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C');
|
$this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C');
|
||||||
|
} else {
|
||||||
|
$this->SetXY(185, $columnNameY);
|
||||||
|
$this->Cell(20, 10, "Montant HT", 0, 0, 'C');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function DrawArticlesTableValue()
|
public function DrawArticlesTableValue()
|
||||||
{
|
{
|
||||||
// Set espacement avant de continue
|
// Set espacement avant de continue
|
||||||
|
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$devisData = $this->factureData['devis'];
|
$devisData = $this->factureData['devis'];
|
||||||
$tvaValue = $this->factureData["configuration"]->tva_default;
|
$tvaValue = $this->factureData["configuration"]->tva_default;
|
||||||
$totalHt = 0;
|
$totalHt = 0;
|
||||||
$totalTtc = 0;
|
$totalTtc = 0;
|
||||||
$totalTva = 0;
|
$totalTva = 0;
|
||||||
$yValue = $this->startingYOfArticlesTable + 13;
|
$yValue = $this->startingYOfArticlesTable + 13;
|
||||||
$maxDescriptionWidth = 102;
|
// $maxDescriptionWidth = 102;
|
||||||
|
$maxDescriptionWidth = 104.3;
|
||||||
|
// $maxDescriptionWidth = 51;
|
||||||
$currentIndexPosition = $this->currentIndexPosition;
|
$currentIndexPosition = $this->currentIndexPosition;
|
||||||
for ($currentIndexPosition; $currentIndexPosition < ($this->initialIndexPosition + $this->devisCountToGet); $currentIndexPosition++) {
|
for ($currentIndexPosition; $currentIndexPosition < ($this->initialIndexPosition + $this->devisCountToGet); $currentIndexPosition++) {
|
||||||
$currentDevis = $devisData[$currentIndexPosition];
|
$currentDevis = $devisData[$currentIndexPosition];
|
||||||
@ -346,20 +387,32 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
foreach ($products as $product) {
|
foreach ($products as $product) {
|
||||||
|
|
||||||
$valueHt = $product['produit_price'] * $product["quantite"];
|
$valueHt = $product['produit_price'] * $product["quantite"];
|
||||||
|
if ($this->hasTva) {
|
||||||
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue);
|
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue);
|
||||||
|
$tvaAmount = $valueTtc - $valueHt;
|
||||||
|
} else {
|
||||||
|
$valueTtc = $valueHt; // Sans TVA, TTC = HT
|
||||||
|
$tvaAmount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
$totalHt += $valueHt;
|
$totalHt += $valueHt;
|
||||||
$totalTtc += $valueTtc;
|
$totalTtc += $valueTtc;
|
||||||
$productDescription = $product["produit_description"] ?? "";
|
$productDescription = $product["produit_description"] ?? "";
|
||||||
|
$currentDevisDefuntName = $currentDevis["defunt_nom"] ?? "";
|
||||||
|
|
||||||
$dateValue = "";
|
$dateValue = "";
|
||||||
|
$dateAndDefuntName = "";
|
||||||
if ($productIncrement == 0) {
|
if ($productIncrement == 0) {
|
||||||
$dateValue = $devisDate;
|
$dateValue = $devisDate;
|
||||||
$productDescription .= " de " . $currentDevis["defunt_nom"] ?? "";
|
// $productDescription .= " de " . $currentDevis["defunt_nom"] ?? "";
|
||||||
}
|
$dateAndDefuntName = $dateValue . " - " . $currentDevisDefuntName;
|
||||||
$tvaAmount = $valueTtc - $valueHt;
|
$this->SetXY(70, $yValue);
|
||||||
$this->SetXY(4, $yValue);
|
$this->Cell(5, 6, $currentDevisDefuntName, 0, 0);
|
||||||
|
$this->SetXY(4, $yValue + 5);
|
||||||
$this->Cell(5, 6, $dateValue, 0, 0);
|
$this->Cell(5, 6, $dateValue, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
$this->SetXY(30, $yValue);
|
$this->SetXY(30, $yValue + 5);
|
||||||
$productDescription = FileExportHelpers::FormatTextForExport($productDescription);
|
$productDescription = FileExportHelpers::FormatTextForExport($productDescription);
|
||||||
$productDescriptionWidth = $this->GetStringWidth($productDescription);
|
$productDescriptionWidth = $this->GetStringWidth($productDescription);
|
||||||
$productDescriptionWidthIsGreaterThanMaxWidth = $productDescriptionWidth > $maxDescriptionWidth;
|
$productDescriptionWidthIsGreaterThanMaxWidth = $productDescriptionWidth > $maxDescriptionWidth;
|
||||||
@ -377,14 +430,20 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$this->SetXY(144, $yValue);
|
$this->SetXY(144, $yValue + 5);
|
||||||
$this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C');
|
$this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(165, $yValue);
|
if ($this->hasTva) {
|
||||||
|
$this->SetXY(165, $yValue + 5);
|
||||||
$this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C');
|
$this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(182, $yValue);
|
$this->SetXY(182, $yValue + 5);
|
||||||
$this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C');
|
$this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C');
|
||||||
|
} else {
|
||||||
|
$this->SetXY(182, $yValue + 5);
|
||||||
|
$this->Cell(25, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 1, 'C');
|
||||||
|
}
|
||||||
|
|
||||||
$yValue += 6;
|
$yValue += 6;
|
||||||
$totalTva += $tvaAmount;
|
$totalTva += $tvaAmount;
|
||||||
if ($productDescriptionWidthIsGreaterThanMaxWidth) {
|
if ($productDescriptionWidthIsGreaterThanMaxWidth) {
|
||||||
@ -392,6 +451,11 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
$productIncrement++;
|
$productIncrement++;
|
||||||
}
|
}
|
||||||
|
$yValue += 6;
|
||||||
|
$isLastLigneDevis = $currentIndexPosition == (($this->initialIndexPosition + $this->devisCountToGet) - 1);
|
||||||
|
if (!$isLastLigneDevis) {
|
||||||
|
$this->Line(3, $yValue, 207, $yValue);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$this->currentIndexPosition = $currentIndexPosition;
|
$this->currentIndexPosition = $currentIndexPosition;
|
||||||
$this->initialIndexPosition = $this->currentIndexPosition;
|
$this->initialIndexPosition = $this->currentIndexPosition;
|
||||||
@ -405,21 +469,21 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
{
|
{
|
||||||
$startOfYAfterMainTable = 239;
|
$startOfYAfterMainTable = 239;
|
||||||
$this->SetY($startOfYAfterMainTable);
|
$this->SetY($startOfYAfterMainTable);
|
||||||
$this->SetFont('ComicSans', '', 8);
|
$this->SetFont('Arial', '', 8);
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode("Paiement à votre convenance par chèque à l'ordre de " . $this->factureData['configuration']->entreprise)));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf("Paiement à votre convenance par chèque à l'ordre de " . $this->factureData['configuration']->entreprise));
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode("en indiquant le numéro de facture, ou par virement :")));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf("en indiquant le numéro de facture, ou par virement :"));
|
||||||
|
|
||||||
$this->Ln(1);
|
$this->Ln(1);
|
||||||
//Table IBAN
|
//Table IBAN
|
||||||
$startOftable = 3;
|
$startOftable = 3;
|
||||||
$this->SetX($startOftable);
|
$this->SetX($startOftable);
|
||||||
$this->SetFont('ComicSans', '', 8);
|
$this->SetFont('Arial', '', 8);
|
||||||
$ibanWidth = 62;
|
$ibanWidth = 62;
|
||||||
$this->Cell($ibanWidth, 6.5, 'IBAN : FR76 1360 6000 1436 5418 1800 038', 1, 1, 'C');
|
$this->Cell($ibanWidth, 6.5, 'IBAN : FR76 1670 6052 4453 9757 9734 871', 1, 1, 'C');
|
||||||
$ibanCursorX = $this->GetX();
|
$ibanCursorX = $this->GetX();
|
||||||
$this->SetX($startOftable);
|
$this->SetX($startOftable);
|
||||||
|
|
||||||
$this->Cell($ibanWidth, 6.5, 'Code SWIFT : AGRI FR PP 836', 1, 1, 'C');
|
$this->Cell($ibanWidth, 6.5, 'Code SWIFT : AGRI FR PP867', 1, 1, 'C');
|
||||||
|
|
||||||
//TABLE HT
|
//TABLE HT
|
||||||
$tableWidth = 48; // Largeur totale de la 2e table (20+20)
|
$tableWidth = 48; // Largeur totale de la 2e table (20+20)
|
||||||
@ -429,7 +493,7 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$startOfArrayX = $pageWidth - $tableWidth - $marginRight;
|
$startOfArrayX = $pageWidth - $tableWidth - $marginRight;
|
||||||
$startOfArrayY = $startOfYAfterMainTable + 0.5;
|
$startOfArrayY = $startOfYAfterMainTable + 0.5;
|
||||||
|
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('Arial', '', 10);
|
||||||
$totalPriceArray = $this->totalPrices;
|
$totalPriceArray = $this->totalPrices;
|
||||||
foreach ($totalPriceArray as $label => $price) {
|
foreach ($totalPriceArray as $label => $price) {
|
||||||
$this->SetXY($startOfArrayX, $startOfArrayY);
|
$this->SetXY($startOfArrayX, $startOfArrayY);
|
||||||
@ -448,7 +512,7 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$this->DrawBankAndTotalPriceInfo();
|
$this->DrawBankAndTotalPriceInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
public function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
||||||
{
|
{
|
||||||
// Store reset values for (x,y) positions
|
// Store reset values for (x,y) positions
|
||||||
$x = $this->GetX() + $w;
|
$x = $this->GetX() + $w;
|
||||||
@ -463,19 +527,22 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function NbLines($w, $txt)
|
public function NbLines($w, $txt)
|
||||||
{
|
{
|
||||||
// Compute the number of lines a MultiCell of width w will take
|
// Compute the number of lines a MultiCell of width w will take
|
||||||
if (!isset($this->CurrentFont))
|
if (!isset($this->CurrentFont)) {
|
||||||
$this->Error('No font has been set');
|
$this->Error('No font has been set');
|
||||||
|
}
|
||||||
$cw = $this->CurrentFont['cw'];
|
$cw = $this->CurrentFont['cw'];
|
||||||
if ($w == 0)
|
if ($w == 0) {
|
||||||
$w = $this->w - $this->rMargin - $this->x;
|
$w = $this->w - $this->rMargin - $this->x;
|
||||||
|
}
|
||||||
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
||||||
$s = str_replace("\r", '', (string) $txt);
|
$s = str_replace("\r", '', (string) $txt);
|
||||||
$nb = strlen($s);
|
$nb = strlen($s);
|
||||||
if ($nb > 0 && $s[$nb - 1] == "\n")
|
if ($nb > 0 && $s[$nb - 1] == "\n") {
|
||||||
$nb--;
|
$nb--;
|
||||||
|
}
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$j = 0;
|
$j = 0;
|
||||||
@ -491,22 +558,26 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
$nl++;
|
$nl++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($c == ' ')
|
if ($c == ' ') {
|
||||||
$sep = $i;
|
$sep = $i;
|
||||||
|
}
|
||||||
$l += $cw[$c];
|
$l += $cw[$c];
|
||||||
if ($l > $wmax) {
|
if ($l > $wmax) {
|
||||||
if ($sep == -1) {
|
if ($sep == -1) {
|
||||||
if ($i == $j)
|
if ($i == $j) {
|
||||||
$i++;
|
$i++;
|
||||||
} else
|
}
|
||||||
|
} else {
|
||||||
$i = $sep + 1;
|
$i = $sep + 1;
|
||||||
|
}
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$j = $i;
|
$j = $i;
|
||||||
$l = 0;
|
$l = 0;
|
||||||
$nl++;
|
$nl++;
|
||||||
} else
|
} else {
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return $nl;
|
return $nl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,38 +586,42 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
{
|
{
|
||||||
$k = $this->k;
|
$k = $this->k;
|
||||||
$hp = $this->h;
|
$hp = $this->h;
|
||||||
if ($style == 'F')
|
if ($style == 'F') {
|
||||||
$op = 'f';
|
$op = 'f';
|
||||||
elseif ($style == 'FD' || $style == 'DF')
|
} elseif ($style == 'FD' || $style == 'DF') {
|
||||||
$op = 'B';
|
$op = 'B';
|
||||||
else
|
} else {
|
||||||
$op = 'S';
|
$op = 'S';
|
||||||
|
}
|
||||||
$MyArc = 4 / 3 * (sqrt(2) - 1);
|
$MyArc = 4 / 3 * (sqrt(2) - 1);
|
||||||
$this->_out(sprintf('%.2F %.2F m', ($x + $r) * $k, ($hp - $y) * $k));
|
$this->_out(sprintf('%.2F %.2F m', ($x + $r) * $k, ($hp - $y) * $k));
|
||||||
|
|
||||||
$xc = $x + $w - $r;
|
$xc = $x + $w - $r;
|
||||||
$yc = $y + $r;
|
$yc = $y + $r;
|
||||||
$this->_out(sprintf('%.2F %.2F l', $xc * $k, ($hp - $y) * $k));
|
$this->_out(sprintf('%.2F %.2F l', $xc * $k, ($hp - $y) * $k));
|
||||||
if (strpos($corners, '2') === false)
|
if (strpos($corners, '2') === false) {
|
||||||
$this->_out(sprintf('%.2F %.2F l', ($x + $w) * $k, ($hp - $y) * $k));
|
$this->_out(sprintf('%.2F %.2F l', ($x + $w) * $k, ($hp - $y) * $k));
|
||||||
else
|
} else {
|
||||||
$this->_Arc($xc + $r * $MyArc, $yc - $r, $xc + $r, $yc - $r * $MyArc, $xc + $r, $yc);
|
$this->_Arc($xc + $r * $MyArc, $yc - $r, $xc + $r, $yc - $r * $MyArc, $xc + $r, $yc);
|
||||||
|
}
|
||||||
|
|
||||||
$xc = $x + $w - $r;
|
$xc = $x + $w - $r;
|
||||||
$yc = $y + $h - $r;
|
$yc = $y + $h - $r;
|
||||||
$this->_out(sprintf('%.2F %.2F l', ($x + $w) * $k, ($hp - $yc) * $k));
|
$this->_out(sprintf('%.2F %.2F l', ($x + $w) * $k, ($hp - $yc) * $k));
|
||||||
if (strpos($corners, '3') === false)
|
if (strpos($corners, '3') === false) {
|
||||||
$this->_out(sprintf('%.2F %.2F l', ($x + $w) * $k, ($hp - ($y + $h)) * $k));
|
$this->_out(sprintf('%.2F %.2F l', ($x + $w) * $k, ($hp - ($y + $h)) * $k));
|
||||||
else
|
} else {
|
||||||
$this->_Arc($xc + $r, $yc + $r * $MyArc, $xc + $r * $MyArc, $yc + $r, $xc, $yc + $r);
|
$this->_Arc($xc + $r, $yc + $r * $MyArc, $xc + $r * $MyArc, $yc + $r, $xc, $yc + $r);
|
||||||
|
}
|
||||||
|
|
||||||
$xc = $x + $r;
|
$xc = $x + $r;
|
||||||
$yc = $y + $h - $r;
|
$yc = $y + $h - $r;
|
||||||
$this->_out(sprintf('%.2F %.2F l', $xc * $k, ($hp - ($y + $h)) * $k));
|
$this->_out(sprintf('%.2F %.2F l', $xc * $k, ($hp - ($y + $h)) * $k));
|
||||||
if (strpos($corners, '4') === false)
|
if (strpos($corners, '4') === false) {
|
||||||
$this->_out(sprintf('%.2F %.2F l', ($x) * $k, ($hp - ($y + $h)) * $k));
|
$this->_out(sprintf('%.2F %.2F l', ($x) * $k, ($hp - ($y + $h)) * $k));
|
||||||
else
|
} else {
|
||||||
$this->_Arc($xc - $r * $MyArc, $yc + $r, $xc - $r, $yc + $r * $MyArc, $xc - $r, $yc);
|
$this->_Arc($xc - $r * $MyArc, $yc + $r, $xc - $r, $yc + $r * $MyArc, $xc - $r, $yc);
|
||||||
|
}
|
||||||
|
|
||||||
$xc = $x + $r;
|
$xc = $x + $r;
|
||||||
$yc = $y + $r;
|
$yc = $y + $r;
|
||||||
@ -554,8 +629,9 @@ class InvoiceGroupPdfHandler extends FPDF
|
|||||||
if (strpos($corners, '1') === false) {
|
if (strpos($corners, '1') === false) {
|
||||||
$this->_out(sprintf('%.2F %.2F l', ($x) * $k, ($hp - $y) * $k));
|
$this->_out(sprintf('%.2F %.2F l', ($x) * $k, ($hp - $y) * $k));
|
||||||
$this->_out(sprintf('%.2F %.2F l', ($x + $r) * $k, ($hp - $y) * $k));
|
$this->_out(sprintf('%.2F %.2F l', ($x + $r) * $k, ($hp - $y) * $k));
|
||||||
} else
|
} else {
|
||||||
$this->_Arc($xc - $r, $yc - $r * $MyArc, $xc - $r * $MyArc, $yc - $r, $xc, $yc - $r);
|
$this->_Arc($xc - $r, $yc - $r * $MyArc, $xc - $r * $MyArc, $yc - $r, $xc, $yc - $r);
|
||||||
|
}
|
||||||
$this->_out($op);
|
$this->_out($op);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@ declare(strict_types=1);
|
|||||||
namespace OCA\Gestion\Service;
|
namespace OCA\Gestion\Service;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use \FPDF;
|
use FPDF;
|
||||||
use OCA\Gestion\Constants\MultipleFactureTypeConstant;
|
use OCA\Gestion\Constants\MultipleFactureTypeConstant;
|
||||||
use OCA\Gestion\Helpers\DateHelpers;
|
use OCA\Gestion\Helpers\DateHelpers;
|
||||||
use OCA\Gestion\Helpers\FileExportHelpers;
|
use OCA\Gestion\Helpers\FileExportHelpers;
|
||||||
@ -35,7 +35,6 @@ use OCA\Gestion\Helpers\PriceHelpers;
|
|||||||
|
|
||||||
class InvoicePdfHandler extends FPDF
|
class InvoicePdfHandler extends FPDF
|
||||||
{
|
{
|
||||||
|
|
||||||
private $multipleFactureData = [];
|
private $multipleFactureData = [];
|
||||||
private $factureData = [];
|
private $factureData = [];
|
||||||
private $logo = null;
|
private $logo = null;
|
||||||
@ -49,17 +48,28 @@ class InvoicePdfHandler extends FPDF
|
|||||||
private $articleTablesHeight = 130;
|
private $articleTablesHeight = 130;
|
||||||
|
|
||||||
public $interLigneHeader = 5;
|
public $interLigneHeader = 5;
|
||||||
function Header()
|
public $hasTva = true;
|
||||||
|
|
||||||
|
public function Header()
|
||||||
{
|
{
|
||||||
if ($this->logo != "nothing") {
|
if ($this->logo != "nothing") {
|
||||||
$this->Image($this->logoPath . "logo.png", 2, 10, 75, 25);
|
$this->Image($this->logoPath . "logo.png", 4, 2, 50, 35);
|
||||||
$this->AddWatermark();
|
//$this->AddWatermark();
|
||||||
} else {
|
} else {
|
||||||
$this->Cell(55, 30, '');
|
$this->Cell(55, 30, '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function AddWatermark()
|
public function SafeTextForPdf($text)
|
||||||
|
{
|
||||||
|
if (empty($text)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
$text = html_entity_decode($text, ENT_QUOTES | ENT_HTML401, 'UTF-8');
|
||||||
|
return iconv('UTF-8', 'ISO-8859-1//IGNORE', $text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function AddWatermark()
|
||||||
{
|
{
|
||||||
$this->SetAlpha(0.2);
|
$this->SetAlpha(0.2);
|
||||||
|
|
||||||
@ -82,9 +92,13 @@ class InvoicePdfHandler extends FPDF
|
|||||||
// Ajouter l'image en filigrane
|
// Ajouter l'image en filigrane
|
||||||
$this->Image($imagePath, $x, $y, $width, $height); // Chemin, position x, position y, largeur, hauteur
|
$this->Image($imagePath, $x, $y, $width, $height); // Chemin, position x, position y, largeur, hauteur
|
||||||
$this->SetAlpha(0.1); // Définir l'opacité
|
$this->SetAlpha(0.1); // Définir l'opacité
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function SetAlpha($alpha)
|
public function SetAlpha($alpha)
|
||||||
{
|
{
|
||||||
// Appliquer la transparence au document
|
// Appliquer la transparence au document
|
||||||
$this->SetFillColor(255, 255, 255, $alpha * 255);
|
$this->SetFillColor(255, 255, 255, $alpha * 255);
|
||||||
@ -93,26 +107,28 @@ class InvoicePdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function Footer()
|
public function Footer()
|
||||||
{
|
{
|
||||||
$this->SetY(-34);
|
$this->SetY(-34);
|
||||||
$this->SetFont('ComicSans', '', 7);
|
$this->SetFont('ComicSans', '', 7);
|
||||||
|
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal ')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal '));
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('(Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('(Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.'));
|
||||||
$this->Ln(1);
|
$this->Ln(1);
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire'));
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode('sera due sur présentation de justificatifs (articles L.441-3 et L.441-6 du code de commerce).')));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf('sera due sur présentation de justificatifs (articles L.441-3 et L.441-6 du code de commerce).'));
|
||||||
|
|
||||||
$this->SetY(-10);
|
$this->SetY(-10);
|
||||||
$this->SetFont('ComicSans', '', 7);
|
$this->SetFont('ComicSans', '', 7);
|
||||||
$this->Cell(0, 10, utf8_decode(html_entity_decode($this->factureData['configuration']->legal_one)), 0, 0, 'C');
|
$this->Cell(0, 10, $this->SafeTextForPdf($this->factureData['configuration']->legal_one), 0, 0, 'C');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function InvoicePdfFactory(array $factureData, $logo = null)
|
public function InvoicePdfFactory(array $factureData, $logo = null)
|
||||||
{
|
{
|
||||||
$this->factureData = $factureData;
|
$this->factureData = $factureData;
|
||||||
$this->logo = $logo;
|
$this->logo = $logo;
|
||||||
|
// Déterminer si la TVA est applicable
|
||||||
|
$this->hasTva = isset($factureData['is_tva']) ? $factureData['is_tva'] : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function MutlipleInvoicePdfFactory(array $multipleInvoiceData, $logo = null)
|
public function MutlipleInvoicePdfFactory(array $multipleInvoiceData, $logo = null)
|
||||||
@ -156,6 +172,7 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Tél : ') . FileExportHelpers::FormatTextForExport($this->factureData['configuration']->telephone), 0, 1);
|
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Tél : ') . FileExportHelpers::FormatTextForExport($this->factureData['configuration']->telephone), 0, 1);
|
||||||
$this->Cell(0, $this->interLigneHeader, 'Mail : ' . $this->factureData['configuration']->mail, 0, 1);
|
$this->Cell(0, $this->interLigneHeader, 'Mail : ' . $this->factureData['configuration']->mail, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawInvoiceClientInfo()
|
private function DrawInvoiceClientInfo()
|
||||||
{
|
{
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('ComicSans', '', 10);
|
||||||
@ -204,7 +221,17 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$this->Cell(0, $this->interLigneHeader, trim(FileExportHelpers::FormatTextForExport($this->factureData['client_adress_city'])));
|
$this->Cell(0, $this->interLigneHeader, trim(FileExportHelpers::FormatTextForExport($this->factureData['client_adress_city'])));
|
||||||
$clientInfoYAxis += $this->interLigneHeader;
|
$clientInfoYAxis += $this->interLigneHeader;
|
||||||
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
||||||
|
|
||||||
|
// Gestion Siret ou TVA intracommunautaire selon is_tva
|
||||||
|
if ($this->hasTva) {
|
||||||
|
// Avec TVA : afficher le Siret
|
||||||
$this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']);
|
$this->Cell(0, $this->interLigneHeader, 'Siret: ' . $this->factureData['siret']);
|
||||||
|
} else {
|
||||||
|
// Sans TVA : afficher N° TVA intracommunautaire
|
||||||
|
$tvaIntracommu = isset($this->factureData['client_tva_intracommu']) ? $this->factureData['client_tva_intracommu'] : '';
|
||||||
|
$this->Cell(0, $this->interLigneHeader, 'TVA intracom : ' . $tvaIntracommu);
|
||||||
|
}
|
||||||
|
|
||||||
$clientInfoYAxis += $this->interLigneHeader;
|
$clientInfoYAxis += $this->interLigneHeader;
|
||||||
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
$this->SetXY($clientInfoXAxis, $clientInfoYAxis);
|
||||||
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Mail : ') . $this->factureData['client_mail']);
|
$this->Cell(0, $this->interLigneHeader, FileExportHelpers::FormatTextForExport('Mail : ') . $this->factureData['client_mail']);
|
||||||
@ -237,7 +264,7 @@ class InvoicePdfHandler extends FPDF
|
|||||||
|
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('ComicSans', '', 10);
|
||||||
$this->Cell(25, 7, $factureDatePaiement, 1, 0, 'C');
|
$this->Cell(25, 7, $factureDatePaiement, 1, 0, 'C');
|
||||||
$this->Cell(104, 7, utf8_decode(html_entity_decode($this->factureData['client_nom'])), 1, 0, 'C');
|
$this->Cell(104, 7, $this->SafeTextForPdf($this->factureData['client_nom']), 1, 0, 'C');
|
||||||
$this->Cell(39, 7, $this->factureData['num'], 1, 0, 'C');
|
$this->Cell(39, 7, $this->factureData['num'], 1, 0, 'C');
|
||||||
$this->Cell(36, 7, $factureDateEcheance, 1, 1, 'C');
|
$this->Cell(36, 7, $factureDateEcheance, 1, 1, 'C');
|
||||||
|
|
||||||
@ -276,8 +303,13 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$endingLine = $this->thereIsOrderOrCaseNumber ? 231 : 230; // mois +1 pour le groupe
|
$endingLine = $this->thereIsOrderOrCaseNumber ? 231 : 230; // mois +1 pour le groupe
|
||||||
$this->Line(27 + $additionalMargRight, $this->startingYOfArticlesTable, 27 + $additionalMargRight, $endingLine);
|
$this->Line(27 + $additionalMargRight, $this->startingYOfArticlesTable, 27 + $additionalMargRight, $endingLine);
|
||||||
$this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine);
|
$this->Line(142 + $additionalMargRight, $this->startingYOfArticlesTable, 142 + $additionalMargRight, $endingLine);
|
||||||
|
|
||||||
|
if ($this->hasTva) {
|
||||||
$this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine);
|
$this->Line(164 + $additionalMargRight, $this->startingYOfArticlesTable, 164 + $additionalMargRight, $endingLine);
|
||||||
$this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine);
|
$this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine);
|
||||||
|
} else {
|
||||||
|
$this->Line(182 + $additionalMargRight, $this->startingYOfArticlesTable, 182 + $additionalMargRight, $endingLine);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawArticlesTableHeader()
|
private function DrawArticlesTableHeader()
|
||||||
@ -287,7 +319,7 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$columnNameY = $this->startingYOfArticlesTable - 1;
|
$columnNameY = $this->startingYOfArticlesTable - 1;
|
||||||
$this->SetFont('ComicSans', '', 10);
|
$this->SetFont('ComicSans', '', 10);
|
||||||
$this->SetXY(12 + $additionalMargRight, $columnNameY);
|
$this->SetXY(12 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(7, 10, "Date", 0, 0, 'C');
|
$this->Cell(7, 10, "", 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(30 + $additionalMargRight, $columnNameY);
|
$this->SetXY(30 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(100, 10, "Description", 0, 0, 'C');
|
$this->Cell(100, 10, "Description", 0, 0, 'C');
|
||||||
@ -295,11 +327,16 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$this->SetXY(143 + $additionalMargRight, $columnNameY);
|
$this->SetXY(143 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C');
|
$this->Cell(20, 10, "Prix Uni. HT", 0, 0, 'C');
|
||||||
|
|
||||||
|
if ($this->hasTva) {
|
||||||
$this->SetXY(163 + $additionalMargRight, $columnNameY);
|
$this->SetXY(163 + $additionalMargRight, $columnNameY);
|
||||||
$this->Cell(20, 10, 'TVA ' . $tvaValue . '%', 0, 0, 'C');
|
$this->Cell(20, 10, 'TVA ' . $tvaValue . '%', 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(185, $columnNameY);
|
$this->SetXY(185, $columnNameY);
|
||||||
$this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C');
|
$this->Cell(20, 10, "Prix Uni. TTC", 0, 0, 'C');
|
||||||
|
} else {
|
||||||
|
$this->SetXY(185, $columnNameY);
|
||||||
|
$this->Cell(20, 10, "Montant HT", 0, 0, 'C');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function DrawArticlesTableValueAndReturnTotalPrice()
|
public function DrawArticlesTableValueAndReturnTotalPrice()
|
||||||
@ -315,44 +352,67 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$products = $this->factureData["products"];
|
$products = $this->factureData["products"];
|
||||||
$yValue = $this->startingYOfArticlesTable + 13;
|
$yValue = $this->startingYOfArticlesTable + 13;
|
||||||
$maxDescriptionWidth = 102;
|
$maxDescriptionWidth = 102;
|
||||||
foreach ($products as $product) {
|
|
||||||
|
|
||||||
|
|
||||||
|
foreach ($products as $product) {
|
||||||
$valueHt = $product['produit_price'] * $product['quantite'];
|
$valueHt = $product['produit_price'] * $product['quantite'];
|
||||||
|
|
||||||
|
if ($this->hasTva) {
|
||||||
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue);
|
$valueTtc = PriceHelpers::calculPriceWithVatValue($valueHt, $tvaValue);
|
||||||
|
$tvaAmount = $valueTtc - $valueHt;
|
||||||
|
} else {
|
||||||
|
$valueTtc = $valueHt; // Sans TVA, TTC = HT
|
||||||
|
$tvaAmount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
$totalHt += $valueHt;
|
$totalHt += $valueHt;
|
||||||
$totalTtc += $valueTtc;
|
$totalTtc += $valueTtc;
|
||||||
$productDescription = $product["produit_description"];
|
$productDescription = $product["produit_description"];
|
||||||
$dateValue = "";
|
$dateValue = "";
|
||||||
|
|
||||||
if ($product === end($products)) {
|
if ($product === end($products)) {
|
||||||
$dateValue = $devisDate;
|
$dateValue = $devisDate;
|
||||||
$productDescription .= " de " . FileExportHelpers::GetSexeLabel($this->factureData['defunt_sexe']) . ' ' . $this->factureData["defunt_nom"];
|
$productDescription .= " de " . FileExportHelpers::GetSexeLabel($this->factureData['defunt_sexe']) . ' ' . $this->factureData["defunt_nom"];
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
$tvaAmount = $valueTtc - $valueHt;
|
|
||||||
$this->SetXY(5, $yValue);
|
$this->SetXY(5, $yValue);
|
||||||
$this->Cell(5, 6, $dateValue, 0, 0);
|
$this->Cell(5, 6, $dateValue, 0, 0);
|
||||||
|
|
||||||
$this->SetXY(30, $yValue);
|
$this->SetXY(30, $yValue);
|
||||||
$this->MultiAlignCell($maxDescriptionWidth, 6, utf8_decode(html_entity_decode($productDescription)), 0, '0', );
|
$this->MultiAlignCell($maxDescriptionWidth, 6, $this->SafeTextForPdf($productDescription), 0, '0', );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$this->SetXY(144, $yValue);
|
$this->SetXY(144, $yValue);
|
||||||
$this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C');
|
$this->Cell(20, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 0, 'C');
|
||||||
|
|
||||||
|
if ($this->hasTva) {
|
||||||
$this->SetXY(165, $yValue);
|
$this->SetXY(165, $yValue);
|
||||||
$this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C');
|
$this->Cell(20, 6, number_format($tvaAmount, 2, '.', '') . chr(128), 0, 0, 'C');
|
||||||
|
|
||||||
$this->SetXY(182, $yValue);
|
$this->SetXY(182, $yValue);
|
||||||
$this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C');
|
$this->Cell(25, 6, number_format($valueTtc, 2, '.', '') . chr(128), 0, 1, 'C');
|
||||||
|
} else {
|
||||||
|
$this->SetXY(182, $yValue);
|
||||||
|
$this->Cell(25, 6, number_format($valueHt, 2, '.', '') . chr(128), 0, 1, 'C');
|
||||||
|
}
|
||||||
|
|
||||||
$yValue += 12;
|
$yValue += 12;
|
||||||
$totalTva += $tvaAmount;
|
$totalTva += $tvaAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Construction du tableau de retour selon hasTva
|
||||||
|
if ($this->hasTva) {
|
||||||
return [
|
return [
|
||||||
"TOTAL HT" => $totalHt,
|
"TOTAL HT" => $totalHt,
|
||||||
"TVA " . $tvaValue . "%" => $totalTva,
|
"TVA " . $tvaValue . "%" => $totalTva,
|
||||||
"TOTAL TTC" => $totalTtc
|
"TOTAL TTC" => $totalTtc
|
||||||
];
|
];
|
||||||
|
} else {
|
||||||
|
return [
|
||||||
|
"TOTAL HT" => $totalHt
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function DrawBankAndTotalPriceInfo($totalPriceArray)
|
private function DrawBankAndTotalPriceInfo($totalPriceArray)
|
||||||
@ -360,8 +420,8 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$startOfYAfterMainTable = 236;
|
$startOfYAfterMainTable = 236;
|
||||||
$this->SetY($startOfYAfterMainTable);
|
$this->SetY($startOfYAfterMainTable);
|
||||||
$this->SetFont('ComicSans', '', 8);
|
$this->SetFont('ComicSans', '', 8);
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode("Paiement à votre convenance par chèque à l'ordre de " . $this->factureData['configuration']->entreprise)));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf("Paiement à votre convenance par chèque à l'ordre de " . $this->factureData['configuration']->entreprise));
|
||||||
$this->MultiCell(0, 4, utf8_decode(html_entity_decode("en indiquant le numéro de facture, ou par virement :")));
|
$this->MultiCell(0, 4, $this->SafeTextForPdf("en indiquant le numéro de facture, ou par virement :"));
|
||||||
|
|
||||||
$this->Ln(1);
|
$this->Ln(1);
|
||||||
$startOftable = 3;
|
$startOftable = 3;
|
||||||
@ -413,7 +473,7 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$this->DrawBankAndTotalPriceInfo($totalPriceValue);
|
$this->DrawBankAndTotalPriceInfo($totalPriceValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
public function MultiAlignCell($w, $h, $text, $border = 0, $ln = 0, $align = 'L', $fill = false)
|
||||||
{
|
{
|
||||||
// Store reset values for (x,y) positions
|
// Store reset values for (x,y) positions
|
||||||
$x = $this->GetX() + $w;
|
$x = $this->GetX() + $w;
|
||||||
@ -428,19 +488,22 @@ class InvoicePdfHandler extends FPDF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function NbLines($w, $txt)
|
public function NbLines($w, $txt)
|
||||||
{
|
{
|
||||||
// Compute the number of lines a MultiCell of width w will take
|
// Compute the number of lines a MultiCell of width w will take
|
||||||
if (!isset($this->CurrentFont))
|
if (!isset($this->CurrentFont)) {
|
||||||
$this->Error('No font has been set');
|
$this->Error('No font has been set');
|
||||||
|
}
|
||||||
$cw = $this->CurrentFont['cw'];
|
$cw = $this->CurrentFont['cw'];
|
||||||
if ($w == 0)
|
if ($w == 0) {
|
||||||
$w = $this->w - $this->rMargin - $this->x;
|
$w = $this->w - $this->rMargin - $this->x;
|
||||||
|
}
|
||||||
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
$wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
|
||||||
$s = str_replace("\r", '', (string) $txt);
|
$s = str_replace("\r", '', (string) $txt);
|
||||||
$nb = strlen($s);
|
$nb = strlen($s);
|
||||||
if ($nb > 0 && $s[$nb - 1] == "\n")
|
if ($nb > 0 && $s[$nb - 1] == "\n") {
|
||||||
$nb--;
|
$nb--;
|
||||||
|
}
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$i = 0;
|
$i = 0;
|
||||||
$j = 0;
|
$j = 0;
|
||||||
@ -456,22 +519,26 @@ class InvoicePdfHandler extends FPDF
|
|||||||
$nl++;
|
$nl++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($c == ' ')
|
if ($c == ' ') {
|
||||||
$sep = $i;
|
$sep = $i;
|
||||||
|
}
|
||||||
$l += $cw[$c];
|
$l += $cw[$c];
|
||||||
if ($l > $wmax) {
|
if ($l > $wmax) {
|
||||||
if ($sep == -1) {
|
if ($sep == -1) {
|
||||||
if ($i == $j)
|
if ($i == $j) {
|
||||||
$i++;
|
$i++;
|
||||||
} else
|
}
|
||||||
|
} else {
|
||||||
$i = $sep + 1;
|
$i = $sep + 1;
|
||||||
|
}
|
||||||
$sep = -1;
|
$sep = -1;
|
||||||
$j = $i;
|
$j = $i;
|
||||||
$l = 0;
|
$l = 0;
|
||||||
$nl++;
|
$nl++;
|
||||||
} else
|
} else {
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return $nl;
|
return $nl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,21 +27,24 @@ declare(strict_types=1);
|
|||||||
namespace OCA\Gestion\Service;
|
namespace OCA\Gestion\Service;
|
||||||
|
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use OCA\Gestion\Constants\BddConstant;
|
use Exception;
|
||||||
use OCA\Gestion\Constants\ClientTemplateTypeConstant;
|
|
||||||
use OCA\Gestion\Constants\DevisMentionConstant;
|
|
||||||
use OCA\Gestion\Constants\FactureTypeConstant;
|
|
||||||
use OCA\Gestion\Constants\MultipleFactureTypeConstant;
|
|
||||||
use OCA\Gestion\Db\Bdd;
|
use OCA\Gestion\Db\Bdd;
|
||||||
use OCA\Gestion\Helpers\DateHelpers;
|
|
||||||
use OCA\Gestion\Service\InvoiceGroupPdfHandler\InvoiceFunecapPdfHandler;
|
|
||||||
use OCA\Gestion\Service\InvoiceGroupPdfHandler\InvoiceGroupPdfHandler;
|
|
||||||
use OCA\Gestion\Service\InvoiceGroupPdfHandler\InvoiceOgfPdfHandler;
|
|
||||||
use OCA\Gestion\Service\InvoiceRecap\InvoiceRecapService;
|
|
||||||
use OCP\DB\Exception;
|
|
||||||
use OCP\Files\IRootFolder;
|
use OCP\Files\IRootFolder;
|
||||||
|
use OCA\Gestion\Helpers\DateHelpers;
|
||||||
|
use OCA\Gestion\Constants\BddConstant;
|
||||||
|
use OCA\Gestion\Service\HtmlToPdfService;
|
||||||
|
use OCA\Gestion\Exception\TemplateException;
|
||||||
|
use OCA\Gestion\Constants\FactureTypeConstant;
|
||||||
|
use OCA\Gestion\Constants\DevisMentionConstant;
|
||||||
|
use OCA\Gestion\Constants\ClientTemplateTypeConstant;
|
||||||
|
use OCA\Gestion\Constants\MultipleFactureTypeConstant;
|
||||||
|
use OCA\Gestion\Service\InvoiceRecap\InvoiceRecapService;
|
||||||
|
use OCA\Gestion\Service\InvoiceGroupPdfHandler\InvoiceOgfPdfHandler;
|
||||||
|
use OCA\Gestion\Service\InvoiceGroupPdfHandler\InvoiceGroupPdfHandler;
|
||||||
|
use OCA\Gestion\Service\InvoiceGroupPdfHandler\InvoiceFunecapPdfHandler;
|
||||||
|
|
||||||
class InvoicePdfService {
|
class InvoicePdfService
|
||||||
|
{
|
||||||
/** @var Bdd */
|
/** @var Bdd */
|
||||||
private $gestionBdd;
|
private $gestionBdd;
|
||||||
|
|
||||||
@ -51,72 +54,66 @@ class InvoicePdfService {
|
|||||||
/** @var InvoiceRecapService */
|
/** @var InvoiceRecapService */
|
||||||
private $invoiceRecapService;
|
private $invoiceRecapService;
|
||||||
|
|
||||||
|
private $htmlToPdfService;
|
||||||
|
|
||||||
private const DEFAULT_NEXTCLOUD_ADMIN = "admin";
|
private const DEFAULT_NEXTCLOUD_ADMIN = "admin";
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Bdd $gestionBdd,
|
Bdd $gestionBdd,
|
||||||
IRootFolder $rootFolder,
|
IRootFolder $rootFolder,
|
||||||
InvoiceRecapService $invoiceRecapService) {
|
InvoiceRecapService $invoiceRecapService
|
||||||
|
) {
|
||||||
$this->gestionBdd = $gestionBdd;
|
$this->gestionBdd = $gestionBdd;
|
||||||
$this->rootFolder = $rootFolder;
|
$this->rootFolder = $rootFolder;
|
||||||
$this->invoiceRecapService = $invoiceRecapService;
|
$this->invoiceRecapService = $invoiceRecapService;
|
||||||
|
$this->htmlToPdfService = new HtmlToPdfService();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getLogo(){
|
private function getLogo()
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
$storage = $this->rootFolder->getUserFolder(self::DEFAULT_NEXTCLOUD_ADMIN);
|
||||||
try{
|
|
||||||
try {
|
try {
|
||||||
if(isset($storage)){
|
try {
|
||||||
|
if(isset($storage)) {
|
||||||
$file = $storage->get('/.gestion/logo.png');
|
$file = $storage->get('/.gestion/logo.png');
|
||||||
}else{
|
} else {
|
||||||
return "nothing";
|
return "nothing";
|
||||||
}
|
}
|
||||||
} catch(\OCP\Files\NotFoundException $e) {
|
} catch(\OCP\Files\NotFoundException $e) {
|
||||||
$file = $storage->get('/.gestion/logo.jpeg');
|
$file = $storage->get('/.gestion/logo.jpeg');
|
||||||
}
|
}
|
||||||
}
|
} catch(\OCP\Files\NotFoundException $e) {
|
||||||
catch(\OCP\Files\NotFoundException $e) {
|
|
||||||
return "nothing";
|
return "nothing";
|
||||||
}
|
}
|
||||||
|
|
||||||
return base64_encode($file->getContent());
|
return base64_encode($file->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function generateFactureSinglePdfByFactureId($factureId,$idNextCloud){
|
private function generateFactureSinglePdfByFactureId($factureId, $idNextCloud)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
$invoicePdfData = $this->gestionBdd->getInvoicePdfData($factureId,$currentConfig);
|
$invoicePdfData = $this->gestionBdd->getInvoicePdfData($factureId, $currentConfig);
|
||||||
if($invoicePdfData == null){
|
if($invoicePdfData == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$clean_folder = html_entity_decode(string: $currentConfig->path).'/';
|
$clean_folder = html_entity_decode(string: $currentConfig->path).'/';
|
||||||
$factureFolders = $this->getFacturesFolder($invoicePdfData,$clean_folder);
|
$factureFolders = $this->getFacturesFolder($invoicePdfData, $clean_folder);
|
||||||
$pdf = new InvoicePdfHandler();
|
$pdf = new InvoicePdfHandler();
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$pdf->InvoicePdfFactory($invoicePdfData,$logo);
|
$pdf->InvoicePdfFactory($invoicePdfData, $logo);
|
||||||
$pdf->SetFactureContent();
|
$pdf->SetFactureContent();
|
||||||
$pdfContent = $pdf->Output('','S');
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
$pdfFilename = $pdf->GetInvoiceFilename();
|
$pdfFilename = $pdf->GetInvoiceFilename();
|
||||||
$prefixPdf = "FACTURE";
|
$prefixPdf = "FACTURE";
|
||||||
if($invoicePdfData['is_negative']){
|
if($invoicePdfData['is_negative']) {
|
||||||
$prefixPdf = "AVOIR";
|
$prefixPdf = "AVOIR";
|
||||||
}
|
}
|
||||||
$pdfFilename = $prefixPdf."_".$pdfFilename;
|
$pdfFilename = $prefixPdf."_".$pdfFilename;
|
||||||
$filenames = [];
|
$filenames = [];
|
||||||
foreach($factureFolders as $folder){
|
$filenames = $this->savePdfToFolders($factureFolders, $pdfFilename, $pdfContent, $storage);
|
||||||
try {
|
|
||||||
$storage->newFolder($folder);
|
|
||||||
}
|
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
|
||||||
}
|
|
||||||
$ff_pdf = $folder.$pdfFilename.'.pdf';
|
|
||||||
$storage->newFile($ff_pdf);
|
|
||||||
$file_pdf = $storage->get($ff_pdf);
|
|
||||||
$file_pdf->putContent($pdfContent);
|
|
||||||
$filenames[] = $ff_pdf;
|
|
||||||
}
|
|
||||||
$this->gestionBdd->setFactureGeneratedDate($factureId);
|
$this->gestionBdd->setFactureGeneratedDate($factureId);
|
||||||
return [
|
return [
|
||||||
"content" => $pdfContent,
|
"content" => $pdfContent,
|
||||||
@ -124,18 +121,19 @@ class InvoicePdfService {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateFacturePdfByFactureId($factureId,$idNextCloud){
|
public function generateFacturePdfByFactureId($factureId, $idNextCloud)
|
||||||
|
{
|
||||||
$factureType = $this->gestionBdd->getFactureTypeByFactureId($factureId);
|
$factureType = $this->gestionBdd->getFactureTypeByFactureId($factureId);
|
||||||
if($factureType == FactureTypeConstant::TYPE_SINGLE){
|
if($factureType == FactureTypeConstant::TYPE_SINGLE) {
|
||||||
return $this->generateFactureSinglePdfByFactureId($factureId,$idNextCloud);
|
return $this->generateFactureSinglePdfByFactureId($factureId, $idNextCloud);
|
||||||
}
|
} else {
|
||||||
else{
|
return $this->generateFactureGroupPdfByFactureId($factureId, $idNextCloud);
|
||||||
return $this->generateFactureGroupPdfByFactureId($factureId,$idNextCloud);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getGroupFactureFolder(array $factureData,$racinePath){
|
private function getGroupFactureFolder(array $factureData, $racinePath)
|
||||||
$clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($factureData["group_name"],'UTF-8').'/';
|
{
|
||||||
|
$clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($factureData["group_name"], 'UTF-8').'/';
|
||||||
$factureDate = $factureData['date_paiement'];
|
$factureDate = $factureData['date_paiement'];
|
||||||
$factureDatetime = new DateTime($factureDate);
|
$factureDatetime = new DateTime($factureDate);
|
||||||
$factureDateYear = $factureDatetime->format('Y');
|
$factureDateYear = $factureDatetime->format('Y');
|
||||||
@ -146,9 +144,10 @@ class InvoicePdfService {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getFacturesFolder(array $factureData,$racinePath){
|
private function getFacturesFolder(array $factureData, $racinePath)
|
||||||
$clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($factureData["client_nom"],'UTF-8').'/';
|
{
|
||||||
$defuntsFolder = $clientRacineFolder.'DEFUNTS/'.mb_strtoupper($factureData['defunt_nom'],'UTF-8').'/'.'FACTURES'.'/';
|
$clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($factureData["client_nom"], 'UTF-8').'/';
|
||||||
|
$defuntsFolder = $clientRacineFolder.'DEFUNTS/'.mb_strtoupper($factureData['defunt_nom'], 'UTF-8').'/'.'FACTURES'.'/';
|
||||||
$devisDate = $factureData['devis_date'];
|
$devisDate = $factureData['devis_date'];
|
||||||
$devisDatetime = new DateTime($devisDate);
|
$devisDatetime = new DateTime($devisDate);
|
||||||
$devisDateYear = $devisDatetime->format('Y');
|
$devisDateYear = $devisDatetime->format('Y');
|
||||||
@ -160,18 +159,25 @@ class InvoicePdfService {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
private function generateFactureGroupPdfByFactureId($factureId,$idNextCloud){
|
private function generateFactureGroupPdfByFactureId($factureId, $idNextCloud)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
$invoicePdfData = $this->gestionBdd->getInvoiceGroupPdfData($factureId,$currentConfig);
|
$invoicePdfData = $this->gestionBdd->getInvoiceGroupPdfData($factureId, $currentConfig);
|
||||||
if($invoicePdfData == null){
|
if($invoicePdfData == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOUVELLE LOGIQUE : Vérifier si TVA exonérée
|
||||||
|
/*if ($this->isTvaExempt($invoicePdfData)) {
|
||||||
|
return $this->generateWithHtmlTemplate($invoicePdfData, $storage);
|
||||||
|
}*/
|
||||||
|
|
||||||
$templateType = $invoicePdfData['template_type_key'];
|
$templateType = $invoicePdfData['template_type_key'];
|
||||||
$clean_folder = html_entity_decode(string: $currentConfig->path).'/';
|
$clean_folder = html_entity_decode(string: $currentConfig->path).'/';
|
||||||
$factureFolders = $this->getGroupFactureFolder($invoicePdfData,$clean_folder);
|
$factureFolders = $this->getGroupFactureFolder($invoicePdfData, $clean_folder);
|
||||||
//For testing
|
//For testing
|
||||||
// $templateType = ClientTemplateTypeConstant::OGF;
|
// $templateType = ClientTemplateTypeConstant::OGF;
|
||||||
|
|
||||||
@ -188,25 +194,14 @@ class InvoicePdfService {
|
|||||||
$pdf = new InvoiceGroupPdfHandler();
|
$pdf = new InvoiceGroupPdfHandler();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$pdf->InvoicePdfFactory($invoicePdfData,$logo);
|
$pdf->InvoicePdfFactory($invoicePdfData, $logo);
|
||||||
$pdf->SetFactureContent();
|
$pdf->SetFactureContent();
|
||||||
$pdfContent = $pdf->Output('','S');
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
$pdfFilename = $pdf->GetInvoiceFilename();
|
$pdfFilename = $pdf->GetInvoiceFilename();
|
||||||
$filenames = [];
|
$filenames = [];
|
||||||
foreach($factureFolders as $folder){
|
$filenames = $this->savePdfToFolders($factureFolders, $pdfFilename, $pdfContent, $storage);
|
||||||
try {
|
|
||||||
$storage->newFolder($folder);
|
|
||||||
}
|
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
|
||||||
}
|
|
||||||
$ff_pdf = $folder.$pdfFilename.'.pdf';
|
|
||||||
$storage->newFile($ff_pdf);
|
|
||||||
$file_pdf = $storage->get($ff_pdf);
|
|
||||||
$file_pdf->putContent($pdfContent);
|
|
||||||
$filenames[] = $ff_pdf;
|
|
||||||
}
|
|
||||||
$this->gestionBdd->setFactureGeneratedDate($factureId);
|
$this->gestionBdd->setFactureGeneratedDate($factureId);
|
||||||
return [
|
return [
|
||||||
"content" => $pdfContent,
|
"content" => $pdfContent,
|
||||||
@ -214,54 +209,64 @@ class InvoicePdfService {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateFacturePdfByFactureIds(array $factureIds,$idNextCloud){
|
public function sanitizePathDev(string $path): string
|
||||||
foreach( $factureIds as $factureId ){
|
{
|
||||||
$this->generateFacturePdfByFactureId($factureId,$idNextCloud);
|
$path = ltrim($path, '/');
|
||||||
|
// Remplacer accents UTF-8 par ASCII
|
||||||
|
$path = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $path);
|
||||||
|
// Supprimer caractères interdits par Nextcloud/Docker
|
||||||
|
$path = preg_replace('#[<>:"/\\|?*]#', '_', $path);
|
||||||
|
// Supprimer doublons d'espaces
|
||||||
|
$path = preg_replace('#\s+#', ' ', $path);
|
||||||
|
return trim($path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function generateFacturePdfByFactureIds(array $factureIds, $idNextCloud)
|
||||||
|
{
|
||||||
|
foreach($factureIds as $factureId) {
|
||||||
|
$this->generateFacturePdfByFactureId($factureId, $idNextCloud);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateMultipleInvoicePdfByClientAndMonthYear($filter,$month,$year,$idNextCloud,$filterType){
|
public function generateMultipleInvoicePdfByClientAndMonthYear($filter, $month, $year, $idNextCloud, $filterType)
|
||||||
|
{
|
||||||
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
$storage = $this->rootFolder->getUserFolder($idNextCloud);
|
||||||
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
$configs = json_decode($this->gestionBdd->getConfiguration(self::DEFAULT_NEXTCLOUD_ADMIN));
|
||||||
$currentConfig = $configs[0];
|
$currentConfig = $configs[0];
|
||||||
$logo = $this->getLogo();
|
$logo = $this->getLogo();
|
||||||
$invoiceData = $this->gestionBdd->getInvoicePdfDataByClientAndMonthYear($filter,$month,$year,$currentConfig,$filterType);
|
$invoiceData = $this->gestionBdd->getInvoicePdfDataByClientAndMonthYear($filter, $month, $year, $currentConfig, $filterType);
|
||||||
if(empty($invoiceData)){
|
if(empty($invoiceData)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
$pdf = new InvoicePdfHandler();
|
$pdf = new InvoicePdfHandler();
|
||||||
$pdf->AddFont('ComicSans','','Comic Sans MS.php');
|
$pdf->AddFont('ComicSans', '', 'Comic Sans MS.php');
|
||||||
$pdf->AddFont('ComicSans','B','comic-sans-bold.php');
|
$pdf->AddFont('ComicSans', 'B', 'comic-sans-bold.php');
|
||||||
$pdf->MutlipleInvoicePdfFactory($invoiceData,$logo);
|
$pdf->MutlipleInvoicePdfFactory($invoiceData, $logo);
|
||||||
$pdf->SetMultipleFactureContent();
|
$pdf->SetMultipleFactureContent();
|
||||||
$racinePath = html_entity_decode(string: $currentConfig->path).'/';
|
$racinePath = html_entity_decode(string: $currentConfig->path).'/';
|
||||||
$clientNameInFolder = $invoiceData[0]["client_nom"];
|
$clientNameInFolder = $invoiceData[0]["client_nom"];
|
||||||
if($invoiceData[0]['facture_type'] == MultipleFactureTypeConstant::GROUP_FILTER_TYPE){
|
if($invoiceData[0]['facture_type'] == MultipleFactureTypeConstant::GROUP_FILTER_TYPE) {
|
||||||
if($invoiceData[0]["group_name"] != null && $invoiceData[0]["group_name"] != ""){
|
if($invoiceData[0]["group_name"] != null && $invoiceData[0]["group_name"] != "") {
|
||||||
$clientNameInFolder = $invoiceData[0]["group_name"];
|
$clientNameInFolder = $invoiceData[0]["group_name"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($clientNameInFolder,'UTF-8').'/';
|
$clientRacineFolder = $racinePath.'CLIENTS/'.mb_strtoupper($clientNameInFolder, 'UTF-8').'/';
|
||||||
$filename = "FACTURE".'_'.$pdf->GetMultipleInvoiceFilename($month,$year);
|
$filename = "FACTURE".'_'.$pdf->GetMultipleInvoiceFilename($month, $year);
|
||||||
$filenamePath = $clientRacineFolder.$filename.'.pdf';
|
$pdfContent = $pdf->Output('', 'S');
|
||||||
$pdfContent = $pdf->Output('','S');
|
$singleFolderArray = [$clientRacineFolder];
|
||||||
|
$filenames = $this->savePdfToFolders($singleFolderArray, $filename, $pdfContent, $storage);
|
||||||
|
return $filenames[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function generateInvoiceRecap($filter, $filterType, $date, $idNextCloud)
|
||||||
|
{
|
||||||
|
$this->invoiceRecapService->generateInvoiceRecap($filter, $filterType, $date, $idNextCloud);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function exportGroupOfDevisIntoFacture($clientId, $clientType, $month, $year, $facturationDate, $idNextcloud = BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD)
|
||||||
|
{
|
||||||
try {
|
try {
|
||||||
$storage->newFolder($clientRacineFolder);
|
|
||||||
}
|
|
||||||
catch(\OCP\Files\NotPermittedException $e) {
|
|
||||||
}
|
|
||||||
$storage->newFile($filenamePath);
|
|
||||||
$file_pdf = $storage->get($filenamePath);
|
|
||||||
$file_pdf->putContent($pdfContent);
|
|
||||||
return $filenamePath;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function generateInvoiceRecap($filter,$filterType,$date,$idNextCloud){
|
|
||||||
$this->invoiceRecapService->generateInvoiceRecap($filter,$filterType,$date,$idNextCloud);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function exportGroupOfDevisIntoFacture($clientId,$clientType,$month,$year,$facturationDate,$idNextcloud = BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD){
|
|
||||||
try{
|
|
||||||
$datetime = new Datetime();
|
$datetime = new Datetime();
|
||||||
$month = $month ?? $datetime->format('m');
|
$month = $month ?? $datetime->format('m');
|
||||||
$year = $year ?? $datetime->format('Y');
|
$year = $year ?? $datetime->format('Y');
|
||||||
@ -277,15 +282,15 @@ class InvoicePdfService {
|
|||||||
//Si il a devis qui n est pas encore facturés
|
//Si il a devis qui n est pas encore facturés
|
||||||
//Cree un facture, atttaché l ID du facture au devis et generer le pdf
|
//Cree un facture, atttaché l ID du facture au devis et generer le pdf
|
||||||
|
|
||||||
if($clientType == MultipleFactureTypeConstant::CLIENT_FILTER_TYPE){
|
if($clientType == MultipleFactureTypeConstant::CLIENT_FILTER_TYPE) {
|
||||||
$devisIds = $this->gestionBdd->getDevisIdsByClientIdAndDate($clientId,$facturationDate,$devisMentionFiltersToBeInvoiced);
|
$devisIds = $this->gestionBdd->getDevisIdsByClientIdAndDate($clientId, $facturationDate, $devisMentionFiltersToBeInvoiced);
|
||||||
$fkClientId = $clientId;
|
$fkClientId = $clientId;
|
||||||
$factureId = $this->gestionBdd->getFactureIdByClientIdAndDate($clientId,$facturationDate);
|
$factureId = $this->gestionBdd->getFactureIdByClientIdAndDate($clientId, $facturationDate);
|
||||||
|
|
||||||
}else{
|
} else {
|
||||||
$devisIds = $this->gestionBdd->getDevisIdsByClientGroupFacturationIdAnDate($clientId , $facturationDate , $devisMentionFiltersToBeInvoiced );
|
$devisIds = $this->gestionBdd->getDevisIdsByClientGroupFacturationIdAnDate($clientId, $facturationDate, $devisMentionFiltersToBeInvoiced);
|
||||||
$fkClientGroupFacturationId = $clientId;
|
$fkClientGroupFacturationId = $clientId;
|
||||||
$factureId = $this->gestionBdd->getFactureIdByClientGroupFacturationIdAndDate($clientId,$facturationDate);
|
$factureId = $this->gestionBdd->getFactureIdByClientGroupFacturationIdAndDate($clientId, $facturationDate);
|
||||||
|
|
||||||
}
|
}
|
||||||
// if($clientType == MultipleFactureTypeConstant::CLIENT_FILTER_TYPE){
|
// if($clientType == MultipleFactureTypeConstant::CLIENT_FILTER_TYPE){
|
||||||
@ -321,15 +326,325 @@ class InvoicePdfService {
|
|||||||
$fkClientGroupFacturationId
|
$fkClientGroupFacturationId
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
$this->gestionBdd->invoiceListOfDevisIds($devisIds , $factureId);
|
$this->gestionBdd->invoiceListOfDevisIds($devisIds, $factureId);
|
||||||
$factureGeneratedResponse = $this->generateFactureGroupPdfByFactureId($factureId,$idNextcloud);
|
$factureGeneratedResponse = $this->generateFactureGroupPdfByFactureId($factureId, $idNextcloud);
|
||||||
return $factureGeneratedResponse["filenames"];
|
return $factureGeneratedResponse["filenames"];
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
} catch(Exception) {
|
||||||
catch(Exception){
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOUVELLE MÉTHODE : Génération avec template HTML
|
||||||
|
*/
|
||||||
|
private function generateWithHtmlTemplate($invoicePdfData, $storage)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Préparer les données pour le template HTML
|
||||||
|
$templateData = $this->prepareHtmlTemplateData($invoicePdfData);
|
||||||
|
|
||||||
|
// Générer le PDF avec le nouveau système
|
||||||
|
$pdfContent = $this->htmlToPdfService->generatePdf('facture_dv_thanato', $templateData);
|
||||||
|
|
||||||
|
// Nom du fichier
|
||||||
|
$pdfFilename = $this->htmlToPdfService->generateInvoiceFilename($invoicePdfData);
|
||||||
|
|
||||||
|
// Sauvegarder dans Nextcloud
|
||||||
|
$clean_folder = html_entity_decode(string: $invoicePdfData['configuration']->path).'/';
|
||||||
|
$factureFolders = $this->getGroupFactureFolder($invoicePdfData, $clean_folder);
|
||||||
|
$filenames = [];
|
||||||
|
$filenames = $this->savePdfToFolders($factureFolders, $pdfFilename, $pdfContent, $storage);
|
||||||
|
$this->gestionBdd->setFactureGeneratedDate($invoicePdfData['id']);
|
||||||
|
|
||||||
|
return [
|
||||||
|
"content" => $pdfContent,
|
||||||
|
"filenames" => $filenames
|
||||||
|
];
|
||||||
|
|
||||||
|
} catch (TemplateException $e) {
|
||||||
|
error_log('HTML Template PDF Error: ' . $e->getMessage());
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOUVELLE MÉTHODE : Détecte si TVA exonérée
|
||||||
|
*/
|
||||||
|
private function isTvaExempt($invoicePdfData)
|
||||||
|
{
|
||||||
|
// Vérifier si c'est un client unique avec TVA = 0
|
||||||
|
if (isset($invoicePdfData['fk_client_id']) && $invoicePdfData['fk_client_id'] != null && $invoicePdfData['fk_client_id'] != 0) {
|
||||||
|
$client = $this->gestionBdd->getClientById($invoicePdfData['fk_client_id']);
|
||||||
|
if (isset($client['tva']) && $client['tva'] == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les données pour le template HTML - Version refactorisée
|
||||||
|
*/
|
||||||
|
private function prepareHtmlTemplateData($invoicePdfData)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'company' => $this->prepareCompanyData($invoicePdfData),
|
||||||
|
'client' => $this->prepareClientData($invoicePdfData),
|
||||||
|
'facture' => $this->prepareInvoiceData($invoicePdfData),
|
||||||
|
'groupedArticles' => $this->prepareGroupedArticles($invoicePdfData),
|
||||||
|
'totals' => $this->prepareTotals($invoicePdfData),
|
||||||
|
'bank' => $this->prepareBankData($invoicePdfData),
|
||||||
|
'legal_text' => $this->getLegalText()
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les données de l'entreprise
|
||||||
|
*/
|
||||||
|
private function prepareCompanyData($invoicePdfData)
|
||||||
|
{
|
||||||
|
$config = $invoicePdfData['configuration'];
|
||||||
|
|
||||||
|
return [
|
||||||
|
'name' => $config->entreprise ?? 'DV Thanato',
|
||||||
|
'address' => $invoicePdfData['configuration_adresse'] ?? '47 rue Boldoduc',
|
||||||
|
'city' => $invoicePdfData['configuration_adresse_city'] ?? '59800 Lille',
|
||||||
|
'phone' => $config->telephone ?? '06.13.57.29.84',
|
||||||
|
'email' => $config->mail ?? 'soins@dvthanato.fr',
|
||||||
|
'logo' => 'logo_dv_thanato.png'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les données du client
|
||||||
|
*/
|
||||||
|
private function prepareClientData($invoicePdfData)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'name' => $invoicePdfData['group_name'] ?? '',
|
||||||
|
'address' => $invoicePdfData['client_real_adress'] ?? '',
|
||||||
|
'city' => $invoicePdfData['client_adress_city'] ?? '',
|
||||||
|
'siret' => $invoicePdfData['siret'] ?? ''
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les données de la facture
|
||||||
|
*/
|
||||||
|
private function prepareInvoiceData($invoicePdfData)
|
||||||
|
{
|
||||||
|
$numero = $invoicePdfData['num'] ?? '';
|
||||||
|
|
||||||
|
return [
|
||||||
|
'date' => date('d-m-Y'),
|
||||||
|
'number' => 'FAC' . str_pad((string)$numero, 6, '0', STR_PAD_LEFT),
|
||||||
|
'echeance' => date('d-m-Y', strtotime('+30 days')),
|
||||||
|
'period_start' => date('d/m/Y', strtotime($invoicePdfData['date'] ?? 'now')),
|
||||||
|
'period_end' => date('d/m/Y', strtotime($invoicePdfData['date_paiement'] ?? 'now'))
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les articles groupés par date et défunt
|
||||||
|
*/
|
||||||
|
private function prepareGroupedArticles($invoicePdfData)
|
||||||
|
{
|
||||||
|
if (!isset($invoicePdfData['devis']) || !is_array($invoicePdfData['devis'])) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$groupedByDate = [];
|
||||||
|
|
||||||
|
foreach ($invoicePdfData['devis'] as $devis) {
|
||||||
|
$this->processDevis($devis, $groupedByDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->convertToIndexedArray($groupedByDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Traite un devis et l'ajoute aux données groupées
|
||||||
|
*/
|
||||||
|
private function processDevis($devis, &$groupedByDate)
|
||||||
|
{
|
||||||
|
$dateDevis = date('d/m/Y', strtotime($devis['devis_date'] ?? 'now'));
|
||||||
|
$defuntNom = $devis['defunt_nom'] ?? 'Non défini';
|
||||||
|
|
||||||
|
$this->initializeDateGroup($groupedByDate, $dateDevis);
|
||||||
|
$this->initializeDefuntGroup($groupedByDate, $dateDevis, $defuntNom);
|
||||||
|
$this->addServicesToDefunt($groupedByDate, $dateDevis, $defuntNom, $devis['products'] ?? []);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise un groupe de date
|
||||||
|
*/
|
||||||
|
private function initializeDateGroup(&$groupedByDate, $dateDevis)
|
||||||
|
{
|
||||||
|
if (!isset($groupedByDate[$dateDevis])) {
|
||||||
|
$groupedByDate[$dateDevis] = [
|
||||||
|
'date' => $dateDevis,
|
||||||
|
'defunts' => []
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise un groupe de défunt
|
||||||
|
*/
|
||||||
|
private function initializeDefuntGroup(&$groupedByDate, $dateDevis, $defuntNom)
|
||||||
|
{
|
||||||
|
if (!isset($groupedByDate[$dateDevis]['defunts'][$defuntNom])) {
|
||||||
|
$groupedByDate[$dateDevis]['defunts'][$defuntNom] = [
|
||||||
|
'nom' => $defuntNom,
|
||||||
|
'services' => []
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ajoute les services à un défunt
|
||||||
|
*/
|
||||||
|
private function addServicesToDefunt(&$groupedByDate, $dateDevis, $defuntNom, $products)
|
||||||
|
{
|
||||||
|
foreach ($products as $product) {
|
||||||
|
$service = $this->createServiceFromProduct($product);
|
||||||
|
$groupedByDate[$dateDevis]['defunts'][$defuntNom]['services'][] = $service;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Crée un service à partir d'un produit
|
||||||
|
*/
|
||||||
|
private function createServiceFromProduct($product)
|
||||||
|
{
|
||||||
|
$prixHt = ($product['produit_price'] ?? 0) * ($product['quantite'] ?? 1);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'reference' => $product['produit_reference'] ?? '',
|
||||||
|
'description' => $product['produit_description'] ?? 'Produit inconnu',
|
||||||
|
'prix_ht' => number_format($prixHt, 2, ',', ' '),
|
||||||
|
'quantite' => number_format($product['quantite'] ?? 1, 2, ',', ' '),
|
||||||
|
'prix_ttc' => number_format($prixHt, 2, ',', ' ')
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convertit les données groupées en array indexé
|
||||||
|
*/
|
||||||
|
private function convertToIndexedArray($groupedByDate)
|
||||||
|
{
|
||||||
|
$groupedArticles = [];
|
||||||
|
|
||||||
|
foreach ($groupedByDate as $dateGroup) {
|
||||||
|
$defuntsArray = array_values($dateGroup['defunts']);
|
||||||
|
$dateGroup['defunts'] = $defuntsArray;
|
||||||
|
$groupedArticles[] = $dateGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $groupedArticles;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les totaux
|
||||||
|
*/
|
||||||
|
private function prepareTotals($invoicePdfData)
|
||||||
|
{
|
||||||
|
$totalPrices = $invoicePdfData['totalPrices'] ?? [];
|
||||||
|
|
||||||
|
return [
|
||||||
|
'total_ht' => number_format($totalPrices['TOTAL HT'] ?? 0, 2, ',', ' '),
|
||||||
|
'total_tva' => '0,00',
|
||||||
|
'total_ttc' => number_format($totalPrices['TOTAL TTC'] ?? 0, 2, ',', ' '),
|
||||||
|
'tva_label' => 'TVA (exonéré)'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prépare les données bancaires
|
||||||
|
*/
|
||||||
|
private function prepareBankData($invoicePdfData)
|
||||||
|
{
|
||||||
|
$config = $invoicePdfData['configuration'];
|
||||||
|
|
||||||
|
return [
|
||||||
|
'iban' => 'FR76 1670 6052 4453 9757 9734 871',
|
||||||
|
'swift' => 'AGRI FR PP867',
|
||||||
|
'rcs' => $config->legal_one ?? '901 115 931 R.C.S Lille Métropole'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Texte légal
|
||||||
|
*/
|
||||||
|
private function getLegalText()
|
||||||
|
{
|
||||||
|
return "Tout retard de paiement entraînera de plein droit une pénalité de retard de 3 fois le taux légal " .
|
||||||
|
"(Loi 2008-776 du 4 août 2008) et une indemnité forfaitaire de 40 EUR pour frais de recouvrement sera appliquée.\n" .
|
||||||
|
"Si les frais de recouvrement sont supérieurs à ce montant forfaitaire, une indemnisation complémentaire " .
|
||||||
|
"sera due sur présentation de justificatifs (articles L 441-3 et L 441-6 du code de commerce).";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction générique pour sauvegarder un fichier PDF dans plusieurs dossiers
|
||||||
|
*
|
||||||
|
* @param array $factureFolders Liste des dossiers où sauvegarder
|
||||||
|
* @param string $pdfFilename Nom du fichier PDF (sans extension)
|
||||||
|
* @param string $pdfContent Contenu binaire du PDF
|
||||||
|
* @param mixed $storage Instance de stockage Nextcloud
|
||||||
|
* @return array Liste des chemins des fichiers créés
|
||||||
|
*/
|
||||||
|
private function savePdfToFolders(array $factureFolders, string $pdfFilename, string $pdfContent, $storage): array
|
||||||
|
{
|
||||||
|
$filenames = [];
|
||||||
|
|
||||||
|
foreach ($factureFolders as $folder) {
|
||||||
|
// Créer le chemin complet étape par étape
|
||||||
|
$this->ensurePathExists($storage, $folder);
|
||||||
|
|
||||||
|
$ff_pdf = $folder . $pdfFilename . '.pdf';
|
||||||
|
|
||||||
|
try {
|
||||||
|
if ($storage->nodeExists($ff_pdf)) {
|
||||||
|
$file_pdf = $storage->get($ff_pdf);
|
||||||
|
} else {
|
||||||
|
$file_pdf = $storage->newFile($ff_pdf);
|
||||||
|
}
|
||||||
|
$file_pdf->putContent($pdfContent);
|
||||||
|
$filenames[] = $ff_pdf;
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
// Supprimez ce var_dump pour éviter l'erreur de headers
|
||||||
|
// var_dump("yyyyyyyyyyyyyyyyyyyy".$e->getMessage());
|
||||||
|
error_log("ERROR on file '$ff_pdf': " . $e->getMessage());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filenames;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function ensurePathExists($storage, $path)
|
||||||
|
{
|
||||||
|
$parts = explode('/', trim($path, '/'));
|
||||||
|
$currentPath = '';
|
||||||
|
|
||||||
|
foreach ($parts as $part) {
|
||||||
|
if (empty($part)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$currentPath .= '/' . $part;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!$storage->nodeExists($currentPath)) {
|
||||||
|
$storage->newFolder($currentPath);
|
||||||
|
}
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
error_log("Cannot create folder '$currentPath': " . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -38,12 +38,13 @@ class MailerService {
|
|||||||
){
|
){
|
||||||
$this->adminStorage = $rootFolder->getUserFolder(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD);
|
$this->adminStorage = $rootFolder->getUserFolder(BddConstant::DEFAULT_ADMIN_ID_NEXTCLOUD);
|
||||||
}
|
}
|
||||||
public function getFooterContent ($userName = "Johann"){
|
public function getFooterContent ($userName = "DEKINDT Vanessa"){
|
||||||
$wish = "<p>Vous en souhaitant bonne réception. </p>";
|
$wish = "<p>Vous en souhaitant bonne réception. </p>";
|
||||||
$cordialement = "<p> Cordialement,</p>";
|
$cordialement = "<p> Cordialement,</p>";
|
||||||
$userName = "<p> {$userName} </p>" ;
|
$userName = "<p> {$userName} </p>" ;
|
||||||
$signatureImage = $this->getSignatureHtmlEmailContent();
|
// $signatureImage = $this->getSignatureHtmlEmailContent();
|
||||||
return $wish . $cordialement .$userName . $signatureImage ;
|
// return $wish . $cordialement .$userName . $signatureImage ;
|
||||||
|
return $wish . $cordialement .$userName ;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getSignatureHtmlEmailContent (){
|
private function getSignatureHtmlEmailContent (){
|
||||||
@ -51,7 +52,7 @@ class MailerService {
|
|||||||
if (!$signatureImage) {
|
if (!$signatureImage) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return "<img style= 'width: 250px;height: 150px;' src='data:image/jpeg;base64,".base64_encode($signatureImage)."'>" ;
|
return "<img width='170' height='80' style= 'width: 170;height: 80px;display:block;' src='data:image/jpeg;base64,".base64_encode($signatureImage)."'>" ;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getSignatureContent(){
|
private function getSignatureContent(){
|
||||||
|
|||||||
13
gestion/lib/Sql/20250630-ADD-document_generated_date.sql
Normal file
13
gestion/lib/Sql/20250630-ADD-document_generated_date.sql
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
alter table oc_gestion_facture
|
||||||
|
add column document_generated_date DATE DEFAULT NULL,
|
||||||
|
add column document_sent_date DATE DEFAULT NULL;
|
||||||
|
|
||||||
|
create table if not exists oc_gestion_recap_facture_state (
|
||||||
|
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
|
||||||
|
fk_client_id INT,
|
||||||
|
fk_client_group_facturation_id INT,
|
||||||
|
month INT,
|
||||||
|
year INT,
|
||||||
|
document_generated_date DATE DEFAULT NULL,
|
||||||
|
document_sent_date DATE DEFAULT NULL
|
||||||
|
);
|
||||||
@ -4,7 +4,7 @@ import "datatables.net-dt/css/jquery.dataTables.css";
|
|||||||
import "../css/mycss.css";
|
import "../css/mycss.css";
|
||||||
|
|
||||||
import "./listener/main_listener";
|
import "./listener/main_listener";
|
||||||
import { getBibliotheques, exportCareCertificate,getBijouxById, getHypodermiquesyId, getObservationsById, getproduits, saveAttestationPacemaker, saveRapportBijoux, saveRapportSoin, setBijouxPhoto, setDefuntCover, setDefuntPacemakerPhoto, updateDB } from "./modules/ajaxRequest.mjs";
|
import { getBibliotheques, exportCareCertificate,getBijouxById, getHypodermiquesyId, getObservationsById, getproduits, saveAttestationPacemaker, saveAttestationAbsentPacemaker, saveRapportBijoux, saveRapportSoin, setBijouxPhoto, setDefuntCover, setDefuntPacemakerPhoto, updateDB } from "./modules/ajaxRequest.mjs";
|
||||||
import { globalConfiguration } from "./modules/mainFunction.mjs";
|
import { globalConfiguration } from "./modules/mainFunction.mjs";
|
||||||
|
|
||||||
let bibliotheques = [];
|
let bibliotheques = [];
|
||||||
@ -77,6 +77,7 @@ window.addEventListener("DOMContentLoaded", function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
var pacemakerBtn = document.getElementById("pacemakerBtn");
|
var pacemakerBtn = document.getElementById("pacemakerBtn");
|
||||||
|
var pacemakerAbsentBtn = document.getElementById("pacemakerAbsentBtn");
|
||||||
var rapportSoinBtn = document.getElementById("rapportSoinBtn");
|
var rapportSoinBtn = document.getElementById("rapportSoinBtn");
|
||||||
var exportCareCertificateButton = document.getElementById("exportCareCertificate");
|
var exportCareCertificateButton = document.getElementById("exportCareCertificate");
|
||||||
var setDefuntCoverButton = this.document.getElementById("coverProductsSetButton");
|
var setDefuntCoverButton = this.document.getElementById("coverProductsSetButton");
|
||||||
@ -144,6 +145,9 @@ window.addEventListener("DOMContentLoaded", function () {
|
|||||||
case 'pacemaker':
|
case 'pacemaker':
|
||||||
saveAttestationPacemaker({ defuntId: defuntid ,email: isSendEmail ? email: ''});
|
saveAttestationPacemaker({ defuntId: defuntid ,email: isSendEmail ? email: ''});
|
||||||
break;
|
break;
|
||||||
|
case 'pacemakerAbsent':
|
||||||
|
saveAttestationAbsentPacemaker({ defuntId: defuntid ,email: isSendEmail ? email: ''});
|
||||||
|
break;
|
||||||
case 'rapport-soin':
|
case 'rapport-soin':
|
||||||
saveRapportSoin({ numdefunt: defuntid ,email: isSendEmail ? email: ''});
|
saveRapportSoin({ numdefunt: defuntid ,email: isSendEmail ? email: ''});
|
||||||
break;
|
break;
|
||||||
@ -182,6 +186,12 @@ window.addEventListener("DOMContentLoaded", function () {
|
|||||||
modalElement.modal('show')
|
modalElement.modal('show')
|
||||||
// saveAttestationPacemaker({ defuntId: defuntid });
|
// saveAttestationPacemaker({ defuntId: defuntid });
|
||||||
});
|
});
|
||||||
|
pacemakerAbsentBtn.addEventListener("click", function(){
|
||||||
|
modalTitle.text("Générer l'attestation d'absence pacemaker")
|
||||||
|
modalElement.data('export-type', 'pacemakerAbsent')
|
||||||
|
modalElement.modal('show')
|
||||||
|
// saveAttestationPacemaker({ defuntId: defuntid });
|
||||||
|
});
|
||||||
|
|
||||||
rapportSoinBtn.addEventListener("click", function(){
|
rapportSoinBtn.addEventListener("click", function(){
|
||||||
modalElement.data('export-type', 'rapport-soin')
|
modalElement.data('export-type', 'rapport-soin')
|
||||||
|
|||||||
@ -678,6 +678,30 @@ export function saveAttestationPacemaker(myData) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save pdf in nextcloud
|
||||||
|
* @param {*} myData
|
||||||
|
*/
|
||||||
|
export function saveAttestationAbsentPacemaker(myData) {
|
||||||
|
showLoader();
|
||||||
|
$.ajax({
|
||||||
|
url: baseUrl + '/saveAttestationAbsentPacemaker',
|
||||||
|
type: 'POST',
|
||||||
|
contentType: 'application/json',
|
||||||
|
data: JSON.stringify(myData)
|
||||||
|
}).done(function (response) {
|
||||||
|
if(!response) {
|
||||||
|
showMessage('Ce defunt n\'appartient à aucun devis.');
|
||||||
|
} else {
|
||||||
|
showSuccess('Sauvegardé dans '+ response);
|
||||||
|
}
|
||||||
|
}).fail(function (response, code) {
|
||||||
|
showMessage(t('gestion', 'Erreur dans la génération d\'attestation pacemaker'));
|
||||||
|
}).always(function () {
|
||||||
|
hideLoader();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save pdf in nextcloud
|
* Save pdf in nextcloud
|
||||||
* @param {*} myData
|
* @param {*} myData
|
||||||
|
|||||||
@ -215,13 +215,45 @@ export function getGlobal(id_devis) {
|
|||||||
})
|
})
|
||||||
}).done((function (res) {
|
}).done((function (res) {
|
||||||
var myresp = JSON.parse(response)[0];
|
var myresp = JSON.parse(response)[0];
|
||||||
var total = JSON.parse(res).total;
|
var devisData = JSON.parse(res);
|
||||||
var tva = parseFloat(myresp.tva_default);
|
var total = devisData.total;
|
||||||
|
var clientTvaStatus = devisData.client_tva_status;
|
||||||
|
// S'assurer que total est un nombre
|
||||||
|
total = parseFloat(total);
|
||||||
|
clientTvaStatus = parseInt(clientTvaStatus);
|
||||||
|
|
||||||
|
var tvaDefault = parseFloat(myresp.tva_default);
|
||||||
|
|
||||||
$('#totaldevis tbody').empty();
|
$('#totaldevis tbody').empty();
|
||||||
$('#totaldevis tbody').append('<tr><td>' + cur.format(total) + '</td><td id="tva">' + tva + ' %</td><td id="totaltva">' + cur.format(Math.round((total * tva)) / 100) + '</td><td>' + cur.format(Math.round((total * (tva + 100))) / 100) + '</td></tr>');
|
|
||||||
|
if (clientTvaStatus === 0) {
|
||||||
|
// Client exonéré de TVA - TVA = 0%
|
||||||
|
$('#totaldevis tbody').append(
|
||||||
|
'<tr>' +
|
||||||
|
'<td>' + cur.format(total) + '</td>' +
|
||||||
|
'<td id="tva">0 %</td>' +
|
||||||
|
'<td id="totaltva">' + cur.format(0) + '</td>' +
|
||||||
|
'<td>' + cur.format(total) + '</td>' +
|
||||||
|
'</tr>'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Client soumis à la TVA - utiliser le taux par défaut
|
||||||
|
var montantTva = Math.round((total * tvaDefault)) / 100;
|
||||||
|
var totalTTC = Math.round((total * (tvaDefault + 100))) / 100;
|
||||||
|
|
||||||
|
$('#totaldevis tbody').append(
|
||||||
|
'<tr>' +
|
||||||
|
'<td>' + cur.format(total) + '</td>' +
|
||||||
|
'<td id="tva">' + tvaDefault + ' %</td>' +
|
||||||
|
'<td id="totaltva">' + cur.format(montantTva) + '</td>' +
|
||||||
|
'<td>' + cur.format(totalTTC) + '</td>' +
|
||||||
|
'</tr>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$('#mentions_default').html(myresp.mentions_default);
|
$('#mentions_default').html(myresp.mentions_default);
|
||||||
}));
|
}));
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getGlobalPromise() {
|
export function getGlobalPromise() {
|
||||||
|
|||||||
@ -10,15 +10,18 @@ export class Client {
|
|||||||
*/
|
*/
|
||||||
constructor(myresp) {
|
constructor(myresp) {
|
||||||
this.id = myresp.id;
|
this.id = myresp.id;
|
||||||
this.entreprise = ((myresp.entreprise.length === 0) ? '-' : myresp.entreprise);
|
this.code_comptable = ((myresp.code_comptable && myresp.code_comptable.length > 0) ? myresp.code_comptable : '-'); // AJOUTÉ
|
||||||
this.prenom = ((myresp.prenom.length === 0) ? '-' : myresp.prenom);
|
this.agence = ((myresp.agence && myresp.agence.length > 0) ? myresp.agence : '-'); // AJOUTÉ
|
||||||
this.nom = ((myresp.nom.length === 0) ? '-' : myresp.nom);
|
this.entreprise = ((myresp.entreprise && myresp.entreprise.length > 0) ? myresp.entreprise : '-');
|
||||||
this.legal_one = ((myresp.legal_one.length === 0) ? '-' : myresp.legal_one);
|
this.prenom = ((myresp.prenom && myresp.prenom.length > 0) ? myresp.prenom : '-');
|
||||||
this.telephone = ((myresp.telephone.length === 0) ? '-' : myresp.telephone);
|
this.nom = ((myresp.nom && myresp.nom.length > 0) ? myresp.nom : '-');
|
||||||
this.mail = ((myresp.mail.length === 0) ? '-' : myresp.mail);
|
this.legal_one = ((myresp.legal_one && myresp.legal_one.length > 0) ? myresp.legal_one : '-');
|
||||||
this.adresse = ((myresp.adresse.length === 0) ? '-' : myresp.adresse);
|
this.telephone = ((myresp.telephone && myresp.telephone.length > 0) ? myresp.telephone : '-');
|
||||||
this.clientGroupName = ((myresp.client_group_name.length === 0) ? '-' : myresp.client_group_name);
|
this.mail = ((myresp.mail && myresp.mail.length > 0) ? myresp.mail : '-');
|
||||||
this.clientGroupFacturationName = ((myresp.client_group_facturation_name.length === 0) ? '-' : myresp.client_group_facturation_name);
|
this.adresse = ((myresp.adresse && myresp.adresse.length > 0) ? myresp.adresse : '-');
|
||||||
|
this.is_tva = myresp.is_tva !== undefined && myresp.is_tva !== null ? myresp.is_tva : 0;
|
||||||
|
this.clientGroupName = ((myresp.client_group_name && myresp.client_group_name.length > 0) ? myresp.client_group_name : '-');
|
||||||
|
this.clientGroupFacturationName = ((myresp.client_group_facturation_name && myresp.client_group_facturation_name.length > 0) ? myresp.client_group_facturation_name : '-');
|
||||||
|
|
||||||
let clientGroupId = 0;
|
let clientGroupId = 0;
|
||||||
if(myresp.fk_client_group_id != null && myresp.fk_client_group_id.length > 0){
|
if(myresp.fk_client_group_id != null && myresp.fk_client_group_id.length > 0){
|
||||||
@ -40,17 +43,21 @@ export class Client {
|
|||||||
let myrow = [
|
let myrow = [
|
||||||
'<input class="clientToExport" data-id= '+ this.id + ' type="checkbox" name="clientToExport" value="' + this.id + '"/>',
|
'<input class="clientToExport" data-id= '+ this.id + ' type="checkbox" name="clientToExport" value="' + this.id + '"/>',
|
||||||
'<div>' + this.id + '</div>',
|
'<div>' + this.id + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="entreprise" data-id="' + this.id + '">' + this.entreprise + '</div>',
|
'<div class="editable" data-table="client" data-column="code_comptable" data-id="' + this.id + '">' + this.code_comptable + '</div>',
|
||||||
|
'<div class="editable" data-table="client" data-column="agence" data-id="' + this.id + '">' + this.agence + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="prenom" data-id="' + this.id + '">' + this.prenom + '</div>',
|
'<div class="editable" data-table="client" data-column="prenom" data-id="' + this.id + '">' + this.prenom + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="nom" data-id="' + this.id + '">' + this.nom + '</div>',
|
'<div class="editable" data-table="client" data-column="nom" data-id="' + this.id + '">' + this.nom + '</div>',
|
||||||
|
'<div class="editable" data-table="client" data-column="entreprise" data-id="' + this.id + '">' + this.entreprise + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="legal_one" data-id="' + this.id + '">' + this.legal_one + '</div>',
|
'<div class="editable" data-table="client" data-column="legal_one" data-id="' + this.id + '">' + this.legal_one + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="telephone" data-id="' + this.id + '">' + this.telephone + '</div>',
|
'<div class="editable" data-table="client" data-column="telephone" data-id="' + this.id + '">' + this.telephone + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="mail" data-id="' + this.id + '">' + this.mail + '</div>',
|
'<div class="editable" data-table="client" data-column="mail" data-id="' + this.id + '">' + this.mail + '</div>',
|
||||||
'<div class="editable" data-table="client" data-column="adresse" data-id="' + this.id + '">' + this.adresse + '</div>',
|
'<div class="editable" data-table="client" data-column="adresse" data-id="' + this.id + '">' + this.adresse + '</div>',
|
||||||
|
'<div><input type="checkbox" class="gestion-checkbox" data-table="client" data-column="is_tva" data-id="' + this.id + '" ' + (this.is_tva == 1 || this.is_tva == true ? 'checked' : '') + ' /></div>',
|
||||||
'<div class="selectClientGroupList" data-table="client" data-column="fk_client_group_id" data-id="' + this.id + '" data-current="' + this.clientGroupId + '">' + this.clientGroupName + '</div>',
|
'<div class="selectClientGroupList" data-table="client" data-column="fk_client_group_id" data-id="' + this.id + '" data-current="' + this.clientGroupId + '">' + this.clientGroupName + '</div>',
|
||||||
'<div class="selectClientGroupFacturationList" data-table="client" data-column="fk_client_group_facturation_id" data-id="' + this.id + '" data-current="' + this.clientGroupFacturationId + '">' + this.clientGroupFacturationName + '</div>',
|
'<div class="selectClientGroupFacturationList" data-table="client" data-column="fk_client_group_facturation_id" data-id="' + this.id + '" data-current="' + this.clientGroupFacturationId + '">' + this.clientGroupFacturationName + '</div>',
|
||||||
'<center><div data-modifier="client" data-id=' + this.id + ' data-table="client" style="display:inline-block;margin-right:0px;" class="deleteItem icon-delete"></div></center>'
|
'<div><center><div data-modifier="client" data-id=' + this.id + ' data-table="client" style="display:inline-block;margin-right:0px;" class="deleteItem icon-delete"></div></center></div>' // MODIFIÉ
|
||||||
];
|
];
|
||||||
|
|
||||||
return myrow;
|
return myrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +89,8 @@ export class Client {
|
|||||||
oReq.setRequestHeader("Content-Type", "application/json");
|
oReq.setRequestHeader("Content-Type", "application/json");
|
||||||
oReq.onload = function(e){
|
oReq.onload = function(e){
|
||||||
if (this.status == 200) {
|
if (this.status == 200) {
|
||||||
LoadDT(clientDT, JSON.parse(this.response), Client);
|
const data = JSON.parse(this.response);
|
||||||
|
LoadDT(clientDT, data, Client);
|
||||||
}else{
|
}else{
|
||||||
showError(this.response);
|
showError(this.response);
|
||||||
}
|
}
|
||||||
@ -100,7 +108,8 @@ export class Client {
|
|||||||
oReq.setRequestHeader("Content-Type", "application/json");
|
oReq.setRequestHeader("Content-Type", "application/json");
|
||||||
oReq.onload = function(e){
|
oReq.onload = function(e){
|
||||||
if (this.status == 200) {
|
if (this.status == 200) {
|
||||||
callback(JSON.parse(this.response));
|
const data = JSON.parse(this.response);
|
||||||
|
callback(data);
|
||||||
}else{
|
}else{
|
||||||
showError(this.response);
|
showError(this.response);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,8 @@ export class Facture {
|
|||||||
this.clientName = ((myresp.facture_group_name == null || myresp.facture_group_name.length == 0) ? '-' : myresp.facture_group_name);
|
this.clientName = ((myresp.facture_group_name == null || myresp.facture_group_name.length == 0) ? '-' : myresp.facture_group_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.totalTtc = myresp?.totalPrices?.total_ttc ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
getDocumentStateLabel(documentState){
|
getDocumentStateLabel(documentState){
|
||||||
@ -86,6 +88,7 @@ export class Facture {
|
|||||||
'<div>' + this.payment_date + '</div>',
|
'<div>' + this.payment_date + '</div>',
|
||||||
'<div><span class="badge '+this.isDocumentAlreadyGeneratedClass+'">' + this.isDocumentAlreadyGeneratedLabel + '</span></div>',
|
'<div><span class="badge '+this.isDocumentAlreadyGeneratedClass+'">' + this.isDocumentAlreadyGeneratedLabel + '</span></div>',
|
||||||
'<div><span class="badge '+this.isDocumentAlreadySentClass+'">' + this.isDocumentAlreadySentLabel + '</span></div>',
|
'<div><span class="badge '+this.isDocumentAlreadySentClass+'">' + this.isDocumentAlreadySentLabel + '</span></div>',
|
||||||
|
'<div><span>'+this.totalTtc + '</span></div>',
|
||||||
'<div style="display:inline-block;margin-right:0px;width:80%;"><a href="' + this.baseUrl +'"><button>' + t('gestion', 'Open') + '</button></a></div><div data-modifier="facture" data-id=' + this.id + ' data-table="facture" style="display:inline-block;margin-right:0px;" class="deleteItem icon-delete"></div>',
|
'<div style="display:inline-block;margin-right:0px;width:80%;"><a href="' + this.baseUrl +'"><button>' + t('gestion', 'Open') + '</button></a></div><div data-modifier="facture" data-id=' + this.id + ' data-table="facture" style="display:inline-block;margin-right:0px;" class="deleteItem icon-delete"></div>',
|
||||||
];
|
];
|
||||||
return myrow;
|
return myrow;
|
||||||
|
|||||||
@ -17,8 +17,9 @@
|
|||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
<select name="annee" id="yearselector">
|
<select name="annee" id="yearselector">
|
||||||
<option value="-1" <?php if ((int) $_GET['annee'] == -1)
|
<option value="-1" <?php if ((int) $_GET['annee'] == -1) {
|
||||||
echo 'selected' ?>>Toutes les années</option>
|
echo 'selected';
|
||||||
|
} ?>>Toutes les années</option>
|
||||||
<?php
|
<?php
|
||||||
$currentYear = date('Y');
|
$currentYear = date('Y');
|
||||||
for ($year = $currentYear; $year >= $currentYear - 10; $year--) {
|
for ($year = $currentYear; $year >= $currentYear - 10; $year--) {
|
||||||
@ -27,35 +28,48 @@
|
|||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
<select name="mois" id="monthselector">
|
<select name="mois" id="monthselector">
|
||||||
<option value="0" <?php if ((int) $_GET['mois'] == 0)
|
<option value="0" <?php if ((int) $_GET['mois'] == 0) {
|
||||||
echo 'selected' ?>>Tous les mois</option>
|
echo 'selected';
|
||||||
<option value="1" <?php if ((int) $_GET['mois'] == 1)
|
} ?>>Tous les mois</option>
|
||||||
echo 'selected' ?>>Janvier</option>
|
<option value="1" <?php if ((int) $_GET['mois'] == 1) {
|
||||||
<option value="2" <?php if ((int) $_GET['mois'] == 2)
|
echo 'selected';
|
||||||
echo 'selected' ?>>Fevrier</option>
|
} ?>>Janvier</option>
|
||||||
<option value="3" <?php if ((int) $_GET['mois'] == 3)
|
<option value="2" <?php if ((int) $_GET['mois'] == 2) {
|
||||||
echo 'selected' ?>>Mars</option>
|
echo 'selected';
|
||||||
<option value="4" <?php if ((int) $_GET['mois'] == 4)
|
} ?>>Fevrier</option>
|
||||||
echo 'selected' ?>>Avril</option>
|
<option value="3" <?php if ((int) $_GET['mois'] == 3) {
|
||||||
<option value="5" <?php if ((int) $_GET['mois'] == 5)
|
echo 'selected';
|
||||||
echo 'selected' ?>>Mai</option>
|
} ?>>Mars</option>
|
||||||
<option value="6" <?php if ((int) $_GET['mois'] == 6)
|
<option value="4" <?php if ((int) $_GET['mois'] == 4) {
|
||||||
echo 'selected' ?>>Juin</option>
|
echo 'selected';
|
||||||
<option value="7" <?php if ((int) $_GET['mois'] == 7)
|
} ?>>Avril</option>
|
||||||
echo 'selected' ?>>Juillet</option>
|
<option value="5" <?php if ((int) $_GET['mois'] == 5) {
|
||||||
<option value="8" <?php if ((int) $_GET['mois'] == 8)
|
echo 'selected';
|
||||||
echo 'selected' ?>>Août</option>
|
} ?>>Mai</option>
|
||||||
<option value="9" <?php if ((int) $_GET['mois'] == 9)
|
<option value="6" <?php if ((int) $_GET['mois'] == 6) {
|
||||||
echo 'selected' ?>>Septembre</option>
|
echo 'selected';
|
||||||
<option value="10" <?php if ((int) $_GET['mois'] == 10)
|
} ?>>Juin</option>
|
||||||
echo 'selected' ?>>Octobre</option>
|
<option value="7" <?php if ((int) $_GET['mois'] == 7) {
|
||||||
<option value="11" <?php if ((int) $_GET['mois'] == 11)
|
echo 'selected';
|
||||||
echo 'selected' ?>>Novembre</option>
|
} ?>>Juillet</option>
|
||||||
<option value="12" <?php if ((int) $_GET['mois'] == 12)
|
<option value="8" <?php if ((int) $_GET['mois'] == 8) {
|
||||||
echo 'selected' ?>>Decembre</option>
|
echo 'selected';
|
||||||
|
} ?>>Août</option>
|
||||||
|
<option value="9" <?php if ((int) $_GET['mois'] == 9) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Septembre</option>
|
||||||
|
<option value="10" <?php if ((int) $_GET['mois'] == 10) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Octobre</option>
|
||||||
|
<option value="11" <?php if ((int) $_GET['mois'] == 11) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Novembre</option>
|
||||||
|
<option value="12" <?php if ((int) $_GET['mois'] == 12) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Decembre</option>
|
||||||
</select>
|
</select>
|
||||||
<input type="hidden" name="filterType" id="filterType"
|
<input type="hidden" name="filterType" id="filterType"
|
||||||
value="<?php echo ($_GET['filterType'] ?? 'group'); ?>">
|
value="<?php echo($_GET['filterType'] ?? 'group'); ?>">
|
||||||
<input type="submit" value="Filtrer" />
|
<input type="submit" value="Filtrer" />
|
||||||
</form>
|
</form>
|
||||||
<div class="d-flex flex-row">
|
<div class="d-flex flex-row">
|
||||||
@ -110,8 +124,9 @@
|
|||||||
<div id="gestion-canvas" class="canvas_div_pdf">
|
<div id="gestion-canvas" class="canvas_div_pdf">
|
||||||
<?php
|
<?php
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'GET' && strcmp($_GET['cli'], '') != 0) {
|
if ($_SERVER['REQUEST_METHOD'] == 'GET' && strcmp($_GET['cli'], '') != 0) {
|
||||||
if (sizeof($devis) == 0)
|
if (sizeof($devis) == 0) {
|
||||||
echo "Aucun devis trouvé.";
|
echo "Aucun devis trouvé.";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -197,7 +212,7 @@
|
|||||||
style="display:inline"
|
style="display:inline"
|
||||||
data-table="devis" data-column="order_number"
|
data-table="devis" data-column="order_number"
|
||||||
data-id="<?php echo $currentDevis->id;?>">
|
data-id="<?php echo $currentDevis->id;?>">
|
||||||
<?php echo ($currentDevis->order_number == "" ) ? "-" : $currentDevis->order_number ; ?>
|
<?php echo ($currentDevis->order_number == "") ? "-" : $currentDevis->order_number ; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
@ -209,7 +224,7 @@
|
|||||||
style="display:inline"
|
style="display:inline"
|
||||||
data-table="devis" data-column="case_number"
|
data-table="devis" data-column="case_number"
|
||||||
data-id="<?php echo $currentDevis->id;?>">
|
data-id="<?php echo $currentDevis->id;?>">
|
||||||
<?php echo ($currentDevis->case_number == "" ) ? "-" : $currentDevis->case_number ; ?>
|
<?php echo ($currentDevis->case_number == "") ? "-" : $currentDevis->case_number ; ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
@ -255,13 +270,25 @@
|
|||||||
<?php
|
<?php
|
||||||
$totalhtc = 0;
|
$totalhtc = 0;
|
||||||
$tva = json_decode($_['configuration'])[0]->tva_default;
|
$tva = json_decode($_['configuration'])[0]->tva_default;
|
||||||
|
$clientTvaStatus = isset($currentDevis->tva) ? (int)$currentDevis->tva : 1;
|
||||||
$totalttc = 0;
|
$totalttc = 0;
|
||||||
$totalprice = 0;
|
$totalprice = 0;
|
||||||
|
|
||||||
foreach ($currentDevis->dproduits as $key => $produit) {
|
foreach ($currentDevis->dproduits as $key => $produit) {
|
||||||
$totalhtc = $totalhtc + ($produit->quantite * $produit->prix_unitaire);
|
$totalhtc = $totalhtc + ($produit->quantite * $produit->prix_unitaire);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculer la TVA selon le statut du client
|
||||||
|
if ($clientTvaStatus === 0) {
|
||||||
|
// Client exonéré de TVA
|
||||||
|
$tva = 0;
|
||||||
|
$totalttc = 0;
|
||||||
|
$totalprice = $totalhtc;
|
||||||
|
} else {
|
||||||
|
// Client soumis à la TVA
|
||||||
$totalttc = ($totalhtc * $tva) / 100;
|
$totalttc = ($totalhtc * $tva) / 100;
|
||||||
$totalprice = $totalhtc + $totalttc;
|
$totalprice = $totalhtc + $totalttc;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td>€<?php echo number_format($totalhtc, 2) ?></td>
|
<td>€<?php echo number_format($totalhtc, 2) ?></td>
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
<div class="d-flex flex-column w-100 p-4">
|
<div class="d-flex flex-column w-100 p-4">
|
||||||
<?php $factures = []; $showRecapButton=false;?>
|
<?php $factures = [];
|
||||||
|
$showRecapButton = false;?>
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<form method="get" class="d-flex flex-row align-items-center">
|
<form method="get" class="d-flex flex-row align-items-center">
|
||||||
<select name="cli" id="clientselector">
|
<select name="cli" id="clientselector">
|
||||||
@ -8,7 +9,7 @@
|
|||||||
?>
|
?>
|
||||||
<option
|
<option
|
||||||
<?php
|
<?php
|
||||||
if($_GET['cli'] == $client->id && $_GET['filterType'] == $client->client_type){
|
if($_GET['cli'] == $client->id && $_GET['filterType'] == $client->client_type) {
|
||||||
echo 'selected';
|
echo 'selected';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@ -22,7 +23,9 @@
|
|||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
<select name="annee" id="yearselector">
|
<select name="annee" id="yearselector">
|
||||||
<option value="-1" <?php if((int) $_GET['annee'] == -1) echo 'selected' ?>>Toutes les années</option>
|
<option value="-1" <?php if((int) $_GET['annee'] == -1) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Toutes les années</option>
|
||||||
<?php
|
<?php
|
||||||
$currentYear = date('Y');
|
$currentYear = date('Y');
|
||||||
for ($year = $currentYear; $year >= $currentYear - 10; $year--) {
|
for ($year = $currentYear; $year >= $currentYear - 10; $year--) {
|
||||||
@ -31,49 +34,76 @@
|
|||||||
?>
|
?>
|
||||||
</select>
|
</select>
|
||||||
<select name="mois" id="monthselector">
|
<select name="mois" id="monthselector">
|
||||||
<option value="0" <?php if((int) $_GET['mois'] == 0) echo 'selected' ?>>Tous les mois</option>
|
<option value="0" <?php if((int) $_GET['mois'] == 0) {
|
||||||
<option value="1" <?php if((int) $_GET['mois'] == 1) echo 'selected' ?>>Janvier</option>
|
echo 'selected';
|
||||||
<option value="2" <?php if((int) $_GET['mois'] == 2) echo 'selected' ?>>Fevrier</option>
|
} ?>>Tous les mois</option>
|
||||||
<option value="3" <?php if((int) $_GET['mois'] == 3) echo 'selected' ?>>Mars</option>
|
<option value="1" <?php if((int) $_GET['mois'] == 1) {
|
||||||
<option value="4" <?php if((int) $_GET['mois'] == 4) echo 'selected' ?>>Avril</option>
|
echo 'selected';
|
||||||
<option value="5" <?php if((int) $_GET['mois'] == 5) echo 'selected' ?>>Mai</option>
|
} ?>>Janvier</option>
|
||||||
<option value="6" <?php if((int) $_GET['mois'] == 6) echo 'selected' ?>>Juin</option>
|
<option value="2" <?php if((int) $_GET['mois'] == 2) {
|
||||||
<option value="7" <?php if((int) $_GET['mois'] == 7) echo 'selected' ?>>Juillet</option>
|
echo 'selected';
|
||||||
<option value="8" <?php if((int) $_GET['mois'] == 8) echo 'selected' ?>>Août</option>
|
} ?>>Fevrier</option>
|
||||||
<option value="9" <?php if((int) $_GET['mois'] == 9) echo 'selected' ?>>Septembre</option>
|
<option value="3" <?php if((int) $_GET['mois'] == 3) {
|
||||||
<option value="10" <?php if((int) $_GET['mois'] == 10) echo 'selected' ?>>Octobre</option>
|
echo 'selected';
|
||||||
<option value="11" <?php if((int) $_GET['mois'] == 11) echo 'selected' ?>>Novembre</option>
|
} ?>>Mars</option>
|
||||||
<option value="12" <?php if((int) $_GET['mois'] == 12) echo 'selected' ?>>Decembre</option>
|
<option value="4" <?php if((int) $_GET['mois'] == 4) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Avril</option>
|
||||||
|
<option value="5" <?php if((int) $_GET['mois'] == 5) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Mai</option>
|
||||||
|
<option value="6" <?php if((int) $_GET['mois'] == 6) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Juin</option>
|
||||||
|
<option value="7" <?php if((int) $_GET['mois'] == 7) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Juillet</option>
|
||||||
|
<option value="8" <?php if((int) $_GET['mois'] == 8) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Août</option>
|
||||||
|
<option value="9" <?php if((int) $_GET['mois'] == 9) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Septembre</option>
|
||||||
|
<option value="10" <?php if((int) $_GET['mois'] == 10) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Octobre</option>
|
||||||
|
<option value="11" <?php if((int) $_GET['mois'] == 11) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Novembre</option>
|
||||||
|
<option value="12" <?php if((int) $_GET['mois'] == 12) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Decembre</option>
|
||||||
</select>
|
</select>
|
||||||
<input type="hidden" name="filterType" id="filterType" value="<?php echo ($_GET['filterType'] ?? 'client'); ?>">
|
<input type="hidden" name="filterType" id="filterType" value="<?php echo($_GET['filterType'] ?? 'client'); ?>">
|
||||||
<input type="submit" value="Filtrer"/>
|
<input type="submit" value="Filtrer"/>
|
||||||
</form>
|
</form>
|
||||||
<div class="d-flex flex-row">
|
<div class="d-flex flex-row">
|
||||||
<?php
|
<?php
|
||||||
if($_SERVER['REQUEST_METHOD'] == 'GET') {
|
if($_SERVER['REQUEST_METHOD'] == 'GET') {
|
||||||
if(intval($_GET['mois'])!=0 && intval($_GET['annee'])!=0) $showRecapButton = true;
|
if(intval($_GET['mois']) != 0 && intval($_GET['annee']) != 0) {
|
||||||
$factures = array_filter($_['factures'], function($f) {
|
$showRecapButton = true;
|
||||||
|
}
|
||||||
|
$factures = array_filter($_['factures'], function ($f) {
|
||||||
$datesplit = explode("-", $f->date_paiement);
|
$datesplit = explode("-", $f->date_paiement);
|
||||||
$year = (int) $datesplit[0];
|
$year = (int) $datesplit[0];
|
||||||
$month = (int) $datesplit[1];
|
$month = (int) $datesplit[1];
|
||||||
$checkClient = false;
|
$checkClient = false;
|
||||||
$filterType = "client";
|
$filterType = "client";
|
||||||
if(array_key_exists('filterType',$_GET) && $_GET['filterType'] == 'group'){
|
if(array_key_exists('filterType', $_GET) && $_GET['filterType'] == 'group') {
|
||||||
$filterType = "group";
|
$filterType = "group";
|
||||||
}
|
}
|
||||||
if($_GET['cli'] != null && $_GET['cli'] != '') {
|
if($_GET['cli'] != null && $_GET['cli'] != '') {
|
||||||
if($filterType == "group"){
|
if($filterType == "group") {
|
||||||
$checkClient = $f->fk_client_group_facturation_id == $_GET['cli'];
|
$checkClient = $f->fk_client_group_facturation_id == $_GET['cli'];
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
$checkClient = $f->id_cli == $_GET['cli'];
|
$checkClient = $f->id_cli == $_GET['cli'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$checkYear = ((int) ($_GET['annee']) == -1)?(true):($year==((int) $_GET['annee']));
|
$checkYear = ((int) ($_GET['annee']) == -1) ? (true) : ($year == ((int) $_GET['annee']));
|
||||||
$checkMounth = (((int) $_GET['mois']) == 0)? (true): ($month==((int) $_GET['mois']));
|
$checkMounth = (((int) $_GET['mois']) == 0) ? (true) : ($month == ((int) $_GET['mois']));
|
||||||
return $checkClient && $checkYear && $checkMounth;
|
return $checkClient && $checkYear && $checkMounth;
|
||||||
});
|
});
|
||||||
if(sizeof($factures)>0) {
|
if(sizeof($factures) > 0) {
|
||||||
?>
|
?>
|
||||||
<?php if($showRecapButton) {?><button class="btn btn-secondary" type="button" id="documentrecap">Generer le document recapitulatif</button><?php }?>
|
<?php if($showRecapButton) {?><button class="btn btn-secondary" type="button" id="documentrecap">Generer le document recapitulatif</button><?php }?>
|
||||||
<button class="btn btn-secondary ml-2" type="button" id="exportMultipleFactureToPdf"><?php p($l->t('Save in Nextcloud'));?></button>
|
<button class="btn btn-secondary ml-2" type="button" id="exportMultipleFactureToPdf"><?php p($l->t('Save in Nextcloud'));?></button>
|
||||||
@ -87,7 +117,9 @@
|
|||||||
<div class="canvas_div_pdf">
|
<div class="canvas_div_pdf">
|
||||||
<?php
|
<?php
|
||||||
if($_SERVER['REQUEST_METHOD'] == 'GET') {
|
if($_SERVER['REQUEST_METHOD'] == 'GET') {
|
||||||
if(sizeof($factures)==0) echo "Aucune facture trouvée.";
|
if(sizeof($factures) == 0) {
|
||||||
|
echo "Aucune facture trouvée.";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach ($factures as $key => $facture) {
|
foreach ($factures as $key => $facture) {
|
||||||
@ -112,9 +144,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-2 h-100 m-0" style="min-height:250px;">
|
<div class="col-2 h-100 m-0" style="min-height:250px;">
|
||||||
<?php
|
<?php
|
||||||
if(isset($_['logo']) && $_['logo'] !== "nothing"){
|
if(isset($_['logo']) && $_['logo'] !== "nothing") {
|
||||||
echo "<center><a><img alt='".$l->t('Company logo')."' class=\"img-fluid\" src=\"data:image/png;base64, ".$_['logo']."\"/></a></center>";
|
echo "<center><a><img alt='".$l->t('Company logo')."' class=\"img-fluid\" src=\"data:image/png;base64, ".$_['logo']."\"/></a></center>";
|
||||||
}else{
|
} else {
|
||||||
echo "<span style='font-size:12px' id='Company-logo' data-html2canvas-ignore><b><center>".$l->t('You can add your company logo here.')."</center></b><br/><i>".$l->t('To add a logo, drop the logo.png file in ".gestion" folder at the root of your Nextcloud Files app. Remember to set "Show hidden files".')."</i><br/><br/><center>".$l->t('This message will not appear on generated PDF.')."</center></span>";
|
echo "<span style='font-size:12px' id='Company-logo' data-html2canvas-ignore><b><center>".$l->t('You can add your company logo here.')."</center></b><br/><i>".$l->t('To add a logo, drop the logo.png file in ".gestion" folder at the root of your Nextcloud Files app. Remember to set "Show hidden files".')."</i><br/><br/><center>".$l->t('This message will not appear on generated PDF.')."</center></span>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@ -148,7 +180,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col col-md">
|
<div class="col col-md">
|
||||||
<hr />
|
<hr />
|
||||||
<div class="col col-xl mb-3 text-center" style="display:inline" ><?php echo ($facture->dcomment == "" ) ? "-" : $facture->dcomment ; ?></div>
|
<div class="col col-xl mb-3 text-center" style="display:inline" ><?php echo ($facture->dcomment == "") ? "-" : $facture->dcomment ; ?></div>
|
||||||
<hr />
|
<hr />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -172,7 +204,7 @@
|
|||||||
<td><?php echo $produit->comment ?></td>
|
<td><?php echo $produit->comment ?></td>
|
||||||
<td><?php echo $produit->quantite ?></td>
|
<td><?php echo $produit->quantite ?></td>
|
||||||
<td>€<?php echo number_format($produit->prix_unitaire, 2) ?></td>
|
<td>€<?php echo number_format($produit->prix_unitaire, 2) ?></td>
|
||||||
<td>€<?php echo number_format($produit->prix_unitaire*$produit->quantite, 2) ?></td>
|
<td>€<?php echo number_format($produit->prix_unitaire * $produit->quantite, 2) ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -192,13 +224,26 @@
|
|||||||
<?php
|
<?php
|
||||||
$totalhtc = 0;
|
$totalhtc = 0;
|
||||||
$tva = json_decode($_['configuration'])[0]->tva_default;
|
$tva = json_decode($_['configuration'])[0]->tva_default;
|
||||||
|
$clientTvaStatus = isset($facture->tva_cli) ? (int)$facture->tva_cli : 1;
|
||||||
|
|
||||||
$totalttc = 0;
|
$totalttc = 0;
|
||||||
$totalprice = 0;
|
$totalprice = 0;
|
||||||
|
|
||||||
foreach ($facture->dproduits as $key => $produit) {
|
foreach ($facture->dproduits as $key => $produit) {
|
||||||
$totalhtc = $totalhtc + ($produit->quantite*$produit->prix_unitaire);
|
$totalhtc = $totalhtc + ($produit->quantite * $produit->prix_unitaire);
|
||||||
}
|
}
|
||||||
$totalttc = ($totalhtc * $tva)/100;
|
|
||||||
|
// Calculer la TVA selon le statut du client
|
||||||
|
if ($clientTvaStatus === 0) {
|
||||||
|
// Client exonéré de TVA
|
||||||
|
$tva = 0;
|
||||||
|
$totalttc = 0;
|
||||||
|
$totalprice = $totalhtc;
|
||||||
|
} else {
|
||||||
|
// Client soumis à la TVA
|
||||||
|
$totalttc = ($totalhtc * $tva) / 100;
|
||||||
$totalprice = $totalhtc + $totalttc;
|
$totalprice = $totalhtc + $totalttc;
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td>€<?php echo number_format($totalhtc, 2) ?></td>
|
<td>€<?php echo number_format($totalhtc, 2) ?></td>
|
||||||
|
|||||||
@ -4,8 +4,12 @@ for ($i = 1; $i <= 10; $i++) {
|
|||||||
$quantiteOptions[] = $i / 10;
|
$quantiteOptions[] = $i / 10;
|
||||||
}
|
}
|
||||||
for ($i = 1; $i <= 15; $i++) {
|
for ($i = 1; $i <= 15; $i++) {
|
||||||
if ($i > 1) $quantiteOptions[] = $i;
|
if ($i > 1) {
|
||||||
if ($i < 15) $quantiteOptions[] = $i + 0.5;
|
$quantiteOptions[] = $i;
|
||||||
|
}
|
||||||
|
if ($i < 15) {
|
||||||
|
$quantiteOptions[] = $i + 0.5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$coverProducts = $_['coverProducts'];
|
$coverProducts = $_['coverProducts'];
|
||||||
?>
|
?>
|
||||||
@ -13,7 +17,7 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div id="defuntid" data-table="defunt" data-id="<?php echo $_['defunt'][0]->id; ?>"></div>
|
<div id="defuntid" data-table="defunt" data-id="<?php echo $_['defunt'][0]->id; ?>"></div>
|
||||||
<div class="breadcrumb" data-html2canvas-ignore>
|
<div class="breadcrumb" data-html2canvas-ignore>
|
||||||
<div class="crumb svg crumbhome">
|
<div class="crumb svg crumbhome">
|
||||||
<a href="<?php echo ($_['url']['index']); ?>" class="icon-home"></a>
|
<a href="<?php echo($_['url']['index']); ?>" class="icon-home"></a>
|
||||||
<span style="display: none;"></span>
|
<span style="display: none;"></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="crumb svg crumbhome">
|
<div class="crumb svg crumbhome">
|
||||||
@ -26,6 +30,7 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="div">
|
<div class="div">
|
||||||
<button id="exportCareCertificate" class="btn btn-secondary" type="button">Générer l'attestation de soins</button>
|
<button id="exportCareCertificate" class="btn btn-secondary" type="button">Générer l'attestation de soins</button>
|
||||||
<button id="pacemakerBtn" class="btn btn-secondary" type="button">Générer l'attestation retrait de pile</button>
|
<button id="pacemakerBtn" class="btn btn-secondary" type="button">Générer l'attestation retrait de pile</button>
|
||||||
|
<button id="pacemakerAbsentBtn" class="btn btn-secondary" type="button">Générer l'attestation d'Absence de Pacemacker</button>
|
||||||
<button id="rapportSoinBtn" class="btn btn-secondary" type="button">Générer le rapport de soins</button>
|
<button id="rapportSoinBtn" class="btn btn-secondary" type="button">Générer le rapport de soins</button>
|
||||||
<button id="showRapportBijouxExportModal" class="btn btn-secondary" type="button" data-toggle="modal" data-target="#saveRapportBijouxModal">Générer le rapport des bijoux</button>
|
<button id="showRapportBijouxExportModal" class="btn btn-secondary" type="button" data-toggle="modal" data-target="#saveRapportBijouxModal">Générer le rapport des bijoux</button>
|
||||||
</div>
|
</div>
|
||||||
@ -76,8 +81,12 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-3">Sexe</div>
|
<div class="col-3">Sexe</div>
|
||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="sexe" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="sexe" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<option value="m" <?php if (strcmp($_['defunt'][0]->sexe, 'm') == 0) echo 'selected' ?>>Masculin</option>
|
<option value="m" <?php if (strcmp($_['defunt'][0]->sexe, 'm') == 0) {
|
||||||
<option value="f" <?php if (strcmp($_['defunt'][0]->sexe, 'f') == 0) echo 'selected' ?>>Féminin</option>
|
echo 'selected';
|
||||||
|
} ?>>Masculin</option>
|
||||||
|
<option value="f" <?php if (strcmp($_['defunt'][0]->sexe, 'f') == 0) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Féminin</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div> -->
|
||||||
@ -113,7 +122,7 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<label id="pacemakerPhotoLabel" for=""><?php echo ($_['defunt'][0]->product_photo_name ?? "") ?></label>
|
<label id="pacemakerPhotoLabel" for=""><?php echo ($_['defunt'][0]->product_photo_name ?? "") ?></label>
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -202,8 +211,12 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="acces_etat" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="acces_etat" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<option>Selectionner un état</option>
|
<option>Selectionner un état</option>
|
||||||
<option value="mauvais" <?php if (strcmp($_['defunt'][0]->acces_etat, 'mauvais') == 0) echo 'selected' ?>>Mauvais</option>
|
<option value="mauvais" <?php if (strcmp($_['defunt'][0]->acces_etat, 'mauvais') == 0) {
|
||||||
<option value="bon" <?php if (strcmp($_['defunt'][0]->acces_etat, 'bon') == 0) echo 'selected' ?>>Bon</option>
|
echo 'selected';
|
||||||
|
} ?>>Mauvais</option>
|
||||||
|
<option value="bon" <?php if (strcmp($_['defunt'][0]->acces_etat, 'bon') == 0) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Bon</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -225,7 +238,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="preinjection_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="preinjection_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
||||||
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->preinjection_qte == $quantiteOptions[$i]) echo 'selected' ?>><?php echo $quantiteOptions[$i] ?></option>
|
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->preinjection_qte == $quantiteOptions[$i]) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>><?php echo $quantiteOptions[$i] ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -248,8 +263,12 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="injection_diffusion" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="injection_diffusion" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<option>Selectionner un état</option>
|
<option>Selectionner un état</option>
|
||||||
<option value="mauvaise" <?php if (strcmp($_['defunt'][0]->injection_diffusion, 'mauvaise') == 0) echo 'selected' ?>>Mauvaise</option>
|
<option value="mauvaise" <?php if (strcmp($_['defunt'][0]->injection_diffusion, 'mauvaise') == 0) {
|
||||||
<option value="bonne" <?php if (strcmp($_['defunt'][0]->injection_diffusion, 'bonne') == 0) echo 'selected' ?>>Bonne</option>
|
echo 'selected';
|
||||||
|
} ?>>Mauvaise</option>
|
||||||
|
<option value="bonne" <?php if (strcmp($_['defunt'][0]->injection_diffusion, 'bonne') == 0) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Bonne</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -259,7 +278,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="injection_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="injection_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
||||||
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->injection_qte == $quantiteOptions[$i]) echo 'selected' ?>><?php echo $quantiteOptions[$i] ?></option>
|
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->injection_qte == $quantiteOptions[$i]) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>><?php echo $quantiteOptions[$i] ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -282,7 +303,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="coinjection_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="coinjection_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
||||||
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->coinjection_qte == $quantiteOptions[$i]) echo 'selected' ?>><?php echo $quantiteOptions[$i] ?></option>
|
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->coinjection_qte == $quantiteOptions[$i]) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>><?php echo $quantiteOptions[$i] ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -305,8 +328,12 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="drainage_etat" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="drainage_etat" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<option>Selectionner un état</option>
|
<option>Selectionner un état</option>
|
||||||
<option value="mauvaise" <?php if (strcmp($_['defunt'][0]->drainage_etat, 'mauvaise') == 0) echo 'selected' ?>>Mauvaise</option>
|
<option value="mauvaise" <?php if (strcmp($_['defunt'][0]->drainage_etat, 'mauvaise') == 0) {
|
||||||
<option value="bonne" <?php if (strcmp($_['defunt'][0]->drainage_etat, 'bonne') == 0) echo 'selected' ?>>Bonne</option>
|
echo 'selected';
|
||||||
|
} ?>>Mauvaise</option>
|
||||||
|
<option value="bonne" <?php if (strcmp($_['defunt'][0]->drainage_etat, 'bonne') == 0) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>>Bonne</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -316,7 +343,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="drainage_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="drainage_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
||||||
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->drainage_qte == $quantiteOptions[$i]) echo 'selected' ?>><?php echo $quantiteOptions[$i] ?></option>
|
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->drainage_qte == $quantiteOptions[$i]) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>><?php echo $quantiteOptions[$i] ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -339,7 +368,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="ponction_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="ponction_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
||||||
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->ponction_qte == $quantiteOptions[$i]) echo 'selected' ?>><?php echo $quantiteOptions[$i] ?></option>
|
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->ponction_qte == $quantiteOptions[$i]) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>><?php echo $quantiteOptions[$i] ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -362,7 +393,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="col-9">
|
<div class="col-9">
|
||||||
<select class="gestion-select w-100" data-table="defunt" data-column="cavite_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
<select class="gestion-select w-100" data-table="defunt" data-column="cavite_qte" data-id="<?php echo $_['defunt'][0]->id ?>">
|
||||||
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
<?php for ($i = 0; $i < sizeof($quantiteOptions); $i++) { ?>
|
||||||
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->cavite_qte == $quantiteOptions[$i]) echo 'selected' ?>><?php echo $quantiteOptions[$i] ?></option>
|
<option value="<?php echo $quantiteOptions[$i] ?>" <?php if ($_['defunt'][0]->cavite_qte == $quantiteOptions[$i]) {
|
||||||
|
echo 'selected';
|
||||||
|
} ?>><?php echo $quantiteOptions[$i] ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -417,7 +450,9 @@ $coverProducts = $_['coverProducts'];
|
|||||||
<div class="d-flex flex-row col-12 align-items-center" style="margin-bottom: 8px">
|
<div class="d-flex flex-row col-12 align-items-center" style="margin-bottom: 8px">
|
||||||
<div class="col-3">Rasage</div>
|
<div class="col-3">Rasage</div>
|
||||||
<div class="d-flex col-9 justify-content-start align-items-start">
|
<div class="d-flex col-9 justify-content-start align-items-start">
|
||||||
<input class="gestion-checkbox" type="checkbox" <?php if ($_['defunt'][0]->rasage == 1) echo 'checked' ?> data-table="defunt" data-column="rasage" data-id="<?php echo $_['defunt'][0]->id ?>" />
|
<input class="gestion-checkbox" type="checkbox" <?php if ($_['defunt'][0]->rasage == 1) {
|
||||||
|
echo 'checked';
|
||||||
|
} ?> data-table="defunt" data-column="rasage" data-id="<?php echo $_['defunt'][0]->id ?>" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -39,6 +39,7 @@
|
|||||||
<th><?php p($l->t('Date de paiement'));?></th>
|
<th><?php p($l->t('Date de paiement'));?></th>
|
||||||
<th><?php p($l->t('Générée'));?></th>
|
<th><?php p($l->t('Générée'));?></th>
|
||||||
<th><?php p($l->t('Envoyée au client'));?></th>
|
<th><?php p($l->t('Envoyée au client'));?></th>
|
||||||
|
<th><?php p($l->t('Total TTC'));?></th>
|
||||||
<th><?php p($l->t('Actions'));?></th>
|
<th><?php p($l->t('Actions'));?></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use OC\URLGenerator;
|
use OC\URLGenerator;
|
||||||
use OCA\Gestion\Helpers\PriceHelpers;
|
use OCA\Gestion\Helpers\PriceHelpers;
|
||||||
|
|
||||||
$facture = $_['facture'];
|
$facture = $_['facture'];
|
||||||
$factureOrderNumber = $facture->facture_order_number == '' ? '-' : $facture->facture_order_number;
|
$factureOrderNumber = $facture->facture_order_number == '' ? '-' : $facture->facture_order_number;
|
||||||
$factureCaseNumber = $facture->facture_case_number == '' ? '-' : $facture->facture_case_number;
|
$factureCaseNumber = $facture->facture_case_number == '' ? '-' : $facture->facture_case_number;
|
||||||
@ -11,7 +12,7 @@ $currentConfig = json_decode($_['configuration'])[0];
|
|||||||
<div class="bootstrap-iso">
|
<div class="bootstrap-iso">
|
||||||
<div id="factureId" data-id="<?php echo $facture->id; ?>"></div>
|
<div id="factureId" data-id="<?php echo $facture->id; ?>"></div>
|
||||||
<div id="factureIdentifier" data-id="<?php echo $facture->id; ?>"></div>
|
<div id="factureIdentifier" data-id="<?php echo $facture->id; ?>"></div>
|
||||||
<h2 class="mt-3 mb-3 text-center"> <?php echo ('Facture n° '.$facture->num); ?>
|
<h2 class="mt-3 mb-3 text-center"> <?php echo('Facture n° '.$facture->num); ?>
|
||||||
</h2>
|
</h2>
|
||||||
<hr />
|
<hr />
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@ -34,7 +35,7 @@ $currentConfig = json_decode($_['configuration'])[0];
|
|||||||
} else {
|
} else {
|
||||||
echo "<span style='font-size:12px' id='Company-logo' data-html2canvas-ignore><b><center>" . $l->t('You can add your company logo here.') . "</center></b><br/><i>" . $l->t('To add a logo, drop the logo.png file in ".gestion" folder at the root of your Nextcloud Files app. Remember to set "Show hidden files".') . "</i><br/><br/><center>" . $l->t('This message will not appear on generated PDF.') . "</center></span>";
|
echo "<span style='font-size:12px' id='Company-logo' data-html2canvas-ignore><b><center>" . $l->t('You can add your company logo here.') . "</center></b><br/><i>" . $l->t('To add a logo, drop the logo.png file in ".gestion" folder at the root of your Nextcloud Files app. Remember to set "Show hidden files".') . "</i><br/><br/><center>" . $l->t('This message will not appear on generated PDF.') . "</center></span>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-5 h-100 m-0" style="min-height:250px;">
|
<div class="col-5 h-100 m-0" style="min-height:250px;">
|
||||||
<h5 class="p-3 m-0 text-dark text-center border border-2 border-dark"><?php p($l->t('TO')); ?>
|
<h5 class="p-3 m-0 text-dark text-center border border-2 border-dark"><?php p($l->t('TO')); ?>
|
||||||
@ -42,7 +43,7 @@ $currentConfig = json_decode($_['configuration'])[0];
|
|||||||
<p style="min-height:180px;"
|
<p style="min-height:180px;"
|
||||||
class="p-3 m-0 h-100 text-center text-dark text-center border border-top-0 border-2 border-dark">
|
class="p-3 m-0 h-100 text-center text-dark text-center border border-top-0 border-2 border-dark">
|
||||||
<span><?php echo $facture->group_name; ?></span><br />
|
<span><?php echo $facture->group_name; ?></span><br />
|
||||||
<?php if($isFactureClientGroup == false){
|
<?php if($isFactureClientGroup == false) {
|
||||||
?>
|
?>
|
||||||
<span><?php echo $facture->client_name; ?></span><br />
|
<span><?php echo $facture->client_name; ?></span><br />
|
||||||
<?php }?>
|
<?php }?>
|
||||||
@ -88,7 +89,7 @@ $currentConfig = json_decode($_['configuration'])[0];
|
|||||||
<tbody>
|
<tbody>
|
||||||
<?php
|
<?php
|
||||||
$devisList = $facture->devisList;
|
$devisList = $facture->devisList;
|
||||||
foreach ($devisList as $currentDevis) {
|
foreach ($devisList as $currentDevis) {
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td><?php echo $currentDevis->devis_full_number; ?></td>
|
<td><?php echo $currentDevis->devis_full_number; ?></td>
|
||||||
@ -113,7 +114,7 @@ $currentConfig = json_decode($_['configuration'])[0];
|
|||||||
class="mb-2 btn btn-outline-success sendmail"
|
class="mb-2 btn btn-outline-success sendmail"
|
||||||
><?php p($l->t('Send by email'));?></button>
|
><?php p($l->t('Send by email'));?></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-0 table-responsive">
|
<div class="mt-0 table-responsive">
|
||||||
<table id="totalFactureGroupPrice" class="table table-striped table-xl">
|
<table id="totalFactureGroupPrice" class="table table-striped table-xl">
|
||||||
<thead class="bg-dark text-white">
|
<thead class="bg-dark text-white">
|
||||||
<tr>
|
<tr>
|
||||||
@ -125,14 +126,31 @@ $currentConfig = json_decode($_['configuration'])[0];
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-center"><?php echo (PriceHelpers::formatDecimalPrice($facture->totalHt).'€'); ?></td>
|
<td class="text-center"><?php echo PriceHelpers::formatDecimalPrice($facture->totalHt).'€'; ?></td>
|
||||||
<td class="text-center"><?php echo (PriceHelpers::formatDecimalPrice($currentConfig->tva_default).'€'); ?></td>
|
<td class="text-center">
|
||||||
<td class="text-center"><?php echo (PriceHelpers::formatDecimalPrice($facture->totalTva).'€'); ?></td>
|
<?php
|
||||||
<td class="text-center"><?php echo (PriceHelpers::formatDecimalPrice($facture->totalTtc).'€'); ?></td>
|
// Affichage simple : Exonéré ou taux par défaut
|
||||||
|
if (isset($facture->tvaInfo) && $facture->tvaInfo->is_exempt) {
|
||||||
|
echo 'Exonéré';
|
||||||
|
} else {
|
||||||
|
echo PriceHelpers::formatDecimalPrice($facture->tvaInfo->rate).'%';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</td>
|
||||||
|
<td class="text-center">
|
||||||
|
<?php
|
||||||
|
if (isset($facture->tvaInfo) && $facture->tvaInfo->is_exempt) {
|
||||||
|
echo '0,00€';
|
||||||
|
} else {
|
||||||
|
echo PriceHelpers::formatDecimalPrice($facture->totalTva).'€';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</td>
|
||||||
|
<td class="text-center"><?php echo PriceHelpers::formatDecimalPrice($facture->totalTtc).'€'; ?></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="col m-0 pb-0 alert alert-info text-center">
|
<div class="col m-0 pb-0 alert alert-info text-center">
|
||||||
<p><span id="mentions_default"><?php p($l->t('Please set in global configuration')); ?></span></p>
|
<p><span id="mentions_default"><?php p($l->t('Please set in global configuration')); ?></span></p>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -27,11 +27,14 @@
|
|||||||
<th><?php p($l->t('ID'));?></th>
|
<th><?php p($l->t('ID'));?></th>
|
||||||
<th><?php p($l->t('Code comptable'));?></th>
|
<th><?php p($l->t('Code comptable'));?></th>
|
||||||
<th><?php p($l->t('Agence'));?></th>
|
<th><?php p($l->t('Agence'));?></th>
|
||||||
|
<th><?php p($l->t('Prénom'));?></th> <!-- AJOUTÉ -->
|
||||||
|
<th><?php p($l->t('Nom'));?></th> <!-- AJOUTÉ -->
|
||||||
<th><?php p($l->t('Company'));?></th>
|
<th><?php p($l->t('Company'));?></th>
|
||||||
<th><?php p($l->t('Legal information'));?></th>
|
<th><?php p($l->t('Legal information'));?></th>
|
||||||
<th><?php p($l->t('Phone number'));?></th>
|
<th><?php p($l->t('Phone number'));?></th>
|
||||||
<th><?php p($l->t('Email'));?></th>
|
<th><?php p($l->t('Email'));?></th>
|
||||||
<th><?php p($l->t('Address'));?></th>
|
<th><?php p($l->t('Address'));?></th>
|
||||||
|
<th><?php p($l->t('TVA'));?></th>
|
||||||
<th><?php p($l->t('Groupes tarifaires'));?></th>
|
<th><?php p($l->t('Groupes tarifaires'));?></th>
|
||||||
<th><?php p($l->t('Groupes facturations'));?></th>
|
<th><?php p($l->t('Groupes facturations'));?></th>
|
||||||
<th><?php p($l->t('Actions'));?></th>
|
<th><?php p($l->t('Actions'));?></th>
|
||||||
|
|||||||
194
gestion/templates/pdf/facture_dv_thanato.php
Normal file
194
gestion/templates/pdf/facture_dv_thanato.php
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Facture DV Thanato</title>
|
||||||
|
<style>
|
||||||
|
@page { margin: 20mm 15mm; size: A4; }
|
||||||
|
body { font-family: Arial, sans-serif; font-size: 11px; line-height: 1.4; color: #000; margin: 0; padding: 0; }
|
||||||
|
.container { width: 100%; }
|
||||||
|
|
||||||
|
/* LOGO EN HAUT */
|
||||||
|
.logo-section { margin-bottom: 20px; }
|
||||||
|
.logo { width: 180px; height: auto; }
|
||||||
|
|
||||||
|
/* HEADER AVEC TABLE POUR ALIGNEMENT */
|
||||||
|
.header-table { width: 100%; margin-bottom: 30px; }
|
||||||
|
.header-table td { vertical-align: top; padding: 0; }
|
||||||
|
.header-left { width: 45%; }
|
||||||
|
.header-right { width: 55%; text-align: right; }
|
||||||
|
|
||||||
|
/* INFORMATIONS GAUCHE */
|
||||||
|
.invoice-info { line-height: 1.6; }
|
||||||
|
.info-line { margin: 5px 0; }
|
||||||
|
.info-line strong { display: inline-block; width: 140px; font-weight: bold; }
|
||||||
|
|
||||||
|
/* INFORMATIONS CLIENT DROITE */
|
||||||
|
.client-info { text-align: right; line-height: 1.5; font-size: 12px; }
|
||||||
|
.client-info strong { display: block; margin-bottom: 3px; font-size: 13px; }
|
||||||
|
|
||||||
|
.invoice-header { margin: 25px 0; }
|
||||||
|
.invoice-header h2 { font-size: 14px; margin: 5px 0; font-weight: bold; }
|
||||||
|
.invoice-period { font-size: 11px; margin: 5px 0; }
|
||||||
|
|
||||||
|
/* TABLEAU SERVICES */
|
||||||
|
.services-table { width: 100%; border-collapse: collapse; margin: 20px 0; }
|
||||||
|
.services-table th { background-color: #f0f0f0; border: 1px solid #ccc; padding: 8px; text-align: left; font-weight: bold; font-size: 11px; }
|
||||||
|
.services-table td { border: 1px solid #ccc; padding: 6px 8px; vertical-align: top; font-size: 10px; }
|
||||||
|
|
||||||
|
.ref-col { width: 12%; }
|
||||||
|
.label-col { width: 48%; }
|
||||||
|
.price-col { width: 13%; text-align: right; }
|
||||||
|
.qty-col { width: 10%; text-align: center; }
|
||||||
|
.amount-col { width: 17%; text-align: right; }
|
||||||
|
|
||||||
|
/* LIGNES SPÉCIALES */
|
||||||
|
.date-row { background-color: #f8f8f8; font-weight: bold; }
|
||||||
|
.date-row td { padding: 8px; border: none; border-bottom: 1px solid #ddd; text-align: center; }
|
||||||
|
|
||||||
|
.deceased-row { font-style: italic; background-color: #fafafa; }
|
||||||
|
.deceased-row td { padding: 8px; border: none; font-weight: bold; }
|
||||||
|
|
||||||
|
/* TOTAUX */
|
||||||
|
.totals-section { margin-top: 30px; }
|
||||||
|
.totals-table { width: 300px; float: right; border-collapse: collapse; }
|
||||||
|
.totals-table td { padding: 8px 12px; font-size: 12px; }
|
||||||
|
.total-label { text-align: right; font-weight: bold; width: 60%; }
|
||||||
|
.total-amount { text-align: right; font-weight: bold; width: 40%; }
|
||||||
|
.total-row-ht { border-top: 1px solid #ccc; }
|
||||||
|
.total-row-final { border-top: 2px solid #000; font-size: 13px; }
|
||||||
|
|
||||||
|
/* CLEAR FLOAT */
|
||||||
|
.clear { clear: both; }
|
||||||
|
|
||||||
|
/* MENTIONS LÉGALES */
|
||||||
|
.legal-section { margin-top: 40px; padding-top: 20px; border-top: 1px solid #ccc; }
|
||||||
|
.legal-text { font-size: 9px; line-height: 1.4; margin-bottom: 20px; text-align: justify; }
|
||||||
|
.bank-info { margin: 20px 0; font-size: 10px; line-height: 1.5; }
|
||||||
|
.bank-info strong { display: inline-block; width: 150px; }
|
||||||
|
.company-footer { margin-top: 30px; padding: 15px; background-color: #f5f5f5; font-size: 10px; line-height: 1.5; }
|
||||||
|
.company-footer strong { display: block; margin-bottom: 5px; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<!-- Logo en haut à gauche -->
|
||||||
|
<div class="logo-section">
|
||||||
|
<img src="data:image/png;base64,<?= $logo_base64 ?>" alt="<?= htmlspecialchars($company['name']) ?>" class="logo">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Header avec table pour compatibilité dompdf -->
|
||||||
|
<table class="header-table">
|
||||||
|
<tr>
|
||||||
|
<td class="header-left">
|
||||||
|
<div class="invoice-info">
|
||||||
|
<div class="info-line">
|
||||||
|
<strong>Date :</strong><?= htmlspecialchars($facture['date']) ?>
|
||||||
|
</div>
|
||||||
|
<div class="info-line">
|
||||||
|
<strong>Échéance :</strong><?= htmlspecialchars($facture['echeance']) ?>
|
||||||
|
</div>
|
||||||
|
<div class="info-line">
|
||||||
|
<strong>Mode de paiement :</strong>Virement
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td class="header-right">
|
||||||
|
<div class="client-info">
|
||||||
|
<strong><?= htmlspecialchars($client['name']) ?></strong>
|
||||||
|
<?= htmlspecialchars($client['address']) ?><br>
|
||||||
|
<?= htmlspecialchars($client['city']) ?><br>
|
||||||
|
<?php if (!empty($client['siret'])): ?>
|
||||||
|
SIRET: <?= htmlspecialchars($client['siret']) ?>
|
||||||
|
<?php endif; ?>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- Numéro de facture -->
|
||||||
|
<div class="invoice-header">
|
||||||
|
<h2>Facture <?= htmlspecialchars($facture['number']) ?></h2>
|
||||||
|
<div class="invoice-period">Période : du <?= htmlspecialchars($facture['period_start']) ?> au <?= htmlspecialchars($facture['period_end']) ?></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tableau des services -->
|
||||||
|
<table class="services-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="ref-col">Référence</th>
|
||||||
|
<th class="label-col">Libellé</th>
|
||||||
|
<th class="price-col">P.U HT</th>
|
||||||
|
<th class="qty-col">Quantité</th>
|
||||||
|
<th class="amount-col">Montant HT</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php foreach ($groupedArticles as $dateGroup): ?>
|
||||||
|
<!-- Ligne de date centrée -->
|
||||||
|
<tr class="date-row">
|
||||||
|
<td colspan="5"><strong><?= htmlspecialchars($dateGroup['date']) ?></strong></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<?php foreach ($dateGroup['defunts'] as $defunt): ?>
|
||||||
|
<!-- Ligne du défunt -->
|
||||||
|
<tr class="deceased-row">
|
||||||
|
<td colspan="5"><?= htmlspecialchars($defunt['nom']) ?></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<!-- Services pour ce défunt -->
|
||||||
|
<?php foreach ($defunt['services'] as $service): ?>
|
||||||
|
<tr>
|
||||||
|
<td class="ref-col"><?= htmlspecialchars($service['reference']) ?></td>
|
||||||
|
<td class="label-col"><?= htmlspecialchars($service['description']) ?></td>
|
||||||
|
<td class="price-col"><?= htmlspecialchars($service['prix_ht']) ?> €</td>
|
||||||
|
<td class="qty-col"><?= htmlspecialchars($service['quantite']) ?></td>
|
||||||
|
<td class="amount-col"><?= htmlspecialchars($service['prix_ttc']) ?> €</td>
|
||||||
|
</tr>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- Section totaux -->
|
||||||
|
<div class="totals-section">
|
||||||
|
<table class="totals-table">
|
||||||
|
<tr class="total-row-ht">
|
||||||
|
<td class="total-label">Total HT</td>
|
||||||
|
<td class="total-amount"><?= htmlspecialchars($totals['total_ht']) ?> €</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="total-label"><?= htmlspecialchars($totals['tva_label']) ?></td>
|
||||||
|
<td class="total-amount"><?= htmlspecialchars($totals['total_tva']) ?> €</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="total-row-final">
|
||||||
|
<td class="total-label">Montant total</td>
|
||||||
|
<td class="total-amount"><?= htmlspecialchars($totals['total_ttc']) ?> €</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="clear"></div>
|
||||||
|
|
||||||
|
<!-- Mentions légales -->
|
||||||
|
<div class="legal-section">
|
||||||
|
<div class="legal-text">
|
||||||
|
<?= nl2br(htmlspecialchars($legal_text)) ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="bank-info">
|
||||||
|
<div><strong>Coordonnées bancaires</strong></div>
|
||||||
|
<div><strong>IBAN:</strong> <?= htmlspecialchars($bank['iban']) ?></div>
|
||||||
|
<div><strong>BIC:</strong> <?= htmlspecialchars($bank['swift']) ?></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="company-footer">
|
||||||
|
<strong><?= htmlspecialchars($company['name']) ?></strong>
|
||||||
|
<?= htmlspecialchars($company['address']) ?>, <?= htmlspecialchars($company['city']) ?><br>
|
||||||
|
<?= htmlspecialchars($bank['rcs']) ?> - Code NAF 9603Z
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
84
gestion/vendor/composer/ClassLoader.php
vendored
84
gestion/vendor/composer/ClassLoader.php
vendored
@ -45,35 +45,34 @@ class ClassLoader
|
|||||||
/** @var \Closure(string):void */
|
/** @var \Closure(string):void */
|
||||||
private static $includeFile;
|
private static $includeFile;
|
||||||
|
|
||||||
/** @var ?string */
|
/** @var string|null */
|
||||||
private $vendorDir;
|
private $vendorDir;
|
||||||
|
|
||||||
// PSR-4
|
// PSR-4
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var array<string, array<string, int>>
|
||||||
* @psalm-var array<string, array<string, int>>
|
|
||||||
*/
|
*/
|
||||||
private $prefixLengthsPsr4 = array();
|
private $prefixLengthsPsr4 = array();
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var array<string, list<string>>
|
||||||
* @psalm-var array<string, array<int, string>>
|
|
||||||
*/
|
*/
|
||||||
private $prefixDirsPsr4 = array();
|
private $prefixDirsPsr4 = array();
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var list<string>
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
private $fallbackDirsPsr4 = array();
|
private $fallbackDirsPsr4 = array();
|
||||||
|
|
||||||
// PSR-0
|
// PSR-0
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* List of PSR-0 prefixes
|
||||||
* @psalm-var array<string, array<string, string[]>>
|
*
|
||||||
|
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
|
||||||
|
*
|
||||||
|
* @var array<string, array<string, list<string>>>
|
||||||
*/
|
*/
|
||||||
private $prefixesPsr0 = array();
|
private $prefixesPsr0 = array();
|
||||||
/**
|
/**
|
||||||
* @var array[]
|
* @var list<string>
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
private $fallbackDirsPsr0 = array();
|
private $fallbackDirsPsr0 = array();
|
||||||
|
|
||||||
@ -81,8 +80,7 @@ class ClassLoader
|
|||||||
private $useIncludePath = false;
|
private $useIncludePath = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string[]
|
* @var array<string, string>
|
||||||
* @psalm-var array<string, string>
|
|
||||||
*/
|
*/
|
||||||
private $classMap = array();
|
private $classMap = array();
|
||||||
|
|
||||||
@ -90,21 +88,20 @@ class ClassLoader
|
|||||||
private $classMapAuthoritative = false;
|
private $classMapAuthoritative = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var bool[]
|
* @var array<string, bool>
|
||||||
* @psalm-var array<string, bool>
|
|
||||||
*/
|
*/
|
||||||
private $missingClasses = array();
|
private $missingClasses = array();
|
||||||
|
|
||||||
/** @var ?string */
|
/** @var string|null */
|
||||||
private $apcuPrefix;
|
private $apcuPrefix;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var self[]
|
* @var array<string, self>
|
||||||
*/
|
*/
|
||||||
private static $registeredLoaders = array();
|
private static $registeredLoaders = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ?string $vendorDir
|
* @param string|null $vendorDir
|
||||||
*/
|
*/
|
||||||
public function __construct($vendorDir = null)
|
public function __construct($vendorDir = null)
|
||||||
{
|
{
|
||||||
@ -113,7 +110,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string[]
|
* @return array<string, list<string>>
|
||||||
*/
|
*/
|
||||||
public function getPrefixes()
|
public function getPrefixes()
|
||||||
{
|
{
|
||||||
@ -125,8 +122,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return array<string, list<string>>
|
||||||
* @psalm-return array<string, array<int, string>>
|
|
||||||
*/
|
*/
|
||||||
public function getPrefixesPsr4()
|
public function getPrefixesPsr4()
|
||||||
{
|
{
|
||||||
@ -134,8 +130,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return list<string>
|
||||||
* @psalm-return array<string, string>
|
|
||||||
*/
|
*/
|
||||||
public function getFallbackDirs()
|
public function getFallbackDirs()
|
||||||
{
|
{
|
||||||
@ -143,8 +138,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array[]
|
* @return list<string>
|
||||||
* @psalm-return array<string, string>
|
|
||||||
*/
|
*/
|
||||||
public function getFallbackDirsPsr4()
|
public function getFallbackDirsPsr4()
|
||||||
{
|
{
|
||||||
@ -152,8 +146,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string[] Array of classname => path
|
* @return array<string, string> Array of classname => path
|
||||||
* @psalm-return array<string, string>
|
|
||||||
*/
|
*/
|
||||||
public function getClassMap()
|
public function getClassMap()
|
||||||
{
|
{
|
||||||
@ -161,8 +154,7 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string[] $classMap Class to filename map
|
* @param array<string, string> $classMap Class to filename map
|
||||||
* @psalm-param array<string, string> $classMap
|
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -180,23 +172,24 @@ class ClassLoader
|
|||||||
* appending or prepending to the ones previously set for this prefix.
|
* appending or prepending to the ones previously set for this prefix.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix
|
* @param string $prefix The prefix
|
||||||
* @param string[]|string $paths The PSR-0 root directories
|
* @param list<string>|string $paths The PSR-0 root directories
|
||||||
* @param bool $prepend Whether to prepend the directories
|
* @param bool $prepend Whether to prepend the directories
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function add($prefix, $paths, $prepend = false)
|
public function add($prefix, $paths, $prepend = false)
|
||||||
{
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
if (!$prefix) {
|
if (!$prefix) {
|
||||||
if ($prepend) {
|
if ($prepend) {
|
||||||
$this->fallbackDirsPsr0 = array_merge(
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->fallbackDirsPsr0
|
$this->fallbackDirsPsr0
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->fallbackDirsPsr0 = array_merge(
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
$this->fallbackDirsPsr0,
|
$this->fallbackDirsPsr0,
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,19 +198,19 @@ class ClassLoader
|
|||||||
|
|
||||||
$first = $prefix[0];
|
$first = $prefix[0];
|
||||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
$this->prefixesPsr0[$first][$prefix] = $paths;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($prepend) {
|
if ($prepend) {
|
||||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->prefixesPsr0[$first][$prefix]
|
$this->prefixesPsr0[$first][$prefix]
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
$this->prefixesPsr0[$first][$prefix],
|
$this->prefixesPsr0[$first][$prefix],
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,7 +220,7 @@ class ClassLoader
|
|||||||
* appending or prepending to the ones previously set for this namespace.
|
* appending or prepending to the ones previously set for this namespace.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
* @param string[]|string $paths The PSR-4 base directories
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
* @param bool $prepend Whether to prepend the directories
|
* @param bool $prepend Whether to prepend the directories
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
@ -236,17 +229,18 @@ class ClassLoader
|
|||||||
*/
|
*/
|
||||||
public function addPsr4($prefix, $paths, $prepend = false)
|
public function addPsr4($prefix, $paths, $prepend = false)
|
||||||
{
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
if (!$prefix) {
|
if (!$prefix) {
|
||||||
// Register directories for the root namespace.
|
// Register directories for the root namespace.
|
||||||
if ($prepend) {
|
if ($prepend) {
|
||||||
$this->fallbackDirsPsr4 = array_merge(
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->fallbackDirsPsr4
|
$this->fallbackDirsPsr4
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
$this->fallbackDirsPsr4 = array_merge(
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
$this->fallbackDirsPsr4,
|
$this->fallbackDirsPsr4,
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||||
@ -256,18 +250,18 @@ class ClassLoader
|
|||||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
}
|
}
|
||||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
$this->prefixDirsPsr4[$prefix] = $paths;
|
||||||
} elseif ($prepend) {
|
} elseif ($prepend) {
|
||||||
// Prepend directories for an already registered namespace.
|
// Prepend directories for an already registered namespace.
|
||||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
(array) $paths,
|
$paths,
|
||||||
$this->prefixDirsPsr4[$prefix]
|
$this->prefixDirsPsr4[$prefix]
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Append directories for an already registered namespace.
|
// Append directories for an already registered namespace.
|
||||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
$this->prefixDirsPsr4[$prefix],
|
$this->prefixDirsPsr4[$prefix],
|
||||||
(array) $paths
|
$paths
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -277,7 +271,7 @@ class ClassLoader
|
|||||||
* replacing any others previously set for this prefix.
|
* replacing any others previously set for this prefix.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix
|
* @param string $prefix The prefix
|
||||||
* @param string[]|string $paths The PSR-0 base directories
|
* @param list<string>|string $paths The PSR-0 base directories
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@ -295,7 +289,7 @@ class ClassLoader
|
|||||||
* replacing any others previously set for this namespace.
|
* replacing any others previously set for this namespace.
|
||||||
*
|
*
|
||||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
* @param string[]|string $paths The PSR-4 base directories
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
*
|
*
|
||||||
* @throws \InvalidArgumentException
|
* @throws \InvalidArgumentException
|
||||||
*
|
*
|
||||||
@ -481,9 +475,9 @@ class ClassLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the currently registered loaders indexed by their corresponding vendor directories.
|
* Returns the currently registered loaders keyed by their corresponding vendor directories.
|
||||||
*
|
*
|
||||||
* @return self[]
|
* @return array<string, self>
|
||||||
*/
|
*/
|
||||||
public static function getRegisteredLoaders()
|
public static function getRegisteredLoaders()
|
||||||
{
|
{
|
||||||
|
|||||||
359
gestion/vendor/composer/InstalledVersions.php
vendored
Normal file
359
gestion/vendor/composer/InstalledVersions.php
vendored
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer;
|
||||||
|
|
||||||
|
use Composer\Autoload\ClassLoader;
|
||||||
|
use Composer\Semver\VersionParser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is copied in every Composer installed project and available to all
|
||||||
|
*
|
||||||
|
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
||||||
|
*
|
||||||
|
* To require its presence, you can require `composer-runtime-api ^2.0`
|
||||||
|
*
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
class InstalledVersions
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var mixed[]|null
|
||||||
|
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
|
||||||
|
*/
|
||||||
|
private static $installed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool|null
|
||||||
|
*/
|
||||||
|
private static $canGetVendors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array[]
|
||||||
|
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
private static $installedByVendor = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
||||||
|
*
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackages()
|
||||||
|
{
|
||||||
|
$packages = array();
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
$packages[] = array_keys($installed['versions']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 === \count($packages)) {
|
||||||
|
return $packages[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names with a specific type e.g. 'library'
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackagesByType($type)
|
||||||
|
{
|
||||||
|
$packagesByType = array();
|
||||||
|
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
foreach ($installed['versions'] as $name => $package) {
|
||||||
|
if (isset($package['type']) && $package['type'] === $type) {
|
||||||
|
$packagesByType[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $packagesByType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given package is installed
|
||||||
|
*
|
||||||
|
* This also returns true if the package name is provided or replaced by another package
|
||||||
|
*
|
||||||
|
* @param string $packageName
|
||||||
|
* @param bool $includeDevRequirements
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isInstalled($packageName, $includeDevRequirements = true)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (isset($installed['versions'][$packageName])) {
|
||||||
|
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given package satisfies a version constraint
|
||||||
|
*
|
||||||
|
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
||||||
|
*
|
||||||
|
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
||||||
|
*
|
||||||
|
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
||||||
|
* @param string $packageName
|
||||||
|
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||||
|
{
|
||||||
|
$constraint = $parser->parseConstraints((string) $constraint);
|
||||||
|
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||||
|
|
||||||
|
return $provided->matches($constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a version constraint representing all the range(s) which are installed for a given package
|
||||||
|
*
|
||||||
|
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
||||||
|
* whether a given version of a package is installed, and not just whether it exists
|
||||||
|
*
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string Version constraint usable with composer/semver
|
||||||
|
*/
|
||||||
|
public static function getVersionRanges($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ranges = array();
|
||||||
|
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||||
|
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
||||||
|
}
|
||||||
|
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
||||||
|
}
|
||||||
|
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
||||||
|
}
|
||||||
|
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(' || ', $ranges);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||||
|
*/
|
||||||
|
public static function getVersion($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['version'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||||
|
*/
|
||||||
|
public static function getPrettyVersion($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['pretty_version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
||||||
|
*/
|
||||||
|
public static function getReference($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['reference'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['reference'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||||
|
*/
|
||||||
|
public static function getInstallPath($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
|
||||||
|
*/
|
||||||
|
public static function getRootPackage()
|
||||||
|
{
|
||||||
|
$installed = self::getInstalled();
|
||||||
|
|
||||||
|
return $installed[0]['root'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw installed.php data for custom implementations
|
||||||
|
*
|
||||||
|
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
|
||||||
|
*/
|
||||||
|
public static function getRawData()
|
||||||
|
{
|
||||||
|
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
// only require the installed.php file if this file is loaded from its dumped location,
|
||||||
|
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||||
|
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||||
|
self::$installed = include __DIR__ . '/installed.php';
|
||||||
|
} else {
|
||||||
|
self::$installed = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$installed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||||
|
*
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
public static function getAllRawData()
|
||||||
|
{
|
||||||
|
return self::getInstalled();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets you reload the static array from another file
|
||||||
|
*
|
||||||
|
* This is only useful for complex integrations in which a project needs to use
|
||||||
|
* this class but then also needs to execute another project's autoloader in process,
|
||||||
|
* and wants to ensure both projects have access to their version of installed.php.
|
||||||
|
*
|
||||||
|
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
||||||
|
* the data it needs from this class, then call reload() with
|
||||||
|
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
||||||
|
* the project in which it runs can then also use this class safely, without
|
||||||
|
* interference between PHPUnit's dependencies and the project's dependencies.
|
||||||
|
*
|
||||||
|
* @param array[] $data A vendor/composer/installed.php data set
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
|
||||||
|
*/
|
||||||
|
public static function reload($data)
|
||||||
|
{
|
||||||
|
self::$installed = $data;
|
||||||
|
self::$installedByVendor = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
private static function getInstalled()
|
||||||
|
{
|
||||||
|
if (null === self::$canGetVendors) {
|
||||||
|
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
||||||
|
}
|
||||||
|
|
||||||
|
$installed = array();
|
||||||
|
|
||||||
|
if (self::$canGetVendors) {
|
||||||
|
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||||
|
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||||
|
$installed[] = self::$installedByVendor[$vendorDir];
|
||||||
|
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||||
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||||
|
$required = require $vendorDir.'/composer/installed.php';
|
||||||
|
$installed[] = self::$installedByVendor[$vendorDir] = $required;
|
||||||
|
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
|
||||||
|
self::$installed = $installed[count($installed) - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
// only require the installed.php file if this file is loaded from its dumped location,
|
||||||
|
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||||
|
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||||
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||||
|
$required = require __DIR__ . '/installed.php';
|
||||||
|
self::$installed = $required;
|
||||||
|
} else {
|
||||||
|
self::$installed = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::$installed !== array()) {
|
||||||
|
$installed[] = self::$installed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed;
|
||||||
|
}
|
||||||
|
}
|
||||||
2
gestion/vendor/composer/LICENSE
vendored
2
gestion/vendor/composer/LICENSE
vendored
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
@ -18,4 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,7 @@ $baseDir = dirname($vendorDir);
|
|||||||
return array(
|
return array(
|
||||||
'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
||||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||||
|
'Dompdf\\Cpdf' => $vendorDir . '/dompdf/dompdf/lib/Cpdf.php',
|
||||||
'FPDF' => $vendorDir . '/setasign/fpdf/fpdf.php',
|
'FPDF' => $vendorDir . '/setasign/fpdf/fpdf.php',
|
||||||
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
|
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
|
||||||
'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php',
|
'PHPUnit\\Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php',
|
||||||
|
|||||||
20
gestion/vendor/composer/autoload_files.php
vendored
Normal file
20
gestion/vendor/composer/autoload_files.php
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_files.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
|
||||||
|
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
|
||||||
|
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||||
|
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
|
||||||
|
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
|
||||||
|
'23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
|
||||||
|
'667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
|
||||||
|
'6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
|
||||||
|
'2a3c2110e8e0295330dc3d11a4cbc4cb' => $vendorDir . '/php-webdriver/webdriver/lib/Exception/TimeoutException.php',
|
||||||
|
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
|
||||||
|
'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
|
||||||
|
);
|
||||||
7
gestion/vendor/composer/autoload_psr4.php
vendored
7
gestion/vendor/composer/autoload_psr4.php
vendored
@ -6,7 +6,7 @@ $vendorDir = dirname(__DIR__);
|
|||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
|
'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
|
||||||
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
|
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
|
||||||
'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
|
'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
|
||||||
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
|
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
|
||||||
@ -36,13 +36,18 @@ return array(
|
|||||||
'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
|
'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
|
||||||
'Symfony\\Component\\BrowserKit\\' => array($vendorDir . '/symfony/browser-kit'),
|
'Symfony\\Component\\BrowserKit\\' => array($vendorDir . '/symfony/browser-kit'),
|
||||||
'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'),
|
'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'),
|
||||||
|
'Svg\\' => array($vendorDir . '/dompdf/php-svg-lib/src/Svg'),
|
||||||
|
'Sabberworm\\CSS\\' => array($vendorDir . '/sabberworm/php-css-parser/src'),
|
||||||
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
|
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
|
||||||
'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
|
'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'),
|
||||||
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
|
||||||
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
|
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
|
||||||
'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
|
'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
|
||||||
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
|
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
|
||||||
|
'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'),
|
||||||
|
'FontLib\\' => array($vendorDir . '/dompdf/php-font-lib/src/FontLib'),
|
||||||
'Facebook\\WebDriver\\' => array($vendorDir . '/php-webdriver/webdriver/lib'),
|
'Facebook\\WebDriver\\' => array($vendorDir . '/php-webdriver/webdriver/lib'),
|
||||||
|
'Dompdf\\' => array($vendorDir . '/dompdf/dompdf/src'),
|
||||||
'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
|
'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
|
||||||
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
|
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
|
||||||
);
|
);
|
||||||
|
|||||||
33
gestion/vendor/composer/autoload_static.php
vendored
33
gestion/vendor/composer/autoload_static.php
vendored
@ -59,6 +59,8 @@ class ComposerStaticInit4e4b1a7db13d3f09b3be1f5826185b1b
|
|||||||
'Symfony\\Component\\Cache\\' => 24,
|
'Symfony\\Component\\Cache\\' => 24,
|
||||||
'Symfony\\Component\\BrowserKit\\' => 29,
|
'Symfony\\Component\\BrowserKit\\' => 29,
|
||||||
'Symfony\\Bundle\\FrameworkBundle\\' => 31,
|
'Symfony\\Bundle\\FrameworkBundle\\' => 31,
|
||||||
|
'Svg\\' => 4,
|
||||||
|
'Sabberworm\\CSS\\' => 15,
|
||||||
),
|
),
|
||||||
'P' =>
|
'P' =>
|
||||||
array (
|
array (
|
||||||
@ -69,12 +71,18 @@ class ComposerStaticInit4e4b1a7db13d3f09b3be1f5826185b1b
|
|||||||
'Prophecy\\' => 9,
|
'Prophecy\\' => 9,
|
||||||
'PhpParser\\' => 10,
|
'PhpParser\\' => 10,
|
||||||
),
|
),
|
||||||
|
'M' =>
|
||||||
|
array (
|
||||||
|
'Masterminds\\' => 12,
|
||||||
|
),
|
||||||
'F' =>
|
'F' =>
|
||||||
array (
|
array (
|
||||||
|
'FontLib\\' => 8,
|
||||||
'Facebook\\WebDriver\\' => 19,
|
'Facebook\\WebDriver\\' => 19,
|
||||||
),
|
),
|
||||||
'D' =>
|
'D' =>
|
||||||
array (
|
array (
|
||||||
|
'Dompdf\\' => 7,
|
||||||
'Doctrine\\Instantiator\\' => 22,
|
'Doctrine\\Instantiator\\' => 22,
|
||||||
'DeepCopy\\' => 9,
|
'DeepCopy\\' => 9,
|
||||||
),
|
),
|
||||||
@ -84,8 +92,8 @@ class ComposerStaticInit4e4b1a7db13d3f09b3be1f5826185b1b
|
|||||||
'phpDocumentor\\Reflection\\' =>
|
'phpDocumentor\\Reflection\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
|
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
|
||||||
1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
|
1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
|
||||||
2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
|
2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
|
||||||
),
|
),
|
||||||
'Webmozart\\Assert\\' =>
|
'Webmozart\\Assert\\' =>
|
||||||
array (
|
array (
|
||||||
@ -203,6 +211,14 @@ class ComposerStaticInit4e4b1a7db13d3f09b3be1f5826185b1b
|
|||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/symfony/framework-bundle',
|
0 => __DIR__ . '/..' . '/symfony/framework-bundle',
|
||||||
),
|
),
|
||||||
|
'Svg\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/dompdf/php-svg-lib/src/Svg',
|
||||||
|
),
|
||||||
|
'Sabberworm\\CSS\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/src',
|
||||||
|
),
|
||||||
'Psr\\Log\\' =>
|
'Psr\\Log\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
|
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
|
||||||
@ -227,10 +243,22 @@ class ComposerStaticInit4e4b1a7db13d3f09b3be1f5826185b1b
|
|||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',
|
0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser',
|
||||||
),
|
),
|
||||||
|
'Masterminds\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/masterminds/html5/src',
|
||||||
|
),
|
||||||
|
'FontLib\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/dompdf/php-font-lib/src/FontLib',
|
||||||
|
),
|
||||||
'Facebook\\WebDriver\\' =>
|
'Facebook\\WebDriver\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/php-webdriver/webdriver/lib',
|
0 => __DIR__ . '/..' . '/php-webdriver/webdriver/lib',
|
||||||
),
|
),
|
||||||
|
'Dompdf\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/dompdf/dompdf/src',
|
||||||
|
),
|
||||||
'Doctrine\\Instantiator\\' =>
|
'Doctrine\\Instantiator\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator',
|
0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator',
|
||||||
@ -244,6 +272,7 @@ class ComposerStaticInit4e4b1a7db13d3f09b3be1f5826185b1b
|
|||||||
public static $classMap = array (
|
public static $classMap = array (
|
||||||
'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
|
||||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||||
|
'Dompdf\\Cpdf' => __DIR__ . '/..' . '/dompdf/dompdf/lib/Cpdf.php',
|
||||||
'FPDF' => __DIR__ . '/..' . '/setasign/fpdf/fpdf.php',
|
'FPDF' => __DIR__ . '/..' . '/setasign/fpdf/fpdf.php',
|
||||||
'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
|
'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
|
||||||
'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php',
|
'PHPUnit\\Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php',
|
||||||
|
|||||||
303
gestion/vendor/composer/installed.json
vendored
303
gestion/vendor/composer/installed.json
vendored
@ -125,6 +125,240 @@
|
|||||||
],
|
],
|
||||||
"install-path": "../doctrine/instantiator"
|
"install-path": "../doctrine/instantiator"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "dompdf/dompdf",
|
||||||
|
"version": "v3.1.0",
|
||||||
|
"version_normalized": "3.1.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dompdf/dompdf.git",
|
||||||
|
"reference": "a51bd7a063a65499446919286fb18b518177155a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/dompdf/dompdf/zipball/a51bd7a063a65499446919286fb18b518177155a",
|
||||||
|
"reference": "a51bd7a063a65499446919286fb18b518177155a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"dompdf/php-font-lib": "^1.0.0",
|
||||||
|
"dompdf/php-svg-lib": "^1.0.0",
|
||||||
|
"ext-dom": "*",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"masterminds/html5": "^2.0",
|
||||||
|
"php": "^7.1 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-gd": "*",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-zip": "*",
|
||||||
|
"mockery/mockery": "^1.3",
|
||||||
|
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5",
|
||||||
|
"symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gd": "Needed to process images",
|
||||||
|
"ext-gmagick": "Improves image processing performance",
|
||||||
|
"ext-imagick": "Improves image processing performance",
|
||||||
|
"ext-zlib": "Needed for pdf stream compression"
|
||||||
|
},
|
||||||
|
"time": "2025-01-15T14:09:04+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Dompdf\\": "src/"
|
||||||
|
},
|
||||||
|
"classmap": [
|
||||||
|
"lib/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-2.1"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The Dompdf Community",
|
||||||
|
"homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
|
||||||
|
"homepage": "https://github.com/dompdf/dompdf",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/dompdf/dompdf/issues",
|
||||||
|
"source": "https://github.com/dompdf/dompdf/tree/v3.1.0"
|
||||||
|
},
|
||||||
|
"install-path": "../dompdf/dompdf"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dompdf/php-font-lib",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"version_normalized": "1.0.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dompdf/php-font-lib.git",
|
||||||
|
"reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
|
||||||
|
"reference": "6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"php": "^7.1 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6"
|
||||||
|
},
|
||||||
|
"time": "2024-12-02T14:37:59+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"FontLib\\": "src/FontLib"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-2.1-or-later"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The FontLib Community",
|
||||||
|
"homepage": "https://github.com/dompdf/php-font-lib/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A library to read, parse, export and make subsets of different types of font files.",
|
||||||
|
"homepage": "https://github.com/dompdf/php-font-lib",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/dompdf/php-font-lib/issues",
|
||||||
|
"source": "https://github.com/dompdf/php-font-lib/tree/1.0.1"
|
||||||
|
},
|
||||||
|
"install-path": "../dompdf/php-font-lib"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dompdf/php-svg-lib",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"version_normalized": "1.0.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/dompdf/php-svg-lib.git",
|
||||||
|
"reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/dompdf/php-svg-lib/zipball/eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
|
||||||
|
"reference": "eb045e518185298eb6ff8d80d0d0c6b17aecd9af",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"php": "^7.1 || ^8.0",
|
||||||
|
"sabberworm/php-css-parser": "^8.4"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5"
|
||||||
|
},
|
||||||
|
"time": "2024-04-29T13:26:35+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Svg\\": "src/Svg"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"LGPL-3.0-or-later"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The SvgLib Community",
|
||||||
|
"homepage": "https://github.com/dompdf/php-svg-lib/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A library to read, parse and export to PDF SVG files.",
|
||||||
|
"homepage": "https://github.com/dompdf/php-svg-lib",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/dompdf/php-svg-lib/issues",
|
||||||
|
"source": "https://github.com/dompdf/php-svg-lib/tree/1.0.0"
|
||||||
|
},
|
||||||
|
"install-path": "../dompdf/php-svg-lib"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "masterminds/html5",
|
||||||
|
"version": "2.10.0",
|
||||||
|
"version_normalized": "2.10.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/Masterminds/html5-php.git",
|
||||||
|
"reference": "fcf91eb64359852f00d921887b219479b4f21251"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251",
|
||||||
|
"reference": "fcf91eb64359852f00d921887b219479b4f21251",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-dom": "*",
|
||||||
|
"php": ">=5.3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9"
|
||||||
|
},
|
||||||
|
"time": "2025-07-25T09:04:22+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Masterminds\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Matt Butcher",
|
||||||
|
"email": "technosophos@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Matt Farina",
|
||||||
|
"email": "matt@mattfarina.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Asmir Mustafic",
|
||||||
|
"email": "goetas@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "An HTML5 parser and serializer.",
|
||||||
|
"homepage": "http://masterminds.github.io/html5-php",
|
||||||
|
"keywords": [
|
||||||
|
"HTML5",
|
||||||
|
"dom",
|
||||||
|
"html",
|
||||||
|
"parser",
|
||||||
|
"querypath",
|
||||||
|
"serializer",
|
||||||
|
"xml"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/Masterminds/html5-php/issues",
|
||||||
|
"source": "https://github.com/Masterminds/html5-php/tree/2.10.0"
|
||||||
|
},
|
||||||
|
"install-path": "../masterminds/html5"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "myclabs/deep-copy",
|
"name": "myclabs/deep-copy",
|
||||||
"version": "1.11.0",
|
"version": "1.11.0",
|
||||||
@ -1318,6 +1552,75 @@
|
|||||||
},
|
},
|
||||||
"install-path": "../psr/log"
|
"install-path": "../psr/log"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "sabberworm/php-css-parser",
|
||||||
|
"version": "v8.9.0",
|
||||||
|
"version_normalized": "8.9.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/MyIntervals/PHP-CSS-Parser.git",
|
||||||
|
"reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d8e916507b88e389e26d4ab03c904a082aa66bb9",
|
||||||
|
"reference": "d8e916507b88e389e26d4ab03c904a082aa66bb9",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-iconv": "*",
|
||||||
|
"php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.41",
|
||||||
|
"rawr/cross-data-providers": "^2.0.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-mbstring": "for parsing UTF-8 CSS"
|
||||||
|
},
|
||||||
|
"time": "2025-07-11T13:20:48+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "9.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Sabberworm\\CSS\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Raphael Schweikert"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Oliver Klee",
|
||||||
|
"email": "github@oliverklee.de"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jake Hotson",
|
||||||
|
"email": "jake.github@qzdesign.co.uk"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Parser for CSS Files written in PHP",
|
||||||
|
"homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser",
|
||||||
|
"keywords": [
|
||||||
|
"css",
|
||||||
|
"parser",
|
||||||
|
"stylesheet"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues",
|
||||||
|
"source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.9.0"
|
||||||
|
},
|
||||||
|
"install-path": "../sabberworm/php-css-parser"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
|
|||||||
767
gestion/vendor/composer/installed.php
vendored
Normal file
767
gestion/vendor/composer/installed.php
vendored
Normal file
@ -0,0 +1,767 @@
|
|||||||
|
<?php return array(
|
||||||
|
'root' => array(
|
||||||
|
'name' => 'gestion/app',
|
||||||
|
'pretty_version' => '1.0.0+no-version-set',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => null,
|
||||||
|
'type' => 'project',
|
||||||
|
'install_path' => __DIR__ . '/../../',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev' => true,
|
||||||
|
),
|
||||||
|
'versions' => array(
|
||||||
|
'dbrekelmans/bdi' => array(
|
||||||
|
'pretty_version' => '1.0',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => 'bdc41bd339558242bf748b99c394a78e2dfbdb4f',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../dbrekelmans/bdi',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'doctrine/instantiator' => array(
|
||||||
|
'pretty_version' => '1.4.1',
|
||||||
|
'version' => '1.4.1.0',
|
||||||
|
'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../doctrine/instantiator',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'dompdf/dompdf' => array(
|
||||||
|
'pretty_version' => 'v3.1.0',
|
||||||
|
'version' => '3.1.0.0',
|
||||||
|
'reference' => 'a51bd7a063a65499446919286fb18b518177155a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../dompdf/dompdf',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'dompdf/php-font-lib' => array(
|
||||||
|
'pretty_version' => '1.0.1',
|
||||||
|
'version' => '1.0.1.0',
|
||||||
|
'reference' => '6137b7d4232b7f16c882c75e4ca3991dbcf6fe2d',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../dompdf/php-font-lib',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'dompdf/php-svg-lib' => array(
|
||||||
|
'pretty_version' => '1.0.0',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => 'eb045e518185298eb6ff8d80d0d0c6b17aecd9af',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../dompdf/php-svg-lib',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'facebook/webdriver' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'replaced' => array(
|
||||||
|
0 => '*',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'gestion/app' => array(
|
||||||
|
'pretty_version' => '1.0.0+no-version-set',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => null,
|
||||||
|
'type' => 'project',
|
||||||
|
'install_path' => __DIR__ . '/../../',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'masterminds/html5' => array(
|
||||||
|
'pretty_version' => '2.10.0',
|
||||||
|
'version' => '2.10.0.0',
|
||||||
|
'reference' => 'fcf91eb64359852f00d921887b219479b4f21251',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../masterminds/html5',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'myclabs/deep-copy' => array(
|
||||||
|
'pretty_version' => '1.11.0',
|
||||||
|
'version' => '1.11.0.0',
|
||||||
|
'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../myclabs/deep-copy',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'nikic/php-parser' => array(
|
||||||
|
'pretty_version' => 'v4.13.2',
|
||||||
|
'version' => '4.13.2.0',
|
||||||
|
'reference' => '210577fe3cf7badcc5814d99455df46564f3c077',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../nikic/php-parser',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phar-io/manifest' => array(
|
||||||
|
'pretty_version' => '2.0.3',
|
||||||
|
'version' => '2.0.3.0',
|
||||||
|
'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phar-io/manifest',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phar-io/version' => array(
|
||||||
|
'pretty_version' => '3.2.1',
|
||||||
|
'version' => '3.2.1.0',
|
||||||
|
'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phar-io/version',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'php-http/async-client-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '*',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'php-http/client-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '*',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'php-webdriver/webdriver' => array(
|
||||||
|
'pretty_version' => '1.12.1',
|
||||||
|
'version' => '1.12.1.0',
|
||||||
|
'reference' => 'b27ddf458d273c7d4602106fcaf978aa0b7fe15a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../php-webdriver/webdriver',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpdocumentor/reflection-common' => array(
|
||||||
|
'pretty_version' => '2.2.0',
|
||||||
|
'version' => '2.2.0.0',
|
||||||
|
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpdocumentor/reflection-common',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpdocumentor/reflection-docblock' => array(
|
||||||
|
'pretty_version' => '5.3.0',
|
||||||
|
'version' => '5.3.0.0',
|
||||||
|
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpdocumentor/type-resolver' => array(
|
||||||
|
'pretty_version' => '1.6.1',
|
||||||
|
'version' => '1.6.1.0',
|
||||||
|
'reference' => '77a32518733312af16a44300404e945338981de3',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpdocumentor/type-resolver',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpspec/prophecy' => array(
|
||||||
|
'pretty_version' => 'v1.15.0',
|
||||||
|
'version' => '1.15.0.0',
|
||||||
|
'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpspec/prophecy',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpunit/php-code-coverage' => array(
|
||||||
|
'pretty_version' => '9.2.15',
|
||||||
|
'version' => '9.2.15.0',
|
||||||
|
'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpunit/php-file-iterator' => array(
|
||||||
|
'pretty_version' => '3.0.6',
|
||||||
|
'version' => '3.0.6.0',
|
||||||
|
'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpunit/php-file-iterator',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpunit/php-invoker' => array(
|
||||||
|
'pretty_version' => '3.1.1',
|
||||||
|
'version' => '3.1.1.0',
|
||||||
|
'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpunit/php-invoker',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpunit/php-text-template' => array(
|
||||||
|
'pretty_version' => '2.0.4',
|
||||||
|
'version' => '2.0.4.0',
|
||||||
|
'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpunit/php-text-template',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpunit/php-timer' => array(
|
||||||
|
'pretty_version' => '5.0.3',
|
||||||
|
'version' => '5.0.3.0',
|
||||||
|
'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpunit/php-timer',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'phpunit/phpunit' => array(
|
||||||
|
'pretty_version' => '9.5.20',
|
||||||
|
'version' => '9.5.20.0',
|
||||||
|
'reference' => '12bc8879fb65aef2138b26fc633cb1e3620cffba',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpunit/phpunit',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'psr/cache' => array(
|
||||||
|
'pretty_version' => '1.0.1',
|
||||||
|
'version' => '1.0.1.0',
|
||||||
|
'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../psr/cache',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'psr/cache-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0|2.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'psr/container' => array(
|
||||||
|
'pretty_version' => '1.1.2',
|
||||||
|
'version' => '1.1.2.0',
|
||||||
|
'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../psr/container',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'psr/container-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'psr/event-dispatcher' => array(
|
||||||
|
'pretty_version' => '1.0.0',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../psr/event-dispatcher',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'psr/event-dispatcher-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'psr/http-client-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'psr/log' => array(
|
||||||
|
'pretty_version' => '1.1.4',
|
||||||
|
'version' => '1.1.4.0',
|
||||||
|
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../psr/log',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'psr/log-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0|2.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'psr/simple-cache-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0|2.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'sabberworm/php-css-parser' => array(
|
||||||
|
'pretty_version' => 'v8.9.0',
|
||||||
|
'version' => '8.9.0.0',
|
||||||
|
'reference' => 'd8e916507b88e389e26d4ab03c904a082aa66bb9',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sabberworm/php-css-parser',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'sebastian/cli-parser' => array(
|
||||||
|
'pretty_version' => '1.0.1',
|
||||||
|
'version' => '1.0.1.0',
|
||||||
|
'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/cli-parser',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/code-unit' => array(
|
||||||
|
'pretty_version' => '1.0.8',
|
||||||
|
'version' => '1.0.8.0',
|
||||||
|
'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/code-unit',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/code-unit-reverse-lookup' => array(
|
||||||
|
'pretty_version' => '2.0.3',
|
||||||
|
'version' => '2.0.3.0',
|
||||||
|
'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/comparator' => array(
|
||||||
|
'pretty_version' => '4.0.6',
|
||||||
|
'version' => '4.0.6.0',
|
||||||
|
'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/comparator',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/complexity' => array(
|
||||||
|
'pretty_version' => '2.0.2',
|
||||||
|
'version' => '2.0.2.0',
|
||||||
|
'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/complexity',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/diff' => array(
|
||||||
|
'pretty_version' => '4.0.4',
|
||||||
|
'version' => '4.0.4.0',
|
||||||
|
'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/diff',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/environment' => array(
|
||||||
|
'pretty_version' => '5.1.4',
|
||||||
|
'version' => '5.1.4.0',
|
||||||
|
'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/environment',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/exporter' => array(
|
||||||
|
'pretty_version' => '4.0.4',
|
||||||
|
'version' => '4.0.4.0',
|
||||||
|
'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/exporter',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/global-state' => array(
|
||||||
|
'pretty_version' => '5.0.5',
|
||||||
|
'version' => '5.0.5.0',
|
||||||
|
'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/global-state',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/lines-of-code' => array(
|
||||||
|
'pretty_version' => '1.0.3',
|
||||||
|
'version' => '1.0.3.0',
|
||||||
|
'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/lines-of-code',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/object-enumerator' => array(
|
||||||
|
'pretty_version' => '4.0.4',
|
||||||
|
'version' => '4.0.4.0',
|
||||||
|
'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/object-enumerator',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/object-reflector' => array(
|
||||||
|
'pretty_version' => '2.0.4',
|
||||||
|
'version' => '2.0.4.0',
|
||||||
|
'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/object-reflector',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/recursion-context' => array(
|
||||||
|
'pretty_version' => '4.0.4',
|
||||||
|
'version' => '4.0.4.0',
|
||||||
|
'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/recursion-context',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/resource-operations' => array(
|
||||||
|
'pretty_version' => '3.0.3',
|
||||||
|
'version' => '3.0.3.0',
|
||||||
|
'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/resource-operations',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/type' => array(
|
||||||
|
'pretty_version' => '3.0.0',
|
||||||
|
'version' => '3.0.0.0',
|
||||||
|
'reference' => 'b233b84bc4465aff7b57cf1c4bc75c86d00d6dad',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/type',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'sebastian/version' => array(
|
||||||
|
'pretty_version' => '3.0.2',
|
||||||
|
'version' => '3.0.2.0',
|
||||||
|
'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../sebastian/version',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'setasign/fpdf' => array(
|
||||||
|
'pretty_version' => '1.8.5',
|
||||||
|
'version' => '1.8.5.0',
|
||||||
|
'reference' => 'f4104a04c9a3f95c4c26a0a0531abebcc980987a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../setasign/fpdf',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'symfony/browser-kit' => array(
|
||||||
|
'pretty_version' => 'v5.4.3',
|
||||||
|
'version' => '5.4.3.0',
|
||||||
|
'reference' => '18e73179c6a33d520de1b644941eba108dd811ad',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/browser-kit',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/cache' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '4c6747cf7e56c6b8e3094dd24852bd3e364375b1',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/cache',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/cache-contracts' => array(
|
||||||
|
'pretty_version' => 'v2.5.1',
|
||||||
|
'version' => '2.5.1.0',
|
||||||
|
'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/cache-contracts',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/cache-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0|2.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'symfony/config' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '9f8964f56f7234f8ace16f66cb3fbae950c04e68',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/config',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/dependency-injection' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '855e29cd715ad62bb840c9841fe09a7cde50811f',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/dependency-injection',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/deprecation-contracts' => array(
|
||||||
|
'pretty_version' => 'v2.5.2',
|
||||||
|
'version' => '2.5.2.0',
|
||||||
|
'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/dom-crawler' => array(
|
||||||
|
'pretty_version' => 'v5.4.6',
|
||||||
|
'version' => '5.4.6.0',
|
||||||
|
'reference' => 'c0bda97480d96337bd3866026159a8b358665457',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/dom-crawler',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/error-handler' => array(
|
||||||
|
'pretty_version' => 'v5.4.19',
|
||||||
|
'version' => '5.4.19.0',
|
||||||
|
'reference' => '438ef3e5e6481244785da3ce8cf8f4e74e7f2822',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/error-handler',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/event-dispatcher' => array(
|
||||||
|
'pretty_version' => 'v5.4.19',
|
||||||
|
'version' => '5.4.19.0',
|
||||||
|
'reference' => 'abf49cc084c087d94b4cb939c3f3672971784e0c',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/event-dispatcher',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/event-dispatcher-contracts' => array(
|
||||||
|
'pretty_version' => 'v2.5.2',
|
||||||
|
'version' => '2.5.2.0',
|
||||||
|
'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/event-dispatcher-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '2.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'symfony/filesystem' => array(
|
||||||
|
'pretty_version' => 'v5.4.7',
|
||||||
|
'version' => '5.4.7.0',
|
||||||
|
'reference' => '3a4442138d80c9f7b600fb297534ac718b61d37f',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/filesystem',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/finder' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '9b630f3427f3ebe7cd346c277a1408b00249dad9',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/finder',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/framework-bundle' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => 'e2423e443bd6e6d5371d5c72d5d1a98c8d9fbb45',
|
||||||
|
'type' => 'symfony-bundle',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/framework-bundle',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/http-client' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '0dabec4e3898d3e00451dd47b5ef839168f9bbf5',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/http-client',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/http-client-contracts' => array(
|
||||||
|
'pretty_version' => 'v2.5.2',
|
||||||
|
'version' => '2.5.2.0',
|
||||||
|
'reference' => 'ba6a9f0e8f3edd190520ee3b9a958596b6ca2e70',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/http-client-contracts',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/http-client-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '2.4',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'symfony/http-foundation' => array(
|
||||||
|
'pretty_version' => 'v5.4.20',
|
||||||
|
'version' => '5.4.20.0',
|
||||||
|
'reference' => 'd0435363362a47c14e9cf50663cb8ffbf491875a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/http-foundation',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/http-kernel' => array(
|
||||||
|
'pretty_version' => 'v5.4.20',
|
||||||
|
'version' => '5.4.20.0',
|
||||||
|
'reference' => 'aaeec341582d3c160cc9ecfa8b2419ba6c69954e',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/http-kernel',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/panther' => array(
|
||||||
|
'pretty_version' => 'v1.1.2',
|
||||||
|
'version' => '1.1.2.0',
|
||||||
|
'reference' => '8716dd7c1c26a592a4e0440047a7967c21ef71e5',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/panther',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/polyfill-ctype' => array(
|
||||||
|
'pretty_version' => 'v1.27.0',
|
||||||
|
'version' => '1.27.0.0',
|
||||||
|
'reference' => '5bbc823adecdae860bb64756d639ecfec17b050a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/polyfill-mbstring' => array(
|
||||||
|
'pretty_version' => 'v1.27.0',
|
||||||
|
'version' => '1.27.0.0',
|
||||||
|
'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/polyfill-php72' => array(
|
||||||
|
'pretty_version' => 'v1.27.0',
|
||||||
|
'version' => '1.27.0.0',
|
||||||
|
'reference' => '869329b1e9894268a8a61dabb69153029b7a8c97',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/polyfill-php72',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/polyfill-php73' => array(
|
||||||
|
'pretty_version' => 'v1.27.0',
|
||||||
|
'version' => '1.27.0.0',
|
||||||
|
'reference' => '9e8ecb5f92152187c4799efd3c96b78ccab18ff9',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/polyfill-php73',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/polyfill-php80' => array(
|
||||||
|
'pretty_version' => 'v1.27.0',
|
||||||
|
'version' => '1.27.0.0',
|
||||||
|
'reference' => '7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/polyfill-php80',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/polyfill-php81' => array(
|
||||||
|
'pretty_version' => 'v1.25.0',
|
||||||
|
'version' => '1.25.0.0',
|
||||||
|
'reference' => '5de4ba2d41b15f9bd0e19b2ab9674135813ec98f',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/polyfill-php81',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/process' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '597f3fff8e3e91836bb0bd38f5718b56ddbde2f3',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/process',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/routing' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => 'e07817bb6244ea33ef5ad31abc4a9288bef3f2f7',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/routing',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/service-contracts' => array(
|
||||||
|
'pretty_version' => 'v2.5.1',
|
||||||
|
'version' => '2.5.1.0',
|
||||||
|
'reference' => '24d9dc654b83e91aa59f9d167b131bc3b5bea24c',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/service-contracts',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/service-implementation' => array(
|
||||||
|
'dev_requirement' => true,
|
||||||
|
'provided' => array(
|
||||||
|
0 => '1.0|2.0',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'symfony/var-dumper' => array(
|
||||||
|
'pretty_version' => 'v5.4.19',
|
||||||
|
'version' => '5.4.19.0',
|
||||||
|
'reference' => '2944bbc23f5f8da2b962fbcbf7c4a6109b2f4b7b',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/var-dumper',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'symfony/var-exporter' => array(
|
||||||
|
'pretty_version' => 'v5.4.8',
|
||||||
|
'version' => '5.4.8.0',
|
||||||
|
'reference' => '7e132a3fcd4b57add721b4207236877b6017ec93',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../symfony/var-exporter',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'theseer/tokenizer' => array(
|
||||||
|
'pretty_version' => '1.2.1',
|
||||||
|
'version' => '1.2.1.0',
|
||||||
|
'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../theseer/tokenizer',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
'webmozart/assert' => array(
|
||||||
|
'pretty_version' => '1.10.0',
|
||||||
|
'version' => '1.10.0.0',
|
||||||
|
'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../webmozart/assert',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
21
gestion/vendor/dbrekelmans/bdi/LICENSE
vendored
Normal file
21
gestion/vendor/dbrekelmans/bdi/LICENSE
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 Daniël Brekelmans
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
7
gestion/vendor/dbrekelmans/bdi/README.md
vendored
Normal file
7
gestion/vendor/dbrekelmans/bdi/README.md
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# BDI
|
||||||
|
This is a composer-installable PHAR distribution of [dbrekelmans/browser-driver-installer](https://github.com/dbrekelmans/browser-driver-installer).
|
||||||
|
|
||||||
|
Releases are automated with github actions.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
If you want to contribute to the code of the actual tool, head over to [dbrekelmans/browser-driver-installer](https://github.com/dbrekelmans/browser-driver-installer).
|
||||||
BIN
gestion/vendor/dbrekelmans/bdi/bdi
vendored
Normal file
BIN
gestion/vendor/dbrekelmans/bdi/bdi
vendored
Normal file
Binary file not shown.
BIN
gestion/vendor/dbrekelmans/bdi/bdi.phar
vendored
Normal file
BIN
gestion/vendor/dbrekelmans/bdi/bdi.phar
vendored
Normal file
Binary file not shown.
BIN
gestion/vendor/dbrekelmans/bdi/bdi.phar.asc
vendored
Normal file
BIN
gestion/vendor/dbrekelmans/bdi/bdi.phar.asc
vendored
Normal file
Binary file not shown.
32
gestion/vendor/dbrekelmans/bdi/composer.json
vendored
Normal file
32
gestion/vendor/dbrekelmans/bdi/composer.json
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"name": "dbrekelmans/bdi",
|
||||||
|
"description": "PHAR distribution of dbrekelmans/browser-driver-installer.",
|
||||||
|
"homepage": "https://github.com/dbrekelmans/bdi",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Daniël Brekelmans",
|
||||||
|
"homepage": "https://github.com/dbrekelmans"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Contributors",
|
||||||
|
"homepage": "https://github.com/dbrekelmans/bdi/graphs/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"browser-driver-installer"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"bin": [
|
||||||
|
"bdi",
|
||||||
|
"bdi.phar"
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": "^7.2|^8.0",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-zip": "*",
|
||||||
|
"ext-zlib": "*"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"sort-packages": true
|
||||||
|
}
|
||||||
|
}
|
||||||
47
gestion/vendor/doctrine/instantiator/.doctrine-project.json
vendored
Normal file
47
gestion/vendor/doctrine/instantiator/.doctrine-project.json
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"active": true,
|
||||||
|
"name": "Instantiator",
|
||||||
|
"slug": "instantiator",
|
||||||
|
"docsSlug": "doctrine-instantiator",
|
||||||
|
"codePath": "/src",
|
||||||
|
"versions": [
|
||||||
|
{
|
||||||
|
"name": "1.5",
|
||||||
|
"branchName": "1.5.x",
|
||||||
|
"slug": "latest",
|
||||||
|
"upcoming": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.4",
|
||||||
|
"branchName": "1.4.x",
|
||||||
|
"slug": "1.4",
|
||||||
|
"aliases": [
|
||||||
|
"current",
|
||||||
|
"stable"
|
||||||
|
],
|
||||||
|
"maintained": true,
|
||||||
|
"current": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.3",
|
||||||
|
"branchName": "1.3.x",
|
||||||
|
"slug": "1.3",
|
||||||
|
"maintained": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.2",
|
||||||
|
"branchName": "1.2.x",
|
||||||
|
"slug": "1.2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.1",
|
||||||
|
"branchName": "1.1.x",
|
||||||
|
"slug": "1.1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "1.0",
|
||||||
|
"branchName": "1.0.x",
|
||||||
|
"slug": "1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
35
gestion/vendor/doctrine/instantiator/CONTRIBUTING.md
vendored
Normal file
35
gestion/vendor/doctrine/instantiator/CONTRIBUTING.md
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
* Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard)
|
||||||
|
* The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
|
||||||
|
* Any contribution must provide tests for additional introduced conditions
|
||||||
|
* Any un-confirmed issue needs a failing test case before being accepted
|
||||||
|
* Pull requests must be sent from a new hotfix/feature branch, not from `master`.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install the project and run the tests, you need to clone it first:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ git clone git://github.com/doctrine/instantiator.git
|
||||||
|
```
|
||||||
|
|
||||||
|
You will then need to run a composer installation:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ cd Instantiator
|
||||||
|
$ curl -s https://getcomposer.org/installer | php
|
||||||
|
$ php composer.phar update
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
The PHPUnit version to be used is the one installed as a dev- dependency via composer:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ ./vendor/bin/phpunit
|
||||||
|
```
|
||||||
|
|
||||||
|
Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement
|
||||||
|
won't be merged.
|
||||||
|
|
||||||
19
gestion/vendor/doctrine/instantiator/LICENSE
vendored
Normal file
19
gestion/vendor/doctrine/instantiator/LICENSE
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2014 Doctrine Project
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
38
gestion/vendor/doctrine/instantiator/README.md
vendored
Normal file
38
gestion/vendor/doctrine/instantiator/README.md
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Instantiator
|
||||||
|
|
||||||
|
This library provides a way of avoiding usage of constructors when instantiating PHP classes.
|
||||||
|
|
||||||
|
[](https://travis-ci.org/doctrine/instantiator)
|
||||||
|
[](https://codecov.io/gh/doctrine/instantiator/branch/master)
|
||||||
|
[](https://www.versioneye.com/package/php--doctrine--instantiator)
|
||||||
|
|
||||||
|
[](https://packagist.org/packages/doctrine/instantiator)
|
||||||
|
[](https://packagist.org/packages/doctrine/instantiator)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
The suggested installation method is via [composer](https://getcomposer.org/):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
php composer.phar require "doctrine/instantiator:~1.0.3"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The instantiator is able to create new instances of any class without using the constructor or any API of the class
|
||||||
|
itself:
|
||||||
|
|
||||||
|
```php
|
||||||
|
$instantiator = new \Doctrine\Instantiator\Instantiator();
|
||||||
|
|
||||||
|
$instance = $instantiator->instantiate(\My\ClassName\Here::class);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out!
|
||||||
|
|
||||||
|
## Credits
|
||||||
|
|
||||||
|
This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which
|
||||||
|
has been donated to the doctrine organization, and which is now deprecated in favour of this package.
|
||||||
48
gestion/vendor/doctrine/instantiator/composer.json
vendored
Normal file
48
gestion/vendor/doctrine/instantiator/composer.json
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
"name": "doctrine/instantiator",
|
||||||
|
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
|
||||||
|
"type": "library",
|
||||||
|
"license": "MIT",
|
||||||
|
"homepage": "https://www.doctrine-project.org/projects/instantiator.html",
|
||||||
|
"keywords": [
|
||||||
|
"instantiate",
|
||||||
|
"constructor"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Marco Pivetta",
|
||||||
|
"email": "ocramius@gmail.com",
|
||||||
|
"homepage": "https://ocramius.github.io/"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-phar": "*",
|
||||||
|
"ext-pdo": "*",
|
||||||
|
"doctrine/coding-standard": "^9",
|
||||||
|
"phpbench/phpbench": "^0.16 || ^1",
|
||||||
|
"phpstan/phpstan": "^1.4",
|
||||||
|
"phpstan/phpstan-phpunit": "^1",
|
||||||
|
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||||
|
"vimeo/psalm": "^4.22"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-0": {
|
||||||
|
"DoctrineTest\\InstantiatorPerformance\\": "tests",
|
||||||
|
"DoctrineTest\\InstantiatorTest\\": "tests",
|
||||||
|
"DoctrineTest\\InstantiatorTestAsset\\": "tests"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"allow-plugins": {
|
||||||
|
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
68
gestion/vendor/doctrine/instantiator/docs/en/index.rst
vendored
Normal file
68
gestion/vendor/doctrine/instantiator/docs/en/index.rst
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
This library provides a way of avoiding usage of constructors when instantiating PHP classes.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
|
||||||
|
The suggested installation method is via `composer`_:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ composer require doctrine/instantiator
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
|
||||||
|
The instantiator is able to create new instances of any class without
|
||||||
|
using the constructor or any API of the class itself:
|
||||||
|
|
||||||
|
.. code-block:: php
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Doctrine\Instantiator\Instantiator;
|
||||||
|
use App\Entities\User;
|
||||||
|
|
||||||
|
$instantiator = new Instantiator();
|
||||||
|
|
||||||
|
$user = $instantiator->instantiate(User::class);
|
||||||
|
|
||||||
|
Contributing
|
||||||
|
============
|
||||||
|
|
||||||
|
- Follow the `Doctrine Coding Standard`_
|
||||||
|
- The project will follow strict `object calisthenics`_
|
||||||
|
- Any contribution must provide tests for additional introduced
|
||||||
|
conditions
|
||||||
|
- Any un-confirmed issue needs a failing test case before being
|
||||||
|
accepted
|
||||||
|
- Pull requests must be sent from a new hotfix/feature branch, not from
|
||||||
|
``master``.
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
The PHPUnit version to be used is the one installed as a dev- dependency
|
||||||
|
via composer:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ ./vendor/bin/phpunit
|
||||||
|
|
||||||
|
Accepted coverage for new contributions is 80%. Any contribution not
|
||||||
|
satisfying this requirement won’t be merged.
|
||||||
|
|
||||||
|
Credits
|
||||||
|
=======
|
||||||
|
|
||||||
|
This library was migrated from `ocramius/instantiator`_, which has been
|
||||||
|
donated to the doctrine organization, and which is now deprecated in
|
||||||
|
favour of this package.
|
||||||
|
|
||||||
|
.. _composer: https://getcomposer.org/
|
||||||
|
.. _CONTRIBUTING.md: CONTRIBUTING.md
|
||||||
|
.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator
|
||||||
|
.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard
|
||||||
|
.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
|
||||||
4
gestion/vendor/doctrine/instantiator/docs/en/sidebar.rst
vendored
Normal file
4
gestion/vendor/doctrine/instantiator/docs/en/sidebar.rst
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
.. toctree::
|
||||||
|
:depth: 3
|
||||||
|
|
||||||
|
index
|
||||||
16
gestion/vendor/doctrine/instantiator/psalm.xml
vendored
Normal file
16
gestion/vendor/doctrine/instantiator/psalm.xml
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<psalm
|
||||||
|
errorLevel="7"
|
||||||
|
phpVersion="8.1"
|
||||||
|
resolveFromConfigFile="true"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="https://getpsalm.org/schema/config"
|
||||||
|
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||||
|
>
|
||||||
|
<projectFiles>
|
||||||
|
<directory name="src" />
|
||||||
|
<ignoreFiles>
|
||||||
|
<directory name="vendor" />
|
||||||
|
</ignoreFiles>
|
||||||
|
</projectFiles>
|
||||||
|
</psalm>
|
||||||
12
gestion/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
vendored
Normal file
12
gestion/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Instantiator\Exception;
|
||||||
|
|
||||||
|
use Throwable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base exception marker interface for the instantiator component
|
||||||
|
*/
|
||||||
|
interface ExceptionInterface extends Throwable
|
||||||
|
{
|
||||||
|
}
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Instantiator\Exception;
|
||||||
|
|
||||||
|
use InvalidArgumentException as BaseInvalidArgumentException;
|
||||||
|
use ReflectionClass;
|
||||||
|
|
||||||
|
use function interface_exists;
|
||||||
|
use function sprintf;
|
||||||
|
use function trait_exists;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception for invalid arguments provided to the instantiator
|
||||||
|
*/
|
||||||
|
class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
|
||||||
|
{
|
||||||
|
public static function fromNonExistingClass(string $className): self
|
||||||
|
{
|
||||||
|
if (interface_exists($className)) {
|
||||||
|
return new self(sprintf('The provided type "%s" is an interface, and cannot be instantiated', $className));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trait_exists($className)) {
|
||||||
|
return new self(sprintf('The provided type "%s" is a trait, and cannot be instantiated', $className));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new self(sprintf('The provided class "%s" does not exist', $className));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
public static function fromAbstractClass(ReflectionClass $reflectionClass): self
|
||||||
|
{
|
||||||
|
return new self(sprintf(
|
||||||
|
'The provided class "%s" is abstract, and cannot be instantiated',
|
||||||
|
$reflectionClass->getName()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function fromEnum(string $className): self
|
||||||
|
{
|
||||||
|
return new self(sprintf(
|
||||||
|
'The provided class "%s" is an enum, and cannot be instantiated',
|
||||||
|
$className
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Instantiator\Exception;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
use ReflectionClass;
|
||||||
|
use UnexpectedValueException as BaseUnexpectedValueException;
|
||||||
|
|
||||||
|
use function sprintf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception for given parameters causing invalid/unexpected state on instantiation
|
||||||
|
*/
|
||||||
|
class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
public static function fromSerializationTriggeredException(
|
||||||
|
ReflectionClass $reflectionClass,
|
||||||
|
Exception $exception
|
||||||
|
): self {
|
||||||
|
return new self(
|
||||||
|
sprintf(
|
||||||
|
'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
|
||||||
|
$reflectionClass->getName()
|
||||||
|
),
|
||||||
|
0,
|
||||||
|
$exception
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
public static function fromUncleanUnSerialization(
|
||||||
|
ReflectionClass $reflectionClass,
|
||||||
|
string $errorString,
|
||||||
|
int $errorCode,
|
||||||
|
string $errorFile,
|
||||||
|
int $errorLine
|
||||||
|
): self {
|
||||||
|
return new self(
|
||||||
|
sprintf(
|
||||||
|
'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
|
||||||
|
. 'in file "%s" at line "%d"',
|
||||||
|
$reflectionClass->getName(),
|
||||||
|
$errorFile,
|
||||||
|
$errorLine
|
||||||
|
),
|
||||||
|
0,
|
||||||
|
new Exception($errorString, $errorCode)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
260
gestion/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
vendored
Normal file
260
gestion/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
vendored
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Instantiator;
|
||||||
|
|
||||||
|
use ArrayIterator;
|
||||||
|
use Doctrine\Instantiator\Exception\ExceptionInterface;
|
||||||
|
use Doctrine\Instantiator\Exception\InvalidArgumentException;
|
||||||
|
use Doctrine\Instantiator\Exception\UnexpectedValueException;
|
||||||
|
use Exception;
|
||||||
|
use ReflectionClass;
|
||||||
|
use ReflectionException;
|
||||||
|
use Serializable;
|
||||||
|
|
||||||
|
use function class_exists;
|
||||||
|
use function enum_exists;
|
||||||
|
use function is_subclass_of;
|
||||||
|
use function restore_error_handler;
|
||||||
|
use function set_error_handler;
|
||||||
|
use function sprintf;
|
||||||
|
use function strlen;
|
||||||
|
use function unserialize;
|
||||||
|
|
||||||
|
use const PHP_VERSION_ID;
|
||||||
|
|
||||||
|
final class Instantiator implements InstantiatorInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Markers used internally by PHP to define whether {@see \unserialize} should invoke
|
||||||
|
* the method {@see \Serializable::unserialize()} when dealing with classes implementing
|
||||||
|
* the {@see \Serializable} interface.
|
||||||
|
*/
|
||||||
|
public const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
|
||||||
|
public const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to instantiate specific classes, indexed by class name.
|
||||||
|
*
|
||||||
|
* @var callable[]
|
||||||
|
*/
|
||||||
|
private static $cachedInstantiators = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array of objects that can directly be cloned, indexed by class name.
|
||||||
|
*
|
||||||
|
* @var object[]
|
||||||
|
*/
|
||||||
|
private static $cachedCloneables = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $className
|
||||||
|
* @phpstan-param class-string<T> $className
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
* @phpstan-return T
|
||||||
|
*
|
||||||
|
* @throws ExceptionInterface
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
public function instantiate($className)
|
||||||
|
{
|
||||||
|
if (isset(self::$cachedCloneables[$className])) {
|
||||||
|
/**
|
||||||
|
* @phpstan-var T
|
||||||
|
*/
|
||||||
|
$cachedCloneable = self::$cachedCloneables[$className];
|
||||||
|
|
||||||
|
return clone $cachedCloneable;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset(self::$cachedInstantiators[$className])) {
|
||||||
|
$factory = self::$cachedInstantiators[$className];
|
||||||
|
|
||||||
|
return $factory();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->buildAndCacheFromFactory($className);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the requested object and caches it in static properties for performance
|
||||||
|
*
|
||||||
|
* @phpstan-param class-string<T> $className
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
* @phpstan-return T
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function buildAndCacheFromFactory(string $className)
|
||||||
|
{
|
||||||
|
$factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
|
||||||
|
$instance = $factory();
|
||||||
|
|
||||||
|
if ($this->isSafeToClone(new ReflectionClass($instance))) {
|
||||||
|
self::$cachedCloneables[$className] = clone $instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds a callable capable of instantiating the given $className without
|
||||||
|
* invoking its constructor.
|
||||||
|
*
|
||||||
|
* @phpstan-param class-string<T> $className
|
||||||
|
*
|
||||||
|
* @phpstan-return callable(): T
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException
|
||||||
|
* @throws UnexpectedValueException
|
||||||
|
* @throws ReflectionException
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function buildFactory(string $className): callable
|
||||||
|
{
|
||||||
|
$reflectionClass = $this->getReflectionClass($className);
|
||||||
|
|
||||||
|
if ($this->isInstantiableViaReflection($reflectionClass)) {
|
||||||
|
return [$reflectionClass, 'newInstanceWithoutConstructor'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$serializedString = sprintf(
|
||||||
|
'%s:%d:"%s":0:{}',
|
||||||
|
is_subclass_of($className, Serializable::class) ? self::SERIALIZATION_FORMAT_USE_UNSERIALIZER : self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER,
|
||||||
|
strlen($className),
|
||||||
|
$className
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
|
||||||
|
|
||||||
|
return static function () use ($serializedString) {
|
||||||
|
return unserialize($serializedString);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param class-string<T> $className
|
||||||
|
*
|
||||||
|
* @phpstan-return ReflectionClass<T>
|
||||||
|
*
|
||||||
|
* @throws InvalidArgumentException
|
||||||
|
* @throws ReflectionException
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function getReflectionClass(string $className): ReflectionClass
|
||||||
|
{
|
||||||
|
if (! class_exists($className)) {
|
||||||
|
throw InvalidArgumentException::fromNonExistingClass($className);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PHP_VERSION_ID >= 80100 && enum_exists($className, false)) {
|
||||||
|
throw InvalidArgumentException::fromEnum($className);
|
||||||
|
}
|
||||||
|
|
||||||
|
$reflection = new ReflectionClass($className);
|
||||||
|
|
||||||
|
if ($reflection->isAbstract()) {
|
||||||
|
throw InvalidArgumentException::fromAbstractClass($reflection);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $reflection;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @throws UnexpectedValueException
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString): void
|
||||||
|
{
|
||||||
|
set_error_handler(static function (int $code, string $message, string $file, int $line) use ($reflectionClass, &$error): bool {
|
||||||
|
$error = UnexpectedValueException::fromUncleanUnSerialization(
|
||||||
|
$reflectionClass,
|
||||||
|
$message,
|
||||||
|
$code,
|
||||||
|
$file,
|
||||||
|
$line
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
|
||||||
|
} finally {
|
||||||
|
restore_error_handler();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($error) {
|
||||||
|
throw $error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @throws UnexpectedValueException
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString): void
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
unserialize($serializedString);
|
||||||
|
} catch (Exception $exception) {
|
||||||
|
throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function isInstantiableViaReflection(ReflectionClass $reflectionClass): bool
|
||||||
|
{
|
||||||
|
return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies whether the given class is to be considered internal
|
||||||
|
*
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function hasInternalAncestors(ReflectionClass $reflectionClass): bool
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
if ($reflectionClass->isInternal()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$reflectionClass = $reflectionClass->getParentClass();
|
||||||
|
} while ($reflectionClass);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a class is cloneable
|
||||||
|
*
|
||||||
|
* Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects.
|
||||||
|
*
|
||||||
|
* @phpstan-param ReflectionClass<T> $reflectionClass
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
private function isSafeToClone(ReflectionClass $reflectionClass): bool
|
||||||
|
{
|
||||||
|
return $reflectionClass->isCloneable()
|
||||||
|
&& ! $reflectionClass->hasMethod('__clone')
|
||||||
|
&& ! $reflectionClass->isSubclassOf(ArrayIterator::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
24
gestion/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
vendored
Normal file
24
gestion/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Doctrine\Instantiator;
|
||||||
|
|
||||||
|
use Doctrine\Instantiator\Exception\ExceptionInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiator provides utility methods to build objects without invoking their constructors
|
||||||
|
*/
|
||||||
|
interface InstantiatorInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param string $className
|
||||||
|
* @phpstan-param class-string<T> $className
|
||||||
|
*
|
||||||
|
* @return object
|
||||||
|
* @phpstan-return T
|
||||||
|
*
|
||||||
|
* @throws ExceptionInterface
|
||||||
|
*
|
||||||
|
* @template T of object
|
||||||
|
*/
|
||||||
|
public function instantiate($className);
|
||||||
|
}
|
||||||
24
gestion/vendor/dompdf/dompdf/AUTHORS.md
vendored
Normal file
24
gestion/vendor/dompdf/dompdf/AUTHORS.md
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Dompdf was designed and developed by Benj Carson.
|
||||||
|
|
||||||
|
### Current Team
|
||||||
|
|
||||||
|
* **Brian Sweeney** (maintainer)
|
||||||
|
* **Till Berger**
|
||||||
|
|
||||||
|
### Alumni
|
||||||
|
|
||||||
|
* **Benj Carson** (creator)
|
||||||
|
* **Fabien Ménager**
|
||||||
|
* **Simon Berger**
|
||||||
|
* **Orion Richardson**
|
||||||
|
|
||||||
|
### Contributors
|
||||||
|
* **Gabriel Bull**
|
||||||
|
* **Barry vd. Heuvel**
|
||||||
|
* **Ryan H. Masten**
|
||||||
|
* **Helmut Tischer**
|
||||||
|
* [and many more...](https://github.com/dompdf/dompdf/graphs/contributors)
|
||||||
|
|
||||||
|
### Thanks
|
||||||
|
|
||||||
|
Dompdf would not have been possible without strong community support.
|
||||||
456
gestion/vendor/dompdf/dompdf/LICENSE.LGPL
vendored
Normal file
456
gestion/vendor/dompdf/dompdf/LICENSE.LGPL
vendored
Normal file
@ -0,0 +1,456 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 2.1, February 1999
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
specially designated software packages--typically libraries--of the
|
||||||
|
Free Software Foundation and other authors who decide to use it. You
|
||||||
|
can use it too, but we suggest you first think carefully about whether
|
||||||
|
this license or the ordinary General Public License is the better
|
||||||
|
strategy to use in any particular case, based on the explanations below.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom of use,
|
||||||
|
not price. Our General Public Licenses are designed to make sure that
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
libraries. However, the Lesser license provides advantages in certain
|
||||||
|
special circumstances.
|
||||||
|
|
||||||
|
For example, on rare occasions, there may be a special need to
|
||||||
|
encourage the widest possible use of a certain library, so that it becomes
|
||||||
|
a de-facto standard. To achieve this, non-free programs must be
|
||||||
|
allowed to use the library. A more frequent case is that a free
|
||||||
|
library does the same job as widely used non-free libraries. In this
|
||||||
|
case, there is little to gain by limiting the free library to free
|
||||||
|
software only, so we use the Lesser General Public License.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
the user installs one, as long as the modified version is
|
||||||
|
interface-compatible with the version that the work was made with.
|
||||||
|
|
||||||
|
c) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply,
|
||||||
|
and the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License may add
|
||||||
|
an explicit geographical distribution limitation excluding those countries,
|
||||||
|
so that distribution is permitted only in or among countries not thus
|
||||||
|
excluded. In such case, this License incorporates the limitation as if
|
||||||
|
written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
240
gestion/vendor/dompdf/dompdf/README.md
vendored
Normal file
240
gestion/vendor/dompdf/dompdf/README.md
vendored
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
Dompdf
|
||||||
|
======
|
||||||
|
|
||||||
|
[](https://github.com/dompdf/dompdf/actions/workflows/test.yml)
|
||||||
|
[](https://packagist.org/packages/dompdf/dompdf)
|
||||||
|
[](https://packagist.org/packages/dompdf/dompdf)
|
||||||
|
[](https://packagist.org/packages/dompdf/dompdf)
|
||||||
|
[](https://packagist.org/packages/dompdf/dompdf)
|
||||||
|
|
||||||
|
**Dompdf is an HTML to PDF converter**
|
||||||
|
|
||||||
|
At its heart, dompdf is (mostly) a [CSS 2.1](http://www.w3.org/TR/CSS2/) compliant
|
||||||
|
HTML layout and rendering engine written in PHP. It is a style-driven renderer:
|
||||||
|
it will download and read external stylesheets, inline style tags, and the style
|
||||||
|
attributes of individual HTML elements. It also supports most presentational
|
||||||
|
HTML attributes.
|
||||||
|
|
||||||
|
*This document applies to the latest stable code which may not reflect the current
|
||||||
|
release. For released code please
|
||||||
|
[navigate to the appropriate tag](https://github.com/dompdf/dompdf/tags).*
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
**Check out the [demo](http://eclecticgeek.com/dompdf/debug.php) and ask any
|
||||||
|
question on [StackOverflow](https://stackoverflow.com/questions/tagged/dompdf) or
|
||||||
|
in [Discussions](https://github.com/dompdf/dompdf/discussions).**
|
||||||
|
|
||||||
|
Follow us on [](http://www.twitter.com/dompdf).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
* Handles most CSS 2.1 and a few CSS3 properties, including @import, @media &
|
||||||
|
@page rules
|
||||||
|
* Supports most presentational HTML 4.0 attributes
|
||||||
|
* Supports external stylesheets, either local or through http/ftp (via
|
||||||
|
fopen-wrappers)
|
||||||
|
* Supports complex tables, including row & column spans, separate & collapsed
|
||||||
|
border models, individual cell styling
|
||||||
|
* Image support (gif, png (8, 24 and 32 bit with alpha channel), bmp & jpeg)
|
||||||
|
* No dependencies on external PDF libraries, thanks to the R&OS PDF class
|
||||||
|
* Inline PHP support
|
||||||
|
* Basic SVG support (see "Limitations" below)
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
* PHP version 7.1 or higher
|
||||||
|
* DOM extension
|
||||||
|
* MBString extension
|
||||||
|
* php-font-lib
|
||||||
|
* php-svg-lib
|
||||||
|
|
||||||
|
Note that some required dependencies may have further dependencies
|
||||||
|
(notably php-svg-lib requires sabberworm/php-css-parser).
|
||||||
|
|
||||||
|
### Recommendations
|
||||||
|
|
||||||
|
* GD (for image processing)
|
||||||
|
* Additionally, the IMagick or GMagick extension improves image processing performance for certain image types
|
||||||
|
* OPcache (OPcache, XCache, APC, etc.): improves performance
|
||||||
|
|
||||||
|
Visit the wiki for more information:
|
||||||
|
https://github.com/dompdf/dompdf/wiki/Requirements
|
||||||
|
|
||||||
|
## About Fonts & Character Encoding
|
||||||
|
|
||||||
|
PDF documents internally support the following fonts: Helvetica, Times-Roman,
|
||||||
|
Courier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI
|
||||||
|
encoding. In order for a PDF to display characters that are not available in
|
||||||
|
Windows ANSI, you must supply an external font. Dompdf will embed any referenced
|
||||||
|
font in the PDF so long as it has been pre-loaded or is accessible to dompdf and
|
||||||
|
reference in CSS @font-face rules. See the
|
||||||
|
[font overview](https://github.com/dompdf/dompdf/wiki/About-Fonts-and-Character-Encoding)
|
||||||
|
for more information on how to use fonts.
|
||||||
|
|
||||||
|
The [DejaVu TrueType fonts](https://dejavu-fonts.github.io/) have been pre-installed
|
||||||
|
to give dompdf decent Unicode character coverage by default. To use the DejaVu
|
||||||
|
fonts reference the font in your stylesheet, e.g. `body { font-family: DejaVu
|
||||||
|
Sans; }` (for DejaVu Sans). The following DejaVu 2.34 fonts are available:
|
||||||
|
DejaVu Sans, DejaVu Serif, and DejaVu Sans Mono.
|
||||||
|
|
||||||
|
## Easy Installation
|
||||||
|
|
||||||
|
### Install with composer
|
||||||
|
|
||||||
|
To install with [Composer](https://getcomposer.org/), simply require the
|
||||||
|
latest version of this package.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer require dompdf/dompdf
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure that the autoload file from Composer is loaded.
|
||||||
|
|
||||||
|
```php
|
||||||
|
// somewhere early in your project's loading, require the Composer autoloader
|
||||||
|
// see: http://getcomposer.org/doc/00-intro.md
|
||||||
|
require 'vendor/autoload.php';
|
||||||
|
```
|
||||||
|
|
||||||
|
### Download and install
|
||||||
|
|
||||||
|
Download a packaged archive of dompdf and extract it into the
|
||||||
|
directory where dompdf will reside
|
||||||
|
|
||||||
|
* You can download stable copies of dompdf from
|
||||||
|
https://github.com/dompdf/dompdf/releases
|
||||||
|
* Or download a nightly (the latest, unreleased code) from
|
||||||
|
http://eclecticgeek.com/dompdf
|
||||||
|
|
||||||
|
Use the packaged release autoloader to load dompdf, libraries,
|
||||||
|
and helper functions in your PHP:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// include autoloader
|
||||||
|
require_once 'dompdf/autoload.inc.php';
|
||||||
|
```
|
||||||
|
|
||||||
|
Note: packaged releases are named according using semantic
|
||||||
|
versioning (_dompdf_MAJOR-MINOR-PATCH.zip_). So the 1.0.0
|
||||||
|
release would be dompdf_1-0-0.zip. This is the only download
|
||||||
|
that includes the autoloader for Dompdf and all its dependencies.
|
||||||
|
|
||||||
|
### Install with git
|
||||||
|
|
||||||
|
From the command line, switch to the directory where dompdf will
|
||||||
|
reside and run the following commands:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/dompdf/dompdf.git
|
||||||
|
cd dompdf/lib
|
||||||
|
|
||||||
|
git clone https://github.com/PhenX/php-font-lib.git php-font-lib
|
||||||
|
cd php-font-lib
|
||||||
|
git checkout 0.5.1
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
git clone https://github.com/PhenX/php-svg-lib.git php-svg-lib
|
||||||
|
cd php-svg-lib
|
||||||
|
git checkout v0.3.2
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
git clone https://github.com/sabberworm/PHP-CSS-Parser.git php-css-parser
|
||||||
|
cd php-css-parser
|
||||||
|
git checkout 8.1.0
|
||||||
|
```
|
||||||
|
|
||||||
|
Require dompdf and it's dependencies in your PHP.
|
||||||
|
For details see the [autoloader in the utils project](https://github.com/dompdf/utils/blob/master/autoload.inc.php).
|
||||||
|
|
||||||
|
## Framework Integration
|
||||||
|
|
||||||
|
* For Symfony: [nucleos/dompdf-bundle](https://github.com/nucleos/NucleosDompdfBundle)
|
||||||
|
* For Laravel: [barryvdh/laravel-dompdf](https://github.com/barryvdh/laravel-dompdf)
|
||||||
|
* For Redaxo: [PdfOut](https://github.com/FriendsOfREDAXO/pdfout)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
Just pass your HTML in to dompdf and stream the output:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// reference the Dompdf namespace
|
||||||
|
use Dompdf\Dompdf;
|
||||||
|
|
||||||
|
// instantiate and use the dompdf class
|
||||||
|
$dompdf = new Dompdf();
|
||||||
|
$dompdf->loadHtml('hello world');
|
||||||
|
|
||||||
|
// (Optional) Setup the paper size and orientation
|
||||||
|
$dompdf->setPaper('A4', 'landscape');
|
||||||
|
|
||||||
|
// Render the HTML as PDF
|
||||||
|
$dompdf->render();
|
||||||
|
|
||||||
|
// Output the generated PDF to Browser
|
||||||
|
$dompdf->stream();
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setting Options
|
||||||
|
|
||||||
|
Set options during dompdf instantiation:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Dompdf\Dompdf;
|
||||||
|
use Dompdf\Options;
|
||||||
|
|
||||||
|
$options = new Options();
|
||||||
|
$options->set('defaultFont', 'Courier');
|
||||||
|
$dompdf = new Dompdf($options);
|
||||||
|
```
|
||||||
|
|
||||||
|
or at run time
|
||||||
|
|
||||||
|
```php
|
||||||
|
use Dompdf\Dompdf;
|
||||||
|
|
||||||
|
$dompdf = new Dompdf();
|
||||||
|
$options = $dompdf->getOptions();
|
||||||
|
$options->setDefaultFont('Courier');
|
||||||
|
$dompdf->setOptions($options);
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Dompdf\Options](src/Options.php) for a list of available options.
|
||||||
|
|
||||||
|
### Resource Reference Requirements
|
||||||
|
|
||||||
|
In order to protect potentially sensitive information Dompdf imposes
|
||||||
|
restrictions on files referenced from the local file system or the web.
|
||||||
|
|
||||||
|
Files accessed through web-based protocols have the following requirements:
|
||||||
|
* The Dompdf option "isRemoteEnabled" must be set to "true"
|
||||||
|
* PHP must either have the curl extension enabled or the
|
||||||
|
allow_url_fopen setting set to true
|
||||||
|
|
||||||
|
Files accessed through the local file system have the following requirement:
|
||||||
|
* The file must fall within the path(s) specified for the Dompdf "chroot" option
|
||||||
|
|
||||||
|
## Limitations (Known Issues)
|
||||||
|
|
||||||
|
* Table cells are not pageable, meaning a table row must fit on a single page.
|
||||||
|
* Elements are rendered on the active page when they are parsed.
|
||||||
|
* Embedding "raw" SVG's (`<svg><path...></svg>`) isn't working yet, you need to
|
||||||
|
either link to an external SVG file, or use a DataURI like this:
|
||||||
|
```php
|
||||||
|
$html = '<img src="data:image/svg+xml;base64,' . base64_encode($svg) . '" ...>';
|
||||||
|
```
|
||||||
|
Watch https://github.com/dompdf/dompdf/issues/320 for progress
|
||||||
|
* Does not support CSS flexbox.
|
||||||
|
* Does not support CSS Grid.
|
||||||
|
* A single Dompdf instance should not be used to render more than one HTML document
|
||||||
|
because persisted parsing and rendering artifacts can impact future renders.
|
||||||
|
---
|
||||||
|
|
||||||
|
[](http://goo.gl/DSvWf)
|
||||||
|
|
||||||
|
*If you find this project useful, please consider making a donation.
|
||||||
|
Any funds donated will be used to help further development on this project.)*
|
||||||
1
gestion/vendor/dompdf/dompdf/VERSION
vendored
Normal file
1
gestion/vendor/dompdf/dompdf/VERSION
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.1.0
|
||||||
49
gestion/vendor/dompdf/dompdf/composer.json
vendored
Normal file
49
gestion/vendor/dompdf/dompdf/composer.json
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
"name": "dompdf/dompdf",
|
||||||
|
"type": "library",
|
||||||
|
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
|
||||||
|
"homepage": "https://github.com/dompdf/dompdf",
|
||||||
|
"license": "LGPL-2.1",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "The Dompdf Community",
|
||||||
|
"homepage": "https://github.com/dompdf/dompdf/blob/master/AUTHORS.md"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Dompdf\\": "src/"
|
||||||
|
},
|
||||||
|
"classmap": [
|
||||||
|
"lib/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"Dompdf\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^7.1 || ^8.0",
|
||||||
|
"ext-dom": "*",
|
||||||
|
"ext-mbstring": "*",
|
||||||
|
"masterminds/html5": "^2.0",
|
||||||
|
"dompdf/php-font-lib": "^1.0.0",
|
||||||
|
"dompdf/php-svg-lib": "^1.0.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"ext-gd": "*",
|
||||||
|
"ext-json": "*",
|
||||||
|
"ext-zip": "*",
|
||||||
|
"phpunit/phpunit": "^7.5 || ^8 || ^9 || ^10 || ^11",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5",
|
||||||
|
"mockery/mockery": "^1.3",
|
||||||
|
"symfony/process": "^4.4 || ^5.4 || ^6.2 || ^7.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gd": "Needed to process images",
|
||||||
|
"ext-imagick": "Improves image processing performance",
|
||||||
|
"ext-gmagick": "Improves image processing performance",
|
||||||
|
"ext-zlib": "Needed for pdf stream compression"
|
||||||
|
}
|
||||||
|
}
|
||||||
6783
gestion/vendor/dompdf/dompdf/lib/Cpdf.php
vendored
Normal file
6783
gestion/vendor/dompdf/dompdf/lib/Cpdf.php
vendored
Normal file
File diff suppressed because it is too large
Load Diff
344
gestion/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm
vendored
Normal file
344
gestion/vendor/dompdf/dompdf/lib/fonts/Courier-Bold.afm
vendored
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
StartFontMetrics 4.1
|
||||||
|
Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
|
||||||
|
Comment Creation Date: Mon Jun 23 16:28:00 0:00:00
|
||||||
|
Comment UniqueID 43048
|
||||||
|
Comment VMusage 41139 52164
|
||||||
|
FontName Courier-Bold
|
||||||
|
FullName Courier Bold
|
||||||
|
FamilyName Courier
|
||||||
|
Weight Bold
|
||||||
|
ItalicAngle 0
|
||||||
|
IsFixedPitch true
|
||||||
|
CharacterSet ExtendedRoman
|
||||||
|
FontBBox -113 -250 749 801
|
||||||
|
UnderlinePosition -100
|
||||||
|
UnderlineThickness 50
|
||||||
|
Version 003.000
|
||||||
|
Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
|
||||||
|
EncodingScheme WinAnsiEncoding
|
||||||
|
CapHeight 562
|
||||||
|
XHeight 439
|
||||||
|
Ascender 629
|
||||||
|
Descender -157
|
||||||
|
StdHW 84
|
||||||
|
StdVW 106
|
||||||
|
StartCharMetrics 317
|
||||||
|
C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
|
||||||
|
C 160 ; WX 600 ; N space ; B 0 0 0 0 ;
|
||||||
|
C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;
|
||||||
|
C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;
|
||||||
|
C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;
|
||||||
|
C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;
|
||||||
|
C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;
|
||||||
|
C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;
|
||||||
|
C 146 ; WX 600 ; N quoteright ; B 171 277 423 562 ;
|
||||||
|
C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;
|
||||||
|
C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;
|
||||||
|
C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;
|
||||||
|
C 43 ; WX 600 ; N plus ; B 71 39 529 478 ;
|
||||||
|
C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;
|
||||||
|
C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;
|
||||||
|
C 173 ; WX 600 ; N hyphen ; B 100 203 500 313 ;
|
||||||
|
C 46 ; WX 600 ; N period ; B 192 -15 408 171 ;
|
||||||
|
C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;
|
||||||
|
C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;
|
||||||
|
C 49 ; WX 600 ; N one ; B 81 0 539 616 ;
|
||||||
|
C 50 ; WX 600 ; N two ; B 61 0 499 616 ;
|
||||||
|
C 51 ; WX 600 ; N three ; B 63 -15 501 616 ;
|
||||||
|
C 52 ; WX 600 ; N four ; B 53 0 507 616 ;
|
||||||
|
C 53 ; WX 600 ; N five ; B 70 -15 521 601 ;
|
||||||
|
C 54 ; WX 600 ; N six ; B 90 -15 521 616 ;
|
||||||
|
C 55 ; WX 600 ; N seven ; B 55 0 494 601 ;
|
||||||
|
C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;
|
||||||
|
C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;
|
||||||
|
C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;
|
||||||
|
C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;
|
||||||
|
C 60 ; WX 600 ; N less ; B 66 15 523 501 ;
|
||||||
|
C 61 ; WX 600 ; N equal ; B 71 118 529 398 ;
|
||||||
|
C 62 ; WX 600 ; N greater ; B 77 15 534 501 ;
|
||||||
|
C 63 ; WX 600 ; N question ; B 98 -14 501 580 ;
|
||||||
|
C 64 ; WX 600 ; N at ; B 16 -15 584 616 ;
|
||||||
|
C 65 ; WX 600 ; N A ; B -9 0 609 562 ;
|
||||||
|
C 66 ; WX 600 ; N B ; B 30 0 573 562 ;
|
||||||
|
C 67 ; WX 600 ; N C ; B 22 -18 560 580 ;
|
||||||
|
C 68 ; WX 600 ; N D ; B 30 0 594 562 ;
|
||||||
|
C 69 ; WX 600 ; N E ; B 25 0 560 562 ;
|
||||||
|
C 70 ; WX 600 ; N F ; B 39 0 570 562 ;
|
||||||
|
C 71 ; WX 600 ; N G ; B 22 -18 594 580 ;
|
||||||
|
C 72 ; WX 600 ; N H ; B 20 0 580 562 ;
|
||||||
|
C 73 ; WX 600 ; N I ; B 77 0 523 562 ;
|
||||||
|
C 74 ; WX 600 ; N J ; B 37 -18 601 562 ;
|
||||||
|
C 75 ; WX 600 ; N K ; B 21 0 599 562 ;
|
||||||
|
C 76 ; WX 600 ; N L ; B 39 0 578 562 ;
|
||||||
|
C 77 ; WX 600 ; N M ; B -2 0 602 562 ;
|
||||||
|
C 78 ; WX 600 ; N N ; B 8 -12 610 562 ;
|
||||||
|
C 79 ; WX 600 ; N O ; B 22 -18 578 580 ;
|
||||||
|
C 80 ; WX 600 ; N P ; B 48 0 559 562 ;
|
||||||
|
C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;
|
||||||
|
C 82 ; WX 600 ; N R ; B 24 0 599 562 ;
|
||||||
|
C 83 ; WX 600 ; N S ; B 47 -22 553 582 ;
|
||||||
|
C 84 ; WX 600 ; N T ; B 21 0 579 562 ;
|
||||||
|
C 85 ; WX 600 ; N U ; B 4 -18 596 562 ;
|
||||||
|
C 86 ; WX 600 ; N V ; B -13 0 613 562 ;
|
||||||
|
C 87 ; WX 600 ; N W ; B -18 0 618 562 ;
|
||||||
|
C 88 ; WX 600 ; N X ; B 12 0 588 562 ;
|
||||||
|
C 89 ; WX 600 ; N Y ; B 12 0 589 562 ;
|
||||||
|
C 90 ; WX 600 ; N Z ; B 62 0 539 562 ;
|
||||||
|
C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;
|
||||||
|
C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;
|
||||||
|
C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;
|
||||||
|
C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;
|
||||||
|
C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
|
||||||
|
C 145 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;
|
||||||
|
C 97 ; WX 600 ; N a ; B 35 -15 570 454 ;
|
||||||
|
C 98 ; WX 600 ; N b ; B 0 -15 584 626 ;
|
||||||
|
C 99 ; WX 600 ; N c ; B 40 -15 545 459 ;
|
||||||
|
C 100 ; WX 600 ; N d ; B 20 -15 591 626 ;
|
||||||
|
C 101 ; WX 600 ; N e ; B 40 -15 563 454 ;
|
||||||
|
C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;
|
||||||
|
C 103 ; WX 600 ; N g ; B 30 -146 580 454 ;
|
||||||
|
C 104 ; WX 600 ; N h ; B 5 0 592 626 ;
|
||||||
|
C 105 ; WX 600 ; N i ; B 77 0 523 658 ;
|
||||||
|
C 106 ; WX 600 ; N j ; B 63 -146 440 658 ;
|
||||||
|
C 107 ; WX 600 ; N k ; B 20 0 585 626 ;
|
||||||
|
C 108 ; WX 600 ; N l ; B 77 0 523 626 ;
|
||||||
|
C 109 ; WX 600 ; N m ; B -22 0 626 454 ;
|
||||||
|
C 110 ; WX 600 ; N n ; B 18 0 592 454 ;
|
||||||
|
C 111 ; WX 600 ; N o ; B 30 -15 570 454 ;
|
||||||
|
C 112 ; WX 600 ; N p ; B -1 -142 570 454 ;
|
||||||
|
C 113 ; WX 600 ; N q ; B 20 -142 591 454 ;
|
||||||
|
C 114 ; WX 600 ; N r ; B 47 0 580 454 ;
|
||||||
|
C 115 ; WX 600 ; N s ; B 68 -17 535 459 ;
|
||||||
|
C 116 ; WX 600 ; N t ; B 47 -15 532 562 ;
|
||||||
|
C 117 ; WX 600 ; N u ; B -1 -15 569 439 ;
|
||||||
|
C 118 ; WX 600 ; N v ; B -1 0 601 439 ;
|
||||||
|
C 119 ; WX 600 ; N w ; B -18 0 618 439 ;
|
||||||
|
C 120 ; WX 600 ; N x ; B 6 0 594 439 ;
|
||||||
|
C 121 ; WX 600 ; N y ; B -4 -142 601 439 ;
|
||||||
|
C 122 ; WX 600 ; N z ; B 81 0 520 439 ;
|
||||||
|
C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;
|
||||||
|
C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;
|
||||||
|
C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;
|
||||||
|
C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;
|
||||||
|
C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;
|
||||||
|
C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;
|
||||||
|
C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;
|
||||||
|
C -1 ; WX 600 ; N fraction ; B 25 -60 576 661 ;
|
||||||
|
C 165 ; WX 600 ; N yen ; B 10 0 590 562 ;
|
||||||
|
C 131 ; WX 600 ; N florin ; B -30 -131 572 616 ;
|
||||||
|
C 167 ; WX 600 ; N section ; B 83 -70 517 580 ;
|
||||||
|
C 164 ; WX 600 ; N currency ; B 54 49 546 517 ;
|
||||||
|
C 39 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;
|
||||||
|
C 147 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;
|
||||||
|
C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;
|
||||||
|
C 139 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;
|
||||||
|
C 155 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;
|
||||||
|
C -1 ; WX 600 ; N fi ; B 12 0 593 626 ;
|
||||||
|
C -1 ; WX 600 ; N fl ; B 12 0 593 626 ;
|
||||||
|
C 150 ; WX 600 ; N endash ; B 65 203 535 313 ;
|
||||||
|
C 134 ; WX 600 ; N dagger ; B 106 -70 494 580 ;
|
||||||
|
C 135 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;
|
||||||
|
C 183 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;
|
||||||
|
C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;
|
||||||
|
C 149 ; WX 600 ; N bullet ; B 140 132 460 430 ;
|
||||||
|
C 130 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;
|
||||||
|
C 132 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;
|
||||||
|
C 148 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;
|
||||||
|
C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;
|
||||||
|
C 133 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;
|
||||||
|
C 137 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;
|
||||||
|
C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;
|
||||||
|
C 96 ; WX 600 ; N grave ; B 132 508 395 661 ;
|
||||||
|
C 180 ; WX 600 ; N acute ; B 205 508 468 661 ;
|
||||||
|
C 136 ; WX 600 ; N circumflex ; B 103 483 497 657 ;
|
||||||
|
C 152 ; WX 600 ; N tilde ; B 89 493 512 636 ;
|
||||||
|
C 175 ; WX 600 ; N macron ; B 88 505 512 585 ;
|
||||||
|
C -1 ; WX 600 ; N breve ; B 83 468 517 631 ;
|
||||||
|
C -1 ; WX 600 ; N dotaccent ; B 230 498 370 638 ;
|
||||||
|
C 168 ; WX 600 ; N dieresis ; B 128 498 472 638 ;
|
||||||
|
C -1 ; WX 600 ; N ring ; B 198 481 402 678 ;
|
||||||
|
C 184 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;
|
||||||
|
C -1 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;
|
||||||
|
C -1 ; WX 600 ; N ogonek ; B 169 -199 400 0 ;
|
||||||
|
C -1 ; WX 600 ; N caron ; B 103 493 497 667 ;
|
||||||
|
C 151 ; WX 600 ; N emdash ; B -10 203 610 313 ;
|
||||||
|
C 198 ; WX 600 ; N AE ; B -29 0 602 562 ;
|
||||||
|
C 170 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;
|
||||||
|
C -1 ; WX 600 ; N Lslash ; B 39 0 578 562 ;
|
||||||
|
C 216 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;
|
||||||
|
C 140 ; WX 600 ; N OE ; B -25 0 595 562 ;
|
||||||
|
C 186 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;
|
||||||
|
C 230 ; WX 600 ; N ae ; B -4 -15 601 454 ;
|
||||||
|
C -1 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;
|
||||||
|
C -1 ; WX 600 ; N lslash ; B 77 0 523 626 ;
|
||||||
|
C 248 ; WX 600 ; N oslash ; B 30 -24 570 463 ;
|
||||||
|
C 156 ; WX 600 ; N oe ; B -18 -15 611 454 ;
|
||||||
|
C 223 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;
|
||||||
|
C 207 ; WX 600 ; N Idieresis ; B 77 0 523 761 ;
|
||||||
|
C 233 ; WX 600 ; N eacute ; B 40 -15 563 661 ;
|
||||||
|
C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ;
|
||||||
|
C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ;
|
||||||
|
C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ;
|
||||||
|
C 159 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ;
|
||||||
|
C 247 ; WX 600 ; N divide ; B 71 16 529 500 ;
|
||||||
|
C 221 ; WX 600 ; N Yacute ; B 12 0 589 784 ;
|
||||||
|
C 194 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;
|
||||||
|
C 225 ; WX 600 ; N aacute ; B 35 -15 570 661 ;
|
||||||
|
C 219 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;
|
||||||
|
C 253 ; WX 600 ; N yacute ; B -4 -142 601 661 ;
|
||||||
|
C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ;
|
||||||
|
C 234 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;
|
||||||
|
C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ;
|
||||||
|
C 220 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ;
|
||||||
|
C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ;
|
||||||
|
C 218 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;
|
||||||
|
C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ;
|
||||||
|
C 203 ; WX 600 ; N Edieresis ; B 25 0 560 761 ;
|
||||||
|
C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ;
|
||||||
|
C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ;
|
||||||
|
C 169 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
|
||||||
|
C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ;
|
||||||
|
C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ;
|
||||||
|
C 229 ; WX 600 ; N aring ; B 35 -15 570 678 ;
|
||||||
|
C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ;
|
||||||
|
C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ;
|
||||||
|
C 224 ; WX 600 ; N agrave ; B 35 -15 570 661 ;
|
||||||
|
C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ;
|
||||||
|
C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ;
|
||||||
|
C 227 ; WX 600 ; N atilde ; B 35 -15 570 636 ;
|
||||||
|
C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ;
|
||||||
|
C 154 ; WX 600 ; N scaron ; B 68 -17 535 667 ;
|
||||||
|
C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;
|
||||||
|
C 237 ; WX 600 ; N iacute ; B 77 0 523 661 ;
|
||||||
|
C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ;
|
||||||
|
C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ;
|
||||||
|
C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ;
|
||||||
|
C 251 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;
|
||||||
|
C 226 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;
|
||||||
|
C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ;
|
||||||
|
C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ;
|
||||||
|
C 231 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;
|
||||||
|
C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ;
|
||||||
|
C 222 ; WX 600 ; N Thorn ; B 48 0 557 562 ;
|
||||||
|
C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ;
|
||||||
|
C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ;
|
||||||
|
C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ;
|
||||||
|
C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ;
|
||||||
|
C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ;
|
||||||
|
C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ;
|
||||||
|
C 179 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;
|
||||||
|
C 210 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;
|
||||||
|
C 192 ; WX 600 ; N Agrave ; B -9 0 609 784 ;
|
||||||
|
C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ;
|
||||||
|
C 215 ; WX 600 ; N multiply ; B 81 39 520 478 ;
|
||||||
|
C 250 ; WX 600 ; N uacute ; B -1 -15 569 661 ;
|
||||||
|
C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ;
|
||||||
|
C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ;
|
||||||
|
C 255 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ;
|
||||||
|
C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ;
|
||||||
|
C 238 ; WX 600 ; N icircumflex ; B 73 0 523 657 ;
|
||||||
|
C 202 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;
|
||||||
|
C 228 ; WX 600 ; N adieresis ; B 35 -15 570 638 ;
|
||||||
|
C 235 ; WX 600 ; N edieresis ; B 40 -15 563 638 ;
|
||||||
|
C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ;
|
||||||
|
C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ;
|
||||||
|
C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ;
|
||||||
|
C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ;
|
||||||
|
C 205 ; WX 600 ; N Iacute ; B 77 0 523 784 ;
|
||||||
|
C 177 ; WX 600 ; N plusminus ; B 71 24 529 515 ;
|
||||||
|
C 166 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;
|
||||||
|
C 174 ; WX 600 ; N registered ; B 0 -18 600 580 ;
|
||||||
|
C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ;
|
||||||
|
C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ;
|
||||||
|
C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
|
||||||
|
C 200 ; WX 600 ; N Egrave ; B 25 0 560 784 ;
|
||||||
|
C -1 ; WX 600 ; N racute ; B 47 0 580 661 ;
|
||||||
|
C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ;
|
||||||
|
C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ;
|
||||||
|
C 142 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;
|
||||||
|
C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ;
|
||||||
|
C 208 ; WX 600 ; N Eth ; B 30 0 594 562 ;
|
||||||
|
C 199 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;
|
||||||
|
C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ;
|
||||||
|
C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ;
|
||||||
|
C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ;
|
||||||
|
C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ;
|
||||||
|
C 193 ; WX 600 ; N Aacute ; B -9 0 609 784 ;
|
||||||
|
C 196 ; WX 600 ; N Adieresis ; B -9 0 609 761 ;
|
||||||
|
C 232 ; WX 600 ; N egrave ; B 40 -15 563 661 ;
|
||||||
|
C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ;
|
||||||
|
C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ;
|
||||||
|
C 211 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;
|
||||||
|
C 243 ; WX 600 ; N oacute ; B 30 -15 570 661 ;
|
||||||
|
C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ;
|
||||||
|
C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ;
|
||||||
|
C 239 ; WX 600 ; N idieresis ; B 77 0 523 618 ;
|
||||||
|
C 212 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;
|
||||||
|
C 217 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;
|
||||||
|
C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
|
||||||
|
C 254 ; WX 600 ; N thorn ; B -14 -142 570 626 ;
|
||||||
|
C 178 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;
|
||||||
|
C 214 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ;
|
||||||
|
C 181 ; WX 600 ; N mu ; B -1 -142 569 439 ;
|
||||||
|
C 236 ; WX 600 ; N igrave ; B 77 0 523 661 ;
|
||||||
|
C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ;
|
||||||
|
C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ;
|
||||||
|
C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ;
|
||||||
|
C 190 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;
|
||||||
|
C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;
|
||||||
|
C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ;
|
||||||
|
C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ;
|
||||||
|
C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ;
|
||||||
|
C 153 ; WX 600 ; N trademark ; B -9 230 749 562 ;
|
||||||
|
C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ;
|
||||||
|
C 204 ; WX 600 ; N Igrave ; B 77 0 523 784 ;
|
||||||
|
C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ;
|
||||||
|
C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ;
|
||||||
|
C 189 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;
|
||||||
|
C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ;
|
||||||
|
C 244 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;
|
||||||
|
C 241 ; WX 600 ; N ntilde ; B 18 0 592 636 ;
|
||||||
|
C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ;
|
||||||
|
C 201 ; WX 600 ; N Eacute ; B 25 0 560 784 ;
|
||||||
|
C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ;
|
||||||
|
C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ;
|
||||||
|
C 188 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;
|
||||||
|
C 138 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;
|
||||||
|
C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ;
|
||||||
|
C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ;
|
||||||
|
C 176 ; WX 600 ; N degree ; B 86 243 474 616 ;
|
||||||
|
C 242 ; WX 600 ; N ograve ; B 30 -15 570 661 ;
|
||||||
|
C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ;
|
||||||
|
C 249 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;
|
||||||
|
C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ;
|
||||||
|
C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ;
|
||||||
|
C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ;
|
||||||
|
C 209 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;
|
||||||
|
C 245 ; WX 600 ; N otilde ; B 30 -15 570 636 ;
|
||||||
|
C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ;
|
||||||
|
C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ;
|
||||||
|
C 195 ; WX 600 ; N Atilde ; B -9 0 609 759 ;
|
||||||
|
C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ;
|
||||||
|
C 197 ; WX 600 ; N Aring ; B -9 0 609 801 ;
|
||||||
|
C 213 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;
|
||||||
|
C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ;
|
||||||
|
C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ;
|
||||||
|
C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ;
|
||||||
|
C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ;
|
||||||
|
C -1 ; WX 600 ; N minus ; B 71 203 529 313 ;
|
||||||
|
C 206 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;
|
||||||
|
C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ;
|
||||||
|
C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ;
|
||||||
|
C 172 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;
|
||||||
|
C 246 ; WX 600 ; N odieresis ; B 30 -15 570 638 ;
|
||||||
|
C 252 ; WX 600 ; N udieresis ; B -1 -15 569 638 ;
|
||||||
|
C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ;
|
||||||
|
C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ;
|
||||||
|
C 240 ; WX 600 ; N eth ; B 58 -27 543 626 ;
|
||||||
|
C 158 ; WX 600 ; N zcaron ; B 81 0 520 667 ;
|
||||||
|
C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ;
|
||||||
|
C 185 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;
|
||||||
|
C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ;
|
||||||
|
C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ;
|
||||||
|
EndCharMetrics
|
||||||
|
EndFontMetrics
|
||||||
344
gestion/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm
vendored
Normal file
344
gestion/vendor/dompdf/dompdf/lib/fonts/Courier-BoldOblique.afm
vendored
Normal file
@ -0,0 +1,344 @@
|
|||||||
|
StartFontMetrics 4.1
|
||||||
|
Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
|
||||||
|
Comment Creation Date: Mon Jun 23 16:28:46 0:00:00
|
||||||
|
Comment UniqueID 43049
|
||||||
|
Comment VMusage 17529 79244
|
||||||
|
FontName Courier-BoldOblique
|
||||||
|
FullName Courier Bold Oblique
|
||||||
|
FamilyName Courier
|
||||||
|
Weight Bold
|
||||||
|
ItalicAngle -12
|
||||||
|
IsFixedPitch true
|
||||||
|
CharacterSet ExtendedRoman
|
||||||
|
FontBBox -57 -250 869 801
|
||||||
|
UnderlinePosition -100
|
||||||
|
UnderlineThickness 50
|
||||||
|
Version 3
|
||||||
|
Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
|
||||||
|
EncodingScheme WinAnsiEncoding
|
||||||
|
CapHeight 562
|
||||||
|
XHeight 439
|
||||||
|
Ascender 629
|
||||||
|
Descender -157
|
||||||
|
StdHW 84
|
||||||
|
StdVW 106
|
||||||
|
StartCharMetrics 317
|
||||||
|
C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
|
||||||
|
C 160 ; WX 600 ; N space ; B 0 0 0 0 ;
|
||||||
|
C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ;
|
||||||
|
C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ;
|
||||||
|
C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ;
|
||||||
|
C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ;
|
||||||
|
C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ;
|
||||||
|
C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ;
|
||||||
|
C 146 ; WX 600 ; N quoteright ; B 229 277 543 562 ;
|
||||||
|
C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ;
|
||||||
|
C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;
|
||||||
|
C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ;
|
||||||
|
C 43 ; WX 600 ; N plus ; B 114 39 596 478 ;
|
||||||
|
C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;
|
||||||
|
C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;
|
||||||
|
C 173 ; WX 600 ; N hyphen ; B 143 203 567 313 ;
|
||||||
|
C 46 ; WX 600 ; N period ; B 206 -15 427 171 ;
|
||||||
|
C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ;
|
||||||
|
C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ;
|
||||||
|
C 49 ; WX 600 ; N one ; B 93 0 562 616 ;
|
||||||
|
C 50 ; WX 600 ; N two ; B 61 0 594 616 ;
|
||||||
|
C 51 ; WX 600 ; N three ; B 71 -15 571 616 ;
|
||||||
|
C 52 ; WX 600 ; N four ; B 81 0 559 616 ;
|
||||||
|
C 53 ; WX 600 ; N five ; B 77 -15 621 601 ;
|
||||||
|
C 54 ; WX 600 ; N six ; B 135 -15 652 616 ;
|
||||||
|
C 55 ; WX 600 ; N seven ; B 147 0 622 601 ;
|
||||||
|
C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;
|
||||||
|
C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ;
|
||||||
|
C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ;
|
||||||
|
C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ;
|
||||||
|
C 60 ; WX 600 ; N less ; B 120 15 613 501 ;
|
||||||
|
C 61 ; WX 600 ; N equal ; B 96 118 614 398 ;
|
||||||
|
C 62 ; WX 600 ; N greater ; B 97 15 589 501 ;
|
||||||
|
C 63 ; WX 600 ; N question ; B 183 -14 592 580 ;
|
||||||
|
C 64 ; WX 600 ; N at ; B 65 -15 642 616 ;
|
||||||
|
C 65 ; WX 600 ; N A ; B -9 0 632 562 ;
|
||||||
|
C 66 ; WX 600 ; N B ; B 30 0 630 562 ;
|
||||||
|
C 67 ; WX 600 ; N C ; B 74 -18 675 580 ;
|
||||||
|
C 68 ; WX 600 ; N D ; B 30 0 664 562 ;
|
||||||
|
C 69 ; WX 600 ; N E ; B 25 0 670 562 ;
|
||||||
|
C 70 ; WX 600 ; N F ; B 39 0 684 562 ;
|
||||||
|
C 71 ; WX 600 ; N G ; B 74 -18 675 580 ;
|
||||||
|
C 72 ; WX 600 ; N H ; B 20 0 700 562 ;
|
||||||
|
C 73 ; WX 600 ; N I ; B 77 0 643 562 ;
|
||||||
|
C 74 ; WX 600 ; N J ; B 58 -18 721 562 ;
|
||||||
|
C 75 ; WX 600 ; N K ; B 21 0 692 562 ;
|
||||||
|
C 76 ; WX 600 ; N L ; B 39 0 636 562 ;
|
||||||
|
C 77 ; WX 600 ; N M ; B -2 0 722 562 ;
|
||||||
|
C 78 ; WX 600 ; N N ; B 8 -12 730 562 ;
|
||||||
|
C 79 ; WX 600 ; N O ; B 74 -18 645 580 ;
|
||||||
|
C 80 ; WX 600 ; N P ; B 48 0 643 562 ;
|
||||||
|
C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ;
|
||||||
|
C 82 ; WX 600 ; N R ; B 24 0 617 562 ;
|
||||||
|
C 83 ; WX 600 ; N S ; B 54 -22 673 582 ;
|
||||||
|
C 84 ; WX 600 ; N T ; B 86 0 679 562 ;
|
||||||
|
C 85 ; WX 600 ; N U ; B 101 -18 716 562 ;
|
||||||
|
C 86 ; WX 600 ; N V ; B 84 0 733 562 ;
|
||||||
|
C 87 ; WX 600 ; N W ; B 79 0 738 562 ;
|
||||||
|
C 88 ; WX 600 ; N X ; B 12 0 690 562 ;
|
||||||
|
C 89 ; WX 600 ; N Y ; B 109 0 709 562 ;
|
||||||
|
C 90 ; WX 600 ; N Z ; B 62 0 637 562 ;
|
||||||
|
C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;
|
||||||
|
C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ;
|
||||||
|
C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;
|
||||||
|
C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ;
|
||||||
|
C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ;
|
||||||
|
C 145 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;
|
||||||
|
C 97 ; WX 600 ; N a ; B 61 -15 593 454 ;
|
||||||
|
C 98 ; WX 600 ; N b ; B 13 -15 636 626 ;
|
||||||
|
C 99 ; WX 600 ; N c ; B 81 -15 631 459 ;
|
||||||
|
C 100 ; WX 600 ; N d ; B 60 -15 645 626 ;
|
||||||
|
C 101 ; WX 600 ; N e ; B 81 -15 605 454 ;
|
||||||
|
C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;
|
||||||
|
C 103 ; WX 600 ; N g ; B 40 -146 674 454 ;
|
||||||
|
C 104 ; WX 600 ; N h ; B 18 0 615 626 ;
|
||||||
|
C 105 ; WX 600 ; N i ; B 77 0 546 658 ;
|
||||||
|
C 106 ; WX 600 ; N j ; B 36 -146 580 658 ;
|
||||||
|
C 107 ; WX 600 ; N k ; B 33 0 643 626 ;
|
||||||
|
C 108 ; WX 600 ; N l ; B 77 0 546 626 ;
|
||||||
|
C 109 ; WX 600 ; N m ; B -22 0 649 454 ;
|
||||||
|
C 110 ; WX 600 ; N n ; B 18 0 615 454 ;
|
||||||
|
C 111 ; WX 600 ; N o ; B 71 -15 622 454 ;
|
||||||
|
C 112 ; WX 600 ; N p ; B -32 -142 622 454 ;
|
||||||
|
C 113 ; WX 600 ; N q ; B 60 -142 685 454 ;
|
||||||
|
C 114 ; WX 600 ; N r ; B 47 0 655 454 ;
|
||||||
|
C 115 ; WX 600 ; N s ; B 66 -17 608 459 ;
|
||||||
|
C 116 ; WX 600 ; N t ; B 118 -15 567 562 ;
|
||||||
|
C 117 ; WX 600 ; N u ; B 70 -15 592 439 ;
|
||||||
|
C 118 ; WX 600 ; N v ; B 70 0 695 439 ;
|
||||||
|
C 119 ; WX 600 ; N w ; B 53 0 712 439 ;
|
||||||
|
C 120 ; WX 600 ; N x ; B 6 0 671 439 ;
|
||||||
|
C 121 ; WX 600 ; N y ; B -21 -142 695 439 ;
|
||||||
|
C 122 ; WX 600 ; N z ; B 81 0 614 439 ;
|
||||||
|
C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ;
|
||||||
|
C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ;
|
||||||
|
C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;
|
||||||
|
C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ;
|
||||||
|
C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ;
|
||||||
|
C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ;
|
||||||
|
C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ;
|
||||||
|
C -1 ; WX 600 ; N fraction ; B 22 -60 708 661 ;
|
||||||
|
C 165 ; WX 600 ; N yen ; B 98 0 710 562 ;
|
||||||
|
C 131 ; WX 600 ; N florin ; B -57 -131 702 616 ;
|
||||||
|
C 167 ; WX 600 ; N section ; B 74 -70 620 580 ;
|
||||||
|
C 164 ; WX 600 ; N currency ; B 77 49 644 517 ;
|
||||||
|
C 39 ; WX 600 ; N quotesingle ; B 303 277 493 562 ;
|
||||||
|
C 147 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;
|
||||||
|
C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ;
|
||||||
|
C 139 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ;
|
||||||
|
C 155 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ;
|
||||||
|
C -1 ; WX 600 ; N fi ; B 12 0 644 626 ;
|
||||||
|
C -1 ; WX 600 ; N fl ; B 12 0 644 626 ;
|
||||||
|
C 150 ; WX 600 ; N endash ; B 108 203 602 313 ;
|
||||||
|
C 134 ; WX 600 ; N dagger ; B 175 -70 586 580 ;
|
||||||
|
C 135 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ;
|
||||||
|
C 183 ; WX 600 ; N periodcentered ; B 248 165 461 351 ;
|
||||||
|
C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ;
|
||||||
|
C 149 ; WX 600 ; N bullet ; B 196 132 523 430 ;
|
||||||
|
C 130 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ;
|
||||||
|
C 132 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ;
|
||||||
|
C 148 ; WX 600 ; N quotedblright ; B 119 277 645 562 ;
|
||||||
|
C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ;
|
||||||
|
C 133 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ;
|
||||||
|
C 137 ; WX 600 ; N perthousand ; B -45 -15 743 616 ;
|
||||||
|
C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ;
|
||||||
|
C 96 ; WX 600 ; N grave ; B 272 508 503 661 ;
|
||||||
|
C 180 ; WX 600 ; N acute ; B 312 508 609 661 ;
|
||||||
|
C 136 ; WX 600 ; N circumflex ; B 212 483 607 657 ;
|
||||||
|
C 152 ; WX 600 ; N tilde ; B 199 493 643 636 ;
|
||||||
|
C 175 ; WX 600 ; N macron ; B 195 505 637 585 ;
|
||||||
|
C -1 ; WX 600 ; N breve ; B 217 468 652 631 ;
|
||||||
|
C -1 ; WX 600 ; N dotaccent ; B 348 498 493 638 ;
|
||||||
|
C 168 ; WX 600 ; N dieresis ; B 246 498 595 638 ;
|
||||||
|
C -1 ; WX 600 ; N ring ; B 319 481 528 678 ;
|
||||||
|
C 184 ; WX 600 ; N cedilla ; B 168 -206 368 0 ;
|
||||||
|
C -1 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ;
|
||||||
|
C -1 ; WX 600 ; N ogonek ; B 143 -199 367 0 ;
|
||||||
|
C -1 ; WX 600 ; N caron ; B 238 493 633 667 ;
|
||||||
|
C 151 ; WX 600 ; N emdash ; B 33 203 677 313 ;
|
||||||
|
C 198 ; WX 600 ; N AE ; B -29 0 708 562 ;
|
||||||
|
C 170 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ;
|
||||||
|
C -1 ; WX 600 ; N Lslash ; B 39 0 636 562 ;
|
||||||
|
C 216 ; WX 600 ; N Oslash ; B 48 -22 673 584 ;
|
||||||
|
C 140 ; WX 600 ; N OE ; B 26 0 701 562 ;
|
||||||
|
C 186 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ;
|
||||||
|
C 230 ; WX 600 ; N ae ; B 21 -15 652 454 ;
|
||||||
|
C -1 ; WX 600 ; N dotlessi ; B 77 0 546 439 ;
|
||||||
|
C -1 ; WX 600 ; N lslash ; B 77 0 587 626 ;
|
||||||
|
C 248 ; WX 600 ; N oslash ; B 54 -24 638 463 ;
|
||||||
|
C 156 ; WX 600 ; N oe ; B 18 -15 662 454 ;
|
||||||
|
C 223 ; WX 600 ; N germandbls ; B 22 -15 629 626 ;
|
||||||
|
C 207 ; WX 600 ; N Idieresis ; B 77 0 643 761 ;
|
||||||
|
C 233 ; WX 600 ; N eacute ; B 81 -15 609 661 ;
|
||||||
|
C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ;
|
||||||
|
C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ;
|
||||||
|
C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ;
|
||||||
|
C 159 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ;
|
||||||
|
C 247 ; WX 600 ; N divide ; B 114 16 596 500 ;
|
||||||
|
C 221 ; WX 600 ; N Yacute ; B 109 0 709 784 ;
|
||||||
|
C 194 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ;
|
||||||
|
C 225 ; WX 600 ; N aacute ; B 61 -15 609 661 ;
|
||||||
|
C 219 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ;
|
||||||
|
C 253 ; WX 600 ; N yacute ; B -21 -142 695 661 ;
|
||||||
|
C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ;
|
||||||
|
C 234 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ;
|
||||||
|
C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ;
|
||||||
|
C 220 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ;
|
||||||
|
C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ;
|
||||||
|
C 218 ; WX 600 ; N Uacute ; B 101 -18 716 784 ;
|
||||||
|
C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ;
|
||||||
|
C 203 ; WX 600 ; N Edieresis ; B 25 0 670 761 ;
|
||||||
|
C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ;
|
||||||
|
C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ;
|
||||||
|
C 169 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
|
||||||
|
C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ;
|
||||||
|
C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ;
|
||||||
|
C 229 ; WX 600 ; N aring ; B 61 -15 593 678 ;
|
||||||
|
C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ;
|
||||||
|
C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ;
|
||||||
|
C 224 ; WX 600 ; N agrave ; B 61 -15 593 661 ;
|
||||||
|
C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ;
|
||||||
|
C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ;
|
||||||
|
C 227 ; WX 600 ; N atilde ; B 61 -15 643 636 ;
|
||||||
|
C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ;
|
||||||
|
C 154 ; WX 600 ; N scaron ; B 66 -17 633 667 ;
|
||||||
|
C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ;
|
||||||
|
C 237 ; WX 600 ; N iacute ; B 77 0 609 661 ;
|
||||||
|
C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ;
|
||||||
|
C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ;
|
||||||
|
C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ;
|
||||||
|
C 251 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ;
|
||||||
|
C 226 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ;
|
||||||
|
C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ;
|
||||||
|
C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ;
|
||||||
|
C 231 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;
|
||||||
|
C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ;
|
||||||
|
C 222 ; WX 600 ; N Thorn ; B 48 0 620 562 ;
|
||||||
|
C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ;
|
||||||
|
C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ;
|
||||||
|
C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ;
|
||||||
|
C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ;
|
||||||
|
C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ;
|
||||||
|
C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ;
|
||||||
|
C 179 ; WX 600 ; N threesuperior ; B 193 222 526 616 ;
|
||||||
|
C 210 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;
|
||||||
|
C 192 ; WX 600 ; N Agrave ; B -9 0 632 784 ;
|
||||||
|
C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ;
|
||||||
|
C 215 ; WX 600 ; N multiply ; B 104 39 606 478 ;
|
||||||
|
C 250 ; WX 600 ; N uacute ; B 70 -15 599 661 ;
|
||||||
|
C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ;
|
||||||
|
C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ;
|
||||||
|
C 255 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ;
|
||||||
|
C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ;
|
||||||
|
C 238 ; WX 600 ; N icircumflex ; B 77 0 577 657 ;
|
||||||
|
C 202 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ;
|
||||||
|
C 228 ; WX 600 ; N adieresis ; B 61 -15 595 638 ;
|
||||||
|
C 235 ; WX 600 ; N edieresis ; B 81 -15 605 638 ;
|
||||||
|
C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ;
|
||||||
|
C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ;
|
||||||
|
C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ;
|
||||||
|
C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ;
|
||||||
|
C 205 ; WX 600 ; N Iacute ; B 77 0 643 784 ;
|
||||||
|
C 177 ; WX 600 ; N plusminus ; B 76 24 614 515 ;
|
||||||
|
C 166 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ;
|
||||||
|
C 174 ; WX 600 ; N registered ; B 53 -18 667 580 ;
|
||||||
|
C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ;
|
||||||
|
C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ;
|
||||||
|
C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ;
|
||||||
|
C 200 ; WX 600 ; N Egrave ; B 25 0 670 784 ;
|
||||||
|
C -1 ; WX 600 ; N racute ; B 47 0 655 661 ;
|
||||||
|
C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ;
|
||||||
|
C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ;
|
||||||
|
C 142 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;
|
||||||
|
C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ;
|
||||||
|
C 208 ; WX 600 ; N Eth ; B 30 0 664 562 ;
|
||||||
|
C 199 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ;
|
||||||
|
C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ;
|
||||||
|
C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ;
|
||||||
|
C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ;
|
||||||
|
C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ;
|
||||||
|
C 193 ; WX 600 ; N Aacute ; B -9 0 655 784 ;
|
||||||
|
C 196 ; WX 600 ; N Adieresis ; B -9 0 632 761 ;
|
||||||
|
C 232 ; WX 600 ; N egrave ; B 81 -15 605 661 ;
|
||||||
|
C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ;
|
||||||
|
C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ;
|
||||||
|
C 211 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;
|
||||||
|
C 243 ; WX 600 ; N oacute ; B 71 -15 649 661 ;
|
||||||
|
C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ;
|
||||||
|
C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ;
|
||||||
|
C 239 ; WX 600 ; N idieresis ; B 77 0 561 618 ;
|
||||||
|
C 212 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;
|
||||||
|
C 217 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ;
|
||||||
|
C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
|
||||||
|
C 254 ; WX 600 ; N thorn ; B -32 -142 622 626 ;
|
||||||
|
C 178 ; WX 600 ; N twosuperior ; B 191 230 542 616 ;
|
||||||
|
C 214 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ;
|
||||||
|
C 181 ; WX 600 ; N mu ; B 49 -142 592 439 ;
|
||||||
|
C 236 ; WX 600 ; N igrave ; B 77 0 546 661 ;
|
||||||
|
C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ;
|
||||||
|
C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ;
|
||||||
|
C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ;
|
||||||
|
C 190 ; WX 600 ; N threequarters ; B 8 -60 699 661 ;
|
||||||
|
C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ;
|
||||||
|
C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ;
|
||||||
|
C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ;
|
||||||
|
C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ;
|
||||||
|
C 153 ; WX 600 ; N trademark ; B 86 230 869 562 ;
|
||||||
|
C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ;
|
||||||
|
C 204 ; WX 600 ; N Igrave ; B 77 0 643 784 ;
|
||||||
|
C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ;
|
||||||
|
C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ;
|
||||||
|
C 189 ; WX 600 ; N onehalf ; B 22 -60 716 661 ;
|
||||||
|
C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ;
|
||||||
|
C 244 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;
|
||||||
|
C 241 ; WX 600 ; N ntilde ; B 18 0 643 636 ;
|
||||||
|
C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ;
|
||||||
|
C 201 ; WX 600 ; N Eacute ; B 25 0 670 784 ;
|
||||||
|
C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ;
|
||||||
|
C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ;
|
||||||
|
C 188 ; WX 600 ; N onequarter ; B 13 -60 707 661 ;
|
||||||
|
C 138 ; WX 600 ; N Scaron ; B 54 -22 689 790 ;
|
||||||
|
C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ;
|
||||||
|
C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ;
|
||||||
|
C 176 ; WX 600 ; N degree ; B 173 243 570 616 ;
|
||||||
|
C 242 ; WX 600 ; N ograve ; B 71 -15 622 661 ;
|
||||||
|
C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ;
|
||||||
|
C 249 ; WX 600 ; N ugrave ; B 70 -15 592 661 ;
|
||||||
|
C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ;
|
||||||
|
C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ;
|
||||||
|
C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ;
|
||||||
|
C 209 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ;
|
||||||
|
C 245 ; WX 600 ; N otilde ; B 71 -15 643 636 ;
|
||||||
|
C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ;
|
||||||
|
C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ;
|
||||||
|
C 195 ; WX 600 ; N Atilde ; B -9 0 669 759 ;
|
||||||
|
C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ;
|
||||||
|
C 197 ; WX 600 ; N Aring ; B -9 0 632 801 ;
|
||||||
|
C 213 ; WX 600 ; N Otilde ; B 74 -18 669 759 ;
|
||||||
|
C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ;
|
||||||
|
C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ;
|
||||||
|
C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ;
|
||||||
|
C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ;
|
||||||
|
C -1 ; WX 600 ; N minus ; B 114 203 596 313 ;
|
||||||
|
C 206 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ;
|
||||||
|
C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ;
|
||||||
|
C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ;
|
||||||
|
C 172 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;
|
||||||
|
C 246 ; WX 600 ; N odieresis ; B 71 -15 622 638 ;
|
||||||
|
C 252 ; WX 600 ; N udieresis ; B 70 -15 595 638 ;
|
||||||
|
C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ;
|
||||||
|
C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ;
|
||||||
|
C 240 ; WX 600 ; N eth ; B 93 -27 661 626 ;
|
||||||
|
C 158 ; WX 600 ; N zcaron ; B 81 0 643 667 ;
|
||||||
|
C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ;
|
||||||
|
C 185 ; WX 600 ; N onesuperior ; B 212 230 514 616 ;
|
||||||
|
C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ;
|
||||||
|
C 128 ; WX 600 ; N Euro ; B 0 0 0 0 ;
|
||||||
|
EndCharMetrics
|
||||||
|
EndFontMetrics
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user