Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-quickzu
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-quickzu` to build the library.

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-quickzu",
"version": "0.0.10"
}

View File

@@ -0,0 +1,57 @@
{
"name": "pieces-quickzu",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/quickzu/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/quickzu",
"tsConfig": "packages/pieces/community/quickzu/tsconfig.lib.json",
"packageJson": "packages/pieces/community/quickzu/package.json",
"main": "packages/pieces/community/quickzu/src/index.ts",
"assets": [
"packages/pieces/community/quickzu/*.md",
{
"input": "packages/pieces/community/quickzu/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"publish": {
"command": "node tools/scripts/publish.mjs pieces-quickzu {args.ver} {args.tag}",
"dependsOn": [
"build"
]
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/quickzu",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
},
"tags": []
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Streamline Bestellung von whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Melde dich in dein Quickzu-Dashboard ein.\n2. Gehe zu **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Kopiere **API Token** in die Zwischenablage und füge sie ein.",
"Add Product": "Neuer Artikel",
"Update Product": "Produkt aktualisieren",
"Delete Product": "Produkt löschen",
"List Products": "Produkte auflisten",
"Create Category": "Kategorie erstellen",
"Update Category": "Kategorie aktualisieren",
"Delete Category": "Kategorie löschen",
"List Categories": "Kategorien auflisten",
"Get Order Details": "Bestelldetails abrufen",
"List Orders": "Listenbestellungen",
"List Live Orders": "Live Bestellungen auflisten",
"Update Order Status": "Bestellstatus aktualisieren",
"Create Product Discount": "Produkt-Rabatt erstellen",
"Create Promo/Coupon Code": "Promo/Gutscheincode erstellen",
"Update Business Time": "Geschäftszeit aktualisieren",
"Adds new product to store.": "Fügt neue Artikel zum Laden hinzu.",
"Updates an existing product in store.": "Aktualisiert ein vorhandenes Produkt im Shop.",
"Deletes an existing product from store.": "Löscht ein vorhandenes Produkt aus dem Shop.",
"Retrieves all or single product details from store.": "Ruft alle oder einzelne Produktdetails aus dem Shop ab.",
"Creates a new category in store.": "Erstellt eine neue Kategorie im Shop.",
"Updates an existing category in store.": "Aktualisiert eine existierende Kategorie im Shop.",
"Deletes an existing category from store.": "Löscht eine existierende Kategorie aus dem Shop.",
"Retrieves all categories from store.": "Ruft alle Kategorien aus dem Shop ab.",
"Retrieves order details from store.": "Liefert Bestelldetails aus dem Shop.",
"Retrieves orders of store.": "Ruft Bestellungen des Shops ab.",
"Retrieves live orders of store.": "Ermittelt Live-Bestellungen im Shop.",
"Updates status of order in store.": "Status der Bestellung im Shop.",
"Creates a new discount for category or product level.": "Erstellt einen neuen Rabatt für Kategorie oder Produktebene.",
"Creates a new promo code for category or product level.": "Erstellt einen neuen Promo-Code für Kategorie oder Produktebene.",
"Updates business hours.": "Aktualisiert Geschäftszeiten.",
"Name": "Name",
"Description": "Beschreibung",
"Category": "Kategorie",
"MRP Price": "MRP-Preis",
"Selling Price": "Verkaufspreis",
"Unit": "Einheit",
"Unit Value": "Einheitswert",
"Availability": "Verfügbarkeit",
"Exclude Tax": "Steuer ausschließen",
"Enable Variants": "Varianten aktivieren",
"Status": "Status",
"Product": "Produkt",
"Product name that need to be search.": "Produktname, der gesucht werden muss.",
"Category Name": "Kategoriename",
"Category Status": "Kategorie-Status",
"Search Term": "Suchbegriff",
"Order": "Sortierung",
"Current page number": "Aktuelle Seitennummer",
"Number of orders per page": "Anzahl der Bestellungen pro Seite",
"Number of live orders that need to be fetched per order status": "Anzahl der Live-Bestellungen, die pro Bestellstatus abgerufen werden müssen",
"Order Status": "Bestellstatus",
"Promotion / Discount Title": "Promotions- / Rabatttitel",
"Valid From": "Gültig ab",
"Valid To": "Gültig bis",
"Filter": "Filtern",
"Select Option": "Option auswählen",
"Discount": "Rabatt",
"Discount Value": "Rabattwert",
"Enabled ?": "Aktiviert ?",
"Visibility": "Sichtbarkeit",
"Promo Code": "Promo-Code",
"Minimum Order Amount": "Mindestbestellmenge",
"Maximum Promo Code Limit": "Maximales Promo-Code-Limit",
"Business Hours": "Geschäftszeiten",
"Selling price should be equal or less than MRP.": "Der Verkaufspreis sollte gleich oder kleiner sein als MRP.",
"Category name that need to be search.": "Kategoriename der gesucht werden muss.",
"Please use YYYY-MM-DD format.": "Bitte verwenden Sie das Format JJJJ-MM-TT.",
"Choose what gets discount (products/categories).": "Wählen Sie den Rabatt (Produkte/Kategorien) aus.",
"piece": "stück",
"kilogram": "kilogramm",
"Gram": "Gramm",
"pound": "pfund",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "Dutzend",
"feet": "fuß",
"meter": "meter",
"square feet": "quadratische Fuß",
"square meter": "quadratischer Meter",
"set": "setzen",
"hour": "stunde",
"day": "tag",
"service": "service",
"combo": "kombo",
"box": "boxen",
"pack": "packen",
"bottle": "flasche",
"whole": "komplett",
"slice": "schliessen",
"bulk": "bulk",
"pending": "ausstehend",
"paid": "bezahlt",
"accepted": "akzeptiert",
"cancelled": "storniert",
"done": "done",
"products": "produkte",
"categories": "kategorien",
"all_products": "alle Produkte",
"percentage": "prozentsatz",
"flat": "flach",
"fixed_price": "fester Preis",
"Order Created/Updated": "Auftrag erstellt/aktualisiert",
"Triggers when a new order is created or a order status is changed in store.": "Wird ausgelöst, wenn eine neue Bestellung erstellt wird oder der Bestellstatus im Store geändert wird.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Gehen Sie zum Abschnitt **Einstellungen->API und Webhooks** .\n- Fügen Sie in die Webhook-Einstellungen folgende URL ein: \n `{{webhookUrl}}`\n- Klicken Sie auf **Speichern**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Ordenación de streamline desde whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.",
"Add Product": "Añadir Producto",
"Update Product": "Actualizar Producto",
"Delete Product": "Eliminar Producto",
"List Products": "Listar productos",
"Create Category": "Crear Categoría",
"Update Category": "Actualizar categoría",
"Delete Category": "Eliminar Categoría",
"List Categories": "Listar categorías",
"Get Order Details": "Detalles del pedido",
"List Orders": "Listar pedidos",
"List Live Orders": "Listar pedidos en vivo",
"Update Order Status": "Actualizar estado del pedido",
"Create Product Discount": "Crear descuento de artículo",
"Create Promo/Coupon Code": "Crear código de promoción/cupón",
"Update Business Time": "Actualizar Tiempo de Negocio",
"Adds new product to store.": "Añade nuevo producto al almacén.",
"Updates an existing product in store.": "Actualiza un producto existente en la tienda.",
"Deletes an existing product from store.": "Elimina un producto existente de la tienda.",
"Retrieves all or single product details from store.": "Recuperar todos o todos los detalles de un producto de la tienda.",
"Creates a new category in store.": "Crea una nueva categoría en la tienda.",
"Updates an existing category in store.": "Actualiza una categoría existente en la tienda.",
"Deletes an existing category from store.": "Elimina una categoría existente de la tienda.",
"Retrieves all categories from store.": "Recuperar todas las categorías de la tienda.",
"Retrieves order details from store.": "Recuperar detalles del pedido de la tienda.",
"Retrieves orders of store.": "Recuperar pedidos de tienda.",
"Retrieves live orders of store.": "Recuperar pedidos de tienda.",
"Updates status of order in store.": "Actualiza el estado del pedido en la tienda.",
"Creates a new discount for category or product level.": "Crea un nuevo descuento para la categoría o el nivel de producto.",
"Creates a new promo code for category or product level.": "Crea un nuevo código promocional para la categoría o el nivel de producto.",
"Updates business hours.": "Actualiza horas laborables.",
"Name": "Nombre",
"Description": "Descripción",
"Category": "Categoría",
"MRP Price": "Precio MRP",
"Selling Price": "Precio de venta",
"Unit": "Unidad",
"Unit Value": "Valor de unidad",
"Availability": "Disponibilidad",
"Exclude Tax": "Excluir impuestos",
"Enable Variants": "Habilitar variantes",
"Status": "Estado",
"Product": "Producto",
"Product name that need to be search.": "Nombre del producto que necesita ser buscado.",
"Category Name": "Nombre de categoría",
"Category Status": "Estado de la categoría",
"Search Term": "Buscar término",
"Order": "Pedido",
"Current page number": "Número de página actual",
"Number of orders per page": "Número de pedidos por página",
"Number of live orders that need to be fetched per order status": "Número de pedidos en vivo que necesitan ser recuperados por estado del pedido",
"Order Status": "Estado del pedido",
"Promotion / Discount Title": "Título de Promoción / Descuento",
"Valid From": "Válido desde",
"Valid To": "Válido a",
"Filter": "Filtro",
"Select Option": "Seleccionar opción",
"Discount": "Descuento",
"Discount Value": "Valor del descuento",
"Enabled ?": "Activado ?",
"Visibility": "Visibilidad",
"Promo Code": "Código promocional",
"Minimum Order Amount": "Importe mínimo del pedido",
"Maximum Promo Code Limit": "Límite máximo de código promocional",
"Business Hours": "Horas",
"Selling price should be equal or less than MRP.": "El precio de venta debe ser igual o menor que el MRP.",
"Category name that need to be search.": "Nombre de categoría que necesita ser buscado.",
"Please use YYYY-MM-DD format.": "Por favor, utilice el formato YYY-MM-DD.",
"Choose what gets discount (products/categories).": "Elija lo que obtiene el descuento (producto/categorías).",
"piece": "pieza",
"kilogram": "kilogramo",
"Gram": "Grafo",
"pound": "libra",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "docena",
"feet": "pies",
"meter": "medidor",
"square feet": "pies cuadrados",
"square meter": "metro cuadrado",
"set": "poner",
"hour": "hora",
"day": "día",
"service": "servicio",
"combo": "combo",
"box": "caja",
"pack": "paquete",
"bottle": "botella",
"whole": "entero",
"slice": "rebanada",
"bulk": "granel",
"pending": "pendiente",
"paid": "pagado",
"accepted": "aceptado",
"cancelled": "cancelado",
"done": "hecho",
"products": "productos",
"categories": "categorías",
"all_products": "todo_los productos",
"percentage": "porcentaje",
"flat": "plano",
"fixed_price": "precio fijo",
"Order Created/Updated": "Pedido creado/actualizado",
"Triggers when a new order is created or a order status is changed in store.": "Dispara cuando se crea un nuevo pedido o se cambia el estado del pedido en el almacén.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Ve a la sección **Ajustes->API y Webhooks**.\n- En la configuración del webhook, pega esta URL: \n `{{webhookUrl}}`\n- Haz clic en **Guardar**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Streamline l'ordre à partir de whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.",
"Add Product": "Ajouter un produit",
"Update Product": "Mettre à jour le produit",
"Delete Product": "Supprimer le produit",
"List Products": "Liste des produits",
"Create Category": "Créer une catégorie",
"Update Category": "Mettre à jour la catégorie",
"Delete Category": "Supprimer la catégorie",
"List Categories": "Lister les catégories",
"Get Order Details": "Obtenir les détails de la commande",
"List Orders": "Lister les commandes",
"List Live Orders": "Liste des commandes en direct",
"Update Order Status": "Mettre à jour le statut de commande",
"Create Product Discount": "Créer une remise de produit",
"Create Promo/Coupon Code": "Créer un Code Promo/Coupon",
"Update Business Time": "Mettre à jour le temps de travail",
"Adds new product to store.": "Ajoute un nouveau produit à la boutique.",
"Updates an existing product in store.": "Met à jour un produit existant dans la boutique.",
"Deletes an existing product from store.": "Supprime un produit existant de la boutique.",
"Retrieves all or single product details from store.": "Récupère tous ou un seul produit dans le magasin.",
"Creates a new category in store.": "Crée une nouvelle catégorie dans la boutique.",
"Updates an existing category in store.": "Met à jour une catégorie existante dans la boutique.",
"Deletes an existing category from store.": "Supprime une catégorie existante du magasin.",
"Retrieves all categories from store.": "Récupère toutes les catégories du magasin.",
"Retrieves order details from store.": "Récupère les détails de la commande du magasin.",
"Retrieves orders of store.": "Récupère les commandes du magasin.",
"Retrieves live orders of store.": "Récupère les commandes en direct du magasin.",
"Updates status of order in store.": "Met à jour l'état de la commande en magasin.",
"Creates a new discount for category or product level.": "Crée une nouvelle remise pour le niveau de catégorie ou de produit.",
"Creates a new promo code for category or product level.": "Crée un nouveau code promo pour la catégorie ou le niveau du produit.",
"Updates business hours.": "Met à jour les heures de travail.",
"Name": "Nom",
"Description": "Libellé",
"Category": "Catégorie",
"MRP Price": "Prix MRP",
"Selling Price": "Prix de vente",
"Unit": "Unité",
"Unit Value": "Valeur de l'unité",
"Availability": "Disponibilité",
"Exclude Tax": "Exclure les taxes",
"Enable Variants": "Activer les variantes",
"Status": "Statut",
"Product": "Produit",
"Product name that need to be search.": "Nom du produit qui doit être recherché.",
"Category Name": "Nom de catégorie",
"Category Status": "Statut de la catégorie",
"Search Term": "Terme de recherche",
"Order": "Commandes",
"Current page number": "Numéro de page actuel",
"Number of orders per page": "Nombre de commandes par page",
"Number of live orders that need to be fetched per order status": "Nombre de commandes en direct qui doivent être récupérées par statut de commande",
"Order Status": "Statut de la commande",
"Promotion / Discount Title": "Promotion / Titre de la Remise",
"Valid From": "Valable à partir de",
"Valid To": "Valable jusqu'à",
"Filter": "Filtre",
"Select Option": "Sélectionner une option",
"Discount": "Remise",
"Discount Value": "Valeur de la remise",
"Enabled ?": "Activé ?",
"Visibility": "Visibilité",
"Promo Code": "Code promo",
"Minimum Order Amount": "Montant minimum de la commande",
"Maximum Promo Code Limit": "Limite maximale de code promotionnel",
"Business Hours": "Heures d'ouverture",
"Selling price should be equal or less than MRP.": "Le prix de vente doit être égal ou inférieur à la MRP.",
"Category name that need to be search.": "Nom de la catégorie qui doit être recherché.",
"Please use YYYY-MM-DD format.": "Veuillez utiliser le format AAAA-MM-JJ.",
"Choose what gets discount (products/categories).": "Choisissez ce qui obtient la réduction (produits/catégories).",
"piece": "pièce",
"kilogram": "kilogramme",
"Gram": "Gram",
"pound": "livré",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "douzaine",
"feet": "pieds",
"meter": "mètre",
"square feet": "pieds carrés",
"square meter": "mètre carré",
"set": "définir",
"hour": "heure",
"day": "jour",
"service": "Service",
"combo": "combo",
"box": "boîte",
"pack": "pack",
"bottle": "bouteille",
"whole": "entier",
"slice": "tranche",
"bulk": "en masse",
"pending": "en attente",
"paid": "payé",
"accepted": "accepté",
"cancelled": "Annulé",
"done": "terminé",
"products": "produits",
"categories": "catégories",
"all_products": "Tous les produits",
"percentage": "pourcentage",
"flat": "appartement",
"fixed_price": "prix_fixe",
"Order Created/Updated": "Commande créée/mise à jour",
"Triggers when a new order is created or a order status is changed in store.": "Déclenche quand une nouvelle commande est créée ou quand un statut de commande est changé en magasin.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "whatsappから順序を合理化",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Quickzu ダッシュボードにログインします。\n2. **https://app.quickzu.com/dash/settings/api-webhooks** に移動します。\n3. **API トークン**をクリップボードにコピーして貼り付けます。",
"Add Product": "商品を追加",
"Update Product": "商品を更新",
"Delete Product": "商品を削除",
"List Products": "商品一覧",
"Create Category": "カテゴリを作成",
"Update Category": "カテゴリを更新",
"Delete Category": "カテゴリを削除",
"List Categories": "カテゴリ一覧",
"Get Order Details": "注文の詳細を取得",
"List Orders": "注文一覧",
"List Live Orders": "ライブ注文一覧",
"Update Order Status": "注文ステータスの更新",
"Create Product Discount": "商品割引を作成",
"Create Promo/Coupon Code": "プロモーション/クーポンコードの作成",
"Update Business Time": "営業時間を更新",
"Adds new product to store.": "ストアに新しい商品を追加",
"Updates an existing product in store.": "ストア内の既存の製品を更新します。",
"Deletes an existing product from store.": "ストアから既存の商品を削除します。",
"Retrieves all or single product details from store.": "ストアからすべてまたは単一の製品の詳細を取得します。",
"Creates a new category in store.": "ストアで新しいカテゴリを作成します。",
"Updates an existing category in store.": "ストア内の既存のカテゴリを更新します。",
"Deletes an existing category from store.": "ストアから既存のカテゴリを削除します。",
"Retrieves all categories from store.": "ストアからすべてのカテゴリを取得します。",
"Retrieves order details from store.": "ストアから注文の詳細を取得します。",
"Retrieves orders of store.": "ストアの注文を取得します。",
"Retrieves live orders of store.": "ストアのライブ注文を取得します。",
"Updates status of order in store.": "ストアの注文ステータスを更新します。",
"Creates a new discount for category or product level.": "カテゴリまたは製品レベルの新しい割引を作成します。",
"Creates a new promo code for category or product level.": "カテゴリまたは製品レベルの新しいプロモーションコードを作成します。",
"Updates business hours.": "営業時間を更新します",
"Name": "Name",
"Description": "説明",
"Category": "カテゴリ",
"MRP Price": "MRP 価格",
"Selling Price": "販売価格",
"Unit": "単位",
"Unit Value": "単位の値",
"Availability": "在庫状況",
"Exclude Tax": "税を除外",
"Enable Variants": "バリエーションを有効にする",
"Status": "Status",
"Product": "商品",
"Product name that need to be search.": "検索する必要がある製品名",
"Category Name": "カテゴリ名",
"Category Status": "カテゴリのステータス",
"Search Term": "検索用語",
"Order": "ご注文",
"Current page number": "現在のページ番号",
"Number of orders per page": "Number of orders per page",
"Number of live orders that need to be fetched per order status": "注文ステータスごとに取得する必要のあるライブ注文数",
"Order Status": "注文ステータス",
"Promotion / Discount Title": "プロモーション/割引タイトル",
"Valid From": "有効開始日",
"Valid To": "有効期限",
"Filter": "フィルター",
"Select Option": "オプションを選択",
"Discount": "割引",
"Discount Value": "割引値",
"Enabled ?": "有効 ?",
"Visibility": "公開範囲",
"Promo Code": "プロモーションコード",
"Minimum Order Amount": "最小注文金額",
"Maximum Promo Code Limit": "最大プロモーションコード制限",
"Business Hours": "営業時間",
"Selling price should be equal or less than MRP.": "販売価格はMRP以下でなければなりません。",
"Category name that need to be search.": "検索する必要があるカテゴリ名",
"Please use YYYY-MM-DD format.": "YYYY-MM-DD形式をご使用ください。",
"Choose what gets discount (products/categories).": "割引を受けるものを選択してください(商品/カテゴリ)。",
"piece": "ピース",
"kilogram": "キロ",
"Gram": "グラム",
"pound": "ポンド",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "たくさんの",
"feet": "フィート",
"meter": "メートル",
"square feet": "平方フィート",
"square meter": "平方メートル",
"set": "セット",
"hour": "時間",
"day": "日",
"service": "サービス",
"combo": "コンボ",
"box": "ボックス",
"pack": "パック",
"bottle": "ボトル|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びん|びっくり|びん|びっくり|びん|びん|びん|びん|",
"whole": "全体",
"slice": "スライスする",
"bulk": "一括処理",
"pending": "処理待ち",
"paid": "支払い済み",
"accepted": "承認済み",
"cancelled": "キャンセル済み",
"done": "完了",
"products": "商品",
"categories": "カテゴリ",
"all_products": "all_products",
"percentage": "割合",
"flat": "フラット",
"fixed_price": "固定価格",
"Order Created/Updated": "注文作成/更新",
"Triggers when a new order is created or a order status is changed in store.": "新しい注文が作成された場合、またはストアで注文ステータスが変更された場合にトリガーされます。",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Streamlijn bestellen vanaf whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Log in op uw Quickzu Dashboard.\n2. Ga naar **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Kopieer **API Token** naar het klembord en plak het.",
"Add Product": "Product toevoegen",
"Update Product": "Product bijwerken",
"Delete Product": "Product verwijderen",
"List Products": "Producten weergeven",
"Create Category": "Categorie aanmaken",
"Update Category": "Categorie bijwerken",
"Delete Category": "Categorie verwijderen",
"List Categories": "Lijst van categorieën",
"Get Order Details": "Besteldetails ophalen",
"List Orders": "Toon bestellingen",
"List Live Orders": "Lijst van live bestellingen",
"Update Order Status": "Orderstatus bijwerken",
"Create Product Discount": "Maak een korting aan",
"Create Promo/Coupon Code": "Maak Promo/Coupon code",
"Update Business Time": "Bedrijfstijd bijwerken",
"Adds new product to store.": "Voegt nieuw product toe aan de winkel.",
"Updates an existing product in store.": "Werkt een bestaand product in winkel bij.",
"Deletes an existing product from store.": "Verwijdert een bestaand product uit de winkel.",
"Retrieves all or single product details from store.": "Haal alle details of enkel product op uit de winkel.",
"Creates a new category in store.": "Maakt een nieuwe categorie aan in de winkel.",
"Updates an existing category in store.": "Werkt een bestaande categorie in winkel bij.",
"Deletes an existing category from store.": "Verwijdert een bestaande categorie uit de winkel.",
"Retrieves all categories from store.": "Haal alle categorieën op uit de winkel.",
"Retrieves order details from store.": "Besteldetails ophalen uit de winkel.",
"Retrieves orders of store.": "Bestellingen van winkel worden opgehaald.",
"Retrieves live orders of store.": "Ophalen live bestellingen van winkel.",
"Updates status of order in store.": "Werk de status van bestelling in winkel bij.",
"Creates a new discount for category or product level.": "Maakt een nieuwe korting aan voor categorie of product niveau.",
"Creates a new promo code for category or product level.": "Hiermee maakt u een nieuwe promotiecode voor categorie- of productniveau.",
"Updates business hours.": "Werkt kantooruren bij.",
"Name": "Naam",
"Description": "Beschrijving",
"Category": "categorie",
"MRP Price": "MRP prijs",
"Selling Price": "Verkoopprijs",
"Unit": "Eenheid",
"Unit Value": "Eenheid waarde",
"Availability": "Beschikbaarheid",
"Exclude Tax": "Exclusief BTW",
"Enable Variants": "Varianten inschakelen",
"Status": "status",
"Product": "product",
"Product name that need to be search.": "Productnaam die gezocht moet worden.",
"Category Name": "Categorie Naam",
"Category Status": "Categorie status",
"Search Term": "Zoek term",
"Order": "Bestelling",
"Current page number": "Huidige paginanummer",
"Number of orders per page": "Aantal bestellingen per pagina",
"Number of live orders that need to be fetched per order status": "Aantal live orders die moeten worden opgehaald per bestellingstatus",
"Order Status": "Status van bestelling",
"Promotion / Discount Title": "Promotie / Korting Titel",
"Valid From": "Geldig vanaf",
"Valid To": "Geldig tot",
"Filter": "Filteren",
"Select Option": "Optie selecteren",
"Discount": "korting",
"Discount Value": "Korting waarde",
"Enabled ?": "Ingeschakeld ?",
"Visibility": "Zichtbaarheid",
"Promo Code": "Promotie Code",
"Minimum Order Amount": "Minimum bestelbedrag",
"Maximum Promo Code Limit": "Maximale kortingscode",
"Business Hours": "Kantoor uren",
"Selling price should be equal or less than MRP.": "Verkoopprijs moet gelijk zijn aan of lager zijn dan MRP.",
"Category name that need to be search.": "Categorienaam die gezocht moet worden.",
"Please use YYYY-MM-DD format.": "Gebruik JJJJ-MM-DD formaat.",
"Choose what gets discount (products/categories).": "Kies wat korting krijgt (producten/categorieën).",
"piece": "stuk",
"kilogram": "kilogram",
"Gram": "Grijp",
"pound": "pond",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "dozijn",
"feet": "voeten",
"meter": "meter",
"square feet": "vierkante voet",
"square meter": "vierkante meter",
"set": "instellen",
"hour": "uur",
"day": "dag",
"service": "service",
"combo": "combinatie",
"box": "doos",
"pack": "pak",
"bottle": "fles",
"whole": "geheel",
"slice": "plak",
"bulk": "bulk",
"pending": "in behandeling",
"paid": "betaald",
"accepted": "geaccepteerd",
"cancelled": "geannuleerd",
"done": "voltooid",
"products": "product(en)",
"categories": "categoriechar@@0n",
"all_products": "Alle_producten",
"percentage": "percentage",
"flat": "vlak",
"fixed_price": "vaste prijs",
"Order Created/Updated": "Bestelling aangemaakt/bijgewerkt",
"Triggers when a new order is created or a order status is changed in store.": "Triggert wanneer een nieuwe bestelling is aangemaakt of een orderstatus is gewijzigd in de winkel.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Ga naar de **Instellingen->API en Webhooks** sectie.\n- Plak deze URL in de webhook instellingen: \n `{{webhookUrl}}`\n- Klik op **Opslaan**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Simplifique a ordem do whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Faça login no seu painel do Quickzu .\n2. Vá para **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copie o **API Token** para a área de transferência e cole-o.",
"Add Product": "Adicionar produto",
"Update Product": "Atualização de Produto",
"Delete Product": "Excluir Produto",
"List Products": "Lista de produtos",
"Create Category": "Criar categoria",
"Update Category": "Atualizar Categoria",
"Delete Category": "Excluir Categoria",
"List Categories": "Listar categorias",
"Get Order Details": "Obter Detalhes do Pedido",
"List Orders": "Lista de Pedidos",
"List Live Orders": "Listar pedidos ao vivo",
"Update Order Status": "Atualizar status do pedido",
"Create Product Discount": "Criar desconto de produto",
"Create Promo/Coupon Code": "Criar Código Promo/Cupom",
"Update Business Time": "Atualizar Horário Comercial",
"Adds new product to store.": "Adiciona novos produtos à loja.",
"Updates an existing product in store.": "Atualizar um produto existente na loja.",
"Deletes an existing product from store.": "Exclui um produto existente da loja.",
"Retrieves all or single product details from store.": "Recupera todos ou apenas detalhes de produto da loja.",
"Creates a new category in store.": "Cria uma nova categoria na loja.",
"Updates an existing category in store.": "Atualiza uma categoria existente na loja.",
"Deletes an existing category from store.": "Exclui uma categoria existente da loja.",
"Retrieves all categories from store.": "Recupera todas as categorias do armazém.",
"Retrieves order details from store.": "Recupera detalhes do pedido da loja.",
"Retrieves orders of store.": "Recupera pedidos da loja.",
"Retrieves live orders of store.": "Recupera pedidos da loja ao vivo.",
"Updates status of order in store.": "Atualiza o status do pedido na loja.",
"Creates a new discount for category or product level.": "Cria um novo desconto para o nível de categoria ou produto.",
"Creates a new promo code for category or product level.": "Cria um novo código promocional para o nível de categoria ou produto.",
"Updates business hours.": "Atualiza o horário comercial.",
"Name": "Nome",
"Description": "Descrição",
"Category": "categoria",
"MRP Price": "Preço MRP",
"Selling Price": "Preço de Venda",
"Unit": "Unidade",
"Unit Value": "Valor da Unidade",
"Availability": "Disponibilidade",
"Exclude Tax": "Excluir Imposto",
"Enable Variants": "Ativar Variantes",
"Status": "Estado",
"Product": "Produto:",
"Product name that need to be search.": "Nome do produto que precisa ser pesquisado.",
"Category Name": "Nome da categoria",
"Category Status": "Status da categoria",
"Search Term": "Termo para pesquisa",
"Order": "Encomenda",
"Current page number": "Número de página atual",
"Number of orders per page": "Número de pedidos por página",
"Number of live orders that need to be fetched per order status": "Número de ordens ao vivo que precisam ser obtidas por status do pedido",
"Order Status": "Situação do pedido",
"Promotion / Discount Title": "Promoção / Título do Desconto",
"Valid From": "Válido de",
"Valid To": "Válido até",
"Filter": "filtro",
"Select Option": "Selecionar opção",
"Discount": "desconto",
"Discount Value": "Desconto de valor",
"Enabled ?": "Ativado ?",
"Visibility": "Visibilidade",
"Promo Code": "Código promocional",
"Minimum Order Amount": "Quantidade de pedido mínimo",
"Maximum Promo Code Limit": "Limite máximo de código promocional",
"Business Hours": "Horário de funcionamento",
"Selling price should be equal or less than MRP.": "O preço de venda deve ser igual ou menor que o MRP.",
"Category name that need to be search.": "Nome da categoria que precisa ser pesquisado",
"Please use YYYY-MM-DD format.": "Por favor, use o formato AAAA-MM-DD",
"Choose what gets discount (products/categories).": "Escolha o que recebe desconto (produtos/categorias).",
"piece": "pedaço",
"kilogram": "quilograma",
"Gram": "Grama",
"pound": "cerquilha",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "dúzia",
"feet": "pés",
"meter": "metro",
"square feet": "pés quadrados",
"square meter": "metro quadrado",
"set": "definir",
"hour": "hora",
"day": "dia",
"service": "serviço",
"combo": "combo",
"box": "caixa",
"pack": "pacotes",
"bottle": "Garrafa",
"whole": "todo",
"slice": "fatia",
"bulk": "Carga",
"pending": "pendente",
"paid": "pago",
"accepted": "aceito",
"cancelled": "cancelado",
"done": "concluído",
"products": "produtos",
"categories": "categorias",
"all_products": "todos_os_produtos",
"percentage": "porcentagem",
"flat": "plano",
"fixed_price": "preço_fixo",
"Order Created/Updated": "Pedido Criado/Atualizado",
"Triggers when a new order is created or a order status is changed in store.": "Aciona quando uma nova ordem é criada ou um status de pedido é alterado na loja.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Vá para a seção **Configurações->API e Webhooks**.\n- Nas configurações do webhook, cole esta URL: \n `{{webhookUrl}}`\n- Clique em **Salvar**.\n"
}

View File

@@ -0,0 +1,110 @@
{
"Quickzu": "Быстро",
"Streamline ordering from whatsapp": "Трансляция заказа из whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Войдите в панель быстрого доступа.\n2. Перейдите на **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Скопируйте **API токен** в буфер обмена и вставьте его.",
"Add Product": "Добавить товар",
"Update Product": "Обновить продукт",
"Delete Product": "Удалить продукт",
"List Products": "Список товаров",
"Create Category": "Создать категорию",
"Update Category": "Обновить категорию",
"Delete Category": "Удалить категорию",
"List Categories": "Список категорий",
"Get Order Details": "Получить детали заказа",
"List Orders": "Список заказов",
"List Live Orders": "Список реальных заказов",
"Update Order Status": "Обновить статус заказа",
"Create Product Discount": "Создать скидку на товар",
"Create Promo/Coupon Code": "Создать промо/код купона",
"Update Business Time": "Обновить рабочее время",
"Adds new product to store.": "Добавить новый товар в магазин.",
"Updates an existing product in store.": "Обновляет существующий товар в магазине.",
"Deletes an existing product from store.": "Удаляет существующий товар из магазина.",
"Retrieves all or single product details from store.": "Получает все детали или отдельные товары из магазина.",
"Creates a new category in store.": "Создать новую категорию в магазине.",
"Updates an existing category in store.": "Обновляет существующую категорию в магазине.",
"Deletes an existing category from store.": "Удаляет существующую категорию из магазина.",
"Retrieves all categories from store.": "Получает все категории из магазина.",
"Retrieves order details from store.": "Получает детали заказа из магазина.",
"Retrieves orders of store.": "Получает заказы магазина.",
"Retrieves live orders of store.": "Возвращает живые заказы магазина.",
"Updates status of order in store.": "Статус заказа в магазине.",
"Creates a new discount for category or product level.": "Создает новую скидку на уровень категории или товара.",
"Creates a new promo code for category or product level.": "Создает новый промокод для категории или уровня товара.",
"Updates business hours.": "Обновляет рабочие часы.",
"Name": "Наименование",
"Description": "Описание",
"Category": "Категория",
"MRP Price": "Цена MRP",
"Selling Price": "Продажная цена",
"Unit": "Единица измерения",
"Unit Value": "Значение единицы измерения",
"Availability": "Доступность",
"Exclude Tax": "Исключить налог",
"Enable Variants": "Включить варианты",
"Status": "Status",
"Product": "Товар",
"Product name that need to be search.": "Название товара, которое нужно искать.",
"Category Name": "Название категории",
"Category Status": "Статус категории",
"Search Term": "Поиск термина",
"Order": "Заказ",
"Current page number": "Текущий номер страницы",
"Number of orders per page": "Количество заказов на странице",
"Number of live orders that need to be fetched per order status": "Количество реальных заказов, которые должны быть загружены в статус заказа",
"Order Status": "Статус заказа",
"Promotion / Discount Title": "Акция / Название скидки",
"Valid From": "Действителен с",
"Valid To": "Действителен до",
"Filter": "Фильтр",
"Select Option": "Выберите опцию",
"Discount": "Скидка",
"Discount Value": "Значение скидки",
"Enabled ?": "Включено ?",
"Visibility": "Видимость",
"Promo Code": "Промокод",
"Minimum Order Amount": "Минимальная сумма заказа",
"Maximum Promo Code Limit": "Максимальный лимит промокода",
"Business Hours": "Рабочие часы",
"Selling price should be equal or less than MRP.": "Цена продажи должна быть равна или меньше, чем MRP.",
"Category name that need to be search.": "Название категории, которая должна быть найдена.",
"Please use YYYY-MM-DD format.": "Пожалуйста, используйте формат YYYY-MM-DD.",
"Choose what gets discount (products/categories).": "Выберите, что получает скидку (товары/категории).",
"piece": "кусок",
"kilogram": "килограмм",
"Gram": "Грм",
"pound": "фунт",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "дюжина",
"feet": "футы",
"meter": "метр",
"square feet": "квадратные футы",
"square meter": "квадратный метр",
"set": "набор",
"hour": "часы",
"day": "день",
"service": "услуга",
"combo": "комбо",
"box": "ящик",
"pack": "пак",
"bottle": "бутылка",
"whole": "целиком",
"slice": "кусочек",
"bulk": "Массовый",
"pending": "в ожидании",
"paid": "оплачено",
"accepted": "принят",
"cancelled": "отменено",
"done": "done",
"products": "товары",
"categories": "категории",
"all_products": се_продукты",
"percentage": "процент",
"flat": "плоский",
"fixed_price": "фиксированная цена",
"Order Created/Updated": "Заказ создан/обновлен",
"Triggers when a new order is created or a order status is changed in store.": "Срабатывает при создании нового заказа или изменении статуса заказа в магазине.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- перейдите в раздел **Настройки->API и Webhooks**.\n- В настройках вебхука вставьте этот URL: \n `{{webhookUrl}}`\n- Нажмите на **Сохранить**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Streamline ordering from whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.",
"Add Product": "Add Product",
"Update Product": "Update Product",
"Delete Product": "Delete Product",
"List Products": "List Products",
"Create Category": "Create Category",
"Update Category": "Update Category",
"Delete Category": "Delete Category",
"List Categories": "List Categories",
"Get Order Details": "Get Order Details",
"List Orders": "List Orders",
"List Live Orders": "List Live Orders",
"Update Order Status": "Update Order Status",
"Create Product Discount": "Create Product Discount",
"Create Promo/Coupon Code": "Create Promo/Coupon Code",
"Update Business Time": "Update Business Time",
"Adds new product to store.": "Adds new product to store.",
"Updates an existing product in store.": "Updates an existing product in store.",
"Deletes an existing product from store.": "Deletes an existing product from store.",
"Retrieves all or single product details from store.": "Retrieves all or single product details from store.",
"Creates a new category in store.": "Creates a new category in store.",
"Updates an existing category in store.": "Updates an existing category in store.",
"Deletes an existing category from store.": "Deletes an existing category from store.",
"Retrieves all categories from store.": "Retrieves all categories from store.",
"Retrieves order details from store.": "Retrieves order details from store.",
"Retrieves orders of store.": "Retrieves orders of store.",
"Retrieves live orders of store.": "Retrieves live orders of store.",
"Updates status of order in store.": "Updates status of order in store.",
"Creates a new discount for category or product level.": "Creates a new discount for category or product level.",
"Creates a new promo code for category or product level.": "Creates a new promo code for category or product level.",
"Updates business hours.": "Updates business hours.",
"Name": "Name",
"Description": "Description",
"Category": "Category",
"MRP Price": "MRP Price",
"Selling Price": "Selling Price",
"Unit": "Unit",
"Unit Value": "Unit Value",
"Availability": "Availability",
"Exclude Tax": "Exclude Tax",
"Enable Variants": "Enable Variants",
"Status": "Status",
"Product": "Product",
"Product name that need to be search.": "Product name that need to be search.",
"Category Name": "Category Name",
"Category Status": "Category Status",
"Search Term": "Search Term",
"Order": "Order",
"Current page number": "Current page number",
"Number of orders per page": "Number of orders per page",
"Number of live orders that need to be fetched per order status": "Number of live orders that need to be fetched per order status",
"Order Status": "Order Status",
"Promotion / Discount Title": "Promotion / Discount Title",
"Valid From": "Valid From",
"Valid To": "Valid To",
"Filter": "Filter",
"Select Option": "Select Option",
"Discount": "Discount",
"Discount Value": "Discount Value",
"Enabled ?": "Enabled ?",
"Visibility": "Visibility",
"Promo Code": "Promo Code",
"Minimum Order Amount": "Minimum Order Amount",
"Maximum Promo Code Limit": "Maximum Promo Code Limit",
"Business Hours": "Business Hours",
"Selling price should be equal or less than MRP.": "Selling price should be equal or less than MRP.",
"Category name that need to be search.": "Category name that need to be search.",
"Please use YYYY-MM-DD format.": "Please use YYYY-MM-DD format.",
"Choose what gets discount (products/categories).": "Choose what gets discount (products/categories).",
"piece": "piece",
"kilogram": "kilogram",
"Gram": "Gram",
"pound": "pound",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "dozen",
"feet": "feet",
"meter": "meter",
"square feet": "square feet",
"square meter": "square meter",
"set": "set",
"hour": "hour",
"day": "day",
"service": "service",
"combo": "combo",
"box": "box",
"pack": "pack",
"bottle": "bottle",
"whole": "whole",
"slice": "slice",
"bulk": "bulk",
"pending": "pending",
"paid": "paid",
"accepted": "accepted",
"cancelled": "cancelled",
"done": "done",
"products": "products",
"categories": "categories",
"all_products": "all_products",
"percentage": "percentage",
"flat": "flat",
"fixed_price": "fixed_price",
"Order Created/Updated": "Order Created/Updated",
"Triggers when a new order is created or a order status is changed in store.": "Triggers when a new order is created or a order status is changed in store.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n"
}

View File

@@ -0,0 +1,110 @@
{
"Quickzu": "Quickzu",
"Streamline ordering from whatsapp": "Streamline ordering from whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.",
"Add Product": "Add Product",
"Update Product": "Update Product",
"Delete Product": "Delete Product",
"List Products": "List Products",
"Create Category": "Create Category",
"Update Category": "Update Category",
"Delete Category": "Delete Category",
"List Categories": "List Categories",
"Get Order Details": "Get Order Details",
"List Orders": "List Orders",
"List Live Orders": "List Live Orders",
"Update Order Status": "Update Order Status",
"Create Product Discount": "Create Product Discount",
"Create Promo/Coupon Code": "Create Promo/Coupon Code",
"Update Business Time": "Update Business Time",
"Adds new product to store.": "Adds new product to store.",
"Updates an existing product in store.": "Updates an existing product in store.",
"Deletes an existing product from store.": "Deletes an existing product from store.",
"Retrieves all or single product details from store.": "Retrieves all or single product details from store.",
"Creates a new category in store.": "Creates a new category in store.",
"Updates an existing category in store.": "Updates an existing category in store.",
"Deletes an existing category from store.": "Deletes an existing category from store.",
"Retrieves all categories from store.": "Retrieves all categories from store.",
"Retrieves order details from store.": "Retrieves order details from store.",
"Retrieves orders of store.": "Retrieves orders of store.",
"Retrieves live orders of store.": "Retrieves live orders of store.",
"Updates status of order in store.": "Updates status of order in store.",
"Creates a new discount for category or product level.": "Creates a new discount for category or product level.",
"Creates a new promo code for category or product level.": "Creates a new promo code for category or product level.",
"Updates business hours.": "Updates business hours.",
"Name": "Name",
"Description": "Description",
"Category": "Category",
"MRP Price": "MRP Price",
"Selling Price": "Selling Price",
"Unit": "Unit",
"Unit Value": "Unit Value",
"Availability": "Availability",
"Exclude Tax": "Exclude Tax",
"Enable Variants": "Enable Variants",
"Status": "Status",
"Product": "Product",
"Product name that need to be search.": "Product name that need to be search.",
"Category Name": "Category Name",
"Category Status": "Category Status",
"Search Term": "Search Term",
"Order": "Order",
"Current page number": "Current page number",
"Number of orders per page": "Number of orders per page",
"Number of live orders that need to be fetched per order status": "Number of live orders that need to be fetched per order status",
"Order Status": "Order Status",
"Promotion / Discount Title": "Promotion / Discount Title",
"Valid From": "Valid From",
"Valid To": "Valid To",
"Filter": "Filter",
"Select Option": "Select Option",
"Discount": "Discount",
"Discount Value": "Discount Value",
"Enabled ?": "Enabled ?",
"Visibility": "Visibility",
"Promo Code": "Promo Code",
"Minimum Order Amount": "Minimum Order Amount",
"Maximum Promo Code Limit": "Maximum Promo Code Limit",
"Business Hours": "Business Hours",
"Selling price should be equal or less than MRP.": "Selling price should be equal or less than MRP.",
"Category name that need to be search.": "Category name that need to be search.",
"Please use YYYY-MM-DD format.": "Please use YYYY-MM-DD format.",
"Choose what gets discount (products/categories).": "Choose what gets discount (products/categories).",
"piece": "piece",
"kilogram": "kilogram",
"Gram": "Gram",
"pound": "pound",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "dozen",
"feet": "feet",
"meter": "meter",
"square feet": "square feet",
"square meter": "square meter",
"set": "set",
"hour": "hour",
"day": "day",
"service": "service",
"combo": "combo",
"box": "box",
"pack": "pack",
"bottle": "bottle",
"whole": "whole",
"slice": "slice",
"bulk": "bulk",
"pending": "đang chờ",
"paid": "paid",
"accepted": "accepted",
"cancelled": "cancelled",
"done": "done",
"products": "products",
"categories": "categories",
"all_products": "all_products",
"percentage": "percentage",
"flat": "flat",
"fixed_price": "fixed_price",
"Order Created/Updated": "Order Created/Updated",
"Triggers when a new order is created or a order status is changed in store.": "Triggers when a new order is created or a order status is changed in store.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n"
}

View File

@@ -0,0 +1,109 @@
{
"Streamline ordering from whatsapp": "Streamline ordering from whatsapp",
"\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.": "\n1. Login to your Quickzu Dashboard.\n2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.\n3. Copy **API Token** to the clipboard and paste it.",
"Add Product": "Add Product",
"Update Product": "Update Product",
"Delete Product": "Delete Product",
"List Products": "List Products",
"Create Category": "Create Category",
"Update Category": "Update Category",
"Delete Category": "Delete Category",
"List Categories": "List Categories",
"Get Order Details": "Get Order Details",
"List Orders": "List Orders",
"List Live Orders": "List Live Orders",
"Update Order Status": "Update Order Status",
"Create Product Discount": "Create Product Discount",
"Create Promo/Coupon Code": "Create Promo/Coupon Code",
"Update Business Time": "Update Business Time",
"Adds new product to store.": "Adds new product to store.",
"Updates an existing product in store.": "Updates an existing product in store.",
"Deletes an existing product from store.": "Deletes an existing product from store.",
"Retrieves all or single product details from store.": "Retrieves all or single product details from store.",
"Creates a new category in store.": "Creates a new category in store.",
"Updates an existing category in store.": "Updates an existing category in store.",
"Deletes an existing category from store.": "Deletes an existing category from store.",
"Retrieves all categories from store.": "Retrieves all categories from store.",
"Retrieves order details from store.": "Retrieves order details from store.",
"Retrieves orders of store.": "Retrieves orders of store.",
"Retrieves live orders of store.": "Retrieves live orders of store.",
"Updates status of order in store.": "Updates status of order in store.",
"Creates a new discount for category or product level.": "Creates a new discount for category or product level.",
"Creates a new promo code for category or product level.": "Creates a new promo code for category or product level.",
"Updates business hours.": "Updates business hours.",
"Name": "名称",
"Description": "描述",
"Category": "Category",
"MRP Price": "MRP Price",
"Selling Price": "Selling Price",
"Unit": "Unit",
"Unit Value": "Unit Value",
"Availability": "Availability",
"Exclude Tax": "Exclude Tax",
"Enable Variants": "Enable Variants",
"Status": "状态",
"Product": "Product",
"Product name that need to be search.": "Product name that need to be search.",
"Category Name": "Category Name",
"Category Status": "Category Status",
"Search Term": "Search Term",
"Order": "Order",
"Current page number": "Current page number",
"Number of orders per page": "Number of orders per page",
"Number of live orders that need to be fetched per order status": "Number of live orders that need to be fetched per order status",
"Order Status": "Order Status",
"Promotion / Discount Title": "Promotion / Discount Title",
"Valid From": "Valid From",
"Valid To": "Valid To",
"Filter": "Filter",
"Select Option": "Select Option",
"Discount": "Discount",
"Discount Value": "Discount Value",
"Enabled ?": "已启用 ?",
"Visibility": "Visibility",
"Promo Code": "Promo Code",
"Minimum Order Amount": "Minimum Order Amount",
"Maximum Promo Code Limit": "Maximum Promo Code Limit",
"Business Hours": "Business Hours",
"Selling price should be equal or less than MRP.": "Selling price should be equal or less than MRP.",
"Category name that need to be search.": "Category name that need to be search.",
"Please use YYYY-MM-DD format.": "Please use YYYY-MM-DD format.",
"Choose what gets discount (products/categories).": "Choose what gets discount (products/categories).",
"piece": "片段",
"kilogram": "kilogram",
"Gram": "Gram",
"pound": "pound",
"litre": "litre",
"mili litre": "mili litre",
"dozen": "dozen",
"feet": "feet",
"meter": "meter",
"square feet": "square feet",
"square meter": "square meter",
"set": "set",
"hour": "hour",
"day": "day",
"service": "service",
"combo": "combo",
"box": "box",
"pack": "pack",
"bottle": "bottle",
"whole": "whole",
"slice": "slice",
"bulk": "bulk",
"pending": "待處理",
"paid": "paid",
"accepted": "accepted",
"cancelled": "cancelled",
"done": "完成",
"products": "产品",
"categories": "categories",
"all_products": "all_products",
"percentage": "percentage",
"flat": "flat",
"fixed_price": "fixed_price",
"Order Created/Updated": "Order Created/Updated",
"Triggers when a new order is created or a order status is changed in store.": "Triggers when a new order is created or a order status is changed in store.",
"Markdown": "Markdown",
"\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n": "\n- Go to the **Settings->API and Webhooks** section.\n- In the webhook settings, paste this URL: \n `{{webhookUrl}}`\n- Click on **Save**.\n"
}

View File

@@ -0,0 +1,56 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { updateBusinessTimeAction } from './lib/actions/business-settings/update-business-time';
import { createCategoryAction } from './lib/actions/categories/create-category';
import { deleteCategoryAction } from './lib/actions/categories/delete-category';
import { listCategoriesAction } from './lib/actions/categories/list-categories';
import { updateCategoryAction } from './lib/actions/categories/update-category';
import { createProductDiscountAction } from './lib/actions/discounts/create-product-discount';
import { createPromoCodeAction } from './lib/actions/discounts/create-promo-code';
import { getOrderDetailsAction } from './lib/actions/orders/get-order-details';
import { listLiveOrdersAction } from './lib/actions/orders/list-live-orders';
import { listOrdersAction } from './lib/actions/orders/list-orders';
import { updateOrderStatusAction } from './lib/actions/orders/update-order-status';
import { addProductAction } from './lib/actions/products/create-product';
import { deleteProductAction } from './lib/actions/products/delete-product';
import { listProductsAction } from './lib/actions/products/list-products';
import { updateProductAction } from './lib/actions/products/update-product';
import { orderCreatedTrigger } from './lib/triggers/order-created';
const authHelpDescription = `
1. Login to your Quickzu Dashboard.
2. Go to **https://app.quickzu.com/dash/settings/api-webhooks**.
3. Copy **API Token** to the clipboard and paste it.`;
export const quickzuAuth = PieceAuth.SecretText({
displayName: 'API Token',
description: authHelpDescription,
required: true,
});
export const quickzu = createPiece({
displayName: 'Quickzu',
description: 'Streamline ordering from whatsapp',
auth: quickzuAuth,
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/quickzu.png',
authors: ["kishanprmr","abuaboud"],
actions: [
addProductAction,
updateProductAction,
deleteProductAction,
listProductsAction,
createCategoryAction,
updateCategoryAction,
deleteCategoryAction,
listCategoriesAction,
getOrderDetailsAction,
listOrdersAction,
listLiveOrdersAction,
updateOrderStatusAction,
createProductDiscountAction,
createPromoCodeAction,
updateBusinessTimeAction,
],
triggers: [orderCreatedTrigger],
});

View File

@@ -0,0 +1,73 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient } from '../../common';
import { BusinessTimingInput } from '../../common/types';
export const updateBusinessTimeAction = createAction({
auth: quickzuAuth,
name: 'quickzu_update_business_time',
displayName: 'Update Business Time',
description: 'Updates business hours.',
props: {
items: Property.Array({
displayName: 'Business Hours',
required: true,
properties: {
weekday: Property.StaticDropdown({
displayName: 'Day',
required: true,
options: {
disabled: false,
options: [
{ label: 'Sunday', value: '0' },
{ label: 'Monday', value: '1' },
{ label: 'Tuesday', value: '2' },
{ label: 'Wednesday', value: '3' },
{ label: 'Thursday', value: '4' },
{ label: 'Friday', value: '5' },
{ label: 'Saturday', value: '6' },
],
},
}),
start: Property.ShortText({
displayName: 'Start Time',
description: 'Please use 24:00 hour format',
required: true,
}),
end: Property.ShortText({
displayName: 'Start Time',
description: 'Please use 24:00 hour format',
required: true,
}),
status: Property.Checkbox({
displayName: 'Status',
required: true,
defaultValue: true,
}),
},
}),
},
async run(context) {
const items = context.propsValue.items as BusinessDayHour[];
const input: BusinessTimingInput = {
timing: {},
};
for (const day of items) {
input.timing[day.weekday] = {
start: day.start,
end: day.end,
status: day.status,
};
}
const client = makeClient(context.auth);
return await client.updateBusinessTime(input);
},
});
type BusinessDayHour = {
weekday: string;
start: string;
end: string;
status: boolean;
};

View File

@@ -0,0 +1,28 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient } from '../../common';
export const createCategoryAction = createAction({
auth: quickzuAuth,
name: 'quickzu_create_category',
displayName: 'Create Category',
description: 'Creates a new category in store.',
props: {
name: Property.ShortText({
displayName: 'Category Name',
required: true,
}),
status: Property.Checkbox({
displayName: 'Category Status',
required: true,
defaultValue: true,
}),
},
async run(context) {
const { name, status } = context.propsValue;
const client = makeClient(context.auth);
return await client.createCategory({ name, status });
},
});

View File

@@ -0,0 +1,19 @@
import { createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
export const deleteCategoryAction = createAction({
auth: quickzuAuth,
name: 'quickzu_delete_category',
displayName: 'Delete Category',
description: 'Deletes an existing category from store.',
props: {
categoryId: quickzuCommon.categoryId(true),
},
async run(context) {
const { categoryId } = context.propsValue;
const client = makeClient(context.auth);
return await client.deleteCategory(categoryId!);
},
});

View File

@@ -0,0 +1,23 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../../';
import { makeClient } from '../../common';
export const listCategoriesAction = createAction({
auth: quickzuAuth,
name: 'quickzu_list_categories',
displayName: 'List Categories',
description: 'Retrieves all categories from store.',
props: {
term: Property.ShortText({
displayName: 'Search Term',
description: 'Category name that need to be search.',
required: false,
}),
},
async run(context) {
const { term } = context.propsValue;
const client = makeClient(context.auth);
return client.listCategories(term);
},
});

View File

@@ -0,0 +1,29 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
export const updateCategoryAction = createAction({
auth: quickzuAuth,
name: 'quickzu_update_category',
displayName: 'Update Category',
description: 'Updates an existing category in store.',
props: {
categoryId: quickzuCommon.categoryId(true),
name: Property.ShortText({
displayName: 'Category Name',
required: false,
}),
status: Property.Checkbox({
displayName: 'Category Status',
required: true,
defaultValue: false,
}),
},
async run(context) {
const { categoryId, name, status } = context.propsValue;
const client = makeClient(context.auth);
return await client.updateCategory(categoryId!, { name, status });
},
});

View File

@@ -0,0 +1,169 @@
import {
DynamicPropsValue,
Property,
createAction,
} from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient } from '../../common';
import {
DiscountFilterType,
DiscountMethod,
DiscountValueType,
} from '../../common/constants';
import { ProductDiscountInput } from '../../common/types';
export const createProductDiscountAction = createAction({
auth: quickzuAuth,
name: 'quickzu_create_product_discount',
displayName: 'Create Product Discount',
description: 'Creates a new discount for category or product level.',
props: {
title: Property.ShortText({
displayName: 'Promotion / Discount Title',
required: true,
}),
start_date: Property.DateTime({
displayName: 'Valid From',
description: 'Please use YYYY-MM-DD format.',
required: true,
}),
end_date: Property.DateTime({
displayName: 'Valid To',
description: 'Please use YYYY-MM-DD format.',
required: true,
}),
filter_type: Property.StaticDropdown({
displayName: 'Filter',
description: 'Choose what gets discount (products/categories).',
required: true,
options: {
disabled: false,
options: Object.values(DiscountFilterType).map((value) => {
return {
label: value.toLowerCase(),
value: value,
};
}),
},
}),
selectedFilterValues: Property.DynamicProperties({
auth: quickzuAuth,
displayName: 'Select Option',
refreshers: ['filter_type'],
required: true,
props: async ({ auth, filter_type }) => {
if (!auth) return {};
if (!filter_type) return {};
const fields: DynamicPropsValue = {};
const discountFilterType = filter_type as unknown as DiscountFilterType;
const client = makeClient(auth);
switch (discountFilterType) {
case DiscountFilterType.CATEGORIES: {
const res = await client.listCategories();
fields['values'] = Property.StaticMultiSelectDropdown({
displayName: 'Categories',
required: true,
description: 'Categories eligible for a discount.',
options: {
disabled: false,
options: res.data.map((category) => {
return {
label: category.name,
value: category._id,
};
}),
},
});
break;
}
case DiscountFilterType.PRODUCTS: {
const res = await client.listProducts();
fields['values'] = Property.StaticMultiSelectDropdown({
displayName: 'Products',
required: true,
description: 'Products eligible for a discount.',
options: {
disabled: false,
options: res.data.map((product) => {
return {
label: product.name,
value: product._id,
};
}),
},
});
break;
}
case DiscountFilterType.ALL_PRODUCTS: {
fields['values'] = [];
break;
}
}
return fields;
},
}),
type: Property.StaticDropdown({
displayName: 'Discount',
required: true,
options: {
disabled: false,
options: Object.values(DiscountValueType).map((value) => {
return {
label: value.toLowerCase(),
value: value,
};
}),
},
}),
value: Property.ShortText({
displayName: 'Discount Value',
required: true,
}),
is_enabled: Property.Checkbox({
displayName: 'Enabled ?',
required: true,
defaultValue: true,
}),
is_visible: Property.Checkbox({
displayName: 'Visibility',
required: true,
defaultValue: true,
}),
},
async run(context) {
const {
title,
start_date,
end_date,
filter_type,
selectedFilterValues,
type,
value,
is_enabled,
is_visible,
} = context.propsValue;
const input: ProductDiscountInput = {
discount_method: DiscountMethod.ITEM_LEVEL,
title,
start_date,
end_date,
filter_type,
type,
value,
is_enabled,
is_visible,
};
if (filter_type === DiscountFilterType.CATEGORIES) {
input.selectedCategories = selectedFilterValues['values'];
} else if (filter_type === DiscountFilterType.PRODUCTS) {
input.selectedProducts = selectedFilterValues['values'];
}
const client = makeClient(context.auth);
return await client.createProductDiscount(input);
},
});

View File

@@ -0,0 +1,189 @@
import {
DynamicPropsValue,
Property,
createAction,
} from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient } from '../../common';
import {
DiscountFilterType,
DiscountMethod,
DiscountValueType,
} from '../../common/constants';
import { ProductDiscountInput } from '../../common/types';
export const createPromoCodeAction = createAction({
auth: quickzuAuth,
name: 'quickzu_create_promo_code',
displayName: 'Create Promo/Coupon Code',
description: 'Creates a new promo code for category or product level.',
props: {
title: Property.ShortText({
displayName: 'Promotion / Discount Title',
required: true,
}),
start_date: Property.DateTime({
displayName: 'Valid From',
description: 'Please use YYYY-MM-DD format.',
required: true,
}),
end_date: Property.DateTime({
displayName: 'Valid To',
description: 'Please use YYYY-MM-DD format.',
required: true,
}),
filter_type: Property.StaticDropdown({
displayName: 'Filter',
description: 'Choose what gets discount (products/categories).',
required: true,
options: {
disabled: false,
options: Object.values(DiscountFilterType).map((value) => {
return {
label: value.toLowerCase(),
value: value,
};
}),
},
}),
selectedFilterValues: Property.DynamicProperties({
auth: quickzuAuth,
displayName: 'Select Option',
refreshers: ['filter_type'],
required: true,
props: async ({ auth, filter_type }) => {
if (!auth) return {};
if (!filter_type) return {};
const fields: DynamicPropsValue = {};
const discountFilterType = filter_type as unknown as DiscountFilterType;
const client = makeClient(auth);
switch (discountFilterType) {
case DiscountFilterType.CATEGORIES: {
const res = await client.listCategories();
fields['values'] = Property.StaticMultiSelectDropdown({
displayName: 'Categories',
required: true,
description: 'Categories eligible for a discount.',
options: {
disabled: false,
options: res.data.map((category) => {
return {
label: category.name,
value: category._id,
};
}),
},
});
break;
}
case DiscountFilterType.PRODUCTS: {
const res = await client.listProducts();
fields['values'] = Property.StaticMultiSelectDropdown({
displayName: 'Products',
required: true,
description: 'Products eligible for a discount.',
options: {
disabled: false,
options: res.data.map((product) => {
return {
label: product.name,
value: product._id,
};
}),
},
});
break;
}
case DiscountFilterType.ALL_PRODUCTS: {
fields['values'] = [];
break;
}
}
return fields;
},
}),
promo_code: Property.ShortText({
displayName: 'Promo Code',
required: true,
}),
minimum_cart_value: Property.Number({
displayName: 'Minimum Order Amount',
required: true,
}),
max_users_limit: Property.Number({
displayName: 'Maximum Promo Code Limit',
required: true,
}),
type: Property.StaticDropdown({
displayName: 'Discount',
required: true,
options: {
disabled: false,
options: Object.values(DiscountValueType)
.filter((value) => value !== DiscountValueType.FIXED_PRICE)
.map((value) => {
return {
label: value.toLowerCase(),
value: value,
};
}),
},
}),
value: Property.ShortText({
displayName: 'Discount Value',
required: true,
}),
is_enabled: Property.Checkbox({
displayName: 'Enabled ?',
required: true,
defaultValue: true,
}),
is_visible: Property.Checkbox({
displayName: 'Visibility',
required: true,
defaultValue: true,
}),
},
async run(context) {
const {
title,
start_date,
end_date,
filter_type,
selectedFilterValues,
type,
promo_code,
max_users_limit,
minimum_cart_value,
value,
is_enabled,
is_visible,
} = context.propsValue;
const input: ProductDiscountInput = {
discount_method: DiscountMethod.SUB_TOTAL,
title,
start_date,
end_date,
filter_type,
max_users_limit,
minimum_cart_value,
promo_code,
type,
value,
is_enabled,
is_visible,
};
if (filter_type === DiscountFilterType.CATEGORIES) {
input.selectedCategories = selectedFilterValues['values'];
} else if (filter_type === DiscountFilterType.PRODUCTS) {
input.selectedProducts = selectedFilterValues['values'];
}
const client = makeClient(context.auth);
return await client.createProductDiscount(input);
},
});

View File

@@ -0,0 +1,19 @@
import { createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
export const getOrderDetailsAction = createAction({
auth: quickzuAuth,
name: 'quickzu_get_order_details',
displayName: 'Get Order Details',
description: 'Retrieves order details from store.',
props: {
orderId: quickzuCommon.orderId(true),
},
async run(context) {
const { orderId } = context.propsValue;
const client = makeClient(context.auth);
return await client.getOrderDetails(orderId!);
},
});

View File

@@ -0,0 +1,24 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient } from '../../common';
export const listLiveOrdersAction = createAction({
auth: quickzuAuth,
name: 'quickzu_list_live_orders',
displayName: 'List Live Orders',
description: 'Retrieves live orders of store.',
props: {
limit: Property.Number({
displayName:
'Number of live orders that need to be fetched per order status',
required: true,
defaultValue: 15,
}),
},
async run(context) {
const { limit } = context.propsValue;
const client = makeClient(context.auth);
return await client.listLiveOrders(limit);
},
});

View File

@@ -0,0 +1,28 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient } from '../../common';
export const listOrdersAction = createAction({
auth: quickzuAuth,
name: 'quickzu_list_orders',
displayName: 'List Orders',
description: 'Retrieves orders of store.',
props: {
page: Property.Number({
displayName: 'Current page number',
required: true,
defaultValue: 1,
}),
limit: Property.Number({
displayName: 'Number of orders per page',
required: true,
defaultValue: 20,
}),
},
async run(context) {
const { page, limit } = context.propsValue;
const client = makeClient(context.auth);
return await client.listOrders(page, limit);
},
});

View File

@@ -0,0 +1,33 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
import { OrderStatus } from '../../common/constants';
export const updateOrderStatusAction = createAction({
auth: quickzuAuth,
name: 'quickzu_update_order_status',
displayName: 'Update Order Status',
description: 'Updates status of order in store.',
props: {
orderId: quickzuCommon.orderId(true),
status: Property.StaticDropdown({
displayName: 'Order Status',
required: true,
options: {
disabled: false,
options: Object.values(OrderStatus).map((value) => {
return {
label: value,
value: value,
};
}),
},
}),
},
async run(context) {
const { orderId, status } = context.propsValue;
const client = makeClient(context.auth);
return await client.updateOrderStatus(orderId!, status);
},
});

View File

@@ -0,0 +1,104 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
import { ProductUnit } from '../../common/constants';
export const addProductAction = createAction({
auth: quickzuAuth,
name: 'quickzu_add_product',
displayName: 'Add Product',
description: 'Adds new product to store.',
props: {
name: Property.ShortText({
displayName: 'Name',
required: true,
}),
desc: Property.LongText({
displayName: 'Description',
required: false,
}),
categoryId: quickzuCommon.categoryId(true),
mrp: Property.Number({
displayName: 'MRP Price',
required: true,
}),
price: Property.Number({
displayName: 'Selling Price',
required: false,
description: 'Selling price should be equal or less than MRP.',
}),
unit: Property.StaticDropdown({
displayName: 'Unit',
required: true,
defaultValue: 'kilogram',
options: {
disabled: false,
options: Object.values(ProductUnit).map((val) => {
return {
label: val,
value: val,
};
}),
},
}),
value_per_unit: Property.Number({
displayName: 'Unit Value',
required: true,
defaultValue: 1,
}),
availability: Property.Checkbox({
displayName: 'Availability',
required: true,
defaultValue: true,
}),
exclude_tax: Property.Checkbox({
displayName: 'Exclude Tax',
required: true,
defaultValue: false,
}),
enable_variants: Property.Checkbox({
displayName: 'Enable Variants',
required: true,
defaultValue: false,
}),
status: Property.Checkbox({
displayName: 'Status',
required: true,
defaultValue: true,
}),
},
async run(context) {
const {
name,
desc,
categoryId,
mrp,
price,
unit,
value_per_unit,
availability,
exclude_tax,
enable_variants,
status,
} = context.propsValue;
const client = makeClient(context.auth);
return await client.createProduct({
name,
desc,
category: categoryId!,
mrp,
price,
unit,
value_per_unit,
availability,
exclude_tax,
enable_variants,
status,
meta: {
nonveg: false,
},
});
},
});

View File

@@ -0,0 +1,19 @@
import { createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
export const deleteProductAction = createAction({
auth: quickzuAuth,
name: 'quickzu_delete_product',
displayName: 'Delete Product',
description: 'Deletes an existing product from store.',
props: {
productId: quickzuCommon.productId(true),
},
async run(context) {
const { productId } = context.propsValue;
const client = makeClient(context.auth);
return await client.deleteProduct(productId!);
},
});

View File

@@ -0,0 +1,23 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
export const listProductsAction = createAction({
auth: quickzuAuth,
name: 'quickzu_list_products',
displayName: 'List Products',
description: 'Retrieves all or single product details from store.',
props: {
term: Property.ShortText({
displayName: 'Product name that need to be search.',
required: false,
}),
categoryId: quickzuCommon.categoryId(false),
},
async run(context) {
const { term, categoryId } = context.propsValue;
const client = makeClient(context.auth);
return await client.listProducts(term, categoryId);
},
});

View File

@@ -0,0 +1,100 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../..';
import { makeClient, quickzuCommon } from '../../common';
import { ProductUnit } from '../../common/constants';
export const updateProductAction = createAction({
auth: quickzuAuth,
name: 'quickzu_update_product',
displayName: 'Update Product',
description: 'Updates an existing product in store.',
props: {
productId: quickzuCommon.productId(true),
name: Property.ShortText({
displayName: 'Name',
required: false,
}),
desc: Property.LongText({
displayName: 'Description',
required: false,
}),
categoryId: quickzuCommon.categoryId(false),
mrp: Property.Number({
displayName: 'MRP Price',
required: false,
}),
price: Property.Number({
displayName: 'Selling Price',
required: false,
description: 'Selling price should be equal or less than MRP.',
}),
unit: Property.StaticDropdown({
displayName: 'Unit',
required: false,
options: {
disabled: false,
options: Object.values(ProductUnit).map((val) => {
return {
label: val,
value: val,
};
}),
},
}),
value_per_unit: Property.Number({
displayName: 'Unit Value',
required: false,
}),
availability: Property.Checkbox({
displayName: 'Availability',
required: false,
}),
exclude_tax: Property.Checkbox({
displayName: 'Exclude Tax',
required: false,
}),
enable_variants: Property.Checkbox({
displayName: 'Enable Variants',
required: false,
}),
status: Property.Checkbox({
displayName: 'Status',
required: false,
}),
},
async run(context) {
const {
name,
productId,
desc,
categoryId,
mrp,
price,
unit,
value_per_unit,
availability,
exclude_tax,
enable_variants,
status,
} = context.propsValue;
const client = makeClient(context.auth);
return await client.updateProduct(productId!, {
name,
desc,
category: categoryId!,
mrp,
price,
unit,
value_per_unit,
availability,
exclude_tax,
enable_variants,
status,
meta: {
nonveg: false,
},
});
},
});

View File

@@ -0,0 +1,182 @@
import {
HttpMessageBody,
HttpMethod,
QueryParams,
httpClient,
} from '@activepieces/pieces-common';
import { OrderStatus } from './constants';
import {
BusinessTimingInput,
Category,
CategoryInput,
ListAPIResponse,
Product,
ProductDiscountInput,
ProductInput,
} from './types';
function emptyValueFilter(
accessor: (key: string) => any
): (key: string) => boolean {
return (key: string) => {
const val = accessor(key);
return (
val !== null &&
val !== undefined &&
(typeof val != 'string' || val.length > 0)
);
};
}
export function prepareQuery(request?: Record<string, any>): QueryParams {
const params: QueryParams = {};
if (!request) return params;
Object.keys(request)
.filter(emptyValueFilter((k) => request[k]))
.forEach((k: string) => {
params[k] = (request as Record<string, any>)[k].toString();
});
return params;
}
export class QuickzuAPIClient {
constructor(private apiToken: string) {}
async makeRequest<T extends HttpMessageBody = any>(
method: HttpMethod,
resourceUri: string,
query?: QueryParams,
body: any | undefined = undefined
): Promise<T> {
// const baseUrl = this.apiTableUrl.replace(/\/$/, '');
const res = await httpClient.sendRequest<any>({
method: method,
url: `https://app.quickzu.com/api` + resourceUri,
headers: {
Authorization: this.apiToken,
},
queryParams: query,
body: body,
});
return res.body;
}
async createCategory(categoryInput: CategoryInput) {
return await this.makeRequest(
HttpMethod.POST,
'/seller/categories/',
undefined,
categoryInput
);
}
async updateCategory(
categoryId: string,
categoryInput: Partial<CategoryInput>
) {
return await this.makeRequest(
HttpMethod.PUT,
`/seller/categories/${categoryId}`,
undefined,
categoryInput
);
}
async deleteCategory(categoryId: string) {
return await this.makeRequest(
HttpMethod.DELETE,
`/seller/categories/${categoryId}`
);
}
async listCategories(term?: string): Promise<ListAPIResponse<Category>> {
return await this.makeRequest<ListAPIResponse<Category>>(
HttpMethod.GET,
'/seller/categories',
prepareQuery({
term: term,
})
);
}
async createProduct(productInput: ProductInput) {
return await this.makeRequest(
HttpMethod.POST,
'/seller/products',
undefined,
productInput
);
}
async updateProduct(productId: string, productInput: Partial<ProductInput>) {
return await this.makeRequest(
HttpMethod.PUT,
`/seller/products/${productId}`,
undefined,
productInput
);
}
async deleteProduct(productId: string) {
return await this.makeRequest(
HttpMethod.DELETE,
`/seller/products/${productId}`
);
}
async listProducts(
term?: string,
categoryId?: string
): Promise<ListAPIResponse<Product>> {
return await this.makeRequest<ListAPIResponse<Product>>(
HttpMethod.GET,
'/seller/products',
prepareQuery({
term: term,
category: categoryId,
})
);
}
async getOrderDetails(orderId: string) {
return await this.makeRequest(HttpMethod.GET, `/seller/orders/${orderId}`);
}
async updateOrderStatus(orderId: string, status: OrderStatus) {
return await this.makeRequest(
HttpMethod.PUT,
`/seller/orders/${orderId}`,
undefined,
{
status: status,
}
);
}
async listOrders(page: number, limit: number) {
return await this.makeRequest(
HttpMethod.GET,
'/seller/orders/',
prepareQuery({ page: page, limit: limit })
);
}
async listLiveOrders(limit: number) {
return await this.makeRequest(
HttpMethod.GET,
'/seller/orders/live',
prepareQuery({ limit: limit })
);
}
async createProductDiscount(discountInput: ProductDiscountInput) {
return await this.makeRequest(
HttpMethod.POST,
'/seller/discounts',
undefined,
discountInput
);
}
async createPromoCode(promocodeInput: ProductDiscountInput) {
return await this.makeRequest(
HttpMethod.POST,
'/seller/discounts',
undefined,
promocodeInput
);
}
async updateBusinessTime(timingInput: BusinessTimingInput) {
return await this.makeRequest(
HttpMethod.PUT,
'/seller/settings',
undefined,
timingInput
);
}
}

