Feat: Add tax inclusivity to admin (#8003)
* feat: Add price preference to sdk * feat: Plug tax inclusivity settings for region in UI * feat: Add price inclusivity indicator to variant and shipping price table columns * fix: Rename price title to correct variable name * feat: Add support for tax inclusive crud on region * fix: Use the region endpoint for updating tax inclusivity * chore: Factor out price columns from hooks
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
import { WorkflowTypes } from "@medusajs/types"
|
||||
import { CreateRegionDTO, WorkflowTypes } from "@medusajs/types"
|
||||
import {
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
WorkflowData,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { createRegionsStep } from "../steps"
|
||||
import { setRegionsPaymentProvidersStep } from "../steps/set-regions-payment-providers"
|
||||
import { createPricePreferencesWorkflow } from "../../pricing"
|
||||
|
||||
export const createRegionsWorkflowId = "create-regions"
|
||||
export const createRegionsWorkflow = createWorkflow(
|
||||
@@ -14,18 +16,22 @@ export const createRegionsWorkflow = createWorkflow(
|
||||
input: WorkflowData<WorkflowTypes.RegionWorkflow.CreateRegionsWorkflowInput>
|
||||
): WorkflowData<WorkflowTypes.RegionWorkflow.CreateRegionsWorkflowOutput> => {
|
||||
const data = transform(input, (data) => {
|
||||
const regionIndexToPaymentProviders = data.regions.map(
|
||||
(region, index) => {
|
||||
return {
|
||||
region_index: index,
|
||||
payment_providers: region.payment_providers,
|
||||
}
|
||||
const regionIndexToAdditionalData = data.regions.map((region, index) => {
|
||||
return {
|
||||
region_index: index,
|
||||
payment_providers: region.payment_providers,
|
||||
is_tax_inclusive: region.is_tax_inclusive,
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
return {
|
||||
regions: data.regions,
|
||||
regionIndexToPaymentProviders,
|
||||
regions: data.regions.map((r) => {
|
||||
const resp = { ...r }
|
||||
delete resp.is_tax_inclusive
|
||||
delete resp.payment_providers
|
||||
return resp
|
||||
}),
|
||||
regionIndexToAdditionalData,
|
||||
}
|
||||
})
|
||||
|
||||
@@ -33,11 +39,11 @@ export const createRegionsWorkflow = createWorkflow(
|
||||
|
||||
const normalizedRegionProviderData = transform(
|
||||
{
|
||||
regionIndexToPaymentProviders: data.regionIndexToPaymentProviders,
|
||||
regionIndexToAdditionalData: data.regionIndexToAdditionalData,
|
||||
regions,
|
||||
},
|
||||
(data) => {
|
||||
return data.regionIndexToPaymentProviders.map(
|
||||
return data.regionIndexToAdditionalData.map(
|
||||
({ region_index, payment_providers }) => {
|
||||
return {
|
||||
id: data.regions[region_index].id,
|
||||
@@ -48,9 +54,32 @@ export const createRegionsWorkflow = createWorkflow(
|
||||
}
|
||||
)
|
||||
|
||||
setRegionsPaymentProvidersStep({
|
||||
input: normalizedRegionProviderData,
|
||||
})
|
||||
const normalizedRegionPricePreferencesData = transform(
|
||||
{
|
||||
regionIndexToAdditionalData: data.regionIndexToAdditionalData,
|
||||
regions,
|
||||
},
|
||||
(data) => {
|
||||
return data.regionIndexToAdditionalData.map(
|
||||
({ region_index, is_tax_inclusive }) => {
|
||||
return {
|
||||
attribute: "region_id",
|
||||
value: data.regions[region_index].id,
|
||||
is_tax_inclusive,
|
||||
} as WorkflowTypes.PricingWorkflow.CreatePricePreferencesWorkflowInput
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
parallelize(
|
||||
setRegionsPaymentProvidersStep({
|
||||
input: normalizedRegionProviderData,
|
||||
}),
|
||||
createPricePreferencesWorkflow.runAsStep({
|
||||
input: normalizedRegionPricePreferencesData,
|
||||
})
|
||||
)
|
||||
|
||||
return regions
|
||||
}
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
import { WorkflowTypes } from "@medusajs/types"
|
||||
import {
|
||||
createWorkflow,
|
||||
parallelize,
|
||||
transform,
|
||||
when,
|
||||
WorkflowData,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { updateRegionsStep } from "../steps"
|
||||
import { setRegionsPaymentProvidersStep } from "../steps/set-regions-payment-providers"
|
||||
import { updatePricePreferencesWorkflow } from "../../pricing"
|
||||
|
||||
export const updateRegionsWorkflowId = "update-regions"
|
||||
export const updateRegionsWorkflow = createWorkflow(
|
||||
@@ -13,30 +16,58 @@ export const updateRegionsWorkflow = createWorkflow(
|
||||
(
|
||||
input: WorkflowData<WorkflowTypes.RegionWorkflow.UpdateRegionsWorkflowInput>
|
||||
): WorkflowData<WorkflowTypes.RegionWorkflow.UpdateRegionsWorkflowOutput> => {
|
||||
const data = transform(input, (data) => {
|
||||
const normalizedInput = transform(input, (data) => {
|
||||
const { selector, update } = data
|
||||
const { payment_providers = [], ...rest } = update
|
||||
const { payment_providers = [], is_tax_inclusive, ...rest } = update
|
||||
return {
|
||||
selector,
|
||||
update: rest,
|
||||
payment_providers,
|
||||
is_tax_inclusive,
|
||||
}
|
||||
})
|
||||
|
||||
const regions = updateRegionsStep(data)
|
||||
const regions = updateRegionsStep(normalizedInput)
|
||||
|
||||
const upsertProvidersNormalizedInput = transform(
|
||||
{ data, regions },
|
||||
{ normalizedInput, regions },
|
||||
(data) => {
|
||||
return data.regions.map((region) => {
|
||||
return {
|
||||
id: region.id,
|
||||
payment_providers: data.data.payment_providers,
|
||||
payment_providers: data.normalizedInput.payment_providers,
|
||||
}
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
when({ normalizedInput }, (data) => {
|
||||
return data.normalizedInput.is_tax_inclusive !== undefined
|
||||
}).then(() => {
|
||||
const updatePricePreferencesInput = transform(
|
||||
{ normalizedInput, regions },
|
||||
(data) => {
|
||||
return {
|
||||
selector: {
|
||||
$or: data.regions.map((region) => {
|
||||
return {
|
||||
attribute: "region_id",
|
||||
value: region.id,
|
||||
}
|
||||
}),
|
||||
},
|
||||
update: {
|
||||
is_tax_inclusive: data.normalizedInput.is_tax_inclusive,
|
||||
},
|
||||
} as WorkflowTypes.PricingWorkflow.UpdatePricePreferencesWorkflowInput
|
||||
}
|
||||
)
|
||||
|
||||
updatePricePreferencesWorkflow.runAsStep({
|
||||
input: updatePricePreferencesInput,
|
||||
})
|
||||
})
|
||||
|
||||
setRegionsPaymentProvidersStep({
|
||||
input: upsertProvidersNormalizedInput,
|
||||
})
|
||||
|
||||
@@ -7,6 +7,7 @@ import { InventoryItem } from "./inventory-item"
|
||||
import { Invite } from "./invite"
|
||||
import { Order } from "./order"
|
||||
import { PriceList } from "./price-list"
|
||||
import { PricePreference } from "./price-preference"
|
||||
import { Product } from "./product"
|
||||
import { ProductCategory } from "./product-category"
|
||||
import { ProductCollection } from "./product-collection"
|
||||
@@ -27,6 +28,7 @@ export class Admin {
|
||||
public productCollection: ProductCollection
|
||||
public productCategory: ProductCategory
|
||||
public priceList: PriceList
|
||||
public pricePreference: PricePreference
|
||||
public product: Product
|
||||
public productType: ProductType
|
||||
public upload: Upload
|
||||
@@ -50,6 +52,7 @@ export class Admin {
|
||||
this.productCollection = new ProductCollection(client)
|
||||
this.productCategory = new ProductCategory(client)
|
||||
this.priceList = new PriceList(client)
|
||||
this.pricePreference = new PricePreference(client)
|
||||
this.product = new Product(client)
|
||||
this.productType = new ProductType(client)
|
||||
this.upload = new Upload(client)
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
import { HttpTypes } from "@medusajs/types"
|
||||
import { Client } from "../client"
|
||||
import { ClientHeaders } from "../types"
|
||||
|
||||
export class PricePreference {
|
||||
private client: Client
|
||||
|
||||
constructor(client: Client) {
|
||||
this.client = client
|
||||
}
|
||||
|
||||
async retrieve(
|
||||
id: string,
|
||||
query?: HttpTypes.AdminPricePreferenceParams,
|
||||
headers?: ClientHeaders
|
||||
) {
|
||||
return this.client.fetch<HttpTypes.AdminPricePreferenceResponse>(
|
||||
`/admin/price-preferences/${id}`,
|
||||
{
|
||||
method: "GET",
|
||||
headers,
|
||||
query,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
async list(
|
||||
query?: HttpTypes.AdminPricePreferenceListParams,
|
||||
headers?: ClientHeaders
|
||||
) {
|
||||
return this.client.fetch<HttpTypes.AdminPricePreferenceListResponse>(
|
||||
`/admin/price-preferences`,
|
||||
{
|
||||
method: "GET",
|
||||
headers,
|
||||
query,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
async create(
|
||||
body: HttpTypes.AdminCreatePricePreference,
|
||||
query?: HttpTypes.AdminPricePreferenceParams,
|
||||
headers?: ClientHeaders
|
||||
) {
|
||||
return this.client.fetch<HttpTypes.AdminPricePreferenceResponse>(
|
||||
`/admin/price-preferences`,
|
||||
{
|
||||
method: "POST",
|
||||
headers,
|
||||
body,
|
||||
query,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
async update(
|
||||
id: string,
|
||||
body: HttpTypes.AdminUpdatePricePreference,
|
||||
query?: HttpTypes.AdminPricePreferenceParams,
|
||||
headers?: ClientHeaders
|
||||
) {
|
||||
return this.client.fetch<HttpTypes.AdminPricePreferenceResponse>(
|
||||
`/admin/price-preferences/${id}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers,
|
||||
body,
|
||||
query,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
async delete(id: string, headers?: ClientHeaders) {
|
||||
return this.client.fetch<HttpTypes.AdminPricePreferenceDeleteResponse>(
|
||||
`/admin/price-preferences/${id}`,
|
||||
{
|
||||
method: "DELETE",
|
||||
headers,
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ export interface AdminCreateRegion {
|
||||
currency_code: string
|
||||
countries?: string[]
|
||||
automatic_taxes?: boolean
|
||||
is_tax_inclusive?: boolean
|
||||
payment_providers?: string[]
|
||||
metadata?: Record<string, any>
|
||||
}
|
||||
@@ -24,6 +25,7 @@ export interface AdminUpdateRegion {
|
||||
currency_code?: string
|
||||
countries?: string[]
|
||||
automatic_taxes?: boolean
|
||||
is_tax_inclusive?: boolean
|
||||
payment_providers?: string[]
|
||||
metadata?: Record<string, any>
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
import { CreateRegionDTO, RegionDTO } from "../../region"
|
||||
|
||||
export interface CreateRegionsWorkflowInput {
|
||||
regions: CreateRegionDTO[]
|
||||
regions: (CreateRegionDTO & {
|
||||
payment_providers?: string[]
|
||||
is_tax_inclusive?: boolean
|
||||
})[]
|
||||
}
|
||||
|
||||
export type CreateRegionsWorkflowOutput = RegionDTO[]
|
||||
|
||||
@@ -3,6 +3,7 @@ import { FilterableRegionProps, RegionDTO, UpdateRegionDTO } from "../../region"
|
||||
export interface UpdateRegionsWorkflowInput {
|
||||
selector: FilterableRegionProps
|
||||
update: UpdateRegionDTO & {
|
||||
is_tax_inclusive?: boolean
|
||||
payment_providers?: string[]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user