fix: standardize multiplication notation from '×' to 'x' across various files for consistency
This commit is contained in:
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
@@ -112,7 +112,7 @@ pipeline {
|
|||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
if [ "$READY" != "1" ]; then
|
if [ "$READY" != "1" ]; then
|
||||||
echo "ERROR: Postgres no quedó listo a tiempo (30 intentos × 2s)."
|
echo "ERROR: Postgres no quedó listo a tiempo (30 intentos x 2s)."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
docker exec "$DB_CONTAINER" psql -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 -c "
|
docker exec "$DB_CONTAINER" psql -U "$DB_USER" -d "$DB_NAME" -v ON_ERROR_STOP=1 -c "
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ These 4 tables are ALL you need for balances:
|
|||||||
|
|
||||||
a24.balance_movement ← the ledger (append-only, never UPDATE)
|
a24.balance_movement ← the ledger (append-only, never UPDATE)
|
||||||
a24.discharge_header ← one discharge per export/SM/CTM event
|
a24.discharge_header ← one discharge per export/SM/CTM event
|
||||||
a24.discharge_detail ← one row per (export line × import lot consumed)
|
a24.discharge_detail ← one row per (export line x import lot consumed)
|
||||||
a24.discharge_scrap ← mermas, desperdicios, destrucciones
|
a24.discharge_scrap ← mermas, desperdicios, destrucciones
|
||||||
|
|
||||||
Design rules:
|
Design rules:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ These 4 tables are ALL you need for balances:
|
|||||||
|
|
||||||
a24.balance_movement ← the ledger (append-only, never UPDATE)
|
a24.balance_movement ← the ledger (append-only, never UPDATE)
|
||||||
a24.discharge_header ← one discharge per export/SM/CTM event
|
a24.discharge_header ← one discharge per export/SM/CTM event
|
||||||
a24.discharge_detail ← one row per (export line × import lot consumed)
|
a24.discharge_detail ← one row per (export line x import lot consumed)
|
||||||
a24.discharge_scrap ← mermas, desperdicios, destrucciones
|
a24.discharge_scrap ← mermas, desperdicios, destrucciones
|
||||||
|
|
||||||
Design rules:
|
Design rules:
|
||||||
@@ -156,7 +156,7 @@ class DischargeHeader(Base, TenantScopedMixin, TimestampMixin):
|
|||||||
# The critical traceability link:
|
# The critical traceability link:
|
||||||
# "Export line X consumed Y units from import lot Z"
|
# "Export line X consumed Y units from import lot Z"
|
||||||
#
|
#
|
||||||
# One row per (export_line × import_lot) pair.
|
# One row per (export_line x import_lot) pair.
|
||||||
# A single export line can span multiple rows when PEPS pulls from
|
# A single export line can span multiple rows when PEPS pulls from
|
||||||
# more than one import lot.
|
# more than one import lot.
|
||||||
#
|
#
|
||||||
@@ -168,7 +168,7 @@ class DischargeHeader(Base, TenantScopedMixin, TimestampMixin):
|
|||||||
|
|
||||||
class DischargeDetail(Base, TenantScopedMixin, TimestampMixin):
|
class DischargeDetail(Base, TenantScopedMixin, TimestampMixin):
|
||||||
"""
|
"""
|
||||||
One row per (export line × import lot consumed).
|
One row per (export line x import lot consumed).
|
||||||
|
|
||||||
This is the traceability record the SAT asks for:
|
This is the traceability record the SAT asks for:
|
||||||
"Show me which import pedimento covered this export line."
|
"Show me which import pedimento covered this export line."
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ flowchart TD
|
|||||||
V5 --> V6{¿TC de la factura\n== TC del catálogo?}
|
V5 --> V6{¿TC de la factura\n== TC del catálogo?}
|
||||||
V6 -- No --> E4([❌ Error\nTipo de cambio incorrecto])
|
V6 -- No --> E4([❌ Error\nTipo de cambio incorrecto])
|
||||||
V6 -- Sí --> V7[Marcar todas las partidas\ncomo sin descarga]
|
V6 -- Sí --> V7[Marcar todas las partidas\ncomo sin descarga]
|
||||||
V7 --> V8[Calcular valores por partida\nCosto × Cantidad × TC\nen pesos · dólares · moneda cuenta]
|
V7 --> V8[Calcular valores por partida\nCosto x Cantidad x TC\nen pesos · dólares · moneda cuenta]
|
||||||
V8 --> V9[Validar costo unitario · series · pesos]
|
V8 --> V9[Validar costo unitario · series · pesos]
|
||||||
V9 --> V10{¿Hay errores\nen partidas?}
|
V9 --> V10{¿Hay errores\nen partidas?}
|
||||||
V10 -- Sí --> E5([❌ Error\nCosto en cero o series faltantes])
|
V10 -- Sí --> E5([❌ Error\nCosto en cero o series faltantes])
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ def _assign_costs_per_line(
|
|||||||
line.financial.unit_cost_usd = cost_usd
|
line.financial.unit_cost_usd = cost_usd
|
||||||
line.financial.unit_cost_mxn = cost_usd * line_tc
|
line.financial.unit_cost_mxn = cost_usd * line_tc
|
||||||
|
|
||||||
# Values are always: cost × qty
|
# Values are always: cost x qty
|
||||||
line.financial.value_mxn = (line.financial.unit_cost_mxn or Decimal(0)) * qty
|
line.financial.value_mxn = (line.financial.unit_cost_mxn or Decimal(0)) * qty
|
||||||
line.financial.value_usd = (line.financial.unit_cost_usd or Decimal(0)) * qty
|
line.financial.value_usd = (line.financial.unit_cost_usd or Decimal(0)) * qty
|
||||||
line.financial.value_mc = capture * qty
|
line.financial.value_mc = capture * qty
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Creates the full Annex-24 discharge record for one export invoice:
|
|||||||
|
|
||||||
1. ONE DischargeHeader (one per export event)
|
1. ONE DischargeHeader (one per export event)
|
||||||
2. N BalanceMovement rows (type=CONSUMPTION, one per lot consumed)
|
2. N BalanceMovement rows (type=CONSUMPTION, one per lot consumed)
|
||||||
3. N DischargeDetail rows (one per export-line × import-lot pair),
|
3. N DischargeDetail rows (one per export-line x import-lot pair),
|
||||||
each referencing its BalanceMovement (design rule 3)
|
each referencing its BalanceMovement (design rule 3)
|
||||||
|
|
||||||
Design rules from a24.balance_movement (preserved here):
|
Design rules from a24.balance_movement (preserved here):
|
||||||
@@ -163,7 +163,7 @@ def register_discharge_ledger(
|
|||||||
import_invoice_number_cache[lot.import_invoice_id] = origin_import_invoice
|
import_invoice_number_cache[lot.import_invoice_id] = origin_import_invoice
|
||||||
|
|
||||||
# ── 2. BalanceMovement (CONSUMPTION) ──────────────────────────
|
# ── 2. BalanceMovement (CONSUMPTION) ──────────────────────────
|
||||||
# Proportional value: consume / lot_consumed_total × lot_value
|
# Proportional value: consume / lot_consumed_total x lot_value
|
||||||
# lot_consumed_total == consume for single-lot entries (most cases)
|
# lot_consumed_total == consume for single-lot entries (most cases)
|
||||||
value_me = _proportional_value(consume, consume, lot.value_me)
|
value_me = _proportional_value(consume, consume, lot.value_me)
|
||||||
value_mn = _proportional_value(consume, consume, lot.value_mn)
|
value_mn = _proportional_value(consume, consume, lot.value_mn)
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ def limit_weight(lines: List[Any]) -> tuple[Decimal, Decimal]:
|
|||||||
return total_qty, total_net_weight
|
return total_qty, total_net_weight
|
||||||
|
|
||||||
def limit_value(lines: List[Any]) -> Decimal:
|
def limit_value(lines: List[Any]) -> Decimal:
|
||||||
"""Sums (unit_cost_capture × quantity) across all line items."""
|
"""Sums (unit_cost_capture x quantity) across all line items."""
|
||||||
total_value = Decimal(0)
|
total_value = Decimal(0)
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if line.financial and line.quantity:
|
if line.financial and line.quantity:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ flowchart TD
|
|||||||
V2 --> V3{¿Errores en\nclases o fracciones?}
|
V2 --> V3{¿Errores en\nclases o fracciones?}
|
||||||
V3 -- Sí --> E4([❌ Error\nClase o fracción inválida])
|
V3 -- Sí --> E4([❌ Error\nClase o fracción inválida])
|
||||||
V3 -- No --> V4[Validar pesos por partida\nKGS o LBS según configuración]
|
V3 -- No --> V4[Validar pesos por partida\nKGS o LBS según configuración]
|
||||||
V4 --> CALC[Calcular valores sin IVA\nCosto × Cantidad × TC\npesos · dólares · moneda cuenta]
|
V4 --> CALC[Calcular valores sin IVA\nCosto x Cantidad x TC\npesos · dólares · moneda cuenta]
|
||||||
CALC --> VL[Validar por cada partida\ncosto > 0 · clase activa\nparte activa · series · UMA]
|
CALC --> VL[Validar por cada partida\ncosto > 0 · clase activa\nparte activa · series · UMA]
|
||||||
VL --> VL2{¿Errores en\npartidas?}
|
VL --> VL2{¿Errores en\npartidas?}
|
||||||
VL2 -- Sí --> E5([❌ Error\nCosto cero · clase desactivada\nparte desactivada · series faltantes])
|
VL2 -- Sí --> E5([❌ Error\nCosto cero · clase desactivada\nparte desactivada · series faltantes])
|
||||||
|
|||||||
@@ -327,7 +327,7 @@ def generate_vencimiento_csv(filters: VencimientoFilter, db: Session) -> bytes:
|
|||||||
peso_saldo = peso_neto - peso_usado
|
peso_saldo = peso_neto - peso_usado
|
||||||
|
|
||||||
# -- Valor según moneda (ME = foreign, MN = national) --
|
# -- Valor según moneda (ME = foreign, MN = national) --
|
||||||
# Legacy (UsarDescargos=1): ValorUsado = (CantUsada × ValorOrig) / CantOrig (proporcional, igual que peso)
|
# Legacy (UsarDescargos=1): ValorUsado = (CantUsada x ValorOrig) / CantOrig (proporcional, igual que peso)
|
||||||
if use_me:
|
if use_me:
|
||||||
valor_orig = _d(row["C22"])
|
valor_orig = _d(row["C22"])
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -146,7 +146,7 @@
|
|||||||
class="ml-auto shrink-0 cursor-pointer opacity-60 hover:opacity-100"
|
class="ml-auto shrink-0 cursor-pointer opacity-60 hover:opacity-100"
|
||||||
onclick={() => (classesLoadError = '')}
|
onclick={() => (classesLoadError = '')}
|
||||||
aria-label="Cerrar"
|
aria-label="Cerrar"
|
||||||
>×</button>
|
>x</button>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|||||||
@@ -144,7 +144,7 @@
|
|||||||
class="ml-auto shrink-0 cursor-pointer opacity-60 hover:opacity-100"
|
class="ml-auto shrink-0 cursor-pointer opacity-60 hover:opacity-100"
|
||||||
onclick={() => (partsLoadError = '')}
|
onclick={() => (partsLoadError = '')}
|
||||||
aria-label="Cerrar"
|
aria-label="Cerrar"
|
||||||
>×</button>
|
>x</button>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|||||||
@@ -185,7 +185,7 @@
|
|||||||
class="ml-auto shrink-0 cursor-pointer opacity-60 hover:opacity-100"
|
class="ml-auto shrink-0 cursor-pointer opacity-60 hover:opacity-100"
|
||||||
onclick={() => (seriesErrorMessage = '')}
|
onclick={() => (seriesErrorMessage = '')}
|
||||||
aria-label="Cerrar"
|
aria-label="Cerrar"
|
||||||
>×</button>
|
>x</button>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
|||||||
@@ -169,7 +169,7 @@
|
|||||||
{#if isWarning}
|
{#if isWarning}
|
||||||
<AlertTriangle class="size-3" />
|
<AlertTriangle class="size-3" />
|
||||||
{:else}
|
{:else}
|
||||||
×
|
x
|
||||||
{/if}
|
{/if}
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -144,7 +144,7 @@
|
|||||||
├───────────────┬────────┴─┬───────────────┤ row 3
|
├───────────────┬────────┴─┬───────────────┤ row 3
|
||||||
│ Clientes (4) │Proveed(4) │ Accesos (4) │
|
│ Clientes (4) │Proveed(4) │ Accesos (4) │
|
||||||
├────────────────────────┬─────────────────┤ row 4
|
├────────────────────────┬─────────────────┤ row 4
|
||||||
│ ActivityFeed (8, ×3) │ Documentos (4) │
|
│ ActivityFeed (8, x3) │ Documentos (4) │
|
||||||
│ ├─────────────────┤ row 5
|
│ ├─────────────────┤ row 5
|
||||||
│ │ Contactos (4) │
|
│ │ Contactos (4) │
|
||||||
│ ├─────────────────┤ row 6
|
│ ├─────────────────┤ row 6
|
||||||
|
|||||||
@@ -402,7 +402,7 @@
|
|||||||
{#if searchQuery}
|
{#if searchQuery}
|
||||||
<Badge variant="secondary" class="gap-2">
|
<Badge variant="secondary" class="gap-2">
|
||||||
Filtro: "{searchQuery}"
|
Filtro: "{searchQuery}"
|
||||||
<button onclick={() => (searchQuery = '')} class="hover:text-destructive"> × </button>
|
<button onclick={() => (searchQuery = '')} class="hover:text-destructive"> x </button>
|
||||||
</Badge>
|
</Badge>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user