View File

@@ -0,0 +1,48 @@
export enum OrderStatus {
PENDING = 'pending',
PAID = 'paid',
ACCEPTED = 'accepted',
CANCELLED = 'cancelled',
DONE = 'done',
}
export enum DiscountFilterType {
PRODUCTS = 'PRODUCTS',
CATEGORIES = 'CATEGORIES',
ALL_PRODUCTS = 'ALL_PRODUCTS',
}
export enum DiscountValueType {
PERCENTAGE = 'PERCENTAGE',
FLAT = 'FLAT',
FIXED_PRICE = 'FIXED_PRICE',
}
export enum DiscountMethod {
ITEM_LEVEL = 'ITEM_LEVEL',
SUB_TOTAL = 'SUB_TOTAL',
}
export enum ProductUnit {
PIECE = 'piece',
KILOGRAM = 'kilogram',
GRAM = 'Gram',
POUND = 'pound',
LITRE = 'litre',
MILI_LITRE = 'mili litre',
DOZEN = 'dozen',
FEET = 'feet',
METER = 'meter',
SQUARE_FEET = 'square feet',
SQUARE_METER = 'square meter',
SET = 'set',
HOUR = 'hour',
DAY = 'day',
SERVICE = 'service',
COMBO = 'combo',
BOX = 'box',
PACK = 'pack',
BOTTLE = 'bottle',
WHOLE = 'whole',
SLICE = 'slice',
BULK = 'bulk',
}

