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:
Stevche Radevski
2024-07-09 09:26:20 +02:00
committed by GitHub
parent 4b391fc3cf
commit cbf2fcd559
34 changed files with 920 additions and 433 deletions
@@ -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,
})
+3
View File
@@ -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[]
}
}