@fayz-ai/plugin-orders 0.9.2 → 0.10.0
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +259 -5
- package/dist/index.js.map +1 -1
- package/dist/integrations/99food/connectorDef.d.ts +5 -0
- package/dist/integrations/99food/connectorDef.d.ts.map +1 -0
- package/dist/integrations/ifood/connectorDef.d.ts +5 -0
- package/dist/integrations/ifood/connectorDef.d.ts.map +1 -0
- package/dist/integrations/index.d.ts +5 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/keeta/connectorDef.d.ts +5 -0
- package/dist/integrations/keeta/connectorDef.d.ts.map +1 -0
- package/dist/integrations/shared.d.ts +7 -0
- package/dist/integrations/shared.d.ts.map +1 -0
- package/package.json +11 -9
package/dist/index.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export interface OrdersPluginOptions {
|
|
|
35
35
|
orderSources?: OrderSourceOption[];
|
|
36
36
|
}
|
|
37
37
|
export declare function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest;
|
|
38
|
+
export * from './integrations';
|
|
38
39
|
export type { OrdersDataProvider } from './data/types';
|
|
39
40
|
export { createFayzOrdersProvider } from './data/platform';
|
|
40
41
|
export type { FayzOrdersProviderOptions } from './data/platform';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAgB9C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAeD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAWD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB,CAAA;IACD,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACpC,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;IACjC,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,cAAc,CAAC,EAAE,YAAY,CAAA;IAC7B,WAAW,CAAC,EAAE,YAAY,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5D,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAA;CACnC;AAyBD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,cAAc,CAgIhF;AAED,cAAc,gBAAgB,CAAA;AAE9B,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { getNextStatus, STATUS_FLOW } from './chunk-LUFSNZYT.js';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { createStore } from 'zustand/vanilla';
|
|
4
|
-
import { PluginSettingsPanel, dedup } from '@fayz-ai/admin';
|
|
4
|
+
import { fayzConnectorOAuth, PluginSettingsPanel, dedup } from '@fayz-ai/admin';
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
|
+
import { createConnectionStore, connectionRuns, connectionSettings, connectionStatus, settingsStatus } from '@fayz-ai/core';
|
|
6
7
|
import { createFayzClient } from '@fayz-ai/sdk';
|
|
7
8
|
|
|
8
9
|
// src/data/mock.ts
|
|
@@ -680,6 +681,256 @@ var ptBR = {
|
|
|
680
681
|
|
|
681
682
|
// src/locales/index.ts
|
|
682
683
|
var ordersLocales = { en, "pt-BR": ptBR };
|
|
684
|
+
|
|
685
|
+
// src/integrations/shared.ts
|
|
686
|
+
function marketplacePermissions(provider) {
|
|
687
|
+
return [
|
|
688
|
+
{
|
|
689
|
+
kind: "data",
|
|
690
|
+
resource: "order",
|
|
691
|
+
actions: ["read", "write"],
|
|
692
|
+
reason: `Trazer para c\xE1 cada pedido feito no ${provider} \u2014 itens, observa\xE7\xF5es, forma de pagamento e o total \u2014 e ler o pedido de volta para avisar o ${provider} quando ele for confirmado, sair para entrega ou for cancelado.`,
|
|
693
|
+
sensitive: true
|
|
694
|
+
},
|
|
695
|
+
{
|
|
696
|
+
kind: "data",
|
|
697
|
+
resource: "menu_item",
|
|
698
|
+
actions: ["read"],
|
|
699
|
+
reason: `Descobrir qual item do seu card\xE1pio corresponde ao que foi vendido no ${provider}. Nenhum item \xE9 alterado.`
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
kind: "data",
|
|
703
|
+
resource: "customer",
|
|
704
|
+
actions: ["write"],
|
|
705
|
+
reason: `Registrar quem pediu, com o nome, o telefone e o endere\xE7o que o ${provider} envia junto do pedido.`,
|
|
706
|
+
sensitive: true
|
|
707
|
+
}
|
|
708
|
+
];
|
|
709
|
+
}
|
|
710
|
+
var AUTO_ACCEPT_SETTING = {
|
|
711
|
+
key: "autoAccept",
|
|
712
|
+
label: "Confirmar o pedido automaticamente",
|
|
713
|
+
description: "Ligado, o pedido j\xE1 entra confirmado. Desligado, ele espera algu\xE9m aceitar na tela de Pedidos.",
|
|
714
|
+
type: "toggle",
|
|
715
|
+
defaultValue: false
|
|
716
|
+
};
|
|
717
|
+
var PREP_TIME_SETTING = {
|
|
718
|
+
key: "prepTimeMinutes",
|
|
719
|
+
label: "Tempo de preparo",
|
|
720
|
+
description: "Quantos minutos s\xE3o informados ao aplicativo quando o pedido \xE9 confirmado.",
|
|
721
|
+
type: "text",
|
|
722
|
+
// 5–120: outside that the providers refuse, and the first order is a bad place to find out.
|
|
723
|
+
pattern: "[5-9]|[1-9]\\d|1[01]\\d|120",
|
|
724
|
+
patternHint: "De 5 a 120 minutos.",
|
|
725
|
+
placeholder: "30",
|
|
726
|
+
defaultValue: "30"
|
|
727
|
+
};
|
|
728
|
+
function serviceModesDetail(labels, value) {
|
|
729
|
+
const list = Array.isArray(value) ? value : typeof value === "string" ? value.split(",") : [];
|
|
730
|
+
const named = list.map((v) => labels[String(v).trim()] ?? String(v).trim()).filter(Boolean);
|
|
731
|
+
return named.length > 0 ? named.join(", ") : void 0;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
// src/integrations/ifood/connectorDef.tsx
|
|
735
|
+
var IFOOD_CONNECTOR_ID = "ifood";
|
|
736
|
+
var ORDER_TYPE_LABELS = {
|
|
737
|
+
DELIVERY: "Entrega",
|
|
738
|
+
TAKEOUT: "Retirada",
|
|
739
|
+
INDOOR: "Consumo no local"
|
|
740
|
+
};
|
|
741
|
+
var IFOOD_SETTINGS = [
|
|
742
|
+
{
|
|
743
|
+
key: "orderTypes",
|
|
744
|
+
label: "Quais pedidos trazer",
|
|
745
|
+
description: "iFood entrega, deixa retirar e atende no sal\xE3o; estes s\xE3o os que viram pedido aqui.",
|
|
746
|
+
type: "multi-select",
|
|
747
|
+
options: [
|
|
748
|
+
{ value: "DELIVERY", label: ORDER_TYPE_LABELS.DELIVERY },
|
|
749
|
+
{ value: "TAKEOUT", label: ORDER_TYPE_LABELS.TAKEOUT },
|
|
750
|
+
{ value: "INDOOR", label: ORDER_TYPE_LABELS.INDOOR }
|
|
751
|
+
],
|
|
752
|
+
// Required to OPERATE, not to connect: nothing selected reads as "conectado, falta configurar".
|
|
753
|
+
requiredToOperate: true,
|
|
754
|
+
defaultValue: ["DELIVERY", "TAKEOUT"]
|
|
755
|
+
},
|
|
756
|
+
AUTO_ACCEPT_SETTING,
|
|
757
|
+
PREP_TIME_SETTING
|
|
758
|
+
];
|
|
759
|
+
var store = createConnectionStore(IFOOD_CONNECTOR_ID, {
|
|
760
|
+
settings: IFOOD_SETTINGS,
|
|
761
|
+
settingsKeys: ["merchantId"]
|
|
762
|
+
});
|
|
763
|
+
var ifoodConnectorDef = {
|
|
764
|
+
id: IFOOD_CONNECTOR_ID,
|
|
765
|
+
hostPluginId: "orders",
|
|
766
|
+
name: "iFood",
|
|
767
|
+
description: "Traga para a cozinha cada pedido feito no iFood, e avise o iFood quando ele for confirmado e sair.",
|
|
768
|
+
icon: "Bike",
|
|
769
|
+
category: "marketplace",
|
|
770
|
+
authKind: "oauth",
|
|
771
|
+
direction: "inbound",
|
|
772
|
+
planes: ["sync"],
|
|
773
|
+
docsUrl: "https://developer.ifood.com.br/pt-BR/docs/guides/modules/order/workflow/",
|
|
774
|
+
// A ceiling for the scheduler, not the cadence: iFood asks for one poll every 30s.
|
|
775
|
+
rateLimit: { perSecond: 1 },
|
|
776
|
+
permissions: marketplacePermissions("iFood"),
|
|
777
|
+
// No form. The client pair is OURS, held by the platform, and the restaurant
|
|
778
|
+
// authorizes on iFood's own screen — it never sees a credential of ours.
|
|
779
|
+
fields: [],
|
|
780
|
+
settings: IFOOD_SETTINGS,
|
|
781
|
+
howItSyncs: [
|
|
782
|
+
"A liga\xE7\xE3o com o iFood \xE9 lida de tempos em tempos e cada pedido novo entra na tela de Pedidos.",
|
|
783
|
+
"Um pedido j\xE1 trazido n\xE3o entra duas vezes: ele guarda o n\xFAmero que tem no iFood.",
|
|
784
|
+
"Confirmar, despachar ou cancelar aqui \xE9 o que avisa o iFood \u2014 o cliente acompanha pelo aplicativo dele."
|
|
785
|
+
],
|
|
786
|
+
...connectionStatus(
|
|
787
|
+
IFOOD_CONNECTOR_ID,
|
|
788
|
+
(connection) => ({
|
|
789
|
+
connected: !!connection?.active,
|
|
790
|
+
detail: serviceModesDetail(ORDER_TYPE_LABELS, connection?.settings?.orderTypes),
|
|
791
|
+
plane: "sync",
|
|
792
|
+
...settingsStatus(IFOOD_SETTINGS, connection)
|
|
793
|
+
}),
|
|
794
|
+
{ store: () => store }
|
|
795
|
+
),
|
|
796
|
+
...connectionSettings(store),
|
|
797
|
+
...connectionRuns(store),
|
|
798
|
+
startOAuth: fayzConnectorOAuth(IFOOD_CONNECTOR_ID),
|
|
799
|
+
// Runs on the way back, to say the account is linked. No values: the grant is
|
|
800
|
+
// the platform's and there is nothing configured yet.
|
|
801
|
+
saveConnection: async () => {
|
|
802
|
+
await store.save({ active: true });
|
|
803
|
+
},
|
|
804
|
+
disconnect: () => store.disconnect(),
|
|
805
|
+
disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
|
|
806
|
+
};
|
|
807
|
+
var NINETY_NINE_FOOD_CONNECTOR_ID = "99food";
|
|
808
|
+
var SERVICE_MODE_LABELS = { DELIVERY: "Entrega", PICKUP: "Retirada" };
|
|
809
|
+
var NINETY_NINE_FOOD_SETTINGS = [
|
|
810
|
+
{
|
|
811
|
+
key: "serviceModes",
|
|
812
|
+
label: "Quais pedidos trazer",
|
|
813
|
+
description: "99Food entrega e deixa retirar; estes s\xE3o os que viram pedido aqui.",
|
|
814
|
+
type: "multi-select",
|
|
815
|
+
options: [
|
|
816
|
+
{ value: "DELIVERY", label: SERVICE_MODE_LABELS.DELIVERY },
|
|
817
|
+
{ value: "PICKUP", label: SERVICE_MODE_LABELS.PICKUP }
|
|
818
|
+
],
|
|
819
|
+
requiredToOperate: true,
|
|
820
|
+
defaultValue: ["DELIVERY"]
|
|
821
|
+
},
|
|
822
|
+
AUTO_ACCEPT_SETTING,
|
|
823
|
+
PREP_TIME_SETTING
|
|
824
|
+
];
|
|
825
|
+
var store2 = createConnectionStore(NINETY_NINE_FOOD_CONNECTOR_ID, {
|
|
826
|
+
settings: NINETY_NINE_FOOD_SETTINGS,
|
|
827
|
+
settingsKeys: ["storeId"]
|
|
828
|
+
});
|
|
829
|
+
var nineNineFoodConnectorDef = {
|
|
830
|
+
id: NINETY_NINE_FOOD_CONNECTOR_ID,
|
|
831
|
+
hostPluginId: "orders",
|
|
832
|
+
name: "99Food",
|
|
833
|
+
description: "Traga para a cozinha cada pedido feito no 99Food, e avise o 99Food quando ele for confirmado e sair.",
|
|
834
|
+
icon: "Bike",
|
|
835
|
+
category: "marketplace",
|
|
836
|
+
// Declared as the same open-platform shape Keeta turned out to be — see the
|
|
837
|
+
// header for what that assumption rests on.
|
|
838
|
+
authKind: "oauth",
|
|
839
|
+
direction: "inbound",
|
|
840
|
+
planes: ["sync"],
|
|
841
|
+
docsUrl: "https://developer-food.99app.com/",
|
|
842
|
+
// No rateLimit: whether we poll at all is part of what is unverified.
|
|
843
|
+
permissions: marketplacePermissions("99Food"),
|
|
844
|
+
fields: [],
|
|
845
|
+
settings: NINETY_NINE_FOOD_SETTINGS,
|
|
846
|
+
howItSyncs: [
|
|
847
|
+
"Cada pedido novo no 99Food entra na tela de Pedidos.",
|
|
848
|
+
"Um pedido j\xE1 trazido n\xE3o entra duas vezes: ele guarda o n\xFAmero que tem no 99Food.",
|
|
849
|
+
"Confirmar, despachar ou cancelar aqui \xE9 o que avisa o 99Food."
|
|
850
|
+
],
|
|
851
|
+
...connectionStatus(
|
|
852
|
+
NINETY_NINE_FOOD_CONNECTOR_ID,
|
|
853
|
+
(connection) => ({
|
|
854
|
+
connected: !!connection?.active,
|
|
855
|
+
detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),
|
|
856
|
+
plane: "sync",
|
|
857
|
+
...settingsStatus(NINETY_NINE_FOOD_SETTINGS, connection)
|
|
858
|
+
}),
|
|
859
|
+
{ store: () => store2 }
|
|
860
|
+
),
|
|
861
|
+
...connectionSettings(store2),
|
|
862
|
+
...connectionRuns(store2),
|
|
863
|
+
startOAuth: fayzConnectorOAuth(NINETY_NINE_FOOD_CONNECTOR_ID),
|
|
864
|
+
saveConnection: async () => {
|
|
865
|
+
await store2.save({ active: true });
|
|
866
|
+
},
|
|
867
|
+
disconnect: () => store2.disconnect(),
|
|
868
|
+
disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
|
|
869
|
+
};
|
|
870
|
+
var KEETA_CONNECTOR_ID = "keeta";
|
|
871
|
+
var SERVICE_MODE_LABELS2 = { DELIVERY: "Entrega", PICKUP: "Retirada" };
|
|
872
|
+
var KEETA_SETTINGS = [
|
|
873
|
+
{
|
|
874
|
+
key: "serviceModes",
|
|
875
|
+
label: "Quais pedidos trazer",
|
|
876
|
+
description: "Keeta entrega e deixa retirar; estes s\xE3o os que viram pedido aqui.",
|
|
877
|
+
type: "multi-select",
|
|
878
|
+
options: [
|
|
879
|
+
{ value: "DELIVERY", label: SERVICE_MODE_LABELS2.DELIVERY },
|
|
880
|
+
{ value: "PICKUP", label: SERVICE_MODE_LABELS2.PICKUP }
|
|
881
|
+
],
|
|
882
|
+
requiredToOperate: true,
|
|
883
|
+
defaultValue: ["DELIVERY"]
|
|
884
|
+
},
|
|
885
|
+
AUTO_ACCEPT_SETTING,
|
|
886
|
+
PREP_TIME_SETTING
|
|
887
|
+
];
|
|
888
|
+
var store3 = createConnectionStore(KEETA_CONNECTOR_ID, {
|
|
889
|
+
settings: KEETA_SETTINGS,
|
|
890
|
+
settingsKeys: ["shopId"]
|
|
891
|
+
});
|
|
892
|
+
var keetaConnectorDef = {
|
|
893
|
+
id: KEETA_CONNECTOR_ID,
|
|
894
|
+
hostPluginId: "orders",
|
|
895
|
+
name: "Keeta",
|
|
896
|
+
description: "Traga para a cozinha cada pedido feito no Keeta, e avise o Keeta quando ele for confirmado e sair.",
|
|
897
|
+
icon: "Bike",
|
|
898
|
+
category: "marketplace",
|
|
899
|
+
// Keeta's own words: the credentials are software-level and the merchant
|
|
900
|
+
// self-authorizes, which is the redirect flow this declares.
|
|
901
|
+
authKind: "oauth",
|
|
902
|
+
// `inbound` is about the data, not who dials: Keeta dials us, iFood does not.
|
|
903
|
+
direction: "inbound",
|
|
904
|
+
planes: ["sync"],
|
|
905
|
+
docsUrl: "https://api-docs.mykeeta.com/apis/standard/docs/intro",
|
|
906
|
+
// No rateLimit: a budget describes what we spend, and nothing here polls Keeta.
|
|
907
|
+
permissions: marketplacePermissions("Keeta"),
|
|
908
|
+
fields: [],
|
|
909
|
+
settings: KEETA_SETTINGS,
|
|
910
|
+
howItSyncs: [
|
|
911
|
+
"O Keeta avisa assim que um pedido \xE9 feito, e ele entra na tela de Pedidos.",
|
|
912
|
+
"Se o aviso n\xE3o chegar de primeira, o Keeta tenta de novo \u2014 e um pedido j\xE1 trazido n\xE3o entra duas vezes.",
|
|
913
|
+
"Confirmar, despachar ou cancelar aqui \xE9 o que avisa o Keeta."
|
|
914
|
+
],
|
|
915
|
+
...connectionStatus(
|
|
916
|
+
KEETA_CONNECTOR_ID,
|
|
917
|
+
(connection) => ({
|
|
918
|
+
connected: !!connection?.active,
|
|
919
|
+
detail: serviceModesDetail(SERVICE_MODE_LABELS2, connection?.settings?.serviceModes),
|
|
920
|
+
plane: "sync",
|
|
921
|
+
...settingsStatus(KEETA_SETTINGS, connection)
|
|
922
|
+
}),
|
|
923
|
+
{ store: () => store3 }
|
|
924
|
+
),
|
|
925
|
+
...connectionSettings(store3),
|
|
926
|
+
...connectionRuns(store3),
|
|
927
|
+
startOAuth: fayzConnectorOAuth(KEETA_CONNECTOR_ID),
|
|
928
|
+
saveConnection: async () => {
|
|
929
|
+
await store3.save({ active: true });
|
|
930
|
+
},
|
|
931
|
+
disconnect: () => store3.disconnect(),
|
|
932
|
+
disconnectNote: "Desconectar para de trazer pedidos novos. Os pedidos que j\xE1 entraram continuam aqui."
|
|
933
|
+
};
|
|
683
934
|
var DEFAULT_ORDERS_TABLE = "orders";
|
|
684
935
|
var DEFAULT_ORDER_ITEMS_TABLE = "order_items";
|
|
685
936
|
var ACTIVE_STATUSES = /* @__PURE__ */ new Set(["new", "confirmed", "preparing", "ready", "served", "dispatched"]);
|
|
@@ -1058,11 +1309,11 @@ function resolveConfig(options) {
|
|
|
1058
1309
|
function createOrdersPlugin(options) {
|
|
1059
1310
|
const config = resolveConfig(options);
|
|
1060
1311
|
const provider = options?.dataProvider ?? createMockOrdersProvider();
|
|
1061
|
-
const
|
|
1312
|
+
const store4 = createOrdersStore(provider);
|
|
1062
1313
|
const PageComponent = () => React.createElement(
|
|
1063
1314
|
React.Suspense,
|
|
1064
1315
|
{ fallback: null },
|
|
1065
|
-
React.createElement(OrdersPage, { config, provider, store, registries: ordersRegistries })
|
|
1316
|
+
React.createElement(OrdersPage, { config, provider, store: store4, registries: ordersRegistries })
|
|
1066
1317
|
);
|
|
1067
1318
|
return {
|
|
1068
1319
|
id: "orders",
|
|
@@ -1176,10 +1427,13 @@ function createOrdersPlugin(options) {
|
|
|
1176
1427
|
permission: { feature: "orders", action: "read" }
|
|
1177
1428
|
}
|
|
1178
1429
|
],
|
|
1179
|
-
locales: ordersLocales
|
|
1430
|
+
locales: ordersLocales,
|
|
1431
|
+
// Offered regardless of `modules.delivery` — a takeout-only house still takes
|
|
1432
|
+
// iFood retirada orders. Control plane only: src/integrations/DELIVERY-MARKETPLACES.md.
|
|
1433
|
+
connectors: [ifoodConnectorDef, nineNineFoodConnectorDef, keetaConnectorDef]
|
|
1180
1434
|
};
|
|
1181
1435
|
}
|
|
1182
1436
|
|
|
1183
|
-
export { createFayzOrdersProvider, createOrdersPlugin };
|
|
1437
|
+
export { AUTO_ACCEPT_SETTING, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS, KEETA_CONNECTOR_ID, KEETA_SETTINGS, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS, PREP_TIME_SETTING, createFayzOrdersProvider, createOrdersPlugin, ifoodConnectorDef, keetaConnectorDef, marketplacePermissions, nineNineFoodConnectorDef };
|
|
1184
1438
|
//# sourceMappingURL=index.js.map
|
|
1185
1439
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/mock.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/data/platform.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantOrder, RestaurantOrderItem,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n OrderQuery, PaginatedResult, OrdersSummary,\n OrderKind, OrderStatus,\n} from '../types'\nimport { getNextStatus, STATUS_FLOW } from '../types'\nimport type { OrdersDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 100\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst now = new Date().toISOString()\n\nfunction makeItem(\n orderId: string,\n name: string,\n quantity: number,\n unitPrice: number,\n sortOrder: number,\n productId?: string,\n): RestaurantOrderItem {\n const id = nextId('item')\n return {\n id,\n orderId,\n productId,\n name,\n quantity,\n unitPrice,\n discount: 0,\n total: quantity * unitPrice,\n sortOrder,\n createdAt: now,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Seed data\n// ---------------------------------------------------------------------------\n\nfunction createSeedOrders(): RestaurantOrder[] {\n const order1Id = nextId('order')\n const order1Items = [\n makeItem(order1Id, 'Classic Burger', 1, 32, 0, 'prod-burger-classic'),\n makeItem(order1Id, 'Fries', 1, 15, 1, 'prod-fries'),\n ]\n const order1: RestaurantOrder = {\n id: order1Id,\n referenceNumber: 'ORD-0001',\n kind: 'dine_in',\n status: 'preparing',\n source: 'pos',\n tableId: 'table-3',\n tableName: 'Table 3',\n subtotal: 47,\n discount: 0,\n tax: 0,\n total: 47,\n currency: 'BRL',\n tags: [],\n items: order1Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order2Id = nextId('order')\n const order2Items = [\n makeItem(order2Id, 'Cheese Burger', 1, 36, 0, 'prod-burger-cheese'),\n ]\n const order2: RestaurantOrder = {\n id: order2Id,\n referenceNumber: 'ORD-0002',\n kind: 'takeout',\n status: 'ready',\n source: 'pos',\n subtotal: 36,\n discount: 0,\n tax: 0,\n total: 36,\n currency: 'BRL',\n tags: [],\n items: order2Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order3Id = nextId('order')\n const order3Items = [\n makeItem(order3Id, 'Margherita Pizza', 1, 38, 0, 'prod-pizza-margherita'),\n makeItem(order3Id, 'Caesar Salad', 1, 22, 1, 'prod-salad-caesar'),\n makeItem(order3Id, 'Soda 350ml', 1, 12, 2, 'prod-soda'),\n ]\n const order3: RestaurantOrder = {\n id: order3Id,\n referenceNumber: 'ORD-0003',\n kind: 'delivery',\n status: 'confirmed',\n source: 'ifood',\n subtotal: 72,\n discount: 0,\n tax: 0,\n total: 72,\n currency: 'BRL',\n tags: [],\n items: order3Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order4Id = nextId('order')\n const order4Items = [\n makeItem(order4Id, 'BBQ Bacon Burger', 1, 42, 0, 'prod-burger-bbq'),\n ]\n const order4: RestaurantOrder = {\n id: order4Id,\n referenceNumber: 'ORD-0004',\n kind: 'dine_in',\n status: 'new',\n source: 'pos',\n tableId: 'table-7',\n tableName: 'Table 7',\n subtotal: 42,\n discount: 0,\n tax: 0,\n total: 42,\n currency: 'BRL',\n tags: [],\n items: order4Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order5Id = nextId('order')\n const order5Items = [\n makeItem(order5Id, 'Classic Burger', 2, 32, 0, 'prod-burger-classic'),\n makeItem(order5Id, 'Fries', 1, 15, 1, 'prod-fries'),\n makeItem(order5Id, 'Onion Rings', 1, 18, 2, 'prod-onion-rings'),\n makeItem(order5Id, 'Milkshake', 1, 23, 3, 'prod-milkshake'),\n ]\n const order5: RestaurantOrder = {\n id: order5Id,\n referenceNumber: 'ORD-0005',\n kind: 'dine_in',\n status: 'completed',\n source: 'pos',\n tableId: 'table-1',\n tableName: 'Table 1',\n subtotal: 120,\n discount: 0,\n tax: 0,\n total: 120,\n currency: 'BRL',\n tags: [],\n items: order5Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n completedAt: now,\n }\n\n return [order1, order2, order3, order4, order5]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction recomputeTotals(order: RestaurantOrder): void {\n order.subtotal = order.items.reduce((sum, i) => sum + i.total, 0)\n order.total = order.subtotal - order.discount + order.tax\n}\n\nlet refCounter = 5\nfunction generateReferenceNumber(): string {\n refCounter++\n return 'ORD-' + String(refCounter).padStart(4, '0')\n}\n\nfunction toDateStr(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockOrdersProvider(): OrdersDataProvider {\n const orders: RestaurantOrder[] = createSeedOrders()\n\n function findOrder(id: string): RestaurantOrder | undefined {\n return orders.find(o => o.id === id)\n }\n\n function findItem(itemId: string): { order: RestaurantOrder; item: RestaurantOrderItem; index: number } | undefined {\n for (const order of orders) {\n const index = order.items.findIndex(i => i.id === itemId)\n if (index !== -1) return { order, item: order.items[index], index }\n }\n return undefined\n }\n\n const provider: OrdersDataProvider = {\n // ------------------------------------------------------------------\n // getOrders\n // ------------------------------------------------------------------\n async getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>> {\n let result = [...orders]\n\n // Filter by kind\n if (query.kind) {\n const kinds = Array.isArray(query.kind) ? query.kind : [query.kind]\n result = result.filter(o => kinds.includes(o.kind))\n }\n\n // Filter by status\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter(o => (statuses as string[]).includes(o.status))\n }\n\n // Filter by source\n if (query.source) {\n result = result.filter(o => o.source === query.source)\n }\n\n // Filter by tableId\n if (query.tableId) {\n result = result.filter(o => o.tableId === query.tableId)\n }\n\n // Filter by assigneeId\n if (query.assigneeId) {\n result = result.filter(o => o.assigneeId === query.assigneeId)\n }\n\n // Filter by search (reference number, party name, table name)\n if (query.search) {\n const q = query.search.toLowerCase()\n result = result.filter(o =>\n o.referenceNumber.toLowerCase().includes(q) ||\n o.partyName?.toLowerCase().includes(q) ||\n o.tableName?.toLowerCase().includes(q) ||\n o.items.some(i => i.name.toLowerCase().includes(q))\n )\n }\n\n // Filter by date range\n if (query.dateRange) {\n const from = query.dateRange.from\n const to = query.dateRange.to\n result = result.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n }\n\n // Sort by createdAt desc\n result.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const total = result.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 20\n const start = (page - 1) * pageSize\n const data = result.slice(start, start + pageSize)\n\n return { data, total }\n },\n\n // ------------------------------------------------------------------\n // getOrderById\n // ------------------------------------------------------------------\n async getOrderById(id: string): Promise<RestaurantOrder | null> {\n return findOrder(id) ?? null\n },\n\n // ------------------------------------------------------------------\n // createOrder\n // ------------------------------------------------------------------\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const orderId = nextId('order')\n const items: RestaurantOrderItem[] = input.items.map((item, idx) => ({\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: idx,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }))\n\n const subtotal = items.reduce((sum, i) => sum + i.total, 0)\n\n const order: RestaurantOrder = {\n id: orderId,\n referenceNumber: generateReferenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n tableId: input.tableId,\n partyId: input.partyId,\n assigneeId: input.assigneeId,\n notes: input.notes,\n estimatedMinutes: input.estimatedMinutes,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n items,\n tenantId: 'tenant-mock',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n orders.push(order)\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrderStatus\n // ------------------------------------------------------------------\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n const order = findOrder(input.orderId)\n if (!order) throw new Error(`Order not found: ${input.orderId}`)\n\n // Validate the transition: the target status must be reachable via getNextStatus\n // or it must be 'cancelled'\n if (input.status !== 'cancelled') {\n const flow = STATUS_FLOW[order.kind]\n const currentIdx = flow.indexOf(order.status)\n const targetIdx = flow.indexOf(input.status)\n if (targetIdx < 0 || targetIdx !== currentIdx + 1) {\n const next = getNextStatus(order.kind, order.status)\n throw new Error(\n `Invalid status transition: ${order.status} → ${input.status}. ` +\n (next ? `Expected next status: ${next}` : 'Order is already in a terminal state.')\n )\n }\n }\n\n order.status = input.status\n order.updatedAt = new Date().toISOString()\n\n if (input.status === 'completed') {\n order.completedAt = order.updatedAt\n }\n\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrder\n // ------------------------------------------------------------------\n async updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n const { id: _id, items: _items, tenantId: _t, createdAt: _c, ...safe } = data\n Object.assign(order, safe)\n order.updatedAt = new Date().toISOString()\n return order\n },\n\n // ------------------------------------------------------------------\n // cancelOrder\n // ------------------------------------------------------------------\n async cancelOrder(id: string, reason?: string): Promise<void> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n order.status = 'cancelled'\n order.updatedAt = new Date().toISOString()\n if (reason) {\n order.notes = order.notes ? `${order.notes}\\nCancelled: ${reason}` : `Cancelled: ${reason}`\n }\n },\n\n // ------------------------------------------------------------------\n // addOrderItem\n // ------------------------------------------------------------------\n async addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem> {\n const order = findOrder(orderId)\n if (!order) throw new Error(`Order not found: ${orderId}`)\n\n const newItem: RestaurantOrderItem = {\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: order.items.length,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }\n\n order.items.push(newItem)\n recomputeTotals(order)\n order.updatedAt = new Date().toISOString()\n return newItem\n },\n\n // ------------------------------------------------------------------\n // removeOrderItem\n // ------------------------------------------------------------------\n async removeOrderItem(itemId: string): Promise<void> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n found.order.items.splice(found.index, 1)\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n },\n\n // ------------------------------------------------------------------\n // updateOrderItem\n // ------------------------------------------------------------------\n async updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n const { id: _id, orderId: _oid, createdAt: _c, ...safe } = data\n Object.assign(found.item, safe)\n\n // Recompute item total if quantity or price changed\n found.item.total = found.item.quantity * found.item.unitPrice - found.item.discount\n\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n return found.item\n },\n\n // ------------------------------------------------------------------\n // getSummary\n // ------------------------------------------------------------------\n async getSummary(dateRange?: { from: string; to: string }): Promise<OrdersSummary> {\n const today = toDateStr(new Date())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n\n const inRange = orders.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n\n const completed = inRange.filter(o => o.status !== 'cancelled')\n const revenue = completed.reduce((sum, o) => sum + o.total, 0)\n\n const activeStatuses = new Set(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\n const active = orders.filter(o => activeStatuses.has(o.status))\n\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n\n for (const o of inRange) {\n ordersByKind[o.kind] = (ordersByKind[o.kind] || 0) + 1\n ordersByStatus[o.status] = (ordersByStatus[o.status] || 0) + 1\n }\n\n // Top items\n const itemMap = new Map<string, { name: string; quantity: number; revenue: number }>()\n for (const o of completed) {\n for (const item of o.items) {\n const existing = itemMap.get(item.name)\n if (existing) {\n existing.quantity += item.quantity\n existing.revenue += item.total\n } else {\n itemMap.set(item.name, { name: item.name, quantity: item.quantity, revenue: item.total })\n }\n }\n }\n const topItems = Array.from(itemMap.values())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, 5)\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: completed.length > 0 ? revenue / completed.length : 0,\n activeOrderCount: active.length,\n ordersByKind,\n ordersByStatus,\n topItems,\n }\n },\n }\n\n return provider\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport { toast } from 'sonner'\nimport type { OrdersDataProvider } from './data/types'\nimport type {\n RestaurantOrder, OrdersSummary,\n OrderQuery, CreateOrderInput, CreateOrderItemInput,\n UpdateOrderStatusInput,\n} from './types'\nimport { getNextStatus } from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface OrdersUIState {\n // Data cache\n orders: RestaurantOrder[]\n ordersTotal: number\n ordersLoading: boolean\n orderQuery: OrderQuery\n\n activeOrders: RestaurantOrder[]\n activeOrdersLoading: boolean\n\n summary: OrdersSummary | null\n summaryLoading: boolean\n\n selectedOrderId: string | null\n\n // Actions\n fetchOrders(query: OrderQuery): Promise<void>\n fetchActiveOrders(): Promise<void>\n fetchSummary(dateRange?: { from: string; to: string }): Promise<void>\n selectOrder(id: string | null): void\n createOrder(input: CreateOrderInput): Promise<RestaurantOrder>\n advanceOrderStatus(orderId: string): Promise<void>\n updateOrderStatus(input: UpdateOrderStatusInput): Promise<void>\n cancelOrder(id: string, reason?: string): Promise<void>\n addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<void>\n removeOrderItem(itemId: string): Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersStore(provider: OrdersDataProvider): StoreApi<OrdersUIState> {\n return createStore<OrdersUIState>((set, get) => ({\n orders: [],\n ordersTotal: 0,\n ordersLoading: false,\n orderQuery: {},\n\n activeOrders: [],\n activeOrdersLoading: false,\n\n summary: null,\n summaryLoading: false,\n\n selectedOrderId: null,\n\n async fetchOrders(query) {\n return dedup('orders:list:' + JSON.stringify(query), async () => {\n set({ ordersLoading: true, orderQuery: query })\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total, ordersLoading: false })\n })\n },\n\n async fetchActiveOrders() {\n return dedup('orders:active', async () => {\n set({ activeOrdersLoading: true })\n const result = await provider.getOrders({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\n set({ activeOrders: result.data, activeOrdersLoading: false })\n })\n },\n\n async fetchSummary(dateRange) {\n return dedup('orders:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary(dateRange)\n set({ summary, summaryLoading: false })\n })\n },\n\n selectOrder(id) {\n set({ selectedOrderId: id })\n },\n\n async createOrder(input) {\n try {\n const order = await provider.createOrder(input)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Order created')\n return order\n } catch (err: any) {\n toast.error('Failed to create order', { description: err?.message })\n throw err\n }\n },\n\n async advanceOrderStatus(orderId) {\n try {\n const { orders, activeOrders } = get()\n const order = orders.find(o => o.id === orderId) ?? activeOrders.find(o => o.id === orderId)\n if (!order) throw new Error('Order not found')\n\n const nextStatus = getNextStatus(order.kind, order.status)\n if (!nextStatus) throw new Error('No next status available')\n\n await provider.updateOrderStatus({ orderId, status: nextStatus })\n\n // Refresh active orders\n const activeResult = await provider.getOrders({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\n set({ activeOrders: activeResult.data })\n toast.success(`Order advanced to ${nextStatus.replace('_', ' ')}`)\n } catch (err: any) {\n toast.error('Failed to advance order', { description: err?.message })\n throw err\n }\n },\n\n async updateOrderStatus(input) {\n try {\n await provider.updateOrderStatus(input)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Order status updated')\n } catch (err: any) {\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async cancelOrder(id, reason) {\n try {\n await provider.cancelOrder(id, reason)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Order cancelled')\n } catch (err: any) {\n toast.error('Failed to cancel order', { description: err?.message })\n throw err\n }\n },\n\n async addOrderItem(orderId, item) {\n try {\n await provider.addOrderItem(orderId, item)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item added')\n } catch (err: any) {\n toast.error('Failed to add item', { description: err?.message })\n throw err\n }\n },\n\n async removeOrderItem(itemId) {\n try {\n await provider.removeOrderItem(itemId)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item removed')\n } catch (err: any) {\n toast.error('Failed to remove item', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\n 'orders.kanban.title': 'Orders',\n 'orders.kanban.subtitle': 'Active orders',\n 'orders.kanban.noOrders': 'No active orders',\n 'orders.kanban.noOrdersDesc': 'Orders will appear here as they come in',\n 'orders.kanban.newOrder': 'New Order',\n 'orders.kanban.advance': 'Advance',\n 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\n 'orders.kanban.column.completed': 'Completed',\n 'orders.kanban.column.cancelled': 'Cancelled',\n 'orders.detail.title': 'Order Details',\n 'orders.detail.items': 'Items',\n 'orders.detail.table': 'Table',\n 'orders.detail.customer': 'Customer',\n 'orders.detail.waiter': 'Waiter',\n 'orders.detail.source': 'Source',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Discount',\n 'orders.detail.tax': 'Tax',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Notes',\n 'orders.newOrder.title': 'New Order',\n 'orders.newOrder.selectKind': 'Order type',\n 'orders.newOrder.dineIn': 'Dine-in',\n 'orders.newOrder.takeout': 'Takeout',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Select table',\n 'orders.newOrder.addItems': 'Add items',\n 'orders.newOrder.searchItems': 'Search menu...',\n 'orders.newOrder.noItems': 'No items added yet',\n 'orders.newOrder.confirm': 'Place Order',\n 'orders.newOrder.cancel': 'Cancel',\n 'orders.list.title': 'Order History',\n 'orders.list.subtitle': 'All orders',\n 'orders.list.search': 'Search orders...',\n 'orders.list.noOrders': 'No orders found',\n 'orders.source.dine_in': 'Dine-in',\n 'orders.source.takeout': 'Takeout',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Orders Settings',\n}\n","export const ptBR: Record<string, string> = {\n 'orders.title': 'Pedidos',\n 'orders.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\n 'orders.kanban.title': 'Pedidos',\n 'orders.kanban.subtitle': 'Pedidos ativos',\n 'orders.kanban.noOrders': 'Nenhum pedido ativo',\n 'orders.kanban.noOrdersDesc': 'Os pedidos aparecerão aqui conforme chegarem',\n 'orders.kanban.newOrder': 'Novo Pedido',\n 'orders.kanban.advance': 'Avançar',\n 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\n 'orders.kanban.column.completed': 'Concluído',\n 'orders.kanban.column.cancelled': 'Cancelado',\n 'orders.detail.title': 'Detalhes do Pedido',\n 'orders.detail.items': 'Itens',\n 'orders.detail.table': 'Mesa',\n 'orders.detail.customer': 'Cliente',\n 'orders.detail.waiter': 'Garçom',\n 'orders.detail.source': 'Origem',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Desconto',\n 'orders.detail.tax': 'Imposto',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Observações',\n 'orders.newOrder.title': 'Novo Pedido',\n 'orders.newOrder.selectKind': 'Tipo de pedido',\n 'orders.newOrder.dineIn': 'Mesa',\n 'orders.newOrder.takeout': 'Para Viagem',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Selecionar mesa',\n 'orders.newOrder.addItems': 'Adicionar itens',\n 'orders.newOrder.searchItems': 'Buscar no cardápio...',\n 'orders.newOrder.noItems': 'Nenhum item adicionado',\n 'orders.newOrder.confirm': 'Fazer Pedido',\n 'orders.newOrder.cancel': 'Cancelar',\n 'orders.list.title': 'Histórico de Pedidos',\n 'orders.list.subtitle': 'Todos os pedidos',\n 'orders.list.search': 'Buscar pedidos...',\n 'orders.list.noOrders': 'Nenhum pedido encontrado',\n 'orders.source.dine_in': 'Mesa',\n 'orders.source.takeout': 'Para Viagem',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Configurações de Pedidos',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const ordersLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateOrderInput,\n CreateOrderItemInput,\n OrderKind,\n OrderQuery,\n OrdersSummary,\n OrderStatus,\n PaginatedResult,\n RestaurantOrder,\n RestaurantOrderItem,\n UpdateOrderStatusInput,\n} from '../types'\nimport type { OrdersDataProvider } from './types'\n\nexport interface FayzOrdersProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n ordersTable?: string\n orderItemsTable?: string\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * orders table. When omitted, scoping is left to the runtime/RLS context.\n * Only the orders table carries `tenant_id`; order_items scope via their\n * parent order, so this never touches the order-items table.\n */\n tenantId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: OrderStatus | null\n party_id?: string | null\n party_name?: string | null\n assignee_id?: string | null\n assignee_name?: string | null\n location_id?: string | null\n subtotal?: number | string | null\n discount?: number | string | null\n tax?: number | string | null\n total?: number | string | null\n currency?: string | null\n notes?: string | null\n tags?: string[] | null\n source?: string | null\n table_id?: string | null\n table_name?: string | null\n estimated_minutes?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n completed_at?: string | null\n}\n\ninterface OrderItemRow {\n id: string\n order_id?: string | null\n product_id?: string | null\n name?: string | null\n description?: string | null\n quantity?: number | string | null\n unit_price?: number | string | null\n discount?: number | string | null\n total?: number | string | null\n sort_order?: number | null\n modifiers?: string | null\n kitchen_notes?: string | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n}\n\nconst DEFAULT_ORDERS_TABLE = 'orders'\nconst DEFAULT_ORDER_ITEMS_TABLE = 'order_items'\nconst ACTIVE_STATUSES = new Set<OrderStatus>(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction dateKey(value: string): string {\n return value.slice(0, 10)\n}\n\nfunction referenceNumber(): string {\n return `ORD-${Date.now().toString().slice(-6)}`\n}\n\nfunction itemToRow(item: CreateOrderItemInput, orderId: string, sortOrder: number): Record<string, unknown> {\n const discount = item.discount ?? 0\n return {\n order_id: orderId,\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount,\n total: item.quantity * item.unitPrice - discount,\n sort_order: sortOrder,\n modifiers: item.modifiers ?? null,\n kitchen_notes: item.kitchenNotes ?? null,\n }\n}\n\nfunction rowToItem(row: OrderItemRow): RestaurantOrderItem {\n const quantity = numberValue(row.quantity)\n const unitPrice = numberValue(row.unit_price)\n const discount = numberValue(row.discount)\n return {\n id: row.id,\n orderId: row.order_id ?? '',\n productId: row.product_id ?? undefined,\n name: row.name ?? 'Item',\n description: row.description ?? undefined,\n quantity,\n unitPrice,\n discount,\n total: numberValue(row.total) || quantity * unitPrice - discount,\n sortOrder: row.sort_order ?? 0,\n modifiers: row.modifiers ?? undefined,\n kitchenNotes: row.kitchen_notes ?? undefined,\n metadata: row.metadata ?? {},\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToOrder(row: OrderRow, items: RestaurantOrderItem[] = []): RestaurantOrder {\n const subtotal = numberValue(row.subtotal) || items.reduce((sum, item) => sum + item.total, 0)\n const discount = numberValue(row.discount)\n const tax = numberValue(row.tax)\n return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: row.status ?? 'new',\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? undefined,\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? undefined,\n locationId: row.location_id ?? undefined,\n subtotal,\n discount,\n tax,\n total: numberValue(row.total) || subtotal - discount + tax,\n currency: row.currency ?? 'BRL',\n notes: row.notes ?? undefined,\n tags: row.tags ?? [],\n source: row.source ?? 'pos',\n tableId: row.table_id ?? undefined,\n tableName: row.table_name ?? undefined,\n estimatedMinutes: row.estimated_minutes ?? undefined,\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n completedAt: row.completed_at ?? undefined,\n }\n}\n\nfunction orderPayload(input: CreateOrderInput): Record<string, unknown> {\n const subtotal = input.items.reduce((sum, item) => sum + item.quantity * item.unitPrice - (item.discount ?? 0), 0)\n return {\n reference_number: referenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n table_id: input.tableId ?? null,\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n estimated_minutes: input.estimatedMinutes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n }\n}\n\nfunction updatePayload(data: Partial<RestaurantOrder>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.referenceNumber !== undefined) payload.reference_number = data.referenceNumber\n if (data.kind !== undefined) payload.kind = data.kind\n if (data.status !== undefined) payload.status = data.status\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.partyName !== undefined) payload.party_name = data.partyName\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.assigneeName !== undefined) payload.assignee_name = data.assigneeName\n if (data.locationId !== undefined) payload.location_id = data.locationId\n if (data.subtotal !== undefined) payload.subtotal = data.subtotal\n if (data.discount !== undefined) payload.discount = data.discount\n if (data.tax !== undefined) payload.tax = data.tax\n if (data.total !== undefined) payload.total = data.total\n if (data.currency !== undefined) payload.currency = data.currency\n if (data.notes !== undefined) payload.notes = data.notes\n if (data.tags !== undefined) payload.tags = data.tags\n if (data.source !== undefined) payload.source = data.source\n if (data.tableId !== undefined) payload.table_id = data.tableId\n if (data.tableName !== undefined) payload.table_name = data.tableName\n if (data.estimatedMinutes !== undefined) payload.estimated_minutes = data.estimatedMinutes\n if (data.metadata !== undefined) payload.metadata = data.metadata\n if (data.completedAt !== undefined) payload.completed_at = data.completedAt\n return payload\n}\n\nfunction filtersFromQuery(query: OrderQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = []\n if (query.kind && !Array.isArray(query.kind)) filters.push({ column: 'kind', operator: 'eq', value: query.kind })\n if (query.status && !Array.isArray(query.status)) filters.push({ column: 'status', operator: 'eq', value: query.status })\n if (query.source) filters.push({ column: 'source', operator: 'eq', value: query.source })\n if (query.tableId) filters.push({ column: 'table_id', operator: 'eq', value: query.tableId })\n if (query.assigneeId) filters.push({ column: 'assignee_id', operator: 'eq', value: query.assigneeId })\n return filters\n}\n\nfunction matchesClientQuery(order: RestaurantOrder, query: OrderQuery): boolean {\n if (Array.isArray(query.kind) && !query.kind.includes(order.kind)) return false\n if (Array.isArray(query.status) && !query.status.includes(order.status)) return false\n if (query.dateRange) {\n const created = dateKey(order.createdAt)\n if (created < query.dateRange.from || created > query.dateRange.to) return false\n }\n if (query.search) {\n const search = query.search.toLowerCase()\n return order.referenceNumber.toLowerCase().includes(search)\n || (order.partyName?.toLowerCase().includes(search) ?? false)\n || (order.tableName?.toLowerCase().includes(search) ?? false)\n || order.items.some((item) => item.name.toLowerCase().includes(search))\n }\n return true\n}\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const currentPage = page ?? 1\n const limit = pageSize ?? 20\n const start = (currentPage - 1) * limit\n return { data: items.slice(start, start + limit), total: items.length }\n}\n\nfunction summarize(orders: RestaurantOrder[], dateRange?: { from: string; to: string }): OrdersSummary {\n const today = dateKey(nowIso())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n const inRange = orders.filter((order) => {\n const created = dateKey(order.createdAt)\n return created >= from && created <= to\n })\n const billable = inRange.filter((order) => order.status !== 'cancelled')\n const revenue = billable.reduce((sum, order) => sum + order.total, 0)\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n const top = new Map<string, { name: string; quantity: number; revenue: number }>()\n\n for (const order of inRange) {\n ordersByKind[order.kind] = (ordersByKind[order.kind] ?? 0) + 1\n ordersByStatus[order.status] = (ordersByStatus[order.status] ?? 0) + 1\n if (order.status === 'cancelled') continue\n for (const item of order.items) {\n const current = top.get(item.name) ?? { name: item.name, quantity: 0, revenue: 0 }\n current.quantity += item.quantity\n current.revenue += item.total\n top.set(item.name, current)\n }\n }\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: billable.length > 0 ? revenue / billable.length : 0,\n activeOrderCount: orders.filter((order) => ACTIVE_STATUSES.has(order.status)).length,\n ordersByKind,\n ordersByStatus,\n topItems: [...top.values()].sort((a, b) => b.quantity - a.quantity).slice(0, 5),\n }\n}\n\nexport function createFayzOrdersProvider(options: FayzOrdersProviderOptions = {}): OrdersDataProvider {\n const client = createFayzClient(options)\n const ordersTable = options.ordersTable ?? DEFAULT_ORDERS_TABLE\n const orderItemsTable = options.orderItemsTable ?? DEFAULT_ORDER_ITEMS_TABLE\n const tableOptions = { projectId: options.projectId, schema: options.schema, runtime: options.runtime }\n\n function resolveTenant(): string | undefined {\n const value = typeof options.tenantId === 'function' ? options.tenantId() : options.tenantId\n return value ?? undefined\n }\n\n function withTenant(filters: FayzTableFilter[]): FayzTableFilter[] {\n const tenantId = resolveTenant()\n return tenantId ? [{ column: 'tenant_id', operator: 'eq', value: tenantId }, ...filters] : filters\n }\n\n async function listItemRows(orderIds: string[]): Promise<OrderItemRow[]> {\n if (orderIds.length === 0) return []\n const rows: OrderItemRow[] = []\n await Promise.all(orderIds.map(async (orderId) => {\n const response = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'order_id', operator: 'eq', value: orderId }],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 200,\n })\n rows.push(...response.rows)\n }))\n return rows\n }\n\n async function hydrate(rows: OrderRow[]): Promise<RestaurantOrder[]> {\n const itemRows = await listItemRows(rows.map((row) => row.id))\n const byOrder = new Map<string, RestaurantOrderItem[]>()\n for (const itemRow of itemRows) {\n const item = rowToItem(itemRow)\n const list = byOrder.get(item.orderId) ?? []\n list.push(item)\n byOrder.set(item.orderId, list)\n }\n return rows.map((row) => rowToOrder(row, byOrder.get(row.id) ?? []))\n }\n\n async function listOrders(query: OrderQuery = {}): Promise<RestaurantOrder[]> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'created_at',\n sortDirection: 'desc',\n limit: 500,\n })\n return (await hydrate(response.rows)).filter((order) => matchesClientQuery(order, query))\n }\n\n async function getById(id: string): Promise<RestaurantOrder | null> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant([{ column: 'id', operator: 'eq', value: id }]),\n limit: 1,\n })\n return (await hydrate(response.rows))[0] ?? null\n }\n\n return {\n async getOrders(query) {\n const orders = await listOrders(query)\n return paginate(orders, query.page, query.pageSize)\n },\n\n async getOrderById(id) {\n return getById(id)\n },\n\n async createOrder(input) {\n const tenantId = resolveTenant()\n const orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: tenantId ? { ...orderPayload(input), tenant_id: tenantId } : orderPayload(input),\n })\n await Promise.all(input.items.map((item, index) => client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderRow.id, index),\n })))\n return (await getById(orderRow.id)) ?? rowToOrder(orderRow)\n },\n\n async updateOrderStatus(input: UpdateOrderStatusInput) {\n const completedAt = input.status === 'completed' ? nowIso() : undefined\n return this.updateOrder(input.orderId, { status: input.status, completedAt })\n },\n\n async updateOrder(id, data) {\n const row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data),\n })\n return (await getById(row.id)) ?? rowToOrder(row)\n },\n\n async cancelOrder(id, reason) {\n const order = await getById(id)\n await this.updateOrder(id, {\n status: 'cancelled',\n notes: reason ? `${order?.notes ? `${order.notes}\\n` : ''}Cancelled: ${reason}` : order?.notes,\n })\n },\n\n async addOrderItem(orderId, item) {\n const order = await getById(orderId)\n const row = await client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderId, order?.items.length ?? 0),\n })\n const created = rowToItem(row)\n const items = [...(order?.items ?? []), created]\n await this.updateOrder(orderId, {\n subtotal: items.reduce((sum, orderItem) => sum + orderItem.total, 0),\n total: items.reduce((sum, orderItem) => sum + orderItem.total, 0) - (order?.discount ?? 0) + (order?.tax ?? 0),\n })\n return created\n },\n\n async removeOrderItem(itemId) {\n const orders = await listOrders()\n const order = orders.find((item) => item.items.some((orderItem) => orderItem.id === itemId))\n await client.data.deleteRows({ ...tableOptions, table: orderItemsTable, rows: [{ id: itemId }] })\n if (order) {\n const items = order.items.filter((item) => item.id !== itemId)\n const subtotal = items.reduce((sum, item) => sum + item.total, 0)\n await this.updateOrder(order.id, { subtotal, total: subtotal - order.discount + order.tax })\n }\n },\n\n async updateOrderItem(itemId, data) {\n const row = await client.data.updateRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n primaryKeys: { id: itemId },\n row: {\n product_id: data.productId,\n name: data.name,\n description: data.description,\n quantity: data.quantity,\n unit_price: data.unitPrice,\n discount: data.discount,\n total: data.total,\n sort_order: data.sortOrder,\n modifiers: data.modifiers,\n kitchen_notes: data.kitchenNotes,\n metadata: data.metadata,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarize(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { RestaurantOrder } from './types'\nimport { createMockOrdersProvider } from './data/mock'\nimport { createOrdersStore } from './store'\nimport { ordersRegistries } from './data/registries'\nimport { ordersLocales } from './locales'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n kanban: string\n newOrder: string\n orderList: string\n}\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\n// ---------------------------------------------------------------------------\n// Currency + sources\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: OrdersPluginOptions) {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels } as any,\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n orderSources: options?.orderSources ?? DEFAULT_ORDER_SOURCES,\n menuItemLookup: options?.menuItemLookup,\n staffLookup: options?.staffLookup,\n onOrderCompleted: options?.onOrderCompleted,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createMockOrdersProvider()\n const store = createOrdersStore(provider)\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrdersPage, { config, provider, store, registries: ordersRegistries })\n )\n\n return {\n id: 'orders',\n name: config.labels.pageTitle,\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: ['menu'],\n // Orders/month quota. NOTE: order creation currently flows only through the\n // store/AI-tool (createOrder) with no dedicated UI create handler, so no\n // client-side guard is wired yet — the declaration keeps the cap countable.\n declaredLimits: [\n { key: 'orders_month', label: 'Orders / month', table: 'orders', kindFilter: 'order', period: 'month' },\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/orders',\n icon: 'ClipboardList',\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/orders',\n component: PageComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'orders.today-summary',\n name: 'getOrdersSummary',\n description: 'Returns order count, revenue, and average ticket for today or a given period.',\n icon: 'ClipboardList',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n period: { type: 'string' as const, description: 'today, week, month' },\n },\n },\n suggestions: [\n { label: 'How many orders today?' },\n { label: \"What's the average ticket today?\" },\n { label: \"What's the most ordered item?\" },\n ],\n },\n {\n id: 'orders.active-orders',\n name: 'getActiveOrders',\n description: 'Lists currently active (non-completed) orders.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n status: { type: 'string' as const, description: 'Filter by status' },\n },\n },\n suggestions: [\n { label: 'What orders are being prepared right now?' },\n { label: 'Any delivery orders waiting?' },\n ],\n },\n {\n id: 'orders.create-order',\n name: 'createOrder',\n description: 'Creates a new restaurant order with items.',\n icon: 'PlusCircle',\n mode: 'persist' as const,\n limitKey: 'orders_month',\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n tableNumber: { type: 'number' as const, description: 'Table number (for dine-in)' },\n items: { type: 'array' as const, description: 'Item names and quantities' },\n },\n required: ['kind', 'items'],\n },\n permission: { feature: 'orders', action: 'create' as const },\n },\n ],\n registries: ordersRegistries,\n settings: [\n {\n id: 'orders',\n label: config.labels.pageTitle,\n icon: 'ClipboardList',\n component: (() => {\n const OrdersSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Orders Settings',\n subtitle: 'Order sources and preferences',\n registries: ordersRegistries,\n routeBase: '/settings/orders',\n })\n OrdersSettingsTab.displayName = 'OrdersSettingsTab'\n return OrdersSettingsTab\n })(),\n order: 22,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n locales: ordersLocales,\n }\n}\n\nexport type { OrdersDataProvider } from './data/types'\nexport { createFayzOrdersProvider } from './data/platform'\nexport type { FayzOrdersProviderOptions } from './data/platform'\nexport type { ResolvedOrdersConfig } from './context'\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/mock.ts","../src/store.ts","../src/data/registries.ts","../src/locales/en.ts","../src/locales/pt-BR.ts","../src/locales/index.ts","../src/integrations/shared.ts","../src/integrations/ifood/connectorDef.tsx","../src/integrations/99food/connectorDef.tsx","../src/integrations/keeta/connectorDef.tsx","../src/data/platform.ts","../src/index.ts"],"names":["store","createConnectionStore","connectionStatus","settingsStatus","connectionSettings","connectionRuns","fayzConnectorOAuth","SERVICE_MODE_LABELS"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n RestaurantOrder, RestaurantOrderItem,\n CreateOrderInput, CreateOrderItemInput, UpdateOrderStatusInput,\n OrderQuery, PaginatedResult, OrdersSummary,\n OrderKind, OrderStatus,\n} from '../types'\nimport { getNextStatus, STATUS_FLOW } from '../types'\nimport type { OrdersDataProvider } from './types'\n\n// ---------------------------------------------------------------------------\n// ID generator\n// ---------------------------------------------------------------------------\n\nlet uid = 100\nfunction nextId(prefix: string) { return prefix + '-' + (++uid) }\n\n// ---------------------------------------------------------------------------\n// Seed helpers\n// ---------------------------------------------------------------------------\n\nconst now = new Date().toISOString()\n\nfunction makeItem(\n orderId: string,\n name: string,\n quantity: number,\n unitPrice: number,\n sortOrder: number,\n productId?: string,\n): RestaurantOrderItem {\n const id = nextId('item')\n return {\n id,\n orderId,\n productId,\n name,\n quantity,\n unitPrice,\n discount: 0,\n total: quantity * unitPrice,\n sortOrder,\n createdAt: now,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Seed data\n// ---------------------------------------------------------------------------\n\nfunction createSeedOrders(): RestaurantOrder[] {\n const order1Id = nextId('order')\n const order1Items = [\n makeItem(order1Id, 'Classic Burger', 1, 32, 0, 'prod-burger-classic'),\n makeItem(order1Id, 'Fries', 1, 15, 1, 'prod-fries'),\n ]\n const order1: RestaurantOrder = {\n id: order1Id,\n referenceNumber: 'ORD-0001',\n kind: 'dine_in',\n status: 'preparing',\n source: 'pos',\n tableId: 'table-3',\n tableName: 'Table 3',\n subtotal: 47,\n discount: 0,\n tax: 0,\n total: 47,\n currency: 'BRL',\n tags: [],\n items: order1Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order2Id = nextId('order')\n const order2Items = [\n makeItem(order2Id, 'Cheese Burger', 1, 36, 0, 'prod-burger-cheese'),\n ]\n const order2: RestaurantOrder = {\n id: order2Id,\n referenceNumber: 'ORD-0002',\n kind: 'takeout',\n status: 'ready',\n source: 'pos',\n subtotal: 36,\n discount: 0,\n tax: 0,\n total: 36,\n currency: 'BRL',\n tags: [],\n items: order2Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order3Id = nextId('order')\n const order3Items = [\n makeItem(order3Id, 'Margherita Pizza', 1, 38, 0, 'prod-pizza-margherita'),\n makeItem(order3Id, 'Caesar Salad', 1, 22, 1, 'prod-salad-caesar'),\n makeItem(order3Id, 'Soda 350ml', 1, 12, 2, 'prod-soda'),\n ]\n const order3: RestaurantOrder = {\n id: order3Id,\n referenceNumber: 'ORD-0003',\n kind: 'delivery',\n status: 'confirmed',\n source: 'ifood',\n subtotal: 72,\n discount: 0,\n tax: 0,\n total: 72,\n currency: 'BRL',\n tags: [],\n items: order3Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order4Id = nextId('order')\n const order4Items = [\n makeItem(order4Id, 'BBQ Bacon Burger', 1, 42, 0, 'prod-burger-bbq'),\n ]\n const order4: RestaurantOrder = {\n id: order4Id,\n referenceNumber: 'ORD-0004',\n kind: 'dine_in',\n status: 'new',\n source: 'pos',\n tableId: 'table-7',\n tableName: 'Table 7',\n subtotal: 42,\n discount: 0,\n tax: 0,\n total: 42,\n currency: 'BRL',\n tags: [],\n items: order4Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n }\n\n const order5Id = nextId('order')\n const order5Items = [\n makeItem(order5Id, 'Classic Burger', 2, 32, 0, 'prod-burger-classic'),\n makeItem(order5Id, 'Fries', 1, 15, 1, 'prod-fries'),\n makeItem(order5Id, 'Onion Rings', 1, 18, 2, 'prod-onion-rings'),\n makeItem(order5Id, 'Milkshake', 1, 23, 3, 'prod-milkshake'),\n ]\n const order5: RestaurantOrder = {\n id: order5Id,\n referenceNumber: 'ORD-0005',\n kind: 'dine_in',\n status: 'completed',\n source: 'pos',\n tableId: 'table-1',\n tableName: 'Table 1',\n subtotal: 120,\n discount: 0,\n tax: 0,\n total: 120,\n currency: 'BRL',\n tags: [],\n items: order5Items,\n tenantId: 'tenant-mock',\n createdAt: now,\n updatedAt: now,\n completedAt: now,\n }\n\n return [order1, order2, order3, order4, order5]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction recomputeTotals(order: RestaurantOrder): void {\n order.subtotal = order.items.reduce((sum, i) => sum + i.total, 0)\n order.total = order.subtotal - order.discount + order.tax\n}\n\nlet refCounter = 5\nfunction generateReferenceNumber(): string {\n refCounter++\n return 'ORD-' + String(refCounter).padStart(4, '0')\n}\n\nfunction toDateStr(d: Date): string {\n return d.toISOString().slice(0, 10)\n}\n\n// ---------------------------------------------------------------------------\n// Provider factory\n// ---------------------------------------------------------------------------\n\nexport function createMockOrdersProvider(): OrdersDataProvider {\n const orders: RestaurantOrder[] = createSeedOrders()\n\n function findOrder(id: string): RestaurantOrder | undefined {\n return orders.find(o => o.id === id)\n }\n\n function findItem(itemId: string): { order: RestaurantOrder; item: RestaurantOrderItem; index: number } | undefined {\n for (const order of orders) {\n const index = order.items.findIndex(i => i.id === itemId)\n if (index !== -1) return { order, item: order.items[index], index }\n }\n return undefined\n }\n\n const provider: OrdersDataProvider = {\n // ------------------------------------------------------------------\n // getOrders\n // ------------------------------------------------------------------\n async getOrders(query: OrderQuery): Promise<PaginatedResult<RestaurantOrder>> {\n let result = [...orders]\n\n // Filter by kind\n if (query.kind) {\n const kinds = Array.isArray(query.kind) ? query.kind : [query.kind]\n result = result.filter(o => kinds.includes(o.kind))\n }\n\n // Filter by status\n if (query.status) {\n const statuses = Array.isArray(query.status) ? query.status : [query.status]\n result = result.filter(o => (statuses as string[]).includes(o.status))\n }\n\n // Filter by source\n if (query.source) {\n result = result.filter(o => o.source === query.source)\n }\n\n // Filter by tableId\n if (query.tableId) {\n result = result.filter(o => o.tableId === query.tableId)\n }\n\n // Filter by assigneeId\n if (query.assigneeId) {\n result = result.filter(o => o.assigneeId === query.assigneeId)\n }\n\n // Filter by search (reference number, party name, table name)\n if (query.search) {\n const q = query.search.toLowerCase()\n result = result.filter(o =>\n o.referenceNumber.toLowerCase().includes(q) ||\n o.partyName?.toLowerCase().includes(q) ||\n o.tableName?.toLowerCase().includes(q) ||\n o.items.some(i => i.name.toLowerCase().includes(q))\n )\n }\n\n // Filter by date range\n if (query.dateRange) {\n const from = query.dateRange.from\n const to = query.dateRange.to\n result = result.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n }\n\n // Sort by createdAt desc\n result.sort((a, b) => b.createdAt.localeCompare(a.createdAt))\n\n const total = result.length\n const page = query.page ?? 1\n const pageSize = query.pageSize ?? 20\n const start = (page - 1) * pageSize\n const data = result.slice(start, start + pageSize)\n\n return { data, total }\n },\n\n // ------------------------------------------------------------------\n // getOrderById\n // ------------------------------------------------------------------\n async getOrderById(id: string): Promise<RestaurantOrder | null> {\n return findOrder(id) ?? null\n },\n\n // ------------------------------------------------------------------\n // createOrder\n // ------------------------------------------------------------------\n async createOrder(input: CreateOrderInput): Promise<RestaurantOrder> {\n const orderId = nextId('order')\n const items: RestaurantOrderItem[] = input.items.map((item, idx) => ({\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: idx,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }))\n\n const subtotal = items.reduce((sum, i) => sum + i.total, 0)\n\n const order: RestaurantOrder = {\n id: orderId,\n referenceNumber: generateReferenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n tableId: input.tableId,\n partyId: input.partyId,\n assigneeId: input.assigneeId,\n notes: input.notes,\n estimatedMinutes: input.estimatedMinutes,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n items,\n tenantId: 'tenant-mock',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n }\n\n orders.push(order)\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrderStatus\n // ------------------------------------------------------------------\n async updateOrderStatus(input: UpdateOrderStatusInput): Promise<RestaurantOrder> {\n const order = findOrder(input.orderId)\n if (!order) throw new Error(`Order not found: ${input.orderId}`)\n\n // Validate the transition: the target status must be reachable via getNextStatus\n // or it must be 'cancelled'\n if (input.status !== 'cancelled') {\n const flow = STATUS_FLOW[order.kind]\n const currentIdx = flow.indexOf(order.status)\n const targetIdx = flow.indexOf(input.status)\n if (targetIdx < 0 || targetIdx !== currentIdx + 1) {\n const next = getNextStatus(order.kind, order.status)\n throw new Error(\n `Invalid status transition: ${order.status} → ${input.status}. ` +\n (next ? `Expected next status: ${next}` : 'Order is already in a terminal state.')\n )\n }\n }\n\n order.status = input.status\n order.updatedAt = new Date().toISOString()\n\n if (input.status === 'completed') {\n order.completedAt = order.updatedAt\n }\n\n return order\n },\n\n // ------------------------------------------------------------------\n // updateOrder\n // ------------------------------------------------------------------\n async updateOrder(id: string, data: Partial<RestaurantOrder>): Promise<RestaurantOrder> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n const { id: _id, items: _items, tenantId: _t, createdAt: _c, ...safe } = data\n Object.assign(order, safe)\n order.updatedAt = new Date().toISOString()\n return order\n },\n\n // ------------------------------------------------------------------\n // cancelOrder\n // ------------------------------------------------------------------\n async cancelOrder(id: string, reason?: string): Promise<void> {\n const order = findOrder(id)\n if (!order) throw new Error(`Order not found: ${id}`)\n\n order.status = 'cancelled'\n order.updatedAt = new Date().toISOString()\n if (reason) {\n order.notes = order.notes ? `${order.notes}\\nCancelled: ${reason}` : `Cancelled: ${reason}`\n }\n },\n\n // ------------------------------------------------------------------\n // addOrderItem\n // ------------------------------------------------------------------\n async addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<RestaurantOrderItem> {\n const order = findOrder(orderId)\n if (!order) throw new Error(`Order not found: ${orderId}`)\n\n const newItem: RestaurantOrderItem = {\n id: nextId('item'),\n orderId,\n productId: item.productId,\n name: item.name,\n quantity: item.quantity,\n unitPrice: item.unitPrice,\n discount: item.discount ?? 0,\n total: item.quantity * item.unitPrice - (item.discount ?? 0),\n sortOrder: order.items.length,\n modifiers: item.modifiers,\n kitchenNotes: item.kitchenNotes,\n createdAt: new Date().toISOString(),\n }\n\n order.items.push(newItem)\n recomputeTotals(order)\n order.updatedAt = new Date().toISOString()\n return newItem\n },\n\n // ------------------------------------------------------------------\n // removeOrderItem\n // ------------------------------------------------------------------\n async removeOrderItem(itemId: string): Promise<void> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n found.order.items.splice(found.index, 1)\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n },\n\n // ------------------------------------------------------------------\n // updateOrderItem\n // ------------------------------------------------------------------\n async updateOrderItem(itemId: string, data: Partial<RestaurantOrderItem>): Promise<RestaurantOrderItem> {\n const found = findItem(itemId)\n if (!found) throw new Error(`Order item not found: ${itemId}`)\n\n const { id: _id, orderId: _oid, createdAt: _c, ...safe } = data\n Object.assign(found.item, safe)\n\n // Recompute item total if quantity or price changed\n found.item.total = found.item.quantity * found.item.unitPrice - found.item.discount\n\n recomputeTotals(found.order)\n found.order.updatedAt = new Date().toISOString()\n return found.item\n },\n\n // ------------------------------------------------------------------\n // getSummary\n // ------------------------------------------------------------------\n async getSummary(dateRange?: { from: string; to: string }): Promise<OrdersSummary> {\n const today = toDateStr(new Date())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n\n const inRange = orders.filter(o => {\n const d = o.createdAt.slice(0, 10)\n return d >= from && d <= to\n })\n\n const completed = inRange.filter(o => o.status !== 'cancelled')\n const revenue = completed.reduce((sum, o) => sum + o.total, 0)\n\n const activeStatuses = new Set(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\n const active = orders.filter(o => activeStatuses.has(o.status))\n\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n\n for (const o of inRange) {\n ordersByKind[o.kind] = (ordersByKind[o.kind] || 0) + 1\n ordersByStatus[o.status] = (ordersByStatus[o.status] || 0) + 1\n }\n\n // Top items\n const itemMap = new Map<string, { name: string; quantity: number; revenue: number }>()\n for (const o of completed) {\n for (const item of o.items) {\n const existing = itemMap.get(item.name)\n if (existing) {\n existing.quantity += item.quantity\n existing.revenue += item.total\n } else {\n itemMap.set(item.name, { name: item.name, quantity: item.quantity, revenue: item.total })\n }\n }\n }\n const topItems = Array.from(itemMap.values())\n .sort((a, b) => b.quantity - a.quantity)\n .slice(0, 5)\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: completed.length > 0 ? revenue / completed.length : 0,\n activeOrderCount: active.length,\n ordersByKind,\n ordersByStatus,\n topItems,\n }\n },\n }\n\n return provider\n}\n","import { createStore, type StoreApi } from 'zustand/vanilla'\nimport { dedup } from '@fayz-ai/admin'\nimport { toast } from 'sonner'\nimport type { OrdersDataProvider } from './data/types'\nimport type {\n RestaurantOrder, OrdersSummary,\n OrderQuery, CreateOrderInput, CreateOrderItemInput,\n UpdateOrderStatusInput,\n} from './types'\nimport { getNextStatus } from './types'\n\n// ---------------------------------------------------------------------------\n// Store state\n// ---------------------------------------------------------------------------\n\nexport interface OrdersUIState {\n // Data cache\n orders: RestaurantOrder[]\n ordersTotal: number\n ordersLoading: boolean\n orderQuery: OrderQuery\n\n activeOrders: RestaurantOrder[]\n activeOrdersLoading: boolean\n\n summary: OrdersSummary | null\n summaryLoading: boolean\n\n selectedOrderId: string | null\n\n // Actions\n fetchOrders(query: OrderQuery): Promise<void>\n fetchActiveOrders(): Promise<void>\n fetchSummary(dateRange?: { from: string; to: string }): Promise<void>\n selectOrder(id: string | null): void\n createOrder(input: CreateOrderInput): Promise<RestaurantOrder>\n advanceOrderStatus(orderId: string): Promise<void>\n updateOrderStatus(input: UpdateOrderStatusInput): Promise<void>\n cancelOrder(id: string, reason?: string): Promise<void>\n addOrderItem(orderId: string, item: CreateOrderItemInput): Promise<void>\n removeOrderItem(itemId: string): Promise<void>\n}\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersStore(provider: OrdersDataProvider): StoreApi<OrdersUIState> {\n return createStore<OrdersUIState>((set, get) => ({\n orders: [],\n ordersTotal: 0,\n ordersLoading: false,\n orderQuery: {},\n\n activeOrders: [],\n activeOrdersLoading: false,\n\n summary: null,\n summaryLoading: false,\n\n selectedOrderId: null,\n\n async fetchOrders(query) {\n return dedup('orders:list:' + JSON.stringify(query), async () => {\n set({ ordersLoading: true, orderQuery: query })\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total, ordersLoading: false })\n })\n },\n\n async fetchActiveOrders() {\n return dedup('orders:active', async () => {\n set({ activeOrdersLoading: true })\n const result = await provider.getOrders({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\n set({ activeOrders: result.data, activeOrdersLoading: false })\n })\n },\n\n async fetchSummary(dateRange) {\n return dedup('orders:summary', async () => {\n set({ summaryLoading: true })\n const summary = await provider.getSummary(dateRange)\n set({ summary, summaryLoading: false })\n })\n },\n\n selectOrder(id) {\n set({ selectedOrderId: id })\n },\n\n async createOrder(input) {\n try {\n const order = await provider.createOrder(input)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Order created')\n return order\n } catch (err: any) {\n toast.error('Failed to create order', { description: err?.message })\n throw err\n }\n },\n\n async advanceOrderStatus(orderId) {\n try {\n const { orders, activeOrders } = get()\n const order = orders.find(o => o.id === orderId) ?? activeOrders.find(o => o.id === orderId)\n if (!order) throw new Error('Order not found')\n\n const nextStatus = getNextStatus(order.kind, order.status)\n if (!nextStatus) throw new Error('No next status available')\n\n await provider.updateOrderStatus({ orderId, status: nextStatus })\n\n // Refresh active orders\n const activeResult = await provider.getOrders({\n status: ['new', 'confirmed', 'preparing', 'ready'],\n })\n set({ activeOrders: activeResult.data })\n toast.success(`Order advanced to ${nextStatus.replace('_', ' ')}`)\n } catch (err: any) {\n toast.error('Failed to advance order', { description: err?.message })\n throw err\n }\n },\n\n async updateOrderStatus(input) {\n try {\n await provider.updateOrderStatus(input)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Order status updated')\n } catch (err: any) {\n toast.error('Failed to update status', { description: err?.message })\n throw err\n }\n },\n\n async cancelOrder(id, reason) {\n try {\n await provider.cancelOrder(id, reason)\n const query = get().orderQuery\n const [result, summary] = await Promise.all([\n provider.getOrders(query),\n provider.getSummary(),\n ])\n set({ orders: result.data, ordersTotal: result.total, summary })\n toast.success('Order cancelled')\n } catch (err: any) {\n toast.error('Failed to cancel order', { description: err?.message })\n throw err\n }\n },\n\n async addOrderItem(orderId, item) {\n try {\n await provider.addOrderItem(orderId, item)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item added')\n } catch (err: any) {\n toast.error('Failed to add item', { description: err?.message })\n throw err\n }\n },\n\n async removeOrderItem(itemId) {\n try {\n await provider.removeOrderItem(itemId)\n const query = get().orderQuery\n const result = await provider.getOrders(query)\n set({ orders: result.data, ordersTotal: result.total })\n toast.success('Item removed')\n } catch (err: any) {\n toast.error('Failed to remove item', { description: err?.message })\n throw err\n }\n },\n }))\n}\n","import type { PluginRegistryDef } from '@fayz-ai/core'\nimport type { EntityDef } from '@fayz-ai/core'\n\nconst orderSourceEntity: EntityDef = {\n name: 'Order Source',\n namePlural: 'Order Sources',\n icon: 'Globe',\n displayField: 'name',\n defaultSort: 'name',\n fields: [\n { key: 'name', label: 'Name', type: 'text', required: true, showInTable: true },\n { key: 'icon', label: 'Icon', type: 'text', showInTable: true },\n { key: 'isActive', label: 'Active', type: 'boolean', showInTable: true, defaultValue: true },\n ],\n data: { table: 'order_sources', tenantScoped: true },\n}\n\nexport const ordersRegistries: PluginRegistryDef[] = [\n {\n id: 'order-sources',\n entity: orderSourceEntity,\n icon: 'Globe',\n description: 'Order sources and delivery platforms',\n display: 'table',\n seedData: [\n { id: 'os-dine', name: 'Dine-in', icon: '🍽️', isActive: true },\n { id: 'os-takeout', name: 'Takeout', icon: '🥡', isActive: true },\n { id: 'os-ifood', name: 'iFood', icon: '🔴', isActive: true },\n { id: 'os-99food', name: '99Food', icon: '🟡', isActive: true },\n ],\n },\n]\n","export const en: Record<string, string> = {\n 'orders.title': 'Orders',\n 'orders.nav.kanban': 'Orders',\n 'orders.nav.list': 'History',\n 'orders.nav.new': 'New Order',\n 'orders.nav.dashboard': 'Dashboard',\n 'orders.kanban.title': 'Orders',\n 'orders.kanban.subtitle': 'Active orders',\n 'orders.kanban.noOrders': 'No active orders',\n 'orders.kanban.noOrdersDesc': 'Orders will appear here as they come in',\n 'orders.kanban.newOrder': 'New Order',\n 'orders.kanban.advance': 'Advance',\n 'orders.kanban.cancel': 'Cancel Order',\n 'orders.kanban.column.new': 'New',\n 'orders.kanban.column.confirmed': 'Confirmed',\n 'orders.kanban.column.preparing': 'Preparing',\n 'orders.kanban.column.ready': 'Ready',\n 'orders.kanban.column.out': 'Out',\n 'orders.kanban.column.completed': 'Completed',\n 'orders.kanban.column.cancelled': 'Cancelled',\n 'orders.detail.title': 'Order Details',\n 'orders.detail.items': 'Items',\n 'orders.detail.table': 'Table',\n 'orders.detail.customer': 'Customer',\n 'orders.detail.waiter': 'Waiter',\n 'orders.detail.source': 'Source',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Discount',\n 'orders.detail.tax': 'Tax',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Notes',\n 'orders.newOrder.title': 'New Order',\n 'orders.newOrder.selectKind': 'Order type',\n 'orders.newOrder.dineIn': 'Dine-in',\n 'orders.newOrder.takeout': 'Takeout',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Select table',\n 'orders.newOrder.addItems': 'Add items',\n 'orders.newOrder.searchItems': 'Search menu...',\n 'orders.newOrder.noItems': 'No items added yet',\n 'orders.newOrder.confirm': 'Place Order',\n 'orders.newOrder.cancel': 'Cancel',\n 'orders.list.title': 'Order History',\n 'orders.list.subtitle': 'All orders',\n 'orders.list.search': 'Search orders...',\n 'orders.list.noOrders': 'No orders found',\n 'orders.source.dine_in': 'Dine-in',\n 'orders.source.takeout': 'Takeout',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Orders Settings',\n}\n","export const ptBR: Record<string, string> = {\n 'orders.title': 'Pedidos',\n 'orders.nav.kanban': 'Pedidos',\n 'orders.nav.list': 'Histórico',\n 'orders.nav.new': 'Novo Pedido',\n 'orders.nav.dashboard': 'Painel',\n 'orders.kanban.title': 'Pedidos',\n 'orders.kanban.subtitle': 'Pedidos ativos',\n 'orders.kanban.noOrders': 'Nenhum pedido ativo',\n 'orders.kanban.noOrdersDesc': 'Os pedidos aparecerão aqui conforme chegarem',\n 'orders.kanban.newOrder': 'Novo Pedido',\n 'orders.kanban.advance': 'Avançar',\n 'orders.kanban.cancel': 'Cancelar Pedido',\n 'orders.kanban.column.new': 'Novo',\n 'orders.kanban.column.confirmed': 'Confirmado',\n 'orders.kanban.column.preparing': 'Preparando',\n 'orders.kanban.column.ready': 'Pronto',\n 'orders.kanban.column.out': 'Saiu',\n 'orders.kanban.column.completed': 'Concluído',\n 'orders.kanban.column.cancelled': 'Cancelado',\n 'orders.detail.title': 'Detalhes do Pedido',\n 'orders.detail.items': 'Itens',\n 'orders.detail.table': 'Mesa',\n 'orders.detail.customer': 'Cliente',\n 'orders.detail.waiter': 'Garçom',\n 'orders.detail.source': 'Origem',\n 'orders.detail.subtotal': 'Subtotal',\n 'orders.detail.discount': 'Desconto',\n 'orders.detail.tax': 'Imposto',\n 'orders.detail.total': 'Total',\n 'orders.detail.notes': 'Observações',\n 'orders.newOrder.title': 'Novo Pedido',\n 'orders.newOrder.selectKind': 'Tipo de pedido',\n 'orders.newOrder.dineIn': 'Mesa',\n 'orders.newOrder.takeout': 'Para Viagem',\n 'orders.newOrder.delivery': 'Delivery',\n 'orders.newOrder.selectTable': 'Selecionar mesa',\n 'orders.newOrder.addItems': 'Adicionar itens',\n 'orders.newOrder.searchItems': 'Buscar no cardápio...',\n 'orders.newOrder.noItems': 'Nenhum item adicionado',\n 'orders.newOrder.confirm': 'Fazer Pedido',\n 'orders.newOrder.cancel': 'Cancelar',\n 'orders.list.title': 'Histórico de Pedidos',\n 'orders.list.subtitle': 'Todos os pedidos',\n 'orders.list.search': 'Buscar pedidos...',\n 'orders.list.noOrders': 'Nenhum pedido encontrado',\n 'orders.source.dine_in': 'Mesa',\n 'orders.source.takeout': 'Para Viagem',\n 'orders.source.ifood': 'iFood',\n 'orders.source.99food': '99Food',\n 'orders.source.delivery': 'Delivery',\n 'orders.settings.title': 'Configurações de Pedidos',\n}\n","import { en } from './en'\nimport { ptBR } from './pt-BR'\n\nexport const ordersLocales: Record<string, Record<string, string>> = { en, 'pt-BR': ptBR }\n","import type { ConnectorPermission, ConnectorSetting } from '@fayz-ai/core'\n\n// The provider name is a parameter because the sentence a tenant judges names it.\nexport function marketplacePermissions(provider: string): ConnectorPermission[] {\n return [\n {\n kind: 'data',\n resource: 'order',\n actions: ['read', 'write'],\n reason:\n `Trazer para cá cada pedido feito no ${provider} — itens, observações, forma de pagamento e o total — ` +\n `e ler o pedido de volta para avisar o ${provider} quando ele for confirmado, sair para entrega ou for cancelado.`,\n sensitive: true,\n },\n {\n kind: 'data',\n resource: 'menu_item',\n actions: ['read'],\n reason: `Descobrir qual item do seu cardápio corresponde ao que foi vendido no ${provider}. Nenhum item é alterado.`,\n },\n {\n kind: 'data',\n resource: 'customer',\n actions: ['write'],\n reason: `Registrar quem pediu, com o nome, o telefone e o endereço que o ${provider} envia junto do pedido.`,\n sensitive: true,\n },\n ]\n}\n\nexport const AUTO_ACCEPT_SETTING: ConnectorSetting = {\n key: 'autoAccept',\n label: 'Confirmar o pedido automaticamente',\n description: 'Ligado, o pedido já entra confirmado. Desligado, ele espera alguém aceitar na tela de Pedidos.',\n type: 'toggle',\n defaultValue: false,\n}\n\nexport const PREP_TIME_SETTING: ConnectorSetting = {\n key: 'prepTimeMinutes',\n label: 'Tempo de preparo',\n description: 'Quantos minutos são informados ao aplicativo quando o pedido é confirmado.',\n type: 'text',\n // 5–120: outside that the providers refuse, and the first order is a bad place to find out.\n pattern: '[5-9]|[1-9]\\\\d|1[01]\\\\d|120',\n patternHint: 'De 5 a 120 minutos.',\n placeholder: '30',\n defaultValue: '30',\n}\n\n/** One-line summary for the connection row. Tolerates a hand-edited jsonb string. */\nexport function serviceModesDetail(labels: Record<string, string>, value: unknown): string | undefined {\n const list = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',') : []\n const named = list.map((v) => labels[String(v).trim()] ?? String(v).trim()).filter(Boolean)\n return named.length > 0 ? named.join(', ') : undefined\n}\n","// One button: the client pair is the platform's, the restaurant authorizes at\n// iFood. iFood's return leg is a userCode and not a redirect — see\n// ../DELIVERY-MARKETPLACES.md for what the platform still owes it.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const IFOOD_CONNECTOR_ID = 'ifood'\n\nconst ORDER_TYPE_LABELS: Record<string, string> = {\n DELIVERY: 'Entrega',\n TAKEOUT: 'Retirada',\n INDOOR: 'Consumo no local',\n}\n\nexport const IFOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'orderTypes',\n label: 'Quais pedidos trazer',\n description: 'iFood entrega, deixa retirar e atende no salão; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: ORDER_TYPE_LABELS.DELIVERY },\n { value: 'TAKEOUT', label: ORDER_TYPE_LABELS.TAKEOUT },\n { value: 'INDOOR', label: ORDER_TYPE_LABELS.INDOOR },\n ],\n // Required to OPERATE, not to connect: nothing selected reads as \"conectado, falta configurar\".\n requiredToOperate: true,\n defaultValue: ['DELIVERY', 'TAKEOUT'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `merchantId` is a settings key and not a field: the distributed token covers\n// every store the merchant authorized, so which one is DISCOVERED after the\n// grant rather than typed before it.\nconst store = createConnectionStore(IFOOD_CONNECTOR_ID, {\n settings: IFOOD_SETTINGS,\n settingsKeys: ['merchantId'],\n})\n\nexport const ifoodConnectorDef: ConnectorDefinition = {\n id: IFOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'iFood',\n description: 'Traga para a cozinha cada pedido feito no iFood, e avise o iFood quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer.ifood.com.br/pt-BR/docs/guides/modules/order/workflow/',\n // A ceiling for the scheduler, not the cadence: iFood asks for one poll every 30s.\n rateLimit: { perSecond: 1 },\n permissions: marketplacePermissions('iFood'),\n // No form. The client pair is OURS, held by the platform, and the restaurant\n // authorizes on iFood's own screen — it never sees a credential of ours.\n fields: [],\n settings: IFOOD_SETTINGS,\n howItSyncs: [\n 'A ligação com o iFood é lida de tempos em tempos e cada pedido novo entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no iFood.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o iFood — o cliente acompanha pelo aplicativo dele.',\n ],\n ...connectionStatus(\n IFOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(ORDER_TYPE_LABELS, connection?.settings?.orderTypes),\n plane: 'sync',\n ...settingsStatus(IFOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(IFOOD_CONNECTOR_ID),\n // Runs on the way back, to say the account is linked. No values: the grant is\n // the platform's and there is nothing configured yet.\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button, like Keeta — but 99Food's reference is behind partner access, so\n// that its open platform brokers merchant authorization the same way is an\n// assumption, not a reading. See ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const NINETY_NINE_FOOD_CONNECTOR_ID = '99food'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const NINETY_NINE_FOOD_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: '99Food entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\nconst store = createConnectionStore(NINETY_NINE_FOOD_CONNECTOR_ID, {\n settings: NINETY_NINE_FOOD_SETTINGS,\n settingsKeys: ['storeId'],\n})\n\nexport const nineNineFoodConnectorDef: ConnectorDefinition = {\n id: NINETY_NINE_FOOD_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: '99Food',\n description: 'Traga para a cozinha cada pedido feito no 99Food, e avise o 99Food quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Declared as the same open-platform shape Keeta turned out to be — see the\n // header for what that assumption rests on.\n authKind: 'oauth',\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://developer-food.99app.com/',\n // No rateLimit: whether we poll at all is part of what is unverified.\n permissions: marketplacePermissions('99Food'),\n fields: [],\n settings: NINETY_NINE_FOOD_SETTINGS,\n howItSyncs: [\n 'Cada pedido novo no 99Food entra na tela de Pedidos.',\n 'Um pedido já trazido não entra duas vezes: ele guarda o número que tem no 99Food.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o 99Food.',\n ],\n ...connectionStatus(\n NINETY_NINE_FOOD_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(NINETY_NINE_FOOD_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(NINETY_NINE_FOOD_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","// One button: appId/appSecret are the platform's and the merchant self-authorizes\n// on Keeta's page. Keeta pushes orders, and there is no connector webhook ingress\n// yet — see ../DELIVERY-MARKETPLACES.md.\nimport {\n connectionRuns,\n connectionSettings,\n connectionStatus,\n createConnectionStore,\n settingsStatus,\n type ConnectorDefinition,\n type ConnectorSetting,\n} from '@fayz-ai/core'\nimport { fayzConnectorOAuth } from '@fayz-ai/admin'\nimport { AUTO_ACCEPT_SETTING, marketplacePermissions, PREP_TIME_SETTING, serviceModesDetail } from '../shared'\n\nexport const KEETA_CONNECTOR_ID = 'keeta'\n\nconst SERVICE_MODE_LABELS: Record<string, string> = { DELIVERY: 'Entrega', PICKUP: 'Retirada' }\n\nexport const KEETA_SETTINGS: ConnectorSetting[] = [\n {\n key: 'serviceModes',\n label: 'Quais pedidos trazer',\n description: 'Keeta entrega e deixa retirar; estes são os que viram pedido aqui.',\n type: 'multi-select',\n options: [\n { value: 'DELIVERY', label: SERVICE_MODE_LABELS.DELIVERY },\n { value: 'PICKUP', label: SERVICE_MODE_LABELS.PICKUP },\n ],\n requiredToOperate: true,\n defaultValue: ['DELIVERY'],\n },\n AUTO_ACCEPT_SETTING,\n PREP_TIME_SETTING,\n]\n\n// `shopId` comes back with the grant — it is what an inbound push matches a\n// tenant on, and it is discovered, never typed.\nconst store = createConnectionStore(KEETA_CONNECTOR_ID, {\n settings: KEETA_SETTINGS,\n settingsKeys: ['shopId'],\n})\n\nexport const keetaConnectorDef: ConnectorDefinition = {\n id: KEETA_CONNECTOR_ID,\n hostPluginId: 'orders',\n name: 'Keeta',\n description: 'Traga para a cozinha cada pedido feito no Keeta, e avise o Keeta quando ele for confirmado e sair.',\n icon: 'Bike',\n category: 'marketplace',\n // Keeta's own words: the credentials are software-level and the merchant\n // self-authorizes, which is the redirect flow this declares.\n authKind: 'oauth',\n // `inbound` is about the data, not who dials: Keeta dials us, iFood does not.\n direction: 'inbound',\n planes: ['sync'],\n docsUrl: 'https://api-docs.mykeeta.com/apis/standard/docs/intro',\n // No rateLimit: a budget describes what we spend, and nothing here polls Keeta.\n permissions: marketplacePermissions('Keeta'),\n fields: [],\n settings: KEETA_SETTINGS,\n howItSyncs: [\n 'O Keeta avisa assim que um pedido é feito, e ele entra na tela de Pedidos.',\n 'Se o aviso não chegar de primeira, o Keeta tenta de novo — e um pedido já trazido não entra duas vezes.',\n 'Confirmar, despachar ou cancelar aqui é o que avisa o Keeta.',\n ],\n ...connectionStatus(\n KEETA_CONNECTOR_ID,\n (connection) => ({\n connected: !!connection?.active,\n detail: serviceModesDetail(SERVICE_MODE_LABELS, connection?.settings?.serviceModes),\n plane: 'sync',\n ...settingsStatus(KEETA_SETTINGS, connection),\n }),\n { store: () => store },\n ),\n ...connectionSettings(store),\n ...connectionRuns(store),\n startOAuth: fayzConnectorOAuth(KEETA_CONNECTOR_ID),\n saveConnection: async () => {\n await store.save({ active: true })\n },\n disconnect: () => store.disconnect(),\n disconnectNote: 'Desconectar para de trazer pedidos novos. Os pedidos que já entraram continuam aqui.',\n}\n","import { createFayzClient, type FayzClientOptions, type FayzTableFilter } from '@fayz-ai/sdk'\nimport type {\n CreateOrderInput,\n CreateOrderItemInput,\n OrderKind,\n OrderQuery,\n OrdersSummary,\n OrderStatus,\n PaginatedResult,\n RestaurantOrder,\n RestaurantOrderItem,\n UpdateOrderStatusInput,\n} from '../types'\nimport type { OrdersDataProvider } from './types'\n\nexport interface FayzOrdersProviderOptions extends FayzClientOptions {\n projectId?: string\n schema?: string\n runtime?: boolean\n ordersTable?: string\n orderItemsTable?: string\n /**\n * Active tenant id (or a getter) used to scope reads and stamp writes on the\n * orders table. When omitted, scoping is left to the runtime/RLS context.\n * Only the orders table carries `tenant_id`; order_items scope via their\n * parent order, so this never touches the order-items table.\n */\n tenantId?: string | (() => string | undefined | null)\n}\n\ninterface OrderRow {\n id: string\n tenant_id?: string | null\n reference_number?: string | null\n kind?: OrderKind | null\n status?: OrderStatus | null\n party_id?: string | null\n party_name?: string | null\n assignee_id?: string | null\n assignee_name?: string | null\n location_id?: string | null\n subtotal?: number | string | null\n discount?: number | string | null\n tax?: number | string | null\n total?: number | string | null\n currency?: string | null\n notes?: string | null\n tags?: string[] | null\n source?: string | null\n table_id?: string | null\n table_name?: string | null\n estimated_minutes?: number | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n updated_at?: string | null\n completed_at?: string | null\n}\n\ninterface OrderItemRow {\n id: string\n order_id?: string | null\n product_id?: string | null\n name?: string | null\n description?: string | null\n quantity?: number | string | null\n unit_price?: number | string | null\n discount?: number | string | null\n total?: number | string | null\n sort_order?: number | null\n modifiers?: string | null\n kitchen_notes?: string | null\n metadata?: Record<string, unknown> | null\n created_at?: string | null\n}\n\nconst DEFAULT_ORDERS_TABLE = 'orders'\nconst DEFAULT_ORDER_ITEMS_TABLE = 'order_items'\nconst ACTIVE_STATUSES = new Set<OrderStatus>(['new', 'confirmed', 'preparing', 'ready', 'served', 'dispatched'])\n\nfunction nowIso(): string {\n return new Date().toISOString()\n}\n\nfunction numberValue(value: number | string | null | undefined): number {\n if (typeof value === 'number') return value\n if (typeof value === 'string') return Number(value) || 0\n return 0\n}\n\nfunction dateKey(value: string): string {\n return value.slice(0, 10)\n}\n\nfunction referenceNumber(): string {\n return `ORD-${Date.now().toString().slice(-6)}`\n}\n\nfunction itemToRow(item: CreateOrderItemInput, orderId: string, sortOrder: number): Record<string, unknown> {\n const discount = item.discount ?? 0\n return {\n order_id: orderId,\n product_id: item.productId ?? null,\n name: item.name,\n quantity: item.quantity,\n unit_price: item.unitPrice,\n discount,\n total: item.quantity * item.unitPrice - discount,\n sort_order: sortOrder,\n modifiers: item.modifiers ?? null,\n kitchen_notes: item.kitchenNotes ?? null,\n }\n}\n\nfunction rowToItem(row: OrderItemRow): RestaurantOrderItem {\n const quantity = numberValue(row.quantity)\n const unitPrice = numberValue(row.unit_price)\n const discount = numberValue(row.discount)\n return {\n id: row.id,\n orderId: row.order_id ?? '',\n productId: row.product_id ?? undefined,\n name: row.name ?? 'Item',\n description: row.description ?? undefined,\n quantity,\n unitPrice,\n discount,\n total: numberValue(row.total) || quantity * unitPrice - discount,\n sortOrder: row.sort_order ?? 0,\n modifiers: row.modifiers ?? undefined,\n kitchenNotes: row.kitchen_notes ?? undefined,\n metadata: row.metadata ?? {},\n createdAt: row.created_at ?? nowIso(),\n }\n}\n\nfunction rowToOrder(row: OrderRow, items: RestaurantOrderItem[] = []): RestaurantOrder {\n const subtotal = numberValue(row.subtotal) || items.reduce((sum, item) => sum + item.total, 0)\n const discount = numberValue(row.discount)\n const tax = numberValue(row.tax)\n return {\n id: row.id,\n referenceNumber: row.reference_number ?? row.id,\n kind: row.kind ?? 'dine_in',\n status: row.status ?? 'new',\n partyId: row.party_id ?? undefined,\n partyName: row.party_name ?? undefined,\n assigneeId: row.assignee_id ?? undefined,\n assigneeName: row.assignee_name ?? undefined,\n locationId: row.location_id ?? undefined,\n subtotal,\n discount,\n tax,\n total: numberValue(row.total) || subtotal - discount + tax,\n currency: row.currency ?? 'BRL',\n notes: row.notes ?? undefined,\n tags: row.tags ?? [],\n source: row.source ?? 'pos',\n tableId: row.table_id ?? undefined,\n tableName: row.table_name ?? undefined,\n estimatedMinutes: row.estimated_minutes ?? undefined,\n items,\n metadata: row.metadata ?? {},\n tenantId: row.tenant_id ?? 'runtime-tenant',\n createdAt: row.created_at ?? nowIso(),\n updatedAt: row.updated_at ?? row.created_at ?? nowIso(),\n completedAt: row.completed_at ?? undefined,\n }\n}\n\nfunction orderPayload(input: CreateOrderInput): Record<string, unknown> {\n const subtotal = input.items.reduce((sum, item) => sum + item.quantity * item.unitPrice - (item.discount ?? 0), 0)\n return {\n reference_number: referenceNumber(),\n kind: input.kind,\n status: 'new',\n source: input.source ?? 'pos',\n table_id: input.tableId ?? null,\n party_id: input.partyId ?? null,\n assignee_id: input.assigneeId ?? null,\n notes: input.notes ?? null,\n estimated_minutes: input.estimatedMinutes ?? null,\n subtotal,\n discount: 0,\n tax: 0,\n total: subtotal,\n currency: 'BRL',\n tags: [],\n }\n}\n\nfunction updatePayload(data: Partial<RestaurantOrder>): Record<string, unknown> {\n const payload: Record<string, unknown> = {}\n if (data.referenceNumber !== undefined) payload.reference_number = data.referenceNumber\n if (data.kind !== undefined) payload.kind = data.kind\n if (data.status !== undefined) payload.status = data.status\n if (data.partyId !== undefined) payload.party_id = data.partyId\n if (data.partyName !== undefined) payload.party_name = data.partyName\n if (data.assigneeId !== undefined) payload.assignee_id = data.assigneeId\n if (data.assigneeName !== undefined) payload.assignee_name = data.assigneeName\n if (data.locationId !== undefined) payload.location_id = data.locationId\n if (data.subtotal !== undefined) payload.subtotal = data.subtotal\n if (data.discount !== undefined) payload.discount = data.discount\n if (data.tax !== undefined) payload.tax = data.tax\n if (data.total !== undefined) payload.total = data.total\n if (data.currency !== undefined) payload.currency = data.currency\n if (data.notes !== undefined) payload.notes = data.notes\n if (data.tags !== undefined) payload.tags = data.tags\n if (data.source !== undefined) payload.source = data.source\n if (data.tableId !== undefined) payload.table_id = data.tableId\n if (data.tableName !== undefined) payload.table_name = data.tableName\n if (data.estimatedMinutes !== undefined) payload.estimated_minutes = data.estimatedMinutes\n if (data.metadata !== undefined) payload.metadata = data.metadata\n if (data.completedAt !== undefined) payload.completed_at = data.completedAt\n return payload\n}\n\nfunction filtersFromQuery(query: OrderQuery): FayzTableFilter[] {\n const filters: FayzTableFilter[] = []\n if (query.kind && !Array.isArray(query.kind)) filters.push({ column: 'kind', operator: 'eq', value: query.kind })\n if (query.status && !Array.isArray(query.status)) filters.push({ column: 'status', operator: 'eq', value: query.status })\n if (query.source) filters.push({ column: 'source', operator: 'eq', value: query.source })\n if (query.tableId) filters.push({ column: 'table_id', operator: 'eq', value: query.tableId })\n if (query.assigneeId) filters.push({ column: 'assignee_id', operator: 'eq', value: query.assigneeId })\n return filters\n}\n\nfunction matchesClientQuery(order: RestaurantOrder, query: OrderQuery): boolean {\n if (Array.isArray(query.kind) && !query.kind.includes(order.kind)) return false\n if (Array.isArray(query.status) && !query.status.includes(order.status)) return false\n if (query.dateRange) {\n const created = dateKey(order.createdAt)\n if (created < query.dateRange.from || created > query.dateRange.to) return false\n }\n if (query.search) {\n const search = query.search.toLowerCase()\n return order.referenceNumber.toLowerCase().includes(search)\n || (order.partyName?.toLowerCase().includes(search) ?? false)\n || (order.tableName?.toLowerCase().includes(search) ?? false)\n || order.items.some((item) => item.name.toLowerCase().includes(search))\n }\n return true\n}\n\nfunction paginate<T>(items: T[], page?: number, pageSize?: number): PaginatedResult<T> {\n const currentPage = page ?? 1\n const limit = pageSize ?? 20\n const start = (currentPage - 1) * limit\n return { data: items.slice(start, start + limit), total: items.length }\n}\n\nfunction summarize(orders: RestaurantOrder[], dateRange?: { from: string; to: string }): OrdersSummary {\n const today = dateKey(nowIso())\n const from = dateRange?.from ?? today\n const to = dateRange?.to ?? today\n const inRange = orders.filter((order) => {\n const created = dateKey(order.createdAt)\n return created >= from && created <= to\n })\n const billable = inRange.filter((order) => order.status !== 'cancelled')\n const revenue = billable.reduce((sum, order) => sum + order.total, 0)\n const ordersByKind: Record<OrderKind, number> = { dine_in: 0, takeout: 0, delivery: 0 }\n const ordersByStatus: Record<string, number> = {}\n const top = new Map<string, { name: string; quantity: number; revenue: number }>()\n\n for (const order of inRange) {\n ordersByKind[order.kind] = (ordersByKind[order.kind] ?? 0) + 1\n ordersByStatus[order.status] = (ordersByStatus[order.status] ?? 0) + 1\n if (order.status === 'cancelled') continue\n for (const item of order.items) {\n const current = top.get(item.name) ?? { name: item.name, quantity: 0, revenue: 0 }\n current.quantity += item.quantity\n current.revenue += item.total\n top.set(item.name, current)\n }\n }\n\n return {\n todayOrderCount: inRange.length,\n todayRevenue: revenue,\n averageTicket: billable.length > 0 ? revenue / billable.length : 0,\n activeOrderCount: orders.filter((order) => ACTIVE_STATUSES.has(order.status)).length,\n ordersByKind,\n ordersByStatus,\n topItems: [...top.values()].sort((a, b) => b.quantity - a.quantity).slice(0, 5),\n }\n}\n\nexport function createFayzOrdersProvider(options: FayzOrdersProviderOptions = {}): OrdersDataProvider {\n const client = createFayzClient(options)\n const ordersTable = options.ordersTable ?? DEFAULT_ORDERS_TABLE\n const orderItemsTable = options.orderItemsTable ?? DEFAULT_ORDER_ITEMS_TABLE\n const tableOptions = { projectId: options.projectId, schema: options.schema, runtime: options.runtime }\n\n function resolveTenant(): string | undefined {\n const value = typeof options.tenantId === 'function' ? options.tenantId() : options.tenantId\n return value ?? undefined\n }\n\n function withTenant(filters: FayzTableFilter[]): FayzTableFilter[] {\n const tenantId = resolveTenant()\n return tenantId ? [{ column: 'tenant_id', operator: 'eq', value: tenantId }, ...filters] : filters\n }\n\n async function listItemRows(orderIds: string[]): Promise<OrderItemRow[]> {\n if (orderIds.length === 0) return []\n const rows: OrderItemRow[] = []\n await Promise.all(orderIds.map(async (orderId) => {\n const response = await client.data.listRows<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n filters: [{ column: 'order_id', operator: 'eq', value: orderId }],\n sortColumn: 'sort_order',\n sortDirection: 'asc',\n limit: 200,\n })\n rows.push(...response.rows)\n }))\n return rows\n }\n\n async function hydrate(rows: OrderRow[]): Promise<RestaurantOrder[]> {\n const itemRows = await listItemRows(rows.map((row) => row.id))\n const byOrder = new Map<string, RestaurantOrderItem[]>()\n for (const itemRow of itemRows) {\n const item = rowToItem(itemRow)\n const list = byOrder.get(item.orderId) ?? []\n list.push(item)\n byOrder.set(item.orderId, list)\n }\n return rows.map((row) => rowToOrder(row, byOrder.get(row.id) ?? []))\n }\n\n async function listOrders(query: OrderQuery = {}): Promise<RestaurantOrder[]> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant(filtersFromQuery(query)),\n sortColumn: 'created_at',\n sortDirection: 'desc',\n limit: 500,\n })\n return (await hydrate(response.rows)).filter((order) => matchesClientQuery(order, query))\n }\n\n async function getById(id: string): Promise<RestaurantOrder | null> {\n const response = await client.data.listRows<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n filters: withTenant([{ column: 'id', operator: 'eq', value: id }]),\n limit: 1,\n })\n return (await hydrate(response.rows))[0] ?? null\n }\n\n return {\n async getOrders(query) {\n const orders = await listOrders(query)\n return paginate(orders, query.page, query.pageSize)\n },\n\n async getOrderById(id) {\n return getById(id)\n },\n\n async createOrder(input) {\n const tenantId = resolveTenant()\n const orderRow = await client.data.createRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n row: tenantId ? { ...orderPayload(input), tenant_id: tenantId } : orderPayload(input),\n })\n await Promise.all(input.items.map((item, index) => client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderRow.id, index),\n })))\n return (await getById(orderRow.id)) ?? rowToOrder(orderRow)\n },\n\n async updateOrderStatus(input: UpdateOrderStatusInput) {\n const completedAt = input.status === 'completed' ? nowIso() : undefined\n return this.updateOrder(input.orderId, { status: input.status, completedAt })\n },\n\n async updateOrder(id, data) {\n const row = await client.data.updateRow<OrderRow>({\n ...tableOptions,\n table: ordersTable,\n primaryKeys: { id },\n row: updatePayload(data),\n })\n return (await getById(row.id)) ?? rowToOrder(row)\n },\n\n async cancelOrder(id, reason) {\n const order = await getById(id)\n await this.updateOrder(id, {\n status: 'cancelled',\n notes: reason ? `${order?.notes ? `${order.notes}\\n` : ''}Cancelled: ${reason}` : order?.notes,\n })\n },\n\n async addOrderItem(orderId, item) {\n const order = await getById(orderId)\n const row = await client.data.createRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n row: itemToRow(item, orderId, order?.items.length ?? 0),\n })\n const created = rowToItem(row)\n const items = [...(order?.items ?? []), created]\n await this.updateOrder(orderId, {\n subtotal: items.reduce((sum, orderItem) => sum + orderItem.total, 0),\n total: items.reduce((sum, orderItem) => sum + orderItem.total, 0) - (order?.discount ?? 0) + (order?.tax ?? 0),\n })\n return created\n },\n\n async removeOrderItem(itemId) {\n const orders = await listOrders()\n const order = orders.find((item) => item.items.some((orderItem) => orderItem.id === itemId))\n await client.data.deleteRows({ ...tableOptions, table: orderItemsTable, rows: [{ id: itemId }] })\n if (order) {\n const items = order.items.filter((item) => item.id !== itemId)\n const subtotal = items.reduce((sum, item) => sum + item.total, 0)\n await this.updateOrder(order.id, { subtotal, total: subtotal - order.discount + order.tax })\n }\n },\n\n async updateOrderItem(itemId, data) {\n const row = await client.data.updateRow<OrderItemRow>({\n ...tableOptions,\n table: orderItemsTable,\n primaryKeys: { id: itemId },\n row: {\n product_id: data.productId,\n name: data.name,\n description: data.description,\n quantity: data.quantity,\n unit_price: data.unitPrice,\n discount: data.discount,\n total: data.total,\n sort_order: data.sortOrder,\n modifiers: data.modifiers,\n kitchen_notes: data.kitchenNotes,\n metadata: data.metadata,\n },\n })\n return rowToItem(row)\n },\n\n async getSummary(dateRange) {\n return summarize(await listOrders({ dateRange }), dateRange)\n },\n }\n}\n","import React from 'react'\nimport type { PluginManifest, PluginScope, VerticalId } from '@fayz-ai/core'\nimport type { EntityLookup } from '@fayz-ai/admin'\nimport type { OrdersDataProvider } from './data/types'\nimport type { RestaurantOrder } from './types'\nimport { createMockOrdersProvider } from './data/mock'\nimport { createOrdersStore } from './store'\nimport { ordersRegistries } from './data/registries'\nimport { ordersLocales } from './locales'\nimport { ifoodConnectorDef } from './integrations/ifood/connectorDef'\nimport { nineNineFoodConnectorDef } from './integrations/99food/connectorDef'\nimport { keetaConnectorDef } from './integrations/keeta/connectorDef'\nimport { PluginSettingsPanel } from '@fayz-ai/admin'\n\nconst OrdersPage = React.lazy(() => import('./views/OrdersPage').then((m) => ({ default: m.OrdersPage })))\n\n// ---------------------------------------------------------------------------\n// Labels\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginLabels {\n pageTitle: string\n kanban: string\n newOrder: string\n orderList: string\n}\n\nconst DEFAULT_LABELS: OrdersPluginLabels = {\n pageTitle: 'Orders',\n kanban: 'Orders',\n newOrder: 'New Order',\n orderList: 'History',\n}\n\n// ---------------------------------------------------------------------------\n// Currency + sources\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_CURRENCY = { code: 'BRL', locale: 'pt-BR', symbol: 'R$' }\n\nexport interface OrderSourceOption {\n value: string\n label: string\n icon?: string\n}\n\nconst DEFAULT_ORDER_SOURCES: OrderSourceOption[] = [\n { value: 'dine_in', label: 'Dine-in', icon: '🍽️' },\n { value: 'takeout', label: 'Takeout', icon: '🥡' },\n]\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface OrdersPluginOptions {\n modules?: {\n delivery?: boolean\n takeout?: boolean\n }\n labels?: Partial<OrdersPluginLabels>\n currency?: { code?: string; locale?: string; symbol?: string }\n navPosition?: number\n navSection?: 'main' | 'secondary'\n scope?: PluginScope\n verticalId?: VerticalId\n dataProvider?: OrdersDataProvider\n menuItemLookup?: EntityLookup\n staffLookup?: EntityLookup\n onOrderCompleted?: (order: RestaurantOrder) => Promise<void>\n orderSources?: OrderSourceOption[]\n}\n\n// ---------------------------------------------------------------------------\n// Config resolver\n// ---------------------------------------------------------------------------\n\nfunction resolveConfig(options?: OrdersPluginOptions) {\n return {\n modules: {\n delivery: options?.modules?.delivery !== false,\n takeout: options?.modules?.takeout !== false,\n },\n labels: { ...DEFAULT_LABELS, ...options?.labels } as any,\n currency: { ...DEFAULT_CURRENCY, ...options?.currency },\n orderSources: options?.orderSources ?? DEFAULT_ORDER_SOURCES,\n menuItemLookup: options?.menuItemLookup,\n staffLookup: options?.staffLookup,\n onOrderCompleted: options?.onOrderCompleted,\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createOrdersPlugin(options?: OrdersPluginOptions): PluginManifest {\n const config = resolveConfig(options)\n const provider = options?.dataProvider ?? createMockOrdersProvider()\n const store = createOrdersStore(provider)\n\n const PageComponent: React.FC<any> = () =>\n React.createElement(React.Suspense, { fallback: null },\n React.createElement(OrdersPage, { config, provider, store, registries: ordersRegistries })\n )\n\n return {\n id: 'orders',\n name: config.labels.pageTitle,\n icon: 'ClipboardList',\n version: '1.0.0',\n scope: options?.scope ?? 'vertical',\n verticalId: options?.verticalId,\n defaultEnabled: true,\n dependencies: ['menu'],\n // Orders/month quota. NOTE: order creation currently flows only through the\n // store/AI-tool (createOrder) with no dedicated UI create handler, so no\n // client-side guard is wired yet — the declaration keeps the cap countable.\n declaredLimits: [\n { key: 'orders_month', label: 'Orders / month', table: 'orders', kindFilter: 'order', period: 'month' },\n ],\n navigation: [\n {\n section: options?.navSection ?? 'main',\n position: options?.navPosition ?? 2,\n label: config.labels.pageTitle,\n route: '/orders',\n icon: 'ClipboardList',\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n routes: [\n {\n path: '/orders',\n component: PageComponent,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n widgets: [],\n aiTools: [\n {\n id: 'orders.today-summary',\n name: 'getOrdersSummary',\n description: 'Returns order count, revenue, and average ticket for today or a given period.',\n icon: 'ClipboardList',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n period: { type: 'string' as const, description: 'today, week, month' },\n },\n },\n suggestions: [\n { label: 'How many orders today?' },\n { label: \"What's the average ticket today?\" },\n { label: \"What's the most ordered item?\" },\n ],\n },\n {\n id: 'orders.active-orders',\n name: 'getActiveOrders',\n description: 'Lists currently active (non-completed) orders.',\n icon: 'Clock',\n mode: 'read' as const,\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n status: { type: 'string' as const, description: 'Filter by status' },\n },\n },\n suggestions: [\n { label: 'What orders are being prepared right now?' },\n { label: 'Any delivery orders waiting?' },\n ],\n },\n {\n id: 'orders.create-order',\n name: 'createOrder',\n description: 'Creates a new restaurant order with items.',\n icon: 'PlusCircle',\n mode: 'persist' as const,\n limitKey: 'orders_month',\n category: 'Orders',\n parameters: {\n type: 'object' as const,\n properties: {\n kind: { type: 'string' as const, enum: ['dine_in', 'takeout', 'delivery'] },\n tableNumber: { type: 'number' as const, description: 'Table number (for dine-in)' },\n items: { type: 'array' as const, description: 'Item names and quantities' },\n },\n required: ['kind', 'items'],\n },\n permission: { feature: 'orders', action: 'create' as const },\n },\n ],\n registries: ordersRegistries,\n settings: [\n {\n id: 'orders',\n label: config.labels.pageTitle,\n icon: 'ClipboardList',\n component: (() => {\n const OrdersSettingsTab: React.ComponentType<unknown> = () =>\n React.createElement(PluginSettingsPanel, {\n title: 'Orders Settings',\n subtitle: 'Order sources and preferences',\n registries: ordersRegistries,\n routeBase: '/settings/orders',\n })\n OrdersSettingsTab.displayName = 'OrdersSettingsTab'\n return OrdersSettingsTab\n })(),\n order: 22,\n permission: { feature: 'orders', action: 'read' as const },\n },\n ],\n locales: ordersLocales,\n // Offered regardless of `modules.delivery` — a takeout-only house still takes\n // iFood retirada orders. Control plane only: src/integrations/DELIVERY-MARKETPLACES.md.\n connectors: [ifoodConnectorDef, nineNineFoodConnectorDef, keetaConnectorDef],\n }\n}\n\nexport * from './integrations'\n\nexport type { OrdersDataProvider } from './data/types'\nexport { createFayzOrdersProvider } from './data/platform'\nexport type { FayzOrdersProviderOptions } from './data/platform'\nexport type { ResolvedOrdersConfig } from './context'\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ConnectorDefinition, type ConnectorSetting } from '@fayz-ai/core';
|
|
2
|
+
export declare const NINETY_NINE_FOOD_CONNECTOR_ID = "99food";
|
|
3
|
+
export declare const NINETY_NINE_FOOD_SETTINGS: ConnectorSetting[];
|
|
4
|
+
export declare const nineNineFoodConnectorDef: ConnectorDefinition;
|
|
5
|
+
//# sourceMappingURL=connectorDef.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectorDef.d.ts","sourceRoot":"","sources":["../../../src/integrations/99food/connectorDef.tsx"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAItB,eAAO,MAAM,6BAA6B,WAAW,CAAA;AAIrD,eAAO,MAAM,yBAAyB,EAAE,gBAAgB,EAevD,CAAA;AAOD,eAAO,MAAM,wBAAwB,EAAE,mBAwCtC,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ConnectorDefinition, type ConnectorSetting } from '@fayz-ai/core';
|
|
2
|
+
export declare const IFOOD_CONNECTOR_ID = "ifood";
|
|
3
|
+
export declare const IFOOD_SETTINGS: ConnectorSetting[];
|
|
4
|
+
export declare const ifoodConnectorDef: ConnectorDefinition;
|
|
5
|
+
//# sourceMappingURL=connectorDef.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectorDef.d.ts","sourceRoot":"","sources":["../../../src/integrations/ifood/connectorDef.tsx"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAItB,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAQzC,eAAO,MAAM,cAAc,EAAE,gBAAgB,EAiB5C,CAAA;AAUD,eAAO,MAAM,iBAAiB,EAAE,mBA2C/B,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ifoodConnectorDef, IFOOD_CONNECTOR_ID, IFOOD_SETTINGS } from './ifood/connectorDef';
|
|
2
|
+
export { nineNineFoodConnectorDef, NINETY_NINE_FOOD_CONNECTOR_ID, NINETY_NINE_FOOD_SETTINGS, } from './99food/connectorDef';
|
|
3
|
+
export { keetaConnectorDef, KEETA_CONNECTOR_ID, KEETA_SETTINGS } from './keeta/connectorDef';
|
|
4
|
+
export { marketplacePermissions, AUTO_ACCEPT_SETTING, PREP_TIME_SETTING } from './shared';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ConnectorDefinition, type ConnectorSetting } from '@fayz-ai/core';
|
|
2
|
+
export declare const KEETA_CONNECTOR_ID = "keeta";
|
|
3
|
+
export declare const KEETA_SETTINGS: ConnectorSetting[];
|
|
4
|
+
export declare const keetaConnectorDef: ConnectorDefinition;
|
|
5
|
+
//# sourceMappingURL=connectorDef.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectorDef.d.ts","sourceRoot":"","sources":["../../../src/integrations/keeta/connectorDef.tsx"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AAItB,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAIzC,eAAO,MAAM,cAAc,EAAE,gBAAgB,EAe5C,CAAA;AASD,eAAO,MAAM,iBAAiB,EAAE,mBAyC/B,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ConnectorPermission, ConnectorSetting } from '@fayz-ai/core';
|
|
2
|
+
export declare function marketplacePermissions(provider: string): ConnectorPermission[];
|
|
3
|
+
export declare const AUTO_ACCEPT_SETTING: ConnectorSetting;
|
|
4
|
+
export declare const PREP_TIME_SETTING: ConnectorSetting;
|
|
5
|
+
/** One-line summary for the connection row. Tolerates a hand-edited jsonb string. */
|
|
6
|
+
export declare function serviceModesDetail(labels: Record<string, string>, value: unknown): string | undefined;
|
|
7
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/integrations/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAG1E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAyB9E;AAED,eAAO,MAAM,mBAAmB,EAAE,gBAMjC,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,gBAU/B,CAAA;AAED,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIrG"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"fayz": {
|
|
4
4
|
"status": "beta"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.10.0",
|
|
7
7
|
"description": "Fayz SDK — plugin-orders plugin",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"sideEffects": false,
|
|
@@ -27,18 +27,19 @@
|
|
|
27
27
|
"sonner": "^2.0.7"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@fayz-ai/core": "^0.
|
|
31
|
-
"@fayz-ai/sdk": "^0.
|
|
32
|
-
"@fayz-ai/admin": "^0.
|
|
30
|
+
"@fayz-ai/core": "^0.14.0",
|
|
31
|
+
"@fayz-ai/sdk": "^0.12.0",
|
|
32
|
+
"@fayz-ai/admin": "^0.14.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/react": "^18.3.0",
|
|
36
|
+
"lucide-react": "^0.400.0",
|
|
36
37
|
"react": "^18.3.0",
|
|
38
|
+
"sonner": "^2.0.7",
|
|
37
39
|
"tsup": "^8.2.0",
|
|
38
40
|
"typescript": "^5.5.0",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"sonner": "^2.0.7"
|
|
41
|
+
"vitest": "^4.1.5",
|
|
42
|
+
"zustand": "^4.5.0"
|
|
42
43
|
},
|
|
43
44
|
"license": "MIT",
|
|
44
45
|
"keywords": [
|
|
@@ -50,9 +51,10 @@
|
|
|
50
51
|
"access": "public"
|
|
51
52
|
},
|
|
52
53
|
"scripts": {
|
|
53
|
-
"build": "tsup && tsc
|
|
54
|
+
"build": "tsup && tsc -b --force",
|
|
54
55
|
"dev": "tsup --watch",
|
|
55
56
|
"typecheck": "tsc --noEmit",
|
|
56
|
-
"clean": "rm -rf dist"
|
|
57
|
+
"clean": "rm -rf dist",
|
|
58
|
+
"test": "vitest run"
|
|
57
59
|
}
|
|
58
60
|
}
|