View File

@@ -0,0 +1,97 @@
import { AppConnectionValueForAuthProperty, PiecePropValueSchema, Property } from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../';
import { QuickzuAPIClient } from './client';
export function makeClient(auth: AppConnectionValueForAuthProperty<typeof quickzuAuth>) {
const client = new QuickzuAPIClient(auth.secret_text);
return client;
}
export const quickzuCommon = {
categoryId: (required = false) =>
Property.Dropdown({
auth: quickzuAuth,
displayName: 'Category',
refreshers: [],
required,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first.',
};
}
const client = makeClient(auth);
const res = await client.listCategories();
return {
disabled: false,
options: res.data.map((category) => {
return {
label: category.name,
value: category._id,
};
}),
};
},
}),
productId: (required = false) =>
Property.Dropdown({
auth: quickzuAuth,
displayName: 'Product',
refreshers: [],
required,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first.',
};
}
const client = makeClient(auth);
const res = await client.listProducts();
return {
disabled: false,
options: res.data.map((product) => {
return {
label: product.name,
value: product._id,
};
}),
};
},
}),
orderId: (required = false) =>
Property.Dropdown<string,boolean,typeof quickzuAuth>({
auth: quickzuAuth,
displayName: 'Order',
refreshers: [],
required,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first.',
};
}
const client = makeClient(auth);
const res = await client.listOrders(1, 20);
return {
disabled: false,
options: res['data'].map(
(order: { _id: string; order_id: number }) => {
return {
label: order.order_id.toString(),
value: order._id,
};
}
),
};
},
}),
};

