Skip to content

23 product attribute type matching #26

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 19 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 68 additions & 16 deletions .blueprint
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,44 @@ created:
- database/factories/LocationFactory.php
- database/factories/CurrencyFactory.php
- database/factories/MessageFactory.php
- database/migrations/2024_11_27_173745_create_sellers_table.php
- database/migrations/2024_11_27_173746_create_partnerships_table.php
- database/migrations/2024_11_27_173747_create_seller_data_table.php
- database/migrations/2024_11_27_173748_create_categories_table.php
- database/migrations/2024_11_27_173749_create_seller_products_table.php
- database/migrations/2024_11_27_173750_create_seller_product_images_table.php
- database/migrations/2024_11_27_173751_create_seller_variants_table.php
- database/migrations/2024_11_27_173752_create_prices_table.php
- database/migrations/2024_11_27_173753_create_stocks_table.php
- database/migrations/2024_11_27_173754_create_locations_table.php
- database/migrations/2024_11_27_173755_create_currencies_table.php
- database/migrations/2024_11_27_173756_create_messages_table.php
- database/migrations/2024_11_27_173757_create_seller_user_table.php
- database/factories/ProductTypeFactory.php
- database/factories/ProductTypeAttributeFactory.php
- database/factories/ProductTypeAttributeOptionFactory.php
- database/factories/ProductTypeAttributeOptionValueFactory.php
- database/factories/GoldenProductFactory.php
- database/factories/GoldenProductAttributeFactory.php
- database/factories/GoldenProductAttributeValueFactory.php
- database/factories/GoldenProductLocalizedFactory.php
- database/factories/GoldenProductVariantFactory.php
- database/factories/GoldenProductVariantLocalizedFactory.php
- database/factories/GoldenProductImageFactory.php
- database/factories/LocaleFactory.php
- database/migrations/2025_01_15_134250_create_sellers_table.php
- database/migrations/2025_01_15_134251_create_partnerships_table.php
- database/migrations/2025_01_15_134252_create_seller_data_table.php
- database/migrations/2025_01_15_134253_create_categories_table.php
- database/migrations/2025_01_15_134254_create_seller_products_table.php
- database/migrations/2025_01_15_134255_create_seller_product_images_table.php
- database/migrations/2025_01_15_134256_create_seller_variants_table.php
- database/migrations/2025_01_15_134257_create_prices_table.php
- database/migrations/2025_01_15_134258_create_stocks_table.php
- database/migrations/2025_01_15_134259_create_locations_table.php
- database/migrations/2025_01_15_134300_create_currencies_table.php
- database/migrations/2025_01_15_134301_create_messages_table.php
- database/migrations/2025_01_15_134302_create_product_types_table.php
- database/migrations/2025_01_15_134303_create_product_type_attributes_table.php
- database/migrations/2025_01_15_134304_create_product_type_attribute_options_table.php
- database/migrations/2025_01_15_134305_create_product_type_attribute_option_values_table.php
- database/migrations/2025_01_15_134306_create_golden_products_table.php
- database/migrations/2025_01_15_134307_create_golden_product_attributes_table.php
- database/migrations/2025_01_15_134308_create_golden_product_attribute_values_table.php
- database/migrations/2025_01_15_134309_create_golden_product_localizeds_table.php
- database/migrations/2025_01_15_134310_create_golden_product_variants_table.php
- database/migrations/2025_01_15_134311_create_golden_product_variant_localizeds_table.php
- database/migrations/2025_01_15_134312_create_golden_product_images_table.php
- database/migrations/2025_01_15_134313_create_locales_table.php
- database/migrations/2025_01_15_134314_create_seller_user_table.php
- database/migrations/2025_01_15_134315_create_golden_product_attribute_product_type_attribute_option_value_table.php
- app/Models/Seller.php
- app/Models/Partnership.php
- app/Models/SellerData.php
Expand All @@ -36,17 +61,44 @@ created:
- app/Models/Location.php
- app/Models/Currency.php
- app/Models/Message.php
- app/Models/ProductType.php
- app/Models/ProductTypeAttribute.php
- app/Models/ProductTypeAttributeOption.php
- app/Models/ProductTypeAttributeOptionValue.php
- app/Models/GoldenProduct.php
- app/Models/GoldenProductAttribute.php
- app/Models/GoldenProductAttributeValue.php
- app/Models/GoldenProductLocalized.php
- app/Models/GoldenProductVariant.php
- app/Models/GoldenProductVariantLocalized.php
- app/Models/GoldenProductImage.php
- app/Models/Locale.php
models:
Customer: { }
Order: { }
OrderItem: { }
User: { name: string, email: string, is_seller: "boolean default:'0'", email_verified_at: 'datetime nullable', password: string, remember_token: 'string nullable' }
Seller: { name: string, hideProducts: 'boolean default:false', relationships: { belongsToMany: User, hasOne: 'SellerData, Partnership', hasMany: 'SellerProduct, SellerVariant, Price, Stock, Location, Message' } }
Partnership: { seller_id: 'id foreign', status: 'enum:submitted,accepted,rejected,review default:submitted', rejection_reason: 'text nullable', notes: 'text nullable', select_all_products: 'boolean default:false' }
SellerData: { seller_id: 'id foreign', email: 'string nullable', description: 'text nullable', company_name: 'string nullable', address_line1: 'string nullable', address_line2: 'string nullable', city: 'string nullable', state: 'string nullable', postal_code: 'string nullable', country_code: 'string nullable', phone: 'string nullable', vat: 'string nullable', tin: 'string nullable', eori: 'string nullable', iban: 'string nullable', swift_bic: 'string nullable', bank_name: 'string nullable', account_holder_name: 'string nullable', file1: 'string nullable', file2: 'string nullable', file3: 'string nullable' }
Category: { name: string, description: 'text nullable', is_active: 'boolean nullable', parent_id: 'id foreign:categories.id nullable', relationships: { hasMany: SellerProduct } }
SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } }
SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1' }
SellerVariant: { name: string, sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } }
SellerProduct: { name: string, brand: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', category_id: 'id foreign nullable', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', selected: 'boolean default:false', ean: 'string nullable', upc: 'string nullable', gtin_14: 'string nullable', gtin_8: 'string nullable', golden_product_id: 'id foreign nullable', relationships: { hasMany: 'SellerVariant,Price,Stock,SellerProductImage:image' } }
SellerProductImage: { seller_product_id: 'id foreign', seller_variant_id: 'id foreign nullable', image: string, number: 'integer default:1', relationships: { hasOne: GoldenProductImage } }
SellerVariant: { name: 'string nullable', sku: 'string nullable', description: 'text nullable', attributes: 'json nullable', seller_product_id: 'id foreign', seller_id: 'id foreign', status: 'enum:draft,active,delisted default:draft', relationships: { hasMany: 'Price, Stock, SellerProductImage:image' } }
Price: { amount: integer, seller_variant_id: 'id foreign nullable', seller_product_id: 'id foreign', currency_id: 'id foreign' }
Stock: { quantity: integer, reserved: 'integer nullable', safety_stock: 'integer nullable', seller_variant_id: 'id foreign', seller_product_id: 'id foreign', location_id: 'id foreign', seller_id: 'id foreign' }
Location: { name: string, address: string, default_delivery_days: 'integer nullable', seller_id: 'id foreign', relationships: { hasMany: Stock } }
Currency: { code: string, symbol: string, name: 'string nullable', is_default: 'boolean default:false', relationships: { hasMany: Price } }
Message: { content: text, seller_id: 'id foreign', message_id: 'id foreign nullable' }
ProductType: { name: string, relationships: { hasMany: 'ProductTypeAttribute:attribute, GoldenProduct:product' } }
ProductTypeAttribute: { name: string, slug: string, type: 'enum:text,boolean,number,select,url,color', is_translatable: 'boolean default:false', field: 'enum:TextInput,Textarea,Checkbox,Toggle,Select,ColorPicker', required: 'boolean default:false', rank: 'integer default:0', description: 'string nullable', unit: 'string nullable', is_variant_attribute: 'boolean default:false', validators: 'json nullable', product_type_id: 'id foreign', relationships: { hasMany: 'ProductTypeAttributeOption:option' } }
ProductTypeAttributeOption: { product_type_attribute_id: 'id foreign', relationships: { hasMany: 'ProductTypeAttributeOptionValue:value' } }
ProductTypeAttributeOptionValue: { value: string, locale_id: 'id foreign', product_type_attribute_option_id: 'id foreign', relationships: { belongsToMany: GoldenProductAttribute } }
GoldenProduct: { product_type_id: 'id foreign', relationships: { hasMany: 'GoldenProductLocalized:translation, SellerProduct, GoldenProductVariant:variant, GoldenProductAttribute:attribute' } }
GoldenProductAttribute: { product_type_attribute_id: 'id foreign', golden_product_id: 'id foreign', is_option: 'boolean default:false', relationships: { hasMany: 'GoldenProductAttributeValue:value', belongsToMany: ProductTypeAttributeOptionValue } }
GoldenProductAttributeValue: { value: string, golden_product_attribute_id: 'id foreign', locale_id: 'id foreign' }
GoldenProductLocalized: { name: string, description: 'text nullable', attributes: 'json nullable', locale_id: 'id foreign', golden_product_id: 'id foreign' }
GoldenProductVariant: { golden_product_id: 'id foreign', relationships: { hasMany: 'GoldenProductVariantLocalized:translation' } }
GoldenProductVariantLocalized: { name: 'string nullable', description: 'text nullable', attributes: 'json nullable', golden_product_variant_id: 'id foreign', locale_id: 'id foreign' }
GoldenProductImage: { golden_product_id: 'id foreign', image: string, number: 'integer default:1', seller_product_image_id: 'id foreign' }
Locale: { code: string, name: string, default: boolean }
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
specs.md
1 change: 1 addition & 0 deletions .windsurfrules
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The database schema is defined in the "draft.yaml" file. Don't modifiy the models, except of "User". Also use draft.yaml to check the schema.
33 changes: 14 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,29 @@
## About the project
## About the Project

