2019-08-26 05:49:04 +00:00
|
|
|
/**
|
|
|
|
* External dependencies
|
|
|
|
*/
|
|
|
|
import { __ } from '@wordpress/i18n';
|
2021-01-07 23:57:09 +00:00
|
|
|
import { Button, Card, CardBody } from '@wordpress/components';
|
2019-11-06 03:18:02 +00:00
|
|
|
import { Component, Fragment } from '@wordpress/element';
|
2019-08-26 05:49:04 +00:00
|
|
|
import { compose } from '@wordpress/compose';
|
2020-06-10 23:49:27 +00:00
|
|
|
import { difference, filter } from 'lodash';
|
2019-08-26 05:49:04 +00:00
|
|
|
import interpolateComponents from 'interpolate-components';
|
2020-03-25 03:20:17 +00:00
|
|
|
import { withDispatch, withSelect } from '@wordpress/data';
|
2021-07-13 19:47:36 +00:00
|
|
|
import { H, Link, Stepper, Plugins, Spinner } from '@woocommerce/components';
|
2019-11-22 17:07:26 +00:00
|
|
|
import { getHistory, getNewPath } from '@woocommerce/navigation';
|
2020-08-24 13:20:57 +00:00
|
|
|
import { getAdminLink } from '@woocommerce/wc-admin-settings';
|
2020-02-14 02:23:21 +00:00
|
|
|
import {
|
2020-08-24 13:20:57 +00:00
|
|
|
ONBOARDING_STORE_NAME,
|
2020-06-10 23:49:27 +00:00
|
|
|
OPTIONS_STORE_NAME,
|
2020-08-24 13:20:57 +00:00
|
|
|
PLUGINS_STORE_NAME,
|
|
|
|
SETTINGS_STORE_NAME,
|
2020-06-10 23:49:27 +00:00
|
|
|
} from '@woocommerce/data';
|
2020-08-20 04:59:52 +00:00
|
|
|
import { recordEvent, queueRecordEvent } from '@woocommerce/tracks';
|
2021-01-07 23:57:09 +00:00
|
|
|
import { Text } from '@woocommerce/experimental';
|
2019-08-26 05:49:04 +00:00
|
|
|
/**
|
|
|
|
* Internal dependencies
|
|
|
|
*/
|
2020-08-13 02:05:22 +00:00
|
|
|
import Connect from '../../dashboard/components/connect';
|
|
|
|
import { createNoticesFromResponse } from '../../lib/notices';
|
|
|
|
import { getCountryCode } from '../../dashboard/utils';
|
2019-08-26 05:49:04 +00:00
|
|
|
import StoreLocation from './steps/location';
|
|
|
|
|
|
|
|
class Tax extends Component {
|
2019-11-15 13:32:02 +00:00
|
|
|
constructor( props ) {
|
|
|
|
super( props );
|
2020-07-01 12:19:15 +00:00
|
|
|
const { hasCompleteAddress, pluginsToActivate } = props;
|
2019-08-26 05:49:04 +00:00
|
|
|
|
|
|
|
this.initialState = {
|
|
|
|
isPending: false,
|
2020-07-01 12:19:15 +00:00
|
|
|
stepIndex: hasCompleteAddress ? 1 : 0,
|
|
|
|
// Cache the value of pluginsToActivate so that we can
|
|
|
|
// show/hide tasks based on it, but not have them update mid task.
|
|
|
|
cachedPluginsToActivate: pluginsToActivate,
|
2019-08-26 05:49:04 +00:00
|
|
|
};
|
|
|
|
this.state = this.initialState;
|
|
|
|
|
|
|
|
this.completeStep = this.completeStep.bind( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
2021-06-01 18:04:21 +00:00
|
|
|
const { query } = this.props;
|
|
|
|
const { auto } = query;
|
2019-08-26 05:49:04 +00:00
|
|
|
this.reset();
|
2021-06-01 18:04:21 +00:00
|
|
|
|
|
|
|
if ( auto === 'true' ) {
|
|
|
|
this.enableAutomatedTax();
|
|
|
|
}
|
2019-08-26 05:49:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
reset() {
|
|
|
|
this.setState( this.initialState );
|
|
|
|
}
|
|
|
|
|
2020-04-21 00:12:38 +00:00
|
|
|
shouldShowSuccessScreen() {
|
2019-08-26 05:49:04 +00:00
|
|
|
const {
|
2020-02-14 02:23:21 +00:00
|
|
|
isJetpackConnected,
|
2020-07-01 12:19:15 +00:00
|
|
|
hasCompleteAddress,
|
2020-02-14 02:23:21 +00:00
|
|
|
pluginsToActivate,
|
|
|
|
} = this.props;
|
2020-07-01 12:19:15 +00:00
|
|
|
|
2020-04-21 00:12:38 +00:00
|
|
|
return (
|
2020-07-01 12:19:15 +00:00
|
|
|
hasCompleteAddress &&
|
2020-04-21 00:12:38 +00:00
|
|
|
! pluginsToActivate.length &&
|
2020-02-14 02:23:21 +00:00
|
|
|
isJetpackConnected &&
|
|
|
|
this.isTaxJarSupported()
|
2020-04-21 00:12:38 +00:00
|
|
|
);
|
|
|
|
}
|
2019-08-26 05:49:04 +00:00
|
|
|
|
2019-10-16 22:01:56 +00:00
|
|
|
isTaxJarSupported() {
|
2020-08-24 13:20:57 +00:00
|
|
|
const { countryCode, tasksStatus } = this.props;
|
2020-02-14 02:23:21 +00:00
|
|
|
const {
|
|
|
|
automatedTaxSupportedCountries = [],
|
|
|
|
taxJarActivated,
|
2020-08-24 13:20:57 +00:00
|
|
|
} = tasksStatus;
|
2019-10-16 22:01:56 +00:00
|
|
|
|
|
|
|
return (
|
2019-11-07 07:37:17 +00:00
|
|
|
! taxJarActivated && // WCS integration doesn't work with the official TaxJar plugin.
|
|
|
|
automatedTaxSupportedCountries.includes( countryCode )
|
2019-10-16 22:01:56 +00:00
|
|
|
);
|
2019-08-26 05:49:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
completeStep() {
|
|
|
|
const { stepIndex } = this.state;
|
|
|
|
const steps = this.getSteps();
|
|
|
|
const nextStep = steps[ stepIndex + 1 ];
|
|
|
|
|
|
|
|
if ( nextStep ) {
|
|
|
|
this.setState( { stepIndex: stepIndex + 1 } );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
async manuallyConfigureTaxRates() {
|
2020-03-25 03:20:17 +00:00
|
|
|
const {
|
|
|
|
generalSettings,
|
|
|
|
updateAndPersistSettingsForGroup,
|
|
|
|
} = this.props;
|
2019-11-06 03:18:02 +00:00
|
|
|
|
2020-02-14 02:23:21 +00:00
|
|
|
if ( generalSettings.woocommerce_calc_taxes !== 'yes' ) {
|
2019-11-06 03:18:02 +00:00
|
|
|
this.setState( { isPending: true } );
|
2020-07-01 12:19:15 +00:00
|
|
|
updateAndPersistSettingsForGroup( 'general', {
|
2019-11-06 03:18:02 +00:00
|
|
|
general: {
|
2020-06-23 02:47:02 +00:00
|
|
|
...generalSettings,
|
2019-11-06 03:18:02 +00:00
|
|
|
woocommerce_calc_taxes: 'yes',
|
|
|
|
},
|
2020-07-01 12:19:15 +00:00
|
|
|
} )
|
|
|
|
.then( () => this.redirectToTaxSettings() )
|
|
|
|
.catch( ( error ) => createNoticesFromResponse( error ) );
|
|
|
|
} else {
|
|
|
|
this.redirectToTaxSettings();
|
2019-11-06 03:18:02 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
updateAutomatedTax( isEnabling ) {
|
2020-06-23 02:47:02 +00:00
|
|
|
const {
|
2020-08-24 13:20:57 +00:00
|
|
|
clearTaskStatusCache,
|
2020-06-23 02:47:02 +00:00
|
|
|
createNotice,
|
|
|
|
updateAndPersistSettingsForGroup,
|
|
|
|
generalSettings,
|
|
|
|
taxSettings,
|
|
|
|
} = this.props;
|
2019-08-26 05:49:04 +00:00
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
Promise.all( [
|
|
|
|
updateAndPersistSettingsForGroup( 'tax', {
|
|
|
|
tax: {
|
|
|
|
...taxSettings,
|
|
|
|
wc_connect_taxes_enabled: isEnabling ? 'yes' : 'no',
|
|
|
|
},
|
|
|
|
} ),
|
|
|
|
updateAndPersistSettingsForGroup( 'general', {
|
|
|
|
general: {
|
|
|
|
...generalSettings,
|
|
|
|
woocommerce_calc_taxes: 'yes',
|
|
|
|
},
|
|
|
|
} ),
|
|
|
|
] )
|
|
|
|
.then( () => {
|
2020-08-24 13:20:57 +00:00
|
|
|
clearTaskStatusCache();
|
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
if ( isEnabling ) {
|
|
|
|
createNotice(
|
|
|
|
'success',
|
|
|
|
__(
|
|
|
|
"You're awesome! One less item on your to-do list ✅",
|
|
|
|
'woocommerce-admin'
|
|
|
|
)
|
|
|
|
);
|
|
|
|
getHistory().push( getNewPath( {}, '/', {} ) );
|
|
|
|
} else {
|
|
|
|
this.redirectToTaxSettings();
|
|
|
|
}
|
|
|
|
} )
|
|
|
|
.catch( () => {
|
|
|
|
createNotice(
|
|
|
|
'error',
|
|
|
|
__(
|
2021-02-10 23:57:51 +00:00
|
|
|
'There was a problem updating your tax settings',
|
2020-07-01 12:19:15 +00:00
|
|
|
'woocommerce-admin'
|
|
|
|
)
|
|
|
|
);
|
2019-10-16 22:01:56 +00:00
|
|
|
} );
|
2019-08-26 05:49:04 +00:00
|
|
|
}
|
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
redirectToTaxSettings() {
|
|
|
|
window.location = getAdminLink(
|
|
|
|
'admin.php?page=wc-settings&tab=tax§ion=standard&wc_onboarding_active_task=tax'
|
|
|
|
);
|
Merge final `version/1.0` branch with `master` (https://github.com/woocommerce/woocommerce-admin/pull/3848)
* Try: Moving Customers to main Woo Menu (https://github.com/woocommerce/woocommerce-admin/pull/3632)
* Only add onboarding settings on wc-admin pages when task list should be shown. (https://github.com/woocommerce/woocommerce-admin/pull/3722)
* Use cron for unsnoozing admin notes (https://github.com/woocommerce/woocommerce-admin/pull/3662)
* Use wp-cron for admin note snoozing.
* Remove "unsnooze" scheduled action.
* Use correct version.
* Avoid using deprecated method for unscheduling actions.
* Onboarding: Fix toggle tracking events (https://github.com/woocommerce/woocommerce-admin/pull/3645)
* Fix errant wcadmin prefix on event name
* Track the onboarding toggle on the option in case enable_onboarding isn't used
* Move toggle actions to separate function
* Move onboarding actions
* Move onboarding filters
* Move help tab updates to add_toggle_actions
* Only run onboarding actions when enabled
* Onboarding: Add tracks events when profiler steps are completed (https://github.com/woocommerce/woocommerce-admin/pull/3726)
* Add tracks for store profiler step completion
* Record event when profiler is completed
* Ensure continue setup loads the onboarding profiler (https://github.com/woocommerce/woocommerce-admin/pull/3646)
* 'All that include' option removed when input field is empty (https://github.com/woocommerce/woocommerce-admin/pull/3700)
* 'All that include' option removed when input field is empty
Added a control to check that when the input field 'Search by customer name' is empty, the 'All that include' option is not appearing.
* Const name improved
The constant name hasValues was changed to optionsHaveValues (more descriptive)
* Fix select text alignment (https://github.com/woocommerce/woocommerce-admin/pull/3723)
* Stock panel indicator - cache and use lookup tables. (https://github.com/woocommerce/woocommerce-admin/pull/3729)
* Stock panel indicator - cache and use lookup tables.
* Revise query, clear transient on product update.
* Fix error, ht Josh.
* Checklist: Remove sideloaded images to reduce build size, take 2 (https://github.com/woocommerce/woocommerce-admin/pull/3731)
* Remove homepage template images.
* Use other-small on all industries, adjust text color.
* Remove background dim and opacity set to 0
* Fix/3631 (https://github.com/woocommerce/woocommerce-admin/pull/3730)
* Added CBD as an industry type
CBD was added as an industry type in API
* Industries options modified
Modified the industries options. Now we are able to choose if we will use an input or not in the option.
* API control changed for industries.
API control changed for industries. Now it accepts the data type we need.
* Added input in Industries list for the option "Other"
Added an input for the option "Other" in the industries list
* Added suggested changes in review comments.
* Added data preparation for recordEvent
* Changed variable to snake_case
The variable "industriesWithDetail" was changed to "industries_with_detail" (snake_case)
* Onboarding: Create homepage without redirect (https://github.com/woocommerce/woocommerce-admin/pull/3727)
* Add link to edit homepage instead of redirect
* Add busy state to homepage creation button
* Publish homepage on create via API
* Update homepage notice to show on first post update
* Update homepage creation notice per design
* Record event on customize homepage
* Set homepage to frontpage on creation
* Add deactivation note for feature plugin (https://github.com/woocommerce/woocommerce-admin/pull/3687)
* Add version deactivation note
* Add the note to deactivate if the version is older than the current WC version
* Deactivate wc admin feature plugin on action click
* Add notes version hooks
* change the Package class namespace to exclude from standalone autoloader
* add use statement for FeaturePlugin
* add note explaining namespace
* use wc-admin-deactivate-plugin note name
* Rename file and class to WC_Admin_Notes_Deactivate_Plugin
Co-authored-by: Ron Rennick <ron@ronandandrea.com>
Co-authored-by: Paul Sealock <psealock@gmail.com>
* Add Travis tests on GH for release branch (https://github.com/woocommerce/woocommerce-admin/pull/3751)
* Add Travis tests on GH for release branch
* fix linter errors
* ActivityPanels.php -> use public static functions
* Remove free text Search option when no query exists (https://github.com/woocommerce/woocommerce-admin/pull/3755)
* Revert changes in woocommerce/woocommerce-admin#3700
* Don't add free text search if no query exists
* Add tests for Search without query
* Add test for showing free text search option
* Fix image sideloading for store industries. (https://github.com/woocommerce/woocommerce-admin/pull/3743)
* Fix image sideloading for store industries.
Data format changed in https://github.com/woocommerce/woocommerce-admin/pull/3730
* Fix industry image sideload in cases where the count is less than requested.
* Be backwards compatible with the old industry data format.
* Added event props to identify stores with WCS and Jetpack installed (https://github.com/woocommerce/woocommerce-admin/pull/3750)
* Added event props to identify stores with WCS and Jetpack installed
Also, added Jeckpack connected status
* Improved variable name
* Simplified method
Simplified method. "intersection" check was removed
* Tests errors repeared
The method "clear_low_out_of_stock_count_transient" now is static.
* OBW: fix sideloading image test error (https://github.com/woocommerce/woocommerce-admin/pull/3762)
* Release 0.26.0 changes (https://github.com/woocommerce/woocommerce-admin/pull/3753)
* add deactivation hook to Package.php (https://github.com/woocommerce/woocommerce-admin/pull/3770)
* Add active version functions (https://github.com/woocommerce/woocommerce-admin/pull/3772)
* add active version functions to Package.php
Co-authored-by: Joshua T Flowers <joshuatf@gmail.com>
* 0.26.1 changes (https://github.com/woocommerce/woocommerce-admin/pull/3773)
* Customers Report: fix missing report param in search (https://github.com/woocommerce/woocommerce-admin/pull/3778)
* Product titles include encoded entities (https://github.com/woocommerce/woocommerce-admin/pull/3765)
* Stripped HTML from product titles and decoded before displaying them
Stripped html from product titles and entities are decoded before displaying them
* Stripped HTML from product titles and decoded in Stock report
Stripped html from product titles and entities are decoded before displaying them. Now in Stock report
* Added support for HTML tags and encoded entities on product titles
Added support for HTML tags and encoded entities on filtered product list, dropdown menus and tag names.
Also, strip_tags() function was replaced with wp_strip_all_tags() instead.
* strip_tags() function was replaced with wp_strip_all_tags() instead.
* Added control for a variable
Added control for "item->data" before applying wp_strip_all_tags method.
* pre-commit changes
* Test text corrected
* Enable taxes on automatic tax setup (https://github.com/woocommerce/woocommerce-admin/pull/3795)
* Update Country Labeling to Match Core (https://github.com/woocommerce/woocommerce-admin/pull/3790)
* Updated country labeling
Country labeling on Customer Report was updated
* Updated country labeling in other files
* remove .jitm-card notice padding (https://github.com/woocommerce/woocommerce-admin/pull/3814)
* OBW Connect: Fix requesting state (https://github.com/woocommerce/woocommerce-admin/pull/3786)
* OBW Connect: Fix requesting state
* pass down setIsPending
* setIspending propType
* defaultProps
* test
* Revert "test"
This reverts commit e921092b19401931cc1aec8ee84fa53c53b67f36.
* better comparison for redirect
* Fixes Taxes Report search bug and adds initial documentation. (https://github.com/woocommerce/woocommerce-admin/pull/3816)
* Initial Taxes Report documentation.
* Fix taxes endpoint search parameter.
* OBW: Fix retry plugin install button disappearing (https://github.com/woocommerce/woocommerce-admin/pull/3787)
* OBW: Fix retry plugin install btn disappearing
* try suggestion
* Revert "try suggestion"
This reverts commit 5b9386957a501ac3e729e5f16b0ee71c9d792859.
* Fix special character escaping in search. (https://github.com/woocommerce/woocommerce-admin/pull/3826)
* Properly prepare/escape special characters in Product search.
* Properly prepare/escape special characters in Coupon search.
* Properly prepare/escape special characters in Tax code search.
* Fix tracking on migrated options (https://github.com/woocommerce/woocommerce-admin/pull/3828)
* Don't track onboarding toggle if migrating options
* Prevent WC_Tracks from recording event post types not yet registered
* Activity Panels: Remove W Panel (https://github.com/woocommerce/woocommerce-admin/pull/3827)
* Remove W Notif Panel.
* Add back in trapping logic, and hide on non-embed pages.
* add npm run test:zip command (https://github.com/woocommerce/woocommerce-admin/pull/3823)
* add npm run test:zip command
* 1.0.0 release changes🎉 (https://github.com/woocommerce/woocommerce-admin/pull/3831)
* 1.0.0 release changes🎉
* changelog
* 0.26.1 changelog
* Add Report Extension Example: Add default props to ReportFilters (https://github.com/woocommerce/woocommerce-admin/pull/3830)
* ReportFilters component: Add sane defaults
* styles
* add required column
* add left join to sku ordering (https://github.com/woocommerce/woocommerce-admin/pull/3845)
* Deal with lint errors, and improperly merged files
* regenerate package-lock.json
* attempting to resolve package lock conflict.
Co-authored-by: Jeff Stieler <jeff.m.stieler@gmail.com>
Co-authored-by: Joshua T Flowers <joshuatf@gmail.com>
Co-authored-by: Ron Rennick <ron@ronandandrea.com>
Co-authored-by: Fernando <ultimoround@gmail.com>
Co-authored-by: edmundcwm <edmundcwm@gmail.com>
Co-authored-by: Paul Sealock <psealock@gmail.com>
2020-03-10 02:47:39 +00:00
|
|
|
}
|
|
|
|
|
2020-09-13 22:50:02 +00:00
|
|
|
doNotChargeSalesTax() {
|
|
|
|
const { updateOptions } = this.props;
|
|
|
|
|
|
|
|
queueRecordEvent( 'tasklist_tax_connect_store', {
|
|
|
|
connect: false,
|
|
|
|
no_tax: true,
|
|
|
|
} );
|
|
|
|
|
|
|
|
updateOptions( {
|
|
|
|
woocommerce_no_sales_tax: true,
|
|
|
|
woocommerce_calc_taxes: 'no',
|
|
|
|
} ).then( () => {
|
|
|
|
window.location = getAdminLink( 'admin.php?page=wc-admin' );
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
2019-08-26 05:49:04 +00:00
|
|
|
getSteps() {
|
2020-07-01 12:19:15 +00:00
|
|
|
const {
|
|
|
|
generalSettings,
|
|
|
|
isJetpackConnected,
|
|
|
|
isPending,
|
|
|
|
tosAccepted,
|
|
|
|
updateOptions,
|
|
|
|
} = this.props;
|
|
|
|
const { cachedPluginsToActivate } = this.state;
|
2020-12-07 18:44:32 +00:00
|
|
|
let step2Label, agreementText;
|
|
|
|
|
|
|
|
if ( cachedPluginsToActivate.includes( 'woocommerce-services' ) ) {
|
|
|
|
step2Label = __(
|
|
|
|
'Install Jetpack and WooCommerce Tax',
|
|
|
|
'woocommerce-admin'
|
|
|
|
);
|
|
|
|
agreementText = __(
|
|
|
|
'By installing Jetpack and WooCommerce Tax you agree to the {{link}}Terms of Service{{/link}}.',
|
|
|
|
'woocommerce-admin'
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
step2Label = __( 'Install Jetpack', 'woocommerce-admin' );
|
|
|
|
agreementText = __(
|
|
|
|
'By installing Jetpack you agree to the {{link}}Terms of Service{{/link}}.',
|
|
|
|
'woocommerce-admin'
|
|
|
|
);
|
|
|
|
}
|
2019-08-26 05:49:04 +00:00
|
|
|
|
|
|
|
const steps = [
|
|
|
|
{
|
|
|
|
key: 'store_location',
|
|
|
|
label: __( 'Set store location', 'woocommerce-admin' ),
|
2020-02-14 02:23:21 +00:00
|
|
|
description: __(
|
|
|
|
'The address from which your business operates',
|
|
|
|
'woocommerce-admin'
|
|
|
|
),
|
2019-08-26 05:49:04 +00:00
|
|
|
content: (
|
|
|
|
<StoreLocation
|
|
|
|
{ ...this.props }
|
2020-02-14 02:23:21 +00:00
|
|
|
onComplete={ ( values ) => {
|
|
|
|
const country = getCountryCode(
|
|
|
|
values.countryState
|
|
|
|
);
|
|
|
|
recordEvent( 'tasklist_tax_set_location', {
|
|
|
|
country,
|
|
|
|
} );
|
2020-07-01 12:19:15 +00:00
|
|
|
this.completeStep();
|
2019-10-07 20:27:34 +00:00
|
|
|
} }
|
2020-06-23 01:14:57 +00:00
|
|
|
isSettingsRequesting={ false }
|
2019-08-26 05:49:04 +00:00
|
|
|
settings={ generalSettings }
|
|
|
|
/>
|
|
|
|
),
|
|
|
|
visible: true,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
key: 'plugins',
|
2020-12-07 18:44:32 +00:00
|
|
|
label: step2Label,
|
2019-08-26 05:49:04 +00:00
|
|
|
description: __(
|
2020-09-16 21:45:16 +00:00
|
|
|
'Jetpack and WooCommerce Tax allow you to automate sales tax calculations',
|
2019-08-26 05:49:04 +00:00
|
|
|
'woocommerce-admin'
|
|
|
|
),
|
|
|
|
content: (
|
2020-07-01 12:19:15 +00:00
|
|
|
<Fragment>
|
|
|
|
<Plugins
|
2020-08-27 23:55:48 +00:00
|
|
|
onComplete={ ( plugins, response ) => {
|
|
|
|
createNoticesFromResponse( response );
|
2020-07-01 12:19:15 +00:00
|
|
|
recordEvent(
|
|
|
|
'tasklist_tax_install_extensions',
|
|
|
|
{
|
|
|
|
install_extensions: true,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
updateOptions( {
|
|
|
|
woocommerce_setup_jetpack_opted_in: true,
|
|
|
|
} );
|
|
|
|
this.completeStep();
|
|
|
|
} }
|
2020-08-27 23:55:48 +00:00
|
|
|
onError={ ( errors, response ) =>
|
|
|
|
createNoticesFromResponse( response )
|
|
|
|
}
|
2020-07-01 12:19:15 +00:00
|
|
|
onSkip={ () => {
|
|
|
|
queueRecordEvent(
|
|
|
|
'tasklist_tax_install_extensions',
|
|
|
|
{
|
|
|
|
install_extensions: false,
|
|
|
|
}
|
|
|
|
);
|
2020-07-30 16:04:21 +00:00
|
|
|
this.manuallyConfigureTaxRates();
|
2020-07-01 12:19:15 +00:00
|
|
|
} }
|
|
|
|
skipText={ __(
|
2020-12-02 14:27:50 +00:00
|
|
|
'Set up manually',
|
2020-07-01 12:19:15 +00:00
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
2020-09-13 22:50:02 +00:00
|
|
|
onAbort={ () => this.doNotChargeSalesTax() }
|
|
|
|
abortText={ __(
|
2020-12-02 14:27:50 +00:00
|
|
|
"I don't charge sales tax",
|
2020-09-13 22:50:02 +00:00
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
2020-07-01 12:19:15 +00:00
|
|
|
/>
|
|
|
|
{ ! tosAccepted && (
|
|
|
|
<Text
|
|
|
|
variant="caption"
|
|
|
|
className="woocommerce-task__caption"
|
2021-06-28 01:14:59 +00:00
|
|
|
size="12"
|
|
|
|
lineHeight="16px"
|
2020-07-01 12:19:15 +00:00
|
|
|
>
|
|
|
|
{ interpolateComponents( {
|
2020-12-07 18:44:32 +00:00
|
|
|
mixedString: agreementText,
|
2020-07-01 12:19:15 +00:00
|
|
|
components: {
|
|
|
|
link: (
|
|
|
|
<Link
|
|
|
|
href={
|
|
|
|
'https://wordpress.com/tos/'
|
|
|
|
}
|
|
|
|
target="_blank"
|
|
|
|
type="external"
|
|
|
|
/>
|
|
|
|
),
|
|
|
|
},
|
|
|
|
} ) }
|
|
|
|
</Text>
|
2020-02-14 02:23:21 +00:00
|
|
|
) }
|
2020-07-01 12:19:15 +00:00
|
|
|
</Fragment>
|
2019-08-26 05:49:04 +00:00
|
|
|
),
|
2020-07-01 12:19:15 +00:00
|
|
|
visible:
|
|
|
|
( cachedPluginsToActivate.length || ! tosAccepted ) &&
|
|
|
|
this.isTaxJarSupported(),
|
2019-08-26 05:49:04 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
key: 'connect',
|
|
|
|
label: __( 'Connect your store', 'woocommerce-admin' ),
|
|
|
|
description: __(
|
|
|
|
'Connect your store to WordPress.com to enable automated sales tax calculations',
|
|
|
|
'woocommerce-admin'
|
|
|
|
),
|
2019-10-07 20:27:34 +00:00
|
|
|
content: (
|
|
|
|
<Connect
|
|
|
|
{ ...this.props }
|
|
|
|
onConnect={ () => {
|
2020-02-14 02:23:21 +00:00
|
|
|
recordEvent( 'tasklist_tax_connect_store', {
|
|
|
|
connect: true,
|
2020-09-13 22:50:02 +00:00
|
|
|
no_tax: false,
|
2020-02-14 02:23:21 +00:00
|
|
|
} );
|
2019-10-07 20:27:34 +00:00
|
|
|
} }
|
2020-01-22 08:37:05 +00:00
|
|
|
onSkip={ () => {
|
2020-02-14 02:23:21 +00:00
|
|
|
queueRecordEvent( 'tasklist_tax_connect_store', {
|
|
|
|
connect: false,
|
2020-09-13 22:50:02 +00:00
|
|
|
no_tax: false,
|
2020-02-14 02:23:21 +00:00
|
|
|
} );
|
2020-07-01 12:19:15 +00:00
|
|
|
this.manuallyConfigureTaxRates();
|
2020-01-22 08:37:05 +00:00
|
|
|
} }
|
2020-02-14 02:23:21 +00:00
|
|
|
skipText={ __(
|
|
|
|
'Set up tax rates manually',
|
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
2020-09-13 22:50:02 +00:00
|
|
|
onAbort={ () => this.doNotChargeSalesTax() }
|
|
|
|
abortText={ __(
|
|
|
|
"My business doesn't charge sales tax",
|
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
2019-10-07 20:27:34 +00:00
|
|
|
/>
|
|
|
|
),
|
2019-10-16 22:01:56 +00:00
|
|
|
visible: ! isJetpackConnected && this.isTaxJarSupported(),
|
2019-08-26 05:49:04 +00:00
|
|
|
},
|
|
|
|
{
|
|
|
|
key: 'manual_configuration',
|
2019-10-20 21:14:52 +00:00
|
|
|
label: __( 'Configure tax rates', 'woocommerce-admin' ),
|
2019-08-26 05:49:04 +00:00
|
|
|
description: __(
|
|
|
|
'Head over to the tax rate settings screen to configure your tax rates',
|
|
|
|
'woocommerce-admin'
|
|
|
|
),
|
|
|
|
content: (
|
2019-11-06 03:18:02 +00:00
|
|
|
<Fragment>
|
2019-11-07 00:17:46 +00:00
|
|
|
<Button
|
2020-07-01 12:19:15 +00:00
|
|
|
disabled={ isPending }
|
2019-11-07 00:17:46 +00:00
|
|
|
isPrimary
|
|
|
|
isBusy={ isPending }
|
|
|
|
onClick={ () => {
|
|
|
|
recordEvent( 'tasklist_tax_config_rates' );
|
2020-07-01 12:19:15 +00:00
|
|
|
this.manuallyConfigureTaxRates();
|
2019-11-07 00:17:46 +00:00
|
|
|
} }
|
|
|
|
>
|
2019-11-06 03:18:02 +00:00
|
|
|
{ __( 'Configure', 'woocommerce-admin' ) }
|
|
|
|
</Button>
|
|
|
|
<p>
|
2020-02-14 02:23:21 +00:00
|
|
|
{ generalSettings.woocommerce_calc_taxes !==
|
|
|
|
'yes' &&
|
2019-11-06 03:18:02 +00:00
|
|
|
interpolateComponents( {
|
|
|
|
mixedString: __(
|
2020-01-24 02:10:32 +00:00
|
|
|
/*eslint-disable max-len*/
|
|
|
|
'By clicking "Configure" you\'re enabling tax rates and calculations. More info {{link}}here{{/link}}.',
|
|
|
|
/*eslint-enable max-len*/
|
2019-11-06 03:18:02 +00:00
|
|
|
'woocommerce-admin'
|
|
|
|
),
|
|
|
|
components: {
|
|
|
|
link: (
|
|
|
|
<Link
|
2021-08-03 20:56:43 +00:00
|
|
|
href="https://docs.woocommerce.com/document/setting-up-taxes-in-woocommerce/#section-1?utm_medium=product"
|
2019-11-06 03:18:02 +00:00
|
|
|
target="_blank"
|
|
|
|
type="external"
|
|
|
|
/>
|
|
|
|
),
|
|
|
|
},
|
|
|
|
} ) }
|
|
|
|
</p>
|
|
|
|
</Fragment>
|
2019-08-26 05:49:04 +00:00
|
|
|
),
|
2019-10-16 22:01:56 +00:00
|
|
|
visible: ! this.isTaxJarSupported(),
|
2019-08-26 05:49:04 +00:00
|
|
|
},
|
|
|
|
];
|
|
|
|
|
2020-02-14 02:23:21 +00:00
|
|
|
return filter( steps, ( step ) => step.visible );
|
2019-08-26 05:49:04 +00:00
|
|
|
}
|
|
|
|
|
2021-06-01 18:04:21 +00:00
|
|
|
enableAutomatedTax() {
|
|
|
|
recordEvent( 'tasklist_tax_setup_automated_proceed', {
|
|
|
|
setup_automatically: true,
|
|
|
|
} );
|
|
|
|
this.updateAutomatedTax( true );
|
|
|
|
}
|
|
|
|
|
2020-09-13 22:50:02 +00:00
|
|
|
renderSuccessScreen() {
|
|
|
|
const { isPending } = this.props;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="woocommerce-task-tax__success">
|
|
|
|
<span
|
|
|
|
className="woocommerce-task-tax__success-icon"
|
|
|
|
role="img"
|
|
|
|
aria-labelledby="woocommerce-task-tax__success-message"
|
|
|
|
>
|
|
|
|
🎊
|
|
|
|
</span>
|
|
|
|
<H id="woocommerce-task-tax__success-message">
|
|
|
|
{ __( 'Good news!', 'woocommerce-admin' ) }
|
|
|
|
</H>
|
|
|
|
<p>
|
|
|
|
{ interpolateComponents( {
|
|
|
|
mixedString: __(
|
2020-09-16 21:45:16 +00:00
|
|
|
'{{strong}}Jetpack{{/strong}} and {{strong}}WooCommerce Tax{{/strong}} ' +
|
2020-09-13 22:50:02 +00:00
|
|
|
'can automate your sales tax calculations for you.',
|
|
|
|
'woocommerce-admin'
|
|
|
|
),
|
|
|
|
components: {
|
|
|
|
strong: <strong />,
|
|
|
|
},
|
|
|
|
} ) }
|
|
|
|
</p>
|
|
|
|
<Button
|
|
|
|
disabled={ isPending }
|
|
|
|
isPrimary
|
|
|
|
isBusy={ isPending }
|
2021-07-14 19:50:30 +00:00
|
|
|
onClick={ this.enableAutomatedTax.bind( this ) }
|
2020-09-13 22:50:02 +00:00
|
|
|
>
|
|
|
|
{ __( 'Yes please', 'woocommerce-admin' ) }
|
|
|
|
</Button>
|
|
|
|
<Button
|
|
|
|
disabled={ isPending }
|
2020-12-02 14:27:50 +00:00
|
|
|
isTertiary
|
2020-09-13 22:50:02 +00:00
|
|
|
onClick={ () => {
|
|
|
|
recordEvent( 'tasklist_tax_setup_automated_proceed', {
|
|
|
|
setup_automatically: false,
|
|
|
|
} );
|
|
|
|
this.updateAutomatedTax( false );
|
|
|
|
} }
|
|
|
|
>
|
|
|
|
{ __(
|
2020-12-02 14:27:50 +00:00
|
|
|
"No thanks, I'll set up manually",
|
2020-09-13 22:50:02 +00:00
|
|
|
'woocommerce-admin'
|
|
|
|
) }
|
|
|
|
</Button>
|
|
|
|
<Button
|
|
|
|
disabled={ isPending }
|
2020-12-02 14:27:50 +00:00
|
|
|
isTertiary
|
2020-09-13 22:50:02 +00:00
|
|
|
onClick={ () => this.doNotChargeSalesTax() }
|
|
|
|
>
|
2020-12-02 14:27:50 +00:00
|
|
|
{ __( "I don't charge sales tax", 'woocommerce-admin' ) }
|
2020-09-13 22:50:02 +00:00
|
|
|
</Button>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-08-26 05:49:04 +00:00
|
|
|
render() {
|
2020-07-01 12:19:15 +00:00
|
|
|
const { stepIndex } = this.state;
|
|
|
|
const { isPending, isResolving } = this.props;
|
2021-07-13 19:47:36 +00:00
|
|
|
if ( isResolving ) {
|
|
|
|
return <Spinner />;
|
|
|
|
}
|
|
|
|
|
2019-10-16 22:01:56 +00:00
|
|
|
const step = this.getSteps()[ stepIndex ];
|
2019-08-26 05:49:04 +00:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="woocommerce-task-tax">
|
2020-12-21 19:05:29 +00:00
|
|
|
<Card className="woocommerce-task-card">
|
|
|
|
<CardBody>
|
|
|
|
{ this.shouldShowSuccessScreen() ? (
|
|
|
|
this.renderSuccessScreen()
|
|
|
|
) : (
|
|
|
|
<Stepper
|
|
|
|
isPending={ isPending || isResolving }
|
|
|
|
isVertical={ true }
|
|
|
|
currentStep={ step.key }
|
|
|
|
steps={ this.getSteps() }
|
|
|
|
/>
|
|
|
|
) }
|
|
|
|
</CardBody>
|
2019-08-26 05:49:04 +00:00
|
|
|
</Card>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export default compose(
|
2020-03-25 03:20:17 +00:00
|
|
|
withSelect( ( select ) => {
|
2020-07-01 12:19:15 +00:00
|
|
|
const { getSettings, isUpdateSettingsRequesting } = select(
|
|
|
|
SETTINGS_STORE_NAME
|
2020-06-10 23:49:27 +00:00
|
|
|
);
|
2021-07-13 19:47:36 +00:00
|
|
|
const { getOption, isResolving: isOptionResolving } = select(
|
|
|
|
OPTIONS_STORE_NAME
|
|
|
|
);
|
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
const {
|
|
|
|
getActivePlugins,
|
|
|
|
isJetpackConnected,
|
|
|
|
isPluginsRequesting,
|
|
|
|
} = select( PLUGINS_STORE_NAME );
|
2020-08-24 13:20:57 +00:00
|
|
|
const { getTasksStatus } = select( ONBOARDING_STORE_NAME );
|
2020-03-25 03:20:17 +00:00
|
|
|
|
|
|
|
const { general: generalSettings = {} } = getSettings( 'general' );
|
|
|
|
const countryCode = getCountryCode(
|
|
|
|
generalSettings.woocommerce_default_country
|
|
|
|
);
|
2020-07-01 12:19:15 +00:00
|
|
|
const {
|
|
|
|
woocommerce_store_address: storeAddress,
|
|
|
|
woocommerce_default_country: defaultCountry,
|
|
|
|
woocommerce_store_postcode: storePostCode,
|
|
|
|
} = generalSettings;
|
|
|
|
const hasCompleteAddress = Boolean(
|
|
|
|
storeAddress && defaultCountry && storePostCode
|
|
|
|
);
|
2020-03-25 03:20:17 +00:00
|
|
|
|
|
|
|
const { tax: taxSettings = {} } = getSettings( 'tax' );
|
2020-06-10 23:49:27 +00:00
|
|
|
const activePlugins = getActivePlugins();
|
|
|
|
const pluginsToActivate = difference(
|
|
|
|
[ 'jetpack', 'woocommerce-services' ],
|
|
|
|
activePlugins
|
|
|
|
);
|
|
|
|
const connectOptions = getOption( 'wc_connect_options' ) || {};
|
2021-07-13 19:47:36 +00:00
|
|
|
const jetpackOptIn = getOption( 'woocommerce_setup_jetpack_opted_in' );
|
|
|
|
const tosAccepted = connectOptions.tos_accepted || jetpackOptIn === '1';
|
2020-06-10 23:49:27 +00:00
|
|
|
|
2020-08-24 13:20:57 +00:00
|
|
|
const tasksStatus = getTasksStatus();
|
|
|
|
|
2020-07-01 12:19:15 +00:00
|
|
|
const isPending =
|
|
|
|
isUpdateSettingsRequesting( 'tax' ) ||
|
|
|
|
isUpdateSettingsRequesting( 'general' );
|
2021-07-13 19:47:36 +00:00
|
|
|
const isResolving =
|
|
|
|
isPluginsRequesting( 'getJetpackConnectUrl' ) ||
|
|
|
|
isOptionResolving( 'getOption', [
|
|
|
|
'woocommerce_setup_jetpack_opted_in',
|
|
|
|
] ) ||
|
|
|
|
jetpackOptIn === undefined;
|
2020-07-01 12:19:15 +00:00
|
|
|
|
2020-03-25 03:20:17 +00:00
|
|
|
return {
|
|
|
|
countryCode,
|
2020-07-01 12:19:15 +00:00
|
|
|
generalSettings,
|
|
|
|
hasCompleteAddress,
|
2020-06-10 23:49:27 +00:00
|
|
|
isJetpackConnected: isJetpackConnected(),
|
2020-07-01 12:19:15 +00:00
|
|
|
isPending,
|
|
|
|
isResolving,
|
2020-06-10 23:49:27 +00:00
|
|
|
pluginsToActivate,
|
2020-08-24 13:20:57 +00:00
|
|
|
tasksStatus,
|
2020-07-01 12:19:15 +00:00
|
|
|
taxSettings,
|
2020-06-10 23:49:27 +00:00
|
|
|
tosAccepted,
|
2019-08-26 05:49:04 +00:00
|
|
|
};
|
|
|
|
} ),
|
2020-02-14 02:23:21 +00:00
|
|
|
withDispatch( ( dispatch ) => {
|
2019-08-26 05:49:04 +00:00
|
|
|
const { createNotice } = dispatch( 'core/notices' );
|
2020-07-01 12:19:15 +00:00
|
|
|
const { updateOptions } = dispatch( OPTIONS_STORE_NAME );
|
2020-03-25 03:20:17 +00:00
|
|
|
const { updateAndPersistSettingsForGroup } = dispatch(
|
|
|
|
SETTINGS_STORE_NAME
|
|
|
|
);
|
2020-08-24 13:20:57 +00:00
|
|
|
const { invalidateResolutionForStoreSelector } = dispatch(
|
|
|
|
ONBOARDING_STORE_NAME
|
|
|
|
);
|
2019-08-26 05:49:04 +00:00
|
|
|
|
|
|
|
return {
|
2020-08-24 13:20:57 +00:00
|
|
|
clearTaskStatusCache: () =>
|
|
|
|
invalidateResolutionForStoreSelector( 'getTasksStatus' ),
|
2019-08-26 05:49:04 +00:00
|
|
|
createNotice,
|
2020-03-25 03:20:17 +00:00
|
|
|
updateAndPersistSettingsForGroup,
|
2020-07-01 12:19:15 +00:00
|
|
|
updateOptions,
|
2019-08-26 05:49:04 +00:00
|
|
|
};
|
|
|
|
} )
|
|
|
|
)( Tax );
|