├── LICENSE ├── cert ├── EET_CA1_Playground-CZ00000019.key ├── EET_CA1_Playground-CZ00000019.pub ├── EET_CA1_Playground-CZ1212121218.key ├── EET_CA1_Playground-CZ1212121218.pub ├── EET_CA1_Playground-CZ683555118.key ├── EET_CA1_Playground-CZ683555118.pub ├── EET_CA1_Playground-ca.crt ├── EET_CA1_Playground-ca.pub ├── EET_CA1_Playground_With_Password-CZ00000019.key ├── EET_CA1_Playground_With_Password-CZ1212121218.key └── EET_CA1_Playground_With_Password-CZ683555118.key ├── codecov.yml ├── composer.json ├── readme.md ├── src ├── Client.php ├── Configuration.php ├── Cryptography │ ├── CryptographyService.php │ ├── InvalidPublicKeyException.php │ ├── PrivateKeyFileException.php │ ├── PrivateKeyFileNotFoundException.php │ ├── PublicKeyFileException.php │ ├── PublicKeyFileNotFoundException.php │ └── SigningFailedException.php ├── Driver │ ├── DriverRequestFailedException.php │ ├── GuzzleSoapClientDriver.php │ └── SoapClientDriver.php ├── EvidenceEnvironment.php ├── EvidenceMode.php ├── EvidenceRequest.php ├── EvidenceResponse.php ├── FailedRequestException.php ├── Formatter.php ├── InvalidResponseReceivedException.php ├── InvalidResponseWithoutFikException.php ├── Receipt.php └── SoapClient.php └── wsdl ├── EETServiceSOAP_playground.wsdl ├── EETServiceSOAP_production.wsdl └── EETXMLSchema.xsd /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Slevomat.cz, s.r.o. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-CZ00000019.key: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 83 32 3F 5D 24 6C 68 2A F4 AD 02 64 20 F6 10 8E BC 91 D4 43 3 | Key Attributes: 4 | -----BEGIN PRIVATE KEY----- 5 | MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDrVmZ6FE2jYqli 6 | 43/LbXZ1vEG8USMRcC/zbGgk5mAoQQKMtF5PIm5i84pd0cPOSRtduNODc7mwjbPK 7 | d5r8p592zNhpei0/XbQcYQ5rpdf0Y84ZNbg9ZmB4nF8YCBy3Gk28YxfW//vIjqvk 8 | uQK6InT4l784gtz/iNAV48ZBkgE/jp+MMii1I+y5EyYkQuRZlCJtOTKdPXECnr5O 9 | rxrGUtbjmF7bBWLD2LXlspZoUOmh4RFfd9WHH8PmcQfij5aJq6cgIB2YENCBHSA1 10 | /HZZEd8vNLv05owb/BOvXj4n86lYJ8tlJVMcorAsrEzVy+XU++78/j9PewL0ft0j 11 | ETHd0U8DAgMBAAECggEBAIqz154oDUI4yiCweQeKsoDdvdih8Ys7ledgg1kMNqxC 12 | 9J+9RsBZSLolU+3Lzh3s1KY+Yttc/5phShAQwlYa7U91mC9ChRyNu7PmODuV+Vve 13 | 3v/Yu4fkqQMtFpbxYQtCA4L+3HQpV1pzTDh4GnVeDZbeySMjbeFl306nepf216l+ 14 | 4o2t260RCgC9NU6kybrgrL9mpa2v+0XNugKzjwy3Lv5KUhtTanQm7fOztb8DxvqP 15 | h/j8j504d3SCWTzeGwYWw2lwDZx0wAP0b0fB8oiO9JzHBc+t/R18vS6LaslDmvLi 16 | DM8R0ivySdSJKD5f5CAWlMTkcKkbFblnUhw7KTCH77ECgYEA9+TUwiPf4aZiIzMW 17 | I2Y7AdkF9uwmTzaXZYN+MQycShwfmpOscY+6EL2f2majCGcNEduPB3ZLSgkk1oga 18 | g4Q2VKDyTSMT70FyRGCm/hIHxtWm2KWpUcJ0LKwV3C+XS+v3dI9cEuFeiC2Dv67Y 19 | GLqAnqPUS4Pv8Ed3nLN4zZdONWUCgYEA8wh1FDS9KczhgyzPU+a59blVER0LP7c2 20 | ErXCk815qCsM3aNy1NBFfuyLuChf6XxRvArRibI9TtFlSWq9PKsSWRwgILpS8YxO 21 | g5QA5iJdh5O1L6EGnFmLiw1aUlMJsKmsc2f5klLAacA6ljIFB6A1voeume1Ryozq 22 | wYhO2uLWgEcCgYBBt5pntVb+3TsbFcoCrHFsNfqM0WH+kfxk3w0vN6afRwFh21BV 23 | 8sJi+cJNBfSmn5spZsluMwAWqoHnlcFhqEU2/kv+AxSf0vvWAMGEjYceQTmwKYrP 24 | r/tYdG5/Jua3K+E4N2EzaCfFdjt9L37+X0MFy2zWcC3Fx0yAcFvQNRJ4uQKBgHAC 25 | nNtUNz7Vs7YeZ+vWciyjX2aEyVNzYFOdO/GdCQ4N0V8xXtJgrzcBVJ/q09Grv4v4 26 | PHzHDmSOM61zqYYVnl49jT0oQuQa83DHPObUPeEnnaE3CPH0f1D2NYOty9CFUvrZ 27 | l/ftdcsHkrj4ksLh/wMyS7Gb5E+DRQsvhJBzbcMvAoGBAODcoE5dkDH6jPYOkwC5 28 | 9cp6olFNc8Mp5+XF3mAMkpiB16lPM/SdolAmuTl+cDF5QJoCAJOMkRAOWJqpPZkw 29 | kG2TVi0t2EQa5xCBbsadl82uKB50+BbViRkaHQUinFDKLZWlUQdjgLT7U1PXza4W 30 | A6ns1H9hLvnZpCRasR6oMVqf 31 | -----END PRIVATE KEY----- 32 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-CZ00000019.pub: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 83 32 3F 5D 24 6C 68 2A F4 AD 02 64 20 F6 10 8E BC 91 D4 43 3 | subject=DC = CZ, CN = CZ00000019, description = pravnicka osoba 4 | 5 | issuer=DC = CZ, O = \C4\8Cesk\C3\A1 Republika \E2\80\93 Gener\C3\A1ln\C3\AD finan\C4\8Dn\C3\AD \C5\99editelstv\C3\AD, CN = EET CA 1 Playground 6 | 7 | -----BEGIN CERTIFICATE----- 8 | MIIEmTCCA4GgAwIBAgIFAKCnuv0wDQYJKoZIhvcNAQELBQAwdzESMBAGCgmSJomT 9 | 8ixkARkWAkNaMUMwQQYDVQQKDDrEjGVza8OhIFJlcHVibGlrYSDigJMgR2VuZXLD 10 | oWxuw60gZmluYW7EjW7DrSDFmWVkaXRlbHN0dsOtMRwwGgYDVQQDExNFRVQgQ0Eg 11 | MSBQbGF5Z3JvdW5kMB4XDTE5MDgwODE5MjM0MloXDTIyMDgwODE5MjM0MlowQzES 12 | MBAGCgmSJomT8ixkARkWAkNaMRMwEQYDVQQDEwpDWjAwMDAwMDE5MRgwFgYDVQQN 13 | Ew9wcmF2bmlja2Egb3NvYmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB 14 | AQDrVmZ6FE2jYqli43/LbXZ1vEG8USMRcC/zbGgk5mAoQQKMtF5PIm5i84pd0cPO 15 | SRtduNODc7mwjbPKd5r8p592zNhpei0/XbQcYQ5rpdf0Y84ZNbg9ZmB4nF8YCBy3 16 | Gk28YxfW//vIjqvkuQK6InT4l784gtz/iNAV48ZBkgE/jp+MMii1I+y5EyYkQuRZ 17 | lCJtOTKdPXECnr5OrxrGUtbjmF7bBWLD2LXlspZoUOmh4RFfd9WHH8PmcQfij5aJ 18 | q6cgIB2YENCBHSA1/HZZEd8vNLv05owb/BOvXj4n86lYJ8tlJVMcorAsrEzVy+XU 19 | ++78/j9PewL0ft0jETHd0U8DAgMBAAGjggFeMIIBWjAJBgNVHRMEAjAAMB0GA1Ud 20 | DgQWBBT8zaUMxlfEGXSD/2PZ089ZLGgerTAfBgNVHSMEGDAWgBR8MHaszNaH0ezJ 21 | H+JwCCzjX94MBzAOBgNVHQ8BAf8EBAMCBsAwYwYDVR0gBFwwWjBYBgpghkgBZQMC 22 | ATABMEowSAYIKwYBBQUHAgIwPAw6VGVudG8gY2VydGlmaWvDoXQgYnlsIHZ5ZMOh 23 | biBwb3V6ZSBwcm8gdGVzdG92YWPDrSDDusSNZWx5LjCBlwYDVR0fBIGPMIGMMIGJ 24 | oIGGoIGDhilodHRwOi8vY3JsLmNhMS1wZy5lZXQuY3ovZWV0Y2ExcGcvYWxsLmNy 25 | bIYqaHR0cDovL2NybDIuY2ExLXBnLmVldC5jei9lZXRjYTFwZy9hbGwuY3Jshipo 26 | dHRwOi8vY3JsMy5jYTEtcGcuZWV0LmN6L2VldGNhMXBnL2FsbC5jcmwwDQYJKoZI 27 | hvcNAQELBQADggEBAKVFyv168b/q0X568G+JDvNnz4XVElbJ1r9ro/xv58QP+FD8 28 | PJSR5qxN2F7zKGNYTCee0jSo+XY1KEoSkmeoYHXnQpm7+NG7iUYc2OWu0B3hC/wM 29 | MhNEDtmsTwqSLjgSk6pZTTRXfvtaHf7zvU8iw1PGFhb9m9bJlOfLwoMeFclOpdfo 30 | 80pbwRz5t8io/c0lvGodlYj7INHxjlwdwWf3m2mUx4iuKvoAev0ASCdSMDuUWWjY 31 | iMT3PEUqeabeM2dn3xccQ2EhgIcCwhQs2MCA/FDLBbiOt63mUJPJHATIFi/31VKt 32 | z11/Gc434HHsVYB8U/aammSyIfMp6bNE6LhaFe8= 33 | -----END CERTIFICATE----- 34 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-CZ1212121218.key: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 6C 7D E1 C6 8E B4 23 B9 17 7B 69 97 D1 5A 7C 75 54 B6 2E B9 3 | Key Attributes: 4 | -----BEGIN PRIVATE KEY----- 5 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDHnDe1+rIGKqtA 6 | ThKXUC2XT2Ws1P7THAaNZIKHuRgV1u8EWswgRibSASQAwKoJVmbZO+W1NuC/W7ol 7 | 4EaaXJcgFGdRc6O7YCdzDrn9ZSUlrzd+WibgkcqbcXQBIdkXmwhe4/6AcSLxIz1o 8 | HW/H9nrYfCIpmNJqtWomkv+u3P/X9IwKt6Kad4TDLxA3dL6YSe2G5Ow1dwwjHclL 9 | TqpHHyxToEPauRMJ0e5PsH1bxZOjjsJa7AZrwtewKTWC19qZJjLpnOCDkROzSosL 10 | OO808RkUgOCA7t5PeBgk8SuvTx7L0sJm0KqIFHCHXpqKmxALXDIk+tPt93e0eWR4 11 | WIzn3GCjAgMBAAECggEAZUDdEbalb3NdgzUXQSIuvj5MOSuiR7xDpp2BiQ9fJFTu 12 | 0aqtOQHc11I0zRzuI+ZsLW2wzAeWYftJpcTqi4rELkWrUynxuC7CVB74QY15FnCX 13 | GcTpS6kouUkHqztcQBkoWdoVU1oQe3mAwLuN5EUnc4EkYy1eLzrvKboPcMgyD3zb 14 | U3P4n/GdjKzOz2sWXLd9DAcP5eBwl8k5tyyVaoZ/JN5a0pTPDwUWhUuQaO75uznZ 15 | e1fcKEhXOfwv+q8qzcdhiTJME1TbNFVLa48ZZdwLIBCP4eNzcO4I2qzu1J3lrlG7 16 | fyNbFm2x89jVpUNk3oOfJayBPUK4HxvPx5MHEqxaYQKBgQDyoZ3IemQRQqsYc3Ti 17 | R6WoJyGBwCuqg74dpRDlZ4Cv+ZqUZy+Rn3hsMBhk6dH2xlCZWbd9rEqbqOh4exOK 18 | FjX9THT6j6kZm0gzMp98AULfBaj7GnTAE+cs4xAJXTzleiFpgQqj5hUJu2JaXe+w 19 | UxXDHX9vigU/h5RhOGhNyVc47wKBgQDSm8bOymWXD7LKq0AZ3Cm5kKVqLHmBKaHi 20 | acn6SsBDZxIpqytcPPIPvDWDolje+vhy1EjmBFcgIlU0+/H7tGvTSabDoE0FRBVx 21 | UC+yjirYqNPkZU/I/8RYcmkVvcBVQV82szRf0sCH1glMqgceR8+tVTMTfUQkwXSv 22 | Mb9ndRxLjQKBgCqt0xtYrBF9MKt0Y7MJ91HE0FgKfaPY2LBOQNKZikFqHo7MN8nd 23 | y0j8jM3zc0N9TuAqr+QjUlxfMcU/oQhBL+4GbO1GJ/ChJ+oZlYQylJi2XisNVEwV 24 | NCzpJAEBrZyQByCP2ldKOZkkpQBQVcEmXEWeArSUCqhKKQeQ7IgCSp1xAoGAeO76 25 | OcP+kb9x6u5q4G6LhwKH+W+QVZqSWnBkilRiElIdG9AuFcjpNh/cmrmeTmvOPiGn 26 | umzDmrAcPVBuoxn20Fx6ZdqmX1+48FgbC2yXLdHD2mJSbhhvploL/W/4APyIr+A3 27 | Ms7Rvy4oKN15OOoDVoSVz5sehfyQBAmM3ttgZAECgYEAvSI1He5M6d9BM2yg4U8x 28 | yC/3qllMY1sGNPrjyDxL0S9qEniF9u+jGNSywgopO7piCt3MoTGZKBw/GVF2qyH8 29 | zM9QEoErbE70fRZHZ2Bj3cK4jBis6DNLVqVxWoN4qMtDQTK8GQwFl7woyYi9x0cP 30 | M9sEvHHkg3wsrFIkQZAHTQg= 31 | -----END PRIVATE KEY----- 32 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-CZ1212121218.pub: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 6C 7D E1 C6 8E B4 23 B9 17 7B 69 97 D1 5A 7C 75 54 B6 2E B9 3 | subject=DC = CZ, CN = CZ1212121218, description = fyzicka osoba 4 | 5 | issuer=DC = CZ, O = \C4\8Cesk\C3\A1 Republika \E2\80\93 Gener\C3\A1ln\C3\AD finan\C4\8Dn\C3\AD \C5\99editelstv\C3\AD, CN = EET CA 1 Playground 6 | 7 | -----BEGIN CERTIFICATE----- 8 | MIIEmDCCA4CgAwIBAgIEMZKS4zANBgkqhkiG9w0BAQsFADB3MRIwEAYKCZImiZPy 9 | LGQBGRYCQ1oxQzBBBgNVBAoMOsSMZXNrw6EgUmVwdWJsaWthIOKAkyBHZW5lcsOh 10 | bG7DrSBmaW5hbsSNbsOtIMWZZWRpdGVsc3R2w60xHDAaBgNVBAMTE0VFVCBDQSAx 11 | IFBsYXlncm91bmQwHhcNMTkwODA4MTkyNjEwWhcNMjIwODA4MTkyNjEwWjBDMRIw 12 | EAYKCZImiZPyLGQBGRYCQ1oxFTATBgNVBAMTDENaMTIxMjEyMTIxODEWMBQGA1UE 13 | DRMNZnl6aWNrYSBvc29iYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB 14 | AMecN7X6sgYqq0BOEpdQLZdPZazU/tMcBo1kgoe5GBXW7wRazCBGJtIBJADAqglW 15 | Ztk75bU24L9buiXgRppclyAUZ1Fzo7tgJ3MOuf1lJSWvN35aJuCRyptxdAEh2Reb 16 | CF7j/oBxIvEjPWgdb8f2eth8IimY0mq1aiaS/67c/9f0jAq3opp3hMMvEDd0vphJ 17 | 7Ybk7DV3DCMdyUtOqkcfLFOgQ9q5EwnR7k+wfVvFk6OOwlrsBmvC17ApNYLX2pkm 18 | Mumc4IORE7NKiws47zTxGRSA4IDu3k94GCTxK69PHsvSwmbQqogUcIdemoqbEAtc 19 | MiT60+33d7R5ZHhYjOfcYKMCAwEAAaOCAV4wggFaMAkGA1UdEwQCMAAwHQYDVR0O 20 | BBYEFAtC2mlwayQRTB5kWPygTCQ/J6TYMB8GA1UdIwQYMBaAFHwwdqzM1ofR7Mkf 21 | 4nAILONf3gwHMA4GA1UdDwEB/wQEAwIGwDBjBgNVHSAEXDBaMFgGCmCGSAFlAwIB 22 | MAEwSjBIBggrBgEFBQcCAjA8DDpUZW50byBjZXJ0aWZpa8OhdCBieWwgdnlkw6Fu 23 | IHBvdXplIHBybyB0ZXN0b3ZhY8OtIMO6xI1lbHkuMIGXBgNVHR8EgY8wgYwwgYmg 24 | gYaggYOGKWh0dHA6Ly9jcmwuY2ExLXBnLmVldC5jei9lZXRjYTFwZy9hbGwuY3Js 25 | hipodHRwOi8vY3JsMi5jYTEtcGcuZWV0LmN6L2VldGNhMXBnL2FsbC5jcmyGKmh0 26 | dHA6Ly9jcmwzLmNhMS1wZy5lZXQuY3ovZWV0Y2ExcGcvYWxsLmNybDANBgkqhkiG 27 | 9w0BAQsFAAOCAQEAeUeUKL5j8NDzg1PnnC1tPwWOfEUCTCp8d0Ba87Kz1TwBoDlg 28 | ZZDecm2dkZMlSvXjsu85tibf4XhwxRvsmgc5sLXEUlqbaUB+EqdtamweaRJhCWs2 29 | kcnckxm6GeW6vYA6mFn5EJC4+3u4LSA06EEieulnM2ny820nhbyE0/XnWOaTLY1e 30 | z6bE5aINjp315o/4zAGATt5rwrbW45UOBGA9vwLM3GzISojt6HoRe7DWNU1KLVSz 31 | XbWpT1+HDAXRCg+/UFcD10od9vAJyQ4i0t9yz8/VM3NGatD5W94QFuN1DVVm5m0U 32 | o2kdHuIZEAbmnk9KaIFBg8ModEWGyd5VGdoQaw== 33 | -----END CERTIFICATE----- 34 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-CZ683555118.key: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 9D 80 36 8A 6B DF 03 45 13 74 F7 E7 42 68 6B 95 DF 07 68 72 3 | Key Attributes: 4 | -----BEGIN PRIVATE KEY----- 5 | MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCInVe1r3NDkoNv 6 | VmTLctn+uq60Gc6fTG0EYB4J8NdNh192Jep0hzYyc87hY9q8/knS9tXyzyXYk2aC 7 | EReojleFGsHjhRZxYG8kUlsVjTcudia45p954kwyaz6L+9703kKTPMQX7sRnnYo3 8 | uAWxXJa46+a7XjI7FMkd88GMObtcgnlhS6xjNNYa1edgV2ChBcOFN9cZjMeFWdLw 9 | NUMNopbO3ZIvcfybedv9bKJhdD/nI4+2mpGyJrlko3E2uNlEoMOCg8+fjHLf6rKH 10 | mjK+WGO4l8JRGZkUFmdfhCvH6lPF1xyR8Kn1IBZYRQzBOK1aCq8MBuFG8uF+U/4e 11 | XAvKWMsNAgMBAAECggEANfd564K4lMvu8e9998SSCwdx9iFvtwv40M6rbx/d3XmJ 12 | o2GNAaVcKogHBJBum1QUk6sAj193QtvPlbfs0aARQLp2N0uetwDyRrXl11imoMr5 13 | tvcbrolPsmcdGS1RQQf/4qwRhqbCnW/lZudiEFNUEw7VYdTvINmwLQ3aumsf8YXh 14 | YVWgNz/hGPx3WAKVuqQj6p0+10KEZPinxu/HWJPDHu09ZYeO+IGXsA3A7Ve9IL9o 15 | +WwXHN6LBo8NZQT21Qaw+UfTOm3e0ANGc85DqvWVSy3k4PmhnIRDp4iakiY4p6n6 16 | 9c9ws8FPDj5+fmiwDeexsiH89HmKQ2e6JZUn04p84QKBgQDAB3lw/q3oUjHXV/rp 17 | wGTtQkwNiXG/bkyY08Lr1Gx1OdjRUQdTw8KK89Ej2bJ5h4nfWa8EcD1E55tEN5UC 18 | oD91ea6yrBJx80Qr8UNKRUQXEG+A3blGhzEW0wrzAb77KDndDH05MLSkbeJBRt/h 19 | f7SSQlhH2mxdaDZWWixzzQuYWQKBgQC2IAiVOtElw11jHrMg7O5B44vObElQBeol 20 | QrWKDlqr9ACvorsbOwyP8OHSDnCYu9qAArAoLc/xrx2iTTmTFbmtW9FSINLbrRPJ 21 | oS4Qf7Y/p/AW0r6aLiWJtJuczCJR7CGqwLpOLQJGLwkSAzrR8DExd1MuMyNq1QBC 22 | +yR5opox1QKBgCYmVf4Y2rv4+GXr2LFvw51POoTF9Y8ufpEuIN9xSErRvz12d5ow 23 | ngm0/qu8qDR0tPNmgdrD4ag6yyH2WOg4peLU1dwxS0jQJ48DU3cB49EhNsXHRvO4 24 | EAyUyOwWQLbs+vHrdUVTY8/29Kg7SGcoU9tqytcbkcPM3F6zc3leFxuhAoGALdVf 25 | 85ZKvjMtVF2MfPPDfidyrq9Hv/DNHTVtlGHKZc3RQmI0rkStA6h+XCuwIG/eLCsB 26 | BAuLcmo8jfTbUW29PaiGxCFoj0o+WZbLjfFl/x0Xadb9irWkUsR2CP7CgFVpn5xD 27 | BpuDIACEStkvO1g0ORurfkv2VNNn7nNfmZDXN0UCgYEAsaLeVmpRZHLfCFdILhiT 28 | PVBARs4nTkSdqlFjTPyxhqaNwAAOM083ZoxKuK78wXBiVD7tC1mYdE6/m69WIFTo 29 | p5873JlRuBxpOEZ+/T43yo4+mjDEUcME0lfFYo29Q2JoQTZODwRzMmhAcAqKsHjd 30 | Rrc0g3fAgS3ytI0jybLInGM= 31 | -----END PRIVATE KEY----- 32 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-CZ683555118.pub: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 9D 80 36 8A 6B DF 03 45 13 74 F7 E7 42 68 6B 95 DF 07 68 72 3 | subject=DC = CZ, CN = CZ683555118, description = cislo platce 4 | 5 | issuer=DC = CZ, O = \C4\8Cesk\C3\A1 Republika \E2\80\93 Gener\C3\A1ln\C3\AD finan\C4\8Dn\C3\AD \C5\99editelstv\C3\AD, CN = EET CA 1 Playground 6 | 7 | -----BEGIN CERTIFICATE----- 8 | MIIEljCCA36gAwIBAgIEO3d2yTANBgkqhkiG9w0BAQsFADB3MRIwEAYKCZImiZPy 9 | LGQBGRYCQ1oxQzBBBgNVBAoMOsSMZXNrw6EgUmVwdWJsaWthIOKAkyBHZW5lcsOh 10 | bG7DrSBmaW5hbsSNbsOtIMWZZWRpdGVsc3R2w60xHDAaBgNVBAMTE0VFVCBDQSAx 11 | IFBsYXlncm91bmQwHhcNMTkwODA4MTkyNTE4WhcNMjIwODA4MTkyNTE4WjBBMRIw 12 | EAYKCZImiZPyLGQBGRYCQ1oxFDASBgNVBAMTC0NaNjgzNTU1MTE4MRUwEwYDVQQN 13 | EwxjaXNsbyBwbGF0Y2UwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCI 14 | nVe1r3NDkoNvVmTLctn+uq60Gc6fTG0EYB4J8NdNh192Jep0hzYyc87hY9q8/knS 15 | 9tXyzyXYk2aCEReojleFGsHjhRZxYG8kUlsVjTcudia45p954kwyaz6L+9703kKT 16 | PMQX7sRnnYo3uAWxXJa46+a7XjI7FMkd88GMObtcgnlhS6xjNNYa1edgV2ChBcOF 17 | N9cZjMeFWdLwNUMNopbO3ZIvcfybedv9bKJhdD/nI4+2mpGyJrlko3E2uNlEoMOC 18 | g8+fjHLf6rKHmjK+WGO4l8JRGZkUFmdfhCvH6lPF1xyR8Kn1IBZYRQzBOK1aCq8M 19 | BuFG8uF+U/4eXAvKWMsNAgMBAAGjggFeMIIBWjAJBgNVHRMEAjAAMB0GA1UdDgQW 20 | BBQy13ecdxpE4MDCW8H7iz8Id+iPdjAfBgNVHSMEGDAWgBR8MHaszNaH0ezJH+Jw 21 | CCzjX94MBzAOBgNVHQ8BAf8EBAMCBsAwYwYDVR0gBFwwWjBYBgpghkgBZQMCATAB 22 | MEowSAYIKwYBBQUHAgIwPAw6VGVudG8gY2VydGlmaWvDoXQgYnlsIHZ5ZMOhbiBw 23 | b3V6ZSBwcm8gdGVzdG92YWPDrSDDusSNZWx5LjCBlwYDVR0fBIGPMIGMMIGJoIGG 24 | oIGDhilodHRwOi8vY3JsLmNhMS1wZy5lZXQuY3ovZWV0Y2ExcGcvYWxsLmNybIYq 25 | aHR0cDovL2NybDIuY2ExLXBnLmVldC5jei9lZXRjYTFwZy9hbGwuY3JshipodHRw 26 | Oi8vY3JsMy5jYTEtcGcuZWV0LmN6L2VldGNhMXBnL2FsbC5jcmwwDQYJKoZIhvcN 27 | AQELBQADggEBAJqMAjTujbyYfaOg17Z3m+PC3ksRlow/dClmNFMdALOvoNzhHW4k 28 | zviLrTacwUKYzLvqLtrLGqZXdJNk8tSoCmXxbsRSCUKq3N0HB6A/0pN4YuvFxtLD 29 | ss9FvMs9uZXmXl1VSE43vDb5a8hRBN4BNF+tSnmOXZBLtI22XsgobvKJNuX+nw9w 30 | 0izLBw67MsqNoSOLTncAFhkuWlJd9B7jaRgBBTp5SilqEDrhjI752bJ3Xp24+Hvk 31 | a3NyFZOsqmSdmirse4lxQY+iHTq0w+fnMa/oT4lQUhqmbVAsttl4BZC+lWCBAUS5 32 | ri4CNVzA4oGHd+zSYGen/dvZz+ZnLSJSDcc= 33 | -----END CERTIFICATE----- 34 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-ca.crt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/slevomat/eet-client/cd9a49a0cba6e32263ac0010d742712a8d69323b/cert/EET_CA1_Playground-ca.crt -------------------------------------------------------------------------------- /cert/EET_CA1_Playground-ca.pub: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIIE2TCCA8GgAwIBAgIFAIPD9YUwDQYJKoZIhvcNAQELBQAwdzESMBAGCgmSJomT 3 | 8ixkARkWAkNaMUMwQQYDVQQKDDrEjGVza8OhIFJlcHVibGlrYSDigJMgR2VuZXLD 4 | oWxuw60gZmluYW7EjW7DrSDFmWVkaXRlbHN0dsOtMRwwGgYDVQQDExNFRVQgQ0Eg 5 | MSBQbGF5Z3JvdW5kMB4XDTE2MDkyOTE5NTQ0MFoXDTIyMDkyOTE5NTQ0MFowdzES 6 | MBAGCgmSJomT8ixkARkWAkNaMUMwQQYDVQQKDDrEjGVza8OhIFJlcHVibGlrYSDi 7 | gJMgR2VuZXLDoWxuw60gZmluYW7EjW7DrSDFmWVkaXRlbHN0dsOtMRwwGgYDVQQD 8 | ExNFRVQgQ0EgMSBQbGF5Z3JvdW5kMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB 9 | CgKCAQEA1IyU2zS/gm+66J9H5mL5W5071y88EF0f4X440TXuCjNvwdjvQhaQy2mw 10 | m5+hG3RnuavQnJQOoIi532XLJNTawzP23MUtChjoa0B4ngAbnSRXXsjSscJde+eP 11 | U8WKkxmxfd5BeuW4sHFh4CukI1UmwDs3cLy4BQ3ec0tYmn+HzQ+xzOgTO8EmDdr5 12 | oTsoxV0TSoiIQVaeS+p5Qohx9ZUsB6H2oyg68GCSk/otZUo8wz71LW2bWNTxvDvx 13 | R6YPpnKtQ+j9FNU9JeX76a3vEZ578DbcGrS/0iCZ4sTzrU47zBmdhn4mIJ3yAB6U 14 | 0y4dSKVd6TMqldVy5h6ep6hTQoUFdwIDAQABo4IBajCCAWYwEgYDVR0TAQH/BAgw 15 | BgEB/wIBADAgBgNVHQ4BAf8EFgQUfDB2rMzWh9HsyR/icAgs41/eDAcwDgYDVR0P 16 | AQH/BAQDAgEGMB8GA1UdIwQYMBaAFHwwdqzM1ofR7Mkf4nAILONf3gwHMGMGA1Ud 17 | IARcMFowWAYKYIZIAWUDAgEwATBKMEgGCCsGAQUFBwICMDwMOlRlbnRvIGNlcnRp 18 | Zmlrw6F0IGJ5bCB2eWTDoW4gcG91emUgcHJvIHRlc3RvdmFjw60gw7rEjWVseS4w 19 | gZcGA1UdHwSBjzCBjDCBiaCBhqCBg4YpaHR0cDovL2NybC5jYTEtcGcuZWV0LmN6 20 | L2VldGNhMXBnL2FsbC5jcmyGKmh0dHA6Ly9jcmwyLmNhMS1wZy5lZXQuY3ovZWV0 21 | Y2ExcGcvYWxsLmNybIYqaHR0cDovL2NybDMuY2ExLXBnLmVldC5jei9lZXRjYTFw 22 | Zy9hbGwuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQBHieHV+n7agbBRYYzHbWruqi1i 23 | F7dX1g8cotPPg590FfQEAhK+Nwef8/sPNeo8gT99idzyRSq60c2f1nVlca+5W7YV 24 | jUV2KrVqbE+1Ku4GT9K/ZFW6yyIOSeHBkCCjjoNJYLVBFgJMeepSoHFYsNk0pzzZ 25 | g7Amemh0kxxd4YcxcxZHe0o2tNzdcUJ6pQxgwOYI67uepsBSor30qXTneAouMqLY 26 | QHHc8v6JsMXFzrvg2tDAtQzNC3Ibsquw+Sur6ItgYMmkmOk9WfK33q7lUfXx34X5 27 | F9OTF6UdKfXkvt+NmW7ayYwd+F4+3pfFr3wvBNdrG6tm/SUZBQ41Tt4OTKWg 28 | -----END CERTIFICATE----- 29 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground_With_Password-CZ00000019.key: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 28 5D 7B 50 52 15 97 43 07 FC 4C E6 85 2D 5D BE 7B 96 AF 15 3 | Key Attributes: 4 | -----BEGIN ENCRYPTED PRIVATE KEY----- 5 | MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIP5CJWcaQufECAggA 6 | MBQGCCqGSIb3DQMHBAjTCPRUc6FuvwSCBMj27ANhljv49FgVUoLan7o4bPpPl2ps 7 | EeU/Mm3FVYcTbMZ9e1vsdocveveipcsJR22lDjwkEZam+QfFffq44qFdmtffVvzD 8 | AaDippQZYbgGJkXNwPfpPXhfL2awRo/Bbhklf0SXPILrMxt0KkDKrdAI0+In6xCA 9 | morch0h5fQXsMK4VIFVtKVEFGUWXg0LIBiLX+ZiMe748/I269tvEHV4oTpcn2gVR 10 | KIHjUVbWchGGdzCwSnyAP19QnUAB+2BlxSDCEWI6Gc+C6reyntB7LkcV9RNRp1UD 11 | 9auK/kw1tSjQ4c7IGxoC2NJlBWzYstbniROkqMTPnaUnblQZeiwE1/XB72GsETW9 12 | yi8JnfrqTl0hrHp3RtN6aZ0Nlf3QcI2ZuHZnp95AI0l82GjzZ1+ar9Bbj6+1Jmnz 13 | 4pI4JJSTtmP+/BC637CiqxrQcRo41oBALpJPf2E2nllL6VvFaxs9NGC82OdKcuLs 14 | cqTsOAzKn2xpOfCjJ33SwSnT9J+VWi9hKbSMi+k19P3vd3BcJ9GJspGLxIDkOhKg 15 | EHav02lpAqIirW3ly9ZYewnDzNTSKYGx6c1DHl9h37p1GNGU2V8Z5qFbUEedkVai 16 | R59HTt6vHfupdIg1AsN7BgclRg4ABDdEQ5BTHE5YcXy3Igipbl+i5SfjlOvMpR/u 17 | zTeyN6H4nauHpYC2eUzoveGbTibrdlOqw/n/6kgjANSXKtrP6LIb5/LANZJ2scJh 18 | YZw7drDxbN9V1HAbLJPRPb+3RjkeUW/CgWPiumkBc2MRxiiVJTOmzitXr/JrcLIn 19 | 2fKeC5rFq4ya5BWe/AFP2Iw9o7qxTo9/atad3RJatDWYUWUzXZJAq6cVM/9KsdUH 20 | 7bjkl6GXca40wwPrWgH/zD8yxM9J1cOOG3LeNwxzaviQdjw3uvRpl+we1AeitF/P 21 | dgF4zz918oi8iHkrtGInknry6JhlIE/sqdAzMFOQKYZ+AwPsA2Fi74+/E7U8MdYm 22 | yBeiAc2Mk1OO+d3U3/iEtUiaa8RokUEjpQS9pAvME/yorxz3tu5YP4BvBCiCglO8 23 | BO1MDzC/mzVqnt7mgBqBKSf2RnySWAf9nl1keWyf0lg2+hc6sXDQR4P+N9cGlVzi 24 | HhBLREPdqYmlzhVP1tvibXtIwjwjVfFIK5ssvpYTxwnmJyB3nKAHL9ymVNEH3Opb 25 | qNT+0ObU/qofRIDad1SxH5+2EXrLMXjA3EkLCDVNsCr6SctKPZqK65ppZmQmdC5N 26 | X6Ht2NbVwiuD64xNkIlcTN5Sqra4nApFbsfL48QSv4lvGdqTKLGV3bYm1vg8YJT9 27 | fet30iPaUSMY5lgZNeKm0RPiNcLSXWbAUkk0FtBEB0W7pRAZqkoh7A8lmev98X5P 28 | fI7Yt3mK1sdu0VEE7VxSmNeLWhm7KgSrQakp6xSu/FoA2Z2YOFXU4SOqPGkJ9kag 29 | qekMGL/5xJk/4IX/YSCbUXqvGYWix6uNzWutsASJ2ZpEpb5ng7aAQ9CyFqpuJrC9 30 | +dPNoMkJ2Knj/PlahYbkWcuMcTTC/DMUkyR6Zw3v2SECycFxL+TCWdcaXF7tLhEL 31 | UkC6Pwv4JHGTDNcOnmw5S4BLwty8nWnmnsiwOpXPF3HH4r7ykcxQB7Z7nIuwK0+o 32 | oCA= 33 | -----END ENCRYPTED PRIVATE KEY----- 34 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground_With_Password-CZ1212121218.key: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 79 A6 E8 CF 65 CF 6E D2 D7 B5 F3 B4 9F 53 9C F5 76 BE E0 F6 3 | Key Attributes: 4 | -----BEGIN ENCRYPTED PRIVATE KEY----- 5 | MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQI+cna5vQEqS4CAggA 6 | MBQGCCqGSIb3DQMHBAhn6zAUTieVFASCBMgxici6k7G4TpmKPpWmNMiR1lkmo9qI 7 | 89yzgG51U6ILBK6YaZiO251j1pGSYzYU7p82JvCVs4GnMltVKiU6GwtfW8uqCX2U 8 | viybk6CCDKALgi7oN/zKcNNW9/G4cFd8dvfyescb4KjOWJkXGu/ViG4a7HkmOv9+ 9 | fSFC6bN8cd0cjrQ822in8JjuY00JmF5FJjW1w/iGv41SUee1xArNN92bQYSORHMc 10 | A6UmimF7yP/jymA/lBmvKqiNPw35w7hwhCQgTBPCsRj1k6FSTB8txJbZTJZo/lbf 11 | wNUFDG/EAcW+T2TzzZCkPoKZHk6dBNFzYIwhatNyYW7yZ8xE87zX1zF+gIFKZGst 12 | 6TeeVuCPtLfW3KiEChHVU+TAvv4CcTYYaPA7AtWk/4hP3zDbbEH5Rangi0ad6lJW 13 | hKFrHkq8J/A1vl+da/jBq3smryj+plBt7Qsf9rx8gh4JrCajc6CkPSYXF5sI+BKU 14 | CbDlt6fKy5UD7YuVv4/m4u1wdb44QYx+hOC7VKUO1nKOgUsGfhKKwpd1vJBJXoWG 15 | rexrmoqlak/XQBQIatNgR3nVtkdhRsh1plrvNkug3cW3q0DjSi+IigFRJLZxH+cK 16 | 06N04IKYiZeiEhgRIystU9JDtjHJwmaZoK4ejBWcw5ncb8+lYEgeA2XfoMvaZHA0 17 | JhjhIHjEoc6aPuglP/Kn+O3rMdItS9k41clWTkJPJb7PKREZvYz+eMlzUnPqQ2M5 18 | BlpZhPmP7Ky5HOqQXiVttuuFjOG3ZsR8Slw219PBfkaWHYLtT+F5gNY/8Ms2yZS0 19 | GTfalBlxxaBj992HpLZrAD7fADqb+94qe2Xu9fmITi5J9kYgAXDAdvt1t3bg/V2H 20 | Ac3pbNWOHMOpIL11dVEzQ6BfUcbhxgj3J3X+6CiUAMWFwR+RVw11PqyeXLhnlka1 21 | k8ib+ZbMKlXKImZvU8Qqr/uuNuEFLc5AQj3RKUoAb96keJ9U/NL6RSgCxMEDVqpI 22 | LQcxCZkPq/+9n93Gk26+ZXxPngEfrTW4f0EZixahXRAQL5WKcISHtND9QFRxngFz 23 | G+1E9FyyOjRD3riPyY6ZqzfC7aWMYEDAGf1AbTEbzNLZNWV7s/hPC7LVL/7tpz7O 24 | DPwjpLoIvb6jPVDWzRm2+PgFPIKNn+karWHmRjhsOUMr6eRJ3s4c9VbLaZDD4V3f 25 | 5HmYVnMh344IuiNScYLUPbBKKp1jx7b/UZemqFQTBGfck5JK8+LbCi6ZXYABl3gM 26 | /TplV8+E/tCYhrmpmI0jOV60VEvea42sX0xFmWYowQK049Qzf3MWmexC6WgRTE08 27 | RlJwJLLyPC8LIV9/2jBNFq/TCn3/SFmh5n0JlP+THTgejtfpaN9NlwdmKcYJvUdn 28 | AZ++0ErPGTVpLxQSnLy1jRrkdF3Jza8QR/8m1n0k93HscP9O3lktH6fdNP6XLtkY 29 | 5BP3ZtUZi2tCNYGPZzMKXrzCyQUK70Dlu5HMZqMBLf95aLJtJT4W+OStj2mtVwA9 30 | h6RTHzrbGbN1uFmHnsK7uX8MxddBHVpCgYP7c6uOb5YhaVWJqy9g7XdOm6H51wWf 31 | RyAF/JizVN1E7ag9tXvFq4364wre+0Bz2KnIVOpiRxoPRrDUeX+WH6TulmBQLTP/ 32 | 5hI= 33 | -----END ENCRYPTED PRIVATE KEY----- 34 | -------------------------------------------------------------------------------- /cert/EET_CA1_Playground_With_Password-CZ683555118.key: -------------------------------------------------------------------------------- 1 | Bag Attributes 2 | localKeyID: 55 DB EE AB 26 DE F3 06 33 03 8C A8 9A EA 45 BC E8 2D CA C7 3 | Key Attributes: 4 | -----BEGIN ENCRYPTED PRIVATE KEY----- 5 | MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQITkK+nW5DqXkCAggA 6 | MBQGCCqGSIb3DQMHBAiZv0rXKENx7QSCBMhrBdjlz0kFyiwh86QJJJeTZ3GXFYk5 7 | NSSD4sFi6AphK8jt8L6rgarTEBE+fB9V/JhJ92ZO6eKqIpZw3bicgR2LvSxC3RBj 8 | Rpr0jEFAGOwxXwgmEIEKFDFCAr0yKz9iiQ0MY2hpSp/SZ21gmCz7M6mE71f9dT4f 9 | ZnA8gOqQzMeXZnycQh2XXdAMEu72EVDUUdXc/z/pSJ1fWDCTr56z/m7sBhneKcrr 10 | wrAguVXHIUD+jl4zKL7n87ZixukrqMYskn30ytEglRiTIzZxguUeKcY1PUMQKnH/ 11 | khypoOXuaRODBwq8PU6tDLjORsHgQiHaw7VsMKnJjyt8TmJq4KJmsyKAqLw8AxBP 12 | Lkma1lB7eoIz8wobW4pualKzi6qPSyU7Il7vnWlcQidj9R3oMH08ww9g1+aCsefB 13 | 5g9Ijwp73fpl2fWL5Xbc5H3EYjGx7RjW6vFjVoJqD4QEhSkv5v8uDRrelkx3WjDm 14 | IlLMggd1Rwj+m8eGifUcdFJHZ8iNQZYqw+9ryu9by+kTowy0BwAS+8zdPx/CvZQe 15 | SKz/sVuhp9l0ROpjl/KpKyavm6sY4Xp0RmWgnSjQVNCKk3yl+A2AI6Bzq/vzvba/ 16 | hTM5jAQdwBH0yP9pAxrNC7UCt3SjroHsCCEHk+uKw8Zet7s3tqc/cncW81hmqPTl 17 | j20gLKPJam+RXcKnGiqiCw9ijs8+ElmQrQLAdgd3vCuPjlEM9NYP+WCGnAw5TNTm 18 | E/tWk8SXqzM/NRfWpEvWGAjHJ5mN1OCIHBWhC9a/DZ5V8qAHcM3lvjtbDQTXL52i 19 | rdRU7U/Iz3hFoAqF/gOxqoHL/oKuUehDrADwUMQaswbB5Wl5fAs1lGf/tCZSQ9NL 20 | 2wmD2PrCCPGtcQTfPsZ8FmLO5bt8V0VABOaiE3hyFsi8+r3ifSbnJdQSCXshHYaU 21 | 2XKZkfL4uApAxBLm5Vv+eglfU1nWT5WLBHOrDpB4KHYotEzMPCqIXkYJmTTYegCj 22 | LqVF2sjLhipGPsyf6II9/mQ1hQZN7Ps4Z3/Y19WIF20n5yA42FqWRfODjpInTc9q 23 | CVUkS06MkuURsRCgY0Be8kVeoiegnJKtAUgML08iva7AaPTxVaGEwitxeK2qG/ya 24 | 14/3/aURCzZJtEr2OmB0eXdgpjM3fJ/3riE8WKL4CK/1lZSqrh6DDOvZizRRhilv 25 | fzEFJl8FAArm9k4dH/IZIFgTz4RkQoZogwYAlQCiKOJNC5os6XPRJl9/MMo4tzlL 26 | zRTbWL7523pE/fQxpKTKO4eJB2yM9td5zx232n9y61Ufts4i/eoq/ly0YpVlvMvg 27 | he3YrKugfh0WW9S1gsU8+58cfvwc/TlxFEPABOoD05HEgIsLgg1oT6/QwkXGhjd6 28 | 6D97C6G7zRCOCF7Bkst9aBheuIMtaWR+CK/JFdD51OUaFzw3OfA0hoIrN7zDzVIb 29 | x6Q6tcHQd2lGf6XhfHJg9rMCPMX8RnL0jkOxMXXU5i51s+Z03f6+3JDe4opWJzqS 30 | otgcLQbIIiEyewlxRrIQj9HZijIKLwPORZ5ZP6muT+N4IBlmHaOv8sJuZlW8YAzg 31 | m7KVRp5SIHkAN9SpCV2e0/HhUQsXzPM8ybEj7LTXpftGaUtD7ObGfxnCYhkdaKPT 32 | uvQ= 33 | -----END ENCRYPTED PRIVATE KEY----- 34 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | comment: false 2 | coverage: 3 | status: 4 | patch: off 5 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slevomat/eet-client", 3 | "description": "Client for electronic records of sales (EET) in Czech republic", 4 | "license": "MIT", 5 | "type": "library", 6 | "keywords": ["eet", "electronic records of sales"], 7 | "authors": [ 8 | { 9 | "name": "Slevomat.cz, s.r.o.", 10 | "homepage": "http://www.slevomat.cz" 11 | } 12 | ], 13 | "config": { 14 | "sort-packages": true 15 | }, 16 | "support": { 17 | "issues": "https://github.com/slevomat/eet-client/issues" 18 | }, 19 | "require": { 20 | "php": "^7.2 || ^8.0", 21 | "ext-dom": "*", 22 | "ext-openssl": "*", 23 | "ext-soap": "*", 24 | "ramsey/uuid": "^3.5 || ^4.0", 25 | "robrichards/wse-php": "^2.0", 26 | "slevomat/consistence": "^2.1.0" 27 | }, 28 | "require-dev": { 29 | "composer/ca-bundle": "^1.0", 30 | "guzzlehttp/guzzle": "^6.3.3 || ^7.0.1", 31 | "phing/phing": "^2.16.3", 32 | "php-parallel-lint/php-parallel-lint": "^1.2", 33 | "phpstan/phpstan": "^1.1.2", 34 | "phpstan/phpstan-phpunit": "^1.0.0", 35 | "phpunit/phpunit": "^8.5.14 || ^9.3.7", 36 | "slevomat/coding-standard": "^6.3.10", 37 | "squizlabs/php_codesniffer": "^3.5.6" 38 | }, 39 | "autoload": { 40 | "psr-4": { 41 | "SlevomatEET\\": "src" 42 | } 43 | }, 44 | "autoload-dev": { 45 | "psr-4": { 46 | "SlevomatEET\\": "tests/SlevomatEET" 47 | } 48 | }, 49 | "suggest": { 50 | "guzzlehttp/guzzle": "For usage of bundled GuzzleSoapClientDriver" 51 | }, 52 | "extra": { 53 | "branch-alias": { 54 | "dev-master": "1.x-dev" 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Client for EET - Elektronická evidence tržeb 2 | 3 | [![Build status](https://github.com/slevomat/eet-client/workflows/Build/badge.svg?branch=master)](https://github.com/slevomat/eet-client/actions?query=workflow%3ABuild+branch%3Amaster) 4 | [![Code coverage](https://codecov.io/gh/slevomat/eet-client/branch/master/graph/badge.svg)](https://codecov.io/gh/slevomat/eet-client) 5 | [![Latest Stable Version](https://img.shields.io/packagist/v/slevomat/eet-client.svg)](https://packagist.org/packages/slevomat/eet-client) 6 | [![Composer Downloads](https://img.shields.io/packagist/dt/slevomat/eet-client.svg)](https://packagist.org/packages/slevomat/eet-client) 7 | 8 | This repository provides a client library for electronic record of sales (EET) required by czech law. 9 | Tento repozitář obsahuje klientskou knihovnu pro elektronickou evidenci tržeb (EET) 10 | 11 | - [EET website](http://www.etrzby.cz) 12 | 13 | ## Instalace 14 | 15 | Nejlepší způsob jak slevomat/eet-client nainstalovat je pomocí [Composeru](http://getcomposer.org/): 16 | 17 | ``` 18 | > composer require slevomat/eet-client 19 | ``` 20 | 21 | ## Použití 22 | 23 | **POZOR**: Všechny částky jsou uváděny v setinách měny. Tedy pokud chcete odeslat tržbu 55.5 Kč, vložíte do třídy `Receipt` hodnotu jako integer 5550. 24 | ```php 25 | $crypto = new CryptographyService('cesta k privátnímu klíči', 'cesta k veřejnému klíči', 'heslo privátního klíče (nebo prázdný string pokud bez hesla)'); 26 | $configuration = new Configuration( 27 | 'DIČ poplatníka', 28 | 'Identifikace provozovny ', 29 | 'Identifikace pokladního zařízení', 30 | EvidenceEnvironment::get(EvidenceEnvironment::PLAYGROUND), // nebo EvidenceEnvironment::get(EvidenceEnvironment::PRODUCTION) pro komunikaci s produkčním systémem 31 | false // zda zasílat účtenky v ověřovacím módu 32 | ); 33 | $client = new Client($crypto, $configuration, new GuzzleSoapClientDriver(new \GuzzleHttp\Client())); 34 | 35 | $receipt = new Receipt( 36 | true, 37 | 'CZ683555118', 38 | '0/6460/ZQ42', 39 | new \DateTimeImmutable('2016-11-01 00:30:12'), 40 | 3411300 41 | ); 42 | 43 | try { 44 | $response = $client->send($receipt); 45 | echo $response->getFik(); 46 | } catch (\SlevomatEET\FailedRequestException $e) { 47 | echo $e->getRequest()->getPkpCode(); // if request fails you need to print the PKP and BKP codes to receipt 48 | } catch (\SlevomatEET\InvalidResponseReceivedException $e) { 49 | echo $e->getResponse()->getRequest()->getPkpCode(); // on invalid response you need to print the PKP and BKP too 50 | } 51 | ``` 52 | 53 | ### Generování klíčů 54 | 55 | Klíče obdržené z portálu Finanční správy jsou ve formátu .p12 a je třeba převést do formátu PEM. 56 | 57 | V příkazové řádce proveďte tyto příkazy: 58 | 59 | ```$ openssl pkcs12 -in cesta/k/souboru.p12 -out public.pub -clcerts -nokeys``` 60 | 61 | ```$ openssl pkcs12 -in cesta/k/souboru.p12 -out private.key -nocerts``` 62 | 63 | Cestu k výsledným `public.pub` a `private.key` pak nastavíte jako veřejný, resp. privátní klíč při vytváření `CryptographyService` 64 | 65 | Pro testovací prostředí (playground) je třeba využít speciální testovací certifikáty. Tyto playground certifikáty jsou distribuovány s knihovnou v adresáři `cert`. Detailnější popis naleznete v dokumentaci [k testovacímu prostředí EET](http://www.etrzby.cz/cs/oznameni-k-testovacimu-prostredi-playground). 66 | 67 | ### Parametry účtenky 68 | 69 | | XML jméno (dokumentace EET) | Popis | Umístění v klientu | Poznámka | 70 | |-----------------------------|---------------------------------------------------------------------------------|------------------------------------------------|------------------------| 71 | | uuid_zpravy | UUID zprávy | `Receipt::$uuid` | automaticky generováno | 72 | | dat_odesl | Datum odeslání tržby | `$response->getRequest()->getSendTime()` | automaticky generováno | 73 | | prvni_zaslani | Příznak první zaslání | `Receipt::$firstSend` | | 74 | | overeni | Příznak ověřovacího módu | `Configuration::$verificationMode` | výchozí false | 75 | | dic_popl | DIČ poplatníka | `Configuration::$vatId` | | 76 | | dic_poverujiciho | DIČ pověřujícího poplatníka | `Receipt::$delegatedVatId` | | 77 | | id_provoz | ID provozovny | `Configuration::$premiseId` | | 78 | | id_pokl | ID pokladny | `Configuration::$cashRegisterId` | | 79 | | porad_cis | Číslo účtenky | `Receipt::$receiptNumber` | | 80 | | dat_trzby | Datum uskutečnění tržby | `Receipt::$receiptTime` | | 81 | | celk_trzba | Celková částka | `Receipt::$totalPrice` | | 82 | | zakl_nepodl_dph | Celková částka plnění osvobozených od DPH, ostatních plnění | `Receipt::$priceZeroVat` | | 83 | | zakl_dan1 | Základ daně se základní sazbou DPH | `Receipt::$priceStandardVat` | | 84 | | dan1 | DPH se základní sazbou | `Receipt::$vatStandard` | | 85 | | zakl_dan2 | Základ daně s první zníženou sazbou | `Receipt::$priceFirstReducedVat` | | 86 | | dan2 | DPH s první sníženou saznou | `Receipt::$vatFirstReduced` | | 87 | | zakl_dan3 | Základ daně s druhou sníženou sazbou | `Receipt::$priceSecondReducedVat` | | 88 | | dan3 | DPH s druhou sníženou sazbou | `Receipt::$vatSecondReduced` | | 89 | | cest_sluz | Celková částka v režimu DPH pro cestovní službu | `Receipt::$priceTravelService` | | 90 | | pouzit_zboz1 | Celková částka v režimu DPH pro prodej použitého zboží se základní sazbou | `Receipt::$priceUsedGoodsStandardVat` | | 91 | | pouzit_zboz2 | Celková částka v režimu DPH pro prodej použitého zboží s první sníženou sazbou | `Receipt::$priceUsedGoodsFirstReducedVat` | | 92 | | pouzit_zboz3 | Celková částka v režimu DPH pro prodej použitého zboží s druhou sníženou sazbou | `Receipt::$priceUsedGoodsSecondReducedVat` | | 93 | | urceno_cerp_zuct | Částka plateb určená k následnému čerpání nebo zúčtování | `Receipt::$priceSubsequentSettlement` | | 94 | | cerp_zuct | Částka plateb které jsou následným čerpáním nebo zúčtováním | `Receipt::$priceUsedSubsequentSettlement` | | 95 | | rezim | Režim tržby | `Configuration::$evidenceMode` | výchozí bežný | 96 | | pkp | Podpisový kód poplatníka | `$response->getRequest()->getPkpCode()` | | 97 | | bkp | Bezpečnostní kód poplatníka | `$response->getRequest()->getBkpCode()` | | 98 | 99 | ### Client driver 100 | 101 | Odeslání požadavku na servery EET neprobíhá přímo přes SoapClient integrovaný v PHP, ale pomocí rozhraní `SoapClientDriver`. Hlavním důvodem je 102 | nemožnost nastavení timeoutu požadavků integrovaného SoapClienta. 103 | 104 | Součástí knihovny je implentace rozhraní s pomocí [guzzlehttp/guzzle](https://packagist.org/packages/guzzlehttp/guzzle). Výchozí timeout této implementace 105 | je 2.5 sekundy, nastavitelný parametrem konstruktoru. 106 | -------------------------------------------------------------------------------- /src/Client.php: -------------------------------------------------------------------------------- 1 | cryptographyService = $cryptographyService; 28 | $this->configuration = $configuration; 29 | $this->soapClientDriver = $soapClientDriver; 30 | } 31 | 32 | public function send(Receipt $receipt): EvidenceResponse 33 | { 34 | $request = new EvidenceRequest($receipt, $this->configuration, $this->cryptographyService); 35 | 36 | try { 37 | $response = $this->getSoapClient()->OdeslaniTrzby($request->getRequestData()); 38 | } catch (DriverRequestFailedException $e) { 39 | throw new FailedRequestException($request, $e); 40 | } catch (SoapFault $e) { 41 | throw new FailedRequestException($request, $e); 42 | } 43 | 44 | $response = new EvidenceResponse($response, $request); 45 | if (!$response->isValid()) { 46 | throw new InvalidResponseReceivedException($response); 47 | } 48 | 49 | return $response; 50 | } 51 | 52 | private function getSoapClient(): SoapClient 53 | { 54 | if ($this->soapClient === null) { 55 | $this->soapClient = new SoapClient($this->configuration->getEvidenceEnvironment()->getWsdlPath(), $this->cryptographyService, $this->soapClientDriver); 56 | } 57 | 58 | return $this->soapClient; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/Configuration.php: -------------------------------------------------------------------------------- 1 | vatId = $vatId; 29 | $this->premiseId = $premiseId; 30 | $this->cashRegisterId = $cashRegisterId; 31 | $this->evidenceMode = EvidenceMode::get(EvidenceMode::REGULAR); 32 | $this->verificationMode = $verificationMode; 33 | $this->evidenceEnvironment = $evidenceEnvironment; 34 | } 35 | 36 | public function getVatId(): string 37 | { 38 | return $this->vatId; 39 | } 40 | 41 | public function getPremiseId(): string 42 | { 43 | return $this->premiseId; 44 | } 45 | 46 | public function getCashRegisterId(): string 47 | { 48 | return $this->cashRegisterId; 49 | } 50 | 51 | public function isVerificationMode(): bool 52 | { 53 | return $this->verificationMode; 54 | } 55 | 56 | public function getEvidenceMode(): EvidenceMode 57 | { 58 | return $this->evidenceMode; 59 | } 60 | 61 | public function getEvidenceEnvironment(): EvidenceEnvironment 62 | { 63 | return $this->evidenceEnvironment; 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /src/Cryptography/CryptographyService.php: -------------------------------------------------------------------------------- 1 | privateKeyFile = $privateKeyFile; 37 | $this->publicKeyFile = $publicKeyFile; 38 | $this->privateKeyPassword = $privateKeyPassword; 39 | } 40 | 41 | /** 42 | * @param mixed[] $body 43 | * @return string 44 | */ 45 | public function getPkpCode(array $body): string 46 | { 47 | $values = [ 48 | $body['dic_popl'], 49 | $body['id_provoz'], 50 | $body['id_pokl'], 51 | $body['porad_cis'], 52 | $body['dat_trzby'], 53 | $body['celk_trzba'], 54 | ]; 55 | 56 | $plaintext = implode('|', $values); 57 | 58 | $privateKey = (string) file_get_contents($this->privateKeyFile); 59 | $privateKeyId = openssl_pkey_get_private($privateKey, $this->privateKeyPassword); 60 | if ($privateKeyId === false) { 61 | throw new PrivateKeyFileException($this->privateKeyFile); 62 | } 63 | 64 | $ok = openssl_sign($plaintext, $signature, $privateKeyId, OPENSSL_ALGO_SHA256); 65 | if (!$ok) { 66 | throw new SigningFailedException($values); 67 | } 68 | if (PHP_VERSION_ID < 80000) { 69 | // phpcs:ignore Generic.PHP.DeprecatedFunctions 70 | openssl_free_key($privateKeyId); 71 | } 72 | 73 | return $signature; 74 | } 75 | 76 | public function getBkpCode(string $pkpCode): string 77 | { 78 | $bkp = strtoupper(sha1($pkpCode)); 79 | 80 | return implode('-', str_split($bkp, 8)); 81 | } 82 | 83 | public function addWSESignature(string $request): string 84 | { 85 | $publicKey = (string) file_get_contents($this->publicKeyFile); 86 | $this->verifyPublicKey($publicKey); 87 | $securityKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA256, ['type' => 'private']); 88 | $document = new DOMDocument('1.0'); 89 | $document->loadXML($request); 90 | $wse = new WSSESoap($document); 91 | $securityKey->passphrase = $this->privateKeyPassword; 92 | $securityKey->loadKey($this->privateKeyFile, true); 93 | $wse->addTimestamp(); 94 | $wse->signSoapDoc($securityKey, ['algorithm' => XMLSecurityDSig::SHA256]); 95 | $binaryToken = $wse->addBinaryToken($publicKey); 96 | $wse->attachTokentoSig($binaryToken); 97 | 98 | return $wse->saveXML(); 99 | } 100 | 101 | private function verifyPublicKey(string $fileContents): void 102 | { 103 | if ($this->publicKeyVerified) { 104 | return; 105 | } 106 | $publicKeyResource = openssl_get_publickey($fileContents); 107 | if ($publicKeyResource === false) { 108 | throw new InvalidPublicKeyException($this->publicKeyFile, (string) openssl_error_string()); 109 | } 110 | if (PHP_VERSION_ID < 80000) { 111 | // phpcs:ignore Generic.PHP.DeprecatedFunctions 112 | openssl_free_key($publicKeyResource); 113 | } 114 | $this->publicKeyVerified = true; 115 | } 116 | 117 | } 118 | -------------------------------------------------------------------------------- /src/Cryptography/InvalidPublicKeyException.php: -------------------------------------------------------------------------------- 1 | privateKeyFile = $privateKeyFile; 22 | } 23 | 24 | public function getPrivateKeyFile(): string 25 | { 26 | return $this->privateKeyFile; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/Cryptography/PrivateKeyFileNotFoundException.php: -------------------------------------------------------------------------------- 1 | publicKeyFile = $publicKeyFile; 19 | } 20 | 21 | public function getPublicKeyFile(): string 22 | { 23 | return $this->publicKeyFile; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/Cryptography/PublicKeyFileNotFoundException.php: -------------------------------------------------------------------------------- 1 | data = $data; 21 | } 22 | 23 | /** 24 | * @return mixed[] 25 | */ 26 | public function getData(): array 27 | { 28 | return $this->data; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/Driver/DriverRequestFailedException.php: -------------------------------------------------------------------------------- 1 | getMessage(), $e->getCode(), $e); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/Driver/GuzzleSoapClientDriver.php: -------------------------------------------------------------------------------- 1 | httpClient = $httpClient; 28 | $this->connectionTimeout = $connectionTimeout; 29 | $this->requestTimeout = $requestTimeout; 30 | } 31 | 32 | public function send(string $request, string $location, string $action, int $soapVersion): string 33 | { 34 | $headers = [ 35 | 'User-Agent' => self::HEADER_USER_AGENT, 36 | 'Content-Type' => sprintf('%s; charset=utf-8', $soapVersion === 2 ? 'application/soap+xml' : 'text/xml'), 37 | 'SOAPAction' => $action, 38 | 'Content-Length' => (string) strlen($request), 39 | ]; 40 | 41 | $request = new Request('POST', $location, $headers, $request); 42 | try { 43 | $httpResponse = $this->httpClient->send($request, [ 44 | RequestOptions::HTTP_ERRORS => false, 45 | RequestOptions::ALLOW_REDIRECTS => false, 46 | RequestOptions::CONNECT_TIMEOUT => $this->connectionTimeout, 47 | RequestOptions::TIMEOUT => $this->requestTimeout, 48 | ]); 49 | 50 | return (string) $httpResponse->getBody(); 51 | } catch (RequestException $e) { 52 | throw new DriverRequestFailedException($e); 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/Driver/SoapClientDriver.php: -------------------------------------------------------------------------------- 1 | equalsValue(self::PRODUCTION)) { 16 | return __DIR__ . '/../wsdl/EETServiceSOAP_production.wsdl'; 17 | } 18 | return __DIR__ . '/../wsdl/EETServiceSOAP_playground.wsdl'; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/EvidenceMode.php: -------------------------------------------------------------------------------- 1 | sendDate = new DateTimeImmutable(); 29 | $this->header = [ 30 | 'uuid_zpravy' => $receipt->getUuid()->toString(), 31 | 'dat_odesl' => Formatter::formatDateTime($this->sendDate), 32 | 'prvni_zaslani' => $receipt->isFirstSend(), 33 | 'overeni' => $configuration->isVerificationMode(), 34 | ]; 35 | 36 | $body = [ 37 | 'dic_popl' => $configuration->getVatId(), 38 | 'dic_poverujiciho' => $receipt->getDelegatedVatId(), 39 | 'id_provoz' => $configuration->getPremiseId(), 40 | 'id_pokl' => $configuration->getCashRegisterId(), 41 | 'porad_cis' => $receipt->getReceiptNumber(), 42 | 'dat_trzby' => Formatter::formatDateTime($receipt->getReceiptTime()), 43 | 'celk_trzba' => Formatter::formatAmount($receipt->getTotalPrice()), 44 | 'zakl_nepodl_dph' => Formatter::formatAmount($receipt->getPriceZeroVat()), 45 | 'zakl_dan1' => Formatter::formatAmount($receipt->getPriceStandardVat()), 46 | 'dan1' => Formatter::formatAmount($receipt->getVatStandard()), 47 | 'zakl_dan2' => Formatter::formatAmount($receipt->getPriceFirstReducedVat()), 48 | 'dan2' => Formatter::formatAmount($receipt->getVatFirstReduced()), 49 | 'zakl_dan3' => Formatter::formatAmount($receipt->getPriceSecondReducedVat()), 50 | 'dan3' => Formatter::formatAmount($receipt->getVatSecondReduced()), 51 | 'cest_sluz' => Formatter::formatAmount($receipt->getPriceTravelService()), 52 | 'pouzit_zboz1' => Formatter::formatAmount($receipt->getPriceUsedGoodsStandardVat()), 53 | 'pouzit_zboz2' => Formatter::formatAmount($receipt->getPriceUsedGoodsFirstReducedVat()), 54 | 'pouzit_zboz3' => Formatter::formatAmount($receipt->getPriceUsedGoodsSecondReducedVat()), 55 | 'urceno_cerp_zuct' => Formatter::formatAmount($receipt->getPriceForSubsequentSettlement()), 56 | 'cerp_zuct' => Formatter::formatAmount($receipt->getPriceUsedSubsequentSettlement()), 57 | 'rezim' => $configuration->getEvidenceMode()->getValue(), 58 | ]; 59 | $this->body = array_filter($body, static function ($value): bool { 60 | return $value !== null; 61 | }); 62 | 63 | $this->pkpCode = $cryptographyService->getPkpCode($this->body); 64 | $this->bkpCode = $cryptographyService->getBkpCode($this->pkpCode); 65 | } 66 | 67 | /** 68 | * @return mixed[] 69 | */ 70 | public function getRequestData(): array 71 | { 72 | return [ 73 | 'Hlavicka' => $this->header, 74 | 'Data' => $this->body, 75 | 'KontrolniKody' => [ 76 | 'pkp' => [ 77 | '_' => $this->pkpCode, 78 | 'digest' => 'SHA256', 79 | 'cipher' => 'RSA2048', 80 | 'encoding' => 'base64', 81 | ], 82 | 'bkp' => [ 83 | '_' => $this->bkpCode, 84 | 'digest' => 'SHA1', 85 | 'encoding' => 'base16', 86 | ], 87 | ], 88 | ]; 89 | } 90 | 91 | public function getSendDate(): DateTimeImmutable 92 | { 93 | return $this->sendDate; 94 | } 95 | 96 | /** 97 | * @return mixed[] 98 | */ 99 | public function getHeader(): array 100 | { 101 | return $this->header; 102 | } 103 | 104 | /** 105 | * @return mixed[] 106 | */ 107 | public function getBody(): array 108 | { 109 | return $this->body; 110 | } 111 | 112 | public function getPkpCode(): string 113 | { 114 | return $this->pkpCode; 115 | } 116 | 117 | public function getBkpCode(): string 118 | { 119 | return $this->bkpCode; 120 | } 121 | 122 | } 123 | -------------------------------------------------------------------------------- /src/EvidenceResponse.php: -------------------------------------------------------------------------------- 1 | rawData = $rawData; 36 | $this->uuid = $rawData->Hlavicka->uuid_zpravy ?? null; 37 | if (isset($rawData->Potvrzeni)) { 38 | $this->fik = $rawData->Potvrzeni->fik; 39 | } 40 | $this->bkp = $rawData->Hlavicka->bkp ?? null; 41 | $this->test = $rawData->Potvrzeni->test ?? $rawData->Chyba->test ?? false; 42 | $this->responseTime = DateTimeImmutable::createFromFormat(DateTime::ISO8601, $rawData->Hlavicka->dat_prij ?? $rawData->Hlavicka->dat_odmit); 43 | $this->evidenceRequest = $evidenceRequest; 44 | } 45 | 46 | public function getFik(): string 47 | { 48 | if ($this->fik === null) { 49 | throw new InvalidResponseWithoutFikException($this); 50 | } 51 | 52 | return $this->fik; 53 | } 54 | 55 | public function getRawData(): stdClass 56 | { 57 | return $this->rawData; 58 | } 59 | 60 | public function getUuid(): ?string 61 | { 62 | return $this->uuid; 63 | } 64 | 65 | public function getBkp(): ?string 66 | { 67 | return $this->bkp; 68 | } 69 | 70 | public function isTest(): bool 71 | { 72 | return $this->test; 73 | } 74 | 75 | public function isValid(): bool 76 | { 77 | return $this->fik !== null; 78 | } 79 | 80 | public function getResponseTime(): DateTimeImmutable 81 | { 82 | return $this->responseTime; 83 | } 84 | 85 | public function getRequest(): EvidenceRequest 86 | { 87 | return $this->evidenceRequest; 88 | } 89 | 90 | } 91 | -------------------------------------------------------------------------------- /src/FailedRequestException.php: -------------------------------------------------------------------------------- 1 | getMessage(), $previous->getCode(), $previous); 17 | $this->request = $request; 18 | } 19 | 20 | public function getRequest(): EvidenceRequest 21 | { 22 | return $this->request; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/Formatter.php: -------------------------------------------------------------------------------- 1 | format('c'); 13 | } 14 | 15 | public static function formatAmount(?int $price = null): ?string 16 | { 17 | return $price === null ? null : number_format($price / 100, 2, '.', ''); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/InvalidResponseReceivedException.php: -------------------------------------------------------------------------------- 1 | response = $response; 18 | } 19 | 20 | public function getResponse(): EvidenceResponse 21 | { 22 | return $this->response; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/InvalidResponseWithoutFikException.php: -------------------------------------------------------------------------------- 1 | response = $response; 18 | } 19 | 20 | public function getResponse(): EvidenceResponse 21 | { 22 | return $this->response; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/Receipt.php: -------------------------------------------------------------------------------- 1 | uuid = Uuid::uuid4(); 167 | $this->firstSend = $firstSend; 168 | $this->delegatedVatId = $delegatedVatId; 169 | $this->receiptNumber = $receiptNumber; 170 | $this->receiptTime = $receiptTime; 171 | $this->totalPrice = $totalPrice; 172 | $this->priceZeroVat = $priceZeroVat; 173 | $this->priceStandardVat = $priceStandardVat; 174 | $this->vatStandard = $vatStandard; 175 | $this->priceFirstReducedVat = $priceFirstReducedVat; 176 | $this->vatFirstReduced = $vatFirstReduced; 177 | $this->priceSecondReducedVat = $priceSecondReducedVat; 178 | $this->vatSecondReduced = $vatSecondReduced; 179 | $this->priceTravelService = $priceTravelService; 180 | $this->priceUsedGoodsStandardVat = $priceUsedGoodsStandardVat; 181 | $this->priceUsedGoodsFirstReducedVat = $priceUsedGoodsFirstReducedVat; 182 | $this->priceUsedGoodsSecondReducedVat = $priceUsedGoodsSecondReducedVat; 183 | $this->priceForSubsequentSettlement = $priceSubsequentSettlement; 184 | $this->priceUsedSubsequentSettlement = $priceUsedSubsequentSettlement; 185 | } 186 | 187 | public function getUuid(): UuidInterface 188 | { 189 | return $this->uuid; 190 | } 191 | 192 | public function isFirstSend(): bool 193 | { 194 | return $this->firstSend; 195 | } 196 | 197 | public function getDelegatedVatId(): ?string 198 | { 199 | return $this->delegatedVatId; 200 | } 201 | 202 | public function getReceiptNumber(): string 203 | { 204 | return $this->receiptNumber; 205 | } 206 | 207 | public function getReceiptTime(): DateTimeImmutable 208 | { 209 | return $this->receiptTime; 210 | } 211 | 212 | public function getTotalPrice(): int 213 | { 214 | return $this->totalPrice; 215 | } 216 | 217 | public function getPriceZeroVat(): ?int 218 | { 219 | return $this->priceZeroVat; 220 | } 221 | 222 | public function getPriceStandardVat(): ?int 223 | { 224 | return $this->priceStandardVat; 225 | } 226 | 227 | public function getVatStandard(): ?int 228 | { 229 | return $this->vatStandard; 230 | } 231 | 232 | public function getPriceFirstReducedVat(): ?int 233 | { 234 | return $this->priceFirstReducedVat; 235 | } 236 | 237 | public function getVatFirstReduced(): ?int 238 | { 239 | return $this->vatFirstReduced; 240 | } 241 | 242 | public function getPriceSecondReducedVat(): ?int 243 | { 244 | return $this->priceSecondReducedVat; 245 | } 246 | 247 | public function getVatSecondReduced(): ?int 248 | { 249 | return $this->vatSecondReduced; 250 | } 251 | 252 | public function getPriceTravelService(): ?int 253 | { 254 | return $this->priceTravelService; 255 | } 256 | 257 | public function getPriceUsedGoodsStandardVat(): ?int 258 | { 259 | return $this->priceUsedGoodsStandardVat; 260 | } 261 | 262 | public function getPriceUsedGoodsFirstReducedVat(): ?int 263 | { 264 | return $this->priceUsedGoodsFirstReducedVat; 265 | } 266 | 267 | public function getPriceUsedGoodsSecondReducedVat(): ?int 268 | { 269 | return $this->priceUsedGoodsSecondReducedVat; 270 | } 271 | 272 | public function getPriceForSubsequentSettlement(): ?int 273 | { 274 | return $this->priceForSubsequentSettlement; 275 | } 276 | 277 | public function getPriceUsedSubsequentSettlement(): ?int 278 | { 279 | return $this->priceUsedSubsequentSettlement; 280 | } 281 | 282 | } 283 | -------------------------------------------------------------------------------- /src/SoapClient.php: -------------------------------------------------------------------------------- 1 | SOAP_1_1, 23 | 'encoding' => 'UTF-8', 24 | 'trace' => true, 25 | 'exceptions' => true, 26 | 'cache_wsdl' => WSDL_CACHE_DISK, 27 | ]; 28 | parent::__construct($wsdl, $options); 29 | $this->cryptoService = $cryptoService; 30 | $this->clientDriver = $clientDriver; 31 | } 32 | 33 | /** 34 | * @param mixed[] $parameters 35 | * @return mixed 36 | */ 37 | public function OdeslaniTrzby(array $parameters) 38 | { 39 | return $this->__soapCall(__FUNCTION__, ['Trzba' => $parameters]); 40 | } 41 | 42 | /** 43 | * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint 44 | * 45 | * @param string $request 46 | * @param string $location 47 | * @param string $action 48 | * @param int $version 49 | * @param bool|int $oneWay 50 | * @return string|null 51 | */ 52 | public function __doRequest($request, $location, $action, $version, $oneWay = 0): ?string 53 | { 54 | $signedRequest = $this->cryptoService->addWSESignature($request); 55 | $response = $this->clientDriver->send($signedRequest, $location, $action, $version); 56 | 57 | if ($oneWay) { 58 | return null; 59 | } 60 | return $response; 61 | } 62 | 63 | } 64 | -------------------------------------------------------------------------------- /wsdl/EETServiceSOAP_playground.wsdl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Ucel : Sluzba pro odeslani datove zpravy evidovane trzby 5 | Verze : 3.1 6 | Vlastnik : Generalni financni reditelstvi 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /wsdl/EETServiceSOAP_production.wsdl: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | Ucel : Sluzba pro odeslani datove zpravy evidovane trzby 7 | Verze : 3.1 8 | Vlastnik : Generalni financni reditelstvi 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /wsdl/EETXMLSchema.xsd: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 226 | 227 | 228 | 229 | 230 | 231 | --------------------------------------------------------------------------------