Initial commit
diff --git a/includes/payment-methods/class-wc-gateway-stripe-boleto.php b/includes/payment-methods/class-wc-gateway-stripe-boleto.php
new file mode 100644
index 0000000..bac1ba1
--- /dev/null
+++ b/includes/payment-methods/class-wc-gateway-stripe-boleto.php
@@ -0,0 +1,200 @@
+<?php
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
+
+/**
+ * Class that handles Boleto payment method.
+ *
+ * @extends WC_Gateway_Stripe
+ *
+ * @since 5.8.0
+ */
+class WC_Gateway_Stripe_Boleto extends WC_Stripe_Payment_Gateway_Voucher {
+
+ /**
+ * ID used by UPE
+ *
+ * @var string
+ */
+ const ID = 'stripe_boleto';
+
+ /**
+ * ID used by WooCommerce to identify the payment method
+ *
+ * @var string
+ */
+ public $id = 'stripe_boleto';
+
+ /**
+ * ID used by stripe
+ */
+ protected $stripe_id = 'boleto';
+
+ /**
+ * List of accepted currencies
+ *
+ * @var array
+ */
+ protected $supported_currencies = [ 'BRL' ];
+
+ /**
+ * List of accepted countries
+ */
+ protected $supported_countries = [ 'BR' ];
+
+ /**
+ * Constructor
+ *
+ * @since 5.8.0
+ */
+ public function __construct() {
+ $this->method_title = __( 'Stripe Boleto', 'woocommerce-gateway-stripe' );
+ parent::__construct();
+
+ add_filter( 'wc_stripe_allowed_payment_processing_statuses', [ $this, 'add_allowed_payment_processing_statuses' ], 10, 2 );
+ }
+
+ /**
+ * Add payment gateway voucher expiration to API request body.
+ *
+ * @param array $body API request body.
+ * @return array
+ */
+ protected function update_request_body_on_create_or_update_payment_intent( $body ) {
+ $body['payment_method_options'] = [
+ 'boleto' => [
+ 'expires_after_days' => $this->get_option( 'expiration' ),
+ ],
+ ];
+ return $body;
+ }
+
+ /**
+ * Add payment gateway voucher expiration.
+ *
+ * @param array $settings Settings array.
+ * @return array
+ */
+ public function get_unique_settings( $settings ) {
+ $settings[ $this->id . '_expiration' ] = $this->get_option( 'expiration' );
+ return $settings;
+ }
+
+ /**
+ * Updates payment gateway voucher expiration.
+ *
+ * @param WP_REST_Request $request Request object.
+ * @return void
+ */
+ public function update_unique_settings( WP_REST_Request $request ) {
+ $field_name = $this->id . '_expiration';
+ $expiration = $request->get_param( $field_name );
+
+ if ( null === $expiration ) {
+ return;
+ }
+
+ $value = absint( $expiration );
+ $value = min( 60, $value );
+ $value = max( 0, $value );
+ $this->update_option( 'expiration', $value );
+ }
+
+ /**
+ * Adds on-hold as accepted status during webhook handling on orders paid with voucher
+ *
+ * @param $allowed_statuses
+ * @param $order
+ *
+ * @return mixed
+ */
+ public function add_allowed_payment_processing_statuses( $allowed_statuses, $order ) {
+ if ( $this->stripe_id === $order->get_meta( '_stripe_upe_payment_type' ) && ! in_array( 'on-hold', $allowed_statuses ) ) {
+ $allowed_statuses[] = 'on-hold';
+ }
+
+ return $allowed_statuses;
+ }
+
+ /**
+ * Payment_scripts function.
+ *
+ * @since 5.8.0
+ */
+ public function payment_scripts() {
+ if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) && ! is_add_payment_method_page() ) {
+ return;
+ }
+
+ parent::payment_scripts();
+ wp_enqueue_script( 'jquery-mask', plugins_url( 'assets/js/jquery.mask.min.js', WC_STRIPE_MAIN_FILE ), [], WC_STRIPE_VERSION );
+ }
+
+ /**
+ * Payment form on checkout page
+ *
+ * @since 5.8.0
+ */
+ public function payment_fields() {
+ $description = $this->get_description();
+ apply_filters( 'wc_stripe_description', wpautop( wp_kses_post( $description ) ), $this->id )
+
+ ?>
+ <label>CPF/CNPJ: <abbr class="required" title="required">*</abbr></label><br>
+ <input id="stripe_boleto_tax_id" name="stripe_boleto_tax_id" type="text"><br><br>
+ <div class="stripe-source-errors" role="alert"></div>
+
+ <div id="stripe-boleto-payment-data"><?php echo $description; ?></div>
+ <?php
+ }
+
+ /**
+ * Validates the minimum and maximum amount. Throws exception when out of range value is added
+ *
+ * @since 5.8.0
+ *
+ * @param $amount
+ *
+ * @throws WC_Stripe_Exception
+ */
+ protected function validate_amount_limits( $amount ) {
+
+ if ( $amount < 5.00 ) {
+ /* translators: 1) amount (including currency symbol) */
+ throw new WC_Stripe_Exception( sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( 5.00 ) ) );
+ } elseif ( $amount > 49999.99 ) {
+ /* translators: 1) amount (including currency symbol) */
+ throw new WC_Stripe_Exception( sprintf( __( 'Sorry, the maximum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( 49999.99 ) ) );
+ }
+ }
+
+ /**
+ * Gather the data necessary to confirm the payment via javascript
+ * Override this when extending the class
+ *
+ * @param WC_Order $order
+ *
+ * @return array
+ */
+ protected function get_confirm_payment_data( $order ) {
+ return [
+ 'payment_method' => [
+ 'boleto' => [
+ 'tax_id' => isset( $_POST['stripe_boleto_tax_id'] ) ? wc_clean( wp_unslash( $_POST['stripe_boleto_tax_id'] ) ) : null,
+ ],
+ 'billing_details' => [
+ 'name' => $order->get_formatted_billing_full_name(),
+ 'email' => $order->get_billing_email(),
+ 'address' => [
+ 'line1' => $order->get_billing_address_1(),
+ 'city' => $order->get_billing_city(),
+ 'state' => $order->get_billing_state(),
+ 'postal_code' => $order->get_billing_postcode(),
+ 'country' => $order->get_billing_country(),
+ ],
+ ],
+ ],
+ ];
+ }
+}