This commit is contained in:
David Arranz 2026-04-23 12:34:00 +02:00
parent 108bbea5fc
commit e87e3ec609
32 changed files with 389 additions and 44 deletions

2
.vscode/launch.json vendored
View File

@ -1,5 +1,5 @@
{ {
"version": "0.6.1", "version": "0.6.2",
"configurations": [ "configurations": [
{ {
"name": "WEB: Vite (Chrome)", "name": "WEB: Vite (Chrome)",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -4,7 +4,6 @@
"compilerOptions": { "compilerOptions": {
"resolveJsonModule": true, "resolveJsonModule": true,
"esModuleInterop": true, "esModuleInterop": true,
"baseUrl": ".",
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": ["./src/*"]
} }

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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(

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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 = {

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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/*",

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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/*"]
}, },

View File

@ -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,

View File

@ -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/*"

View 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:

View File

@ -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
View 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=