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.

marco_legal

Marco jurídico-petrolero venezolano: tasas de regalía y factores de ajuste API.

Fundamento normativo: - Ley Orgánica de Hidrocarburos (LOH), Decreto N° 1.510 con Fuerza de Ley, G.O. N° 37.323 del 13/11/2001; Reforma Parcial, G.O. N° 38.493 del 04/08/2006. * Art. 42: regalía ordinaria del 20 % del volumen producido en el área. * Art. 43: banda secundaria, hasta 30 % cuando la productividad acumulada del campo supera los umbrales fijados por el Ejecutivo Nacional (Decreto N° 5.330, G.O. N° 38.270 del 23/09/2005). * Art. 44: pago mínimo del 33⅓ % en efectivo; saldo en especie o efectivo a opción del Estado (NO modelado por esta librería). - Reducción al 10 % para crudos extrapesados de la Faja Petrolífera del Orinoco (< 10 °API): Decreto N° 4.889 (G.O. N° 37.458 del 24/06/2002). [Verificar texto consolidado en Gaceta Oficial antes de citar en producción.]

ADVERTENCIA: los factores de TablaAjusteApi.oficial() son REFERENCIALES de la práctica comercial (descuentos/primas por gravedad API, cf. Merey 16 frente a Brent/WTI) y NO provienen de ningún artículo de ley. La fórmula fiscal oficial de precios del Ministerio incluye un ajuste por gravedad (AGA) cuyos valores reales no son públicos. Ningún resultado de esta librería tiene validez ante PDVSA, el Ministerio de Petróleo o el SENIAT.

BandaAjusteApi

Bases: BaseModel

Banda de densidad API con su factor comercial asociado.

Source code in src/regalias_vzla/marco_legal.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class BandaAjusteApi(BaseModel):
    """Banda de densidad API con su factor comercial asociado."""

    model_config = ConfigDict(frozen=True)

    hasta_gravedad: float = Field(
        ...,
        gt=0,
        description="Límite superior exclusivo de la banda, en grados API.",
    )
    factor: Decimal = Field(
        ...,
        gt=0,
        le=2,
        description="Multiplicador aplicado al precio marcador.",
    )

TablaAjusteApi

Bases: BaseModel

Tabla ordenada y configurable de factores de ajuste API.

El factor se resuelve con la primera banda cuyo límite superior sea mayor que la gravedad del crudo; para gravedades iguales o superiores al último límite se aplica factor_final.

Source code in src/regalias_vzla/marco_legal.py
 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
111
112
113
114
115
116
117
118
class TablaAjusteApi(BaseModel):
    """Tabla ordenada y configurable de factores de ajuste API.

    El factor se resuelve con la primera banda cuyo límite superior sea
    mayor que la gravedad del crudo; para gravedades iguales o superiores
    al último límite se aplica ``factor_final``.
    """

    model_config = ConfigDict(frozen=True)

    bandas: tuple[BandaAjusteApi, ...] = Field(min_length=1)
    factor_final: Decimal = Field(
        default=FACTOR_AJUSTE_NEUTRO,
        gt=0,
        le=2,
        description="Factor aplicado por encima del último límite de banda.",
    )

    @field_validator("bandas")
    @classmethod
    def _limites_estricamente_ascendentes(
        cls, bandas: tuple[BandaAjusteApi, ...]
    ) -> tuple[BandaAjusteApi, ...]:
        limites = [banda.hasta_gravedad for banda in bandas]
        if any(actual >= siguiente for actual, siguiente in zip(limites, limites[1:])):
            raise ValueError(
                "Los límites de las bandas deben estar ordenados de forma estrictamente ascendente."
            )
        return bandas

    def factor_para(self, gravedad_api: float) -> Decimal:
        """Factor aplicable a un crudo con la gravedad API indicada."""
        for banda in self.bandas:
            if gravedad_api < banda.hasta_gravedad:
                return banda.factor
        return self.factor_final

    @classmethod
    def oficial(cls) -> TablaAjusteApi:
        """Tabla referencial venezolana (punto de partida configurable).

        Factores de práctica comercial (NO statutory): reflejan primas y
        descuentos por gravedad API observados en el mercado (cf. Merey 16
        frente a Brent/WTI), no un artículo de ley.

        - < 10° API    → ``0.90`` (penalización extrapesado / diluentes)
        - 10° a 21.99° → ``0.95`` (crudo pesado)
        - 22° a 29.99° → ``1.00`` (crudo mediano, neutro)
        - >= 30°       → ``1.05`` (prima crudo liviano)
        """
        return cls(
            bandas=(
                BandaAjusteApi(hasta_gravedad=GRAVEDAD_EXTRAPESADO, factor=Decimal("0.90")),
                BandaAjusteApi(hasta_gravedad=22.0, factor=Decimal("0.95")),
                BandaAjusteApi(hasta_gravedad=30.0, factor=FACTOR_AJUSTE_NEUTRO),
            ),
            factor_final=FACTOR_AJUSTE_LIVIANO,
        )

factor_para

factor_para(gravedad_api: float) -> Decimal

Factor aplicable a un crudo con la gravedad API indicada.

Source code in src/regalias_vzla/marco_legal.py
91
92
93
94
95
96
def factor_para(self, gravedad_api: float) -> Decimal:
    """Factor aplicable a un crudo con la gravedad API indicada."""
    for banda in self.bandas:
        if gravedad_api < banda.hasta_gravedad:
            return banda.factor
    return self.factor_final

