@fayz-ai/pos 0.20.5 → 0.21.1
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/app/config.d.ts +216 -4
- package/dist/app/config.d.ts.map +1 -1
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10857 -2517
- package/dist/index.js.map +1 -1
- package/dist/lib/useFloorBell.d.ts +21 -0
- package/dist/lib/useFloorBell.d.ts.map +1 -0
- package/dist/screen/AreaInspector.d.ts +19 -0
- package/dist/screen/AreaInspector.d.ts.map +1 -0
- package/dist/screen/AreaOutlineSheet.d.ts +15 -0
- package/dist/screen/AreaOutlineSheet.d.ts.map +1 -0
- package/dist/screen/ArrangeSheet.d.ts +8 -0
- package/dist/screen/ArrangeSheet.d.ts.map +1 -0
- package/dist/screen/AuthorizeSheet.d.ts +73 -0
- package/dist/screen/AuthorizeSheet.d.ts.map +1 -0
- package/dist/screen/CancelSheet.d.ts +35 -0
- package/dist/screen/CancelSheet.d.ts.map +1 -0
- package/dist/screen/ClosedPanel.d.ts +55 -0
- package/dist/screen/ClosedPanel.d.ts.map +1 -0
- package/dist/screen/ConfirmSheet.d.ts +12 -0
- package/dist/screen/ConfirmSheet.d.ts.map +1 -0
- package/dist/screen/CourtesySheet.d.ts +23 -0
- package/dist/screen/CourtesySheet.d.ts.map +1 -0
- package/dist/screen/CoverChargeSheet.d.ts +16 -0
- package/dist/screen/CoverChargeSheet.d.ts.map +1 -0
- package/dist/screen/DeliveryBoard.d.ts +13 -0
- package/dist/screen/DeliveryBoard.d.ts.map +1 -1
- package/dist/screen/DiscountSheet.d.ts +85 -0
- package/dist/screen/DiscountSheet.d.ts.map +1 -0
- package/dist/screen/DispatchRail.d.ts.map +1 -1
- package/dist/screen/FloorScopeBanner.d.ts +11 -0
- package/dist/screen/FloorScopeBanner.d.ts.map +1 -0
- package/dist/screen/GuestBar.d.ts +51 -0
- package/dist/screen/GuestBar.d.ts.map +1 -0
- package/dist/screen/GuestCountSheet.d.ts +16 -0
- package/dist/screen/GuestCountSheet.d.ts.map +1 -0
- package/dist/screen/IdentitySheet.d.ts.map +1 -1
- package/dist/screen/ModifierSheet.d.ts.map +1 -1
- package/dist/screen/OpenTableSheet.d.ts.map +1 -1
- package/dist/screen/PinSheet.d.ts.map +1 -1
- package/dist/screen/PlanStage.d.ts +130 -0
- package/dist/screen/PlanStage.d.ts.map +1 -0
- package/dist/screen/PosScreen.d.ts +350 -3
- package/dist/screen/PosScreen.d.ts.map +1 -1
- package/dist/screen/ServiceChargeSheet.d.ts +98 -0
- package/dist/screen/ServiceChargeSheet.d.ts.map +1 -0
- package/dist/screen/SheetLayer.d.ts +8 -0
- package/dist/screen/SheetLayer.d.ts.map +1 -0
- package/dist/screen/ShiftPanel.d.ts +45 -0
- package/dist/screen/ShiftPanel.d.ts.map +1 -0
- package/dist/screen/ShortcutsOverlay.d.ts.map +1 -1
- package/dist/screen/SplitSheet.d.ts.map +1 -1
- package/dist/screen/TableInspector.d.ts +22 -0
- package/dist/screen/TableInspector.d.ts.map +1 -0
- package/dist/screen/TicketRail.d.ts +175 -2
- package/dist/screen/TicketRail.d.ts.map +1 -1
- package/dist/screen/TransferHistorySheet.d.ts +17 -0
- package/dist/screen/TransferHistorySheet.d.ts.map +1 -0
- package/dist/screen/TransferSheet.d.ts +65 -0
- package/dist/screen/TransferSheet.d.ts.map +1 -0
- package/dist/screen/UnassignedTables.d.ts +14 -0
- package/dist/screen/UnassignedTables.d.ts.map +1 -0
- package/dist/screen/WaitlistEntrySheet.d.ts +23 -0
- package/dist/screen/WaitlistEntrySheet.d.ts.map +1 -0
- package/dist/screen/WaitlistView.d.ts +41 -0
- package/dist/screen/WaitlistView.d.ts.map +1 -0
- package/dist/screen/ZoneDrawLayer.d.ts +11 -0
- package/dist/screen/ZoneDrawLayer.d.ts.map +1 -0
- package/dist/screen/ZoneHandles.d.ts +18 -0
- package/dist/screen/ZoneHandles.d.ts.map +1 -0
- package/dist/screen/ZoneInspector.d.ts +27 -0
- package/dist/screen/ZoneInspector.d.ts.map +1 -0
- package/dist/screen/accountFit.d.ts +17 -0
- package/dist/screen/accountFit.d.ts.map +1 -0
- package/dist/screen/accountPick.d.ts +16 -0
- package/dist/screen/accountPick.d.ts.map +1 -0
- package/dist/screen/areaOutline.d.ts +59 -0
- package/dist/screen/areaOutline.d.ts.map +1 -0
- package/dist/screen/arrangePlan.d.ts +109 -0
- package/dist/screen/arrangePlan.d.ts.map +1 -0
- package/dist/screen/arrangeTables.d.ts +69 -0
- package/dist/screen/arrangeTables.d.ts.map +1 -0
- package/dist/screen/billPrint.d.ts +66 -0
- package/dist/screen/billPrint.d.ts.map +1 -0
- package/dist/screen/cancelCheck.d.ts +31 -0
- package/dist/screen/cancelCheck.d.ts.map +1 -0
- package/dist/screen/cardBrand.d.ts +44 -0
- package/dist/screen/cardBrand.d.ts.map +1 -0
- package/dist/screen/cashGate.d.ts +31 -0
- package/dist/screen/cashGate.d.ts.map +1 -0
- package/dist/screen/catalogEmpty.d.ts +13 -0
- package/dist/screen/catalogEmpty.d.ts.map +1 -0
- package/dist/screen/categoryIcon.d.ts +4 -0
- package/dist/screen/categoryIcon.d.ts.map +1 -0
- package/dist/screen/channelSlot.d.ts +93 -0
- package/dist/screen/channelSlot.d.ts.map +1 -0
- package/dist/screen/comandaChannel.d.ts +49 -0
- package/dist/screen/comandaChannel.d.ts.map +1 -0
- package/dist/screen/courtesyGate.d.ts +31 -0
- package/dist/screen/courtesyGate.d.ts.map +1 -0
- package/dist/screen/coverQuantities.d.ts +46 -0
- package/dist/screen/coverQuantities.d.ts.map +1 -0
- package/dist/screen/deliveryColumns.d.ts +54 -0
- package/dist/screen/deliveryColumns.d.ts.map +1 -0
- package/dist/screen/discardCheck.d.ts +8 -0
- package/dist/screen/discardCheck.d.ts.map +1 -0
- package/dist/screen/discountBook.d.ts +40 -0
- package/dist/screen/discountBook.d.ts.map +1 -0
- package/dist/screen/discountCap.d.ts +9 -0
- package/dist/screen/discountCap.d.ts.map +1 -0
- package/dist/screen/discountSelectable.d.ts +20 -0
- package/dist/screen/discountSelectable.d.ts.map +1 -0
- package/dist/screen/dockScope.d.ts +9 -0
- package/dist/screen/dockScope.d.ts.map +1 -0
- package/dist/screen/fiscalSeal.d.ts +40 -0
- package/dist/screen/fiscalSeal.d.ts.map +1 -0
- package/dist/screen/floorEmpty.d.ts +20 -0
- package/dist/screen/floorEmpty.d.ts.map +1 -0
- package/dist/screen/floorGeometry.d.ts +295 -0
- package/dist/screen/floorGeometry.d.ts.map +1 -0
- package/dist/screen/floorScope.d.ts +49 -0
- package/dist/screen/floorScope.d.ts.map +1 -0
- package/dist/screen/floorStale.d.ts +5 -0
- package/dist/screen/floorStale.d.ts.map +1 -0
- package/dist/screen/guestCount.d.ts +28 -0
- package/dist/screen/guestCount.d.ts.map +1 -0
- package/dist/screen/guestCountOnClose.d.ts +11 -0
- package/dist/screen/guestCountOnClose.d.ts.map +1 -0
- package/dist/screen/ledgerMethod.d.ts +11 -0
- package/dist/screen/ledgerMethod.d.ts.map +1 -0
- package/dist/screen/menuFreshness.d.ts +18 -0
- package/dist/screen/menuFreshness.d.ts.map +1 -0
- package/dist/screen/menuSearch.d.ts +55 -0
- package/dist/screen/menuSearch.d.ts.map +1 -0
- package/dist/screen/modifierCheck.d.ts +23 -0
- package/dist/screen/modifierCheck.d.ts.map +1 -0
- package/dist/screen/openChannelCounts.d.ts +26 -0
- package/dist/screen/openChannelCounts.d.ts.map +1 -0
- package/dist/screen/orderRef.d.ts +17 -0
- package/dist/screen/orderRef.d.ts.map +1 -0
- package/dist/screen/paymentList.d.ts +26 -0
- package/dist/screen/paymentList.d.ts.map +1 -0
- package/dist/screen/pinGate.d.ts +28 -0
- package/dist/screen/pinGate.d.ts.map +1 -0
- package/dist/screen/reopen.d.ts +36 -0
- package/dist/screen/reopen.d.ts.map +1 -0
- package/dist/screen/searchSubject.d.ts +22 -0
- package/dist/screen/searchSubject.d.ts.map +1 -0
- package/dist/screen/serviceChargeCheck.d.ts +29 -0
- package/dist/screen/serviceChargeCheck.d.ts.map +1 -0
- package/dist/screen/serviceChargeGuard.d.ts +145 -0
- package/dist/screen/serviceChargeGuard.d.ts.map +1 -0
- package/dist/screen/servicePreview.d.ts +35 -0
- package/dist/screen/servicePreview.d.ts.map +1 -0
- package/dist/screen/session.d.ts +207 -0
- package/dist/screen/session.d.ts.map +1 -1
- package/dist/screen/sheetSubtitle.d.ts +8 -0
- package/dist/screen/sheetSubtitle.d.ts.map +1 -0
- package/dist/screen/shift.d.ts +97 -0
- package/dist/screen/shift.d.ts.map +1 -0
- package/dist/screen/specialReuse.d.ts +45 -0
- package/dist/screen/specialReuse.d.ts.map +1 -0
- package/dist/screen/svgDrag.d.ts +24 -0
- package/dist/screen/svgDrag.d.ts.map +1 -0
- package/dist/screen/tableTone.d.ts +64 -0
- package/dist/screen/tableTone.d.ts.map +1 -0
- package/dist/screen/transferDone.d.ts +12 -0
- package/dist/screen/transferDone.d.ts.map +1 -0
- package/dist/screen/transferGuestBlock.d.ts +30 -0
- package/dist/screen/transferGuestBlock.d.ts.map +1 -0
- package/dist/screen/transferPick.d.ts +51 -0
- package/dist/screen/transferPick.d.ts.map +1 -0
- package/dist/screen/views.d.ts +139 -4
- package/dist/screen/views.d.ts.map +1 -1
- package/dist/screen/waitlist.d.ts +211 -0
- package/dist/screen/waitlist.d.ts.map +1 -0
- package/dist/screen/writeFailure.d.ts +22 -0
- package/dist/screen/writeFailure.d.ts.map +1 -0
- package/dist/screen/zoneDraft.d.ts +75 -0
- package/dist/screen/zoneDraft.d.ts.map +1 -0
- package/dist/screen/zoneEditing.d.ts +56 -0
- package/dist/screen/zoneEditing.d.ts.map +1 -0
- package/dist/styles.css +2697 -200
- package/package.json +2 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** A chave de dono de uma linha. Sem participante, é a da mesa. */
|
|
2
|
+
export declare const SHARED_OWNER = "__mesa__";
|
|
3
|
+
export declare function ownerOfLine(line: {
|
|
4
|
+
guestId?: string | null;
|
|
5
|
+
}): string;
|
|
6
|
+
export interface PickOutcome {
|
|
7
|
+
/** A seleção depois do clique — a MESMA de antes quando foi recusado. */
|
|
8
|
+
picked: Set<string>;
|
|
9
|
+
/** A frase do V1, quando o clique foi recusado. */
|
|
10
|
+
refusal?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Marca ou desmarca uma linha, aplicando a regra do dono único.
|
|
14
|
+
*
|
|
15
|
+
* Desmarcar NUNCA é recusado: sair de uma seleção inválida não pode depender de
|
|
16
|
+
* uma seleção válida.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pickLineForTransfer(picked: Set<string>, lines: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
guestId?: string | null;
|
|
21
|
+
}>, lineId: string): PickOutcome;
|
|
22
|
+
export declare const NO_GUESTS_HINT = "Dispon\u00EDvel em comandas com participantes";
|
|
23
|
+
/** O subtítulo do modo, ou o motivo de ele estar fechado. */
|
|
24
|
+
export declare function transferModeHint(hint: string, needsGuests: boolean | undefined, guestCount: number): {
|
|
25
|
+
text: string;
|
|
26
|
+
blocked: boolean;
|
|
27
|
+
};
|
|
28
|
+
/** O rótulo do destino compartilhado. É o mesmo do agrupamento. */
|
|
29
|
+
export declare const SHARED_LABEL = "Mesa";
|
|
30
|
+
export interface TransferDestination {
|
|
31
|
+
/** `SHARED_OWNER` quando é a mesa. */
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Os destinos possíveis para as linhas selecionadas.
|
|
37
|
+
*
|
|
38
|
+
* `source` é o dono da seleção — `undefined` enquanto nada foi marcado, e aí a
|
|
39
|
+
* lista sai inteira: não há origem para excluir ainda.
|
|
40
|
+
*/
|
|
41
|
+
export declare function transferDestinations(guests: Array<{
|
|
42
|
+
id: string;
|
|
43
|
+
label: string;
|
|
44
|
+
settled?: boolean;
|
|
45
|
+
}>, source: string | undefined): TransferDestination[];
|
|
46
|
+
/** O dono da seleção atual, ou `undefined` se nada está marcado. */
|
|
47
|
+
export declare function selectionOwner(picked: Set<string> | string[], lines: Array<{
|
|
48
|
+
id: string;
|
|
49
|
+
guestId?: string | null;
|
|
50
|
+
}>): string | undefined;
|
|
51
|
+
//# sourceMappingURL=transferPick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferPick.d.ts","sourceRoot":"","sources":["../../src/screen/transferPick.ts"],"names":[],"mappings":"AAkBA,mEAAmE;AACnE,eAAO,MAAM,YAAY,aAAa,CAAA;AAEtC,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,MAAM,CAErE;AAED,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACnB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,EACnB,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EACrD,MAAM,EAAE,MAAM,GACb,WAAW,CAmBb;AAmBD,eAAO,MAAM,cAAc,kDAA6C,CAAA;AAExE,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAGpC;AA+BD,mEAAmE;AACnE,eAAO,MAAM,YAAY,SAAS,CAAA;AAElC,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EAC/D,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,mBAAmB,EAAE,CAQvB;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,EAC9B,KAAK,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GACpD,MAAM,GAAG,SAAS,CAMpB"}
|
package/dist/screen/views.d.ts
CHANGED
|
@@ -1,10 +1,59 @@
|
|
|
1
|
+
import { type PlanZone } from './PlanStage';
|
|
2
|
+
import type { ZoneDraft, ZoneTool } from './zoneDraft';
|
|
3
|
+
import type { ZoneGeometry, ZoneMembershipAction } from './zoneEditing';
|
|
1
4
|
import { Search } from 'lucide-react';
|
|
2
5
|
import type { PosCategory, PosItem, PosPosition, PosPositionConfig, PosPositionStatus, PosStaff } from '../app/config';
|
|
6
|
+
import { type TableTone } from './tableTone';
|
|
3
7
|
/** Colour never carries the meaning alone: icon and word ride along. */
|
|
4
8
|
export declare function StatusBadge({ status }: {
|
|
5
9
|
status: PosPositionStatus;
|
|
6
10
|
}): import("react").JSX.Element;
|
|
11
|
+
/**
|
|
12
|
+
* O rótulo da pastilha — e para a mesa PARADA ele diz HÁ QUANTO TEMPO.
|
|
13
|
+
*
|
|
14
|
+
* O V1 escreve a duração de verdade e explica por quê:
|
|
15
|
+
*
|
|
16
|
+
* > *"Vermelho é «sem pedido há 1 h»: a pastilha diz isso, senão o operador vê
|
|
17
|
+
* > o mesmo «cerca de 1 hora» do laranja e não sabe por que a cor mudou."*
|
|
18
|
+
*
|
|
19
|
+
* O V2 mostrava a constante `'Sem pedido há 1 h'` em toda mesa parada. Agora
|
|
20
|
+
* mesmo, no Pertinho, oito mesas estão paradas e as oito dizem a mesma frase —
|
|
21
|
+
* a de cinco horas e a de sessenta e um minutos são indistinguíveis, e é
|
|
22
|
+
* justamente entre essas duas que o gerente escolhe em qual mesa encostar
|
|
23
|
+
* primeiro.
|
|
24
|
+
*
|
|
25
|
+
* Conta do `lastOrderAt`, e cai para a abertura quando não há item nenhum: é o
|
|
26
|
+
* `last_item_at ?? opened_at` do V1, e é o que faz a mesa aberta há duas horas
|
|
27
|
+
* sem pedir nada dizer «sem pedido há 2 horas» em vez de «agora».
|
|
28
|
+
*/
|
|
29
|
+
export declare function toneBadgeLabel(tone: TableTone, p: {
|
|
30
|
+
lastOrderAt?: string | null;
|
|
31
|
+
openedAt?: string | null;
|
|
32
|
+
}, now?: number): string;
|
|
33
|
+
/**
|
|
34
|
+
* Há quanto tempo, na língua de quem lê — o `formatDistanceToNow` do V1.
|
|
35
|
+
*
|
|
36
|
+
* `453h22` é um número, não uma resposta: ninguém converte quatrocentas e
|
|
37
|
+
* cinquenta horas em "dezenove dias" no meio do serviço. E essas comandas
|
|
38
|
+
* existem — sete das doze abertas do Pertinho têm zero itens e dias de idade
|
|
39
|
+
* (V1-079). O formato precisa aguentá-las sem virar ruído.
|
|
40
|
+
*/
|
|
7
41
|
export declare function elapsed(openedAt?: string, now?: number): string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* A idade em UMA PASTILHA de 200px — «agora · 45min · 2h · 3d».
|
|
44
|
+
*
|
|
45
|
+
* O V1 tem as duas formas e explica por quê: *"`formatDistanceToNow` devolve
|
|
46
|
+
* «cerca de 1 hora» e «5 meses»: numa pastilha de 200px isso é a coisa mais
|
|
47
|
+
* larga da linha. Aqui o tempo é um número."*
|
|
48
|
+
*
|
|
49
|
+
* O cartão da mesa tem largura e fica com `elapsed`, por extenso. A ficha da
|
|
50
|
+
* bandeja não tem, e o valor da comanda divide a linha com ela.
|
|
51
|
+
*
|
|
52
|
+
* E arredonda para BAIXO, como o V1: uma comanda de 90 minutos tem uma hora
|
|
53
|
+
* cheia, não duas. Arredondar para cima envelhece a comanda e dispara o olho
|
|
54
|
+
* do gerente para uma mesa que ainda está no prazo.
|
|
55
|
+
*/
|
|
56
|
+
export declare function briefElapsed(openedAt?: string, now?: number): string | undefined;
|
|
8
57
|
/**
|
|
9
58
|
* O esqueleto do que está vindo, não um spinner.
|
|
10
59
|
*
|
|
@@ -13,8 +62,25 @@ export declare function elapsed(openedAt?: string, now?: number): string | undef
|
|
|
13
62
|
* abre com a mão indo para a primeira mesa, o salto é o que faz errar o alvo.
|
|
14
63
|
* `aria-busy` no contêiner conta a mesma coisa para quem não vê o desenho.
|
|
15
64
|
*/
|
|
16
|
-
|
|
17
|
-
|
|
65
|
+
/**
|
|
66
|
+
* O salão enquanto ele carrega.
|
|
67
|
+
*
|
|
68
|
+
* Um esqueleto só vale se tiver a FORMA do que vem — inclusive os cabeçalhos
|
|
69
|
+
* de grupo. O anterior desenhava cartões soltos, e quando o dado chegava a
|
|
70
|
+
* tela se reorganizava inteira: nasciam as faixas OCUPADAS e LIVRES e cada
|
|
71
|
+
* cartão pulava de lugar. Quem já estava mirando uma mesa mirava outra.
|
|
72
|
+
*
|
|
73
|
+
* Por isso ele reproduz a grade de verdade: duas faixas, os contadores, e o
|
|
74
|
+
* cartão com topo, selo, rodapé de tempo e valor. As proporções saem das
|
|
75
|
+
* mesmas medidas do `.pos-tbl`, e não de números escolhidos a olho.
|
|
76
|
+
*
|
|
77
|
+
* `busy`/`free` são quantos cartões desenhar em cada faixa. O padrão é uma
|
|
78
|
+
* casa pequena em serviço — poucas ocupadas, várias livres —, que é a forma
|
|
79
|
+
* que o salão tem na maior parte do tempo.
|
|
80
|
+
*/
|
|
81
|
+
export declare function FloorSkeleton({ busy, free }: {
|
|
82
|
+
busy?: number;
|
|
83
|
+
free?: number;
|
|
18
84
|
}): import("react").JSX.Element;
|
|
19
85
|
export declare function CatalogSkeleton({ categories, items }: {
|
|
20
86
|
categories?: number;
|
|
@@ -30,12 +96,15 @@ export declare function EmptyState({ title, hint, Icon, action }: {
|
|
|
30
96
|
onClick: () => void;
|
|
31
97
|
};
|
|
32
98
|
}): import("react").JSX.Element;
|
|
33
|
-
export declare function FloorView({ positions, config, activeId, onSelect, now, picking, layout }: {
|
|
99
|
+
export declare function FloorView({ positions, config, activeId, onSelect, now, picking, layout, focusAreaId, serviceAreas, editingPlan, onMoveTable, onPickTable, scoped, houseHasTables, areaFiltered, tool, onDrawZone, draftColor, selectedZoneId, onSelectZone, onUpdateZone, onRefuseZone, pickingZone, onToggleTableInZone, selectedAreaId, onSelectArea, dimmedIds }: {
|
|
34
100
|
positions: PosPosition[];
|
|
35
101
|
config: PosPositionConfig;
|
|
36
102
|
activeId?: string;
|
|
37
103
|
onSelect: (p: PosPosition) => void;
|
|
38
104
|
now: number;
|
|
105
|
+
/** As mesas fora do escopo do operador. A planta as ESMAECE; a grade as
|
|
106
|
+
* REMOVE, e o recorte para ela acontece antes daqui. Ver `foraDoEscopo`. */
|
|
107
|
+
dimmedIds?: ReadonlySet<string>;
|
|
39
108
|
/** A party is waiting: only the free tables are answers to the question. */
|
|
40
109
|
picking?: boolean;
|
|
41
110
|
/**
|
|
@@ -48,19 +117,61 @@ export declare function FloorView({ positions, config, activeId, onSelect, now,
|
|
|
48
117
|
* grade é o padrão, e a planta é para quando a dúvida é geográfica.
|
|
49
118
|
*/
|
|
50
119
|
layout?: 'grid' | 'plan';
|
|
120
|
+
/** A área escolhida no rodapé: na planta ela é FOCO, não filtro. */
|
|
121
|
+
focusAreaId?: string;
|
|
122
|
+
/** As praças desenhadas — a região de cada garçom. */
|
|
123
|
+
serviceAreas?: PlanZone[];
|
|
124
|
+
/** Editar a planta: a mesa passa a se arrastar em vez de abrir a comanda. */
|
|
125
|
+
editingPlan?: boolean;
|
|
126
|
+
/** A ferramenta de praça armada e o que fazer com o gesto (ver PlanStage). */
|
|
127
|
+
tool?: ZoneTool | null;
|
|
128
|
+
onDrawZone?: (draft: ZoneDraft) => void;
|
|
129
|
+
draftColor?: string;
|
|
130
|
+
selectedZoneId?: string | null;
|
|
131
|
+
onSelectZone?: (id: string | null) => void;
|
|
132
|
+
onUpdateZone?: (id: string, patch: Partial<ZoneGeometry>) => void;
|
|
133
|
+
onRefuseZone?: (reason: string) => void;
|
|
134
|
+
pickingZone?: boolean;
|
|
135
|
+
onToggleTableInZone?: (tableId: string, how: ZoneMembershipAction) => void;
|
|
136
|
+
selectedAreaId?: string | null;
|
|
137
|
+
onSelectArea?: (id: string | null) => void;
|
|
138
|
+
onMoveTable?: (id: string, to: {
|
|
139
|
+
x: number;
|
|
140
|
+
y: number;
|
|
141
|
+
}) => void;
|
|
142
|
+
/** Em edição, tocar a mesa ABRE A FICHA em vez de abrir a comanda. */
|
|
143
|
+
onPickTable?: (id: string) => void;
|
|
144
|
+
/** O operador está recortado à praça dele — ver `floorEmpty`. */
|
|
145
|
+
scoped?: boolean;
|
|
146
|
+
/** A casa tem mesa cadastrada, fora do recorte e do filtro. */
|
|
147
|
+
houseHasTables?: boolean;
|
|
148
|
+
/** Há filtro de área ligado agora. */
|
|
149
|
+
areaFiltered?: boolean;
|
|
51
150
|
}): import("react").JSX.Element;
|
|
52
151
|
/** Two letters is what fits on a table at plan scale, and it is what a floor
|
|
53
152
|
* manager already reads on a printed roster. */
|
|
54
153
|
export declare function initialsOf(name: string): string;
|
|
55
|
-
export declare function CatalogView({ categories, items, activeCategoryId, onCategoryChange, quantities, onAdd, onRemove, query, }: {
|
|
154
|
+
export declare function CatalogView({ categories, items, activeCategoryId, onCategoryChange, quantities, pending, onAdd, onRemove, query, menuLabel, onRefreshMenu, menuRefreshing, }: {
|
|
56
155
|
categories: PosCategory[];
|
|
57
156
|
items: PosItem[];
|
|
58
157
|
activeCategoryId?: string;
|
|
59
158
|
onCategoryChange: (id: string) => void;
|
|
60
159
|
quantities: Record<string, number>;
|
|
160
|
+
/** Quanto de cada item ainda está no CARRINHO — o que dá para tirar daqui. */
|
|
161
|
+
pending?: Record<string, number>;
|
|
61
162
|
onAdd: (item: PosItem) => void;
|
|
62
163
|
onRemove: (item: PosItem) => void;
|
|
63
164
|
query: string;
|
|
165
|
+
/** A idade desta cópia do cardápio — ver `menuFreshnessLabel`. */
|
|
166
|
+
menuLabel?: string;
|
|
167
|
+
/**
|
|
168
|
+
* Ir buscar o cardápio AGORA.
|
|
169
|
+
*
|
|
170
|
+
* Sem ele a linha de frescor não aparece: um app que não sabe revalidar não
|
|
171
|
+
* deve prometer um botão que não faz nada.
|
|
172
|
+
*/
|
|
173
|
+
onRefreshMenu?: () => void;
|
|
174
|
+
menuRefreshing?: boolean;
|
|
64
175
|
}): import("react").JSX.Element;
|
|
65
176
|
export declare function ListView({ positions, activeId, onSelect, now, emptyLabel }: {
|
|
66
177
|
positions: PosPosition[];
|
|
@@ -73,4 +184,28 @@ export declare function ShiftView({ positions, staff }: {
|
|
|
73
184
|
positions: PosPosition[];
|
|
74
185
|
staff: PosStaff[];
|
|
75
186
|
}): import("react").JSX.Element;
|
|
187
|
+
/**
|
|
188
|
+
* O valor que a ficha da bandeja mostra — o SALDO, não o total.
|
|
189
|
+
*
|
|
190
|
+
* Regra do V1, e está numa linha só:
|
|
191
|
+
*
|
|
192
|
+
* ```ts
|
|
193
|
+
* const openOrdersWithOutstandingBalance = openOrders.map(order => ({
|
|
194
|
+
* ...order, total: order.balance ?? order.total,
|
|
195
|
+
* }))
|
|
196
|
+
* ```
|
|
197
|
+
*
|
|
198
|
+
* A bandeja responde **"quanto ainda está lá fora"**, não "quanto foi lançado".
|
|
199
|
+
* Uma mesa de R$ 300 que já pagou R$ 250 aparece como R$ 50: o total dá ao caixa
|
|
200
|
+
* um número que ele não vai receber, e numa casa com pagamento por participante
|
|
201
|
+
* a soma da régua deixa de bater com o dinheiro que falta entrar.
|
|
202
|
+
*
|
|
203
|
+
* Zero é resultado válido e aparece como R$ 0,00 — conta paga e ainda aberta é
|
|
204
|
+
* um estado de verdade (ninguém fechou), e a ficha continuar na bandeja é o que
|
|
205
|
+
* lembra de fechá-la.
|
|
206
|
+
*
|
|
207
|
+
* Nunca negativo: pagamento a mais é troco a devolver, e um valor negativo na
|
|
208
|
+
* régua leria como se a casa devesse dinheiro ao cliente.
|
|
209
|
+
*/
|
|
210
|
+
export declare function dockAmountCents(totalCents: number | undefined, paidByGuest?: Record<string, number>): number | undefined;
|
|
76
211
|
//# sourceMappingURL=views.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/screen/views.tsx"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/screen/views.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/** Os cinco estados do V1, valor por valor — é o CHECK da tabela. */
|
|
2
|
+
export type WaitlistStatus = 'waiting' | 'called' | 'seated' | 'no_show' | 'cancelled';
|
|
3
|
+
/** Um grupo esperando mesa. A unidade da fila é o GRUPO, não a pessoa. */
|
|
4
|
+
export interface WaitlistEntry {
|
|
5
|
+
id: string;
|
|
6
|
+
/** Nome de quem espera. Walk-in não é cadastro: o nome vive na própria linha. */
|
|
7
|
+
name: string;
|
|
8
|
+
/** O PRIMEIRO campo do formulário no V1 — ver `WaitlistEntrySheet`. */
|
|
9
|
+
phone: string;
|
|
10
|
+
party: number;
|
|
11
|
+
/**
|
|
12
|
+
* A menor mesa da casa que comporta o grupo, resolvida no banco.
|
|
13
|
+
*
|
|
14
|
+
* É a chave da contagem de posição. Ausente, a linha cai no próprio
|
|
15
|
+
* `party` — uma casa que ainda não cadastrou mesa nenhuma continua tendo
|
|
16
|
+
* fila, só que cada tamanho vira o seu próprio bucket.
|
|
17
|
+
*/
|
|
18
|
+
sizeBucket?: number | null;
|
|
19
|
+
/** ISO. A ordem da fila, e o "espera há…" da linha. */
|
|
20
|
+
joinedAt: string;
|
|
21
|
+
status: WaitlistStatus;
|
|
22
|
+
callExpiresAt?: string | null;
|
|
23
|
+
/** Quantas vezes já foi chamado. O segundo grito aparece na linha. */
|
|
24
|
+
callCount?: number;
|
|
25
|
+
/** Ambiente preferido (opcional). `Tanto faz` é a ausência dele. */
|
|
26
|
+
zoneId?: string | null;
|
|
27
|
+
/** «Cadeirinha, aniversário, mesa perto da janela…» */
|
|
28
|
+
note?: string | null;
|
|
29
|
+
/** Preenchida por `withPositions`; 0 para quem não está mais aguardando. */
|
|
30
|
+
position?: number;
|
|
31
|
+
}
|
|
32
|
+
/** O que o balcão digita para pôr alguém na fila. */
|
|
33
|
+
export interface NewWaitlistEntry {
|
|
34
|
+
name: string;
|
|
35
|
+
phone: string;
|
|
36
|
+
party: number;
|
|
37
|
+
zoneId?: string | null;
|
|
38
|
+
note?: string | null;
|
|
39
|
+
/**
|
|
40
|
+
* A ficha que o telefone encontrou, quando encontrou.
|
|
41
|
+
*
|
|
42
|
+
* Só é preenchida por casamento com quem JÁ existe: a fila não cria pessoa,
|
|
43
|
+
* senão o cadastro enche de quem passou na porta uma vez e nunca voltou.
|
|
44
|
+
*/
|
|
45
|
+
personId?: string | null;
|
|
46
|
+
}
|
|
47
|
+
/** Só quem ainda disputa mesa aparece no painel do anfitrião. */
|
|
48
|
+
export declare const ACTIVE_STATUSES: WaitlistStatus[];
|
|
49
|
+
/** O teto do contador de pessoas no V1: `Math.min(40, p + 1)`. */
|
|
50
|
+
export declare const MAX_PARTY = 40;
|
|
51
|
+
/**
|
|
52
|
+
* A posição de cada um, DENTRO do seu bucket.
|
|
53
|
+
*
|
|
54
|
+
* Quem já foi chamado, sentou ou saiu devolve 0 — a mesma convenção da
|
|
55
|
+
* `waitlist_position` do banco, e é o que a tela lê para trocar de estado sem
|
|
56
|
+
* uma segunda pergunta. A ordenação por `joinedAt` é feita aqui e não confiada
|
|
57
|
+
* à consulta: a lista chega ordenada hoje, e uma linha que entra por realtime
|
|
58
|
+
* chega no fim independentemente da hora em que o grupo pisou na porta.
|
|
59
|
+
*/
|
|
60
|
+
export declare function withPositions(entries: WaitlistEntry[]): WaitlistEntry[];
|
|
61
|
+
/**
|
|
62
|
+
* O prazo do chamado estourou.
|
|
63
|
+
*
|
|
64
|
+
* O V1 NÃO marca falta sozinho, de propósito — o grupo pode estar entrando
|
|
65
|
+
* pela porta no minuto em que o prazo vira. Isto só pinta a linha de vermelho;
|
|
66
|
+
* quem decide continua sendo o anfitrião.
|
|
67
|
+
*/
|
|
68
|
+
export declare function isCallOverdue(e: WaitlistEntry, now: number): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* A frase da linha chamada, literal do V1.
|
|
71
|
+
*
|
|
72
|
+
* O `Nx` só aparece a partir do segundo chamado: escrever «(1x)» em toda linha
|
|
73
|
+
* chamada gastaria espaço para dizer o que já se sabe.
|
|
74
|
+
*/
|
|
75
|
+
export declare function calledLabel(e: WaitlistEntry, now: number): string | null;
|
|
76
|
+
/**
|
|
77
|
+
* O contador do topo: «3 grupos aguardando · 1 chamado».
|
|
78
|
+
*
|
|
79
|
+
* A unidade é o GRUPO, não a pessoa — quem lê precisa saber quantas MESAS
|
|
80
|
+
* faltam, não quantas bocas. Os chamados só entram quando existem: um «· 0
|
|
81
|
+
* chamados» permanente é ruído.
|
|
82
|
+
*/
|
|
83
|
+
export declare function waitingSummary(entries: WaitlistEntry[]): string;
|
|
84
|
+
/** O ± do formulário: nunca abaixo de 1, nunca acima de 40. Regra do V1. */
|
|
85
|
+
export declare function clampParty(n: number): number;
|
|
86
|
+
/** Só os dígitos — é assim que o V1 mede se o telefone está completo. */
|
|
87
|
+
export declare function onlyDigits(s: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* `(00) 00000-0000` — a máscara do V1, e o formato em que o telefone é gravado.
|
|
90
|
+
*
|
|
91
|
+
* Grava formatado de propósito: é o que o anfitrião lê na linha da fila para
|
|
92
|
+
* ligar, e reformatar na leitura obrigaria as duas pontas a concordar sobre um
|
|
93
|
+
* formato que nenhuma das duas guarda.
|
|
94
|
+
*/
|
|
95
|
+
export declare function formatPhoneBR(raw: string): string;
|
|
96
|
+
/**
|
|
97
|
+
* O submit libera? Regra do V1, os três termos:
|
|
98
|
+
* nome com 2+ letras, telefone com 10+ dígitos, grupo maior que zero.
|
|
99
|
+
*
|
|
100
|
+
* O telefone entra na validação — e não é burocracia. É por ele que a casa
|
|
101
|
+
* alcança o grupo que saiu da porta, e no V1 é ele que carrega o link da
|
|
102
|
+
* posição. Uma linha na fila sem telefone é um cliente que só pode esperar de
|
|
103
|
+
* pé.
|
|
104
|
+
*/
|
|
105
|
+
export declare function isEntryValid(e: Partial<NewWaitlistEntry>): boolean;
|
|
106
|
+
/** O que falta para «Colocar na fila» liberar — a tela DIZ, não emudece. */
|
|
107
|
+
export declare function entryBlocker(e: Partial<NewWaitlistEntry>): string | null;
|
|
108
|
+
/**
|
|
109
|
+
* As mesas que servem para acomodar este grupo AGORA.
|
|
110
|
+
*
|
|
111
|
+
* Regra do `WaitlistSeatDialog` do V1, inteira: mesa ativa, LIVRE e com
|
|
112
|
+
* capacidade suficiente; a do ambiente preferido primeiro, depois a MENOR que
|
|
113
|
+
* serve. Sentar um casal na mesa de oito é o jeito mais rápido de a fila parar
|
|
114
|
+
* de andar — a mesa de oito é a única que atende o grupo de sete que chega em
|
|
115
|
+
* seguida.
|
|
116
|
+
*
|
|
117
|
+
* Mesa sem capacidade cadastrada (`seats` ausente) entra: o V2 aceita mesa sem
|
|
118
|
+
* lugares declarados, e escondê-la faria a casa que nunca preencheu o campo ver
|
|
119
|
+
* «nenhuma mesa serve» com o salão vazio.
|
|
120
|
+
*/
|
|
121
|
+
export declare function seatableTables<T extends {
|
|
122
|
+
id: string;
|
|
123
|
+
label: string;
|
|
124
|
+
status: string;
|
|
125
|
+
seats?: number;
|
|
126
|
+
areaId?: string | null;
|
|
127
|
+
zoneId?: string;
|
|
128
|
+
}>(positions: T[], party: number, preferredZoneId?: string | null): T[];
|
|
129
|
+
/**
|
|
130
|
+
* Nenhuma mesa livre comporta o grupo — a frase do V1, com o número dentro.
|
|
131
|
+
*
|
|
132
|
+
* Ela não é um erro: é a instrução do que fazer em seguida (juntar mesas pelo
|
|
133
|
+
* mapa). Um botão morto em silêncio deixaria o anfitrião tentando de novo.
|
|
134
|
+
*/
|
|
135
|
+
export declare function noTableFitsMessage(party: number): string;
|
|
136
|
+
/** «espera há 12 min» / «há 1 h 20 min» — o relógio da linha. */
|
|
137
|
+
export declare function waitingFor(joinedAt: string, now: number): string;
|
|
138
|
+
/** O vazio do V1, palavra por palavra. */
|
|
139
|
+
export declare const EMPTY_TITLE = "Ningu\u00E9m na fila";
|
|
140
|
+
export declare const EMPTY_HINT = "Quando o sal\u00E3o encher, coloque aqui quem chegar sem reserva.";
|
|
141
|
+
/**
|
|
142
|
+
* O subtítulo da tela.
|
|
143
|
+
*
|
|
144
|
+
* O V1 escreve *"Quem chegou sem reserva. O cliente acompanha a posição pelo
|
|
145
|
+
* link que recebe no WhatsApp."* — e a segunda frase é uma PROMESSA. Enquanto
|
|
146
|
+
* o link público não existir no V2, repeti-la faria a tela mentir para o
|
|
147
|
+
* anfitrião, que confiaria nela para deixar o cliente sair da porta.
|
|
148
|
+
*
|
|
149
|
+
* Então ela fica de fora até o link existir. O resto é verdade hoje.
|
|
150
|
+
*/
|
|
151
|
+
export declare const WAITLIST_SUBTITLE = "Quem chegou sem reserva e est\u00E1 esperando mesa.";
|
|
152
|
+
import type { PosReservation } from '../app/config';
|
|
153
|
+
/** Uma reserva ainda está "por entrar"? Sentada, cancelada ou faltante, não. */
|
|
154
|
+
export declare function stillIncoming(r: {
|
|
155
|
+
status: string;
|
|
156
|
+
}): boolean;
|
|
157
|
+
/**
|
|
158
|
+
* A ordem das reservas na lista de entrada.
|
|
159
|
+
*
|
|
160
|
+
* **Quem JÁ CHEGOU vem antes**, e não é detalhe: essa gente está de pé na
|
|
161
|
+
* recepção agora, enquanto a reserva das 21h ainda está em casa. Ordenar só
|
|
162
|
+
* pelo horário empurraria para baixo justamente quem o anfitrião tem na frente
|
|
163
|
+
* dele — e essa é a lista que ele lê para decidir quem senta na próxima mesa.
|
|
164
|
+
*
|
|
165
|
+
* Entre os que chegaram, quem chegou primeiro; entre os que não chegaram, a
|
|
166
|
+
* hora marcada.
|
|
167
|
+
*/
|
|
168
|
+
export declare function incomingOrder(reservations: PosReservation[]): PosReservation[];
|
|
169
|
+
/**
|
|
170
|
+
* Quantos minutos a reserva está atrasada. Negativo (ainda não é a hora) vira 0.
|
|
171
|
+
*
|
|
172
|
+
* Só conta para quem NÃO chegou: uma reserva das 20h com o grupo de pé na
|
|
173
|
+
* recepção desde as 20h05 não está atrasada — ela está esperando mesa, que é
|
|
174
|
+
* outra conversa.
|
|
175
|
+
*/
|
|
176
|
+
export declare function minutesLate(r: {
|
|
177
|
+
at: string;
|
|
178
|
+
status: string;
|
|
179
|
+
}, now: number): number;
|
|
180
|
+
/** «20:30» — o horário reservado, que é o que a linha da reserva mostra. */
|
|
181
|
+
export declare function clockOf(iso: string): string;
|
|
182
|
+
/**
|
|
183
|
+
* O grupo casa com o termo.
|
|
184
|
+
*
|
|
185
|
+
* Casa por **nome** e por **telefone** porque são os dois jeitos de a recepção
|
|
186
|
+
* chamar alguém — o nome quando ela lembra, o número quando o cliente ligou
|
|
187
|
+
* dizendo "estou na fila". O telefone compara só os DÍGITOS dos dois lados:
|
|
188
|
+
* o banco guarda «(11) 99999-0000» e quem procura digita «99999» ou
|
|
189
|
+
* «11999990000», e uma comparação sobre o texto formatado não casaria nenhum
|
|
190
|
+
* dos dois.
|
|
191
|
+
*
|
|
192
|
+
* O número de PESSOAS entra também, mas só quando o termo é um número puro e
|
|
193
|
+
* curto: buscar «4» numa fila cheia acha os grupos de quatro, que é a pergunta
|
|
194
|
+
* de quem acabou de liberar uma mesa de quatro. Não vale para termo com letra,
|
|
195
|
+
* senão «4 pessoas» casaria com qualquer coisa.
|
|
196
|
+
*/
|
|
197
|
+
export declare function entryMatches(row: {
|
|
198
|
+
name?: string | null;
|
|
199
|
+
phone?: string | null;
|
|
200
|
+
party?: number;
|
|
201
|
+
}, term: string): boolean;
|
|
202
|
+
/**
|
|
203
|
+
* O vazio por FILTRO não é o vazio da fila.
|
|
204
|
+
*
|
|
205
|
+
* «Ninguém na fila» quer dizer *a casa está tranquila*; «Nada com “ana”» quer
|
|
206
|
+
* dizer *apague o que você digitou*. Dizer a primeira frase quando a causa é a
|
|
207
|
+
* segunda faz o anfitrião concluir que o grupo sumiu — e ele acabou de pôr o
|
|
208
|
+
* grupo ali.
|
|
209
|
+
*/
|
|
210
|
+
export declare function filteredEmptyHint(term: string): string;
|
|
211
|
+
//# sourceMappingURL=waitlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waitlist.d.ts","sourceRoot":"","sources":["../../src/screen/waitlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare function isTechnical(message: string): boolean;
|
|
2
|
+
/** A frase genérica. Não pede para tentar de novo: pode ter gravado. */
|
|
3
|
+
export declare const WRITE_FAILED = "N\u00E3o foi poss\u00EDvel concluir a opera\u00E7\u00E3o. Confira a comanda antes de repetir.";
|
|
4
|
+
/** A rede caiu — e aí repetir é seguro, porque nada chegou ao servidor. */
|
|
5
|
+
export declare const OFFLINE_FAILED = "Sem conex\u00E3o com o servidor. Verifique a rede e tente novamente.";
|
|
6
|
+
/**
|
|
7
|
+
* As duas situações que o V1 nomeia e que o V2 também alcança escrevendo
|
|
8
|
+
* direto. As frases são dele, palavra por palavra.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ALREADY_DONE = "A tentativa foi reutilizada com dados diferentes. Feche e abra a opera\u00E7\u00E3o novamente.";
|
|
11
|
+
export declare const NOT_ALLOWED = "Voc\u00EA n\u00E3o tem permiss\u00E3o para esta opera\u00E7\u00E3o. Pe\u00E7a a um gerente.";
|
|
12
|
+
/**
|
|
13
|
+
* A frase para a tela, e o que registrar no console.
|
|
14
|
+
*
|
|
15
|
+
* `technical` é `undefined` quando a mensagem já era nossa — aí ela vai para a
|
|
16
|
+
* tela como está e não há nada a registrar.
|
|
17
|
+
*/
|
|
18
|
+
export declare function writeFailure(error: unknown): {
|
|
19
|
+
text: string;
|
|
20
|
+
technical?: string;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=writeFailure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeFailure.d.ts","sourceRoot":"","sources":["../../src/screen/writeFailure.ts"],"names":[],"mappings":"AAsCA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wEAAwE;AACxE,eAAO,MAAM,YAAY,kGACoD,CAAA;AAE7E,2EAA2E;AAC3E,eAAO,MAAM,cAAc,yEACwC,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,YAAY,mGAC+D,CAAA;AACxF,eAAO,MAAM,WAAW,gGACyC,CAAA;AAEjE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAejF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type Box, type Point } from './floorGeometry';
|
|
2
|
+
/** As três ferramentas do V1, com o nome que cada uma grava em `shape`. */
|
|
3
|
+
export type ZoneTool = 'rectangle' | 'ellipse' | 'polygon';
|
|
4
|
+
/** A paleta do V1 (`SectionEditor.DEFAULT_COLORS`), na ordem. */
|
|
5
|
+
export declare const ZONE_COLORS: string[];
|
|
6
|
+
export interface ZoneFields {
|
|
7
|
+
name: string;
|
|
8
|
+
color: string;
|
|
9
|
+
shape: ZoneTool;
|
|
10
|
+
sortOrder: number;
|
|
11
|
+
posX?: number;
|
|
12
|
+
posY?: number;
|
|
13
|
+
widthM?: number;
|
|
14
|
+
heightM?: number;
|
|
15
|
+
polygon?: Point[];
|
|
16
|
+
/** As mesas que caíram dentro do desenho — o palco preenche. */
|
|
17
|
+
tableIds?: string[];
|
|
18
|
+
}
|
|
19
|
+
export type ZoneDraft = {
|
|
20
|
+
ok: true;
|
|
21
|
+
fields: ZoneFields;
|
|
22
|
+
}
|
|
23
|
+
/** A recusa, com as palavras do V1 — título e explicação do gesto. */
|
|
24
|
+
| {
|
|
25
|
+
ok: false;
|
|
26
|
+
title: string;
|
|
27
|
+
detail: string;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* O próximo nome livre.
|
|
31
|
+
*
|
|
32
|
+
* Começa em `praças + 1` e anda enquanto o nome estiver tomado — por uma praça
|
|
33
|
+
* OU por um ambiente.
|
|
34
|
+
*/
|
|
35
|
+
export declare function nextZoneName(zones: Array<{
|
|
36
|
+
name: string;
|
|
37
|
+
}>, areas?: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
}>): string;
|
|
40
|
+
/** A cor roda pela paleta na ordem em que as praças foram criadas. */
|
|
41
|
+
export declare function nextZoneColor(zones: unknown[]): string;
|
|
42
|
+
/**
|
|
43
|
+
* O gesto vira praça — ou vira recusa.
|
|
44
|
+
*
|
|
45
|
+
* `box` é o bbox do arrasto (retângulo e elipse); `stroke` é o traço cru da
|
|
46
|
+
* mão livre. Só um dos dois importa, conforme a ferramenta.
|
|
47
|
+
*/
|
|
48
|
+
export declare function zoneFromDrawing(tool: ZoneTool, { box, stroke, zones, areas }: {
|
|
49
|
+
box: Box | null;
|
|
50
|
+
stroke: Point[];
|
|
51
|
+
zones: Array<{
|
|
52
|
+
name: string;
|
|
53
|
+
}>;
|
|
54
|
+
areas?: Array<{
|
|
55
|
+
name: string;
|
|
56
|
+
}>;
|
|
57
|
+
}): ZoneDraft;
|
|
58
|
+
/** A área que a praça ocupa, para a ficha dizer o tamanho do desenho. */
|
|
59
|
+
export declare function zoneArea(f: Pick<ZoneFields, 'shape' | 'widthM' | 'heightM' | 'polygon'>): number;
|
|
60
|
+
/**
|
|
61
|
+
* Que mesas a praça PEGOU.
|
|
62
|
+
*
|
|
63
|
+
* No V1 quem responde isto é um gatilho no banco; aqui responde a geometria,
|
|
64
|
+
* que já está toda em metros no palco. A conta é a mesma — o centro da mesa
|
|
65
|
+
* dentro do desenho — e fica num lugar só, ao lado do desenho que a originou,
|
|
66
|
+
* em vez de virar um segundo dialeto de geometria dentro do SQL.
|
|
67
|
+
*
|
|
68
|
+
* `centers` são os centros em metros ABSOLUTOS: a praça cruza ambientes, e
|
|
69
|
+
* uma coordenada local ao ambiente responderia à pergunta errada.
|
|
70
|
+
*/
|
|
71
|
+
export declare function tablesInZone(f: Pick<ZoneFields, 'shape' | 'posX' | 'posY' | 'widthM' | 'heightM' | 'polygon'>, centers: Array<{
|
|
72
|
+
id: string;
|
|
73
|
+
center: Point;
|
|
74
|
+
}>): string[];
|
|
75
|
+
//# sourceMappingURL=zoneDraft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoneDraft.d.ts","sourceRoot":"","sources":["../../src/screen/zoneDraft.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEL,KAAK,GAAG,EAAE,KAAK,KAAK,EACrB,MAAM,iBAAiB,CAAA;AAExB,2EAA2E;AAC3E,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAA;AAE1D,iEAAiE;AACjE,eAAO,MAAM,WAAW,UAEvB,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE;AAClC,sEAAsE;GACpE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAIhD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9B,KAAK,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAM,GAClC,MAAM,CAKR;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAC7B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChC,GACA,SAAS,CAkCX;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,MAAM,CAIhG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,EACjF,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAAC,GAC5C,MAAM,EAAE,CAUV"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type Box, type Point } from './floorGeometry';
|
|
2
|
+
/** A praça, do ponto de vista da geometria. */
|
|
3
|
+
export interface ZoneGeometry {
|
|
4
|
+
/** Quais mesas a praça pegou, recalculado quando a geometria muda. */
|
|
5
|
+
tableIds?: string[];
|
|
6
|
+
shape?: 'rect' | 'rectangle' | 'ellipse' | 'polygon' | null;
|
|
7
|
+
posX?: number | null;
|
|
8
|
+
posY?: number | null;
|
|
9
|
+
widthM?: number | null;
|
|
10
|
+
heightM?: number | null;
|
|
11
|
+
polygon?: Point[] | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A caixa da praça.
|
|
15
|
+
*
|
|
16
|
+
* `null` quando não há geometria nenhuma: uma praça pode existir só para
|
|
17
|
+
* filtrar a lista de mesas, sem nunca ter sido desenhada — e aí não se
|
|
18
|
+
* desenha, em vez de virar um retângulo de zero por zero no canto do salão.
|
|
19
|
+
*/
|
|
20
|
+
export declare function zoneBounds(z: ZoneGeometry): Box | null;
|
|
21
|
+
/** A praça deslocada — polígono anda ponto a ponto, caixa anda pela origem. */
|
|
22
|
+
export declare function moveZone<T extends ZoneGeometry>(z: T, delta: Point): T;
|
|
23
|
+
/**
|
|
24
|
+
* O patch de um movimento — só os campos daquela forma.
|
|
25
|
+
*
|
|
26
|
+
* O polígono manda vértices; a caixa manda origem. Misturar os dois apagaria
|
|
27
|
+
* a geometria da outra forma.
|
|
28
|
+
*/
|
|
29
|
+
export declare function movePatch(z: ZoneGeometry): Partial<ZoneGeometry>;
|
|
30
|
+
/** O patch de um esticão: a caixa inteira, arredondada ao centímetro. */
|
|
31
|
+
export declare function resizePatch(box: Box): Partial<ZoneGeometry>;
|
|
32
|
+
/**
|
|
33
|
+
* O contorno que o banco aceitaria — e, quando não, POR QUE não.
|
|
34
|
+
*
|
|
35
|
+
* Devolver a frase junto é o ponto: «inválido» manda o operador adivinhar qual
|
|
36
|
+
* das três regras ele encostou.
|
|
37
|
+
*/
|
|
38
|
+
export declare function polygonRefusal(points: Point[], { removing }?: {
|
|
39
|
+
removing?: boolean | undefined;
|
|
40
|
+
}): string | null;
|
|
41
|
+
/** O que o toque na mesa faz, no modo «escolher na planta». */
|
|
42
|
+
export type ZoneMembershipAction = 'include' | 'exclude' | 'reset';
|
|
43
|
+
/**
|
|
44
|
+
* Três saídas, não duas — e a do meio é a que o V1 teve de explicar.
|
|
45
|
+
*
|
|
46
|
+
* Repor uma mesa que ESTÁ dentro do desenho é **desfazer a exclusão**, e não
|
|
47
|
+
* fixá-la à mão: ela volta a seguir a geometria. Marcá-la como manual pregaria
|
|
48
|
+
* a mesa na praça para sempre, e quem só quis desfazer um clique errado
|
|
49
|
+
* descobriria isso meses depois, ao mover a praça e ver a mesa ficar para trás.
|
|
50
|
+
*
|
|
51
|
+
* `include` é o caso genuinamente manual: a mesa está FORA do desenho e mesmo
|
|
52
|
+
* assim é desta praça — a mesa encostada na borda, o canto que o contorno não
|
|
53
|
+
* pegou. Aí sim a decisão é de gente, e o recálculo não pode desfazê-la.
|
|
54
|
+
*/
|
|
55
|
+
export declare function zoneToggleAction(isMember: boolean, insideGeometry: boolean): ZoneMembershipAction;
|
|
56
|
+
//# sourceMappingURL=zoneEditing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zoneEditing.d.ts","sourceRoot":"","sources":["../../src/screen/zoneEditing.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,GAAG,EAAE,KAAK,KAAK,EACrB,MAAM,iBAAiB,CAAA;AAExB,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAA;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;CACzB;AAID;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,GAAG,GAAG,IAAI,CAStD;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAIhE;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,QAAgB,EAAE;;CAAK,GAAG,MAAM,GAAG,IAAI,CAYxF;AAED,+DAA+D;AAC/D,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,oBAAoB,CAGjG"}
|