**What**
- Fix stock locations quantities being shown as `undefined` and `NaN`
- Throw if updates to location levels are made with negative quantities through the api
- Show "allocated" in order summary for partially fulfilled orders
Fixes CORE-1268, CORE-1267, CORE-1265
**What**
- Add check to see if any items is unfulfilled when validating reservations for allocation indicator
- Add reservations refresh to onSuccess when creating a fulfillment to automatically update indicators on fulfillment
Fixes CORE-1248
Co-authored-by: Sebastian Rindom <7554214+srindom@users.noreply.github.com>
**What**
- Adjust reservations correctly according to the following heuristic:
adjustment by addition: (i.e. positive quantity adjustment passed to the adjustment method)
- if a reservation for the line-item in the location exists add quantity to that
- if not create a new reservation
adjustment by subtraction:
- if a reservation with the exact quantity exists, delete it and return
- if a reservation with a greater quantity exists, subtract from it and return
- otherwise delete from reservations until a reservation with greater quantity than the remaining is found and adjust that with the remaining quantity OR there are no more reservations
Fixes CORE-1247
**What**
- Ensure that an inventory level exists for a sales channel (which it will since this is invoked after `confirmInventory` that will validate that stock exists in the sales channel)
Fixes CORE-1225
**What**
- Remove related inventory levels and reservation items when a stock location is removed
**How**
- Add bulk deletion methods for both inventory levels and reservation items to the inventory service api
- invoke both on location removal
Fixes CORE-1232
**What**
- Toggle manage inventory in the inventory management modal
**How**
- Create/update/remove inventory item based on if `manage_inventory` is set and if an inventory item already exists
- Move all stock location updates to when the modal is submitted
- Add create-inventory-item endpoint in the core
Fixes CORE-1196
Co-authored-by: Sebastian Rindom <7554214+srindom@users.noreply.github.com>
**What**
- include location id when creating a fulfillment
- Allow location updates to reservations without passing along quantity
**Why**
- location_id on fulfillment was null after creation
Fixes CORE-1242, CORE-1243
* add location_id to request_return endpoint to support "receive_now" returns
* changeset
* admin request return
* add locations to recieving returns
* cleanup test
* add check for inventory service
**What**
- Fix `delete-reservation` endpoint to allow deletions of reservations
- remove `inventory_item_id` from reservation update call to properly update reservation
- invalidate all list caches to properly update order overview after an allocation has been created
- Fix overlap for long product titles in edit-allocation-modal
Fixes CORE-1214
**What**
- A series of minor fixes for admin-ui relating to managing stock locations:
- make "create location" `primary`
- add delete prompt when cancelling creation if information has been input
- avoid clipping focus border on country select when creating a stock location
- allow removals of sales channels from stock locations
Fixes CORE-1191, CORE-1192, CORE-1190, CORE-1189
* use pvi service method instead of inventory service method to get quantity for sales channel
* save a few invocations
* rename quantity
* omit || 0
* add changeset
* extract method for retrieving variant inventory quantity
* update pr with feedback
* update create fulfillment flow
* move transaction service creation close to where it's used
* integration tests
* fix feedback
* use transformBody
* add changeset
* only add ordering select if not already selected
* add integration test
* add changeset
* remove catch
* linting and suggestion from adrien
* add sales channel filtering when listing locations
* add changeset
* add exception back into sales channel location service
---------
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
* reserve quantities when creating a draft order
* only adjust quantities if a location is provided on a fulfillment
* initial fix for fulfillments
* changeset
* add check for inventory service when cancelling fulfillment
* update test-request with module loaders
* remove unused variable
* remove duplicate key from oas
* changeset
* initial suggestion for adding locations to fulfillments
* update migration
* re-add functionality for removing entire reservations
* fix tests
* add location when adjusting reserved inventory of a line_item
* add changest
* handle multiple reservations for a product in the same channel
* confirm inventory in stock location previous to creating the fulfillment
* fix tests after updating create-fulfillment to confirm inventory prior to creating fulfillment
* remove bugged code
* initial validation
* initial changes for review
* chekcpoint
* update validate inventory at location
* redo some unwanted changes
* typing
* update snapshots
* redo change for eslintrc
* add eslint disable
* re-order methods in interface
* assert no_notification
* iterate one time less
* add test for validation of correct inventory adjustments in case of no inventory service installation
* ensure correct adjustments for order cancellations
* remove comment
* fix tests
* fix but with coalescing
* remove location id from confirm inventory
* don't throw when adjusting reservations for a line item without reservations
* move reservation adjustments to the api
* add multiplication for updating a reservation quantity
* move inventory adjustments from the service layer to the api
* delete reservation if quantity is adjusted to 0
* rename updateReservation to updateReservationItem
* update dto fields
* reference the correct fields
* update with transaction
* add jsdocs
* force boolean cast
* context-ize cancel and create fulfillment transaction methods
* undo notification cast
* update with changes
* refactor withTransaction to variable
* use maps
* fix service mocks
* add mw feature flag
* add services
* add types
* add module interfaces
* add interface export
* add models for mw
* to be ammended
* remove featureflag
* use correct count
* update cart completion strategy
* swap service conversion
* update return service
* update order service
* update claim service
* add exception to claim item
* update cart service
* add indicies
* add changeset
* nullable changes in store
* store model update
* fix unit tests
* remove old inventory service
* format integration test
* update snapshots
* remove old inventory service tests
* update snapshots
* remove old code
* option updates
* naming
* add jsdoc to pv inventory service
* rename class variables
* pr feedback
* rename option to context
* if(variant_id) instead of if(typeof varia...)
* update tests
* add jsdoc
* go for custom
* update code for readability
* add support for customer first- and last names and phone
* test for querying customer first_name, last_name and phone
* add customer as prop for querying orders
* polishing before pr
* changeset
**What**
update module definitions in `ConfigModule` to support the following module configuration methods:
- none: defaults are loaded
- boolean `inventoryService: true|false`, if true the defaults are loaded, false throws if it's a required module, if the module is not required it's not loaded
- string: `inventoryService: "..."`, treats the string as a path to the overriding module, (we dont handle the case where a string is given but the module is not overridable, we just load the default in that case)
- `ConfigurableModuleDeclaration = { resolve?: string, options?: Record } `, like plugins, options can be used to pass configs to the main service of the module, if not defined no options are passed. Resolve is like string, if defined it's used to look for a custom module, otherwise the default is loaded.
Testing:
- Added unit tests for:
- `loaders/modules.ts`
- `loaders/module-definitions/index.ts`
Fixes CORE-932
* test subtotals on draft order operations
* fetch cart with subtotals when doing draft order operations
* write test for updating discounts seeing changes in totals
* formatting
* udpate test
* force taxes
* missing select
* add import
* rm force_taxes
* use correct authentication middleware
* remove guard from get-session since it's guarded by middleware doing the same check
* Add integration tests
* Create lazy-swans-agree.md
Co-authored-by: olivermrbl <oliver@mrbltech.com>
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
**What**
- Ensure that swaps can be created for orders with discounts in tax inclusive regions
**How**
- Retrieve cart with discounts and region before creating adjustments for line items in cart.
- In `discountService.calculateDiscountForLineItem` we used the method `totalsService.getLineItemTotals` if a line-item is tax inclusive. This method uses some fields from the cart that aren't populated on cart creation (such a `items` which caused the original error).
**Testing**
- add integration test `swaps > tax inclusive > "Complete swap flow with discount"` that creates a swap in the following environment
- tax inclusive region
- tax inclusive line item to be swapped
- fixed type discount with allocation: total
Fixes CORE-748
**What**
- validate shipping option requirements including tax if the shipping option is tax inclusive
**Testing**
- " given a cart with total above min-threshold and subtotal below min-threshold shipping option with tax inclusive pricing is available and can be applied"
- "given a cart with total above max-threshold and subtotal below max-threshold shipping option with tax inclusive pricing is not available"
Fixes CORE-752
**What**
- add error handling when loading project config
**How**
- Add error parameter to get-medusa-config result if an error was thrown (previously we returned an empty config)
- Discussion:
A different, but equally valid approach could be just throwing the error rather than creating an error parameter. This causes a more ugly output without warnings and changes the api a bit but it would force error handling. wdyt?
**Why**
- cli would fail with database error `databaseMissingDriverError` if config was invalid, ex. missing a comma
### example (missing `,` in config)
**old output**
```
Successfully compiled 2 files with Babel (143ms).
[medusa-config] ⚠️ redis_url not found. A fake redis instance will be used.
[medusa-config] ⚠️ database_type not found. fallback to default sqlite.
info: Using flag MEDUSA_FF_ORDER_EDITING from environment with value true
info: Using flag MEDUSA_FF_SALES_CHANNELS from environment with value true
info: Using flag MEDUSA_FF_TAX_INCLUSIVE_PRICING from environment with value true
info: Using fake Redis
✔ Models initialized – 13ms
✔ Plugin models initialized – 0ms
✔ Repositories initialized – 17ms
⠋ Initializing databaseMissingDriverError: Wrong driver: "undefined" given. Supported drivers are: "aurora-data-api", "aurora-data-api-pg", "better-sqlite3", "capacitor", "cockroachdb", "cordova", "expo", "mariadb", "mongodb", "mssql", "mysql", "nativescript", "oracle", "postgres", "react-native", "sap", "sqlite", "sqljs".
```
**new output**
```
Successfully compiled 2 files with Babel (185ms).
error: Error in loading config: Unexpected identifier
error: /Users/phko/projects/community/my-medusa-store/medusa-config.js:129
plugins,
^^^^^^^
SyntaxError: Unexpected identifier
at compileFunction (<anonymous>)
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1033:15)
at Module._compile (node:internal/modules/cjs/loader:1069:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:1005:19)
at require (node:internal/modules/cjs/helpers:102:18)
at getConfigFile (/Users/phko/projects/community/my-medusa-store/node_modules/medusa-core-utils/dist/get-config-file.js:26:20)
```
* wait for update to order edit model
* delete line item tests
* create remove method for lineitem with tax lines
* add remove item tests
* split delete allocation tests into two: more and less than total
* remove unused import
* cleanup
* add medusa-js and react endpoints
* pr feedback fixes
* linting
* remove unused relation from query
* remove removed-event and unused imports
* add await
**What**
- include the default sales channel in the result of `get-store` if featureflag is set
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
**What**
- Add `transformQuery` to get endpoints for product, order and cart
- ensure that the default relations (when getting a singular entity) includes sales channels when enabled
- Add `EmptyQueryParams` class in common types to prevent query parameters while using `transformQuery`
- update product-, order- and cartFactory to include sales channels if provided
- remove `packages/medusa/src/controllers/products/admin-list-products.ts`
**Testing**
- expands sales channel for single order
- expands sales channels for orders with expand parameter
- returns single product with sales channel
- expands sales channels for products with expand parameter
- returns cart with sales channel for single cart
Fixes CORE-293
Co-authored-by: Sebastian Rindom <7554214+srindom@users.noreply.github.com>
Co-authored-by: Adrien de Peretti <25098370+adrien2p@users.noreply.github.com>
**What**
- Add `feature_flags` string array to store response
**Why**
- to provide conditional ui in admin corresponding to enabled features
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
**What**
- Add tag to indicate methods are part of an experimental feature under development
**Why**
- To notify developers because we cant support featureflags in the same way from the client side libraries.
* feat: add feature flag loading in projects
* fix: make feature flag consume itself
* fix: rename container registration to featureFlagRouter
* fix: refactor
* behavioral feature flags
* add environment to server
* limit "useTemplateDb" to non feature flagged migrations
* filter migrations and entities according to those which are enabled in the environment
* run only migrations that are enabled when running 'medusa migrations run'
* add logging to the featureflag loader
* initial implementation of featureFlagEntity
* column descriptors
* initial startServerWithEnv (to be refactored)
* update commands
* final touches
* update loaders to fix unit tests
* enable all batch job tests
* update seed method
* add api test capabilities
* revert batch job test
* revert formatting changes
* pr feedback
* pr feedback
* remove unused imports
* rename feature flag decorators
* pr feedback
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
**What**
- convert fulfillment service to typescript
I have removed the `transform` parameter from the getFulfillmentItems_ function since it was not being used with different methods, only `validateFulfillmentLineItem_`. Instead I have just reference the validateFulfillmentLineItem_ function directly.
We have the same pattern across some different methods, is there a specific reason or just for future proofing?
* centralize common knowledge and checks for list-customers in repository
* convert customer service to typescript
* fix typing error in update-address
* add await
* add atomic phases
* update types for customerservice
* update api and model types
* pr feedback
* remove Promise.resolve
* typing of buildQuery
* remove atomic phase from private method
* add initial testing files
* prepare for github
* remove empty files
* remove ids
* set user and password for postgres service
* remove node setup
* remove unused flag from yarn install
* correct medusajs package
* arguments for create-medusa project
* make create command into one line
* working directory update
* update workflow
* add build
* run scripts from medusa-cli
* move scripts to medusa-cli
* add install
* get server output
* rename build to install
* update login script to get feedback
* add arguments to login script
* add argument for directory to get-product
* pass cli-test to get-products script
* add wait command
* fix waiting
* update wait-for-server
* echo status
* update start testing
* refactor code into test-action
* add list config for testing
* include shell
* update get-products script
* test to see if action fails when given wrong input
* use custom action for testing devleopment server and extend waiting for server to spin up
* update actions
* remove cache version
* yarn and build in cli-test directory
* update core
* update working directories
* test working dir after cd up
* update
* fix directories
* update directories
* use setup server action
* invoke correct action
* test
* update cli action
* remove action
* test with medusa-dev
* remove medusa dev for now
* test
* include medusa-dev
* remove invalid medusa new command
* try moving project one dir up
* add silent to curl output from live server wait
* update seed data directory
* test
* remove sub workflow
* add matrix and postgres override for medusa-config
* fix matrix syntax
* add database url to job
* update yaml
* cli should fail on logging in
* create setup server action
* update test-server
* update scripts
* run scripts directory instead of cli scripts
* make directories current
* remove tests from cli
* run only on pr
* update name
* remove batch job model (for testing purposes)
* remove ls from test server action
* get content from develop
* undo changes to generate reference
* remove comments from scripts
* test failing command
* redo migrate command failing
* move scripts into interation tests
* Apply suggestions from code review
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>
Co-authored-by: Oliver Windall Juhl <59018053+olivermrbl@users.noreply.github.com>