**What**
Add support for default sales channel
**How**
- Implement a new method in the salesChannelService `createDefault`
- call the new method above in the default loader
**Test**
- Unit tests of the sales channel service method createDefaulta
- Init default loader unit tests
Fixes CORE-316
**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**
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.
**What**
- added `SalesChannel` entity
- added `SalesChannel` repository
- added `SalesChannel` relations to the order, cart and store entities
- added a migrations file
**How**
- introduced entities and relations under a new feature flag "sales-channels"
Fixes CORE-271
Co-authored-by: Philip Korsholm <88927411+pKorsholm@users.noreply.github.com>
* 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
* refactor(medusa): Move some column to a base entity to make it easier to add new models without forgetting some columns
* styles(medusa): Cleanup models
* fix(medusa): typings due to model typings update
* feat(medusa): Cleanup models
* fix(medusa): A model must not return the generateId as part of the entity
* fix(medusa): Plugin integration snapshot
* fix(medusa): Typings from discount-rule-migration scripts
* refactor(medusa): Introduct BaseEntity/SoftDeletableEntity that the entity extends
* styles(medusa): Fix models linting
* test(medusa): Fix integration plugin tests
* feat(medusa): Create generateEntityId standalong function utility and update config to properly supprt ts spec files
* feat(medusa): Update entities to use the new utils to generate and apply the id
* test(medusa): Fix test suits
* feat(medusa): Improve generateEntityId utility
* feat(medusa): Improve exported medusa API
Avoid to always have to import from @medusajs/medusa/dist/*
* feat(medusa): The Model loaders should ignore the index file
* fix(medusa): swap model typo
* fix babel transform-runtime regenerator required for migrations
* add customer group model
* add migration for customer group
* add customer group model export
* add customer group repository
* add customer group service
* add CustomerGroupRepository to "withTransaction" in CustomerGroupService
* remove unnecessary argument to runtime plugin
* service export ordering
* add create customer group endpoint
* add customergroup to route index in admin
* add customer group service
* add customer groups test
* cleanup
* add customers batch initial
* batch creation of customer groups
* integration testing batch creation
* integration tests
* chaining existing customers creation in repo
* remove commented test
* update unit tests to reflect change in idempotent behavior
* ensure that exceptions are expected
* update idempotency behavior
* update formatting
* update format
* Update packages/medusa/src/repositories/customer-group.ts
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* pr feedback
* add In import
* add seperate model dto
* add integration test
* error handling in repository
* remove unused import
* jsdoc
* Update packages/medusa/src/api/routes/admin/customer-groups/add-customers-batch.ts
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* Update packages/medusa/src/api/routes/admin/customer-groups/add-customers-batch.ts
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* pr review comments
* rename variable
* fix: adds atomic phase clean up callback
* fix: call error handler in new transaction block too
* restore
* error handling
* fix: error handler in no isolation case
* add integration test for missing group on update
* final adjustments to test
* fix pr feedback
* cleanup core for pr
* remove console.log
* remove customergroupservice test from customers
* Apply suggestions from code review
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* add end bracket to customer tests
* remove comments
* change model decorator
* fix integration test merge
* onDelete cascade instead of cascade:true
* remove verbose flag
* fix: dedupe type
* add save to customer groups
* customer model delete cascade
* add await to asyncronous save operations
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* update customer service prep
* expand on the update customer groups test case
* add the test case for customer group update
* docs for `groups` prop on update customer endpoint
* refactor, update comments
* expend on integration tests, add customer mock with a group
* refactor to use `customerGroupService.list` method
* update units
* remove `updateCustomerGroups`
* fix rebase conflict
* fix customer seed data, add JoinTable on groups
* group retrieval using the expand param
* fix: use `buildQuery_`
* fix: validation for `groups`, enable `expand`param on update customer endpoint
* fix: remove fileds form the `FilterableCustomerGroupProps`
* fix: spearate body/query validation
Co-authored-by: fPolic <frane@medusajs.com>
* fix babel transform-runtime regenerator required for migrations
* add customer group model
* add migration for customer group
* add customer group model export
* add customer group repository
* add customer group service
* add CustomerGroupRepository to "withTransaction" in CustomerGroupService
* remove unnecessary argument to runtime plugin
* service export ordering
* add create customer group endpoint
* add customergroup to route index in admin
* add customer group service
* add customer groups test
* cleanup
* duplicate error handling
* ducplicate name integration test
* add jsdoc
* customergroup not customer
* pr feedback
* pipeline test
* fix weird merge
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* adds bulk add/remove products to/from collection. Adds endpoint updateProducts on collections that uses these bulk operations
* fix integration tests and test description
* undo change to swap
* made requested changes
* added removeProducts endpoint
* made requested changes
* fix: set collection_id null
* updated collection_id to type string | undefined
* api routes for user management
* add invites and roles to db
* services
* invite repo
* include user in accepting invitation
* include user role in create user
* api password reset
* delete invite
* include email in reset password token
* added metadata as dbawarecolumn
* added events for invite handling and delete functionality
* added invite model to exports
* add default value member and allow null roles
* conditional inclusion of invites in "list-users"
* integration tests for users
* helpers for user testing
* add unauthenticated routes to users
* simplifying create invite
* create users with first and last name, and dev role
* reset password endpoint
* removed token from response
* update user with firstname, lastname and role
* create invite refactor
* test password reset without email in body
* removed redundant router variable
* cleanup
* unit tests
* adjustments
* service tests
* adjustments according to api changes
* fix cart test
* cloned now works
* change name to verified token for the verified token
* add a space
* db aware columns
* fix: timestampz dbaware
* more testing
* add list-invites endpoint
* reset-password error handling
* pr issues adjusted
* fixed test
* add optional to link templates
* move invites to a new endpoint
* migrate invites to own testsuite
* adjust snapshots
* email constraint for invite
* fix integration tests
* addressing pr feedback
* unit tests for extended user api
* linting
* fix integration tests
* fix unit tests
* fix: Addresses breaking change from class-transformer
* fix orders testing
* merge "create-claim" js and ts files
* add out commented tests
* update typescript endpoints to reflect changes made for user management
* converted invites to typescript
* add exports from api endpoints
* remove old js files used for reference
* integration test
* import reflect metadata
* invite service conversion to ts
* removed unused import
* update invite service to match styleguide
* add "expires_at" and "token" to invite table
* update invite service to save tokens and validate expires_at
* fix failing tests
* fix tests after adding token and expires_at to invite
* add expiration to create
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
Co-authored-by: olivermrbl <oliver@mrbltech.com>
* added statuses to product + unit test for updating status
* add update to product model
* added integration tests
* added integration test to validate that updating status to null results in invalid_data error
* removed comment
* update GET /store/products integration test
* fixed unit test with IdMap
* init plugin
* changed dbehaviour on invalid status input on admin list products
* mprices
* updated migration to add status = published on all existing products + added integration test on GET /admin/products when status null is provided
* merged product status
* init ShopifyService
* made requested changes to migration and GET /store/products
* fixed test
* made requested changes to migration
* push progress on source plugin
* add webhook product/create handler
* fixed normalization of variant weight
* removed weight func
* work on events
* finished product hooks (error on new variant needs to be fixed)
* fixed order status
* create fulfillments
* update fulfillment on cancel
* refactored services, handle returns though medusa, helper methods
* order updates
* removed dist
* update gitignore
* emit cahnges to product
* added redis ignore check to prevent update loops
* fixed product-variant.deleted event
* fix more events
* fix test
* fix: order taxes
* added refund with no items
* fixes to hooks
* fixed handling refunds and returns issued from Shopify
* added unit tests to ShopifyProductService and ShopifyCollectionService
* linting fix
* prepared loader PR
* fix: jsDocs
* fix: pager
* fix: build output and babelrc
* chore: linting
* fix: address type
* fix: migration clean up
* fix: update snapshots with ext_ids
Co-authored-by: Sebastian Rindom <skrindom@gmail.com>
* fix: migrate cart service to typescript
* fix: jsdoc inventory service
* fix: revert route unit test change
* fix: typo
* fix: revert integration test packages
* fix: cleanup
* fix: tests
* fix: integration tests
* fix: create props type guards
* fix: move total field to common types
* fix(order): tax_rate column should be numeric, not integer, since region.tax_rate uses numeric
* chore: cleanup
* fix(tax_rate): use REAL database numeric type for tax_rate column on order and region
add: composite unique constraint for shipping_option_id and cart_id
fix: fetchCartOptions to format custom shipping options like normal shipping options
fix: addShippingMethod should throw when custom shipping options is not empty and no optionId corresponds to custom shipping options