agentic-dev 0.2.10 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -9
- package/bin/agentic-dev.mjs +656 -124
- package/lib/scaffold.mjs +109 -6
- package/package.json +1 -1
- package/client/admin/.dockerignore +0 -3
- package/client/admin/.env.example +0 -1
- package/client/admin/Dockerfile +0 -16
- package/client/admin/Dockerfile.dev +0 -18
- package/client/admin/README.md +0 -20
- package/client/admin/index.html +0 -12
- package/client/admin/package.json +0 -41
- package/client/admin/postcss.config.js +0 -6
- package/client/admin/scripts/ui-parity-admin-adapter.mjs +0 -65
- package/client/admin/src/api/alerts.ts +0 -33
- package/client/admin/src/api/client.ts +0 -71
- package/client/admin/src/api/orders.ts +0 -33
- package/client/admin/src/api/support.ts +0 -11
- package/client/admin/src/app/App.tsx +0 -23
- package/client/admin/src/auth/AuthProvider.tsx +0 -122
- package/client/admin/src/auth/ProtectedRoute.tsx +0 -22
- package/client/admin/src/auth/auth-client.ts +0 -38
- package/client/admin/src/auth/types.ts +0 -18
- package/client/admin/src/components/AdminNotificationsDrawer.tsx +0 -162
- package/client/admin/src/components/AdminShell.tsx +0 -76
- package/client/admin/src/components/ui/button.tsx +0 -34
- package/client/admin/src/components/ui/input.tsx +0 -21
- package/client/admin/src/lib/cn.ts +0 -6
- package/client/admin/src/lib/specRouteCatalog.json +0 -30
- package/client/admin/src/lib/specScreens.json +0 -22
- package/client/admin/src/main.tsx +0 -17
- package/client/admin/src/pages/AdminDashboardPage.tsx +0 -171
- package/client/admin/src/pages/AdminLoginPage.tsx +0 -75
- package/client/admin/src/pages/AdminQueuePage.tsx +0 -107
- package/client/admin/src/pages/AdminSupportPage.tsx +0 -61
- package/client/admin/src/styles/globals.css +0 -17
- package/client/admin/src/theme-vars.ts +0 -18
- package/client/admin/src/theme.ts +0 -25
- package/client/admin/src/vite-env.d.ts +0 -1
- package/client/admin/tailwind.config.js +0 -8
- package/client/admin/tsconfig.json +0 -25
- package/client/admin/vite.config.ts +0 -12
- package/client/landing/.dockerignore +0 -3
- package/client/landing/.env.example +0 -1
- package/client/landing/Dockerfile +0 -16
- package/client/landing/Dockerfile.dev +0 -18
- package/client/landing/README.md +0 -18
- package/client/landing/index.html +0 -12
- package/client/landing/package.json +0 -41
- package/client/landing/postcss.config.js +0 -6
- package/client/landing/scripts/ui-parity-landing-adapter.mjs +0 -65
- package/client/landing/src/App.tsx +0 -21
- package/client/landing/src/api/catalog.ts +0 -30
- package/client/landing/src/api/client.ts +0 -30
- package/client/landing/src/auth/AuthProvider.tsx +0 -122
- package/client/landing/src/auth/ProtectedRoute.tsx +0 -22
- package/client/landing/src/auth/auth-client.ts +0 -38
- package/client/landing/src/auth/types.ts +0 -18
- package/client/landing/src/components/LandingShell.tsx +0 -34
- package/client/landing/src/lib/specRouteCatalog.json +0 -23
- package/client/landing/src/lib/specScreens.json +0 -17
- package/client/landing/src/main.tsx +0 -17
- package/client/landing/src/pages/LandingHomePage.tsx +0 -215
- package/client/landing/src/pages/LandingLoginPage.tsx +0 -90
- package/client/landing/src/pages/LandingWorkspacePage.tsx +0 -126
- package/client/landing/src/styles/globals.css +0 -17
- package/client/landing/src/theme-vars.ts +0 -16
- package/client/landing/src/theme.ts +0 -21
- package/client/landing/src/vite-env.d.ts +0 -1
- package/client/landing/tailwind.config.js +0 -8
- package/client/landing/tsconfig.json +0 -25
- package/client/landing/vite.config.ts +0 -12
- package/client/mobile/.dockerignore +0 -2
- package/client/mobile/.env.example +0 -1
- package/client/mobile/Dockerfile +0 -16
- package/client/mobile/Dockerfile.dev +0 -18
- package/client/mobile/README.md +0 -19
- package/client/mobile/index.html +0 -12
- package/client/mobile/package.json +0 -42
- package/client/mobile/postcss.config.js +0 -6
- package/client/mobile/scripts/ui-parity-mobile-adapter.mjs +0 -67
- package/client/mobile/src/App.tsx +0 -1
- package/client/mobile/src/api/client.ts +0 -62
- package/client/mobile/src/api/fulfillment.ts +0 -55
- package/client/mobile/src/api/shipping.ts +0 -56
- package/client/mobile/src/app/App.tsx +0 -23
- package/client/mobile/src/auth/AuthProvider.tsx +0 -122
- package/client/mobile/src/auth/ProtectedRoute.tsx +0 -27
- package/client/mobile/src/auth/auth-client.ts +0 -38
- package/client/mobile/src/auth/types.ts +0 -18
- package/client/mobile/src/components/InShell.tsx +0 -74
- package/client/mobile/src/components/ui/button.tsx +0 -35
- package/client/mobile/src/components/ui/card.tsx +0 -15
- package/client/mobile/src/components/ui/input.tsx +0 -21
- package/client/mobile/src/lib/cn.ts +0 -6
- package/client/mobile/src/lib/specRouteCatalog.json +0 -26
- package/client/mobile/src/lib/specScreens.json +0 -22
- package/client/mobile/src/lib/useSpeechRecognitionInput.ts +0 -271
- package/client/mobile/src/main.tsx +0 -17
- package/client/mobile/src/pages/DashboardPage.tsx +0 -172
- package/client/mobile/src/pages/FulfillmentPage.tsx +0 -138
- package/client/mobile/src/pages/LoginPage.tsx +0 -74
- package/client/mobile/src/pages/ShippingPage.tsx +0 -338
- package/client/mobile/src/styles/globals.css +0 -23
- package/client/mobile/src/theme-vars.ts +0 -16
- package/client/mobile/src/theme.ts +0 -21
- package/client/mobile/src/vite-env.d.ts +0 -1
- package/client/mobile/tailwind.config.js +0 -8
- package/client/mobile/tsconfig.json +0 -25
- package/client/mobile/vite.config.ts +0 -12
- package/client/web/.dockerignore +0 -3
- package/client/web/.env.example +0 -1
- package/client/web/Dockerfile +0 -16
- package/client/web/Dockerfile.dev +0 -18
- package/client/web/README.md +0 -47
- package/client/web/index.html +0 -12
- package/client/web/package.json +0 -42
- package/client/web/postcss.config.js +0 -6
- package/client/web/scripts/ui-parity-web-adapter.mjs +0 -66
- package/client/web/src/api/client.ts +0 -30
- package/client/web/src/api/orders.ts +0 -42
- package/client/web/src/app/App.tsx +0 -21
- package/client/web/src/auth/AuthProvider.tsx +0 -122
- package/client/web/src/auth/ProtectedRoute.tsx +0 -22
- package/client/web/src/auth/auth-client.ts +0 -38
- package/client/web/src/auth/types.ts +0 -18
- package/client/web/src/components/AppShell.tsx +0 -59
- package/client/web/src/components/ui/button.tsx +0 -35
- package/client/web/src/components/ui/card.tsx +0 -7
- package/client/web/src/components/ui/input.tsx +0 -21
- package/client/web/src/lib/cn.ts +0 -6
- package/client/web/src/lib/specRouteCatalog.json +0 -23
- package/client/web/src/lib/specScreens.json +0 -17
- package/client/web/src/main.tsx +0 -17
- package/client/web/src/pages/DashboardPage.tsx +0 -158
- package/client/web/src/pages/LoginPage.tsx +0 -72
- package/client/web/src/pages/OrdersPage.tsx +0 -123
- package/client/web/src/styles/globals.css +0 -17
- package/client/web/src/theme-vars.ts +0 -18
- package/client/web/src/theme.ts +0 -25
- package/client/web/src/vite-env.d.ts +0 -1
- package/client/web/tailwind.config.js +0 -8
- package/client/web/tsconfig.json +0 -25
- package/client/web/vite.config.ts +0 -12
- package/server/.dockerignore +0 -4
- package/server/.env.example +0 -19
- package/server/Dockerfile +0 -22
- package/server/Dockerfile.dev +0 -19
- package/server/README.md +0 -33
- package/server/__init__.py +0 -0
- package/server/api/__init__.py +0 -1
- package/server/api/http/__init__.py +0 -4
- package/server/api/http/app.py +0 -53
- package/server/api/http/router.py +0 -24
- package/server/config.py +0 -52
- package/server/contexts/__init__.py +0 -12
- package/server/contexts/alerts/__init__.py +0 -1
- package/server/contexts/alerts/application/__init__.py +0 -13
- package/server/contexts/alerts/application/services.py +0 -41
- package/server/contexts/alerts/contracts/__init__.py +0 -3
- package/server/contexts/alerts/contracts/http/__init__.py +0 -3
- package/server/contexts/alerts/contracts/http/router.py +0 -37
- package/server/contexts/alerts/domain/__init__.py +0 -15
- package/server/contexts/alerts/domain/models.py +0 -29
- package/server/contexts/alerts/infrastructure/__init__.py +0 -11
- package/server/contexts/alerts/infrastructure/repository.py +0 -41
- package/server/contexts/auth/__init__.py +0 -1
- package/server/contexts/auth/application/__init__.py +0 -3
- package/server/contexts/auth/application/ports.py +0 -10
- package/server/contexts/auth/application/services.py +0 -64
- package/server/contexts/auth/contracts/__init__.py +0 -4
- package/server/contexts/auth/contracts/http/__init__.py +0 -4
- package/server/contexts/auth/contracts/http/dependencies.py +0 -37
- package/server/contexts/auth/contracts/http/router.py +0 -19
- package/server/contexts/auth/domain/__init__.py +0 -3
- package/server/contexts/auth/domain/models.py +0 -24
- package/server/contexts/auth/infrastructure/__init__.py +0 -4
- package/server/contexts/auth/infrastructure/adapters/memory.py +0 -19
- package/server/contexts/auth/infrastructure/adapters/mongodb.py +0 -24
- package/server/contexts/auth/infrastructure/adapters/sqlalchemy.py +0 -74
- package/server/contexts/auth/infrastructure/repository.py +0 -28
- package/server/contexts/catalog/__init__.py +0 -1
- package/server/contexts/catalog/application/__init__.py +0 -28
- package/server/contexts/catalog/application/ports.py +0 -15
- package/server/contexts/catalog/application/services.py +0 -154
- package/server/contexts/catalog/contracts/__init__.py +0 -3
- package/server/contexts/catalog/contracts/http/__init__.py +0 -3
- package/server/contexts/catalog/contracts/http/router.py +0 -60
- package/server/contexts/catalog/domain/__init__.py +0 -45
- package/server/contexts/catalog/domain/models.py +0 -113
- package/server/contexts/catalog/infrastructure/__init__.py +0 -4
- package/server/contexts/catalog/infrastructure/adapters/memory.py +0 -62
- package/server/contexts/catalog/infrastructure/repository.py +0 -8
- package/server/contexts/fulfillment/__init__.py +0 -1
- package/server/contexts/fulfillment/application/__init__.py +0 -13
- package/server/contexts/fulfillment/application/ports.py +0 -20
- package/server/contexts/fulfillment/application/services.py +0 -85
- package/server/contexts/fulfillment/contracts/__init__.py +0 -3
- package/server/contexts/fulfillment/contracts/http/__init__.py +0 -3
- package/server/contexts/fulfillment/contracts/http/router.py +0 -40
- package/server/contexts/fulfillment/domain/__init__.py +0 -25
- package/server/contexts/fulfillment/domain/models.py +0 -73
- package/server/contexts/fulfillment/infrastructure/__init__.py +0 -13
- package/server/contexts/fulfillment/infrastructure/adapters/memory.py +0 -43
- package/server/contexts/fulfillment/infrastructure/repository.py +0 -97
- package/server/contexts/health/__init__.py +0 -1
- package/server/contexts/health/application/__init__.py +0 -3
- package/server/contexts/health/application/services.py +0 -2
- package/server/contexts/health/contracts/__init__.py +0 -3
- package/server/contexts/health/contracts/http/__init__.py +0 -3
- package/server/contexts/health/contracts/http/router.py +0 -10
- package/server/contexts/inventory/__init__.py +0 -1
- package/server/contexts/inventory/application/__init__.py +0 -28
- package/server/contexts/inventory/application/ports.py +0 -11
- package/server/contexts/inventory/application/services.py +0 -214
- package/server/contexts/inventory/contracts/__init__.py +0 -3
- package/server/contexts/inventory/contracts/http/__init__.py +0 -3
- package/server/contexts/inventory/contracts/http/router.py +0 -82
- package/server/contexts/inventory/domain/__init__.py +0 -33
- package/server/contexts/inventory/domain/models.py +0 -93
- package/server/contexts/inventory/infrastructure/__init__.py +0 -4
- package/server/contexts/inventory/infrastructure/adapters/memory.py +0 -24
- package/server/contexts/inventory/infrastructure/repository.py +0 -8
- package/server/contexts/orders/__init__.py +0 -1
- package/server/contexts/orders/application/__init__.py +0 -19
- package/server/contexts/orders/application/services.py +0 -127
- package/server/contexts/orders/contracts/__init__.py +0 -3
- package/server/contexts/orders/contracts/http/__init__.py +0 -3
- package/server/contexts/orders/contracts/http/router.py +0 -82
- package/server/contexts/orders/domain/__init__.py +0 -29
- package/server/contexts/orders/domain/models.py +0 -95
- package/server/contexts/orders/infrastructure/__init__.py +0 -7
- package/server/contexts/orders/infrastructure/repository.py +0 -104
- package/server/contexts/shipping/__init__.py +0 -1
- package/server/contexts/shipping/application/__init__.py +0 -13
- package/server/contexts/shipping/application/services.py +0 -92
- package/server/contexts/shipping/contracts/__init__.py +0 -3
- package/server/contexts/shipping/contracts/http/__init__.py +0 -3
- package/server/contexts/shipping/contracts/http/router.py +0 -40
- package/server/contexts/shipping/domain/__init__.py +0 -19
- package/server/contexts/shipping/domain/models.py +0 -48
- package/server/contexts/shipping/infrastructure/__init__.py +0 -9
- package/server/contexts/shipping/infrastructure/repository.py +0 -50
- package/server/contexts/support/__init__.py +0 -1
- package/server/contexts/support/application/__init__.py +0 -13
- package/server/contexts/support/application/services.py +0 -29
- package/server/contexts/support/contracts/__init__.py +0 -3
- package/server/contexts/support/contracts/http/__init__.py +0 -3
- package/server/contexts/support/contracts/http/router.py +0 -40
- package/server/contexts/support/domain/__init__.py +0 -13
- package/server/contexts/support/domain/models.py +0 -27
- package/server/contexts/support/infrastructure/__init__.py +0 -11
- package/server/contexts/support/infrastructure/repository.py +0 -70
- package/server/contexts/user/__init__.py +0 -1
- package/server/contexts/user/application/__init__.py +0 -3
- package/server/contexts/user/application/ports.py +0 -11
- package/server/contexts/user/application/services.py +0 -44
- package/server/contexts/user/contracts/__init__.py +0 -3
- package/server/contexts/user/contracts/http/__init__.py +0 -3
- package/server/contexts/user/contracts/http/router.py +0 -26
- package/server/contexts/user/domain/__init__.py +0 -3
- package/server/contexts/user/domain/models.py +0 -22
- package/server/contexts/user/infrastructure/__init__.py +0 -3
- package/server/contexts/user/infrastructure/adapters/memory.py +0 -27
- package/server/contexts/user/infrastructure/adapters/mongodb.py +0 -41
- package/server/contexts/user/infrastructure/adapters/sqlalchemy.py +0 -94
- package/server/contexts/user/infrastructure/factory.py +0 -28
- package/server/data/README.md +0 -24
- package/server/data/bootstrap/alerts.json +0 -38
- package/server/data/bootstrap/auth_accounts.json +0 -18
- package/server/data/bootstrap/catalog_products.json +0 -179
- package/server/data/bootstrap/fulfillment_events.json +0 -5
- package/server/data/bootstrap/fulfillment_notes.json +0 -5
- package/server/data/bootstrap/fulfillment_tasks.json +0 -50
- package/server/data/bootstrap/inventory_levels.json +0 -80
- package/server/data/bootstrap/orders.json +0 -62
- package/server/data/bootstrap/shipping_shipments.json +0 -50
- package/server/data/bootstrap/support_faqs.json +0 -26
- package/server/data/bootstrap/users.json +0 -20
- package/server/data/bootstrap_loader.py +0 -15
- package/server/docker-entrypoint.sh +0 -56
- package/server/main.py +0 -3
- package/server/pyproject.toml +0 -36
- package/server/shared/__init__.py +0 -1
- package/server/shared/application/__init__.py +0 -3
- package/server/shared/application/health.py +0 -2
- package/server/shared/infrastructure/__init__.py +0 -10
- package/server/shared/infrastructure/runtime.py +0 -6
- package/server/shared/infrastructure/security.py +0 -33
- package/server/tests/e2e/test_domain_feature_flows.py +0 -483
- package/server/tests/test_health.py +0 -49
- package/server/uv.lock +0 -1169
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
from pymongo import ASCENDING, MongoClient, ReturnDocument
|
|
2
|
-
|
|
3
|
-
from contexts.user.domain import UserRecord, UserSummary
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class MongoUserRepository:
|
|
7
|
-
def __init__(self, mongodb_url: str, database_name: str) -> None:
|
|
8
|
-
self.client = MongoClient(mongodb_url)
|
|
9
|
-
self.collection = self.client[database_name]["users"]
|
|
10
|
-
|
|
11
|
-
def initialize(self) -> None:
|
|
12
|
-
self.collection.create_index([("email", ASCENDING)], unique=True)
|
|
13
|
-
|
|
14
|
-
def seed_users(self, users: list[UserRecord]) -> None:
|
|
15
|
-
for user in users:
|
|
16
|
-
self.collection.update_one({"id": user.id}, {"$set": user.model_dump()}, upsert=True)
|
|
17
|
-
|
|
18
|
-
def get_by_id(self, user_id: str) -> UserRecord | None:
|
|
19
|
-
record = self.collection.find_one({"id": user_id}, {"_id": 0})
|
|
20
|
-
return UserRecord(**record) if record else None
|
|
21
|
-
|
|
22
|
-
def list_summaries(self) -> list[UserSummary]:
|
|
23
|
-
return [
|
|
24
|
-
UserSummary(
|
|
25
|
-
id=record["id"],
|
|
26
|
-
name=record["name"],
|
|
27
|
-
email=record["email"],
|
|
28
|
-
role=record["role"],
|
|
29
|
-
status=record["status"],
|
|
30
|
-
)
|
|
31
|
-
for record in self.collection.find({}, {"_id": 0}).sort("id", ASCENDING)
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
def update_status(self, user_id: str, status: str) -> UserRecord | None:
|
|
35
|
-
record = self.collection.find_one_and_update(
|
|
36
|
-
{"id": user_id},
|
|
37
|
-
{"$set": {"status": status}},
|
|
38
|
-
return_document=ReturnDocument.AFTER,
|
|
39
|
-
projection={"_id": 0},
|
|
40
|
-
)
|
|
41
|
-
return UserRecord(**record) if record else None
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
from sqlalchemy import String, create_engine, select
|
|
2
|
-
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, sessionmaker
|
|
3
|
-
|
|
4
|
-
from contexts.user.domain import UserRecord, UserSummary
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Base(DeclarativeBase):
|
|
8
|
-
pass
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class UserTable(Base):
|
|
12
|
-
__tablename__ = "users"
|
|
13
|
-
|
|
14
|
-
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
15
|
-
name: Mapped[str] = mapped_column(String(128))
|
|
16
|
-
email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
|
|
17
|
-
role: Mapped[str] = mapped_column(String(64))
|
|
18
|
-
status: Mapped[str] = mapped_column(String(32))
|
|
19
|
-
timezone: Mapped[str] = mapped_column(String(64))
|
|
20
|
-
last_login_at: Mapped[str] = mapped_column(String(64))
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class SqlAlchemyUserRepository:
|
|
24
|
-
def __init__(self, database_url: str) -> None:
|
|
25
|
-
self.engine = create_engine(database_url, future=True)
|
|
26
|
-
self.session_factory = sessionmaker(bind=self.engine, expire_on_commit=False)
|
|
27
|
-
|
|
28
|
-
def initialize(self) -> None:
|
|
29
|
-
Base.metadata.create_all(self.engine)
|
|
30
|
-
|
|
31
|
-
def seed_users(self, users: list[UserRecord]) -> None:
|
|
32
|
-
with self.session_factory() as session:
|
|
33
|
-
for user in users:
|
|
34
|
-
existing = session.get(UserTable, user.id)
|
|
35
|
-
if existing is None:
|
|
36
|
-
session.add(UserTable(**user.model_dump()))
|
|
37
|
-
continue
|
|
38
|
-
for field, value in user.model_dump().items():
|
|
39
|
-
setattr(existing, field, value)
|
|
40
|
-
session.commit()
|
|
41
|
-
|
|
42
|
-
def get_by_id(self, user_id: str) -> UserRecord | None:
|
|
43
|
-
with self.session_factory() as session:
|
|
44
|
-
record = session.get(UserTable, user_id)
|
|
45
|
-
return self._to_record(record)
|
|
46
|
-
|
|
47
|
-
def list_summaries(self) -> list[UserSummary]:
|
|
48
|
-
with self.session_factory() as session:
|
|
49
|
-
records = session.scalars(select(UserTable).order_by(UserTable.id)).all()
|
|
50
|
-
return [
|
|
51
|
-
UserSummary(
|
|
52
|
-
id=record.id,
|
|
53
|
-
name=record.name,
|
|
54
|
-
email=record.email,
|
|
55
|
-
role=record.role,
|
|
56
|
-
status=record.status,
|
|
57
|
-
)
|
|
58
|
-
for record in records
|
|
59
|
-
]
|
|
60
|
-
|
|
61
|
-
def update_status(self, user_id: str, status: str) -> UserRecord | None:
|
|
62
|
-
with self.session_factory() as session:
|
|
63
|
-
record = session.get(UserTable, user_id)
|
|
64
|
-
if record is None:
|
|
65
|
-
return None
|
|
66
|
-
record.status = status
|
|
67
|
-
session.commit()
|
|
68
|
-
return self._to_record(record)
|
|
69
|
-
|
|
70
|
-
@staticmethod
|
|
71
|
-
def _to_record(record: UserTable | None) -> UserRecord | None:
|
|
72
|
-
if record is None:
|
|
73
|
-
return None
|
|
74
|
-
return UserRecord(
|
|
75
|
-
id=record.id,
|
|
76
|
-
name=record.name,
|
|
77
|
-
email=record.email,
|
|
78
|
-
role=record.role,
|
|
79
|
-
status=record.status,
|
|
80
|
-
timezone=record.timezone,
|
|
81
|
-
last_login_at=record.last_login_at,
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
class PostgresUserRepository(SqlAlchemyUserRepository):
|
|
86
|
-
pass
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
class MySqlUserRepository(SqlAlchemyUserRepository):
|
|
90
|
-
pass
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
class MariaDbUserRepository(SqlAlchemyUserRepository):
|
|
94
|
-
pass
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
from functools import lru_cache
|
|
2
|
-
from typing import TYPE_CHECKING
|
|
3
|
-
|
|
4
|
-
from config import get_settings
|
|
5
|
-
from contexts.user.infrastructure.adapters.memory import MemoryUserRepository
|
|
6
|
-
from contexts.user.infrastructure.adapters.mongodb import MongoUserRepository
|
|
7
|
-
from contexts.user.infrastructure.adapters.sqlalchemy import (
|
|
8
|
-
MariaDbUserRepository,
|
|
9
|
-
MySqlUserRepository,
|
|
10
|
-
PostgresUserRepository,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
if TYPE_CHECKING:
|
|
14
|
-
from contexts.user.application.ports import UserRepository
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@lru_cache
|
|
18
|
-
def get_user_repository() -> "UserRepository":
|
|
19
|
-
settings = get_settings()
|
|
20
|
-
if settings.database_backend == "postgres":
|
|
21
|
-
return PostgresUserRepository(settings.postgres_url)
|
|
22
|
-
if settings.database_backend == "mysql":
|
|
23
|
-
return MySqlUserRepository(settings.mysql_url)
|
|
24
|
-
if settings.database_backend == "mariadb":
|
|
25
|
-
return MariaDbUserRepository(settings.mariadb_url)
|
|
26
|
-
if settings.database_backend == "mongodb":
|
|
27
|
-
return MongoUserRepository(settings.mongodb_url, settings.mongodb_database)
|
|
28
|
-
return MemoryUserRepository()
|
package/server/data/README.md
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
`data/`는 sample payload, fixture, seed data를 두는 루트다.
|
|
2
|
-
|
|
3
|
-
기본 정책:
|
|
4
|
-
|
|
5
|
-
- domain/application logic는 `contexts/*`에 둔다
|
|
6
|
-
- 재사용 가능한 fixture와 seed payload는 `data/`에 둔다
|
|
7
|
-
- adapter별 local bootstrap 데이터도 이 루트에 둔다
|
|
8
|
-
|
|
9
|
-
현재 canonical bootstrap:
|
|
10
|
-
|
|
11
|
-
- `bootstrap/auth_accounts.json`: auth credential/account bootstrap 원본
|
|
12
|
-
- `bootstrap/users.json`: user profile bootstrap 원본
|
|
13
|
-
- `bootstrap/catalog_products.json`: catalog product 원본
|
|
14
|
-
- `bootstrap/inventory_levels.json`: inventory level 원본
|
|
15
|
-
- `bootstrap/orders.json`: web/admin order surface 원본
|
|
16
|
-
- `bootstrap/fulfillment_tasks.json`: mobile fulfillment board task 원본
|
|
17
|
-
- `bootstrap/fulfillment_events.json`: mobile fulfillment timeline 원본
|
|
18
|
-
- `bootstrap/fulfillment_notes.json`: mobile fulfillment note 원본
|
|
19
|
-
- `bootstrap/support_faqs.json`: admin support surface 원본
|
|
20
|
-
|
|
21
|
-
규칙:
|
|
22
|
-
|
|
23
|
-
- 코드 안에 seed 레코드를 하드코딩하지 않는다
|
|
24
|
-
- memory/postgres/mysql/mariadb/mongodb adapter는 같은 `data/bootstrap/*` 원본을 consume한다
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "alr-1001",
|
|
4
|
-
"source": "orders",
|
|
5
|
-
"title": "예외 검토 대기",
|
|
6
|
-
"message": "주소 검증 보류 거래가 2건 누적되었습니다.",
|
|
7
|
-
"tone": "danger",
|
|
8
|
-
"created_at": "2026-03-14 09:12",
|
|
9
|
-
"read": false
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"id": "alr-1002",
|
|
13
|
-
"source": "shipping",
|
|
14
|
-
"title": "배송 지연 감지",
|
|
15
|
-
"message": "Hanjin 라인에서 지연 shipment가 1건 발생했습니다.",
|
|
16
|
-
"tone": "warning",
|
|
17
|
-
"created_at": "2026-03-14 08:40",
|
|
18
|
-
"read": false
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"id": "alr-1003",
|
|
22
|
-
"source": "inventory",
|
|
23
|
-
"title": "안전재고 임계치",
|
|
24
|
-
"message": "TSJ-BLK-S sku가 safety stock에 근접했습니다.",
|
|
25
|
-
"tone": "neutral",
|
|
26
|
-
"created_at": "2026-03-13 18:30",
|
|
27
|
-
"read": false
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"id": "alr-1004",
|
|
31
|
-
"source": "support",
|
|
32
|
-
"title": "운영 지원 처리 완료",
|
|
33
|
-
"message": "교환 문의 1건이 해결 처리되었습니다.",
|
|
34
|
-
"tone": "neutral",
|
|
35
|
-
"created_at": "2026-03-13 15:10",
|
|
36
|
-
"read": true
|
|
37
|
-
}
|
|
38
|
-
]
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "user-1",
|
|
4
|
-
"name": "Template Admin",
|
|
5
|
-
"email": "admin@example.com",
|
|
6
|
-
"role": "admin",
|
|
7
|
-
"status": "active",
|
|
8
|
-
"password_source": "bootstrap_admin_password"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"id": "user-2",
|
|
12
|
-
"name": "Template Operator",
|
|
13
|
-
"email": "operator@example.com",
|
|
14
|
-
"role": "operator",
|
|
15
|
-
"status": "active",
|
|
16
|
-
"password_source": "bootstrap_operator_password"
|
|
17
|
-
}
|
|
18
|
-
]
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "prd-1001",
|
|
4
|
-
"slug": "trailshell-pack-jacket",
|
|
5
|
-
"name": "TrailShell Pack Jacket",
|
|
6
|
-
"brand": "Northstar Supply",
|
|
7
|
-
"category": "outerwear",
|
|
8
|
-
"status": "active",
|
|
9
|
-
"short_description": "Waterproof shell that packs into its own chest pocket for commute-to-trail days.",
|
|
10
|
-
"description": "TrailShell Pack Jacket pairs a lightweight recycled nylon shell with taped seams, two-way ventilation, and a stowaway hood. The silhouette is cut for layering and ships with durable trims built for wet-weather commuting.",
|
|
11
|
-
"hero_image": {
|
|
12
|
-
"url": "https://images.templates.dev/catalog/trailshell-pack-jacket/hero.jpg",
|
|
13
|
-
"alt": "TrailShell Pack Jacket in basalt black"
|
|
14
|
-
},
|
|
15
|
-
"gallery": [
|
|
16
|
-
{
|
|
17
|
-
"url": "https://images.templates.dev/catalog/trailshell-pack-jacket/detail-1.jpg",
|
|
18
|
-
"alt": "Front zipper and storm flap detail"
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
"url": "https://images.templates.dev/catalog/trailshell-pack-jacket/detail-2.jpg",
|
|
22
|
-
"alt": "Packable pocket configuration"
|
|
23
|
-
}
|
|
24
|
-
],
|
|
25
|
-
"price": {
|
|
26
|
-
"amount": 189000,
|
|
27
|
-
"currency": "KRW"
|
|
28
|
-
},
|
|
29
|
-
"compare_at_price": {
|
|
30
|
-
"amount": 219000,
|
|
31
|
-
"currency": "KRW"
|
|
32
|
-
},
|
|
33
|
-
"tags": ["best-seller", "spring-drop", "unisex"],
|
|
34
|
-
"attributes": [
|
|
35
|
-
{
|
|
36
|
-
"name": "Material",
|
|
37
|
-
"value": "100% recycled nylon shell"
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"name": "Waterproof rating",
|
|
41
|
-
"value": "10,000 mm"
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
"name": "Fit",
|
|
45
|
-
"value": "Regular"
|
|
46
|
-
}
|
|
47
|
-
],
|
|
48
|
-
"variants": [
|
|
49
|
-
{
|
|
50
|
-
"sku": "TSJ-BLK-S",
|
|
51
|
-
"name": "Basalt Black / S",
|
|
52
|
-
"option_values": ["Basalt Black", "S"]
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"sku": "TSJ-BLK-M",
|
|
56
|
-
"name": "Basalt Black / M",
|
|
57
|
-
"option_values": ["Basalt Black", "M"]
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"sku": "TSJ-SGE-M",
|
|
61
|
-
"name": "Sage / M",
|
|
62
|
-
"option_values": ["Sage", "M"]
|
|
63
|
-
}
|
|
64
|
-
],
|
|
65
|
-
"created_at": "2026-03-01T09:00:00+09:00",
|
|
66
|
-
"updated_at": "2026-03-10T11:40:00+09:00"
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
"id": "prd-1002",
|
|
70
|
-
"slug": "commuter-utility-sling",
|
|
71
|
-
"name": "Commuter Utility Sling",
|
|
72
|
-
"brand": "Harbor Line",
|
|
73
|
-
"category": "bags",
|
|
74
|
-
"status": "draft",
|
|
75
|
-
"short_description": "Modular sling bag with removable organizer panels and hidden RFID pocket.",
|
|
76
|
-
"description": "Commuter Utility Sling is designed for phones, keys, wallets, and compact cameras. The draft assortment includes two neutral colorways, a quick-adjust strap, and a wipe-clean coated lining for daily transit use.",
|
|
77
|
-
"hero_image": {
|
|
78
|
-
"url": "https://images.templates.dev/catalog/commuter-utility-sling/hero.jpg",
|
|
79
|
-
"alt": "Commuter Utility Sling in sandstone"
|
|
80
|
-
},
|
|
81
|
-
"gallery": [
|
|
82
|
-
{
|
|
83
|
-
"url": "https://images.templates.dev/catalog/commuter-utility-sling/detail-1.jpg",
|
|
84
|
-
"alt": "Removable organizer panel"
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
"url": "https://images.templates.dev/catalog/commuter-utility-sling/detail-2.jpg",
|
|
88
|
-
"alt": "Rear hidden RFID pocket"
|
|
89
|
-
}
|
|
90
|
-
],
|
|
91
|
-
"price": {
|
|
92
|
-
"amount": 129000,
|
|
93
|
-
"currency": "KRW"
|
|
94
|
-
},
|
|
95
|
-
"compare_at_price": null,
|
|
96
|
-
"tags": ["pre-launch", "travel", "edc"],
|
|
97
|
-
"attributes": [
|
|
98
|
-
{
|
|
99
|
-
"name": "Capacity",
|
|
100
|
-
"value": "6 L"
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"name": "Shell",
|
|
104
|
-
"value": "Waxed recycled polyester"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
"name": "Closure",
|
|
108
|
-
"value": "Magnetic flap + zip"
|
|
109
|
-
}
|
|
110
|
-
],
|
|
111
|
-
"variants": [
|
|
112
|
-
{
|
|
113
|
-
"sku": "CUS-SND-STD",
|
|
114
|
-
"name": "Sandstone / Standard",
|
|
115
|
-
"option_values": ["Sandstone", "Standard"]
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"sku": "CUS-MOS-STD",
|
|
119
|
-
"name": "Moss / Standard",
|
|
120
|
-
"option_values": ["Moss", "Standard"]
|
|
121
|
-
}
|
|
122
|
-
],
|
|
123
|
-
"created_at": "2026-03-05T13:20:00+09:00",
|
|
124
|
-
"updated_at": "2026-03-12T18:15:00+09:00"
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
"id": "prd-1003",
|
|
128
|
-
"slug": "fieldstone-thermal-mug",
|
|
129
|
-
"name": "Fieldstone Thermal Mug",
|
|
130
|
-
"brand": "Fieldhouse",
|
|
131
|
-
"category": "drinkware",
|
|
132
|
-
"status": "archived",
|
|
133
|
-
"short_description": "Double-wall stoneware mug from a retired seasonal capsule with heat-lock lid.",
|
|
134
|
-
"description": "Fieldstone Thermal Mug was released as part of the winter capsule and is now archived. Remaining stock is still serviceable for support workflows, with matte glaze options and a spill-resistant press lid.",
|
|
135
|
-
"hero_image": {
|
|
136
|
-
"url": "https://images.templates.dev/catalog/fieldstone-thermal-mug/hero.jpg",
|
|
137
|
-
"alt": "Fieldstone Thermal Mug in ink blue"
|
|
138
|
-
},
|
|
139
|
-
"gallery": [
|
|
140
|
-
{
|
|
141
|
-
"url": "https://images.templates.dev/catalog/fieldstone-thermal-mug/detail-1.jpg",
|
|
142
|
-
"alt": "Stoneware mug texture detail"
|
|
143
|
-
}
|
|
144
|
-
],
|
|
145
|
-
"price": {
|
|
146
|
-
"amount": 42000,
|
|
147
|
-
"currency": "KRW"
|
|
148
|
-
},
|
|
149
|
-
"compare_at_price": {
|
|
150
|
-
"amount": 52000,
|
|
151
|
-
"currency": "KRW"
|
|
152
|
-
},
|
|
153
|
-
"tags": ["archive", "winter-capsule"],
|
|
154
|
-
"attributes": [
|
|
155
|
-
{
|
|
156
|
-
"name": "Capacity",
|
|
157
|
-
"value": "355 ml"
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
"name": "Finish",
|
|
161
|
-
"value": "Matte glaze"
|
|
162
|
-
}
|
|
163
|
-
],
|
|
164
|
-
"variants": [
|
|
165
|
-
{
|
|
166
|
-
"sku": "FTM-INK-12OZ",
|
|
167
|
-
"name": "Ink Blue / 12 oz",
|
|
168
|
-
"option_values": ["Ink Blue", "12 oz"]
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
"sku": "FTM-SND-12OZ",
|
|
172
|
-
"name": "Sand / 12 oz",
|
|
173
|
-
"option_values": ["Sand", "12 oz"]
|
|
174
|
-
}
|
|
175
|
-
],
|
|
176
|
-
"created_at": "2025-12-15T10:00:00+09:00",
|
|
177
|
-
"updated_at": "2026-02-28T15:05:00+09:00"
|
|
178
|
-
}
|
|
179
|
-
]
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{ "time": "09:05", "title": "Inbound slot capacity refreshed", "tone": "accent" },
|
|
3
|
-
{ "time": "10:15", "title": "Packing queue reprioritized for express orders", "tone": "warning" },
|
|
4
|
-
{ "time": "11:30", "title": "Outbound carrier window confirmed", "tone": "success" }
|
|
5
|
-
]
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{ "id": "fn-1", "note": "Blocked tasks should stay visible in the board header until cleared.", "emphasis": "warning" },
|
|
3
|
-
{ "id": "fn-2", "note": "Outbound handoff needs a tighter SLA once same-day carrier pickup goes live.", "emphasis": "accent" },
|
|
4
|
-
{ "id": "fn-3", "note": "Marketplace orders tend to create exception handling work in address verification.", "emphasis": "neutral" }
|
|
5
|
-
]
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "ft-1",
|
|
4
|
-
"order_id": "ORD-24051",
|
|
5
|
-
"title": "Reserve inbound QA inspection slot",
|
|
6
|
-
"assignee": "Warehouse A",
|
|
7
|
-
"stage": "Inbound",
|
|
8
|
-
"status": "Queued",
|
|
9
|
-
"priority": "Critical",
|
|
10
|
-
"channel": "Marketplace",
|
|
11
|
-
"sla_minutes": 45,
|
|
12
|
-
"units": 1
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"id": "ft-2",
|
|
16
|
-
"order_id": "ORD-24052",
|
|
17
|
-
"title": "Confirm packing checklist",
|
|
18
|
-
"assignee": "Ops Desk",
|
|
19
|
-
"stage": "Packing",
|
|
20
|
-
"status": "In progress",
|
|
21
|
-
"priority": "High",
|
|
22
|
-
"channel": "Direct",
|
|
23
|
-
"sla_minutes": 30,
|
|
24
|
-
"units": 2
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"id": "ft-3",
|
|
28
|
-
"order_id": "ORD-24053",
|
|
29
|
-
"title": "Resolve address verification hold",
|
|
30
|
-
"assignee": "Exception Desk",
|
|
31
|
-
"stage": "Exception",
|
|
32
|
-
"status": "Blocked",
|
|
33
|
-
"priority": "Critical",
|
|
34
|
-
"channel": "Marketplace",
|
|
35
|
-
"sla_minutes": 20,
|
|
36
|
-
"units": 1
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "ft-4",
|
|
40
|
-
"order_id": "ORD-24054",
|
|
41
|
-
"title": "Hand off to outbound carrier",
|
|
42
|
-
"assignee": "Dispatch",
|
|
43
|
-
"stage": "Outbound",
|
|
44
|
-
"status": "Queued",
|
|
45
|
-
"priority": "Normal",
|
|
46
|
-
"channel": "Direct",
|
|
47
|
-
"sla_minutes": 60,
|
|
48
|
-
"units": 1
|
|
49
|
-
}
|
|
50
|
-
]
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"sku": "TSJ-BLK-S",
|
|
4
|
-
"product_id": "prd-1001",
|
|
5
|
-
"product_name": "TrailShell Pack Jacket",
|
|
6
|
-
"variant_name": "Basalt Black / S",
|
|
7
|
-
"location_id": "fc-seoul",
|
|
8
|
-
"location_name": "Seoul Fulfillment Center",
|
|
9
|
-
"on_hand": 18,
|
|
10
|
-
"reserved": 3,
|
|
11
|
-
"safety_stock": 4,
|
|
12
|
-
"reorder_point": 8,
|
|
13
|
-
"updated_at": "2026-03-13T08:30:00+09:00"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"sku": "TSJ-BLK-M",
|
|
17
|
-
"product_id": "prd-1001",
|
|
18
|
-
"product_name": "TrailShell Pack Jacket",
|
|
19
|
-
"variant_name": "Basalt Black / M",
|
|
20
|
-
"location_id": "fc-seoul",
|
|
21
|
-
"location_name": "Seoul Fulfillment Center",
|
|
22
|
-
"on_hand": 6,
|
|
23
|
-
"reserved": 1,
|
|
24
|
-
"safety_stock": 4,
|
|
25
|
-
"reorder_point": 8,
|
|
26
|
-
"updated_at": "2026-03-13T08:32:00+09:00"
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"sku": "TSJ-SGE-M",
|
|
30
|
-
"product_id": "prd-1001",
|
|
31
|
-
"product_name": "TrailShell Pack Jacket",
|
|
32
|
-
"variant_name": "Sage / M",
|
|
33
|
-
"location_id": "fc-busan",
|
|
34
|
-
"location_name": "Busan Overflow Hub",
|
|
35
|
-
"on_hand": 11,
|
|
36
|
-
"reserved": 2,
|
|
37
|
-
"safety_stock": 3,
|
|
38
|
-
"reorder_point": 6,
|
|
39
|
-
"updated_at": "2026-03-13T09:10:00+09:00"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"sku": "CUS-SND-STD",
|
|
43
|
-
"product_id": "prd-1002",
|
|
44
|
-
"product_name": "Commuter Utility Sling",
|
|
45
|
-
"variant_name": "Sandstone / Standard",
|
|
46
|
-
"location_id": "fc-incheon",
|
|
47
|
-
"location_name": "Incheon Launch Warehouse",
|
|
48
|
-
"on_hand": 24,
|
|
49
|
-
"reserved": 0,
|
|
50
|
-
"safety_stock": 5,
|
|
51
|
-
"reorder_point": 10,
|
|
52
|
-
"updated_at": "2026-03-13T07:45:00+09:00"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"sku": "CUS-MOS-STD",
|
|
56
|
-
"product_id": "prd-1002",
|
|
57
|
-
"product_name": "Commuter Utility Sling",
|
|
58
|
-
"variant_name": "Moss / Standard",
|
|
59
|
-
"location_id": "fc-incheon",
|
|
60
|
-
"location_name": "Incheon Launch Warehouse",
|
|
61
|
-
"on_hand": 0,
|
|
62
|
-
"reserved": 0,
|
|
63
|
-
"safety_stock": 5,
|
|
64
|
-
"reorder_point": 10,
|
|
65
|
-
"updated_at": "2026-03-13T07:46:00+09:00"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"sku": "FTM-INK-12OZ",
|
|
69
|
-
"product_id": "prd-1003",
|
|
70
|
-
"product_name": "Fieldstone Thermal Mug",
|
|
71
|
-
"variant_name": "Ink Blue / 12 oz",
|
|
72
|
-
"location_id": "fc-seoul",
|
|
73
|
-
"location_name": "Seoul Fulfillment Center",
|
|
74
|
-
"on_hand": 7,
|
|
75
|
-
"reserved": 2,
|
|
76
|
-
"safety_stock": 3,
|
|
77
|
-
"reorder_point": 6,
|
|
78
|
-
"updated_at": "2026-03-13T06:55:00+09:00"
|
|
79
|
-
}
|
|
80
|
-
]
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"id": "ORD-24051",
|
|
4
|
-
"product_id": "prd-1",
|
|
5
|
-
"product_name": "Operations Console Starter",
|
|
6
|
-
"customer_name": "Seoul Commerce",
|
|
7
|
-
"seller_name": "Do4AI Mobility",
|
|
8
|
-
"status": "Pending",
|
|
9
|
-
"fulfillment_status": "Picking",
|
|
10
|
-
"created_at": "2026.03.14",
|
|
11
|
-
"amount_krw": 840000,
|
|
12
|
-
"risk": "risk",
|
|
13
|
-
"stage": "결제 대기",
|
|
14
|
-
"sla": "45 min",
|
|
15
|
-
"is_new_today": true
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"id": "ORD-24052",
|
|
19
|
-
"product_id": "prd-2",
|
|
20
|
-
"product_name": "Customer App Foundation",
|
|
21
|
-
"customer_name": "Busan Retail Lab",
|
|
22
|
-
"seller_name": "Do4AI Commerce",
|
|
23
|
-
"status": "Paid",
|
|
24
|
-
"fulfillment_status": "Shipping",
|
|
25
|
-
"created_at": "2026.03.14",
|
|
26
|
-
"amount_krw": 620000,
|
|
27
|
-
"risk": "ok",
|
|
28
|
-
"stage": "배송 준비",
|
|
29
|
-
"sla": "70 min",
|
|
30
|
-
"is_new_today": true
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"id": "ORD-24053",
|
|
34
|
-
"product_id": "prd-3",
|
|
35
|
-
"product_name": "Landing Funnel Experiment",
|
|
36
|
-
"customer_name": "Growth Studio",
|
|
37
|
-
"seller_name": "Growth Lab",
|
|
38
|
-
"status": "At risk",
|
|
39
|
-
"fulfillment_status": "Exception",
|
|
40
|
-
"created_at": "2026.03.13",
|
|
41
|
-
"amount_krw": 380000,
|
|
42
|
-
"risk": "risk",
|
|
43
|
-
"stage": "예외 검토",
|
|
44
|
-
"sla": "120 min",
|
|
45
|
-
"is_new_today": false
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"id": "ORD-24054",
|
|
49
|
-
"product_id": "prd-1",
|
|
50
|
-
"product_name": "Operations Console Starter",
|
|
51
|
-
"customer_name": "West Hub Market",
|
|
52
|
-
"seller_name": "Do4AI Mobility",
|
|
53
|
-
"status": "Pending",
|
|
54
|
-
"fulfillment_status": "Queued",
|
|
55
|
-
"created_at": "2026.03.13",
|
|
56
|
-
"amount_krw": 560000,
|
|
57
|
-
"risk": "ok",
|
|
58
|
-
"stage": "출고 대기",
|
|
59
|
-
"sla": "55 min",
|
|
60
|
-
"is_new_today": false
|
|
61
|
-
}
|
|
62
|
-
]
|