| 开发者 | australcode |
|---|---|
| 更新时间 | 2026年7月4日 10:40 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPL-2.0-or-later |
| 版权网址: | 版权信息 |
/wp-content/plugins/australcode-bsale.Yes, you need an active Bsale account with API access. The plugin connects to your existing Bsale account via API token.
Free covers everything a typical Chilean e-commerce store needs: product/stock sync, manual emission of boletas and facturas, RUT validation, single-office stock, on-demand audit, real-time webhook updates. Pro adds workflow automation (auto-emission post-payment, scheduled audits, daily SKU auto-link), multi-warehouse support (multi-office stock aggregation, stock transfer between offices, per-shipping-method routing), and advanced B2B features (custom field mapping, dynamic document attributes, sales notes, automatic credit notes from refunds). The Pro features are distributed as a separate plugin (from australcode.io) and are not included in this free version. See the Pro page for the full comparison.
Yes. Your Bsale account connection and general settings (API connection, document types, tax options) are stored independently of the Pro features, so when you move to the Pro version your existing configuration carries over — no re-entry needed.
The free version is fully functional on its own — it keeps handling product/stock sync and manual emission of boletas and facturas. The Pro features are provided by the separate Pro version and are not part of this free plugin.
Yes, the plugin is compatible with both the Block-based Checkout (WooCommerce 8.0+) and the Classic Checkout. Chilean tax fields (RUT, razón social, giro) are added to both.
Yes. The order metabox allows manual override of the document type per order, useful for B2B orders where the customer requests a factura instead of a boleta. This works in both Free and Pro.
Yes — in Pro. Free supports a single configured office. Pro adds multi-office stock aggregation (sum of available units across selected offices) plus stock transfer modes for inter-office logistics.
Failed emissions are logged with the error reason. The order metabox includes a "Re-emit" button to retry manually. The plugin also has an automatic retry mechanism (Pro feature, configurable, opt-in) for transient failures.
Yes, the plugin declares compatibility with HPOS (High-Performance Order Storage) and uses the WooCommerce data abstraction layer for all order operations.
No. The plugin is a Bsale integration — it requires an active Bsale account and API access to function. The plugin's value is precisely the bidirectional sync between WooCommerce and Bsale.
Pro is sold as an annual subscription through Freemius (Merchant of Record). After checkout your Pro license activates automatically; you can manage, sync or deactivate it from the native Freemius account screen. Freemius re-validates the license periodically while it is active. If Freemius is temporarily unreachable, your Pro features keep working — only an explicit change (refund, revocation, expiration) deactivates them.
Visit https://bsale.australcode.io for plugin documentation, support, and source code.
Several plugins issue Chilean boletas or facturas from WooCommerce. Australcode Bsale differs on three concrete points:
Pro is sold as an annual subscription with one site activation per license. Multi-site licenses (3, 10, 25 sites) are also available. Current pricing is on bsale.australcode.io.
wp_kses() with an explicit allowlist at output time (escaping late). Added an is_callable() guard before invoking an internal progress callback in the stock sync. No functional or visual change.str_starts_with() (PHP 8.0+) was called without a polyfill in the webhook URL builder, which could fatal when processing a webhook resource path on the plugin's declared minimum (PHP 7.4). Replaced with a 7.4-safe equivalent. Recommended update for any site running PHP 7.4. (No functional changes for PHP 8+ sites.)wp command in environments where the SDK fails to load. No functional changes.GPL-2.0-or-later; menu icon style registration no longer triggers a Plugin Check "missing version" warning; minor packaging metadata hygiene.get_all) gained a configurable safety cap that logs and stops runaway pagination instead of hanging the request; removed dead code._load_textdomain_just_in_time notice (WP 6.7+). Block checkout field registration is now deferred to woocommerce_init (WooCommerce's canonical hook for additional checkout fields) and the cron-schedule filter no longer translates labels before init. No translation now loads before init.ExceptionNotEscaped error.private post status in the "WC products without Bsale mapping" section, so intentionally-private items (e.g. discontinued products) are visually distinguishable and no longer read as problems. Presentation-only — audit coverage is unchanged.save_mapping) still used the first variant, recreating a wrong-variant mapping row on every sync of a simple product mapped to a multi-variant Bsale item. The correct variant is now resolved by SKU (or the existing mapping) in both paths. Surfaced by live re-validation against a Bsale DEMO account.product.create/update webhooks are now marked completed in one pass. They were missing a normalized return flag, which routed successes to the retry path and duplicated product mappings before failing.placeholder attribute from Block additional checkout fields (WooCommerce 8.6+ notice).phpcs.xml*, tests/, scripts/, composer.{json,lock}, phpunit.xml*, .phpunit.result.cache, vendor/) are excluded from the build, closing the two application_detected errors that Plugin Check reported on 3.0.7.phpcs:ignore scoping on the WooCommerce-checkout $_POST reads (validate_classic_checkout, save_classic_order_meta) — WooCommerce verifies its own checkout nonce upstream; the annotations now document that explicitly. Same for the license form controller, where the nonce is verified through the guard() helper.phpcs:disable headers added to the 18 files that own custom plugin tables (wp_acbsl_*) and to the 9 admin view templates, documenting that the SQL "InterpolatedNotPrepared / DirectQuery / NoCaching" reports and the "NonPrefixedVariableFound" reports are false positives in this codebase: table names are class-controlled constants, values pass through $wpdb->prepare(), and view-scope locals are not WordPress globals.sku_locked mapping flag introduced in 3.0.6. It was over-engineering: the intended behavior is that the SKU of a WooCommerce product is the matching key and must never be overwritten by Bsale during sync, without opt-in/opt-out. There is no "Bsale as authority over SKU" mode. If a Bsale variant code diverges from the WC SKU, the existing Auditoría module reports the orphan for manual resolution.sku_locked column on wp_acbsl_products is dropped automatically (idempotent migration acbsl_migration_sku_lock_removed). The 3.0.6 migration flag acbsl_migration_sku_lock_added is cleared.apply_variant_to_product() simplified: never calls set_sku(). If WC SKU and Bsale variant code differ, logs an info entry "SKU divergente entre WC y Bsale; el SKU local se preserva" for diagnostics.sync_product() introduced in 3.0.6 remain (those were correct). get_mappings_by_sku() and get_mappings_by_bsale_id() plural stay.code, silently overwriting SKUs that stores intentionally diverged. This was a regression from the original "match by SKU" design. From now on, the SKU is preserved by default. When the Bsale code differs from the WC SKU, the sync logs an info entry ("SKU local conservado (lock activo)") for diagnostics. To restore the legacy behavior (Bsale as authority on SKU), set sku_locked = 0 on the mapping row in wp_acbsl_products.sync_product() does too. The lookup is primary by SKU with fallback by bsale_product_id for legacy mappings.sku_locked TINYINT(1) DEFAULT 1 in wp_acbsl_products. Migration is automatic and idempotent — both existing and new mappings start locked (safe default). A future minor release will add a UI toggle to override per product.danger-outline) to communicate it is a destructive action. The "Última auditoría" stat value on the Audit screen now uses the monospace family, matching the other numeric KPIs.style="…" attributes in Traceability and Audit replaced by utility classes in the design system (acbsl-kpi-label, acbsl-kpi-value, acbsl-card-legacy, acbsl-text-center, acbsl-mt-xl, acbsl-mb-lg, etc.). Visual rendering unchanged.phpcs:ignore comments added on canonical $wpdb->prepare() patterns (array-variadic IN clauses, gated set_time_limit(), debug_backtrace runtime heuristic in the stock tracer, gated error_log for tracer/reconciler internals) so that defensible style-warnings stop being reported as actionable.cpnId) against the connected account before trusting it; and non-idempotent API writes (document/stock emission) are no longer auto-retried on timeout/5xx, to avoid duplicate documents or stock movements.dedup_hash), safer legacy-cron cleanup (fixed hook list), a guarded table-rename migration (logs and retries on partial failure), and complete uninstall cleanup.cb/CBSALE/conecta_bsale prefixes to acbsl/Australcode)./wp-json/conecta-bsale/v1/webhook, so stock sync keeps working without reconfiguring anything on the Bsale side.0, so two different orders emitting the same document type in the same burst no longer block each other.cpnId) against the connected account, rejecting foreign-origin payloads with HTTP 403. The expected cpnId auto-detects from the first webhook. An optional shared token (?acbsl_token= URL param or X-CB-Token header, paired with the webhook_secret setting) adds defense-in-depth. Note: Bsale does not sign its webhooks, so HMAC signature verification is not applicable.repair-incomplete-documents.php) that was web-accessible without auth.esc_html() / esc_html__() (Plugin Check compliance: 0 errors).unlimitedStock variants handled correctly — services/digitals no longer falsely rejected as "no stock" during emission or sync.wp_mail() return + add order note on failure.(bsale_document_id, document_type) prevents duplicate rows from concurrent flows.CB_LICENSE_VARIANT_IDS in wp-config (previously the strict-mode default rejected every license without it). Still override-able via constant/filter.has_pending_transfer_guide fails-open during API outages.document.failed webhook handler — properly records rejected documents with admin notification.TypeError.sync_prices=false like the individual path, (b) only updates the variants that actually triggered webhooks instead of the whole mapped catalog, and (c) the settings sanitizer clears the sale-price sub-flag when price sync is turned off.CB_Pro_UI, cb_is_pro(), cb_is_unlimited_stock_variant(), CB_License_Activator::scrub_license_key().detail_ids field now populated for all emitted document types (boleta, factura, credit note), not just nota de venta. Improves stock event correlation in the audit system.unlimitedStock field returned by the Bsale API.bsale_variant_id field in the audit ledger, enabling per-variant correlation in the reconciler. Resolves the gap where 100% of stock webhook events were stored with NULL variant ID.admin.css (216 lines, both px and rem) to the --cb-sp-* token system. Visual output unchanged.--cb-* token system and cb-* class prefix as a deliberate choice independent from the hub design system canon.plugin_emit ledger entry for the same document. Closes the race condition between the reconciler and the webhook processor.nv_provisional_stale → "Pending NV expired"). Cleaner empty states across the admin UI. Sub-fields use design system tokens for the left border instead of hardcoded color values.--cb-font-mono applied to technical data (folios, SKUs, RUTs, timestamps, prices, Bsale IDs) for tabular alignment.compute_delta_sign heuristic for Bsale document webhooks. Correctly determines the sign of stock movement based on codeSii, document type, event type, and document state. Closes the gap where bsale_document events stored NULL delta_expected.bsale_variant_id now resolved for events written from the webhook processor (previously only set for events from the reconciler).stock_mismatch and bsale_silent_movement discrepancies. Index added on created_at of the audit ledger for query performance. UI button to acknowledge discrepancies. Dynamic severity for unmapped variants.