Subida a producción

This commit is contained in:
David Arranz 2025-12-01 12:38:42 +01:00
parent fd67ebe599
commit e734cea4d8
20 changed files with 107 additions and 61 deletions

View File

@ -101,6 +101,7 @@ COPY --from=builder /repo/apps/server/.env.${COMPANY} ./apps/server/dist/.env
COPY --from=builder /repo/apps/server/node_modules ./apps/server/node_modules
COPY --from=builder /repo/apps/server/package.json ./apps/server/package.json
# Las plantillas estarán en un volumen apuntando a /repo/apps/server/templates
#COPY --from=builder /repo/templates ./apps/server/dist/templates

View File

@ -1,6 +1,6 @@
{
"name": "@erp/factuges-server",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"scripts": {
"build": "tsup src/index.ts --config tsup.config.ts",

View File

@ -1,7 +1,7 @@
{
"name": "@erp/factuges-web",
"private": true,
"version": "0.0.15",
"version": "0.0.17",
"type": "module",
"scripts": {
"dev": "vite --host --clearScreen false",

View File

@ -1,6 +1,6 @@
{
"name": "@erp/auth",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,6 +1,6 @@
{
"name": "@erp/core",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -36,7 +36,8 @@ export abstract class TemplateResolver implements ITemplateResolver {
}
// <root>/templates/<module>/<companySlug>/
return this.resolveJoin(["templates", module, companySlug]);
//return this.resolveJoin(["templates", module, companySlug]);
return this.resolveJoin([module]);
}
/** Resuelve una ruta de recurso relativa al directorio de plantilla */

View File

@ -1,6 +1,6 @@
{
"name": "@erp/customer-invoices",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -27,9 +27,16 @@ export class IssuedInvoiceReportPDFPresenter extends Presenter<
// Generar el PDF con Puppeteer
const browser = await puppeteer.launch({
//headless: "new",
headless: true,
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-gpu",
"--disable-extensions",
"--font-render-hinting=medium",
],
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
args: ["--font-render-hinting=medium"],
});
const page = await browser.newPage();

View File

@ -27,9 +27,16 @@ export class ProformaReportPDFPresenter extends Presenter<
// Generar el PDF con Puppeteer
const browser = await puppeteer.launch({
//headless: "new",
headless: true,
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-gpu",
"--disable-extensions",
"--font-render-hinting=medium",
],
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH,
args: ["--font-render-hinting=medium"],
});
const page = await browser.newPage();

View File

@ -303,49 +303,35 @@
</tr>
</tbody>
</table>
<!-- Columna izquierda: notas y forma de pago -->
<table>
<tr class="resume-table">
<!-- Columna izquierda: notas y forma de pago -->
<td class="left-col" rowspan="10">
<tr>
<td class="info-box" style="text-align: right;">
{{#if payment_method}}
<p><strong>Forma de pago:</strong> {{payment_method}}</p>
<p><strong>Forma de pago</strong><br/> {{payment_method}}</p>
{{/if}}
{{#if notes}}
<p style="margin-top:0.5rem;"><strong>Notas:</strong> {{notes}}</p>
<p><strong>Notas</strong><br/> {{notes}}</p>
{{/if}}
</td>
</tr>
<tr class="total-row">
<td class="label"><strong>Total factura</strong></td>
</tr>
</tbody>
</table>
</section>
</main>
<footer id="footer" style="margin-top:1rem; border-top:1px solid #000000;">
<aside style="margin-top: 1rem;">
<tfoot>
<p style="text-align: center;">Insc. en el Reg. Merc. de Madrid, Tomo 31.839, Libro 0, Folio 191, Sección 8, Hoja
M-572991
CIF: B86913910</p>
<p style="text-align: left; font-size: 6pt;">Información en protección de datos:<br />De conformidad con lo
dispuesto en el RGPD y LOPDGDD,
informamos que los datos personales serán tratados por
ALISO DESIGN S.L para cumplir con la obligación tributaria de emitir facturas. Podrá solicitar más
información, y ejercer sus derechos escribiendo a info@acanainteriorismo.com o mediante correo postal a la
dirección CALLE
LA FUNDICION 27 POL. IND. SANTA ANA (28522) RIVAS-VACIAMADRID, MADRID. Para el ejercicio de sus derechos, en
caso
de que sea necesario, se le solicitará documento que acredite su identidad. Si siente vulnerados sus derechos
puede presentar una reclamación ante la AEPD, en su web: www.aepd.es.</p>
</tfoot>
</aside>
<footer id="footer">
<tfoot >
<div style="border-bottom: 1px solid #000;">
<p>Acota Cocinas S.L. Insc. en el Reg. Merc. de Madrid, Tomo 44.740, Folio 72, Hoja M-787831 CIF: B44670040</p>
</div>
<div>
<p style="text-align: left; font-size: 6pt;">Información en protección de datos<br />Conforme a lo establecido en el Reglamento (UE) 2016/679 (RGPD), así como lo dispuesto en la normativa nacional sobre esta materia, le informamos de lo siguiente: Los datos personales facilitados serán responsabilidad de la entidad ACOTA COCINAS, S.L., además, sus datos personales serán utilizados para las siguientes finalidades: - Realización de acciones y comunicaciones comerciales y de marketing para informar y fidelizar clientes, - Prestación propia de nuestros servicios derivados de la actividad y distribución o comercialización de nuestros productos. Gestión fiscal y contable con la finalidad de cumplir con obligaciones legales. Todo ello bajo la legitimación otorgada por Consentimiento y firma de la persona, Interés legítimo, Ejecución de un contrato. No se cederán datos a terceros salvo obligaciones legales. No obstante es posible que determinados encargados del tratamiento externos puedan acceder a sus datos para la necesaria prestación del servicio. En cuanto a sus derechos, podrá reclamar ante la Autoridad de Control Nacional y en todo momento acceder, rectificar y suprimir sus datos, limitarlos o incluso oponerse a su tratamiento, solicitar su portabilidad a otros responsables, enviándonos una comunicación dirigida a Calle VIA CARPETANA, 340, B, CP 28047 Madrid, o bien enviándonos un email a monica@alonsoysal.com. Por último, puede consultar la información adicional y detallada sobre nuestra política de Protección de datos, mediante comunicación dirigida a nuestra dirección postal.<br/>
OBTENCIÓN DE CONSENTIMIENTOS: Le informamos que marcando “SI” en las siguientes casillas estará dándonos su consentimiento expreso para llevar a cabo las finalidades descritas a continuación. Este consentimiento podrá ser retirado en cualquier momento posterior comunicándolo por cualquier medio fehaciente: X SI NO</p>
</div>
</tfoot>
</footer>
</body>

View File

@ -1,6 +1,6 @@
{
"name": "@erp/customers",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,6 +1,6 @@
{
"name": "@erp/doc-numbering",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,6 +1,6 @@
{
"name": "@repo/rdx-criteria",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,6 +1,6 @@
{
"name": "@repo/rdx-ddd",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,6 +1,6 @@
{
"name": "@repo/rdx-logger",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,6 +1,6 @@
{
"name": "@repo/rdx-utils",
"version": "0.0.15",
"version": "0.0.17",
"private": true,
"type": "module",
"sideEffects": false,

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_VERSION="1.2.1"
SCRIPT_VERSION="1.2.4"
# =====================================================
# FACTUGES Build Script
@ -173,12 +173,15 @@ fi
# =====================================================
if [[ "$MODE" == "api" || "$MODE" == "all" ]]; then
# Recopilar plantillas
${SCRIPT_DIR}/build-templates.sh
${SCRIPT_DIR}/build-templates.sh ${COMPANY}
TEMPLATES_DIR="${PROJECT_DIR}/out/${COMPANY}/templates"
cd "${PROJECT_DIR}"
echo "🐳 Construyendo imagen Docker..."
docker build --no-cache --debug -t "${IMAGE_TAG_V}" -t "${IMAGE_TAG_LATEST}" \
#docker build --no-cache --debug -t "${IMAGE_TAG_V}" -t "${IMAGE_TAG_LATEST}" \
docker build \
-t "${IMAGE_TAG_V}" -t "${IMAGE_TAG_LATEST}" \
--build-arg PORT="${PORT}" --build-arg COMPANY="${COMPANY}" \
-f "${PROJECT_DIR}/Dockerfile" "${PROJECT_DIR}"
@ -209,8 +212,8 @@ if [[ "$MODE" == "api" || "$MODE" == "all" ]]; then
},
"port": "${PORT}",
"files": {
"versioned": "${TAR_FILE_V}",
"latest": "${TAR_FILE_LATEST}"
"versioned": "$(basename ${TAR_FILE_V})",
"latest": "$(basename ${TAR_FILE_LATEST})"
}
}
EOF
@ -222,8 +225,9 @@ if [[ "$LOAD" == true ]]; then
echo "📥 Cargando imagen en producción vps-2.rodax-software.com..."
[[ "$MODE" == "web" || "$MODE" == "all" ]] && scp -r -P 49152 ${OUT_WEB_DIR} rodax@vps-2.rodax-software.com:/opt/factuges/${COMPANY}/
[[ "$MODE" == "api" || "$MODE" == "all" ]] && scp -r -P 49152 ${OUT_API_DIR} rodax@vps-2.rodax-software.com:/opt/factuges/${COMPANY}/
[[ "$MODE" == "api" || "$MODE" == "all" ]] && scp -r -P 49152 ${TEMPLATES_DIR} rodax@vps-2.rodax-software.com:/opt/factuges/${COMPANY}/
[[ "$MODE" == "api" || "$MODE" == "all" ]] && RESULT=$(ssh -p 49152 rodax@vps-2.rodax-software.com "docker load -i ${TAR_FILE_LATEST}")
[[ "$MODE" == "api" || "$MODE" == "all" ]] && RESULT=$(ssh -p 49152 rodax@vps-2.rodax-software.com "docker load -i /opt/factuges/${COMPANY}/api/$(basename ${TAR_FILE_LATEST})")
[[ "$MODE" == "api" || "$MODE" == "all" ]] && echo $RESULT
#docker load -i "${TAR_FILE_V}"
echo "✅ Imagen cargada en producción"

View File

@ -1,33 +1,69 @@
#!/usr/bin/env bash
set -euo pipefail
echo "-------------------------------------------------------"
echo "[build-templates] Recopilando plantillas del proyecto..."
SCRIPT_VERSION="0.0.1"
# =====================================================
# TEMPLATES Build Script
# -----------------------------------------------------
# Recopilas plantillas de los módulos (por compañía)
# =====================================================
# Uso:
# ./build_templates.sh <company> [--api|web|all] [--load]
#
# Funcionalidades:
# -
# -
# -
# -
# =====================================================
# --- Configuración base ---
COMPANY=""
# --- Validar que el primer argumento existe y no es un flag ---
if [[ $# -eq 0 || "$1" == --* ]]; then
echo "❌ ERROR: Falta el parámetro <company>"
echo "Uso: ./build_templates.sh <company>"
echo "Ejemplos:"
echo " ./build_templates.sh acme"
exit 1
fi
COMPANY="$1"
# Root directory (dir where the script lives, then go up)
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SOURCE_DIR="$ROOT_DIR/modules"
TARGET_DIR="$ROOT_DIR/apps/server/dist/templates"
TARGET_DIR="$ROOT_DIR/out/$COMPANY/templates"
echo "[build-templates] Root: $ROOT_DIR"
echo "[build-templates] Source: $SOURCE_DIR"
echo "[build-templates] Target: $TARGET_DIR"
echo ""
echo "-------------------------------------------------------"
echo " Templates Build Script v${SCRIPT_VERSION}"
echo " Recopilando plantillas para compañía '${COMPANY}'"
echo " Source: ${SOURCE_DIR}"
echo " Target: ${TARGET_DIR}"
echo "-------------------------------------------------------"
# Ensure target directory exists and is empty
rm -rf "$TARGET_DIR"
mkdir -p "$TARGET_DIR"
rm -rf "${TARGET_DIR:?}/"*
# Loop through each package
for module in "$SOURCE_DIR"/*; do
if [ -d "$module/templates" ]; then
if [ -d "$module/templates/$COMPANY" ]; then
module_name=$(basename "$module")
echo "→ Copying templates for module: $module_name"
mkdir -p "$TARGET_DIR/$module_name"
cp -R "$module/templates/." "$TARGET_DIR/$module_name/"
cp -Rv "$module/templates/$COMPANY/." "$TARGET_DIR/$module_name/"
fi
done
echo "✅ [build-templates] Terminado."
echo "-------------------------------------------------------"
echo "🧩 Script version: ${SCRIPT_VERSION} - FIN"
echo "-------------------------------------------------------"
echo ""
echo ""
echo ""

View File

@ -77,6 +77,9 @@ services:
DB_USER: ${DB_USER}
DB_PASS: ${DB_PASS}
FRONTEND_URL: ${FRONTEND_URL}
TEMPLATES_PATH: ${TEMPLATES_PATH}
volumes:
- ./templates:/repo/apps/server/templates:ro
networks:
- internal
- edge

View File

@ -14,6 +14,7 @@ DB_PORT=3306
# API
API_PORT=3002
API_IMAGE=factuges-server:acana-latest
TEMPLATES_PATH=/repo/apps/server/templates
FRONTEND_URL=https://acana.factuges.app