get_option_schema() as $option => $args ) { register_setting( 'eightdigits_factura_settings', $option, array( 'type' => $args['type'], 'sanitize_callback' => array( $this, $args['sanitize_callback'] ), 'default' => $args['default'], ) ); } add_settings_section( 'eightdigits_factura_section_company', __( 'Datos del emisor', '8digits-factura-for-woocommerce' ), '__return_false', 'eightdigits_factura_settings' ); $this->add_field( 'company_name', __( 'Nombre de la empresa', '8digits-factura-for-woocommerce' ), array( $this, 'field_company_name' ), 'eightdigits_factura_section_company' ); $this->add_field( 'nif', __( 'NIF / CIF', '8digits-factura-for-woocommerce' ), array( $this, 'field_nif' ), 'eightdigits_factura_section_company' ); $this->add_field( 'address', __( 'Direccion', '8digits-factura-for-woocommerce' ), array( $this, 'field_address' ), 'eightdigits_factura_section_company' ); $this->add_field( 'postal_code', __( 'Codigo postal', '8digits-factura-for-woocommerce' ), array( $this, 'field_postal_code' ), 'eightdigits_factura_section_company' ); $this->add_field( 'city', __( 'Ciudad', '8digits-factura-for-woocommerce' ), array( $this, 'field_city' ), 'eightdigits_factura_section_company' ); $this->add_field( 'province', __( 'Provincia', '8digits-factura-for-woocommerce' ), array( $this, 'field_province' ), 'eightdigits_factura_section_company' ); $this->add_field( 'phone', __( 'Telefono', '8digits-factura-for-woocommerce' ), array( $this, 'field_phone' ), 'eightdigits_factura_section_company' ); $this->add_field( 'email', __( 'Email de contacto', '8digits-factura-for-woocommerce' ), array( $this, 'field_email' ), 'eightdigits_factura_section_company' ); add_settings_section( 'eightdigits_factura_section_invoice', __( 'Configuracion de facturas', '8digits-factura-for-woocommerce' ), '__return_false', 'eightdigits_factura_settings' ); $this->add_field( 'invoice_prefix', __( 'Prefijo de factura', '8digits-factura-for-woocommerce' ), array( $this, 'field_invoice_prefix' ), 'eightdigits_factura_section_invoice' ); $this->add_field( 'series_start', __( 'Numero de inicio de serie', '8digits-factura-for-woocommerce' ), array( $this, 'field_series_start' ), 'eightdigits_factura_section_invoice' ); $this->add_field( 'default_iva', __( 'IVA por defecto', '8digits-factura-for-woocommerce' ), array( $this, 'field_default_iva' ), 'eightdigits_factura_section_invoice' ); $this->add_field( 'trigger_statuses', __( 'Generar factura al pasar a', '8digits-factura-for-woocommerce' ), array( $this, 'field_trigger_statuses' ), 'eightdigits_factura_section_invoice' ); $this->add_field( 'attach_pdf', __( 'Adjuntar PDF al email', '8digits-factura-for-woocommerce' ), array( $this, 'field_attach_pdf' ), 'eightdigits_factura_section_invoice' ); } /** * Add a settings field. */ private function add_field( string $key, string $label, callable $callback, string $section ): void { add_settings_field( 'eightdigits_factura_' . $key, $label, $callback, 'eightdigits_factura_settings', $section ); } /** * Option schema. * * @return array */ private function get_option_schema(): array { return array( 'eightdigits_factura_company_name' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text', 'default' => '' ), 'eightdigits_factura_nif' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_nif', 'default' => '' ), 'eightdigits_factura_address' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_textarea', 'default' => '' ), 'eightdigits_factura_postal_code' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_postal_code', 'default' => '' ), 'eightdigits_factura_city' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text', 'default' => '' ), 'eightdigits_factura_province' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_province', 'default' => '' ), 'eightdigits_factura_phone' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text', 'default' => '' ), 'eightdigits_factura_email' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_email_option', 'default' => get_option( 'admin_email' ) ), 'eightdigits_factura_invoice_prefix' => array( 'type' => 'string', 'sanitize_callback' => 'sanitize_invoice_prefix', 'default' => 'F' ), 'eightdigits_factura_series_start' => array( 'type' => 'integer', 'sanitize_callback' => 'sanitize_series_start', 'default' => 1 ), 'eightdigits_factura_default_iva' => array( 'type' => 'number', 'sanitize_callback' => 'sanitize_default_iva', 'default' => 21 ), 'eightdigits_factura_trigger_statuses' => array( 'type' => 'array', 'sanitize_callback' => 'sanitize_trigger_statuses', 'default' => array( 'wc-processing' ) ), 'eightdigits_factura_attach_pdf' => array( 'type' => 'boolean', 'sanitize_callback' => 'sanitize_checkbox', 'default' => true ), ); } public function field_company_name(): void { printf( '', esc_attr( get_option( 'eightdigits_factura_company_name', '' ) ) ); } public function field_nif(): void { printf( '', esc_attr( get_option( 'eightdigits_factura_nif', '' ) ) ); } public function field_address(): void { printf( '', esc_textarea( get_option( 'eightdigits_factura_address', '' ) ) ); } public function field_postal_code(): void { printf( '', esc_attr( get_option( 'eightdigits_factura_postal_code', '' ) ) ); } public function field_city(): void { printf( '', esc_attr( get_option( 'eightdigits_factura_city', '' ) ) ); } public function field_province(): void { $current = get_option( 'eightdigits_factura_province', '' ); echo ''; } public function field_phone(): void { printf( '', esc_attr( get_option( 'eightdigits_factura_phone', '' ) ) ); } public function field_email(): void { printf( '', esc_attr( get_option( 'eightdigits_factura_email', get_option( 'admin_email' ) ) ) ); } public function field_invoice_prefix(): void { $value = get_option( 'eightdigits_factura_invoice_prefix', 'F' ); $year = gmdate( 'Y' ); $prefix = $value ?: 'F'; printf( '

%s %s

', esc_attr( $value ), esc_html__( 'Ejemplo:', '8digits-factura-for-woocommerce' ), esc_html( $prefix . '-' . $year . '-0001' ) ); } public function field_series_start(): void { $value = (int) get_option( 'eightdigits_factura_series_start', 1 ); $locked = EightDigits_Factura_Invoice::count() > 0; printf( '

%s

', absint( $value ), disabled( $locked, true, false ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- disabled() returns a fixed HTML attribute. esc_html( $locked ? __( 'No se puede modificar: ya existen facturas en esta serie.', '8digits-factura-for-woocommerce' ) : __( 'Se aplica cuando comienza la primera serie del plugin.', '8digits-factura-for-woocommerce' ) ) ); } public function field_default_iva(): void { $current = get_option( 'eightdigits_factura_default_iva', '21' ); $rates = array( '0', '4', '10', '21' ); echo ''; } public function field_trigger_statuses(): void { $current = (array) get_option( 'eightdigits_factura_trigger_statuses', array( 'wc-processing' ) ); foreach ( self::TRIGGER_STATUSES as $status ) { printf( '
', esc_attr( $status ), checked( in_array( $status, $current, true ), true, false ), esc_html( wc_get_order_status_name( str_replace( 'wc-', '', $status ) ) ) ); } } public function field_attach_pdf(): void { printf( '', checked( (bool) get_option( 'eightdigits_factura_attach_pdf', true ), true, false ), esc_html__( 'Adjuntar el PDF a los emails del pedido.', '8digits-factura-for-woocommerce' ) ); } public function sanitize_text( $value ): string { return sanitize_text_field( (string) $value ); } public function sanitize_textarea( $value ): string { return sanitize_textarea_field( (string) $value ); } public function sanitize_nif( $value ): string { return strtoupper( sanitize_text_field( (string) $value ) ); } public function sanitize_postal_code( $value ): string { return substr( preg_replace( '/\D+/', '', (string) $value ), 0, 5 ); } public function sanitize_province( $value ): string { $value = sanitize_text_field( (string) $value ); return in_array( $value, self::PROVINCES, true ) ? $value : ''; } public function sanitize_email_option( $value ): string { return sanitize_email( (string) $value ); } public function sanitize_invoice_prefix( $value ): string { $value = EightDigits_Factura_Numbering::normalize_series_prefix( (string) $value ); return '' !== $value ? $value : 'F'; } public function sanitize_series_start( $value ): int { if ( EightDigits_Factura_Invoice::count() > 0 ) { return (int) get_option( 'eightdigits_factura_series_start', 1 ); } return max( 1, absint( $value ) ); } public function sanitize_default_iva( $value ): float { return max( 0, min( 100, (float) $value ) ); } public function sanitize_trigger_statuses( $value ): array { $value = is_array( $value ) ? $value : array(); $sanitized = array(); foreach ( $value as $status ) { $status = sanitize_text_field( (string) $status ); if ( in_array( $status, self::TRIGGER_STATUSES, true ) ) { $sanitized[] = $status; } } return ! empty( $sanitized ) ? array_values( array_unique( $sanitized ) ) : array( 'wc-processing' ); } public function sanitize_checkbox( $value ): bool { return ! empty( $value ); } }