v0.6.2
This commit is contained in:
parent
108bbea5fc
commit
e87e3ec609
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "WEB: Vite (Chrome)",
|
"name": "WEB: Vite (Chrome)",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/factuges-server",
|
"name": "@erp/factuges-server",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsup src/index.ts --config tsup.config.ts",
|
"build": "tsup src/index.ts --config tsup.config.ts",
|
||||||
|
|||||||
@ -5,9 +5,8 @@
|
|||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
"allowImportingTsExtensions": true,
|
"allowImportingTsExtensions": true,
|
||||||
"lib": ["ES2022"],
|
"lib": ["ES2022"],
|
||||||
"baseUrl": "./src",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["*"]
|
"@/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"outDir": "./dist",
|
"outDir": "./dist",
|
||||||
"rootDir": "./src",
|
"rootDir": "./src",
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/factuges-web",
|
"name": "@erp/factuges-web",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --host --clearScreen false",
|
"dev": "vite --host --clearScreen false",
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"esModuleInterop": true,
|
"esModuleInterop": true,
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["./src/*"]
|
"@/*": ["./src/*"]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/auth",
|
"name": "@erp/auth",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/core",
|
"name": "@erp/core",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@erp/core/*": ["./src/*"]
|
"@erp/core/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"baseUrl": ".",
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/customer-invoices",
|
"name": "@erp/customer-invoices",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -344,16 +344,16 @@ export class Proforma extends AggregateRoot<ProformaInternalProps> implements IP
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const invalidItem = this.items.find((item) => !item.isValued());
|
/*const invalidItem = this.items.find((item) => !item.isValued());
|
||||||
if (invalidItem) {
|
if (invalidItem) {
|
||||||
return Result.fail(
|
return Result.fail(
|
||||||
new DomainValidationError(
|
new DomainValidationError(
|
||||||
"INVALID_ITEM",
|
"INVALID_ITEM",
|
||||||
"items",
|
"items",
|
||||||
`Item at position ${invalidItem.id} is not valid for invoicing`
|
`Item with id ${invalidItem.id} is not valid for invoicing`
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (this.paymentMethod.isNone()) {
|
if (this.paymentMethod.isNone()) {
|
||||||
return Result.fail(
|
return Result.fail(
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@erp/customer-invoices/*": ["./src/*"]
|
"@erp/customer-invoices/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"baseUrl": ".",
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/customers",
|
"name": "@erp/customers",
|
||||||
"description": "Customers",
|
"description": "Customers",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@erp/customers/*": ["./src/*"]
|
"@erp/customers/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"baseUrl": ".",
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/factuges",
|
"name": "@erp/factuges",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
import { mockUser, requireAuthenticated, requireCompanyContext } from "@erp/auth/api";
|
import { mockUser, requireAuthenticated, requireCompanyContext } from "@erp/auth/api";
|
||||||
import { type RequestWithAuth, type StartParams, validateRequest } from "@erp/core/api";
|
import { type RequestWithAuth, type StartParams, validateRequest } from "@erp/core/api";
|
||||||
|
import type { IProformaPublicServices } from "@erp/customer-invoices/api";
|
||||||
|
import type { ICustomerPublicServices } from "@erp/customers/api";
|
||||||
import { CreateProformaFromFactugesRequestSchema } from "@erp/factuges/common";
|
import { CreateProformaFromFactugesRequestSchema } from "@erp/factuges/common";
|
||||||
import { type NextFunction, type Request, type Response, Router } from "express";
|
import { type NextFunction, type Request, type Response, Router } from "express";
|
||||||
import type { IProformaPublicServices } from "node_modules/@erp/customer-invoices/src/api/application";
|
|
||||||
|
|
||||||
import type { FactugesInternalDeps } from "../di/factuges.di";
|
import type { FactugesInternalDeps } from "../di/factuges.di";
|
||||||
|
|
||||||
@ -15,7 +16,7 @@ export const factugesRouter = (params: StartParams) => {
|
|||||||
const deps = getInternal<FactugesInternalDeps>("factuges");
|
const deps = getInternal<FactugesInternalDeps>("factuges");
|
||||||
|
|
||||||
// Recuperamos servicios externos que necesitemos
|
// Recuperamos servicios externos que necesitemos
|
||||||
const customerServices = getService<CustomerPublicServices>("customers:general");
|
const customerServices = getService<ICustomerPublicServices>("customers:general");
|
||||||
const proformaServices = getService<IProformaPublicServices>("customer-invoices:proformas");
|
const proformaServices = getService<IProformaPublicServices>("customer-invoices:proformas");
|
||||||
|
|
||||||
const publicServices = {
|
const publicServices = {
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@erp/factuges/*": ["./src/*"]
|
"@erp/factuges/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"baseUrl": ".",
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/supplier-invoices",
|
"name": "@erp/supplier-invoices",
|
||||||
"description": "Supplier invoices",
|
"description": "Supplier invoices",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@erp/supplier-invoices/*": ["./src/*"]
|
"@erp/supplier-invoices/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"baseUrl": ".",
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@erp/suppliers",
|
"name": "@erp/suppliers",
|
||||||
"description": "Suppliers",
|
"description": "Suppliers",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@erp/suppliers/*": ["./src/*"]
|
"@erp/suppliers/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
"baseUrl": ".",
|
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
"target": "ES2022",
|
"target": "ES2022",
|
||||||
"useDefineForClassFields": true,
|
"useDefineForClassFields": true,
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "uecko-erp-2025",
|
"name": "uecko-erp-2025",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"version": "0.6.2",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"apps/*",
|
"apps/*",
|
||||||
"modules/*",
|
"modules/*",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@repo/rdx-criteria",
|
"name": "@repo/rdx-criteria",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@repo/rdx-ddd",
|
"name": "@repo/rdx-ddd",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@repo/rdx-logger",
|
"name": "@repo/rdx-logger",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"extends": "@repo/typescript-config/react-library.json",
|
"extends": "@repo/typescript-config/react-library.json",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@repo/rdx-ui/*": ["./src/*"]
|
"@repo/rdx-ui/*": ["./src/*"]
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@repo/rdx-utils",
|
"name": "@repo/rdx-utils",
|
||||||
"version": "0.6.1",
|
"version": "0.6.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"sideEffects": false,
|
"sideEffects": false,
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
"$schema": "https://json.schemastore.org/tsconfig",
|
"$schema": "https://json.schemastore.org/tsconfig",
|
||||||
"display": "Root",
|
"display": "Root",
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
|
||||||
"paths": {
|
"paths": {
|
||||||
"@erp/core/*": [
|
"@erp/core/*": [
|
||||||
"modules/core/src/*"
|
"modules/core/src/*"
|
||||||
|
|||||||
270
scripts/docker-compose.rodax.yml
Normal file
270
scripts/docker-compose.rodax.yml
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
name: factuges-rodax
|
||||||
|
|
||||||
|
services:
|
||||||
|
# --- Base de datos MariaDB ---
|
||||||
|
db:
|
||||||
|
image: mariadb:lts-noble
|
||||||
|
container_name: factuges_rodax_db
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASS}
|
||||||
|
MARIADB_USER: ${DB_USER}
|
||||||
|
MARIADB_PASSWORD: ${DB_PASS}
|
||||||
|
MARIADB_DATABASE: ${DB_NAME}
|
||||||
|
volumes:
|
||||||
|
- ./volumes/db_data:/var/lib/mysql
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
- edge
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||||
|
interval: 20s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 10
|
||||||
|
|
||||||
|
phpmyadmin:
|
||||||
|
image: phpmyadmin/phpmyadmin
|
||||||
|
container_name: factuges_rodax_phpmyadmin
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
PMA_ARBITRARY: 1
|
||||||
|
PMA_ABSOLUTE_URI: https://factuges.rodax-software.local/phpmyadmin/
|
||||||
|
PMA_HOST: db
|
||||||
|
PMA_USER: ${DB_USER}
|
||||||
|
PMA_PASSWORD: ${DB_PASS}
|
||||||
|
PMA_VERBOSES: "FactuGES Rodax"
|
||||||
|
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
|
||||||
|
UPLOAD_LIMIT: 64M
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
- edge
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
labels:
|
||||||
|
traefik.enable: "true"
|
||||||
|
|
||||||
|
# /phpmyadmin → phpMyAdmin
|
||||||
|
traefik.http.routers.factuges_rodax_phpmyadmin.rule: "Host(`factuges.rodax-software.local`) && PathPrefix(`/phpmyadmin/`)"
|
||||||
|
traefik.http.routers.factuges_rodax_phpmyadmin.entrypoints: "websecure"
|
||||||
|
traefik.http.routers.factuges_rodax_phpmyadmin.tls: "true"
|
||||||
|
traefik.http.routers.factuges_rodax_phpmyadmin.priority: "110"
|
||||||
|
traefik.http.routers.factuges_rodax_phpmyadmin.service: "factuges_rodax_phpmyadmin"
|
||||||
|
traefik.http.services.factuges_rodax_phpmyadmin.loadbalancer.server.port: "80"
|
||||||
|
|
||||||
|
# strip /phpmyadmin del path antes de llegar al contenedor
|
||||||
|
traefik.http.middlewares.factuges_rodax_phpmyadmin_strip.stripprefix.prefixes: "/phpmyadmin/"
|
||||||
|
|
||||||
|
# whitelist a tu IP
|
||||||
|
#traefik.http.middlewares.factuges_rodax_phpmyadmin_ipwhitelist.ipwhitelist.sourcerange: "192.168.0.0/24"
|
||||||
|
|
||||||
|
# encadenar middlewares
|
||||||
|
traefik.http.routers.factuges_rodax_phpmyadmin.middlewares: "factuges_rodax_phpmyadmin_strip"
|
||||||
|
|
||||||
|
|
||||||
|
# --- API ---
|
||||||
|
api:
|
||||||
|
image: ${API_IMAGE}
|
||||||
|
container_name: factuges_rodax_api
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
environment:
|
||||||
|
NODE_ENV: production
|
||||||
|
COMPANY_SLUG: ${COMPANY_SLUG}
|
||||||
|
FRONTEND_URL: ${FRONTEND_URL}
|
||||||
|
PORT: ${PORT}
|
||||||
|
API_BASE_PATH: ${API_BASE_PATH}
|
||||||
|
|
||||||
|
JWT_SECRET: ${JWT_SECRET}
|
||||||
|
JWT_ACCESS_EXPIRATION: ${JWT_ACCESS_EXPIRATION}
|
||||||
|
JWT_REFRESH_EXPIRATION: ${JWT_REFRESH_EXPIRATION}
|
||||||
|
|
||||||
|
WARMUP_TIMEOUT_MS: ${WARMUP_TIMEOUT_MS}
|
||||||
|
WARMUP_STRICT: ${WARMUP_STRICT}
|
||||||
|
|
||||||
|
DB_HOST: "db"
|
||||||
|
DB_PORT: ${DB_PORT}
|
||||||
|
DB_DIALECT: ${DB_DIALECT}
|
||||||
|
DB_NAME: ${DB_NAME}
|
||||||
|
DB_USER: ${DB_USER}
|
||||||
|
DB_PASS: ${DB_PASS}
|
||||||
|
DB_LOGGING: ${DB_LOGGING}
|
||||||
|
DB_SSL: ${DB_SSL}
|
||||||
|
DB_SYNC_MODE: ${DB_SYNC_MODE}
|
||||||
|
|
||||||
|
TEMPLATES_PATH: ${TEMPLATES_PATH}
|
||||||
|
|
||||||
|
FASTREPORT_BIN: ${FASTREPORT_BIN}
|
||||||
|
DOCUMENTS_PATH: ${DOCUMENTS_PATH}
|
||||||
|
|
||||||
|
SIGNED_DOCUMENTS_PATH: ${SIGNED_DOCUMENTS_PATH}
|
||||||
|
|
||||||
|
SIGNING_SERVICE_URL: ${SIGNING_SERVICE_URL}
|
||||||
|
SIGNING_SERVICE_METHOD: ${SIGNING_SERVICE_METHOD}
|
||||||
|
SIGNING_SERVICE_TIMEOUT_MS: ${SIGNING_SERVICE_TIMEOUT_MS}
|
||||||
|
SIGNING_SERVICE_MAX_RETRIES: ${SIGNING_SERVICE_MAX_RETRIES}
|
||||||
|
|
||||||
|
COMPANY_CERTIFICATES_PATH: ${COMPANY_CERTIFICATES_PATH}
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- ./volumes/templates:/shared/templates:ro
|
||||||
|
- ./volumes/certificates:/shared/certificates:rw
|
||||||
|
- ./volumes/documents:/shared/documents:rw
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
- edge
|
||||||
|
labels:
|
||||||
|
traefik.enable: "true"
|
||||||
|
|
||||||
|
# /api → backend
|
||||||
|
traefik.http.routers.factuges_rodax_api.rule: "Host(`factuges.rodax-software.local`) && PathPrefix(`/api`)"
|
||||||
|
traefik.http.routers.factuges_rodax_api.entrypoints: "websecure"
|
||||||
|
traefik.http.routers.factuges_rodax_api.tls: "true"
|
||||||
|
|
||||||
|
traefik.http.routers.factuges_rodax_api.priority: "100"
|
||||||
|
traefik.http.routers.factuges_rodax_api.service: "factuges_rodax_api"
|
||||||
|
|
||||||
|
# Servicio
|
||||||
|
traefik.http.services.factuges_rodax_api.loadbalancer.server.port: "${API_PORT:-3002}"
|
||||||
|
|
||||||
|
# --- Web estática (React compilado) ---
|
||||||
|
web:
|
||||||
|
image: nginx:alpine
|
||||||
|
container_name: factuges_rodax_web
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- api
|
||||||
|
environment:
|
||||||
|
VITE_API_SERVER_URL: https://factuges.rodax-software.local/api/v1
|
||||||
|
volumes:
|
||||||
|
# Build de Vite (en el host) -> Nginx
|
||||||
|
- ./web/latest/dist:/usr/share/nginx/html:ro
|
||||||
|
# Config de Nginx con try_files para SPA
|
||||||
|
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
|
||||||
|
networks:
|
||||||
|
- edge
|
||||||
|
labels:
|
||||||
|
traefik.enable: "true"
|
||||||
|
|
||||||
|
# Router HTTPS
|
||||||
|
traefik.http.routers.factuges_rodax_web.rule: "Host(`factuges.rodax-software.local`)"
|
||||||
|
traefik.http.routers.factuges_rodax_web.entrypoints: "websecure"
|
||||||
|
traefik.http.routers.factuges_rodax_web.tls: "true"
|
||||||
|
|
||||||
|
# Servicio
|
||||||
|
traefik.http.services.factuges_rodax_web.loadbalancer.server.port: "80"
|
||||||
|
|
||||||
|
|
||||||
|
factuges_sync:
|
||||||
|
image: "factuges-sync-factuges:rodax-latest"
|
||||||
|
container_name: "factuges_rodax_sync_factuges"
|
||||||
|
restart: "no"
|
||||||
|
environment:
|
||||||
|
ENV: "production"
|
||||||
|
LOCAL_TZ: "Europe/Madrid"
|
||||||
|
STATE_PATH: "${STATE_PATH}"
|
||||||
|
|
||||||
|
FACTUGES_HOST: "${FACTUGES_HOST}"
|
||||||
|
FACTUGES_PORT: "${FACTUGES_PORT}"
|
||||||
|
FACTUGES_DATABASE: "${FACTUGES_DATABASE}"
|
||||||
|
FACTUGES_USER: "${FACTUGES_USER}"
|
||||||
|
FACTUGES_PASSWORD: "${FACTUGES_PASSWORD}"
|
||||||
|
|
||||||
|
FWEB_MYSQL_HOST: "db"
|
||||||
|
FWEB_MYSQL_PORT: "${DB_PORT}"
|
||||||
|
FWEB_MYSQL_DATABASE: "${DB_NAME}"
|
||||||
|
FWEB_MYSQL_USER: "${DB_USER}"
|
||||||
|
FWEB_MYSQL_PASSWORD: "${DB_PASS}"
|
||||||
|
FWEB_API_URL: "${FWEB_API_URL}"
|
||||||
|
FWEB_API_KEY: "${FWEB_API_KEY}"
|
||||||
|
FWEB_API_TIMEOUT: "${FWEB_API_TIMEOUT}"
|
||||||
|
|
||||||
|
CTE_COMPANY_ID: "${CTE_COMPANY_ID}"
|
||||||
|
CTE_SERIE: "${CTE_SERIE}"
|
||||||
|
CTE_STATUS_INVOICE: "${CTE_STATUS_INVOICE}"
|
||||||
|
CTE_IS_PROFORMA: "${CTE_IS_PROFORMA}"
|
||||||
|
CTE_STATUS_VERIFACTU: "${CTE_STATUS_VERIFACTU}"
|
||||||
|
CTE_LANGUAGE_CODE: "${CTE_LANGUAGE_CODE}"
|
||||||
|
CTE_COUNTRY_CODE: "${CTE_COUNTRY_CODE}"
|
||||||
|
CTE_IS_COMPANY: "${CTE_IS_COMPANY}"
|
||||||
|
CTE_SYNC_RESULT_OK: "${CTE_SYNC_RESULT_OK}"
|
||||||
|
CTE_SYNC_RESULT_FAIL: "${CTE_SYNC_RESULT_FAIL}"
|
||||||
|
|
||||||
|
VERIFACTU_API_KEY: "${VERIFACTU_API_KEY}"
|
||||||
|
VERIFACTU_BASE_URL: "${VERIFACTU_BASE_URL}"
|
||||||
|
VERIFACTU_NIFS_API_KEY: "${VERIFACTU_NIFS_API_KEY}"
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
- edge
|
||||||
|
volumes:
|
||||||
|
- ./volumes/db_sync:/app/rodax
|
||||||
|
|
||||||
|
|
||||||
|
verifactu_sync:
|
||||||
|
image: "factuges-sync-verifactu:rodax-latest"
|
||||||
|
container_name: "factuges_rodax_sync_verifactu"
|
||||||
|
restart: "no"
|
||||||
|
environment:
|
||||||
|
ENV: "production"
|
||||||
|
LOCAL_TZ: "Europe/Madrid"
|
||||||
|
STATE_PATH: "${STATE_PATH}"
|
||||||
|
|
||||||
|
FACTUGES_HOST: "${FACTUGES_HOST}"
|
||||||
|
FACTUGES_PORT: "${FACTUGES_PORT}"
|
||||||
|
FACTUGES_DATABASE: "${FACTUGES_DATABASE}"
|
||||||
|
FACTUGES_USER: "${FACTUGES_USER}"
|
||||||
|
FACTUGES_PASSWORD: "${FACTUGES_PASSWORD}"
|
||||||
|
|
||||||
|
FWEB_MYSQL_HOST: "db"
|
||||||
|
FWEB_MYSQL_PORT: "${DB_PORT}"
|
||||||
|
FWEB_MYSQL_DATABASE: "${DB_NAME}"
|
||||||
|
FWEB_MYSQL_USER: "${DB_USER}"
|
||||||
|
FWEB_MYSQL_PASSWORD: "${DB_PASS}"
|
||||||
|
FWEB_API_URL: "${FWEB_API_URL}"
|
||||||
|
FWEB_API_KEY: "${FWEB_API_KEY}"
|
||||||
|
FWEB_API_TIMEOUT: "${FWEB_API_TIMEOUT}"
|
||||||
|
|
||||||
|
CTE_COMPANY_ID: "${CTE_COMPANY_ID}"
|
||||||
|
CTE_SERIE: "${CTE_SERIE}"
|
||||||
|
CTE_STATUS_INVOICE: "${CTE_STATUS_INVOICE}"
|
||||||
|
CTE_IS_PROFORMA: "${CTE_IS_PROFORMA}"
|
||||||
|
CTE_STATUS_VERIFACTU: "${CTE_STATUS_VERIFACTU}"
|
||||||
|
CTE_LANGUAGE_CODE: "${CTE_LANGUAGE_CODE}"
|
||||||
|
CTE_COUNTRY_CODE: "${CTE_COUNTRY_CODE}"
|
||||||
|
CTE_IS_COMPANY: "${CTE_IS_COMPANY}"
|
||||||
|
CTE_SYNC_RESULT_OK: "${CTE_SYNC_RESULT_OK}"
|
||||||
|
CTE_SYNC_RESULT_FAIL: "${CTE_SYNC_RESULT_FAIL}"
|
||||||
|
|
||||||
|
VERIFACTU_API_KEY: "${VERIFACTU_API_KEY}"
|
||||||
|
VERIFACTU_BASE_URL: "${VERIFACTU_BASE_URL}"
|
||||||
|
VERIFACTU_NIFS_API_KEY: "${VERIFACTU_NIFS_API_KEY}"
|
||||||
|
depends_on:
|
||||||
|
db:
|
||||||
|
condition: service_healthy
|
||||||
|
networks:
|
||||||
|
- internal
|
||||||
|
- edge
|
||||||
|
volumes:
|
||||||
|
- ./volumes/db_sync:/app/rodax
|
||||||
|
|
||||||
|
networks:
|
||||||
|
edge:
|
||||||
|
name: edge
|
||||||
|
external: true
|
||||||
|
internal:
|
||||||
|
name: factuges_rodax_internal
|
||||||
|
external: false
|
||||||
|
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
# Solo declarativo; usamos ruta ./volumes/db_data arriba
|
||||||
|
db_data:
|
||||||
@ -1,14 +0,0 @@
|
|||||||
COMPANY=rodax
|
|
||||||
DOMAIN=rodax.factuges.rodax-software.local
|
|
||||||
FRONTEND_URL=rodax.factuges.rodax-software.local
|
|
||||||
WEB_VERSION=v0.0.4-latest
|
|
||||||
API_IMAGE=factuges-server:rodax-latest
|
|
||||||
API_PORT=3002
|
|
||||||
DB_HOST=db
|
|
||||||
DB_DIALECT=mysql
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_USER=rodax_usr
|
|
||||||
DB_PASS=supersecret
|
|
||||||
DB_NAME=rodax_db
|
|
||||||
DB_ROOT_PASS=verysecret
|
|
||||||
TRAEFIK_ENTRYPOINT=web
|
|
||||||
91
scripts/stack.rodax.env
Normal file
91
scripts/stack.rodax.env
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
# Identidad de la compañía
|
||||||
|
COMPANY_SLUG=rodax
|
||||||
|
|
||||||
|
# Dominios
|
||||||
|
DOMAIN=factuges.rodax-software.local
|
||||||
|
|
||||||
|
# API
|
||||||
|
PORT=3002
|
||||||
|
API_BASE_PATH=/api/v1
|
||||||
|
FRONTEND_URL=https://factuges.rodax-software.local
|
||||||
|
TRUST_PROXY=0
|
||||||
|
TIMEZONE=Europe/Madrid
|
||||||
|
API_IMAGE=factuges-server:rodax-latest
|
||||||
|
|
||||||
|
JWT_SECRET=supersecretkeysupersecretkeysupersecretkey
|
||||||
|
JWT_ACCESS_EXPIRATION=1h
|
||||||
|
JWT_REFRESH_EXPIRATION=7d
|
||||||
|
|
||||||
|
WARMUP_TIMEOUT_MS=10000
|
||||||
|
WARMUP_STRICT=false
|
||||||
|
|
||||||
|
|
||||||
|
# MariaDB
|
||||||
|
# DB_HOST=db
|
||||||
|
DB_PORT=3306
|
||||||
|
DB_DIALECT=mysql
|
||||||
|
DB_NAME=rodax_db
|
||||||
|
DB_USER=rodax_usr
|
||||||
|
DB_PASS=supersecret
|
||||||
|
DB_ROOT_PASS=verysecret
|
||||||
|
|
||||||
|
DB_LOGGING=true
|
||||||
|
DB_SSL=false
|
||||||
|
DB_SYNC_MODE=none
|
||||||
|
|
||||||
|
|
||||||
|
# Plantillas
|
||||||
|
TEMPLATES_PATH=/shared/templates
|
||||||
|
|
||||||
|
# Documentos generados
|
||||||
|
FASTREPORT_BIN=/repo/tools/FastReportCliGenerator
|
||||||
|
DOCUMENTS_PATH=/shared/documents
|
||||||
|
|
||||||
|
# Firma de documentos
|
||||||
|
SIGNED_DOCUMENTS_PATH=/shared/documents
|
||||||
|
|
||||||
|
SIGNING_SERVICE_URL=http://signing-service:8000/documents/sign
|
||||||
|
SIGNING_SERVICE_METHOD=POST
|
||||||
|
SIGNING_SERVICE_TIMEOUT_MS=15000
|
||||||
|
SIGNING_SERVICE_MAX_RETRIES=2
|
||||||
|
|
||||||
|
COMPANY_CERTIFICATES_PATH=/shared/certificates/company-certificates.json
|
||||||
|
|
||||||
|
# SYNC
|
||||||
|
ENV = development
|
||||||
|
LOCAL_TZ = Europe/Madrid
|
||||||
|
STATE_PATH = /app/state
|
||||||
|
SYNC_MODE = all
|
||||||
|
|
||||||
|
FACTUGES_HOST = factuges-pc.rodax-software.local
|
||||||
|
FACTUGES_PORT = 3050
|
||||||
|
FACTUGES_DATABASE = C:\FactuGES\FACTUGES.FDB
|
||||||
|
FACTUGES_USER = sysdba
|
||||||
|
FACTUGES_PASSWORD = masterkey
|
||||||
|
|
||||||
|
FWEB_MYSQL_HOST = db # ${DB_NAME}
|
||||||
|
FWEB_MYSQL_PORT = 3306 # ${DB_PORT}
|
||||||
|
FWEB_MYSQL_DATABASE = factuges_acana # ${DB_NAME}
|
||||||
|
FWEB_MYSQL_USER = acana # ${DB_USER}
|
||||||
|
FWEB_MYSQL_PASSWORD = r@U8%GJ+2e/AWR # ${DB_PASS}
|
||||||
|
|
||||||
|
FWEB_API_URL = http://api:3002/api/v1/factuges
|
||||||
|
FWEB_API_KEY = "XXXXX"
|
||||||
|
FWEB_API_TIMEOUT = 120
|
||||||
|
|
||||||
|
|
||||||
|
CTE_COMPANY_ID = '5e4dc5b3-96b9-4968-9490-14bd032fec5f'
|
||||||
|
CTE_SERIE = 'F26'
|
||||||
|
CTE_STATUS_INVOICE = 'issued'
|
||||||
|
CTE_IS_PROFORMA = 0
|
||||||
|
CTE_STATUS_VERIFACTU = 'Pendiente'
|
||||||
|
CTE_LANGUAGE_CODE = 'es'
|
||||||
|
CTE_COUNTRY_CODE = 'es'
|
||||||
|
CTE_IS_COMPANY = 1
|
||||||
|
CTE_SYNC_RESULT_OK = 1
|
||||||
|
CTE_SYNC_RESULT_FAIL = 2
|
||||||
|
|
||||||
|
#VERIFACTU_API_KEY = vf_test_C03HL2F0X5OXSDRunjNFoMxD4IrRfK3kCC8PfcvCENI=
|
||||||
|
VERIFACTU_API_KEY = vf_prod_yfjonNPv2E4Fij+5J0hct0zCgUeFYT2dZzb23UZlM+Q=
|
||||||
|
VERIFACTU_BASE_URL = https://api.verifacti.com/
|
||||||
|
VERIFACTU_NIFS_API_KEY = vfn_osYpNdqSzAdTAHpazXG2anz4F3o0gfbSb5FFrCBZcno=
|
||||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user