View File

@@ -0,0 +1,92 @@
import {
DiscountFilterType,
DiscountMethod,
DiscountValueType,
} from './constants';
export type ListAPIResponse<T> = {
data: Array<T>;
total: number;
success: boolean;
};
export type Category = {
status: boolean;
index: number;
_id: string;
name: string;
shop: string;
__v: number;
};
export type CategoryInput = {
name: string;
status: boolean;
};
export type Product = {
desc: string;
value_per_unit: number;
status: boolean;
availability: boolean;
enable_variants: boolean;
stock_enabled: boolean;
available_stock: number;
sku: string;
exclude_tax: boolean;
index: number;
_id: string;
name: string;
mrp: number;
price: number;
category: Pick<Category, '_id' | 'name'>;
unit: string;
meta: { nonveg: boolean };
picture: string;
shop: string;
__v: number;
picture_thumb: string;
id: string;
};
export type ProductInput = {
name: string;
desc?: string;
value_per_unit: number;
status: boolean;
availability: boolean;
enable_variants: boolean;
exclude_tax: boolean;
mrp: number;
price?: number;
category: string;
unit: string;
meta: { nonveg: boolean };
};
export type ProductDiscountInput = {
discount_method: DiscountMethod;
filter_type: DiscountFilterType;
is_enabled: boolean;
is_visible: boolean;
start_date: string;
end_date: string;
max_users_limit?: number;
minimum_cart_value?: number;
selectedCategories?: string[];
selectedProducts?: string[];
promo_code?: string;
title: string;
type: DiscountValueType;
value: string;
};
export type BusinessTimingInput = {
timing: {
[key: string]: {
status: boolean;
start: string;
end: string;
};
};
};

