Saltar a contenido

Aviso legal

regalias_vzla es una herramienta informática de carácter educativo y de referencia técnica. No constituye asesoría legal, fiscal ni financiera. No está afiliada, avalada ni patrocinada por PDVSA, el Ministerio del Poder Popular de Petróleo, el SENIAT ni ningún otro ente del Estado venezolano. Los resultados son estimaciones referenciales sin validez oficial para declaraciones fiscales, liquidaciones ante PDVSA, fiscalizaciones, procedimientos administrativos ni procesos judiciales. Verifique siempre el instrumento vigente en la Gaceta Oficial de la República Bolivariana de Venezuela.

calculo

regalias_vzla.calculo

Orquestador financiero: motor de liquidación de regalías.

ResultadoRegalia

Bases: BaseModel

Liquidación inmutable y serializable de una regalía petrolera.

Source code in src/regalias_vzla/calculo.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class ResultadoRegalia(BaseModel):
    """Liquidación inmutable y serializable de una regalía petrolera."""

    model_config = ConfigDict(frozen=True)

    volumen_neto_bbl: Decimal = Field(description="Volumen neto fiscalizable en barriles.")
    precio_marcador_usd: Decimal = Field(description="Precio de referencia en USD/bbl.")
    factor_ajuste_api: Decimal = Field(description="Factor comercial aplicado por densidad API.")
    precio_ajustado_usd: Decimal = Field(description="Precio marcador ajustado por API (USD/bbl).")
    ingreso_bruto_usd: Decimal = Field(description="Volumen neto x precio ajustado (USD).")
    tasa_aplicada: Decimal = Field(description="Tasa de regalía aplicada, en decimal.")
    regalia_usd: Decimal = Field(description="Regalía a pagar al Estado (USD).")

    @field_serializer(
        "volumen_neto_bbl",
        "precio_marcador_usd",
        "factor_ajuste_api",
        "precio_ajustado_usd",
        "ingreso_bruto_usd",
        "tasa_aplicada",
        "regalia_usd",
    )
    def _serializar_decimal(self, valor: Decimal) -> float:
        return float(valor)

MotorRegalias

Ejecuta el orden matemático inalterable de liquidación fiscal.

Orden garantizado:

  1. Deducción de impurezas (volumen neto).
  2. Ajuste del precio marcador por factor API.
  3. Valoración base (ingreso bruto).
  4. Liquidación (regalía según tasa legal).
Source code in src/regalias_vzla/calculo.py
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
class MotorRegalias:
    """Ejecuta el orden matemático inalterable de liquidación fiscal.

    Orden garantizado:

    1. Deducción de impurezas (volumen neto).
    2. Ajuste del precio marcador por factor API.
    3. Valoración base (ingreso bruto).
    4. Liquidación (regalía según tasa legal).
    """

    def __init__(
        self, tasa_legal: TasaLegal, tabla_ajuste_api: TablaAjusteApi | None = None
    ) -> None:
        self._tasa_legal = tasa_legal
        self._tabla_ajuste_api = (
            tabla_ajuste_api if tabla_ajuste_api is not None else TablaAjusteApi.oficial()
        )

    @property
    def tasa_legal(self) -> TasaLegal:
        """Tasa legal inyectada a este motor."""
        return self._tasa_legal

    @property
    def tabla_ajuste_api(self) -> TablaAjusteApi:
        """Tabla de factores de ajuste API usada por este motor."""
        return self._tabla_ajuste_api

    def liquidar(
        self,
        fluido: FluidoCrudo,
        precio_marcador: Decimal | float | int | str,
    ) -> ResultadoRegalia:
        """Liquida la regalía de un fluido al precio marcador indicado.

        Lanza ``ValueError`` si el precio es inconsistente con el negocio
        (negativo, cero o no finito). Los montos monetarios se redondean a
        centavos (ROUND_HALF_UP); el volumen, a seis decimales.
        """
        precio = _a_decimal(precio_marcador)
        if not precio.is_finite() or precio <= 0:
            raise ValueError(
                "El precio marcador debe ser un número finito mayor que cero; "
                f"recibido: {precio_marcador!r}"
            )

        with localcontext() as contexto:
            contexto.prec = _PRECISION_INTERNA
            factor = self._tabla_ajuste_api.factor_para(fluido.gravedad_api)
            volumen_neto = fluido.volumen_neto
            precio_ajustado = precio * factor
            ingreso_bruto = volumen_neto * precio_ajustado
            regalia = ingreso_bruto * self._tasa_legal.tasa_regalia

        return ResultadoRegalia(
            volumen_neto_bbl=volumen_neto.quantize(_MILLESIMA_BBL, rounding=ROUND_HALF_UP),
            precio_marcador_usd=precio.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
            factor_ajuste_api=factor,
            precio_ajustado_usd=precio_ajustado.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
            ingreso_bruto_usd=ingreso_bruto.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
            tasa_aplicada=self._tasa_legal.tasa_regalia,
            regalia_usd=regalia.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
        )
tasa_legal: TasaLegal

Tasa legal inyectada a este motor.

tabla_ajuste_api property

tabla_ajuste_api: TablaAjusteApi

Tabla de factores de ajuste API usada por este motor.

liquidar

liquidar(fluido: FluidoCrudo, precio_marcador: Decimal | float | int | str) -> ResultadoRegalia

Liquida la regalía de un fluido al precio marcador indicado.

Lanza ValueError si el precio es inconsistente con el negocio (negativo, cero o no finito). Los montos monetarios se redondean a centavos (ROUND_HALF_UP); el volumen, a seis decimales.

Source code in src/regalias_vzla/calculo.py
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
def liquidar(
    self,
    fluido: FluidoCrudo,
    precio_marcador: Decimal | float | int | str,
) -> ResultadoRegalia:
    """Liquida la regalía de un fluido al precio marcador indicado.

    Lanza ``ValueError`` si el precio es inconsistente con el negocio
    (negativo, cero o no finito). Los montos monetarios se redondean a
    centavos (ROUND_HALF_UP); el volumen, a seis decimales.
    """
    precio = _a_decimal(precio_marcador)
    if not precio.is_finite() or precio <= 0:
        raise ValueError(
            "El precio marcador debe ser un número finito mayor que cero; "
            f"recibido: {precio_marcador!r}"
        )

    with localcontext() as contexto:
        contexto.prec = _PRECISION_INTERNA
        factor = self._tabla_ajuste_api.factor_para(fluido.gravedad_api)
        volumen_neto = fluido.volumen_neto
        precio_ajustado = precio * factor
        ingreso_bruto = volumen_neto * precio_ajustado
        regalia = ingreso_bruto * self._tasa_legal.tasa_regalia

    return ResultadoRegalia(
        volumen_neto_bbl=volumen_neto.quantize(_MILLESIMA_BBL, rounding=ROUND_HALF_UP),
        precio_marcador_usd=precio.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
        factor_ajuste_api=factor,
        precio_ajustado_usd=precio_ajustado.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
        ingreso_bruto_usd=ingreso_bruto.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
        tasa_aplicada=self._tasa_legal.tasa_regalia,
        regalia_usd=regalia.quantize(_CENTIMO, rounding=ROUND_HALF_UP),
    )