es__get_compliance_status
Retrieve current electronic invoicing compliance deadlines and operating system for a Spanish company profile based on entity type, province, turnover, and SII status.
Instructions
Devuelve los plazos de mandato vigentes y el sistema operativo para un perfil de empresa. Refleja el RD-ley 15/2025 — sujeto a cambios por legislación posterior.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| entity_type | Yes | Tipo de obligado tributario. | |
| province_code | Yes | Código de provincia INE de dos dígitos. | |
| annual_turnover_eur | No | Volumen anual de operaciones IVA en EUR (para umbral SII > €6M). | |
| enrolled_in_sii | No | Inscripción en el SII. |
Implementation Reference
- Tool definition (schema) for 'es__get_compliance_status' — defines name, description, and inputSchema with parameters entity_type, province_code, annual_turnover_eur, and enrolled_in_sii.
TOOL_ES_GET_COMPLIANCE_STATUS = types.Tool( name="es__get_compliance_status", description=( "Devuelve los plazos de mandato vigentes y el sistema operativo para un perfil de empresa. " "Refleja el RD-ley 15/2025 — sujeto a cambios por legislación posterior." ), inputSchema={ "type": "object", "properties": { "entity_type": { "type": "string", "enum": ["IS", "IRPF"], "description": "Tipo de obligado tributario.", }, "province_code": { "type": "string", "description": "Código de provincia INE de dos dígitos.", "pattern": "^[0-9]{1,2}$", }, "annual_turnover_eur": { "type": "number", "description": "Volumen anual de operaciones IVA en EUR (para umbral SII > €6M).", }, "enrolled_in_sii": { "type": "boolean", "description": "Inscripción en el SII.", "default": False, }, }, "required": ["entity_type", "province_code"], }, ) - Handler function 'handle_es_get_compliance_status' — determines mandate deadlines and applicable e-invoicing systems (Facturae/FACe, Crea y Crece B2B, TicketBAI, NaTicket, SII, VERI*FACTU) for a company profile based on entity type, province code, turnover, and SII enrolment. Calls _detect_regime and uses _MANDATE_DATES constants.
async def handle_es_get_compliance_status( arguments: dict[str, Any], ) -> list[types.TextContent]: """Return mandate deadlines and applicable systems for a company profile.""" try: entity_type_str = arguments.get("entity_type", "IS") province_code = str(arguments.get("province_code", "28")).strip() turnover = arguments.get("annual_turnover_eur") enrolled = bool(arguments.get("enrolled_in_sii", False)) try: entity_type = EntityType(entity_type_str) except ValueError: return err(f"Invalid entity_type: {entity_type_str!r}. Must be 'IS' or 'IRPF'.") regime = _detect_regime(province_code, enrolled, annual_turnover_eur=turnover) applicable_systems: list[dict[str, Any]] = [] # Facturae/FACe always applies for B2G applicable_systems.append({ "system": "Facturae / FACe", "scope": "B2G (facturas al sector público)", **_MANDATE_DATES["FACTURAE_FACE"], }) # Crea y Crece B2B (pending decree) applicable_systems.append({ "system": "Crea y Crece B2B", "scope": "B2B (todas las empresas)", **_MANDATE_DATES["B2B_CREA_Y_CRECE"], }) # Regime-specific system if regime == SpanishRegime.TICKETBAI: applicable_systems.append({ "scope": "Todas las facturas (sustituye a VERI*FACTU en el País Vasco)", **_MANDATE_DATES["TICKETBAI"], }) elif regime == SpanishRegime.NATICKET: applicable_systems.append({ "scope": "Todas las facturas en Navarra", **_MANDATE_DATES["NATICKET"], }) elif regime == SpanishRegime.VERIFACTU_SII: applicable_systems.append({ "scope": "Grandes empresas / grupos IVA / REDEME", **_MANDATE_DATES["SII"], }) else: # VERIFACTU key = "VERIFACTU_IS" if entity_type == EntityType.IS else "VERIFACTU_IRPF" applicable_systems.append({ "scope": ( "Impuesto sobre Sociedades" if entity_type == EntityType.IS else "IRPF / autónomos y otros no-SII" ), **_MANDATE_DATES[key], }) result: dict[str, Any] = { "entity_type": entity_type.value, "province_code": province_code, "enrolled_in_sii": enrolled, "detected_regime": regime.value, "applicable_systems": applicable_systems, "disclaimer": ( "Fechas de mandato según RD-ley 15/2025 (diciembre 2025). " "Sujetas a cambios por legislación posterior o instrucciones de la AEAT. " "Este software no constituye asesoramiento jurídico ni fiscal." ), } if turnover is not None: result["annual_turnover_eur"] = turnover if turnover > _SII_TURNOVER_THRESHOLD_EUR: result["sii_threshold_note"] = ( f"Facturación ({turnover:,.2f} EUR) supera el umbral SII (€6M). " "Considere inscripción voluntaria en el SII." ) return ok(result) except Exception as exc: logger.exception("es__get_compliance_status failed") return err(str(exc)) - mcp_facturacion_electronica_es/server.py:108-137 (registration)Tool handler registration mapping: 'es__get_compliance_status' is mapped to 'handle_es_get_compliance_status' in the _TOOL_HANDLERS dictionary within server.py.
_TOOL_HANDLERS: dict[str, Any] = { # VERI*FACTU "es__generate_verifactu_record": handle_es_generate_verifactu_record, "es__validate_verifactu_record": handle_es_validate_verifactu_record, "es__submit_verifactu_to_aeat": handle_es_submit_verifactu_to_aeat, "es__generate_qr_verifactu": handle_es_generate_qr_verifactu, "es__cancel_verifactu_record": handle_es_cancel_verifactu_record, # Facturae / FACe "es__generate_facturae_xml": handle_es_generate_facturae_xml, "es__sign_facturae_xades": handle_es_sign_facturae_xades, "es__submit_to_face": handle_es_submit_to_face, "es__get_face_invoice_status": handle_es_get_face_invoice_status, "es__validate_facturae_schema": handle_es_validate_facturae_schema, # SII "es__build_sii_invoice_record": handle_es_build_sii_invoice_record, "es__submit_sii_batch": handle_es_submit_sii_batch, "es__query_sii_status": handle_es_query_sii_status, "es__generate_sii_correction": handle_es_generate_sii_correction, # TicketBAI "es__generate_ticketbai_xml": handle_es_generate_ticketbai_xml, "es__submit_ticketbai": handle_es_submit_ticketbai, "es__validate_ticketbai_schema": handle_es_validate_ticketbai_schema, # Crea y Crece / B2B "es__generate_b2b_einvoice_es": handle_es_generate_b2b_einvoice_es, "es__check_b2b_mandate_applicability": handle_es_check_b2b_mandate_applicability, # Utilities "es__detect_regional_regime": handle_es_detect_regional_regime, "es__get_compliance_status": handle_es_get_compliance_status, "es__parse_aeat_response": handle_es_parse_aeat_response, } - Helper function '_detect_regime' — pure-logic regime detection from province code, SII enrolment, and turnover. Used by the compliance status handler to determine the applicable regime.
def _detect_regime( province_code: str, enrolled_in_sii: bool, annual_turnover_eur: float | None = None, ) -> SpanishRegime: """Pure-logic regime detection from province code and SII enrolment.""" code = str(province_code).strip().zfill(2) if code in _TICKETBAI_INE_CODES: return SpanishRegime.TICKETBAI if code == _NATICKET_INE_CODE: return SpanishRegime.NATICKET if enrolled_in_sii: return SpanishRegime.VERIFACTU_SII if annual_turnover_eur is not None and annual_turnover_eur > _SII_TURNOVER_THRESHOLD_EUR: # Large turnover may trigger voluntary SII; regime is still VERIFACTU # until formally enrolled (enrollment is what triggers the exclusion) pass return SpanishRegime.VERIFACTU - Helper constants '_MANDATE_DATES' — maps system keys to deadline info (system name, deadline date, description) for all six systems (VERIFACTU_IS, VERIFACTU_IRPF, SII, FACTURAE_FACE, TICKETBAI, NATICKET, B2B_CREA_Y_CRECE). Used by the handler.
_MANDATE_DATES: dict[str, dict[str, str]] = { "VERIFACTU_IS": { "system": "VERI*FACTU", "deadline": "2027-01-01", "description": ( "Obligatorio para contribuyentes del Impuesto sobre Sociedades (IS) " "desde el 1 de enero de 2027 (RD-ley 15/2025)." ), }, "VERIFACTU_IRPF": { "system": "VERI*FACTU", "deadline": "2027-07-01", "description": ( "Obligatorio para autónomos en régimen de IRPF y otros obligados no-SII " "desde el 1 de julio de 2027 (RD-ley 15/2025)." ), }, "SII": { "system": "SII", "deadline": "already_mandatory", "description": ( "Ya obligatorio para grandes empresas (facturación > €6M), " "grupos de IVA y REDEME (RD 596/2016). " "Excluye la obligación de VERI*FACTU (RD 254/2025)." ), }, "FACTURAE_FACE": { "system": "Facturae / FACe", "deadline": "already_mandatory", "description": ( "Ya obligatorio para todos los proveedores del sector público " "desde 2015 (Ley 25/2013)." ), }, "TICKETBAI": { "system": "TicketBAI", "deadline": "already_mandatory", "description": ( "Ya obligatorio en el País Vasco (Álava, Gipuzkoa, Bizkaia) " "con implantación sectorial escalonada entre 2022 y 2023." ), }, "NATICKET": { "system": "NaTicket", "deadline": "rolling", "description": ( "Mandato foral de la Hacienda Foral de Navarra con implantación escalonada. " "VERI*FACTU no aplica en Navarra." ), }, "B2B_CREA_Y_CRECE": { "system": "Crea y Crece B2B", "deadline": "pending_decree", "description": ( "Reglamento de desarrollo de la Ley 18/2022 pendiente de publicación. " "El umbral y el calendario definitivos están por determinar." ), }, }