View File

@@ -0,0 +1,253 @@
import {
Property,
TriggerStrategy,
createTrigger,
} from '@activepieces/pieces-framework';
import { quickzuAuth } from '../../';
import { WebhookHandshakeStrategy } from '@activepieces/shared';
const markdown = `
- Go to the **Settings->API and Webhooks** section.
- In the webhook settings, paste this URL:
\`{{webhookUrl}}\`
- Click on **Save**.
`;
const sampleData = {
payload: {
id: '65cc96cfcf7028f638e20b0c',
data: {
id: '65cc96cfcf7028f638e20b0c',
__v: 0,
_id: '65cc96cfcf7028f638e20b0c',
area: '63862620938a5552a9e6b',
shop: '5fbe833cef26b83b8b7c3',
status: 'pending',
currency: 'INR',
customer: {
phone: '9039101337',
address: 'okay mumbai',
full_name: 'Mohit',
},
order_id: 233312,
products: [
{
id: '65cc96cfcf70280fbde20b0d',
_id: '65cc96cfcf70280fbde20b0d',
qty: 1,
addon: [],
amount: 10,
product: {
id: '5fbe8677ef26b83b8f53b7cf',
__v: 0,
_id: '5fbe8677ef26b83b8f53b7cf',
mrp: 10,
sku: '',
desc: '',
meta: { nonveg: false },
name: 'Shrewsbury Cookies',
shop: '5fbe833cef26b8f53b7c3',
unit: 'gram',
index: 0,
price: 10,
addons: [],
status: true,
options: [],
category: '5fbe83acef26bb8f53b7c7',
variants: [],
exclude_tax: false,
availability: true,
stock_enabled: false,
value_per_unit: 200,
available_stock: -1,
enable_variants: true,
},
variant: [],
createdAt: '2024-02-14T10:32:47.953Z',
updatedAt: '2024-02-14T10:32:47.953Z',
},
],
coupon_id: '',
createdAt: '2024-02-14T10:32:47.953Z',
sub_total: 29,
updatedAt: '2024-02-14T10:32:47.953Z',
order_type: 'delivery',
coupon_code: '',
instruction: 'spicy food',
payment_mode: 'paylater',
taxes_amount: 2.9,
total_amount: '31.90',
currency_data: {
code: 'INR',
name: 'Indian Rupee',
symbol: 'Rs',
rounding: 0,
name_plural: 'Indian rupees',
symbol_native: '₹',
decimal_digits: 2,
},
payment_status: 'unpaid',
transaction_id: '',
delivery_charges: 0,
stripe_session_id: '',
subtotal_discount: 0,
item_level_discount: 0,
razorpay_session_id: '',
},
shop: {
id: '5fbe833c6b83b8f53b7c3',
__v: 0,
_id: '5fbe833c6b83b8f53b7c3',
css: '',
apps: { analytics: '' },
desc: 'pastries, sandwiches, cake',
name: 'Classic Cakes',
alias: 'ccake',
header: '',
timing: {
'0': { end: '23:59', start: '00:00', status: true },
'1': { end: '23:59', start: '00:00', status: false },
'2': { end: '23:59', start: '00:00', status: true },
'3': { end: '23:59', start: '00:00', status: true },
'4': { end: '23:59', start: '00:00', status: true },
'5': { end: '23:59', start: '00:00', status: true },
'6': { end: '23:59', start: '00:00', status: true },
createdAt: '2024-01-13T17:54:46.861Z',
updatedAt: '2024-01-13T17:54:46.861Z',
},
address: '78 Washington St, Hoboken',
country: 'IN',
dine_in: true,
domains: [],
message: {},
pick_up: true,
category: 'restaurant',
currency: 'INR',
delivery: {
cost: 0,
free: 0,
status: true,
min_order: 0,
is_free_delivery: true,
},
language: 'en',
template: 'five',
createdAt: '2020-11-25T16:15:56.049Z',
is_closed: false,
seller_id: {
id: '5fbe8101ef26b83b8f53b7c1',
__v: 0,
_id: '5fbe8101ef26b83b8f53b7c1',
email: 'focix@getnada.com',
language: 'en-us',
createdAt: '2020-11-25T16:06:25.546Z',
full_name: 'focix',
updatedAt: '2023-07-01T14:02:27.589Z',
account_type: 'seller',
is_email_verified: true,
},
updatedAt: '2024-01-29T10:22:46.775Z',
is_blocked: false,
receive_on: 'whatsapp',
appointment: false,
is_onlymenu: false,
payment_inst: 'Pay Offline via UPI/CASH etc',
currency_data: {
code: 'INR',
name: 'Indian Rupee',
symbol: 'Rs',
rounding: 0,
name_plural: 'Indian rupees',
symbol_native: '₹',
decimal_digits: 2,
},
payment_modes: {
stripe: {
logo: '/public/assets/imgs/stripe.svg',
name: 'stripe',
enabled: true,
test_mode: true,
description: '',
display_name: 'Stripe',
},
razorpay: {
logo: '/public/assets/imgs/razorpay.svg',
name: 'razorpay',
key_id: 'as',
enabled: false,
test_mode: false,
secret_key: 'da',
description: '',
test_key_id: '',
display_name: 'Razorpay',
test_secret_key: '',
},
},
use_area_list: true,
is_maintenance: false,
manual_payments: true,
payment_inst_title: 'Pay Later',
term_condition_text: 'Bhgghhhbsbsbbsbnzja bhbb',
condition_option_enabled: true,
invoice_footer_thankyou_msg: '',
},
text: "Hi, I'd like to place an order",
overiew: {
TAXES: 'INR 2.90',
TOTAL: 'INR 31.90',
DELIVERY: 'INR 0.00',
SUB_TOTAL: 'INR 29.00',
ORDER_TYPE: 'Delivery',
STORE_LINK: 'ccake.quickzu.com',
STORE_NAME: 'Classic Cakes',
PICKUP_TIME: '',
ORDER_NUMBER: 233312,
TABLE_NUMBER: '',
CUSTOMER_NAME: 'Mohit',
CUSTOMER_PHONE: '9039101337',
PAYMENT_METHOD: 'PAYLATER',
APPOINTMENT_TIME: '',
CUSTOMER_ADDRESS: 'okay mumbai',
ORDER_INSTRUCTION: 'spicy food',
SUBTOTAL_DISCOUNT: 'INR 0.00',
ITEM_LEVEL_DISCOUNT: 'INR 0.00',
PAYMENT_INSTRUCTION: '\nPay Offline via UPI/CASH etc',
},
hyperlink: '',
total_amount: '31.90',
},
resource: 'order',
operation: 'create',
};
export const orderCreatedTrigger = createTrigger({
auth: quickzuAuth,
name: 'quickzu_order_created_trigger',
displayName: 'Order Created/Updated',
description:
'Triggers when a new order is created or a order status is changed in store.',
type: TriggerStrategy.WEBHOOK,
sampleData: sampleData,
props: {
md: Property.MarkDown({
value: markdown,
}),
},
async onEnable(context) {
// Empty
},
async onDisable(context) {
// Empty
},
async run(context) {
return [context.payload];
},
handshakeConfiguration: {
strategy: WebhookHandshakeStrategy.BODY_PARAM_PRESENT,
paramName: 'test',
},
async onHandshake(context) {
return {
status: 200,
body: {},
};
},
});

View File

@@ -0,0 +1,19 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}