This repository represents a new open source Seller Center. A Seller Center is a SaaS application that runs side-by-side to the online shop and is integrated via API. It allows sellers to manage their products, stocks, and prices, while also processing orders from the shop. If you’ve ever sold something on platforms like Amazon or eBay, you’re already familiar with the concept.
This repository hosts an Open-Source Seller Center (OSSC) for shop owners, who want to turn their existing online shop into a marketplace.

Despite its importance for every marketplace, most existing e-commerce platforms lack this functionality, leaving shop operators to rely on expensive commercial solutions like Mirakl, Marketplacer or Arcadier.
A Seller Center is an application that runs side-by-side to the online shop and is integrated via API. It enables sellers to manage products, inventory, and pricing while processing orders from integrated online shops. If you've sold on platforms like Amazon or eBay, you're already familiar with the concept.

Surprisingly, there’s no strong open-source alternative available...
Despite being essential for marketplaces, most e-commerce platforms lack this functionality, forcing shop operators to rely on costly commercial solutions. Surprisingly, a robust open-source alternative has been missing from the market.

This project is built in public and will be free to use. I will regularly document my progress from the initial implementation to the release of the first version of the project. I aim to share insights, challenges, and solutions along the way, providing a transparent view of building an open-source Seller Center. Stay tuned as I transform this idea into a reality.
This project aims to fill that gap. Built in public and free to use, it will be developed transparently from initial implementation to the first release. I'll regularly document progress, sharing insights, challenges, and solutions to provide a clear view of the development process.

