Atualização repositorio
This commit is contained in:
24
.eslintrc.js
Normal file
24
.eslintrc.js
Normal file
@@ -0,0 +1,24 @@
|
||||
module.exports = {
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
project: 'tsconfig.json',
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['@typescript-eslint/eslint-plugin'],
|
||||
extends: [
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'prettier/@typescript-eslint',
|
||||
'plugin:prettier/recommended',
|
||||
],
|
||||
root: true,
|
||||
env: {
|
||||
node: true,
|
||||
jest: true,
|
||||
},
|
||||
rules: {
|
||||
'@typescript-eslint/interface-name-prefix': 'off',
|
||||
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
},
|
||||
};
|
||||
148
.gitignore
vendored
148
.gitignore
vendored
@@ -1,3 +1,7 @@
|
||||
# compiled output
|
||||
/dist
|
||||
/node_modules
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
@@ -5,132 +9,26 @@ npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
# OS
|
||||
.DS_Store
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
# Tests
|
||||
/coverage
|
||||
/.nyc_output
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
# IDEs and editors
|
||||
/.idea
|
||||
.project
|
||||
.classpath
|
||||
.c9/
|
||||
*.launch
|
||||
.settings/
|
||||
*.sublime-workspace
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
.cache
|
||||
|
||||
# vitepress build output
|
||||
**/.vitepress/dist
|
||||
|
||||
# vitepress cache directory
|
||||
**/.vitepress/cache
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
# IDE - VSCode
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
4
.prettierrc
Normal file
4
.prettierrc
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"singleQuote": true,
|
||||
"trailingComma": "all"
|
||||
}
|
||||
73
README.md
Normal file
73
README.md
Normal file
@@ -0,0 +1,73 @@
|
||||
<p align="center">
|
||||
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo_text.svg" width="320" alt="Nest Logo" /></a>
|
||||
</p>
|
||||
|
||||
[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
|
||||
[circleci-url]: https://circleci.com/gh/nestjs/nest
|
||||
|
||||
<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
|
||||
<p align="center">
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
|
||||
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
|
||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
||||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
|
||||
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
|
||||
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
|
||||
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>
|
||||
</p>
|
||||
<!--[](https://opencollective.com/nest#backer)
|
||||
[](https://opencollective.com/nest#sponsor)-->
|
||||
|
||||
## Description
|
||||
|
||||
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
$ npm install
|
||||
```
|
||||
|
||||
## Running the app
|
||||
|
||||
```bash
|
||||
# development
|
||||
$ npm run start
|
||||
|
||||
# watch mode
|
||||
$ npm run start:dev
|
||||
|
||||
# production mode
|
||||
$ npm run start:prod
|
||||
```
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
# unit tests
|
||||
$ npm run test
|
||||
|
||||
# e2e tests
|
||||
$ npm run test:e2e
|
||||
|
||||
# test coverage
|
||||
$ npm run test:cov
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
|
||||
|
||||
## Stay in touch
|
||||
|
||||
- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com)
|
||||
- Website - [https://nestjs.com](https://nestjs.com/)
|
||||
- Twitter - [@nestframework](https://twitter.com/nestframework)
|
||||
|
||||
## License
|
||||
|
||||
Nest is [MIT licensed](LICENSE).
|
||||
BIN
cert/JURUNENSE.pfx
Normal file
BIN
cert/JURUNENSE.pfx
Normal file
Binary file not shown.
36
cert/STAR_jurunense_com.crt
Normal file
36
cert/STAR_jurunense_com.crt
Normal file
@@ -0,0 +1,36 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGNDCCBRygAwIBAgIQPXJcTfmIIxc0dhkm872DGTANBgkqhkiG9w0BAQsFADCB
|
||||
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
||||
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
|
||||
Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB
|
||||
MB4XDTIzMDUzMDAwMDAwMFoXDTI0MDUyOTIzNTk1OVowGjEYMBYGA1UEAwwPKi5q
|
||||
dXJ1bmVuc2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+98
|
||||
NUp5GOf7/tsmydF+rNVPmDbkJ3YVYu7QMN1QLbaP50kG5I5JBhirWFfP8R8WVE5M
|
||||
WHPMcMdj1B3n8dYm+IDNfvIwoZVR5khOogWlOsNc/+/581Nw5crY6Lt+JF81Fglz
|
||||
rDtiaCvpRdiihn9KVTIi98HOcigxG7rUk32oiFtpkIxAW0AbZCcJWC8CN2uzkudI
|
||||
t7O4b1nguMSmSyCNqtKHZY4nVRKKfrPbJN7rc0TZMjEpbfbpr+gLduuoiQsb1YwX
|
||||
SbPa42QPA9a10HruFAA4CRqdMtawaZir2Vqqcs5WY8wG+uTYFedA3qiZ1P00NHmk
|
||||
8zooKE2CtQyeMbKkTwIDAQABo4IC/jCCAvowHwYDVR0jBBgwFoAUjYxexFStiuF3
|
||||
6Zv5mwXhuAGNYeEwHQYDVR0OBBYEFE/J6yZvQbIdBxLNS+t2GbqLvgTDMA4GA1Ud
|
||||
DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
|
||||
BgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEW
|
||||
F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEE
|
||||
eDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29S
|
||||
U0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzAB
|
||||
hhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTApBgNVHREEIjAggg8qLmp1cnVuZW5z
|
||||
ZS5jb22CDWp1cnVuZW5zZS5jb20wggF8BgorBgEEAdZ5AgQCBIIBbASCAWgBZgB1
|
||||
AHb/iD8KtvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABiGoxLmkAAAQDAEYw
|
||||
RAIgTWumUgIKUROJcoqAEpRp5PydRzMxvKD33G8bb7TGRZcCIAYgfTDGJpCykGCN
|
||||
dH0ngsuZ8zKQlsg5xQAq/3XcIYMbAHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0
|
||||
vaQ9MEjX+6sAAAGIajEuyAAABAMARjBEAiBYx57ghakyP/o/gO7cijhU1/pMMbd/
|
||||
4cFJ5ByVFpPm+QIgXJJDn/4Nq5QOopgwyJPiYDwU+z951kxC/HeGh9bLEt0AdgDu
|
||||
zdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYhqMS6XAAAEAwBHMEUC
|
||||
IQD917OeqnMe9oQKlVv//E32VqqJUfpTkXbGEZ8q6ckX3AIgb5l//jjQ0RZnM3RA
|
||||
Ucw/unwxGcPP7Bo6HdRDYcMEkBkwDQYJKoZIhvcNAQELBQADggEBADsmDG2V6ZHU
|
||||
RxrRN4UdpKJSyYUZxnSMGTTo8t9nSEQ5WM3byZybQYcUm66wHi50lPwLNJPEV3rd
|
||||
2XhvJyESA2UpAxK12sWMPRXpa5WbEtDSq9xHPknzA2RsZHhh8P8vw2AwRfS/EQll
|
||||
UGFQkyqBA2MkdIw1ldPMnZM3FH6VXjrkq5CV6ib+TO0OnNNBIJRePHlSAMslxqiT
|
||||
wN7bvbWQMebapiZ/8CIx1CcRZLCBQBETFA71iPWqKAJVFPp1bh8XbHixv7Rfpn0F
|
||||
G2/HkK51y/ZYyKbgwW5WDq4/SabJD8palSlw8HBpMGXuZCCrxpd6kssj6Q9nmGSV
|
||||
gr5tfdYId24=
|
||||
-----END CERTIFICATE-----
|
||||
24
cert/glpi-selfsigned.crt
Normal file
24
cert/glpi-selfsigned.crt
Normal file
@@ -0,0 +1,24 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID9zCCAt+gAwIBAgIUEJEiXtLMas40jSAsZ45nXAsKNjgwDQYJKoZIhvcNAQEL
|
||||
BQAwgYoxCzAJBgNVBAYTAkJSMQ0wCwYDVQQIDARQQVJBMQ4wDAYDVQQHDAVCRUxF
|
||||
TTESMBAGA1UECgwJSlVSVU5FTlNFMQswCQYDVQQLDAJUSTESMBAGA1UEAwwJSlVS
|
||||
VU5FTlNFMScwJQYJKoZIhvcNAQkBFhhTVVBPUlRFQEpVUlVORU5TRS5DT00uQlIw
|
||||
HhcNMjQxMjAzMTIzNDAwWhcNMjcxMjAzMTIzNDAwWjCBijELMAkGA1UEBhMCQlIx
|
||||
DTALBgNVBAgMBFBBUkExDjAMBgNVBAcMBUJFTEVNMRIwEAYDVQQKDAlKVVJVTkVO
|
||||
U0UxCzAJBgNVBAsMAlRJMRIwEAYDVQQDDAlKVVJVTkVOU0UxJzAlBgkqhkiG9w0B
|
||||
CQEWGFNVUE9SVEVASlVSVU5FTlNFLkNPTS5CUjCCASIwDQYJKoZIhvcNAQEBBQAD
|
||||
ggEPADCCAQoCggEBAIUGlPdS7LH1im7EX/tseOi1pSZKfmMgM8MX9ij5BGbxy4Wr
|
||||
TRCKC0A9MJ1OKPk7Tv76hX0F+ZI08DEQ0knB7UFfHKTO/VeKD48xCDbJVx8piqoO
|
||||
LyjQ+2nv+hq0//jbvHzrvgwNHGnUXK7w5Oip20qzCI5c/rHCELp3hQpenugQnkgC
|
||||
FnbYe17QeimpWDL5kZrIV/jkLfWHGp6NxYt3XhJgbB2BHZL9cQBJSV/OH9zpRZKB
|
||||
KRMARbQiqzNBLE1zJCPRCo4d97ksY2W1fD+YqYVcGV+A0304iiLpF0/jVVoE3EMG
|
||||
xVq5H5nikITVhxeg4lSD9Wi8T+qfWUEjOkUykR8CAwEAAaNTMFEwHQYDVR0OBBYE
|
||||
FIbD7xsUZ/a/M6oHKPHkYPpWPVzsMB8GA1UdIwQYMBaAFIbD7xsUZ/a/M6oHKPHk
|
||||
YPpWPVzsMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACx7PrmU
|
||||
xUbZc8hy5WDVuVgzKbxyGKvuiNRHzPsbg/iQZdt5yCwDMszN88GESiAa+n9pIoIs
|
||||
UN8jU2c5uZAUDsVdueWLCdX6djq5sR0ta3HUOP4HyZwo/XMZEdMG2Nb+eBfLl4/m
|
||||
GOZs9xyzkK2Unxe6Zz1ZvXZNVzTs47SOPL4EpKyHlOsDp9OlqDWQ+h2LfEVYXyKV
|
||||
WGxRQORcvUsKfLHOrKoZ/OyWLBK1G70hPJRwXjJ+wHeVRHyxsjVR308IgTtkYyYK
|
||||
ykleFGaYbrixHPgMvjiZxAHFwjSNoAknB5iqI+HSbvOQG7DwYarlsrXTfqT1D1+o
|
||||
jvnZcdeb6p1OTtg=
|
||||
-----END CERTIFICATE-----
|
||||
28
cert/glpi-selfsigned.key
Normal file
28
cert/glpi-selfsigned.key
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCFBpT3Uuyx9Ypu
|
||||
xF/7bHjotaUmSn5jIDPDF/Yo+QRm8cuFq00QigtAPTCdTij5O07++oV9BfmSNPAx
|
||||
ENJJwe1BXxykzv1Xig+PMQg2yVcfKYqqDi8o0Ptp7/oatP/427x8674MDRxp1Fyu
|
||||
8OToqdtKswiOXP6xwhC6d4UKXp7oEJ5IAhZ22Hte0HopqVgy+ZGayFf45C31hxqe
|
||||
jcWLd14SYGwdgR2S/XEASUlfzh/c6UWSgSkTAEW0IqszQSxNcyQj0QqOHfe5LGNl
|
||||
tXw/mKmFXBlfgNN9OIoi6RdP41VaBNxDBsVauR+Z4pCE1YcXoOJUg/VovE/qn1lB
|
||||
IzpFMpEfAgMBAAECggEAM1zRutctZh8ZBuDS8Ji27J9qN2ku+KYv5kXDuZlArmDx
|
||||
BNkaBedPJcwaj7pkjqrsOv5O+XGLpfzDuyY0E9+JdKK9RBNZ9WlszYyQj9rYxUL8
|
||||
c+HLKrbaRFKw3owBg7yQQCmj9TJAxMoGyVNhB0bCUcrj5FgazVbRr7XDTDgxogdu
|
||||
HCtjWP5gmp0sFAghVxqyPTBEW1cgJGWoy+mFceij5n5GRp4rHt1uhUcQvw3Msp5Y
|
||||
5KHSru2ckfkJNnogSxf2VVKgtyzsQJGwi2Owg/bpkSaBMgKqSjfHfWnTA6V7g8Ml
|
||||
XyGq9WQ8fDBVOTbxTw6HQ9Yq7oG8+EcmTsbHCrPwjQKBgQC47toH5eTp55Tx3y/h
|
||||
kWYKNDVrsqhiyoHySrietaxnaaNScjJ0OmHZ+TJy6FetjZtHjFWOLwIAIZGU4y5c
|
||||
roIaT4kQqnDGkqfaiOFikfybj+NJqY1ucvtNeJrbwSQ/Cu8TEEFtD+iF++xzdtCI
|
||||
ZGVOGw1ESbl245M8SrUViVJO6wKBgQC4JT9PZU4tm7IYEYj+c5rzfpsz/G1CgV0h
|
||||
jbZpzxRY9RvD6lclpo/kHECs6nReusZUy8D9wmMr5THHubwXoophDunQV3yoUOmj
|
||||
+tZrAqwURWdjBBQ4eMJd2fUep336nzQLOkwf76aNCZ70CnY3c0A1kCpEW+RlgP5m
|
||||
I1UsDGvBnQKBgBA7Jne6/bRp1vDDnfg2QrZyjp29OHozO+SAGmQTneYVp3f8/eCl
|
||||
nyD6disPqWJaI17MOlYYWhyY1aYzqkYIKvMUN/t2eh9zj7fme6GjHoCoyFIWx4sC
|
||||
HHxYMX9IHF5MH1+U9akU1FuuGLqpmvPdm+aXCTsNHXIJ10pbZDlXrBmxAoGAQEnA
|
||||
sJdNk96nbn+wtCToE9o/lQarnmxLd0tiQ85n7Camat+FTT+5PIogij3QIsJSO4hm
|
||||
+DDFLq31kyTk5dt5NClgt7vTaW/WIcmQ0gs8yFbyoT7rUEvYj6toSCtxb+3k3Yac
|
||||
zQl9u/9/3vNIElPKNuj92J+8PTOrnTz4n0g21oECgYB4h412DwbXMU5vo57brNut
|
||||
cvLC7yk8CVBolNCGOXa0S+/wR8W/VNmuaaC/vFVTrkx0OCk/HTDlEbPexS85hjVw
|
||||
MqUHYfn+rHjZzLwdWzWAdDqR+2rD1QjiaGQcAZmDiALPAmKaiKOBcq5/D9NQKloc
|
||||
RjobbZeKQ9z+xfcDhRLKSQ==
|
||||
-----END PRIVATE KEY-----
|
||||
36
cert/jurunense.com.crt
Normal file
36
cert/jurunense.com.crt
Normal file
@@ -0,0 +1,36 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGNDCCBRygAwIBAgIQPXJcTfmIIxc0dhkm872DGTANBgkqhkiG9w0BAQsFADCB
|
||||
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
||||
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
|
||||
Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB
|
||||
MB4XDTIzMDUzMDAwMDAwMFoXDTI0MDUyOTIzNTk1OVowGjEYMBYGA1UEAwwPKi5q
|
||||
dXJ1bmVuc2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+98
|
||||
NUp5GOf7/tsmydF+rNVPmDbkJ3YVYu7QMN1QLbaP50kG5I5JBhirWFfP8R8WVE5M
|
||||
WHPMcMdj1B3n8dYm+IDNfvIwoZVR5khOogWlOsNc/+/581Nw5crY6Lt+JF81Fglz
|
||||
rDtiaCvpRdiihn9KVTIi98HOcigxG7rUk32oiFtpkIxAW0AbZCcJWC8CN2uzkudI
|
||||
t7O4b1nguMSmSyCNqtKHZY4nVRKKfrPbJN7rc0TZMjEpbfbpr+gLduuoiQsb1YwX
|
||||
SbPa42QPA9a10HruFAA4CRqdMtawaZir2Vqqcs5WY8wG+uTYFedA3qiZ1P00NHmk
|
||||
8zooKE2CtQyeMbKkTwIDAQABo4IC/jCCAvowHwYDVR0jBBgwFoAUjYxexFStiuF3
|
||||
6Zv5mwXhuAGNYeEwHQYDVR0OBBYEFE/J6yZvQbIdBxLNS+t2GbqLvgTDMA4GA1Ud
|
||||
DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
|
||||
BgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEW
|
||||
F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEE
|
||||
eDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29S
|
||||
U0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzAB
|
||||
hhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTApBgNVHREEIjAggg8qLmp1cnVuZW5z
|
||||
ZS5jb22CDWp1cnVuZW5zZS5jb20wggF8BgorBgEEAdZ5AgQCBIIBbASCAWgBZgB1
|
||||
AHb/iD8KtvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABiGoxLmkAAAQDAEYw
|
||||
RAIgTWumUgIKUROJcoqAEpRp5PydRzMxvKD33G8bb7TGRZcCIAYgfTDGJpCykGCN
|
||||
dH0ngsuZ8zKQlsg5xQAq/3XcIYMbAHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0
|
||||
vaQ9MEjX+6sAAAGIajEuyAAABAMARjBEAiBYx57ghakyP/o/gO7cijhU1/pMMbd/
|
||||
4cFJ5ByVFpPm+QIgXJJDn/4Nq5QOopgwyJPiYDwU+z951kxC/HeGh9bLEt0AdgDu
|
||||
zdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYhqMS6XAAAEAwBHMEUC
|
||||
IQD917OeqnMe9oQKlVv//E32VqqJUfpTkXbGEZ8q6ckX3AIgb5l//jjQ0RZnM3RA
|
||||
Ucw/unwxGcPP7Bo6HdRDYcMEkBkwDQYJKoZIhvcNAQELBQADggEBADsmDG2V6ZHU
|
||||
RxrRN4UdpKJSyYUZxnSMGTTo8t9nSEQ5WM3byZybQYcUm66wHi50lPwLNJPEV3rd
|
||||
2XhvJyESA2UpAxK12sWMPRXpa5WbEtDSq9xHPknzA2RsZHhh8P8vw2AwRfS/EQll
|
||||
UGFQkyqBA2MkdIw1ldPMnZM3FH6VXjrkq5CV6ib+TO0OnNNBIJRePHlSAMslxqiT
|
||||
wN7bvbWQMebapiZ/8CIx1CcRZLCBQBETFA71iPWqKAJVFPp1bh8XbHixv7Rfpn0F
|
||||
G2/HkK51y/ZYyKbgwW5WDq4/SabJD8palSlw8HBpMGXuZCCrxpd6kssj6Q9nmGSV
|
||||
gr5tfdYId24=
|
||||
-----END CERTIFICATE-----
|
||||
27
cert/jurunense.com.key
Normal file
27
cert/jurunense.com.key
Normal file
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEA8+98NUp5GOf7/tsmydF+rNVPmDbkJ3YVYu7QMN1QLbaP50kG
|
||||
5I5JBhirWFfP8R8WVE5MWHPMcMdj1B3n8dYm+IDNfvIwoZVR5khOogWlOsNc/+/5
|
||||
81Nw5crY6Lt+JF81FglzrDtiaCvpRdiihn9KVTIi98HOcigxG7rUk32oiFtpkIxA
|
||||
W0AbZCcJWC8CN2uzkudIt7O4b1nguMSmSyCNqtKHZY4nVRKKfrPbJN7rc0TZMjEp
|
||||
bfbpr+gLduuoiQsb1YwXSbPa42QPA9a10HruFAA4CRqdMtawaZir2Vqqcs5WY8wG
|
||||
+uTYFedA3qiZ1P00NHmk8zooKE2CtQyeMbKkTwIDAQABAoIBAQCtshfVsoPsMjQD
|
||||
03UZPC1hUDru/hcT6kdsPPTN9qkDA/4QCLX5xT9GMgbATzboUOSLf31pdntayv/Q
|
||||
qMLiN0VkqgKppDbwt+yrd01WnYJ8B2SPcgefNgkr93bgsbEuoQSh/nT5bQezeaEP
|
||||
dSS1dKovZBX2KXChZPEi97Qqmc2J2Xm5GMTnxYhfewkMt5YqbwHD4zesnZCW4hjZ
|
||||
9UP2YMjb0JeI1TOnDKiNSaZ5gGAWLeMYRV1qu6yZOUTG2v7zhhTW2Aqpxu0nU+Cp
|
||||
s7+7oh/2bXGgMVLLHUqL89g7B0KLksI6RMKatAOVWQHopnCPDpSA3Y7a85TRWNZW
|
||||
RJwtU5DBAoGBAPxiWPYEcHmM4pF7F0EqqDIy3aljs6Gsqi4aQdsf5CE4P4dWprLP
|
||||
Tg4DtjpKUt0jAN5+fXI3F/YmQbAUX43iK1K9jqN2LLbaR54URzPJ/5CO7luEScVE
|
||||
z0NDuUQDPLxosjaV99e1BxaHG3NXzXXMqDb4aA6djXQ76VfqzNl8pCqRAoGBAPdu
|
||||
Jql+IX2KlE43hGEBJjoC1B3Jm+PIt4hsEuq0A8JzVZLqgeCoN3Len2I7h/+p1nQ2
|
||||
HmTk3QCF65OitdogBxg/pcJfc2XUruahWlTsrXEcraso3mNSRqKxhFGJj1s+/ykM
|
||||
JFw3KTH0R6/k9+bQWUVBUuF0Tg1eoRrlqXG6wJDfAoGBAMev1K1KU+eINddfacXQ
|
||||
x2V4Y3NbhEv9/mQduE90ix5Rj8o4IArIBP0HqM2z8p4uzMg9kmmk95t1J3H2nKf4
|
||||
88gyXMIuhTBjwlhruO5b+43X2PWl1Gx1hfu1gMc0PIDh4WdY/tC31ZTYbzqylMiI
|
||||
letwXXx64em+YWCDUXMesBFRAoGBALnbV9dBE08F5VjLgviKsHgq38JwSlTT1Gj5
|
||||
JUx/Y8OQdtsgo+Zo9R2n8/kJ1qJIpPouHK6U6x0Ve1sugYMTQ8EHLi/PGxOGqso6
|
||||
sWvRTIcGj71duY7Jop1a0pWcyr4zl97xa+6I0LzhTWfmigAqyKOo6eTIREjup/1Y
|
||||
Petb6IHpAoGAcLSjSlqSOJrVDDqXGRnv1b/ThQDmay9vk0Mz8dytSw+L8BKy1whQ
|
||||
J2XMqZYtq6H5psV1u6qaH4w+0a9s5lQrTDzm3XTU6tJYQC06KlaLk3/J1EAl2zG6
|
||||
dQ46Ep3fcSt/MGvvoNvzaGRmhq8a/fPDq1/hvF0kIWnR43gi3v9BdI0=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
36
cert/jurunense.crt
Normal file
36
cert/jurunense.crt
Normal file
@@ -0,0 +1,36 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGPzCCBSegAwIBAgIRAOsZGPSnBumhZkpBFmGzLH8wDQYJKoZIhvcNAQELBQAw
|
||||
gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
||||
BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
|
||||
AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
|
||||
QTAeFw0yNDA2MDMwMDAwMDBaFw0yNTA2MDMyMzU5NTlaMB0xGzAZBgNVBAMMEiou
|
||||
anVydW5lbnNlLmNvbS5icjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||
AL2jeyLryQWyAMV9ZU+PrxkoHbYKJJGV+cS9oEutbmAKd+gWC73CizWmidWTd+0W
|
||||
OnV94nx23w4GO99ZeRcUQOUQaU1hDAdt7sHgtEUFAg4FlIrNFAdWNPG8Fz9sK4Z4
|
||||
QQ91mY26eH7i3/paO4HuuNTa9ai0g9GjKvBD7sU6MB0H14nNyJN4km07IsXq2yv1
|
||||
M55NWJ7OwtiyqHhzGZGbV29iucrctO/QcQA75OW5uH5Vq893BkFuG3cbROCuVNuA
|
||||
Pa2wh0oGiyrlaqQe+WG+hqStXM1YNQYCmSPKf6O6Ogjm6oNGi0Ri8LN6Ou2/9PGX
|
||||
lRQ+KILIrlLrfVmvh4q2/zsCAwEAAaOCAwUwggMBMB8GA1UdIwQYMBaAFI2MXsRU
|
||||
rYrhd+mb+ZsF4bgBjWHhMB0GA1UdDgQWBBTjZAm3a5xq9Le8HO3Q/T51FxWvETAO
|
||||
BgNVHQ8BAf8EBAMCBaAwDAYDVR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcD
|
||||
AQYIKwYBBQUHAwIwSQYDVR0gBEIwQDA0BgsrBgEEAbIxAQICBzAlMCMGCCsGAQUF
|
||||
BwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBAgEwgYQGCCsGAQUF
|
||||
BwEBBHgwdjBPBggrBgEFBQcwAoZDaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0
|
||||
aWdvUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNydDAjBggrBgEF
|
||||
BQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wLwYDVR0RBCgwJoISKi5qdXJ1
|
||||
bmVuc2UuY29tLmJyghBqdXJ1bmVuc2UuY29tLmJyMIIBfQYKKwYBBAHWeQIEAgSC
|
||||
AW0EggFpAWcAdgDPEVbu1S58r/OHW9lpLpvpGnFnSrAX7KwB0lt3zsw7CAAAAY/f
|
||||
7ksOAAAEAwBHMEUCIFWLlJdVKtigtLUxf60NSf0gJ9LVA/5QCOKNhVz38nG5AiEA
|
||||
lzyk+XkIhOo5cElp+Si6qN5FYWGKVhr6zRN0IamHDm8AdgCi4wrkRe+9rZt+OO1H
|
||||
Z3dT14JbhJTXK14bLMS5UKRH5wAAAY/f7krJAAAEAwBHMEUCIEM3Y9v9QJqJNQ9g
|
||||
wtFyaD6WFEN4F8y8CYi/6+mZMNlIAiEAtkJKuVBvxJaz1Mbrz1LF3cdp6gZUmDCx
|
||||
Whd/Wz2QMKQAdQBOdaMnXJoQwzhbbNTfP1LrHfDgjhuNacCx+mSxYpo53wAAAY/f
|
||||
7kqjAAAEAwBGMEQCIDHip6dLR3iCW+sUD4nFYLQXWSo90IvdlrdCzRu4iMaEAiBs
|
||||
Sq1W8g7LKgHy8wr89gnUSH/7eOlq3f+JRKtk5pMygDANBgkqhkiG9w0BAQsFAAOC
|
||||
AQEArE9fX5VyPNx0zxHeHEOgDNoNoRhI1X3T72quTQVb4nbLjf23oHNWQ2GieCTL
|
||||
CPAp1LdmctK25rD83hFD9cgovO2h1peYT63/DL1zsusDa1Qaa/4bi8OtqLe6BNE2
|
||||
GyLM/yd3JR1YOP9gR9363B8NfxvDoBII3+iqBFfpUwjsa6DpFlCpqRDO9BTrq+KZ
|
||||
4IRbJIBcEDNp+sajJqzpHU9N67a3sK7dyE73ByVwjGiuMN7vB2aqU4H/INEacbWw
|
||||
RO1UJ11DaCyi/k5x56xTRKlBFwXQcLm8oZl7pBqYsKEyadu1Apf7YAQGd54OCPr7
|
||||
mO2AEFA6SOmLDVFCBq58LGHjBA==
|
||||
-----END CERTIFICATE-----
|
||||
27
cert/jurunense.key
Normal file
27
cert/jurunense.key
Normal file
@@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEAvaN7IuvJBbIAxX1lT4+vGSgdtgokkZX5xL2gS61uYAp36BYL
|
||||
vcKLNaaJ1ZN37RY6dX3ifHbfDgY731l5FxRA5RBpTWEMB23uweC0RQUCDgWUis0U
|
||||
B1Y08bwXP2wrhnhBD3WZjbp4fuLf+lo7ge641Nr1qLSD0aMq8EPuxTowHQfXic3I
|
||||
k3iSbTsixerbK/Uznk1Yns7C2LKoeHMZkZtXb2K5yty079BxADvk5bm4flWrz3cG
|
||||
QW4bdxtE4K5U24A9rbCHSgaLKuVqpB75Yb6GpK1czVg1BgKZI8p/o7o6CObqg0aL
|
||||
RGLws3o67b/08ZeVFD4ogsiuUut9Wa+Hirb/OwIDAQABAoIBAEdv/kL5b5ClrYS3
|
||||
6CJAjkV7xzV8PKpbROvIQ0o+2wVy7BiRtXqWfrqHMgUyuEqnxP3dniQk44H09zj8
|
||||
C5GWH5wqwoBTvqRN1VNTwpT9ffiqQXrIJnNdFjS6FkfeB8dwJZIdSusJA7tI2/cD
|
||||
ZsdblmUY1tHmroGaZeJ8tMW3VciZNSKgYk9JzTNe0zJlnsimw9aZ8LcwFth9vwJI
|
||||
tlI6x72IpBD2062n81Xasm1pe1atPYXcWkF7divgWJ3ATZSx2VpUMZF8xy9Sjevg
|
||||
JD5dr4AtAZ8HUBOeTecq4VlCHmSSARzEsb8ttMOByahIODA/ktwcGkdlRZD7OOtH
|
||||
KCVz8AECgYEA7nkRU+s2+xw7Gn+DtY/U0hwNL3KU7K9yhilJ7ca2F41tDB6q0qb6
|
||||
5GNHpQ3RabBPwCTwTsKJzUtNc3BppsUWe7quvywZ/+tPVOgwycBVhstHxLPGSEMW
|
||||
6xPuY1KwGM5TeGdCbUXG6y3QJEb4wWq/J/ELTM1XmxQOj/8T4HB737sCgYEAy5OV
|
||||
FW2Qb1x9OgkXKnBvOY05SFoswAGM33JrcjDrSOvpDXgm4rxabvAYf3gNtn9K5VRQ
|
||||
9eaG0X8GA+UkirJf/TgNGy3eWgNs97h3ZJJK02hINZcSWVHJUhc8FaMhHK4LrAZj
|
||||
MwZptbThiDIfoHEyUU8s/DDiQfet3y8jf3wopoECgYEAuixSVs2fEtOrYLiEPs6X
|
||||
O6EiuhQeJ9mg8xRw3uzvY9vJcljOy74IyRyo5javcm9vE3bDFPnTUy6ivKjaEpRz
|
||||
RQ0tN5page1W9dZ/oEJDgwRYdzxSZD/cOJJK3cfEKtmJWMpklaKP9TLC+E9gDMAl
|
||||
lC0ewUreRfeWltxwzBuE2dkCgYEAx0MJphO8UIRjPq8vMacj9104OI2rR7U8wmoo
|
||||
qXkglBv13e1BgqWCjxwLnplQMtWd5aMGK+sdA2ol5SIhBnFaa2y1x2i6P7kiq8av
|
||||
do2LGCr2ox3gI/Vd7TA466TlAEGLwzHtX0BjsCwApWMKeezSp6usCJ2AmblpQw/M
|
||||
2zgYQgECgYEAgijd2EVLLvpl83Lp2ExuReUHe6uHxL2TvP2R0JiiNvUxZFrThPCQ
|
||||
BIo3aZ8UgMshdehFBKtRMiXK2HGsQGGYTZAP0fFrV8CdW8Da991SIcIPYDpSnuHK
|
||||
sfdXhZ7wjE9VTd3drKOx+tvjSyfiuTn1Q8C1At2Q1R03RVSL2Z4vTlw=
|
||||
-----END RSA PRIVATE KEY-----
|
||||
36
cert/jurunense1ano.crt
Normal file
36
cert/jurunense1ano.crt
Normal file
@@ -0,0 +1,36 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGNDCCBRygAwIBAgIQPXJcTfmIIxc0dhkm872DGTANBgkqhkiG9w0BAQsFADCB
|
||||
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
||||
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
|
||||
Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB
|
||||
MB4XDTIzMDUzMDAwMDAwMFoXDTI0MDUyOTIzNTk1OVowGjEYMBYGA1UEAwwPKi5q
|
||||
dXJ1bmVuc2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+98
|
||||
NUp5GOf7/tsmydF+rNVPmDbkJ3YVYu7QMN1QLbaP50kG5I5JBhirWFfP8R8WVE5M
|
||||
WHPMcMdj1B3n8dYm+IDNfvIwoZVR5khOogWlOsNc/+/581Nw5crY6Lt+JF81Fglz
|
||||
rDtiaCvpRdiihn9KVTIi98HOcigxG7rUk32oiFtpkIxAW0AbZCcJWC8CN2uzkudI
|
||||
t7O4b1nguMSmSyCNqtKHZY4nVRKKfrPbJN7rc0TZMjEpbfbpr+gLduuoiQsb1YwX
|
||||
SbPa42QPA9a10HruFAA4CRqdMtawaZir2Vqqcs5WY8wG+uTYFedA3qiZ1P00NHmk
|
||||
8zooKE2CtQyeMbKkTwIDAQABo4IC/jCCAvowHwYDVR0jBBgwFoAUjYxexFStiuF3
|
||||
6Zv5mwXhuAGNYeEwHQYDVR0OBBYEFE/J6yZvQbIdBxLNS+t2GbqLvgTDMA4GA1Ud
|
||||
DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
|
||||
BgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEW
|
||||
F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEE
|
||||
eDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29S
|
||||
U0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzAB
|
||||
hhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTApBgNVHREEIjAggg8qLmp1cnVuZW5z
|
||||
ZS5jb22CDWp1cnVuZW5zZS5jb20wggF8BgorBgEEAdZ5AgQCBIIBbASCAWgBZgB1
|
||||
AHb/iD8KtvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABiGoxLmkAAAQDAEYw
|
||||
RAIgTWumUgIKUROJcoqAEpRp5PydRzMxvKD33G8bb7TGRZcCIAYgfTDGJpCykGCN
|
||||
dH0ngsuZ8zKQlsg5xQAq/3XcIYMbAHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0
|
||||
vaQ9MEjX+6sAAAGIajEuyAAABAMARjBEAiBYx57ghakyP/o/gO7cijhU1/pMMbd/
|
||||
4cFJ5ByVFpPm+QIgXJJDn/4Nq5QOopgwyJPiYDwU+z951kxC/HeGh9bLEt0AdgDu
|
||||
zdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYhqMS6XAAAEAwBHMEUC
|
||||
IQD917OeqnMe9oQKlVv//E32VqqJUfpTkXbGEZ8q6ckX3AIgb5l//jjQ0RZnM3RA
|
||||
Ucw/unwxGcPP7Bo6HdRDYcMEkBkwDQYJKoZIhvcNAQELBQADggEBADsmDG2V6ZHU
|
||||
RxrRN4UdpKJSyYUZxnSMGTTo8t9nSEQ5WM3byZybQYcUm66wHi50lPwLNJPEV3rd
|
||||
2XhvJyESA2UpAxK12sWMPRXpa5WbEtDSq9xHPknzA2RsZHhh8P8vw2AwRfS/EQll
|
||||
UGFQkyqBA2MkdIw1ldPMnZM3FH6VXjrkq5CV6ib+TO0OnNNBIJRePHlSAMslxqiT
|
||||
wN7bvbWQMebapiZ/8CIx1CcRZLCBQBETFA71iPWqKAJVFPp1bh8XbHixv7Rfpn0F
|
||||
G2/HkK51y/ZYyKbgwW5WDq4/SabJD8palSlw8HBpMGXuZCCrxpd6kssj6Q9nmGSV
|
||||
gr5tfdYId24=
|
||||
-----END CERTIFICATE-----
|
||||
40
cert/jurunense1ano.pem
Normal file
40
cert/jurunense1ano.pem
Normal file
@@ -0,0 +1,40 @@
|
||||
Bag Attributes
|
||||
localKeyID: 2D 25 1B 5D 87 26 79 F5 37 F4 D2 91 90 99 0A FC 83 B8 DE 6D
|
||||
subject=/CN=*.jurunense.com
|
||||
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=Sectigo Limited/CN=Sectigo RSA Domain Validation Secure Server CA
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGNDCCBRygAwIBAgIQPXJcTfmIIxc0dhkm872DGTANBgkqhkiG9w0BAQsFADCB
|
||||
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
||||
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
|
||||
Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB
|
||||
MB4XDTIzMDUzMDAwMDAwMFoXDTI0MDUyOTIzNTk1OVowGjEYMBYGA1UEAwwPKi5q
|
||||
dXJ1bmVuc2UuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+98
|
||||
NUp5GOf7/tsmydF+rNVPmDbkJ3YVYu7QMN1QLbaP50kG5I5JBhirWFfP8R8WVE5M
|
||||
WHPMcMdj1B3n8dYm+IDNfvIwoZVR5khOogWlOsNc/+/581Nw5crY6Lt+JF81Fglz
|
||||
rDtiaCvpRdiihn9KVTIi98HOcigxG7rUk32oiFtpkIxAW0AbZCcJWC8CN2uzkudI
|
||||
t7O4b1nguMSmSyCNqtKHZY4nVRKKfrPbJN7rc0TZMjEpbfbpr+gLduuoiQsb1YwX
|
||||
SbPa42QPA9a10HruFAA4CRqdMtawaZir2Vqqcs5WY8wG+uTYFedA3qiZ1P00NHmk
|
||||
8zooKE2CtQyeMbKkTwIDAQABo4IC/jCCAvowHwYDVR0jBBgwFoAUjYxexFStiuF3
|
||||
6Zv5mwXhuAGNYeEwHQYDVR0OBBYEFE/J6yZvQbIdBxLNS+t2GbqLvgTDMA4GA1Ud
|
||||
DwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
|
||||
BgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEW
|
||||
F2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEE
|
||||
eDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29S
|
||||
U0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzAB
|
||||
hhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTApBgNVHREEIjAggg8qLmp1cnVuZW5z
|
||||
ZS5jb22CDWp1cnVuZW5zZS5jb20wggF8BgorBgEEAdZ5AgQCBIIBbASCAWgBZgB1
|
||||
AHb/iD8KtvuVUcJhzPWHujS0pM27KdxoQgqf5mdMWjp0AAABiGoxLmkAAAQDAEYw
|
||||
RAIgTWumUgIKUROJcoqAEpRp5PydRzMxvKD33G8bb7TGRZcCIAYgfTDGJpCykGCN
|
||||
dH0ngsuZ8zKQlsg5xQAq/3XcIYMbAHUA2ra/az+1tiKfm8K7XGvocJFxbLtRhIU0
|
||||
vaQ9MEjX+6sAAAGIajEuyAAABAMARjBEAiBYx57ghakyP/o/gO7cijhU1/pMMbd/
|
||||
4cFJ5ByVFpPm+QIgXJJDn/4Nq5QOopgwyJPiYDwU+z951kxC/HeGh9bLEt0AdgDu
|
||||
zdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYhqMS6XAAAEAwBHMEUC
|
||||
IQD917OeqnMe9oQKlVv//E32VqqJUfpTkXbGEZ8q6ckX3AIgb5l//jjQ0RZnM3RA
|
||||
Ucw/unwxGcPP7Bo6HdRDYcMEkBkwDQYJKoZIhvcNAQELBQADggEBADsmDG2V6ZHU
|
||||
RxrRN4UdpKJSyYUZxnSMGTTo8t9nSEQ5WM3byZybQYcUm66wHi50lPwLNJPEV3rd
|
||||
2XhvJyESA2UpAxK12sWMPRXpa5WbEtDSq9xHPknzA2RsZHhh8P8vw2AwRfS/EQll
|
||||
UGFQkyqBA2MkdIw1ldPMnZM3FH6VXjrkq5CV6ib+TO0OnNNBIJRePHlSAMslxqiT
|
||||
wN7bvbWQMebapiZ/8CIx1CcRZLCBQBETFA71iPWqKAJVFPp1bh8XbHixv7Rfpn0F
|
||||
G2/HkK51y/ZYyKbgwW5WDq4/SabJD8palSlw8HBpMGXuZCCrxpd6kssj6Q9nmGSV
|
||||
gr5tfdYId24=
|
||||
-----END CERTIFICATE-----
|
||||
BIN
cert/jurunense1ano.pfx
Normal file
BIN
cert/jurunense1ano.pfx
Normal file
Binary file not shown.
4
nest-cli.json
Normal file
4
nest-cli.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"collection": "@nestjs/schematics",
|
||||
"sourceRoot": "src"
|
||||
}
|
||||
11989
package-lock.json
generated
Normal file
11989
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
90
package.json
Normal file
90
package.json
Normal file
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"name": "api-padrao",
|
||||
"version": "0.0.1",
|
||||
"description": "",
|
||||
"author": "",
|
||||
"private": true,
|
||||
"license": "UNLICENSED",
|
||||
"scripts": {
|
||||
"prebuild": "rimraf dist",
|
||||
"build": "nest build",
|
||||
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||
"start": "nest start",
|
||||
"start:dev": "nest start --watch",
|
||||
"start:debug": "nest start --debug --watch",
|
||||
"start:prod": "node dist/main",
|
||||
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
||||
"test": "jest",
|
||||
"test:watch": "jest --watch",
|
||||
"test:cov": "jest --coverage",
|
||||
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
||||
"test:e2e": "jest --config ./test/jest-e2e.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/axios": "^3.1.3",
|
||||
"@nestjs/common": "^7.5.1",
|
||||
"@nestjs/core": "^7.5.1",
|
||||
"@nestjs/jwt": "^10.2.0",
|
||||
"@nestjs/passport": "^10.0.3",
|
||||
"@nestjs/platform-express": "^7.5.1",
|
||||
"@nestjs/typeorm": "^10.0.2",
|
||||
"aws-sdk": "^2.1692.0",
|
||||
"axios": "^1.7.9",
|
||||
"fs": "0.0.1-security",
|
||||
"guid-typescript": "^1.0.9",
|
||||
"https": "^1.0.0",
|
||||
"md5": "^2.3.0",
|
||||
"md5-typescript": "^1.0.5",
|
||||
"multer": "^1.4.5-lts.2",
|
||||
"oracledb": "^5.5.0",
|
||||
"passport": "^0.7.0",
|
||||
"passport-http-bearer": "^1.0.1",
|
||||
"passport-jwt": "^4.0.1",
|
||||
"path": "^0.12.7",
|
||||
"pg": "^8.13.3",
|
||||
"reflect-metadata": "^0.1.14",
|
||||
"rimraf": "^3.0.2",
|
||||
"rxjs": "^7.8.0",
|
||||
"typeorm": "^0.3.20"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nestjs/cli": "^7.5.1",
|
||||
"@nestjs/schematics": "^7.1.3",
|
||||
"@nestjs/testing": "^7.5.1",
|
||||
"@types/express": "^4.17.8",
|
||||
"@types/jest": "^26.0.15",
|
||||
"@types/multer": "^1.4.12",
|
||||
"@types/node": "^14.14.6",
|
||||
"@types/supertest": "^2.0.10",
|
||||
"@typescript-eslint/eslint-plugin": "^4.6.1",
|
||||
"@typescript-eslint/parser": "^4.6.1",
|
||||
"eslint": "^7.12.1",
|
||||
"eslint-config-prettier": "^6.15.0",
|
||||
"eslint-plugin-prettier": "^3.1.4",
|
||||
"jest": "^26.6.3",
|
||||
"prettier": "^2.1.2",
|
||||
"supertest": "^6.0.0",
|
||||
"ts-jest": "^26.4.3",
|
||||
"ts-loader": "^8.0.8",
|
||||
"ts-node": "^9.0.0",
|
||||
"tsconfig-paths": "^3.9.0",
|
||||
"typescript": "^4.0.5"
|
||||
},
|
||||
"jest": {
|
||||
"moduleFileExtensions": [
|
||||
"js",
|
||||
"json",
|
||||
"ts"
|
||||
],
|
||||
"rootDir": "src",
|
||||
"testRegex": ".*\\.spec\\.ts$",
|
||||
"transform": {
|
||||
"^.+\\.(t|j)s$": "ts-jest"
|
||||
},
|
||||
"collectCoverageFrom": [
|
||||
"**/*.(t|j)s"
|
||||
],
|
||||
"coverageDirectory": "../coverage",
|
||||
"testEnvironment": "node"
|
||||
}
|
||||
}
|
||||
22
src/app.controller.spec.ts
Normal file
22
src/app.controller.spec.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { AppController } from './app.controller';
|
||||
import { AppService } from './app.service';
|
||||
|
||||
describe('AppController', () => {
|
||||
let appController: AppController;
|
||||
|
||||
beforeEach(async () => {
|
||||
const app: TestingModule = await Test.createTestingModule({
|
||||
controllers: [AppController],
|
||||
providers: [AppService],
|
||||
}).compile();
|
||||
|
||||
appController = app.get<AppController>(AppController);
|
||||
});
|
||||
|
||||
describe('root', () => {
|
||||
it('should return "Hello World!"', () => {
|
||||
expect(appController.getHello()).toBe('Hello World!');
|
||||
});
|
||||
});
|
||||
});
|
||||
12
src/app.controller.ts
Normal file
12
src/app.controller.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { Controller, Get } from '@nestjs/common';
|
||||
import { AppService } from './app.service';
|
||||
|
||||
@Controller()
|
||||
export class AppController {
|
||||
constructor(private readonly appService: AppService) {}
|
||||
|
||||
@Get()
|
||||
getHello(): string {
|
||||
return this.appService.getHello();
|
||||
}
|
||||
}
|
||||
46
src/app.module.ts
Normal file
46
src/app.module.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { BaseModule } from './core/services/base.module';
|
||||
import { BaseService } from './core/services/base.service';
|
||||
import { LogisticModule } from './logistic/logistic.module';
|
||||
import { OrdersPaymentModule } from './orders-payment/orders-payment.module';
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/* eslint-disable prettier/prettier */
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { AppController } from './app.controller';
|
||||
import { AppService } from './app.service';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { typeOrmConfig, typeOrmPgConfig } from './core/configs/typeorm.config';
|
||||
import { ProductsModule } from './products/products.module';
|
||||
import { AuthModule } from './auth/auth/auth.module';
|
||||
import { DataConsultModule } from './data-consult/data-consult.module';
|
||||
import { OrdersModule } from './orders/orders.module';
|
||||
import { OcorrencesController } from './crm/occurrences/ocorrences.controller';
|
||||
import { OccurrencesModule } from './crm/occurrences/occurrences.module';
|
||||
import { ReasonTableModule } from './crm/reason-table/reason-table.module';
|
||||
import { NegotiationsModule } from './crm/negotiations/negotiations.module';
|
||||
import { HttpModule } from '@nestjs/axios';
|
||||
import { LogisticController } from './logistic/logistic.controller';
|
||||
import { LogisticService } from './logistic/logistic.service';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
BaseModule,
|
||||
LogisticModule,
|
||||
OrdersPaymentModule,
|
||||
HttpModule,
|
||||
NegotiationsModule,
|
||||
OccurrencesModule,
|
||||
ReasonTableModule,
|
||||
DataConsultModule,
|
||||
ProductsModule,
|
||||
AuthModule,
|
||||
OrdersModule,
|
||||
TypeOrmModule.forRoot(typeOrmConfig),
|
||||
TypeOrmModule.forRoot(typeOrmPgConfig),
|
||||
],
|
||||
controllers: [
|
||||
OcorrencesController, AppController, LogisticController,],
|
||||
providers: [
|
||||
BaseService, AppService, LogisticService,],
|
||||
})
|
||||
export class AppModule { }
|
||||
8
src/app.service.ts
Normal file
8
src/app.service.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
@Injectable()
|
||||
export class AppService {
|
||||
getHello(): string {
|
||||
return 'Hello World!';
|
||||
}
|
||||
}
|
||||
72
src/auth/auth/auth.controller.ts
Normal file
72
src/auth/auth/auth.controller.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
Post,
|
||||
} from '@nestjs/common';
|
||||
import { AuthService } from './auth.service';
|
||||
import { UsersService } from '../users/users.service';
|
||||
import { UserModel } from 'src/core/models/user.model';
|
||||
import { ResultModel } from 'src/core/models/result.model';
|
||||
import { ResetPasswordModel } from 'src/core/models/reset-password.model';
|
||||
import { ChangePasswordModel } from 'src/core/models/change-password.model';
|
||||
|
||||
@Controller('api/v1/auth')
|
||||
export class AuthController {
|
||||
constructor(
|
||||
private usersService: UsersService,
|
||||
private authService: AuthService,
|
||||
) { }
|
||||
|
||||
@Post('login')
|
||||
async login(@Body() model: UserModel): Promise<any> {
|
||||
const user = await this.usersService.authenticate(model);
|
||||
if (!user)
|
||||
throw new HttpException(
|
||||
new ResultModel(false, 'Usuário ou senha inválidos.', null, null),
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
|
||||
const token = await this.authService.createToken(
|
||||
user.id,
|
||||
user.sellerId,
|
||||
user.username,
|
||||
user.email,
|
||||
user.storeId
|
||||
);
|
||||
|
||||
return {
|
||||
id: user.id,
|
||||
sellerId: user.sellerId,
|
||||
name: user.name,
|
||||
username: user.name,
|
||||
storeId: user.storeId,
|
||||
email: user.email,
|
||||
token: token,
|
||||
};
|
||||
}
|
||||
|
||||
@Post('reset-password')
|
||||
async resetPassword(@Body() resetPassword: ResetPasswordModel) {
|
||||
const response = await this.usersService.resetPassword(resetPassword);
|
||||
if (response == null) {
|
||||
throw new HttpException('Usuário não foi encontrado', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
return { message: 'Senha alterada com sucesso! Foi enviado email com a nova senha!' };
|
||||
|
||||
}
|
||||
|
||||
@Post('change-password')
|
||||
async changePassword(@Body() changePassword: ChangePasswordModel) {
|
||||
const response = await this.usersService.changePassword(changePassword);
|
||||
if (response == null) {
|
||||
throw new HttpException('Usuário não foi encontrado', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
return { message: 'Senha alterada com sucesso!' };
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
26
src/auth/auth/auth.module.ts
Normal file
26
src/auth/auth/auth.module.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Module } from '@nestjs/common';
|
||||
import { AuthController } from './auth.controller';
|
||||
import { AuthService } from './auth.service';
|
||||
import { JwtModule, JwtService } from '@nestjs/jwt';
|
||||
import { PassportModule } from '@nestjs/passport';
|
||||
import { UsersModule } from '../users/users.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
UsersModule,
|
||||
PassportModule.register({
|
||||
defaultStrategy: 'jwt',
|
||||
}),
|
||||
JwtModule.register({
|
||||
secret: '4557C0D7-DFB0-40DA-BF83-91A75103F7A9',
|
||||
signOptions: {
|
||||
expiresIn: 3600,
|
||||
},
|
||||
}),
|
||||
],
|
||||
controllers: [AuthController],
|
||||
providers: [AuthService],
|
||||
exports: [AuthService],
|
||||
})
|
||||
export class AuthModule {}
|
||||
32
src/auth/auth/auth.service.ts
Normal file
32
src/auth/auth/auth.service.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { JwtService, JwtSignOptions } from '@nestjs/jwt';
|
||||
import { UsersService } from '../users/users.service';
|
||||
import { JwtPayload } from '../models/jwt-payload.model';
|
||||
|
||||
|
||||
@Injectable()
|
||||
export class AuthService {
|
||||
constructor(
|
||||
private readonly usersService: UsersService,
|
||||
private readonly jwtService: JwtService,
|
||||
) {}
|
||||
|
||||
async createToken(id: number, sellerId: number, username: string, email: string, storeId: string) {
|
||||
const user: JwtPayload = {
|
||||
id: id,
|
||||
sellerId: sellerId,
|
||||
storeId: storeId,
|
||||
username: username,
|
||||
email: email,
|
||||
};
|
||||
const options: JwtSignOptions = { expiresIn: '8h' };
|
||||
return this.jwtService.sign(user, options);
|
||||
}
|
||||
|
||||
async validateUser(payload: JwtPayload): Promise<any> {
|
||||
//return await this.accountService.findOneByUsername(payload.username);
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
9
src/auth/models/jwt-payload.model.ts
Normal file
9
src/auth/models/jwt-payload.model.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
export interface JwtPayload {
|
||||
id: number;
|
||||
sellerId: number;
|
||||
storeId: string;
|
||||
username: string;
|
||||
email: string;
|
||||
}
|
||||
|
||||
24
src/auth/strategies/jwt-strategy.ts
Normal file
24
src/auth/strategies/jwt-strategy.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Injectable, UnauthorizedException } from '@nestjs/common';
|
||||
import { PassportStrategy } from '@nestjs/passport';
|
||||
import { ExtractJwt, Strategy } from 'passport-jwt';
|
||||
import { JwtPayload } from '../models/jwt-payload.model';
|
||||
import { AuthService } from '../auth/auth.service';
|
||||
|
||||
@Injectable()
|
||||
export class JwtStrategy extends PassportStrategy(Strategy) {
|
||||
constructor(private readonly authService: AuthService) {
|
||||
super({
|
||||
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
|
||||
secretOrKeyProvider: '4557C0D7-DFB0-40DA-BF83-91A75103F7A9', //secretOrKey
|
||||
});
|
||||
}
|
||||
|
||||
async validate(payload: JwtPayload) {
|
||||
const user = await this.authService.validateUser(payload);
|
||||
if (!user) {
|
||||
throw new UnauthorizedException();
|
||||
}
|
||||
return user;
|
||||
}
|
||||
}
|
||||
10
src/auth/users/users.module.ts
Normal file
10
src/auth/users/users.module.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { Module } from '@nestjs/common';
|
||||
import { UsersService } from './users.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
providers: [UsersService],
|
||||
exports: [UsersService],
|
||||
})
|
||||
export class UsersModule {}
|
||||
18
src/auth/users/users.service.spec.ts
Normal file
18
src/auth/users/users.service.spec.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { UsersService } from './users.service';
|
||||
|
||||
describe('UsersService', () => {
|
||||
let service: UsersService;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
providers: [UsersService],
|
||||
}).compile();
|
||||
|
||||
service = module.get<UsersService>(UsersService);
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(service).toBeDefined();
|
||||
});
|
||||
});
|
||||
152
src/auth/users/users.service.ts
Normal file
152
src/auth/users/users.service.ts
Normal file
@@ -0,0 +1,152 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
||||
import { DataSource } from 'typeorm';
|
||||
import md5 = require('md5');
|
||||
import { Guid } from "guid-typescript";
|
||||
import { typeOrmConfig } from 'src/core/configs/typeorm.config';
|
||||
import { UserModel } from 'src/core/models/user.model';
|
||||
|
||||
|
||||
@Injectable()
|
||||
export class UsersService {
|
||||
async authenticate(user: any): Promise<any> {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCEMPR.MATRICULA AS "id"
|
||||
,PCEMPR.NOME AS "name"
|
||||
,PCEMPR.CODUSUR AS "sellerId"
|
||||
,PCEMPR.CODFILIAL AS "storeId"
|
||||
,PCEMPR.EMAIL AS "email"
|
||||
,PCEMPR.DTDEMISSAO as "dataDesligamento"
|
||||
,PCEMPR.SITUACAO as "situacao"
|
||||
FROM PCEMPR
|
||||
WHERE PCEMPR.USUARIOBD = '${user.userName}'
|
||||
AND PCEMPR.SENHABD = CRYPT('${user.password.toUpperCase()}', PCEMPR.USUARIOBD) `;
|
||||
|
||||
|
||||
const users = await queryRunner.manager.query(sql);
|
||||
|
||||
if (users.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const userDb = users[0];
|
||||
|
||||
if ( userDb.dataDesligamento !== null ) {
|
||||
throw new HttpException('Usuário desligado da empresa, login não permitido!', HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
if ( userDb.situacao == 'I' ) {
|
||||
throw new HttpException('Usuário inativo, login não permitido!', HttpStatus.FORBIDDEN);
|
||||
}
|
||||
return userDb;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async resetPassword(user: any): Promise<any> {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
let sql =
|
||||
'SELECT PCUSUARI.CODUSUR as "sellerId" ' +
|
||||
' ,PCUSUARI.NOME as "name" ' +
|
||||
' ,PCUSUARI.EMAIL as "email" ' +
|
||||
' FROM PCUSUARI ' +
|
||||
` WHERE REGEXP_REPLACE(PCUSUARI.CPF, '[^0-9]', '') = REGEXP_REPLACE(:1, '[^0-9]', '') ` +
|
||||
` AND PCUSUARI.EMAIL = :2 `;
|
||||
|
||||
const users = await queryRunner.manager.query(sql, [
|
||||
user.document,
|
||||
user.email,
|
||||
]);
|
||||
|
||||
if (users.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const guid = Guid.create();
|
||||
console.log(guid.toString());
|
||||
const password = guid.toString().substring(0, 8);
|
||||
const newPassword = md5(password).toUpperCase();
|
||||
console.log("Senha:" + newPassword)
|
||||
sql = `UPDATE PCUSUARI SET ` +
|
||||
` SENHALOGIN = :1 ` +
|
||||
`WHERE CODUSUR = :2`;
|
||||
await queryRunner.manager.query(sql, [newPassword, users[0].sellerId]);
|
||||
|
||||
const sqlEmail = `INSERT INTO CORRESPONDENCIAS ( CORRESPONDENCIA_ID, DTINCLUSAO, TITULO, MENSAGEM, EMAIL, DESTINATARIO )
|
||||
VALUES ( SEQ_CORRESPONDENCIAS.NEXTVAL, SYSDATE, 'Alteração de email - CoteLivia',
|
||||
'Sua senha para acesso ao portal COTELIVIA é ${password}', '${users[0].email}', '${users[0].email}' )`;
|
||||
await queryRunner.manager.query(sqlEmail);
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
const userDb = users[0];
|
||||
return userDb;
|
||||
} catch (error) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
console.log(error);
|
||||
throw new Error(error);
|
||||
}
|
||||
finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async changePassword(user: any): Promise<any> {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
console.log(JSON.stringify(user));
|
||||
try {
|
||||
let sql =
|
||||
'SELECT PCUSUARI.CODUSUR as "sellerId" ' +
|
||||
' ,PCUSUARI.NOME as "name" ' +
|
||||
' ,PCUSUARI.EMAIL as "email" ' +
|
||||
' FROM PCUSUARI ' +
|
||||
` WHERE PCUSUARI.CODUSUR = :1` +
|
||||
` AND PCUSUARI.SENHALOGIN = :2 `;
|
||||
|
||||
const users = await queryRunner.manager.query(sql, [
|
||||
user.id,
|
||||
md5(user.password).toUpperCase(),
|
||||
]);
|
||||
|
||||
if (users.length == 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
sql = `UPDATE PCUSUARI SET ` +
|
||||
` SENHALOGIN = :1 ` +
|
||||
`WHERE CODUSUR = :2`;
|
||||
await queryRunner.manager.query(sql, [md5(user.newPassword).toUpperCase(), users[0].sellerId]);
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
const userDb = users[0];
|
||||
return userDb;
|
||||
} catch (error) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
console.log(error);
|
||||
throw new Error(error);
|
||||
}
|
||||
finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
22
src/core/configs/typeorm.config.ts
Normal file
22
src/core/configs/typeorm.config.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
import { DataSourceOptions } from 'typeorm/data-source';
|
||||
|
||||
export const typeOrmConfig: DataSourceOptions = {
|
||||
type: 'oracle',
|
||||
connectString: '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.1.241)(PORT = 1521)))(CONNECT_DATA = (SERVICE_NAME = WINT)))',
|
||||
username: 'SEVEN',
|
||||
password: 'USR54SEV',
|
||||
synchronize: false,
|
||||
logging: false,
|
||||
entities: [__dirname + '/../**/*.entity.{js,ts}'],
|
||||
};
|
||||
|
||||
export const typeOrmPgConfig: DataSourceOptions = {
|
||||
type: 'postgres',
|
||||
host: '10.1.1.222',
|
||||
port: 5432,
|
||||
username: 'ti',
|
||||
password: 'ti',
|
||||
database: 'ksdb',
|
||||
synchronize: true,
|
||||
}
|
||||
25
src/core/models/car-in-delivery.model.ts
Normal file
25
src/core/models/car-in-delivery.model.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
export class Invoice {
|
||||
customer: string;
|
||||
invoiceNumber: number;
|
||||
loadingNumber: number;
|
||||
reasonId: number;
|
||||
reasonText: string;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export class CarInDelivery {
|
||||
finalKm: number;
|
||||
invoices: Invoice[];
|
||||
licensePlate: string;
|
||||
loadingNumber: number;
|
||||
observation: string;
|
||||
images: string[];
|
||||
userId: number;
|
||||
qtdPaletesPbr: number;
|
||||
qtdPaletesCim: number;
|
||||
qtdPaletesDes: number;
|
||||
remnant: string;
|
||||
observationRemnant: string;
|
||||
imagesRemnant: string[];
|
||||
|
||||
}
|
||||
18
src/core/models/car-out-delivery.model.ts
Normal file
18
src/core/models/car-out-delivery.model.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
export class CarOutDelivery {
|
||||
helpers: Helper[]; // Array de objetos auxiliares
|
||||
licensePlate: string; // Placa do veículo
|
||||
numberLoading: number[]; // Número do carregamento
|
||||
palletCount: number; // Quantidade de pallets
|
||||
photos: string[]; // Array de URLs das fotos
|
||||
startKm: number; // Quilometragem de início (como string)
|
||||
userCode: number; // Código do usuário
|
||||
vehicleCode: number; // Código do veículo
|
||||
}
|
||||
|
||||
|
||||
export class Helper {
|
||||
id: number;
|
||||
name: string;
|
||||
phone: string;
|
||||
}
|
||||
|
||||
6
src/core/models/change-password.model.ts
Normal file
6
src/core/models/change-password.model.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
export class ChangePasswordModel {
|
||||
id: number;
|
||||
password: string;
|
||||
newPassword: string;
|
||||
}
|
||||
6
src/core/models/exposed-product.model.ts
Normal file
6
src/core/models/exposed-product.model.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
export class ExposedProduct {
|
||||
ean: string;
|
||||
storeId: string;
|
||||
userId: number;
|
||||
}
|
||||
5
src/core/models/reset-password.model.ts
Normal file
5
src/core/models/reset-password.model.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
export class ResetPasswordModel {
|
||||
document: string;
|
||||
email: string;
|
||||
}
|
||||
9
src/core/models/result.model.ts
Normal file
9
src/core/models/result.model.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
export class ResultModel {
|
||||
|
||||
constructor(
|
||||
public success: boolean,
|
||||
public message: string,
|
||||
public data: any,
|
||||
public errors: any) {};
|
||||
}
|
||||
8
src/core/models/user.model.ts
Normal file
8
src/core/models/user.model.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
export class UserModel {
|
||||
id: number;
|
||||
password: string;
|
||||
application: string;
|
||||
storeId: string;
|
||||
sellerId: number;
|
||||
email: string;
|
||||
}
|
||||
94
src/core/services/base.controller.ts
Normal file
94
src/core/services/base.controller.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
import { DropAction } from './../../../node_modules/aws-sdk/clients/mailmanager.d';
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import {
|
||||
Body, Controller, Get, HttpException, HttpStatus, Post, Query, Req, UseInterceptors,
|
||||
UploadedFile
|
||||
} from '@nestjs/common';
|
||||
import { BaseService } from './base.service';
|
||||
import { FileInterceptor } from '@nestjs/platform-express';
|
||||
import { diskStorage } from 'multer';
|
||||
import { extname } from 'path';
|
||||
import * as fs from "fs";
|
||||
|
||||
@Controller('api/v1/base')
|
||||
export class BaseController {
|
||||
constructor(public readonly baseService: BaseService) { }
|
||||
// @UseGuards(JwtAuthGuard)
|
||||
@Get('execute-view')
|
||||
/* @ApiOperation({
|
||||
summary: 'Executa uma view com ou sem parâmetros',
|
||||
})
|
||||
@ApiResponse({
|
||||
status: 200,
|
||||
description: 'Dados retornados com sucesso.',
|
||||
})
|
||||
@ApiResponse({
|
||||
status: 400,
|
||||
description: 'O nome da view é obrigatório.',
|
||||
})
|
||||
@ApiResponse({
|
||||
status: 500,
|
||||
description: 'Erro ao executar a view.',
|
||||
})*/
|
||||
async executeView(
|
||||
@Query('viewName') viewName: string,
|
||||
@Query() params: Record<string, any>,
|
||||
) {
|
||||
if (!viewName) {
|
||||
throw new HttpException(
|
||||
'O nome da view é obrigatório.',
|
||||
HttpStatus.BAD_REQUEST,
|
||||
);
|
||||
}
|
||||
try {
|
||||
return await this.baseService.executeView(viewName, params);
|
||||
} catch (error) {
|
||||
throw new HttpException(
|
||||
`Erro ao executar a view: ${error.message}`,
|
||||
HttpStatus.INTERNAL_SERVER_ERROR,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Post('send-image')
|
||||
@UseInterceptors(
|
||||
FileInterceptor('file', {
|
||||
storage: diskStorage({
|
||||
// Pasta onde os arquivos serão salvos; certifique-se que essa pasta exista ou crie-a automaticamente
|
||||
destination: './uploads',
|
||||
filename: (req, file, callback) => {
|
||||
// Gera um nome único para o arquivo
|
||||
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
|
||||
const fileExtName = extname(file.originalname);
|
||||
callback(null, `${file.fieldname}-${uniqueSuffix}${fileExtName}`);
|
||||
},
|
||||
}),
|
||||
// Opcional: definir limites (ex.: tamanho máximo do arquivo)
|
||||
limits: { fileSize: 5 * 1024 * 1024 }, // 5MB
|
||||
}),
|
||||
)
|
||||
async sendImage(
|
||||
@UploadedFile() file: Express.Multer.File,
|
||||
@Body('licensePlate') licensePlate: string,
|
||||
) {
|
||||
if (!file) {
|
||||
throw new HttpException('Nenhum arquivo enviado', HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
// Aqui você pode processar o arquivo (ex.: enviar para o S3) ou armazená-lo no disco mesmo.
|
||||
// Neste exemplo, retornamos a URL do arquivo salvo localmente.
|
||||
this.baseService.sendImages('./uploads/'+file.filename);
|
||||
fs.unlink('./uploads/'+file.filename, () => {});
|
||||
return {
|
||||
success: true,
|
||||
message: 'Upload realizado com sucesso',
|
||||
url: `https://jur-saidaretornoveiculo.s3.sa-east-1.amazonaws.com/${file.filename}`,
|
||||
licensePlate,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
15
src/core/services/base.module.ts
Normal file
15
src/core/services/base.module.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { BaseController } from './base.controller';
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { BaseService } from './base.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
BaseController,],
|
||||
providers: [BaseService,],
|
||||
})
|
||||
export class BaseModule { }
|
||||
289
src/core/services/base.service.ts
Normal file
289
src/core/services/base.service.ts
Normal file
@@ -0,0 +1,289 @@
|
||||
import { Inject, Injectable, InternalServerErrorException } from '@nestjs/common';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { typeOrmConfig } from '../configs/typeorm.config';
|
||||
import { S3 } from 'aws-sdk';
|
||||
import * as fs from "fs";
|
||||
|
||||
@Injectable()
|
||||
export class BaseService {
|
||||
constructor() { }
|
||||
|
||||
async findAll(table: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const [rows] = await queryRunner.query(`SELECT * FROM ${table}`);
|
||||
return rows;
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(error, `Erro ao buscar todos os registros da tabela ${table}`);
|
||||
} finally {
|
||||
queryRunner.release();
|
||||
dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async findOne(table: string, id: any) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const [rows] = await queryRunner.query(`SELECT * FROM ${table} WHERE id = '${id}'`);
|
||||
return rows[0];
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(error, `Erro ao buscar o registro com ID ${id} na tabela ${table}`);
|
||||
} finally {
|
||||
queryRunner.release();
|
||||
dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async create(table: string, data: any) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const columns = Object.keys(data).map((key) => `${key}`).join(', ');
|
||||
const values = Object.values(data);
|
||||
const placeholders = values.map(() => '?').join(', ');
|
||||
|
||||
const query = `INSERT INTO ${table} (${columns}) VALUES (${placeholders})`;
|
||||
|
||||
const [result] = await queryRunner.query(query, values);
|
||||
return result;
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(error, `Erro ao criar um registro na tabela ${table}`);
|
||||
} finally {
|
||||
queryRunner.release();
|
||||
dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async update(table: string, where: any, data: any) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const [result] = await queryRunner.query(`UPDATE ${table} SET ${data} WHERE ${where}`);
|
||||
return result;
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(error, `Erro ao atualizar o registro com ${where} na tabela ${table}`);
|
||||
} finally {
|
||||
queryRunner.release();
|
||||
dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async delete(table: string, where: any) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const [result] = await queryRunner.query(`DELETE FROM ${table} WHERE ${where}`);
|
||||
return result;
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(error, `Erro ao deletar o registro com ID ${where} na tabela ${table}`);
|
||||
} finally {
|
||||
queryRunner.release();
|
||||
dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async query(queryString: string, params: any[]): Promise<any[]> {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const [rows] = await queryRunner.query(queryString, params);
|
||||
return rows as any[];
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(error, `Erro ao executar a consulta SQL personalizada`);
|
||||
} finally {
|
||||
queryRunner.release();
|
||||
dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async executeView(viewName: string, params: Record<string, any>) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
// Valida se o nome da view foi fornecido
|
||||
if (!viewName) {
|
||||
throw new Error('O nome da view é obrigatório.');
|
||||
}
|
||||
|
||||
console.log(`Iniciando execução da view: ${viewName}`);
|
||||
console.log('Parâmetros recebidos:', params);
|
||||
|
||||
const conditions: string[] = [];
|
||||
const values: any[] = [];
|
||||
|
||||
// Remove o parâmetro viewName dos parâmetros antes de processar
|
||||
const filteredParams = { ...params };
|
||||
delete filteredParams.viewName;
|
||||
|
||||
// Adiciona as condições baseadas nos parâmetros fornecidos
|
||||
if (filteredParams && Object.keys(filteredParams).length > 0) {
|
||||
console.log('Adicionando condições para os parâmetros fornecidos...');
|
||||
for (const [key, value] of Object.entries(filteredParams)) {
|
||||
// Verifica se a chave e o valor são válidos
|
||||
if (value !== undefined && value !== null && value !== '') {
|
||||
console.log(`Parâmetro válido: ${key} = '${value}'`);
|
||||
conditions.push(`${key} = '${value}'`); // Adiciona aspas para evitar problemas de SQL injection
|
||||
values.push(value);
|
||||
} else {
|
||||
console.warn(`Parâmetro ignorado: ${key} = '${value}'`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log('Nenhum parâmetro válido foi fornecido.');
|
||||
}
|
||||
|
||||
// Monta a cláusula WHERE somente se houver condições
|
||||
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
||||
const query = `SELECT * FROM ${ viewName } ${whereClause}`;
|
||||
|
||||
console.log(`Consulta SQL montada: ${ query }`);
|
||||
console.log(`{Valores para a consulta:, ${values}`);
|
||||
|
||||
// Executa a consulta
|
||||
const rows = await queryRunner.query(query);
|
||||
|
||||
console.log(`Consulta executada com sucesso.Linhas retornadas: ${ JSON.stringify(rows) }`);
|
||||
return rows;
|
||||
} catch (error) {
|
||||
console.error(`Erro ao executar a view ${ viewName }: `, error.message);
|
||||
this.handleDatabaseError(
|
||||
error,
|
||||
`Erro ao executar a view ${ viewName } com parâmetros.`,
|
||||
);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async executeProcedure(procedureName: string, params: Record<string, any>) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const placeholders = Object.keys(params)
|
||||
.map(() => '?')
|
||||
.join(', ');
|
||||
const values = Object.values(params);
|
||||
|
||||
const query = `EXECUTE IMMEDIATE ${ procedureName }(${ placeholders })`;
|
||||
|
||||
// Log da query e dos valores
|
||||
console.log('Query executada:', query);
|
||||
console.log('Valores:', values);
|
||||
|
||||
const [result] = await queryRunner.query(query, values);
|
||||
|
||||
// Verifica e converte campos que contenham JSON strings para objetos
|
||||
const parsedResult = Array.isArray(result)
|
||||
? result.map((row) => {
|
||||
const parsedRow = { ...row };
|
||||
for (const [key, value] of Object.entries(parsedRow)) {
|
||||
try {
|
||||
// Tenta converter strings JSON para objetos
|
||||
if (typeof value === 'string' && value.trim().startsWith('{') && value.trim().endsWith('}')) {
|
||||
parsedRow[key] = JSON.parse(value);
|
||||
}
|
||||
} catch (error) {
|
||||
// Ignora se a conversão falhar
|
||||
console.warn(`Campo ${ key } não é um JSON válido.Mantendo como string.`);
|
||||
}
|
||||
}
|
||||
return parsedRow;
|
||||
})
|
||||
: result;
|
||||
|
||||
// Retorna os valores e o resultado
|
||||
return {
|
||||
message: 'Procedure executada com sucesso.',
|
||||
executedQuery: query,
|
||||
values: values,
|
||||
result: parsedResult,
|
||||
};
|
||||
} catch (error) {
|
||||
this.handleDatabaseError(
|
||||
error,
|
||||
`Erro ao executar a procedure ${ procedureName } com parâmetros.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private handleDatabaseError(error: any, message: string): never {
|
||||
console.error(message, error); // Log detalhado do erro
|
||||
throw new InternalServerErrorException({
|
||||
message,
|
||||
sqlMessage: error.sqlMessage || error.message,
|
||||
sqlState: error.sqlState,
|
||||
});
|
||||
}
|
||||
|
||||
async sendImages(file: string) {
|
||||
// for (const file of files) {
|
||||
// const file = 'C:\\Temp\\brasil_2.jpg'
|
||||
if (file.endsWith(".jpg")) {
|
||||
const fileName = file; //directoryImages + '\\' + file;
|
||||
fs.readFile(fileName, (err, data) => {
|
||||
if (err) throw err;
|
||||
if (err) {
|
||||
console.log(`WRITE ERROR: ${err}`);
|
||||
} else {
|
||||
this.uploadS3(data, 'jur-saidaretornoveiculo', file.replace('./uploads/', ''));
|
||||
}
|
||||
});
|
||||
}
|
||||
//}
|
||||
}
|
||||
|
||||
async uploadS3(file, bucket, name) {
|
||||
const s3 = this.getS3();
|
||||
const params = {
|
||||
Bucket: bucket,
|
||||
Key: String(name),
|
||||
Body: file,
|
||||
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
s3.upload(params, (err, data) => {
|
||||
if (err) {
|
||||
console.log(JSON.stringify(err));
|
||||
reject(err.message);
|
||||
}
|
||||
resolve(data);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
getS3() {
|
||||
return new S3({
|
||||
accessKeyId: "AKIAVHJOO6W765ZT2PNI", //process.env.AWS_ACCESS_KEY_ID,
|
||||
secretAccessKey: "IFtP6Foc7JlE6TfR3psBAERUCMlH+4cRMx0GVIx2", // process.env.AWS_SECRET_ACCESS_KEY,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
11
src/crm/negotiations/negotiations.controller.ts
Normal file
11
src/crm/negotiations/negotiations.controller.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Controller } from '@nestjs/common';
|
||||
|
||||
@Controller()
|
||||
export class NegotiationsController { }
|
||||
19
src/crm/negotiations/negotiations.module.ts
Normal file
19
src/crm/negotiations/negotiations.module.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { NegotiationsController } from './negotiations.controller';
|
||||
import { NegotiationsService } from './negotiations.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
NegotiationsController,],
|
||||
providers: [
|
||||
NegotiationsService,],
|
||||
})
|
||||
export class NegotiationsModule { }
|
||||
11
src/crm/negotiations/negotiations.service.ts
Normal file
11
src/crm/negotiations/negotiations.service.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
@Injectable()
|
||||
export class NegotiationsService { }
|
||||
17
src/crm/occurrences/occurrences.module.ts
Normal file
17
src/crm/occurrences/occurrences.module.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { OccurrencesService } from './occurrences.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [],
|
||||
providers: [
|
||||
OccurrencesService,],
|
||||
})
|
||||
export class OccurrencesModule { }
|
||||
10
src/crm/occurrences/occurrences.service.ts
Normal file
10
src/crm/occurrences/occurrences.service.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/*
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
@Injectable()
|
||||
export class OccurrencesService { }
|
||||
10
src/crm/occurrences/ocorrences.controller.ts
Normal file
10
src/crm/occurrences/ocorrences.controller.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Controller } from '@nestjs/common';
|
||||
|
||||
@Controller()
|
||||
export class OcorrencesController { }
|
||||
32
src/crm/reason-table/reason-table.controller.ts
Normal file
32
src/crm/reason-table/reason-table.controller.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
|
||||
|
||||
@Controller('api/v1/crm/reason')
|
||||
export class ReasonTableController {
|
||||
|
||||
@Get()
|
||||
async getReasons() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Post()
|
||||
async createReasons() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Put('/:id')
|
||||
async updateReasons(@Param('id') id: number) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Delete('/:id')
|
||||
async deleteReasons(@Param('id') id: number) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
19
src/crm/reason-table/reason-table.module.ts
Normal file
19
src/crm/reason-table/reason-table.module.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { ReasonTableController } from './reason-table.controller';
|
||||
import { ReasonTableService } from './reason-table.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
ReasonTableController,],
|
||||
providers: [
|
||||
ReasonTableService,],
|
||||
})
|
||||
export class ReasonTableModule { }
|
||||
10
src/crm/reason-table/reason-table.service.ts
Normal file
10
src/crm/reason-table/reason-table.service.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars *//*
|
||||
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
@Injectable()
|
||||
export class ReasonTableService { }
|
||||
44
src/data-consult/data-consult.controller.ts
Normal file
44
src/data-consult/data-consult.controller.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Controller, Get, Param } from '@nestjs/common';
|
||||
import { DataConsultService } from './data-consult.service';
|
||||
|
||||
@Controller('api/v1/data-consult')
|
||||
export class DataConsultController {
|
||||
|
||||
constructor(private readonly dataConsultService: DataConsultService) {}
|
||||
|
||||
|
||||
@Get('stores')
|
||||
async stores() {
|
||||
return this.dataConsultService.stores();
|
||||
}
|
||||
|
||||
@Get('sellers')
|
||||
async sellers() {
|
||||
return this.dataConsultService.sellers();
|
||||
}
|
||||
|
||||
@Get('billings')
|
||||
async billings() {
|
||||
return this.dataConsultService.billings();
|
||||
}
|
||||
|
||||
@Get('customers/:filter')
|
||||
async customer(@Param('filter') filter: string) {
|
||||
return this.dataConsultService.customers(filter);
|
||||
}
|
||||
|
||||
@Get('products/:filter')
|
||||
async products(@Param('filter') filter: string) {
|
||||
return this.dataConsultService.products(filter);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
19
src/data-consult/data-consult.module.ts
Normal file
19
src/data-consult/data-consult.module.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { DataConsultService } from './data-consult.service';
|
||||
import { DataConsultController } from './data-consult.controller';
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
DataConsultController,],
|
||||
providers: [
|
||||
DataConsultService,],
|
||||
})
|
||||
export class DataConsultModule { }
|
||||
170
src/data-consult/data-consult.service.ts
Normal file
170
src/data-consult/data-consult.service.ts
Normal file
@@ -0,0 +1,170 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/*
|
||||
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { typeOrmConfig } from 'src/core/configs/typeorm.config';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
@Injectable()
|
||||
export class DataConsultService {
|
||||
|
||||
|
||||
async stores() {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCFILIAL.CODIGO as "id"
|
||||
,PCFILIAL.RAZAOSOCIAL as "name"
|
||||
,PCFILIAL.CODIGO || ' - ' || PCFILIAL.FANTASIA as "store"
|
||||
FROM PCFILIAL
|
||||
WHERE PCFILIAL.CODIGO NOT IN ('99', '69')
|
||||
ORDER BY TO_NUMBER(PCFILIAL.CODIGO)`;
|
||||
|
||||
|
||||
const stores = await queryRunner.manager.query(sql);
|
||||
|
||||
return stores;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async sellers() {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCUSUARI.CODUSUR as "id"
|
||||
,PCUSUARI.NOME as "name"
|
||||
FROM PCUSUARI
|
||||
WHERE PCUSUARI.DTTERMINO IS NULL
|
||||
AND PCUSUARI.TIPOVEND NOT IN ('P')
|
||||
ORDER BY PCUSUARI.NOME`;
|
||||
|
||||
|
||||
const sellers = await queryRunner.manager.query(sql);
|
||||
|
||||
return sellers;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async billings() {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCCOB.CODCOB as "id"
|
||||
,PCCOB.CODCOB||' - '||PCCOB.COBRANCA as "description"
|
||||
FROM PCCOB
|
||||
WHERE PCCOB.CODCOB NOT IN ('DEVP', 'DEVT', 'DESD')
|
||||
ORDER BY PCCOB.COBRANCA`;
|
||||
|
||||
|
||||
const sellers = await queryRunner.manager.query(sql);
|
||||
|
||||
return sellers;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async customers(filter: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
let sql = `SELECT PCCLIENT.CODCLI as "id"
|
||||
,PCCLIENT.CODCLI || ' - '|| PCCLIENT.CLIENTE||
|
||||
' ( '||REGEXP_REPLACE(PCCLIENT.CGCENT, '[^0-9]', '')||' )' as "name"
|
||||
FROM PCCLIENT
|
||||
WHERE PCCLIENT.CODCLI = REGEXP_REPLACE('${filter}', '[^0-9]', '')
|
||||
ORDER BY PCCLIENT.CLIENTE`;
|
||||
let customers = await queryRunner.manager.query(sql);
|
||||
|
||||
if (customers.length == 0) {
|
||||
sql = `SELECT PCCLIENT.CODCLI as "id"
|
||||
,PCCLIENT.CODCLI || ' - '|| PCCLIENT.CLIENTE||
|
||||
' ( '||REGEXP_REPLACE(PCCLIENT.CGCENT, '[^0-9]', '')||' )' as "name"
|
||||
FROM PCCLIENT
|
||||
WHERE REGEXP_REPLACE(PCCLIENT.CGCENT, '[^0-9]', '') = REGEXP_REPLACE('${filter}', '[^0-9]', '')
|
||||
ORDER BY PCCLIENT.CLIENTE`;
|
||||
customers = await queryRunner.manager.query(sql);
|
||||
}
|
||||
|
||||
if (customers.length == 0) {
|
||||
sql = `SELECT PCCLIENT.CODCLI as "id"
|
||||
,PCCLIENT.CODCLI || ' - '|| PCCLIENT.CLIENTE||
|
||||
' ( '||REGEXP_REPLACE(PCCLIENT.CGCENT, '[^0-9]', '')||' )' as "name"
|
||||
FROM PCCLIENT
|
||||
WHERE PCCLIENT.CLIENTE LIKE '${filter.toUpperCase().replace('@', '%')}%'
|
||||
ORDER BY PCCLIENT.CLIENTE`;
|
||||
customers = await queryRunner.manager.query(sql);
|
||||
}
|
||||
|
||||
return customers;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async products(filter: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
let sql = `SELECT PCPRODUT.CODPROD as "id"
|
||||
,PCPRODUT.CODPROD || ' - '|| PCPRODUT.DESCRICAO||
|
||||
' ( '||REGEXP_REPLACE(PCPRODUT.CODAUXILIAR, '[^0-9]', '')||' )' as "description"
|
||||
FROM PCPRODUT
|
||||
WHERE PCPRODUT.CODPROD = REGEXP_REPLACE('${filter}', '[^0-9]', '')
|
||||
ORDER BY PCPRODUT.DESCRICAO`;
|
||||
let products = await queryRunner.manager.query(sql);
|
||||
|
||||
if (products.length == 0) {
|
||||
sql = `SELECT PCPRODUT.CODPROD as "id"
|
||||
,PCPRODUT.CODPROD || ' - '|| PCPRODUT.DESCRICAO||
|
||||
' ( '||REGEXP_REPLACE(PCPRODUT.CODAUXILIAR, '[^0-9]', '')||' )' as "description"
|
||||
FROM PCPRODUT
|
||||
WHERE PCPRODUT.CODAUXILIAR = REGEXP_REPLACE('${filter}', '[^0-9]', '')
|
||||
ORDER BY PCPRODUT.DESCRICAO`;
|
||||
products = await queryRunner.manager.query(sql);
|
||||
}
|
||||
|
||||
if (products.length == 0) {
|
||||
sql = `SELECT PCPRODUT.CODPROD as "id"
|
||||
,PCPRODUT.CODPROD || ' - '|| PCPRODUT.DESCRICAO||
|
||||
' ( '||REGEXP_REPLACE(PCPRODUT.CODAUXILIAR, '[^0-9]', '')||' )' as "description"
|
||||
FROM PCPRODUT
|
||||
WHERE PCPRODUT.DESCRICAO LIKE '${filter}%'
|
||||
ORDER BY PCPRODUT.DESCRICAO`;
|
||||
products = await queryRunner.manager.query(sql);
|
||||
}
|
||||
|
||||
return products;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
51
src/logistic/logistic.controller.ts
Normal file
51
src/logistic/logistic.controller.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
|
||||
import { LogisticService } from './logistic.service';
|
||||
import { CarOutDelivery } from 'src/core/models/car-out-delivery.model';
|
||||
import { CarInDelivery } from 'src/core/models/car-in-delivery.model';
|
||||
|
||||
@Controller('api/v1/logistic')
|
||||
export class LogisticController {
|
||||
|
||||
constructor( private readonly logisticService: LogisticService) {}
|
||||
|
||||
@Get('expedicao')
|
||||
getExpedicao() {
|
||||
try {
|
||||
return this.logisticService.getExpedicao();
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
}
|
||||
|
||||
@Get('employee')
|
||||
getEmployee() {
|
||||
return this.logisticService.getEmployee();
|
||||
}
|
||||
|
||||
@Get('deliveries/:placa')
|
||||
getDelivery(@Param('placa') placa: string) {
|
||||
return this.logisticService.getDeliveries(placa);
|
||||
}
|
||||
|
||||
@Get('status-car/:placa')
|
||||
getStatusCar(@Param('placa') placa: string) {
|
||||
return this.logisticService.getStatusCar(placa);
|
||||
}
|
||||
|
||||
@Post('create')
|
||||
createOutCar(@Body() data: CarOutDelivery) {
|
||||
return this.logisticService.createCarOut(data);
|
||||
}
|
||||
|
||||
@Post('return-car')
|
||||
createinCar(@Body() data: CarInDelivery) {
|
||||
return this.logisticService.createCarIn(data);
|
||||
}
|
||||
|
||||
}
|
||||
15
src/logistic/logistic.module.ts
Normal file
15
src/logistic/logistic.module.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
import { LogisticController } from './logistic.controller';
|
||||
import { LogisticService } from './logistic.service';
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
LogisticController,],
|
||||
providers: [
|
||||
LogisticService,],
|
||||
})
|
||||
export class LogisticModule { }
|
||||
353
src/logistic/logistic.service.ts
Normal file
353
src/logistic/logistic.service.ts
Normal file
@@ -0,0 +1,353 @@
|
||||
import { Length } from './../../node_modules/aws-sdk/clients/quicksight.d';
|
||||
import { count } from './../../node_modules/aws-sdk/clients/health.d';
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
|
||||
import { Get, HttpException, HttpStatus, Injectable, Query, UseGuards } from '@nestjs/common';
|
||||
import { stringify } from 'querystring';
|
||||
import { typeOrmConfig, typeOrmPgConfig } from 'src/core/configs/typeorm.config';
|
||||
import { CarOutDelivery } from 'src/core/models/car-out-delivery.model';
|
||||
import { BaseService } from 'src/core/services/base.service';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { CarInDelivery } from 'src/core/models/car-in-delivery.model';
|
||||
|
||||
@Injectable()
|
||||
export class LogisticService {
|
||||
|
||||
async getExpedicao() {
|
||||
const dataSource = new DataSource(typeOrmPgConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
const sqlWMS = `select dados.*,
|
||||
( select count(distinct v.numero_carga) quantidade_cargas_embarcadas
|
||||
from volume v, carga c2
|
||||
where v.numero_carga = c2.numero
|
||||
and c2.data_integracao >= TO_DATE('01/02/2025', 'DD/MM/YYYY')
|
||||
and TO_DATE(RIGHT(c2.observacao, 10), 'DD/MM/YYYY') = dados.dataHoje
|
||||
and v.embarcado = 'S' ) quantidade_cargas_embarcadas
|
||||
FROM ( select date_trunc('day', (CURRENT_DATE + INTERVAL '1 day'))::date data_saida, --TO_DATE(RIGHT(c.observacao, 10), 'DD/MM/YYYY') data_saida,
|
||||
date_trunc('day', (CURRENT_DATE + INTERVAL '1 day'))::date dataHoje,
|
||||
SUM(c.qt_itens_conferidos) total_itens_conferidos,
|
||||
SUM(c.qt_itens_separados) total_itens_separados,
|
||||
SUM(c.qt_total_itens) quantidade_total_itens,
|
||||
SUM(c.qt_total_pedidos) quantidade_total,
|
||||
SUM(m.qt * p.peso_unidade) total_kg,
|
||||
COUNT(DISTINCT c.numero) quantidade_cargas,
|
||||
COUNT(DISTINCT (CASE WHEN m.data_fim_separacao is not null then c.numero else null end)) quantidade_cargas_separacao_finalizadas,
|
||||
COUNT(DISTINCT (CASE WHEN m.data_fim_conferencia is not null then c.numero else null end)) quantidade_cargas_conferencia_finalizadas,
|
||||
SUM(case when m.data_inicio_separacao is null then m.qt * p.peso_unidade else 0 end) total_peso_separacao_nao_iniciada,
|
||||
SUM(case when m.data_inicio_separacao is not null and m.data_fim_separacao is null then m.qt * p.peso_unidade else 0 end) total_peso_em_separacao,
|
||||
SUM(case when m.data_fim_separacao is not null then m.qt * p.peso_unidade else 0 end) total_peso_separado,
|
||||
SUM(case when m.data_fim_separacao is not null and m.data_inicio_conferencia is null then m.qt * p.peso_unidade else 0 end) total_conferencia_nao_iniciada,
|
||||
SUM(case when m.data_fim_separacao is not null and m.data_inicio_conferencia is not null and m.data_fim_conferencia is null then m.qt * p.peso_unidade else 0 end) total_peso_em_conferencia,
|
||||
SUM(case when m.data_fim_conferencia is not null then m.qt * p.peso_unidade else 0 end) total_peso_conferido
|
||||
from movimentacao m , carga c , produto p
|
||||
where m.numero_carga = c.numero
|
||||
and m.produto_id = p.id
|
||||
and m.data_integracao >= TO_DATE('01/01/2025', 'DD/MM/YYYY')
|
||||
and c.data_faturamento IS NULL
|
||||
and c.destino not like '%TRANSF%'
|
||||
and m.empresa_id in ( 3, 4 )
|
||||
--group by TO_DATE(RIGHT(c.observacao, 10), 'DD/MM/YYYY')
|
||||
) dados
|
||||
where dados.data_saida >= current_date
|
||||
ORDER BY dados.data_saida desc `;
|
||||
|
||||
|
||||
const sql = `SELECT COUNT(DISTINCT PCCARREG.NUMCAR) as "qtde"
|
||||
,SUM(PCPEDI.QT * PCPRODUT.PESOBRUTO) as "totalKG"
|
||||
,SUM(CASE WHEN PCPEDC.DTINICIALSEP IS NULL THEN PCPEDI.QT ELSE 0 END * PCPRODUT.PESOBRUTO) as "total_nao_iniciado"
|
||||
,SUM(CASE WHEN PCPEDC.DTINICIALSEP IS NOT NULL
|
||||
AND PCPEDC.DTFINALSEP IS NULL THEN PCPEDI.QT ELSE 0 END * PCPRODUT.PESOBRUTO) as "total_em_separacao"
|
||||
,SUM(CASE WHEN PCPEDC.DTFINALSEP IS NOT NULL THEN PCPEDI.QT ELSE 0 END * PCPRODUT.PESOBRUTO) as "total_separado"
|
||||
,SUM(CASE WHEN PCPEDC.DTFINALSEP IS NOT NULL
|
||||
AND PCPEDC.DTINICIALCHECKOUT IS NULL THEN PCPEDI.QT ELSE 0 END * PCPRODUT.PESOBRUTO) as "total_conferencia_nao_iniciada"
|
||||
,SUM(CASE WHEN PCPEDC.DTFINALSEP IS NOT NULL
|
||||
AND PCPEDC.DTINICIALCHECKOUT IS NOT NULL
|
||||
AND PCPEDC.DTFINALCHECKOUT IS NULL THEN PCPEDI.QT ELSE 0 END * PCPRODUT.PESOBRUTO) as "total_em_conferencia"
|
||||
,SUM(CASE WHEN PCPEDC.DTFINALSEP IS NOT NULL
|
||||
AND PCPEDC.DTFINALCHECKOUT IS NOT NULL THEN PCPEDI.QT ELSE 0 END * PCPRODUT.PESOBRUTO) as "total_coferencia_finalizada"
|
||||
FROM PCPEDI, PCPEDC, PCPRODUT, PCCARREG
|
||||
WHERE PCPEDI.NUMPED = PCPEDC.NUMPED
|
||||
AND PCPEDI.CODPROD = PCPRODUT.CODPROD
|
||||
AND PCPEDI.NUMCAR = PCCARREG.NUMCAR
|
||||
AND PCPEDC.CODFILIAL = 12
|
||||
AND PCPEDI.TIPOENTREGA IN ('EN', 'EF')
|
||||
AND PCCARREG.DTSAIDA = TRUNC(SYSDATE)`;
|
||||
|
||||
const mov = await queryRunner.manager.query(sqlWMS);
|
||||
|
||||
const hoje = new Date();
|
||||
|
||||
// Criar uma nova data para amanhã
|
||||
let amanha = new Date(hoje);
|
||||
amanha.setDate(hoje.getDate() + 1);
|
||||
const amanhaString = amanha.toISOString().split('T')[0];
|
||||
amanha = new Date(amanhaString);
|
||||
|
||||
console.log(amanha);
|
||||
console.log(JSON.stringify(mov));
|
||||
|
||||
const movFiltered = mov.filter((m) => m.data_saida.toISOString().split('T')[0] == amanha.toISOString().split('T')[0]);
|
||||
|
||||
return movFiltered;
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async getDeliveries(placa: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
const sql = `SELECT PCCARREG.NUMCAR as "id"
|
||||
,PCCARREG.DTSAIDA as "createDate"
|
||||
,PCCARREG.DESTINO as "comment"
|
||||
,PCCARREG.TOTPESO as "weight"
|
||||
,PCCARREG.NUMNOTAS as "invoices"
|
||||
,( SELECT COUNT(DISTINCT NVL(PCCLIENTENDENT.CODPRACAENT, PCPEDC.CODPRACA))
|
||||
FROM PCPEDC, PCCLIENTENDENT
|
||||
WHERE PCPEDC.NUMCAR = PCCARREG.NUMCAR
|
||||
AND PCPEDC.CODENDENTCLI = PCCLIENTENDENT.CODENDENTCLI (+) ) as "citys"
|
||||
,( SELECT COUNT(DISTINCT PCPEDC.CODCLI) FROM PCPEDC
|
||||
WHERE PCPEDC.NUMCAR = PCCARREG.NUMCAR) as "deliveries"
|
||||
,PCCARREG.CODMOTORISTA as "driverId"
|
||||
,PCEMPR.NOME as "driverName"
|
||||
,PCVEICUL.CODVEICULO as "carId"
|
||||
,PCVEICUL.DESCRICAO as "carDescription"
|
||||
,PCVEICUL.PLACA as "identification"
|
||||
,PCCARREG.CODFUNCAJUD as "helperId"
|
||||
,PCCARREG.CODFUNCAJUD2 as "helperId1"
|
||||
,PCCARREG.CODFUNCAJUD3 as "helperId2"
|
||||
FROM PCCARREG, PCVEICUL, PCEMPR
|
||||
WHERE PCCARREG.CODVEICULO = PCVEICUL.codveiculo (+)
|
||||
AND PCCARREG.CODMOTORISTA = PCEMPR.MATRICULA (+)
|
||||
AND PCCARREG.DTFECHA IS NULL
|
||||
AND PCCARREG.DTSAIDA >= TRUNC(SYSDATE)`;
|
||||
|
||||
const deliveries = await queryRunner.manager.query(sql);
|
||||
|
||||
return deliveries;
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async getStatusCar(placa: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
const sql = `SELECT ESTSAIDAVEICULO.CODSAIDA FROM ESTSAIDAVEICULO, PCVEICUL
|
||||
WHERE ESTSAIDAVEICULO.CODVEICULO = PCVEICUL.CODVEICULO
|
||||
AND PCVEICUL.PLACA = '${placa}'
|
||||
AND ESTSAIDAVEICULO.DTRETORNO IS NULL`;
|
||||
|
||||
const outCar = await queryRunner.manager.query(sql);
|
||||
|
||||
return { veiculoEmViagem: ( outCar.length > 0 ) ? true : false };
|
||||
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async getEmployee() {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCEMPR.MATRICULA as "id"
|
||||
,PCEMPR.NOME as "name"
|
||||
,PCEMPR.FUNCAO as "fuctionName"
|
||||
FROM PCEMPR, PCCONSUM
|
||||
WHERE PCEMPR.DTDEMISSAO IS NULL
|
||||
AND PCEMPR.CODSETOR = PCCONSUM.CODSETOREXPED
|
||||
ORDER BY PCEMPR.NOME `;
|
||||
const dataEmployee = await queryRunner.query(sql);
|
||||
|
||||
return dataEmployee;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async createCarOut(data: CarOutDelivery) {
|
||||
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
|
||||
const sqlSequence = `SELECT ESS_SAIDAVEICULO.NEXTVAL as "id" FROM DUAL`;
|
||||
const dataSequence = await queryRunner.query(sqlSequence);
|
||||
let i = 0;
|
||||
let helperId1: number = 0;
|
||||
let helperId2: number = 0;
|
||||
let helperId3: number = 0;
|
||||
let image1: string = '';
|
||||
let image2: string = '';
|
||||
let image3: string = '';
|
||||
let image4: string = '';
|
||||
|
||||
data.helpers.forEach(helper => {
|
||||
switch (i) {
|
||||
case 0:
|
||||
helperId1 = helper.id;
|
||||
break;
|
||||
case 1:
|
||||
helperId2 = helper.id;
|
||||
break;
|
||||
case 2:
|
||||
helperId3 = helper.id;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
});
|
||||
|
||||
for (let y = 0; y < data.photos.length; y++) {
|
||||
const sqlImage = `INSERT INTO ESTSAIDAVEICULOIMAGENS ( CODSAIDA, TIPO, URL )
|
||||
VALUES (${dataSequence[0].id}, 'SA', '${data.photos[y]}' )`;
|
||||
await queryRunner.query(sqlImage);
|
||||
}
|
||||
|
||||
const sqlSaidaVeiculo = `INSERT INTO ESTSAIDAVEICULO ( CODSAIDA, CODVEICULO, DTSAIDA, QTAJUDANTES, CODFUNCSAIDA )
|
||||
VALUES ( ${dataSequence[0].id}, ${data.vehicleCode}, SYSDATE, ${data.helpers.length},
|
||||
${data.userCode} )`;
|
||||
await queryRunner.query(sqlSaidaVeiculo);
|
||||
|
||||
for (let y = 0; y < data.numberLoading.length; y++) {
|
||||
const sqlLoading = `INSERT INTO ESTSAIDAVEICULOCARREG ( CODSAIDA, NUMCAR )
|
||||
VALUES ( ${dataSequence[0].id}, ${data.numberLoading[y]})`;
|
||||
await queryRunner.query(sqlLoading);
|
||||
|
||||
const sql = `UPDATE PCCARREG SET
|
||||
DTSAIDAVEICULO = SYSDATE
|
||||
,CODFUNCAJUD = ${helperId1}
|
||||
,CODFUNCAJUD2 = ${helperId2}
|
||||
,CODFUNCAJUD3 = ${helperId3}
|
||||
,KMINICIAL = ${data.startKm}
|
||||
WHERE NUMCAR = ${data.numberLoading[y]}`;
|
||||
await queryRunner.query(sql);
|
||||
|
||||
}
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
return { message: 'Dados da saída de veículo gravada com sucesso!'}
|
||||
|
||||
} catch (e) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
throw e;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async createCarIn(data: CarInDelivery) {
|
||||
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
|
||||
const sqlOutCar = `SELECT ESTSAIDAVEICULO.CODSAIDA as "id"
|
||||
FROM PCCARREG, PCVEICUL, ESTSAIDAVEICULO, ESTSAIDAVEICULOCARREG
|
||||
WHERE PCCARREG.CODVEICULO = PCVEICUL.CODVEICULO
|
||||
AND PCCARREG.NUMCAR = ESTSAIDAVEICULOCARREG.NUMCAR
|
||||
AND ESTSAIDAVEICULOCARREG.CODSAIDA = ESTSAIDAVEICULO.CODSAIDA
|
||||
-- AND ESTSAIDAVEICULO.DTRETORNO IS NULL
|
||||
AND PCVEICUL.PLACA = '${data.licensePlate}'`;
|
||||
const dataOutCar = await queryRunner.query(sqlOutCar);
|
||||
|
||||
if ( dataOutCar.length == 0 ) {
|
||||
throw new HttpException('Não foi localiza viagens em aberto para este veículo.', HttpStatus.BAD_REQUEST );
|
||||
}
|
||||
|
||||
let i = 0;
|
||||
let image1: string = '';
|
||||
let image2: string = '';
|
||||
let image3: string = '';
|
||||
let image4: string = '';
|
||||
|
||||
for (let y = 0; y < data.invoices.length; y++) {
|
||||
const invoice = data.invoices[y];
|
||||
const sqlInvoice = `INSERT INTO ESTRETORNONF ( CODSAIDA, NUMCAR, NUMNOTA, SITUACAO, MOTIVO )
|
||||
VALUES ( ${dataOutCar[0].id}, ${invoice.loadingNumber}, ${invoice.invoiceNumber},
|
||||
'${invoice.status}', '${invoice.reasonText}')`;
|
||||
await queryRunner.query(sqlInvoice);
|
||||
}
|
||||
|
||||
const updateCarreg = `UPDATE PCCARREG SET
|
||||
PCCARREG.DTRETORNO = SYSDATE
|
||||
,PCCARREG.KMFINAL = ${data.finalKm}
|
||||
WHERE PCCARREG.NUMCAR IN ( SELECT SC.NUMCAR
|
||||
FROM ESTSAIDAVEICULOCARREG SC
|
||||
WHERE SC.CODSAIDA = ${dataOutCar[0].id} )`;
|
||||
await queryRunner.query(updateCarreg);
|
||||
|
||||
for (let i = 0; i < data.images.length; i++) {
|
||||
const sqlImage = `INSERT INTO ESTSAIDAVEICULOIMAGENS ( CODSAIDA, TIPO, URL )
|
||||
VALUES (${dataOutCar[0].id}, 'RE', '${data.images[i]}' )`;
|
||||
await queryRunner.query(sqlImage);
|
||||
}
|
||||
|
||||
const sqlInCar = `UPDATE ESTSAIDAVEICULO SET
|
||||
ESTSAIDAVEICULO.DTRETORNO = SYSDATE
|
||||
,ESTSAIDAVEICULO.QTPALETES_PBR = ${data.qtdPaletesPbr}
|
||||
,ESTSAIDAVEICULO.QTPALETES_CIM = ${data.qtdPaletesCim}
|
||||
,ESTSAIDAVEICULO.QTPALETES_DES = ${data.qtdPaletesDes}
|
||||
,ESTSAIDAVEICULO.codfuncretorno = ${data.userId}
|
||||
,ESTSAIDAVEICULO.obsretorno = '${data.observation}'
|
||||
,ESTSAIDAVEICULO.HOUVESOBRA = '${data.remnant}'
|
||||
,ESTSAIDAVEICULO.OBSSOBRA = '${data.observationRemnant}'
|
||||
WHERE ESTSAIDAVEICULO.CODSAIDA = ${dataOutCar[0].id}`;
|
||||
|
||||
await queryRunner.query(sqlInCar);
|
||||
for (let i = 0; i < data.imagesRemnant.length; i++) {
|
||||
const sqlImage = `INSERT INTO ESTSAIDAVEICULOIMAGENS ( CODSAIDA, TIPO, URL )
|
||||
VALUES (${dataOutCar[0].id}, 'SO', '${data.imagesRemnant[i]}' )`;
|
||||
await queryRunner.query(sqlImage);
|
||||
}
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
return { message: 'Dados de retorno do veículo gravada com sucesso!'}
|
||||
|
||||
} catch (e) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
console.log(e);
|
||||
throw e;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
27
src/main.ts
Normal file
27
src/main.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
import { NestFactory } from '@nestjs/core';
|
||||
import { AppModule } from './app.module';
|
||||
import * as fs from 'fs';
|
||||
|
||||
async function bootstrap() {
|
||||
|
||||
// const privateKey = fs.readFileSync('cert/portal_juru.key', 'utf8');
|
||||
// const certificate = fs.readFileSync('cert/portal_juru.crt', 'utf8');
|
||||
// const httpsOptions = { key: privateKey, cert: certificate };
|
||||
// const app = await NestFactory.create(AppModule, {
|
||||
// httpsOptions,
|
||||
// });
|
||||
const app = await NestFactory.create(AppModule);
|
||||
|
||||
// const app = await NestFactory.create(AppModule);
|
||||
//Configurando o CORS
|
||||
app.enableCors({
|
||||
origin: '*', //'http://portal.jurunense.com', // Especifique a origem permitida ou use '*' para permitir todas
|
||||
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', // Métodos HTTP permitidos
|
||||
credentials: true, // Permitir envio de cookies
|
||||
allowedHeaders: 'Content-Type, Accept', // Cabeçalhos permitidos
|
||||
});
|
||||
|
||||
await app.listen(3001);
|
||||
}
|
||||
bootstrap();
|
||||
40
src/orders-payment/orders-payment.controller.ts
Normal file
40
src/orders-payment/orders-payment.controller.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
|
||||
import { OrdersPaymentService } from './orders-payment.service';
|
||||
|
||||
@Controller('api/v1/orders-payment')
|
||||
export class OrdersPaymentController {
|
||||
|
||||
constructor(private readonly orderPaymentService: OrdersPaymentService){}
|
||||
|
||||
@Get('orders/:id')
|
||||
findOrders(@Param('id') storeId: string) {
|
||||
return this.orderPaymentService.findOrders(storeId, 0);
|
||||
}
|
||||
|
||||
@Get('orders/:id/:orderId')
|
||||
findOrder(@Param('id') storeId: string,
|
||||
@Param('orderId') orderId: number) {
|
||||
return this.orderPaymentService.findOrders(storeId, orderId);
|
||||
}
|
||||
|
||||
@Get('payments/:id')
|
||||
findPayments(@Param('id') orderId: number) {
|
||||
return this.orderPaymentService.findPayments(orderId);
|
||||
}
|
||||
@Post('payments/create')
|
||||
createPayment(@Body() data: any) {
|
||||
return this.orderPaymentService.createPayment(data);
|
||||
}
|
||||
|
||||
@Post('invoice/create')
|
||||
createInvoice(@Body() data: any) {
|
||||
return this.orderPaymentService.createInvoice(data);
|
||||
}
|
||||
}
|
||||
19
src/orders-payment/orders-payment.module.ts
Normal file
19
src/orders-payment/orders-payment.module.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { OrdersPaymentController } from './orders-payment.controller';
|
||||
import { OrdersPaymentService } from './orders-payment.service';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
OrdersPaymentController,],
|
||||
providers: [
|
||||
OrdersPaymentService,],
|
||||
})
|
||||
export class OrdersPaymentModule { }
|
||||
141
src/orders-payment/orders-payment.service.ts
Normal file
141
src/orders-payment/orders-payment.service.ts
Normal file
@@ -0,0 +1,141 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { typeOrmConfig } from 'src/core/configs/typeorm.config';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
@Injectable()
|
||||
export class OrdersPaymentService {
|
||||
|
||||
async findOrders(storeId: string, orderId: number) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
const sql = `SELECT PCPEDC.DATA as "createDate"
|
||||
,PCPEDC.CODFILIAL as "storeId"
|
||||
,PCPEDC.NUMPED as "orderId"
|
||||
,PCPEDC.CODCLI as "customerId"
|
||||
,PCCLIENT.CLIENTE as "customerName"
|
||||
,PCPEDC.CODUSUR as "sellerId"
|
||||
,PCUSUARI.NOME as "sellerName"
|
||||
,PCPEDC.CODCOB as "billingId"
|
||||
,PCCOB.COBRANCA as "billingName"
|
||||
,PCPEDC.CODPLPAG as "planId"
|
||||
,PCPLPAG.DESCRICAO as "planName"
|
||||
,ROUND(PCPEDC.VLATEND,2) as "amount"
|
||||
,NVL(PCPLPAG.NUMPARCELAS,1) as "installments"
|
||||
,( SELECT SUM(ESTPAGAMENTO.VALOR) FROM ESTPAGAMENTO
|
||||
WHERE ESTPAGAMENTO.NUMORCA = PCPEDC.NUMPED ) as "amountPaid"
|
||||
FROM PCPEDC, PCCLIENT, PCUSUARI, PCCOB, PCPLPAG
|
||||
WHERE PCPEDC.CODCLI = PCCLIENT.CODCLI
|
||||
AND PCPEDC.CODUSUR = PCUSUARI.CODUSUR
|
||||
AND PCPEDC.CODPLPAG = PCPLPAG.CODPLPAG
|
||||
AND PCPEDC.CODCOB = PCCOB.CODCOB
|
||||
AND PCPEDC.CONDVENDA = 7
|
||||
AND PCPEDC.POSICAO IN ('L')
|
||||
AND PCPEDC.DATA >= TRUNC(SYSDATE) - 5
|
||||
AND PCPEDC.CODFILIAL = ${storeId} `;
|
||||
let sqlWhere = '';
|
||||
if ( orderId > 0) {
|
||||
sqlWhere += ` AND PCPEDC.NUMPED = ${orderId}`;
|
||||
}
|
||||
|
||||
const orders = await queryRunner.manager.query(sql + sqlWhere);
|
||||
|
||||
return orders;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async findPayments(orderId: number) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
const sql = `SELECT
|
||||
ESTPAGAMENTO.NUMORCA as "orderId"
|
||||
,ESTPAGAMENTO.DTPAGAMENTO as "payDate"
|
||||
,ESTPAGAMENTO.CARTAO as "card"
|
||||
,ESTPAGAMENTO.PARCELAS as "installments"
|
||||
,ESTPAGAMENTO.NOMEBANDEIRA as "flagName"
|
||||
,ESTPAGAMENTO.FORMAPAGTO as "type"
|
||||
,ESTPAGAMENTO.VALOR as "amount"
|
||||
,ESTPAGAMENTO.CODFUNC as "userId"
|
||||
,ESTPAGAMENTO.NSU as "nsu"
|
||||
,ESTPAGAMENTO.CODAUTORIZACAO as "auth"
|
||||
FROM ESTPAGAMENTO
|
||||
WHERE ESTPAGAMENTO.NUMORCA = ${orderId}`;
|
||||
|
||||
const payments = await queryRunner.manager.query(sql);
|
||||
|
||||
console.log(JSON.stringify(payments));
|
||||
|
||||
return payments;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async createPayment(payment: any) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const sql = `INSERT INTO ESTPAGAMENTO ( NUMORCA, DTPAGAMENTO, CARTAO, CODAUTORIZACAO, CODRESPOSTA, DTREQUISICAO, DTSERVIDOR, IDTRANSACAO,
|
||||
NSU, PARCELAS, VALOR, NOMEBANDEIRA, FORMAPAGTO, DTPROCESSAMENTO, CODFUNC )
|
||||
VALUES ( ${payment.orderId}, TRUNC(SYSDATE), '${payment.card}', '${payment.auth}', '00', SYSDATE, SYSDATE, NULL /*'${payment.transcationId}'*/,
|
||||
'${payment.nsu}', ${payment.installments}, ${payment.amount}, '${payment.flagName}',
|
||||
'${payment.paymentType}', SYSDATE, ${payment.userId} ) `;
|
||||
|
||||
await queryRunner.manager.query(sql);
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
} catch ( error ) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
console.log(error);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async createInvoice(data: any) {
|
||||
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const sql = `BEGIN
|
||||
ESK_FATURAMENTO.FATURAMENTO_VENDA_ASSISTIDA(${data.orderId}, ${data.userId});
|
||||
END;`;
|
||||
await queryRunner.manager.query(sql);
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
} catch ( error ) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
console.log(error);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
55
src/orders/orders.controller.ts
Normal file
55
src/orders/orders.controller.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common';
|
||||
import { OrdersService } from './orders.service';
|
||||
|
||||
@Controller('api/v1/orders')
|
||||
export class OrdersController {
|
||||
|
||||
constructor( private readonly ordersService: OrdersService) {}
|
||||
|
||||
@Get('find')
|
||||
findOrders(@Query() query) {
|
||||
return this.ordersService.findOrders(query);
|
||||
}
|
||||
|
||||
@Get('invoice/:chavenfe')
|
||||
findInvoice(@Param('chavenfe') chavenfe: string) {
|
||||
return this.ordersService.findInvoice(chavenfe);
|
||||
}
|
||||
|
||||
@Get('itens/:id')
|
||||
getItens(@Param('id') id: string) {
|
||||
return this.ordersService.getItens(id);
|
||||
}
|
||||
|
||||
@Get('cut-itens/:id')
|
||||
getCutItens(@Param('id') id: string) {
|
||||
return this.ordersService.getCutItens(id);
|
||||
}
|
||||
|
||||
@Get('delivery/:id')
|
||||
getOrderDelivery(@Param('id') id: string) {
|
||||
return this.ordersService.getOrderDelivery(id);
|
||||
}
|
||||
|
||||
@Get('transfer/:id')
|
||||
getTransfer(@Param('id') id: number) {
|
||||
return this.ordersService.getTransfer(id);
|
||||
}
|
||||
|
||||
@Get('status/:id')
|
||||
getStatusOrder(@Param('id') id: number) {
|
||||
return this.ordersService.getStatusOrder(id);
|
||||
}
|
||||
|
||||
@Post('invoice-check')
|
||||
createInvoiceCheck(@Body() invoice: any) {
|
||||
return this.ordersService.createInvoiceCheck(invoice);
|
||||
}
|
||||
}
|
||||
19
src/orders/orders.module.ts
Normal file
19
src/orders/orders.module.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
import { OrdersService } from './orders.service';
|
||||
import { OrdersController } from './orders.controller';
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
OrdersController,],
|
||||
providers: [
|
||||
OrdersService,],
|
||||
})
|
||||
export class OrdersModule { }
|
||||
648
src/orders/orders.service.ts
Normal file
648
src/orders/orders.service.ts
Normal file
@@ -0,0 +1,648 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/*
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
||||
import { typeOrmConfig } from 'src/core/configs/typeorm.config';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
@Injectable()
|
||||
export class OrdersService {
|
||||
|
||||
async findOrders(query) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
|
||||
let sql = `SELECT PCPEDC.DATA as "createDate"
|
||||
,PCPEDC.CODFILIAL || CASE WHEN PCPEDC.CODFILIALLOJA IS NOT NULL THEN
|
||||
' - Pre-Box ('||PCPEDC.CODFILIALLOJA||')'
|
||||
ELSE NULL END as "storeId"
|
||||
,PCPEDC.NUMPED as "orderId"
|
||||
,PCPEDC.CODCLI as "customerId"
|
||||
,PCPEDC.CODCLI||' - '||PCCLIENT.CLIENTE as "customerName"
|
||||
,PCPEDC.CODUSUR as "sellerId"
|
||||
,PCPEDC.CODUSUR||' - '||PCUSUARI.NOME as "sellerName"
|
||||
,PCSUPERV.NOME as "store"
|
||||
,( SELECT CASE WHEN PCPEDI.TIPOENTREGA = 'EN' THEN 'Entrega ('||PCPEDI.TIPOENTREGA||')'
|
||||
WHEN PCPEDI.TIPOENTREGA = 'EF' THEN 'Entrega Futura ('||PCPEDI.TIPOENTREGA||')'
|
||||
WHEN PCPEDI.TIPOENTREGA = 'RP' THEN 'Retira Posterior ('||PCPEDI.TIPOENTREGA||')'
|
||||
WHEN PCPEDI.TIPOENTREGA = 'RI' THEN 'Retira Imediata ('||PCPEDI.TIPOENTREGA||')'
|
||||
ELSE 'Não Informado' END
|
||||
FROM PCPEDI
|
||||
WHERE PCPEDI.NUMPED = PCPEDC.NUMPED
|
||||
AND ROWNUM = 1 ) as "deliveryType"
|
||||
,CASE WHEN NVL(PCPEDC.CODENDENTCLI,0) = 0 THEN
|
||||
( SELECT PCPRACA.CODPRACA||'-'||PCPRACA.PRACA
|
||||
FROM PCPRACA
|
||||
WHERE PCPRACA.CODPRACA = PCPEDC.CODPRACA )
|
||||
ELSE ( SELECT PCPRACA.CODPRACA||'-'||PCPRACA.PRACA
|
||||
FROM PCCLIENTENDENT, PCPRACA
|
||||
WHERE PCCLIENTENDENT.CODCLI = PCPEDC.CODCLI
|
||||
AND PCCLIENTENDENT.CODENDENTCLI = PCPEDC.CODENDENTCLI
|
||||
AND PCCLIENTENDENT.CODPRACAENT = PCPRACA.CODPRACA ) END as "deliveryLocal"
|
||||
,CASE WHEN NVL(PCPEDC.CODENDENTCLI,0) = 0 THEN
|
||||
( SELECT PCROTAEXP.CODROTA||'-'||PCROTAEXP.DESCRICAO
|
||||
FROM PCPRACA, PCROTAEXP
|
||||
WHERE PCPRACA.CODPRACA = PCPEDC.CODPRACA
|
||||
AND PCPRACA.ROTA = PCROTAEXP.CODROTA )
|
||||
ELSE ( SELECT PCROTAEXP.CODROTA||'-'||PCROTAEXP.DESCRICAO
|
||||
FROM PCCLIENTENDENT, PCPRACA, PCROTAEXP
|
||||
WHERE PCCLIENTENDENT.CODCLI = PCPEDC.CODCLI
|
||||
AND PCCLIENTENDENT.CODENDENTCLI = PCPEDC.CODENDENTCLI
|
||||
AND PCCLIENTENDENT.CODPRACAENT = PCPRACA.CODPRACA
|
||||
AND PCPRACA.ROTA = PCROTAEXP.CODROTA ) END as "masterDeliveryLocal"
|
||||
,CASE WHEN PCPEDC.CONDVENDA = 1 THEN 'TV1 - Retira Imediata'
|
||||
WHEN PCPEDC.CONDVENDA = 7 THEN 'TV7 - Faturamento'
|
||||
WHEN PCPEDC.CONDVENDA = 8 THEN 'TV8 - Entrega (' ||
|
||||
( SELECT PCPEDI.TIPOENTREGA FROM PCPEDI
|
||||
WHERE PCPEDI.NUMPED = PCPEDC.NUMPED
|
||||
AND ROWNUM = 1 ) ||')'
|
||||
WHEN PCPEDC.CONDVENDA = 10 THEN 'TV10 - Transferência'
|
||||
ELSE 'Outros' END as "orderType"
|
||||
,CASE WHEN PCPEDC.POSICAO = 'P' THEN 'Pendente'
|
||||
WHEN PCPEDC.POSICAO = 'B' THEN 'Bloqueado'
|
||||
WHEN PCPEDC.POSICAO = 'L' THEN 'Liberado'
|
||||
WHEN PCPEDC.POSICAO = 'M' THEN 'Montado'
|
||||
WHEN PCPEDC.POSICAO = 'F' THEN 'Faturado'
|
||||
WHEN PCPEDC.POSICAO = 'C' THEN 'Cancelado'
|
||||
END as "status"
|
||||
,CASE WHEN PCPEDC.CONDVENDA IN (1,7) THEN PCPEDC.VLATEND ELSE PCPEDC.VLTOTAL END as "amount"
|
||||
,PCPEDC.DTENTREGA as "deliveryDate"
|
||||
,CASE WHEN PCPEDC.tipoprioridadeentrega = 'B' THEN 'Baixa'
|
||||
WHEN PCPEDC.TIPOPRIORIDADEENTREGA = 'M' THEN 'Média'
|
||||
WHEN PCPEDC.TIPOPRIORIDADEENTREGA = 'A' THEN 'Alta'
|
||||
ELSE 'Não Definido' END as "deliveryPriority"
|
||||
,PCPEDC.NUMCAR as "shipmentId"
|
||||
,PCPEDC.DTLIBERA as "releaseDate"
|
||||
,PCPEDC.CODFUNCLIBERA as "releaseUser"
|
||||
,PCPEDC.CODFUNCLIBERA||'-'||
|
||||
(SELECT PCEMPR.NOME FROM PCEMPR WHERE PCEMPR.MATRICULA = PCPEDC.CODFUNCLIBERA) as "releaseUserName"
|
||||
,PCCARREG.DTSAIDA as "shipmentDate"
|
||||
,PCCARREG.DATAMON as "shipmentDateCreate"
|
||||
,CASE WHEN PCPEDC.NUMCAR = 0 THEN NULL
|
||||
ELSE PCCARREG.DTFECHA END as "shipmentCloseDate"
|
||||
,PCPEDC.CODPLPAG as "paymentId"
|
||||
,PCPLPAG.DESCRICAO as "paymentName"
|
||||
,PCPEDC.CODCOB as "billingId"
|
||||
,PCPEDC.CODCOB||'-'||
|
||||
PCCOB.COBRANCA as "billingName"
|
||||
,PCPEDC.DTFAT as "invoiceDate"
|
||||
,PCPEDC.HORAFAT as "invoiceHour"
|
||||
,PCPEDC.MINUTOFAT as "invoiceMinute"
|
||||
,PCPEDC.NUMNOTA as "invoiceNumber"
|
||||
,PCPEDC.MOTIVOPOSICAO as "BloqDescription"
|
||||
,PCNFSAID.DTCANHOTO as "confirmDeliveryDate"
|
||||
,PCPEDC.TOTPESO as "totalWeigth"
|
||||
,CASE WHEN PCNFSAID.DTCANHOTO IS NOT NULL THEN 4
|
||||
WHEN PCPEDC.POSICAO = 'F' THEN 3
|
||||
WHEN PCPEDC.DTFINALSEP IS NOT NULL THEN 2
|
||||
WHEN PCPEDC.POSICAO = 'M' THEN 1
|
||||
WHEN PCPEDC.POSICAO IN ('L', 'P', 'B') THEN 0
|
||||
ELSE 0 END as "processOrder"
|
||||
,( SELECT COUNT(1) FROM PCPREST, PCNFSAID, PCPEDC PED_VGER
|
||||
WHERE PCPREST.NUMTRANSVENDA = PCNFSAID.NUMTRANSVENDA
|
||||
AND PCNFSAID.NUMTRANSVENDA = PED_VGER.NUMTRANSVENDA
|
||||
AND PED_VGER.NUMPED = PCPEDC.NUMPEDENTFUT
|
||||
AND PCPREST.DTPAG IS NULL
|
||||
AND PCPREST.CODCOB = 'VGER' ) as "payment"
|
||||
,MOTORISTA.MATRICULA || ' - ' || MOTORISTA.NOME as "driver"
|
||||
,PCPEDC.NUMPEDENTFUT as "orderSaleId"
|
||||
,PCVEICUL.DESCRICAO||' ( '|| PCVEICUL.PLACA||' )' as "carDescription"
|
||||
,PCVEICUL.PLACA as "carIdentification"
|
||||
,PCPEDC.CODFORNECFRETE||' - '||PCFORNEC.FORNECEDOR as "carrier"
|
||||
,CASE WHEN (SELECT COUNT(1) FROM PCNFENT, PCFILIAL
|
||||
WHERE PCFILIAL.CODIGO = PCPEDC.CODFILIAL
|
||||
AND PCFILIAL.CODFORNEC = PCNFENT.CODFORNEC
|
||||
AND PCNFENT.NUMNOTA = PCPEDC.NUMNOTA ) = 0
|
||||
AND PCPEDC.CONDVENDA = 10
|
||||
AND PCPEDC.POSICAO = 'F' THEN 'Em Trânsito'
|
||||
WHEN PCPEDC.POSICAO = 'M'
|
||||
AND PCPEDC.CONDVENDA = 10 THEN 'Em Separação'
|
||||
WHEN PCPEDC.POSICAO IN ( 'L', 'P' )
|
||||
AND PCPEDC.CONDVENDA = 10 THEN 'Aguardando Separação'
|
||||
WHEN PCPEDC.CONDVENDA NOT IN ( 10 ) THEN NULL
|
||||
ELSE 'Concluída' END as "statusTransfer"
|
||||
,PCPEDC.CODFILIALLOJA as "storePreBox"
|
||||
FROM PCPEDC, PCCLIENT, PCUSUARI, PCSUPERV, PCCOB, PCPLPAG, PCCARREG, PCNFSAID,
|
||||
PCEMPR MOTORISTA, PCVEICUL, PCFORNEC
|
||||
WHERE PCPEDC.CODCLI = PCCLIENT.CODCLI
|
||||
AND PCPEDC.CODUSUR = PCUSUARI.CODUSUR
|
||||
AND PCPEDC.CODPLPAG = PCPLPAG.CODPLPAG
|
||||
AND PCPEDC.CODCOB = PCCOB.CODCOB
|
||||
AND PCPEDC.CODSUPERVISOR = PCSUPERV.CODSUPERVISOR
|
||||
AND PCPEDC.NUMTRANSVENDA = PCNFSAID.NUMTRANSVENDA (+)
|
||||
AND PCPEDC.NUMCAR = PCCARREG.NUMCAR (+)
|
||||
AND PCCARREG.CODMOTORISTA = MOTORISTA.MATRICULA (+)
|
||||
AND PCCARREG.CODVEICULO = PCVEICUL.CODVEICULO (+)
|
||||
AND PCPEDC.CODFORNECFRETE = PCFORNEC.CODFORNEC (+)`;
|
||||
|
||||
let sqlWhere = "";
|
||||
if (query.storeId) {
|
||||
sqlWhere += ` AND PCPEDC.CODFILIAL = '${query.storeId}'`;
|
||||
}
|
||||
if (query.storeStockId) {
|
||||
sqlWhere += ` AND EXISTS(SELECT PCPEDI.CODPROD FROM PCPEDI
|
||||
WHERE PCPEDI.NUMPED = PCPEDC.NUMPED
|
||||
AND PCPEDI.CODFILIALRETIRA = '${query.storeStockId}' )`;
|
||||
}
|
||||
|
||||
if (query.sellerId) {
|
||||
sqlWhere += ` AND PCPEDC.CODUSUR = ${query.sellerId}`;
|
||||
}
|
||||
if (query.customerId) {
|
||||
sqlWhere += ` AND PCPEDC.CODCLI = ${query.customerId}`;
|
||||
}
|
||||
if (query.billingId) {
|
||||
sqlWhere += ` AND PCPEDC.CODCOB = '${query.billingId}'`;
|
||||
}
|
||||
if (query.orderId) {
|
||||
sqlWhere += ` AND ( PCPEDC.NUMPED = ${query.orderId} or PCPEDC.NUMPEDENTFUT = ${query.orderId} )`;
|
||||
}
|
||||
if (query.invoiceId) {
|
||||
sqlWhere += ` AND PCPEDC.NUMNOTA = ${query.invoiceId}`;
|
||||
}
|
||||
if (query.productId) {
|
||||
sqlWhere += ` AND EXISTS(SELECT PCPEDI.CODPROD FROM PCPEDI
|
||||
WHERE PCPEDI.NUMPED = PCPEDC.NUMPED
|
||||
AND PCPEDI.CODPROD = ${query.productId} )`;
|
||||
}
|
||||
if (query.createDateIni) {
|
||||
sqlWhere += ` AND PCPEDC.DATA >= TO_DATE('${query.createDateIni}', 'YYYY-MM-DD')`;
|
||||
}
|
||||
if (query.createDateEnd) {
|
||||
sqlWhere += ` AND PCPEDC.DATA <= TO_DATE('${query.createDateEnd}', 'YYYY-MM-DD')`;
|
||||
}
|
||||
if (query.invoiceDateIni) {
|
||||
sqlWhere += ` AND PCPEDC.DTFAT >= TO_DATE('${query.invoiceDateIni}', 'YYYY-MM-DD')`;
|
||||
}
|
||||
if (query.invoiceDateEnd) {
|
||||
sqlWhere += ` AND PCPEDC.DTFAT <= TO_DATE('${query.invoiceDateEnd}', 'YYYY-MM-DD')`;
|
||||
}
|
||||
if (query.shippimentId) {
|
||||
sqlWhere += ` AND PCPEDC.NUMCAR = ${query.shippimentId}`;
|
||||
}
|
||||
if (query.deliveryType) {
|
||||
const deliveryType: string[] = query.deliveryType.split(',');
|
||||
const listDeliveryType = deliveryType.map(type => `'${type}'`)
|
||||
sqlWhere += ` AND EXISTS(SELECT PCPEDI.CODPROD FROM PCPEDI
|
||||
WHERE PCPEDI.NUMPED = PCPEDC.NUMPED
|
||||
AND PCPEDI.TIPOENTREGA IN ( ${listDeliveryType} ) )`;
|
||||
}
|
||||
|
||||
if (query.status) {
|
||||
const statusOrder: string[] = query.status.split(',');
|
||||
const listStatusOrder = statusOrder.map(status => `'${status}'`)
|
||||
sqlWhere += ` AND PCPEDC.POSICAO IN ( ${listStatusOrder} )`;
|
||||
}
|
||||
|
||||
if (query.type) {
|
||||
const typeOrder: string[] = query.type.split(',');
|
||||
const listTypeOrder = typeOrder.map(type => `'${type}'`)
|
||||
sqlWhere += ` AND PCPEDC.CONDVENDA IN ( ${listTypeOrder} )`;
|
||||
}
|
||||
|
||||
if (query.onlyPendentingTransfer && query.onlyPendentingTransfer == "S") {
|
||||
sqlWhere += ` AND NOT EXISTS(SELECT PCNFENT.NUMTRANSENT FROM PCNFENT, PCFILIAL
|
||||
WHERE PCFILIAL.CODIGO = PCPEDC.CODFILIAL
|
||||
AND PCFILIAL.CODFORNEC = PCNFENT.CODFORNEC
|
||||
AND PCNFENT.NUMNOTA = PCPEDC.NUMNOTA ) `
|
||||
}
|
||||
|
||||
sql += sqlWhere;
|
||||
|
||||
sql += ' AND ROWNUM < 5000';
|
||||
|
||||
const orders = await queryRunner.manager.query(sql);
|
||||
|
||||
return orders;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async findInvoice(chavenfe: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
|
||||
|
||||
const sql = `select pcnfsaid.codfilial as "storeId",
|
||||
pcnfsaid.dtsaida as "invoiceDate",
|
||||
pcnfsaid.numped as "orderId",
|
||||
pcnfsaid.numnota as "invoiceId",
|
||||
pcnfsaid.numtransvenda as "transactionId",
|
||||
pcnfsaid.codcli as "customerId",
|
||||
pcclient.cliente as "customer",
|
||||
pcnfsaid.codusur as "sellerId",
|
||||
pcusuari.nome as "sellerName",
|
||||
( select sum(pcmov.qt) from pcmov where pcmov.numtransvenda = pcnfsaid.numtransvenda ) as "itensQt",
|
||||
null as "itens"
|
||||
from pcnfsaid, pcclient, pcusuari
|
||||
where pcnfsaid.codcli = pcclient.codcli
|
||||
and pcnfsaid.codusur = pcusuari.codusur
|
||||
and pcnfsaid.chavenfe = '${chavenfe}'`;
|
||||
|
||||
const invoice = await queryRunner.manager.query(sql);
|
||||
|
||||
if ( invoice == null || invoice.length == 0 ) {
|
||||
throw new HttpException('Nota fiscal não foi localizada na sistema', HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
|
||||
const sqlItem = `select pcmov.codprod as "productId"
|
||||
,pcprodut.descricao as "productName"
|
||||
,pcprodut.embalagem as "package"
|
||||
,pcmov.qt as "qt"
|
||||
,pcprodut.codauxiliar as "ean"
|
||||
,pcprodut.multiplo as "multiple"
|
||||
,pcprodut.tipoproduto as "productType"
|
||||
,REPLACE(CASE WHEN INSTR(PCPRODUT.URLIMAGEM, ';') > 0 THEN
|
||||
SUBSTR(PCPRODUT.URLIMAGEM,1,INSTR(PCPRODUT.URLIMAGEM, ';') - 1)
|
||||
WHEN PCPRODUT.URLIMAGEM IS NOT NULL THEN
|
||||
PCPRODUT.URLIMAGEM
|
||||
ELSE NULL END, '167.249.211.178:8001', '10.1.1.191') as "image"
|
||||
from pcmov, pcprodut
|
||||
where pcmov.codprod = pcprodut.codprod
|
||||
and pcmov.numtransvenda = ${invoice[0].transactionId}`;
|
||||
|
||||
const itens = await queryRunner.manager.query(sqlItem);
|
||||
|
||||
const sqlProduct = `SELECT PCPRODUT.URLIMAGEM FROM PCPRODUT WHERE CODPROD = `
|
||||
|
||||
invoice[0].itens = [...itens];
|
||||
|
||||
return invoice[0];
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async getItens(orderId: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCPEDI.CODPROD as "productId"
|
||||
, PCPRODUT.DESCRICAO as "description"
|
||||
, PCPRODUT.EMBALAGEM as "pacth"
|
||||
, NVL(PCPEDI.COMPLEMENTO,
|
||||
( SELECT TV7I.COMPLEMENTO FROM PCPEDC, PCPEDC TV7, PCPEDITEMP TV7I
|
||||
WHERE TV7.NUMPED = PCPEDC.NUMPEDENTFUT
|
||||
AND PCPEDC.NUMPED = PCPEDI.NUMPED
|
||||
AND TV7.NUMPEDRCA = TV7I.NUMPEDRCA
|
||||
AND TV7I.CODPROD = PCPEDI.codprod
|
||||
AND TV7I.NUMSEQ = PCPEDI.NUMSEQ ) ) as "color"
|
||||
, PCPEDI.CODFILIALRETIRA as "stockId"
|
||||
, PCPEDI.QT as "quantity"
|
||||
, PCPEDI.PVENDA as "salePrice"
|
||||
, CASE WHEN PCPEDI.TIPOENTREGA = 'RI' THEN 'RETIRA IMEDIATA'
|
||||
WHEN PCPEDI.TIPOENTREGA = 'RP' THEN 'RETIRA POSTERIOR'
|
||||
WHEN PCPEDI.TIPOENTREGA = 'EN' THEN 'ENTREGA'
|
||||
WHEN PCPEDI.TIPOENTREGA = 'EF' THEN 'ENTREGA FUTURA'
|
||||
END as "deliveryType"
|
||||
, ( PCPEDI.QT *
|
||||
PCPEDI.PVENDA ) as "total"
|
||||
, ( PCPEDI.QT * PCPRODUT.PESOBRUTO ) as "weigth"
|
||||
, PCDEPTO.DESCRICAO as "department"
|
||||
, PCMARCA.MARCA as "brand"
|
||||
FROM PCPEDI, PCPRODUT, PCDEPTO, PCMARCA
|
||||
WHERE PCPEDI.CODPROD = PCPRODUT.CODPROD
|
||||
AND PCPRODUT.CODEPTO = PCDEPTO.CODEPTO
|
||||
AND PCPRODUT.CODMARCA = PCMARCA.CODMARCA
|
||||
AND PCPEDI.NUMPED = ${orderId}`;
|
||||
|
||||
const itens = await queryRunner.manager.query(sql);
|
||||
|
||||
return itens;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async getCutItens(orderId: string) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCCORTEI.CODPROD as "productId"
|
||||
, PCPRODUT.DESCRICAO as "description"
|
||||
, PCPRODUT.EMBALAGEM as "pacth"
|
||||
, PCCORTEI.CODFILIAL as "stockId"
|
||||
, ( PCCORTEI.QTSEPARADA +
|
||||
PCCORTEI.QTCORTADA ) as "saleQuantity"
|
||||
, PCCORTEI.QTCORTADA as "cutQuantity"
|
||||
, PCCORTEI.QTSEPARADA as "separedQuantity"
|
||||
FROM PCCORTEI, PCPRODUT
|
||||
WHERE PCCORTEI.CODPROD = PCPRODUT.CODPROD
|
||||
AND PCCORTEI.NUMPED = ${orderId}`;
|
||||
|
||||
const itens = await queryRunner.manager.query(sql);
|
||||
|
||||
return itens;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async getOrderDelivery(orderId: string){
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCPRACA.CODPRACA as "placeId"
|
||||
,PCPRACA.PRACA as "placeName"
|
||||
,NVL(ENDENT.ENDERENT, PCCLIENT.ENDERENT) as "street"
|
||||
,NVL(ENDENT.NUMEROENT, PCCLIENT.NUMEROENT) as "addressNumber"
|
||||
,NVL(ENDENT.BAIRROENT, PCCLIENT.BAIRROENT) as "bairro"
|
||||
,NVL(ENDENT.MUNICENT, PCCLIENT.MUNICENT) as "city"
|
||||
,NVL(ENDENT.ESTENT, PCCLIENT.ESTENT) as "state"
|
||||
,NVL(ENDENT.COMPLEMENTOENT, PCCLIENT.COMPLEMENTOENT) as "addressComplement"
|
||||
,NVL(ENDENT.CEPENT, PCCLIENT.CEPENT) as "cep"
|
||||
,PCPEDC.OBS1 as "commentOrder1"
|
||||
,PCPEDC.OBS2 as "commentOrder2"
|
||||
,PCPEDC.OBSENTREGA1 as "commentDelivery1"
|
||||
,PCPEDC.OBSENTREGA2 as "commentDelivery2"
|
||||
,PCPEDC.OBSENTREGA3 as "commentDelivery3"
|
||||
,PCPEDC.OBSENTREGA4 as "commentDelivery4"
|
||||
,PCPEDC.NUMCAR as "shippimentId"
|
||||
,PCCARREG.DTSAIDA as "shippimentDate"
|
||||
,PCCARREG.DESTINO as "shippimentComment"
|
||||
,PCROTAEXP.DESCRICAO as "place"
|
||||
,PCEMPR.MATRICULA||'-'||
|
||||
PCEMPR.NOME as "driver"
|
||||
,PCVEICUL.PLACA||' - '||PCVEICUL.DESCRICAO as "car"
|
||||
,CASE WHEN PCCARREG.DTFECHA < PCCARREG.DTSAIDA THEN NULL
|
||||
ELSE PCCARREG.DTFECHA END as "closeDate"
|
||||
,SEPARADOR.NOME as "separatorName"
|
||||
,CONFERENTE.NOME as "confName"
|
||||
,PCPEDC.DTLIBERA as "releaseDate"
|
||||
FROM PCPEDC, PCCLIENT, PCPRACA, PCCLIENTENDENT ENDENT, PCCARREG, PCVEICUL, PCEMPR, PCROTAEXP,
|
||||
PCEMPR SEPARADOR, PCEMPR CONFERENTE
|
||||
WHERE NVL(ENDENT.CODPRACAENT, PCPEDC.CODPRACA) = PCPRACA.CODPRACA
|
||||
AND PCPEDC.CODCLI = PCCLIENT.CODCLI
|
||||
AND PCPEDC.CODENDENTCLI = ENDENT.CODENDENTCLI (+)
|
||||
AND PCPEDC.CODCLI = ENDENT.CODCLI (+)
|
||||
AND PCPEDC.NUMCAR = PCCARREG.NUMCAR (+)
|
||||
AND PCCARREG.CODMOTORISTA = PCEMPR.MATRICULA (+)
|
||||
AND PCCARREG.CODVEICULO = PCVEICUL.CODVEICULO (+)
|
||||
AND PCCARREG.CODROTAPRINC = PCROTAEXP.CODROTA (+)
|
||||
AND PCPEDC.CODFUNCSEP = SEPARADOR.MATRICULA (+)
|
||||
AND PCPEDC.CODFUNCCONF = CONFERENTE.MATRICULA (+)
|
||||
AND PCPEDC.NUMPED = ${orderId}`;
|
||||
|
||||
const orderDelivery = await queryRunner.manager.query(sql);
|
||||
if ( orderDelivery.length > 0 ) {
|
||||
return orderDelivery[0];
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
async getTransfer(orderId: number) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT L.NUMPED as "orderId"
|
||||
,L.DTTRANSF as "transferDate"
|
||||
,L.NUMNOTA as "invoiceId"
|
||||
,L.NUMTRANSVENDA as "transactionId"
|
||||
,L.NUMCARANTERIOR as "oldShipment"
|
||||
,L.NUMCARATUAL as "newShipment"
|
||||
,L.MOTIVOTRANSF as "transferText"
|
||||
,L.codmotivo||'-'||PCTABDEV.MOTIVO as "cause"
|
||||
,L.codfunctransf||'-'||PCEMPR.NOME as "userName"
|
||||
,L.rotinatransf as "program"
|
||||
FROM PCLOGTRANSFNFCARREG L, PCTABDEV, PCEMPR
|
||||
WHERE L.CODMOTIVO = PCTABDEV.coddevol (+)
|
||||
AND L.CODFUNCTRANSF = PCEMPR.MATRICULA (+)
|
||||
AND L.NUMTRANSVENDA IN ( SELECT PCPEDC.NUMTRANSVENDA FROM PCPEDC WHERE PCPEDC.NUMPED = ${orderId} )`;
|
||||
|
||||
const transferOrder = await queryRunner.manager.query(sql);
|
||||
if ( transferOrder.length > 0 ) {
|
||||
return transferOrder;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async getStatusOrder(orderId: number) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT pcpedc.numped AS "orderId",
|
||||
'Digitação pedido' AS "status",
|
||||
TO_DATE (TO_CHAR(pcpedc.data, 'DD/MM/YYYY') || ' ' || pcpedc.hora || ':' || pcpedc.minuto,
|
||||
'DD/MM/YYYY HH24:MI')
|
||||
AS "statusDate",
|
||||
pcpedc.codemitente || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr
|
||||
WHERE pcpedc.numped = ${orderId} AND pcpedc.codemitente = pcempr.matricula(+)
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Montagem de carga' AS "status",
|
||||
TO_DATE (
|
||||
TO_CHAR(pccarreg.datamon, 'DD/MM/YYYY')
|
||||
|| ' '
|
||||
|| pccarreg.horamon
|
||||
|| ':'
|
||||
|| pccarreg.minutomon,
|
||||
'DD/MM/YYYY HH24:MI')
|
||||
AS "statusDate",
|
||||
pccarreg.codfuncmon || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr, pccarreg
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pccarreg.codfuncmon = pcempr.matricula(+)
|
||||
AND pcpedc.numcar = pccarreg.numcar
|
||||
AND pcpedc.numcar > 0
|
||||
AND pccarreg.datamon is not null
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Emissão do mapa' AS "status",
|
||||
CASE WHEN PCPEDC.DTEMISSAOMAPA IS NOT NULL THEN
|
||||
TO_DATE (
|
||||
TO_CHAR(pcpedc.dtemissaomapa, 'DD/MM/YYYY')
|
||||
|| ' '
|
||||
|| NVL(pcpedc.horaemissaomapa, '00')
|
||||
|| ':'
|
||||
|| nvl(pcpedc.minutoemissaomapa, '01'),
|
||||
'DD/MM/YYYY HH24:MI') ELSE NULL END
|
||||
AS "statusDate",
|
||||
pcpedc.codfuncemissaomapa || '-' || pcempr.nome AS "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pcpedc.codfuncemissaomapa = pcempr.matricula(+)
|
||||
AND PCPEDC.DTEMISSAOMAPA IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Inicio de Separação' AS "status",
|
||||
pcpedc.dtinicialsep as "statusDate",
|
||||
pcpedc.codfuncsep || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pcpedc.codfuncsep = pcempr.matricula(+)
|
||||
AND PCPEDC.dtinicialsep IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Fim de Separação' AS "status",
|
||||
pcpedc.dtfinalsep as "statusDate",
|
||||
pcpedc.codfuncsep || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr
|
||||
WHERE pcpedc.numped = ${orderId} AND pcpedc.codfuncsep = pcempr.matricula(+)
|
||||
and pcpedc.dtfinalsep is not null
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Inicio conferência' AS "status",
|
||||
pcpedc.dtinicialcheckout AS "statusDate",
|
||||
pcpedc.codfuncconf || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pcpedc.codfuncconf = pcempr.matricula(+)
|
||||
AND pcpedc.dtinicialcheckout IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Fim conferência' AS "status",
|
||||
pcpedc.dtfinalcheckout AS "statusDate",
|
||||
pcpedc.codfuncconf || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pcpedc.codfuncconf = pcempr.matricula(+)
|
||||
AND pcpedc.dtfinalcheckout IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Faturamento' AS "status",
|
||||
TO_DATE (
|
||||
TO_CHAR(pcpedc.dtfat, 'DD/MM/YYYY') || ' ' || pcpedc.horafat || ':' || pcpedc.minutofat,
|
||||
'DD/MM/YYYY HH24:MI')
|
||||
AS "statusDate",
|
||||
pcempr.matricula || '-' || pcempr.nome "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcempr, pccarreg, pcnfsaid
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pcpedc.numcar = pccarreg.numcar
|
||||
and pcpedc.numtransvenda = pcnfsaid.numtransvenda
|
||||
AND nvl(pcnfsaid.codemitente, decode(pcpedc.numcar,0,-1,pccarreg.codfuncfat)) = pcempr.matricula(+)
|
||||
AND pcpedc.dtfat IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Entrega' AS "status",
|
||||
pcnfsaid.dtcanhoto AS "statusDate",
|
||||
CASE WHEN PCNFSAID.NUMCAR > 0 THEN
|
||||
pcnfsaid.codfunccanhoto || '-' || pcempr.nome
|
||||
ELSE '' END "userName"
|
||||
,NULL as "comments"
|
||||
FROM pcpedc, pcnfsaid, pcempr, pccarreg
|
||||
WHERE pcpedc.numped = ${orderId}
|
||||
AND pcpedc.numtransvenda = pcnfsaid.numtransvenda
|
||||
AND pcnfsaid.numcar = pccarreg.numcar (+)
|
||||
AND pcnfsaid.codfunccanhoto = pcempr.matricula(+)
|
||||
AND pcnfsaid.dtcanhoto IS NOT NULL
|
||||
UNION ALL
|
||||
SELECT pcpedc.numped AS "orderId",
|
||||
'Transf entre carregamento' AS "status",
|
||||
pclogtransfnfcarreg.dttransf AS "statusDate",
|
||||
pclogtransfnfcarreg.codfunctransf || '-' || pcempr.nome "userName",
|
||||
'ORIG: '||pclogtransfnfcarreg.numcaranterior || ' ->
|
||||
DEST.: ' ||pclogtransfnfcarreg.numcaratual as "comments"
|
||||
FROM pclogtransfnfcarreg, pcpedc, pcempr
|
||||
WHERE pclogtransfnfcarreg.numnota = pcpedc.numnota (+)
|
||||
AND pcpedc.numped = ${orderId}
|
||||
AND pclogtransfnfcarreg.codfunctransf = pcempr.matricula(+)
|
||||
ORDER BY 3`;
|
||||
|
||||
const statusOrder = await queryRunner.manager.query(sql);
|
||||
if ( statusOrder.length > 0 ) {
|
||||
return statusOrder;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} catch(e) {
|
||||
console.log(e);
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async createInvoiceCheck(invoice: any) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
// TO_DATE('YYYY-MM-DDTHH24:MI:SS.000Z','${invoice.startDate}'),
|
||||
// TO_DATE('YYYY-MM-DDTHH24:MI:SS.000Z','${invoice.endDate}'),
|
||||
try {
|
||||
const sqlSequence = 'SELECT ESSCONFERENCIANF.NEXTVAL as "id" FROM DUAL';
|
||||
const dbSequence = await queryRunner.manager.query(sqlSequence);
|
||||
|
||||
const checkId = dbSequence[0].id;
|
||||
|
||||
|
||||
const sql = `INSERT INTO ESTCONFERENCIANF ( ID, NUMTRANSVENDA, CODFILIAL, NUMNOTA, DTINICIO, DTFIM, CODFUNCCONF )
|
||||
VALUES ( ${checkId}, ${invoice.transactionId}, ${invoice.storeId}, ${invoice.invoiceId},
|
||||
TO_DATE(SUBSTR(REPLACE(REPLACE('${invoice.startDate}', 'T', ' '), 'Z', ''),1,18), 'YYYY-MM-DD HH24:MI:SS'),
|
||||
TO_DATE(SUBSTR(REPLACE(REPLACE('${invoice.endDate}', 'T', ' '), 'Z', ''),1,18), 'YYYY-MM-DD HH24:MI:SS'),
|
||||
${invoice.userId} )`;
|
||||
await queryRunner.manager.query(sql);
|
||||
|
||||
for ( const item of invoice.itens ) {
|
||||
const sqlItem = `INSERT INTO ESTCONFERENCIANFITENS ( IDCONF, NUMTRANSVENDA, CODPROD, NUMSEQ, QT, DTCONF )
|
||||
VALUES ( ${checkId}, ${invoice.transactionId}, ${item.productId}, ${item.seq}, ${item.qt},
|
||||
TO_DATE(SUBSTR(REPLACE(REPLACE('${item.confDate}', 'T', ' '), 'Z', ''),1,18), 'YYYY-MM-DD HH24:MI:SS') )`;
|
||||
await queryRunner.manager.query(sqlItem);
|
||||
}
|
||||
await queryRunner.commitTransaction();
|
||||
|
||||
return { message: 'Conferência salva com sucesso!' }
|
||||
|
||||
} catch(erro) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
console.log(erro);
|
||||
throw new HttpException(erro.message, HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
31
src/products/products.controller.ts
Normal file
31
src/products/products.controller.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/controllers#controllers
|
||||
*/
|
||||
|
||||
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
|
||||
import { ProductsService } from './products.service';
|
||||
import { ExposedProduct } from 'src/core/models/exposed-product.model';
|
||||
|
||||
@Controller('api/v1/products')
|
||||
export class ProductsController {
|
||||
|
||||
constructor(private readonly productsService: ProductsService) { }
|
||||
|
||||
@Get('products-ecommerce')
|
||||
async productsEcommerce() {
|
||||
return this.productsService.getProductsEcommerce();
|
||||
}
|
||||
|
||||
@Get('product-validation/:storeId/:filtro')
|
||||
async productValidation(@Param('storeId') storeId: string, @Param('filtro') filtro: string) {
|
||||
return this.productsService.productsValidation(storeId, filtro);
|
||||
}
|
||||
|
||||
@Post('exposed-product')
|
||||
async exposedProduct(@Body() exposedProduct: ExposedProduct) {
|
||||
return this.productsService.exposedProduct(exposedProduct);
|
||||
}
|
||||
}
|
||||
19
src/products/products.module.ts
Normal file
19
src/products/products.module.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/modules
|
||||
*/
|
||||
|
||||
import { Module } from '@nestjs/common';
|
||||
import { ProductsService } from './products.service';
|
||||
import { ProductsController } from './products.controller';
|
||||
|
||||
@Module({
|
||||
imports: [],
|
||||
controllers: [
|
||||
ProductsController,],
|
||||
providers: [
|
||||
ProductsService,],
|
||||
})
|
||||
export class ProductsModule { }
|
||||
122
src/products/products.service.ts
Normal file
122
src/products/products.service.ts
Normal file
@@ -0,0 +1,122 @@
|
||||
/* eslint-disable prettier/prettier */
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
|
||||
/*
|
||||
https://docs.nestjs.com/providers#services
|
||||
*/
|
||||
|
||||
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
||||
import { typeOrmConfig } from 'src/core/configs/typeorm.config';
|
||||
import { ExposedProduct } from 'src/core/models/exposed-product.model';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
@Injectable()
|
||||
export class ProductsService {
|
||||
|
||||
async productsValidation(storeId: string, filtro: string): Promise<any> {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sql = `SELECT PCPRODUT.DESCRICAO as "descricao"
|
||||
,PCPRODUT.CODPROD as "codigoProduto"
|
||||
,PCPRODUT.CODAUXILIAR as "codigoAuxiliar"
|
||||
,PCMARCA.MARCA as "marca"
|
||||
,REPLACE(NVL(URLIMAGEM, 'http://10.1.1.191/si.png'), 'http://167.249.211.178:8001/', 'http://10.1.1.191/') as "images"
|
||||
,CASE WHEN PCPRODUT.TIPOPRODUTO = 'A' THEN 'AUTOSSERVICO'
|
||||
WHEN PCPRODUT.TIPOPRODUTO = 'S' THEN 'SHOWROOM'
|
||||
WHEN PCPRODUT.TIPOPRODUTO = 'E' THEN 'ELETROMOVEIS'
|
||||
ELSE 'OUTROS' END as "tipoProduto"
|
||||
,PCTABPR.PVENDA1 as "precoVenda"
|
||||
,( PCEST.QTESTGER - PCEST.QTRESERV - PCEST.QTBLOQUEADA ) as "qtdeEstoqueLoja"
|
||||
,( SELECT ( ESTOQUE_CD.QTESTGER - ESTOQUE_CD.QTRESERV - ESTOQUE_CD.QTBLOQUEADA )
|
||||
FROM PCEST ESTOQUE_CD
|
||||
WHERE ESTOQUE_CD.CODPROD = PCPRODUT.CODPROD
|
||||
AND ESTOQUE_CD.CODFILIAL = 6 ) as "qtdeEstoqueCD"
|
||||
FROM PCPRODUT, PCEST, PCTABPR, PCMARCA
|
||||
WHERE PCPRODUT.CODPROD = PCEST.CODPROD
|
||||
AND PCPRODUT.CODPROD = PCTABPR.CODPROD
|
||||
AND PCPRODUT.CODMARCA = PCMARCA.CODMARCA
|
||||
AND PCTABPR.NUMREGIAO = 1
|
||||
AND PCEST.CODFILIAL = '${storeId}'
|
||||
AND ( PCPRODUT.CODAUXILIAR = REGEXP_REPLACE('${filtro}', '[^0-9]', '') OR
|
||||
PCPRODUT.CODPROD = REGEXP_REPLACE('${filtro}', '[^0-9]', '') OR
|
||||
PCPRODUT.DESCRICAO LIKE '%'||'${filtro}'||'%' )`;
|
||||
|
||||
|
||||
const products = await queryRunner.manager.query(sql);
|
||||
|
||||
if (products.length == 0) {
|
||||
throw new HttpException('Produto não localizado!', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
const product = products[0];
|
||||
|
||||
if ( product.images == null ) {
|
||||
product.images = [];
|
||||
} else {
|
||||
const imagesString: string = product.images;
|
||||
if (imagesString.indexOf(';') > 0) {
|
||||
const imagesArray = imagesString.split(';');
|
||||
product.images = imagesArray;
|
||||
} else {
|
||||
const imagesArray: string[] = [];
|
||||
imagesArray.push(product.images);
|
||||
product.images = imagesArray;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return product;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async exposedProduct(product: ExposedProduct) {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
try {
|
||||
const sqlInsert = `INSERT INTO ESTPRODUTOEXPOSICAO ( CODFILIAL, DATA, CODAUXILIAR, CODFUNC )
|
||||
VALUES ( '${product.storeId}', TRUNC(SYSDATE), ${product.ean}, ${product.userId})`;
|
||||
await queryRunner.query(sqlInsert);
|
||||
await queryRunner.commitTransaction();
|
||||
return { message: 'Registro incluído com sucesso!'}
|
||||
} catch (err) {
|
||||
await queryRunner.rollbackTransaction();
|
||||
throw err;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
async getProductsEcommerce() {
|
||||
const dataSource = new DataSource(typeOrmConfig);
|
||||
await dataSource.initialize();
|
||||
const queryRunner = dataSource.createQueryRunner();
|
||||
await queryRunner.connect();
|
||||
try {
|
||||
const sqlInsert = `SELECT P.CODPROD as "productIdErp"
|
||||
,P.VTEXSKUID as "productId"
|
||||
,ROUND(P.PVENDA,2) as "price"
|
||||
,ROUND(P.PRECOKIT,2) as "priceKit"
|
||||
FROM ESVPRODUTOSECOMMERCE P
|
||||
WHERE P.VTEXSKUID > 0
|
||||
AND P.CODPROD IN (52057, 33702, 46410, 24518, 25816)`;
|
||||
const products = await queryRunner.query(sqlInsert);
|
||||
return products;
|
||||
} catch (err) {
|
||||
throw err;
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
await dataSource.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
24
test/app.e2e-spec.ts
Normal file
24
test/app.e2e-spec.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { INestApplication } from '@nestjs/common';
|
||||
import * as request from 'supertest';
|
||||
import { AppModule } from './../src/app.module';
|
||||
|
||||
describe('AppController (e2e)', () => {
|
||||
let app: INestApplication;
|
||||
|
||||
beforeEach(async () => {
|
||||
const moduleFixture: TestingModule = await Test.createTestingModule({
|
||||
imports: [AppModule],
|
||||
}).compile();
|
||||
|
||||
app = moduleFixture.createNestApplication();
|
||||
await app.init();
|
||||
});
|
||||
|
||||
it('/ (GET)', () => {
|
||||
return request(app.getHttpServer())
|
||||
.get('/')
|
||||
.expect(200)
|
||||
.expect('Hello World!');
|
||||
});
|
||||
});
|
||||
9
test/jest-e2e.json
Normal file
9
test/jest-e2e.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"moduleFileExtensions": ["js", "json", "ts"],
|
||||
"rootDir": ".",
|
||||
"testEnvironment": "node",
|
||||
"testRegex": ".e2e-spec.ts$",
|
||||
"transform": {
|
||||
"^.+\\.(t|j)s$": "ts-jest"
|
||||
}
|
||||
}
|
||||
4
tsconfig.build.json
Normal file
4
tsconfig.build.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
|
||||
}
|
||||
15
tsconfig.json
Normal file
15
tsconfig.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"declaration": true,
|
||||
"removeComments": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"target": "es2017",
|
||||
"sourceMap": true,
|
||||
"outDir": "./dist",
|
||||
"baseUrl": "./",
|
||||
"incremental": true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user