oficial classmethod

oficial() -> TablaAjusteApi

Tabla referencial venezolana (punto de partida configurable).

Factores de práctica comercial (NO statutory): reflejan primas y descuentos por gravedad API observados en el mercado (cf. Merey 16 frente a Brent/WTI), no un artículo de ley.

  • < 10° API → 0.90 (penalización extrapesado / diluentes)
  • 10° a 21.99° → 0.95 (crudo pesado)
  • 22° a 29.99° → 1.00 (crudo mediano, neutro)
  • = 30° → 1.05 (prima crudo liviano)

Source code in src/regalias_vzla/marco_legal.py
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
@classmethod
def oficial(cls) -> TablaAjusteApi:
    """Tabla referencial venezolana (punto de partida configurable).

    Factores de práctica comercial (NO statutory): reflejan primas y
    descuentos por gravedad API observados en el mercado (cf. Merey 16
    frente a Brent/WTI), no un artículo de ley.

    - < 10° API    → ``0.90`` (penalización extrapesado / diluentes)
    - 10° a 21.99° → ``0.95`` (crudo pesado)
    - 22° a 29.99° → ``1.00`` (crudo mediano, neutro)
    - >= 30°       → ``1.05`` (prima crudo liviano)
    """
    return cls(
        bandas=(
            BandaAjusteApi(hasta_gravedad=GRAVEDAD_EXTRAPESADO, factor=Decimal("0.90")),
            BandaAjusteApi(hasta_gravedad=22.0, factor=Decimal("0.95")),
            BandaAjusteApi(hasta_gravedad=30.0, factor=FACTOR_AJUSTE_NEUTRO),
        ),
        factor_final=FACTOR_AJUSTE_LIVIANO,
    )

TasaLegal

Bases: BaseModel

Tasa de regalía vigente inyectada al motor de cálculo.

Source code in src/regalias_vzla/marco_legal.py
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
class TasaLegal(BaseModel):
    """Tasa de regalía vigente inyectada al motor de cálculo."""

    model_config = ConfigDict(frozen=True)

    nombre: str = Field(default="Regalía ordinaria - Ley Orgánica de Hidrocarburos")
    tasa_regalia: Decimal = Field(..., gt=0, le=1, description="Tasa en decimal (0.20 = 20 %).")

    @classmethod
    def para_gravedad_api(cls, gravedad_api: float) -> TasaLegal:
        """Selecciona la tasa según la banda API del crudo.

        Crudos extrapesados (< 10° API) tributan al 10 %; el resto, al 20 %.
        """
        if gravedad_api < GRAVEDAD_EXTRAPESADO:
            return cls(
                nombre="Regalía extrapesado (Faja Petrolífera) - 10 %",
                tasa_regalia=TASA_REGALIA_EXTRAPESADO,
            )
        return cls(nombre="Regalía ordinaria - 20 %", tasa_regalia=TASA_REGALIA_ESTANDAR)

    @classmethod
    def secundaria(cls) -> TasaLegal:
        """Tasa de banda secundaria: campos de alta productividad al 30 %."""
        return cls(
            nombre="Regalía de banda secundaria - 30 %",
            tasa_regalia=TASA_REGALIA_SECUNDARIA,
        )

para_gravedad_api classmethod

para_gravedad_api(gravedad_api: float) -> TasaLegal

Selecciona la tasa según la banda API del crudo.

Crudos extrapesados (< 10° API) tributan al 10 %; el resto, al 20 %.

Source code in src/regalias_vzla/marco_legal.py
134
135
136
137
138
139
140
141
142
143
144
145
@classmethod
def para_gravedad_api(cls, gravedad_api: float) -> TasaLegal:
    """Selecciona la tasa según la banda API del crudo.

    Crudos extrapesados (< 10° API) tributan al 10 %; el resto, al 20 %.
    """
    if gravedad_api < GRAVEDAD_EXTRAPESADO:
        return cls(
            nombre="Regalía extrapesado (Faja Petrolífera) - 10 %",
            tasa_regalia=TASA_REGALIA_EXTRAPESADO,
        )
    return cls(nombre="Regalía ordinaria - 20 %", tasa_regalia=TASA_REGALIA_ESTANDAR)

secundaria classmethod

secundaria() -> TasaLegal

Tasa de banda secundaria: campos de alta productividad al 30 %.

Source code in src/regalias_vzla/marco_legal.py
147
148
149
150
151
152
153
@classmethod
def secundaria(cls) -> TasaLegal:
    """Tasa de banda secundaria: campos de alta productividad al 30 %."""
    return cls(
        nombre="Regalía de banda secundaria - 30 %",
        tasa_regalia=TASA_REGALIA_SECUNDARIA,
    )

factor_ajuste_api

factor_ajuste_api(gravedad_api: float) -> Decimal

Atajo de TablaAjusteApi.oficial().factor_para(gravedad_api).

Source code in src/regalias_vzla/marco_legal.py
121
122
123
def factor_ajuste_api(gravedad_api: float) -> Decimal:
    """Atajo de ``TablaAjusteApi.oficial().factor_para(gravedad_api)``."""
    return TablaAjusteApi.oficial().factor_para(gravedad_api)