Follow me me on LinkedIn to get updates:
- https://www.linkedin.com/in/fabian-wesner/
Stay updated on the project:
- Follow me on LinkedIn: https://www.linkedin.com/in/fabian-wesner/
- Read project articles: https://blog.ossc.tech/
- Visit the project homepage: https://ossc.tech
- Documentation: https://docs.spryker.com/
- Demo: https://www.ossc.tech/#demo

or find a list of all articles here: https://github.com/FabianWesner/seller-center/wiki
Join us as we transform this idea into a reality and create a valuable open-source solution for the e-commerce community.

## Install Guide

This is a regular Laravel & FilamentPHP application. You can install it like any other Laravel application. Just clone the repository and run `composer run dev`.

URLs
* Shop Operators: http://localhost:8000/operator/ (Use `[email protected]` as username and password)
* Sellers: http://localhost:8000/seller/ (Use `[email protected]` as username and password)

## User Guide

There is no fully blown documentation yet. The idea is pretty simple:

* Shop operators can register and configure their shop (set categories, currencies, product-types, manage their sellers, etc.)
* Sellers can also register and apply for a shop. Then they can import their products, manage stocks, prices, etc.

The Seller Center is a multi-tenant application. Operators and Sellers are tenants. Each tenant has its own data and set of users (with permissions at some point).
* Shop Operators: http://localhost:8000/operator/ (Use `[email protected]` as username and password)
* Sellers: http://localhost:8000/seller/

## Imprint / Impressum

Expand Down
Loading