Commit Graph
100 Commits
Author SHA1 Message Date
Sebastian RindomandOli Juhl 41dc05d0c9 fix: add address and customer metadata to tax calc context (#10122)
Fixes CMRC-713

**What**
- Ensure that customer and shipping address metadata is passed in the tax calculation context when updating tax lines on a cart.

**Why**
- Gives more flexibility in criteria to evaluate tax rates. 
- https://github.com/medusajs/medusa/discussions/10121
- https://github.com/medusajs/medusa/discussions/10114

Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
2024-11-19 11:42:31 +00:00
Sebastian RindomandShahed Nasser 16e44688ba fix: revise words on docs intro page (#9588)
Co-authored-by: Shahed Nasser <27354907+shahednasser@users.noreply.github.com>
2024-10-21 13:48:25 +00:00
Sebastian Rindom aeaedc8539 fix: add metadata to collection resp (#9514)
**What**
- Adds `metadata` to the default response for `/admin/collection` endpoints.
- Fixes tests to expect correct shape and not use objectContaining.

Fixes CC-551
2024-10-09 15:52:59 +00:00
Sebastian Rindom 0e11e89233 fix: hover states on filters and chip groups (#9511)
* fix: hover states on filters and chip groups

* fix: create FilterChip component
2024-10-09 16:50:47 +02:00
Sebastian Rindom 7ec174309a fix: add metadata to product type resp (#9515) 2024-10-09 16:22:51 +02:00
Sebastian Rindom 852df3f764 fix(medusa,dashboard): don't send price updates for deleted regions/currencies (#9361)
**What**
- Fixes an issue where the admin dashboard would send region prices for deleted regions.
- Also, includes the implementation for `GET /admin/shipping-options/:id` and its corresponding SDK function.

**Why**
- When a region price for a deleted region was sent to the backend it would result in the insert hitting a not null constraint on the currency_code for prices. To avoid this the dashboard should not send region prices for deleted regions. 

**Additional context**
- Prices for deleted regions should ideally not be returned when fetching shipping option prices. However, we don't yet have a mechanism for cleaning up region prices after a region is deleted.

Fixes CC-540
2024-09-30 11:51:55 +00:00
Sebastian Rindom aef6b290b4 fix: force string compare (#9360)
fixes CC-536
2024-09-29 11:48:21 +00:00
Sebastian Rindom 0efbcd2344 fix: validate regions exist for shipping option price update (#9364)
**What**
- Adds a step to `updateShippingOptionsWorkflow` and `createShippingOptionsWorkflow` that validates if the region prices being updated have corresponding regions configured.

**Why**
- Previously, if you tried to send a region price update for a region that had been deleted the backend would throw an error when attempting to insert the region price. The error comes from a not-null constraint in the db, but it is better to validate that the regions we are trying to create prices for exist. 

Fixes CC-542
2024-09-29 09:52:16 +00:00
Sebastian Rindom 17b2868a50 feat(medusa,fulfillment): pass stock location data to fulfillment provider (#9322)
**What**
- Fetches the stock location's details when creating a fulfillment and return fulfillment.
- Passes the data to the fulfillment module, which in turn passes it to the fulfillment provider.

**Why**
- When creating a fulfillment in a multi-location setup the fulfillment provider will need to know where the package is being sent from (so the shipping service can pick it up). 
- Previously, we didn't pass anything but the location id to the fulfillment provider. Because the fulfillment provider can't have a dependency on the stock location module this was not sufficient. 
- This change ensures there is enough data passed to the fulfillment provider to build integrations properly.
2024-09-28 14:01:48 +00:00
Sebastian Rindom ef259b3386 fix: improve error message when config fails to load in build (#7810)
**What**

Throws the original error when failing to load medusa-config during build.

Before it only threw "Failed to load medusa-config". Now it does:
![CleanShot 2024-06-24 at 11  17 46@2x](https://github.com/medusajs/medusa/assets/7554214/11120038-bba8-4d94-a78a-e8556a4e7f75)
2024-06-28 08:10:27 +00:00
Sebastian Rindom e66cf9112d fix(utils): support omitting modules in config (#7563)
* fix: skip module loading if mod: false

* fix: don't include disabled modules in config

* add test

* fix: revert changes to module loading in medusaapp
2024-05-31 15:28:52 +02:00
Sebastian Rindom 2e914a5fc5 fix: ensure that shutdown works in loaderOnly mode (#6893) 2024-04-01 13:56:42 +00:00
Sebastian Rindom 6bf4d40856 chore(medusa-test-utils): create declaration file (#6858)
**What**
- Fixes tsconfig to ensure a declaration file is included in the build.

**Why**
- Ensure tsserver can understand things from medusa-test-utils
- Get rid of "Could not find a declaration file for module" warning in editors.
2024-03-28 10:43:25 +00:00
Sebastian Rindom 0168c819da fix: make module test runner configurable (#6803)
* fix: make module test runner configurable

* Create blue-pumas-promise.md
2024-03-23 10:01:16 +01:00
Sebastian Rindom 4c3389e1e6 fix: revert no server start (#6790)
**Why**
- we want to start a server so we can allow health checks on workers
2024-03-22 14:57:34 +00:00
Sebastian Rindom 56481e683d feat: v2 - add worker mode (#6739)
**What**
- Adds support for starting a Medusa process with a worker mode.
- The worker modes supported are "shared", "worker", "server"
- In "worker" mode, API routes are not registered and modules that need to run workers (e.g., event bus redis) can use the flag to conditionally start workers.
- In "server" mode, API routes are registered and workers are not started.
- In "shared" mode, API routes are registered and workers are started. This is great for development.
2024-03-21 13:08:20 +00:00
Sebastian Rindom 205573f5e3 fix(medusa): migrate with feature flag (#6771)
* fix(medusa): migrate with feature flag

* fix

* Create small-guests-whisper.md
2024-03-21 11:33:40 +01:00
Sebastian Rindom 873c21355c feat: make it possible to use subscribers in v2 (#6731) 2024-03-19 18:31:58 +00:00
Sebastian Rindom 3dd55efd15 Fix/load medusa proj (#6639)
**What**
- Runs loadMedusaV2 when v2 flag is enabled.
- V2 loader loads only project-level framework features. E.g., project APIs, subscribers, jobs, and workflows.
- No plugin support yet.
2024-03-14 12:38:57 +00:00
Sebastian Rindom a838ebae1b fix: make v2 with modules run (#6636) 2024-03-09 15:09:06 +00:00
Sebastian Rindom 908b1dc3a2 fix(tax): improve error handling (#6563) 2024-03-04 17:02:11 +00:00
Sebastian Rindom 555eb41fca feat(tax): add endpoints to manage tax rate rules (#6557)
**What**
Adds endpoints to manage tax rules on a tax rate:
- Create a tax rule: POST /admin/tax-rates/:id/rules 
- Delete a tax rule: DELETE /admin/tax-rates/:id/rules/:rule_id
- Replace tax rules: POST /admin/tax-rates/:id -- with { rules: [...] } in body.

### Noteworthy things I bumped into

**Updating nested relationships**
A TaxRate can have multiple TaxRules and in this PR we enable users to replace all TaxRules associated with a TaxRate in one operation. If working with the module directly this can be done with:

```javascript
taxModuleService.update(rateId, { rules: [{ ... }] })
```

Internally in the `update` function the TaxModule first soft deletes any TaxRules that exist on the TaxRate and then creates new TaxRules for the passed rules ([see test](https://github.com/medusajs/medusa/pull/6557/files#diff-cdcbab80ac7928b80648088ec57a3ab09dddd4409d6afce034f2caff08ee022bR78)).

A challenge arises when doing this in a compensatable way in a workflow. To see this imagine the following:
1. `updateTaxRatesWorkflow` gets the current data for the tax rates to update. This includes the tax rates' rules.
2. `updateTaxRatesWorkflow` calls `taxModuleService.update` with new rules. 
3. Internally, the tax module deletes the rules in 1. and creates new rules.
4. Imagine an error happens in a following step and the workflow has to compensate.
5. The workflow uses the data from 1. and calls upsert. The tax module may correctly update the previous tax rules so they are no longer soft deleted. However, upsert (at least not by default) doesn't delete the new rules that were created in 2.

As illustrated by 5. compensating the update is not pretty. To get around this I instead opted to let the workflow handle setting the rules for a rate that makes the compensation more straightforward to handle. [See workflow here](https://github.com/medusajs/medusa/pull/6557/files#diff-ff19e1f2fa32289aefff90d33c05c154f9605a3c5da6a62683071a1fcaedfd7bR89).

**Using nested workflows**
Initially, I wanted to use the `setTaxRateRulesWorkflow` within the `updateTaxRatesWorkflow`. And this worked great for the invoke phase. However, when I needed to compensate the update workflow (and hence also had to compensate the set rules workflow), I found that the workflow engine no longer had the set rules transaction in memory and therefore could not roll it back. ([This is where I try to rollback](https://github.com/medusajs/medusa/pull/6557/files#diff-ff19e1f2fa32289aefff90d33c05c154f9605a3c5da6a62683071a1fcaedfd7bR62), but the transaction id can't be found).

I therefore opted to copy the steps from the set tax rate rules workflow into the update tax rates workflow; however, once we figure out a good way to ensure we can compensate nested workflows we should move to the nested workflow instead. 

This also made me realize that the current implementation of workflows that use `refreshCartPromotions` may create inconsistencies in case of failures (cc: @riqwan).
2024-03-04 10:30:54 +00:00
Sebastian Rindom c4760dfd5f feat(tax): v2 api tax rates and regions deletes (#6541) 2024-02-29 12:06:11 +00:00
Sebastian Rindom 6279fb3c67 feat(tax): add support for updating tax rates (#6537) 2024-02-29 11:03:18 +00:00
Sebastian Rindom 2407b443f1 feat(tax): add endpoints to create tax regions and tax rates (#6533)
**What**
Adds:
- POST /admin/tax-regions
- POST /admin/tax-rates
- GET /admin/tax-rates
- `createTaxRegionsWorkflow`
- `createTaxRatesWorkflow`
2024-02-29 10:26:21 +00:00
Sebastian Rindom adad66e13f feat(tax): migration file (#6523)
**What**
- Tax Module Migration file.
- Skeleton for API routes and integrations tests for tax API in v2
2024-02-28 14:40:35 +00:00
Sebastian Rindom ca463ae9a9 feat(tax): add support for updating tax rates (#6516)
**What**
- Adds update
2024-02-27 09:55:22 +00:00
Sebastian Rindom d03b72ecdd feat(tax): normalize country and province code (#6513)
**What**
- Ensures that country and province codes are always stored as lower case.
- Ensures that calculation context normalizes input before getting region rates.
2024-02-27 09:12:05 +00:00
Sebastian Rindom 63aea44e06 feat(tax): add tax provider support (#6492)
**What**
- Adds Tax Provider model
- Adds loader to get Tax Provider from module options
- Adds System Tax provider which forwards tax rates as is
2024-02-26 19:29:26 +00:00
Sebastian Rindom d983329481 feat(tax): soft deletes (#6486)
**What**
- Adds soft deletes
2024-02-26 08:34:46 +00:00
Sebastian Rindom 3c5b020c5e feat(tax): singular creates and deletes of regions, rates, rules (#6464)
**What**
- Adds support for creating single rates, regions, rules.
- Adds delete methods.
2024-02-25 21:38:41 +00:00
Sebastian Rindom 598ee6f49c feat(tax): adds getItemTaxLines (#6440)
**What**
- Selects the correct tax line for an item given a calculation context.

**For later PR**
- Consider optimizations. Some thoughts:
  - Even with global sales the number of rates in the DB is not likely to grow beyond ~1000.
  - Can large orders with hundreds of items optimize somehow?
  - Does it make sense to write a custom SQL query to do this?
- Support combined rate.

**Test cases covered**
The selection of tax rates take the following priority:

1. specific product rules - province
2. specific product type rules - province
3. default province rules
4. specific product rules - country
5. specific product type rules - country
6. default country rules

There are test cases for each of them under the following data seed structure:

### **US** 
- **Default Rate**: 2%
- **Sub-Regions**
  - CA 
    - Default Rate: 5%
    - Overrides
      - Reduced rate (for 3 product ids): 3%
      - Reduced rate (for product type): 1%
  - NY 
    - Default rate: 6%
  - FL 
    - Default rate: 4%
- **Overrides**
  - None

### **Denmark** 
- **Default rate:** 25% 
- **Sub-Regions**
  - None
- **Overrides**
  -  None

### **Germany** 
- **Default Rate:** 19%
- **Sub-Regions**
  - None
- **Overrides:**
  - Reduced Rate (for product type) - 7%

### **Canada** 
- **Default rate**: 5%
- **Sub-Regions**
  - QC 
    - Default rate: 2%
    - Overrides:
      - Reduced rate (for same product type as country reduced rate): 1%
  - BC 
    - Default rate: 2%
- **Overrides**
  - Reduced rate (for product id) - 3%
  - Reduced rate (for product type) - 3.5%
2024-02-22 16:28:55 +00:00
Sebastian Rindom 137cc0ebf8 feat(tax): introduce tax override data models (#6422)
**What**
- Adds Tax rules to allow overrides of tax rates for certain products, product types or shipping options.

**Punted to future PR**
- Currently, the creation methods only support bulk operations. A later PR will include support for singular operations, too.
- It should be possible to add products, types, and shipping options to a tax rate after creating it. Add, remove, update will come in a later PR.
2024-02-20 16:50:19 +00:00
Sebastian Rindom 5977a38ef4 feat(tax): Add TaxRegion (#6421)
**What**
- Adds a TaxRegion entity.

**For context: High-level design of the Tax module**
- A TaxRegion scopes tax rates to a geographical place.
- You can define tax regions on two levels: country-level, province-level (this corresponds to state in US contexts)
- Each Tax Region can have a default Tax Rate.
-  [not yet done] - Each Tax Region can also have granularly defined tax rates for different products and shipping rates. For example, California can have a base rate for default products, but a reduced rate for groceries.
- Tax Rates specify if they can be combined with other rates - it's always the lowest level rate that wins.

The above allows a merchant to define their tax settings along the lines of this:

- Denmark (Region)
  - Default rate: 25% (TaxRate)
- Germany (Region)
  - Default rate: 19% (TaxRate)
  - Reduced rate (books): 9% (TaxRate w. rule)
- United States (Region)
  - Default rate: 0% (TaxRate)
  - California: (Region)
    - Default rate: 7.25% (TaxRate)
  - Arkansas: (Region)
    - Default rate: 6.5%
    - Reduced rate (groceries): 0.125% (TaxRate w. rule)

The TaxModule can then receive a list of products and the shipping address to determine what tax rates apply to the line items.
2024-02-18 13:31:50 +00:00
Sebastian Rindom 7df4947ecf feat(tax): tax module scaffolding (#6417)
**What**
- Scaffolds the tax module
2024-02-16 13:24:23 +00:00
Sebastian Rindom a2bf6756ac feat(customer): manage default address selection (#6295)
**What**
- Catches unique constraints on customer_id, is_default_billing/is_default_shipping and reformats
- Adds an step to create and update of addresses that unsets the previous default shipping/billing address if necessary.
  - This creates a behavior in the API where you can always set an address to be default and it will automatically unset the previous one for you.
2024-02-01 12:28:14 +00:00
Sebastian Rindom a28822e0d4 feat(customer): store addresses (#6283)
- GET /customers/me/addresses
- POST /customers/me/addresses
- GET /customers/me/addresses/:address_id
- POST /customers/me/addresses/:address_id
- DELETE /customers/me/addresses/:address_id
2024-02-01 10:11:52 +00:00
Sebastian Rindom 7903a15e0f feat(customer): Add create and retrieve customer from store side (#6267)
**What**
- GET /store/customers/me
- POST /store/customers
- Workflow for customer account creation
- Authentication middleware on customer routes
2024-01-31 11:58:29 +00:00
Sebastian Rindom f41877ef61 feat(customer): add customer group customer management (#6276)
**What**
- GET /admin/customer-groups/:id/customers
- POST /admin/customer-groups/:id/customers/batch
- POST /admin/customer-groups/:id/customers/remove

Workflows
2024-01-31 10:24:22 +00:00
Sebastian Rindom 36ec3ea3aa feat(customer): admin addresses (#6235)
**What**
- GET /admin/customers/:id/addresses
- POST /admin/customers/:id/addresses
- POST /admin/customers/:id/addresses/:address_id
- DELETE /admin/customers/:id/addresses/:address_id
2024-01-31 09:55:07 +00:00
Sebastian Rindom ca0e0631af feat(customer): add customer group management apis (#6233)
**What**
```
POST /admin/customer-groups
POST /admin/customer-groups/:id
GET /admin/customer-groups/:id
DELETE /admin/customer-groups/:id
```

- Workflows
2024-01-30 19:37:53 +00:00
Sebastian Rindom 18ff739a94 feat(customer): admin CRUD endpoints (#6232)
**What**

- GET /customers/:id
- POST /customers/:id
- DELETE /customers/:id
- POST /customers

Including workflows for each.
2024-01-30 11:43:30 +00:00
Sebastian Rindom 87390704be feat(customer): list customer (#6206)
**What**

- GET /admin/customers
- GET /admin/customer-groups
2024-01-29 16:56:39 +00:00
Sebastian Rindom 360c71e39a fix: improve error message on incorrect service export (#6240)
**What**
- Provide a more helpful error message if a user adds a file in `src/services` that doesn't export a service class.

**Why**
If you forget to `export default MyClass` in a custom service you can end up with this error:
![CleanShot 2024-01-27 at 6  24 19](https://github.com/medusajs/medusa/assets/7554214/d3700487-33e0-4629-b2c4-a2a37cb86b3e)

It's almost impossible to know how to recover from this which can be an issue for new users. The new error message informs the user that there is a missing class export and shows which file the error is related to.
2024-01-27 23:28:11 +00:00
Sebastian Rindom 8c6cc82c5d feat(customer): add customer addresses (#6224)
**What**
- adds methods to create update list customer addresses
- removes default_shipping_id and billing id from customer record and moves them to address (better normalization)
2024-01-26 15:35:23 +00:00
Sebastian Rindom 21c1c5ce6c feat(customer): add migration file (#6205) 2024-01-25 16:52:30 +00:00
Sebastian Rindom 4ad761788b chore: move v2 api behind ff (#6213) 2024-01-25 14:39:22 +00:00
Sebastian Rindom e9435a8680 feat(customer): add softdelete/restore (#6203) 2024-01-25 12:38:02 +00:00
Sebastian Rindom f72340ad87 feat(customer): add remove from group, update group (#6158)
Open #6149 again - was merged to wrong base branch.
2024-01-22 13:49:13 +00:00
Sebastian Rindom 76291823f4 feat(customers): add delete and update (#6148)
Depends on #6137 

**What**
- Add update and delete methods to the customer module
2024-01-22 12:31:46 +00:00
Sebastian Rindom a52586880c feat(customer): Introduce customer group (#6137)
**What**
Methods for:
- Bulk create customers
- Bulk and single create of customer groups
- Assigning customer <> group relationships
- listing of customers and customer groups

++ Uses new repository loading mechanism
2024-01-22 11:24:22 +00:00
Sebastian RindomandOli Juhl 1b99c5dc22 fix(medusa): ensure transaction is reused when service calls itself (#6089)
**What**
- ProductService.create calls ProductService.retrieve before returning. This fix ensures that the manager created in the atomicPhase is used when ProductService.retrieve is called.

**Why**
- Without the explicit use of the same manager in the retrieve call, race conditions easily occur if you have concurrent ProductService.create calls. The code below can reproduce the scenario:
```javascript
  const productData = [
    {
      barcode: `1234233423-${Math.random() * 100}`,
      external_id: `1234233423-${Math.random() * 100}`,
      description: "super cool product",
      discountable: true,
      hs_code: "1234213",
      origin_country: "DK",
      title: `Super cool product ${Math.random() * 100}`,
      type: { value: "Eyewear" },
      sales_channels: [{ id: sc.id }],
    },
    {
      barcode: `1234233423-${Math.random() * 100}`,
      external_id: `random-external-id-${Math.random() * 100}`,
      description: "super cool product",
      discountable: true,
      hs_code: "1234213",
      origin_country: "DK",
      title: `Super cool product ${Math.random() * 100}`,
      type: { value: "Eyewear" },
      sales_channels: [{ id: sc.id }],
    },
  ];

  const result = await Promise.all(
    productData.map(async (product) => productService.create(product))
  );
```

**Explaination**

What happens is the following:

- Request 1 calls `ProductService.create`. This in turn calls `atomicPhase` which sets the `ProductService.transactionManager_ = txForReqOne`
- Request 1 creates the product in the DB with `txForReqOne`.
- Request 2 calls `ProductService.create`. This in turn calls `atomicPhase` which sets the `ProductService.transactionManager_ = txForReqTwo`
- Request 1 reaches the end of `ProductService.create` where `this.retrieve` is called. Because the ProductService is a singleton the retrieve call will attempt to use `txForReqTwo` to fetch the product. 
- **Error**: since `txForReqTwo` can't read the data of `txForReqOne`, the product is not found.



Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
2024-01-19 11:03:17 +00:00
Sebastian Rindom 12aa1737d5 feat: customer module skeleton (#6126) 2024-01-19 10:18:54 +00:00
Sebastian Rindom 5cfb662ec0 fix: migrate segment subscribers + typescript support (#5904)
Fixes #6068.

**What**

- Uses new Subscriber API.
- Adds support for typescript files in Segment plugin.
- Adds a peerDependency on @medusajs/medusa for the version that introduced new Subscriber API.
2024-01-18 09:38:33 +00:00
Sebastian Rindom 3a344964e0 chore: Update README.md (#5517)
Remove Circle CI badge
2023-11-02 10:31:45 +00:00
Sebastian Rindom 66413d094e feat: move create inventory to @medusajs/workflows (#5301)
**Why**
- We have some workflow-like flows in @medusajs/medusa. These should be moved over to the workflows package.
- Inventory Items <> Variant currently assume a 1-1 mapping. There should be support for a many-to-many mapping.

**What**
- PR introduces a feature flag for supporting many-to-many mappings for inventory and variants.
- Deletes legacy transaction handler in @medusajs/medusa.
- Adjusts existing createInventoryItems handler to remove dependency on variant data.

**Unkowns**
~~1. Couldn't find an existing test for the CreateProduct workflow. It should be tested that this still works as expected.~~
2. Have removed transaction managers as we should move to handling consistency through orchestration tooling. Are we ready for that?
2023-10-11 18:01:56 +00:00
Sebastian Rindom 4ebcd3af6a chore: adds test for inventory item creation as part of product creation (#5312)
* chore: adds test for inventory item creation as part of product creation

* chore: remove only
2023-10-09 14:24:11 -07:00
Sebastian RindomandOli Juhl c1b8f089e3 fix(medusa-payment-stripe): adds missing undefined check (#5177)
* fix: adds undefined check

* Create twelve-lamps-search.md

---------

Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
2023-09-22 11:02:28 +02:00
Sebastian Rindom 819d27e774 chore(tests): add integration test of canceling order with many items (#4776)
What

- Adds an integration test to check if canceling an order with many items succeeds.

Related to #4763
2023-08-25 09:00:47 +00:00
Sebastian Rindom 9d8f87b03b fix(medusa): ignore region_id update w/o value change (#4751) 2023-08-13 09:26:32 +02:00
Sebastian RindomandShahed Nasser 26e2f81c24 docs: change nextjs starter meta title (#4563)
* fix: nextjs starter meta title

* fix: adjust

---------

Co-authored-by: Shahed Nasser <shahednasser@gmail.com>
2023-07-20 12:23:42 +03:00
Sebastian Rindom a93d5d437c chore: star prompt (#2955)
Shows a prompt to star Medusa after killing the develop server the first time:
![CleanShot 2023-01-06 at 2 30 19](https://user-images.githubusercontent.com/7554214/211022169-8a0d753e-1628-485e-9037-0e817adf5d3f.png)

The prompt will not reappear on subsequent kills.
2023-01-06 15:12:47 +00:00
Sebastian Rindom ae290a395a chore: move to GitHub Discussions for feature requests (#2765) 2022-12-12 13:20:16 +01:00
Sebastian Rindom 198fe78c13 fix: allow passing idempotency key to service layer create (#2701)
**What**

Allow DraftOrders to be created with an IdempotencyKey. 

Note this doesn't implement idempotency for the DraftOrder create endpoint but allows the service layer to ingest the key and store it in the database. This is a preliminary step to being able to support an idempotent API request.
2022-11-30 09:23:59 +00:00
Sebastian Rindom 8069ed5e99 fix(medusa): add support for retrying failed event bus jobs (#2566)
Closes CORE-770
2022-11-09 12:24:26 +00:00
Sebastian Rindom 61da5f3650 fix(medusa-plugin-brightpearl): account for shipping prices being tax inclusive (#2536)
**What**
BP plugin was recording total shipping price based on the shipping_method.price; however, this value may be with or without taxes depending on the tax inclusivity setting. This change ensures that the shipping price is calculated correctly.
2022-11-03 15:22:49 +00:00
Sebastian Rindom 58c7ffdc6e fix(medusa): allow filtering collections by handle (#2482) 2022-10-31 08:51:15 +00:00
Sebastian Rindom a9acb48fc6 feat(stripe): Support automatic payment methods (#2492) 2022-10-30 13:32:00 +01:00
Sebastian Rindom 7fdced0225 chore: Update snapshot this action (#2484) 2022-10-21 14:22:15 +02:00
Sebastian Rindom 196595cb65 fix(medusa-dev-cli): Avoid dev cli auth (#2360) 2022-10-12 09:45:45 +02:00
Sebastian Rindom a908a7716c fix(medusa-payment-klarna, medusa-payment-stripe, medusa-payment-paypal): Totals calculation (#2381) 2022-10-08 10:53:19 +02:00
Sebastian Rindom 46bd861c2a fix(medusa): improve list shipping option (#2383) 2022-10-07 15:43:03 +02:00
Sebastian Rindom 3d255302b0 fix(medusa): Optimize Cart totals calculation (#2372)
**What**

The existing totals calculations are extremely heavy and perform an enormous amount of duplicate work. The changes here remove large parts of the overhead and improves response times for cart endpoints up to 30x.
2022-10-07 08:44:06 +00:00
Sebastian Rindom 7dc8d3a0c9 feat(medusa): PriceList import strategy (#2210) 2022-09-28 15:30:15 +02:00
Sebastian Rindom 7e56935e7a fix(medusa): Remove atomicPhase usage in OAuthService (#2249) 2022-09-26 11:09:45 +02:00
Sebastian RindomandOliver Windall Juhl eb3b02baf4 fix(medusa): cart to be created with a country code (#2197)
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
2022-09-13 19:19:06 +00:00
Sebastian Rindom 37fd48000b fix(medusa): allow address updates on carts w/o existing address (#2176) 2022-09-13 07:51:08 +00:00
Sebastian Rindom e36301ac14 feat(medusa-fulfillment-webshipper): Support personal customs no in orders (#2167)
* feat(webshipper): support personal customs no in orders

* docs: update readme with personal customs number info
2022-09-09 10:30:20 +02:00
Sebastian Rindom af80e0fd2e fix: make prices optional param when updating a variant (#2155)
**Why**
- It should be possible to update variant props without having to send the prices array with every update
2022-09-06 13:49:18 +00:00
9e0cb12120 fix(medusa): remove unique cart on payments to allow canceled payments to exist (#1854)
Fixes CORE-321

Co-authored-by: Adrien de Peretti <25098370+adrien2p@users.noreply.github.com>
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
2022-08-24 14:25:40 +00:00
Sebastian Rindom 15a5b029ae fix(medusa): join tracking links to all fulfillments in admin/orders (#2045)
Fixes https://github.com/medusajs/medusa/issues/2042
2022-08-15 11:23:36 +00:00
Sebastian Rindom 8c283ac3b0 fix(medusa): Calculated price on cart shipping options (#1878) 2022-07-20 11:04:31 +02:00
Sebastian Rindom 0e5f0d8cd6 fix(medusa-payment-klarna): Calculate shipping totals correctly (#1848) 2022-07-18 18:10:58 +02:00
Sebastian Rindom 4dd7fdf61c chore(medusa): Clean up atomicPhase usage (#1850) 2022-07-18 16:04:36 +02:00
Sebastian Rindom c148064b4a fix(medusa): accept array of region ids in order filter (#1851) 2022-07-15 05:41:24 +00:00
Sebastian Rindom c20d720040 fix(medusa-payment-klarna): Fix division by zero on free shipping (#1840) 2022-07-13 09:26:45 +02:00
Sebastian Rindom e539bdc620 chore: Fix CI pipeline (#1839) 2022-07-12 20:14:34 +02:00
Sebastian Rindom 39f2c0c15e fix(medusa): calculates correct taxes and totals on order with gift cards (#1807)
**What**
Since the release of the Tax API the line item totals calculations on orders with gift cards have been wrong. To understand the bug consider the below order:

Region:
- tax_rate: 25%
- gift_cards_taxable: true

Order:
- applied gift card: 1000
- items: 
  - A: unit_price: 1000
  - B: unit_price: 500
- Subtotal: 1500

**Previous calculation method**
1. Determine how much of the gift card is used for each item using `item_total / subtotal * gift_card_amount`:
  - Item A: 1000/1500 * 1000 = 666.67
  - Item B: 500/1500 * 1000 = 333.33
2. Calculate line item totals including taxes using `(unit_price - gift_card) * (1 + tax_rate)`
  - Item A: 1000 - 666.67 = 333.33; vat amount -> 83.33
  - Item B: 500 - 333.33 = 166.67; vat amount -> 41.67
3. Add up the line item totals: order subtotal = 500; vat amount = 125; total = 625

This is all correct at the totals level; but at the line item level we should still use the "original prices" i.e. the line item total for item a should be (1000 * 1.25) = 1250 with a tax amount of 250. 

**New calculation method**
1. Use default totals calculations
  - Item A: subtotal: 1000, tax_total: 250, total: 1250
  - Item B: subtotal: 500, tax_total: 125, total: 625
2. Add up the line item totals: subtotal: 1500, tax_total: 375, total: 1875
3. Reduce total with gift card: subtotal: 1500 - 1000 = 500, tax_total: 375 - 250 = 125, total = 625

Totals can now be forwarded correctly to accounting plugins.

Fixes CORE-310.
2022-07-11 12:18:43 +00:00
Sebastian Rindom dffb86bb58 chore: turbo cleanup (#1828)
- Adds workspace-tools
- Updates .gitignore to include yarn/cache for zero-installs: https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
2022-07-11 08:47:48 +00:00
Sebastian Rindom 4d15e01c3e fix(medusa): calculate orders correctly by adding adjustments (#1812) 2022-07-07 07:35:12 +00:00
Sebastian Rindom e115518dda fix(medusa-payment-klarna): Join adjustments for total calculation (#1791) 2022-07-05 18:00:40 +00:00
Sebastian Rindom f8138afa36 feat(medusa-dev-cli): adds helpers to manage feature flags (#1770)
**Usage**

**Create a new feature flag**
```
$ medusa-dev ff create [name of flag] -d [description of what flag is for]
```
Will put a new file in `packages/medusa/src/loaders/feature-flags/[kebab-cased-flag-name].ts` and fill out the details.

**List feature flags**
```
$ medusa-dev ff list
```
Note: your Medusa repo must be built for the flags to show up

**Delete a feature flag**
```
$ medusa-dev ff delete [name of flag]
```
Will delete a file at `packages/medusa/src/loaders/feature-flags/[kebab-cased-flag-name].ts` if it exists.
2022-07-05 07:33:46 +00:00
Sebastian Rindom 9a14b84e58 fix: introduce listAndCount for gift cards to enable pagination (#1754)
**What**
Proper `listAndCount` implementation for gift cards.
2022-07-04 14:52:55 +00:00
Sebastian Rindom 9b5c2e8c1f hotfix(medusa): add line item adjustments for correct calculation in authorizePayment (#1772) 2022-07-04 14:50:16 +00:00
Sebastian Rindom 1d3032dc67 fix(webshipper): allow cancelling WS orders with error status (#1755) 2022-07-04 07:57:35 +00:00
Sebastian Rindom fee0f88a62 fix: add shipping taxes (#1759)
**What**
Adds taxes to the shipping prices when listing in admin. Allows store operators to see correct prices when processing returns.
2022-07-02 10:35:16 +00:00
Sebastian Rindom f7e300e8ce fix(meilisearch): remove medusa-interfaces dependency (#1751)
Remove `medusa-interfaces` from dependencies. `medusa-interfaces` should only be a peer dependency
2022-07-02 09:09:48 +00:00
Sebastian Rindom c0e18d473c fix(webshipper): only add invoices if invoice generator produces a file (#1749) 2022-07-02 09:05:20 +00:00
Sebastian Rindom c6dc9086cf feat(medusa): Add line item totals to cart totals decoration (#1740) 2022-06-28 12:11:47 +02:00
Sebastian Rindom 2a32609b74 fix(medusa): Normalizes email before saving customer (#1719) 2022-06-27 10:56:12 +02:00