@fayz-ai/plugin-financial 0.18.0 → 0.18.3
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/components/CashSessionHeaderControl.d.ts.map +1 -1
- package/dist/components/CashSessionReviewModal.d.ts +11 -0
- package/dist/components/CashSessionReviewModal.d.ts.map +1 -0
- package/dist/components/InstallmentSource.d.ts +21 -0
- package/dist/components/InstallmentSource.d.ts.map +1 -0
- package/dist/components/PaymentFields.d.ts +72 -0
- package/dist/components/PaymentFields.d.ts.map +1 -0
- package/dist/components/PaymentModal.d.ts.map +1 -1
- package/dist/components/PaymentReceiptModal.d.ts +25 -0
- package/dist/components/PaymentReceiptModal.d.ts.map +1 -0
- package/dist/components/ReconcileFlow.d.ts +17 -0
- package/dist/components/ReconcileFlow.d.ts.map +1 -0
- package/dist/components/ReconcileModals.d.ts +17 -0
- package/dist/components/ReconcileModals.d.ts.map +1 -0
- package/dist/data/match-statement.d.ts +32 -0
- package/dist/data/match-statement.d.ts.map +1 -0
- package/dist/data/mock.d.ts.map +1 -1
- package/dist/data/supabase.d.ts.map +1 -1
- package/dist/data/tables.d.ts +3 -0
- package/dist/data/tables.d.ts.map +1 -1
- package/dist/data/types.d.ts +43 -2
- package/dist/data/types.d.ts.map +1 -1
- package/dist/index.js +4914 -1543
- package/dist/index.js.map +1 -1
- package/dist/lib/payment-how.d.ts +4 -2
- package/dist/lib/payment-how.d.ts.map +1 -1
- package/dist/lib/receipt-reading.d.ts +37 -0
- package/dist/lib/receipt-reading.d.ts.map +1 -0
- package/dist/lib/reconcile.d.ts +148 -0
- package/dist/lib/reconcile.d.ts.map +1 -0
- package/dist/locales/en.d.ts.map +1 -1
- package/dist/locales/pt-BR.d.ts.map +1 -1
- package/dist/migrations/index.d.ts +3 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/store.d.ts +5 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/types.d.ts +221 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/views/CardsView.d.ts.map +1 -1
- package/dist/views/CashRegistersView.d.ts.map +1 -1
- package/dist/views/FinancialPage.d.ts.map +1 -1
- package/dist/views/GapScreens.d.ts +24 -0
- package/dist/views/GapScreens.d.ts.map +1 -0
- package/dist/views/InvoiceDetailView.d.ts.map +1 -1
- package/dist/views/InvoiceFormView.d.ts.map +1 -1
- package/dist/views/InvoiceListView.d.ts.map +1 -1
- package/dist/views/NotasFiscaisView.d.ts.map +1 -1
- package/dist/views/ReconciliationView.d.ts.map +1 -1
- package/dist/views/StatementsView.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -20,10 +20,12 @@ export interface PaymentHow {
|
|
|
20
20
|
* credit to the holder, a receivable the mirror image.
|
|
21
21
|
*/
|
|
22
22
|
export declare function paymentHolderId(p: FinancialMovement): string | undefined;
|
|
23
|
-
|
|
23
|
+
/** O que é preciso saber para traduzir um pagamento em palavras. */
|
|
24
|
+
export interface DescribePaymentContext {
|
|
24
25
|
paymentMethods: PaymentMethod[];
|
|
25
26
|
paymentMethodTypes: PaymentMethodType[];
|
|
26
27
|
accountsById: Map<string, BankAccount>;
|
|
27
28
|
t: (key: string) => string;
|
|
28
|
-
}
|
|
29
|
+
}
|
|
30
|
+
export declare function describePayment(p: FinancialMovement, ctx: DescribePaymentContext): PaymentHow;
|
|
29
31
|
//# sourceMappingURL=payment-how.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-how.d.ts","sourceRoot":"","sources":["../../src/lib/payment-how.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEhG,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED,
|
|
1
|
+
{"version":3,"file":"payment-how.d.ts","sourceRoot":"","sources":["../../src/lib/payment-how.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAEhG,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED,oEAAoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACtC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CAC3B;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,EAAE,sBAAsB,GAAG,UAAU,CAa7F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ReceiptReading } from '../types';
|
|
2
|
+
/** Um leitor de comprovante: recebe o arquivo, devolve o que deu para ler. */
|
|
3
|
+
export type ReceiptReader = (file: File) => Promise<ReceiptReading>;
|
|
4
|
+
/**
|
|
5
|
+
* O que o modelo respondeu, virado em dado com que a tela sabe lidar.
|
|
6
|
+
*
|
|
7
|
+
* Exportado porque é onde os defeitos aparecem — um modelo que devolve
|
|
8
|
+
* `"12,50"` ou envolve tudo numa cerca não pode quebrar a leitura, e isso se
|
|
9
|
+
* prova sem rede.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseReceiptReply(content: string): ReceiptReading;
|
|
12
|
+
/**
|
|
13
|
+
* O leitor de verdade, montado sobre o agente do projeto.
|
|
14
|
+
*
|
|
15
|
+
* Devolve `null` quando o app não tem agente configurado — a tela usa isso para
|
|
16
|
+
* não oferecer um botão que não funciona (`VITE_FAYZ_AGENT_KEY` ausente é a
|
|
17
|
+
* causa de todo FAB morto da frota).
|
|
18
|
+
*/
|
|
19
|
+
export declare function createAgentReceiptReader(deps: {
|
|
20
|
+
chat: (input: {
|
|
21
|
+
message: string;
|
|
22
|
+
inlineFiles: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
mime: string;
|
|
25
|
+
data: string;
|
|
26
|
+
}>;
|
|
27
|
+
}) => Promise<{
|
|
28
|
+
content: string;
|
|
29
|
+
}>;
|
|
30
|
+
toInlineFile: (file: File) => Promise<{
|
|
31
|
+
name: string;
|
|
32
|
+
mime: string;
|
|
33
|
+
data: string;
|
|
34
|
+
}>;
|
|
35
|
+
shrinkForVision?: (file: File) => Promise<File>;
|
|
36
|
+
}): ReceiptReader;
|
|
37
|
+
//# sourceMappingURL=receipt-reading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"receipt-reading.d.ts","sourceRoot":"","sources":["../../src/lib/receipt-reading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA0B,MAAM,UAAU,CAAA;AAsCtE,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;AAuBnE;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAqCjE;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,IAAI,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpI,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnF,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAChD,GAAG,aAAa,CAShB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { CreateInvoiceInput, FinancialMovement, ReconcileAdjustment, ReconcileAsBillInput, ReconcileBillItemInput, ReconcilePaymentInput, ReconciliationCandidate, TransactionDirection } from '../types';
|
|
2
|
+
/** A linha do extrato reduzida ao que a conciliação precisa saber dela. */
|
|
3
|
+
export interface ReconcileLine {
|
|
4
|
+
id: string;
|
|
5
|
+
amount: number;
|
|
6
|
+
date: string;
|
|
7
|
+
direction: TransactionDirection;
|
|
8
|
+
description?: string;
|
|
9
|
+
bankAccountId?: string;
|
|
10
|
+
externalSource: string;
|
|
11
|
+
}
|
|
12
|
+
/** A soma dos itens, arredondada como o dinheiro é arredondado. */
|
|
13
|
+
export declare function sumItems(items: ReconcileBillItemInput[] | undefined): number;
|
|
14
|
+
/**
|
|
15
|
+
* Os itens fecham com o extrato?
|
|
16
|
+
*
|
|
17
|
+
* O extrato é a fonte da verdade do valor — o papel pode estar torto, rasgado
|
|
18
|
+
* ou ser de outra compra. Quando a soma não bate, a resposta certa não é
|
|
19
|
+
* escolher um dos dois em silêncio: é dizer de quanto é a diferença e deixar a
|
|
20
|
+
* pessoa decidir. Devolve a mensagem que bloqueia, ou `null` quando fecha.
|
|
21
|
+
*/
|
|
22
|
+
export declare function itemsMismatch(items: ReconcileBillItemInput[] | undefined, lineAmount: number, fmt: (n: number) => string): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* A conta que a linha do extrato evidencia, pronta para `createInvoice`.
|
|
25
|
+
*
|
|
26
|
+
* A direção NÃO é uma escolha: uma saída no banco é uma conta a pagar e uma
|
|
27
|
+
* entrada é uma conta a receber. O V1 oferece um seletor D/C aqui, e ele só
|
|
28
|
+
* serve para criar um lançamento que contradiz o extrato que o gerou.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildBillInvoice(line: ReconcileLine, input: ReconcileAsBillInput): CreateInvoiceInput;
|
|
31
|
+
/** O texto que o V1 põe na observação do pagamento nascido de uma conciliação. */
|
|
32
|
+
export declare function reconciliationPaymentNote(line: ReconcileLine): string;
|
|
33
|
+
/**
|
|
34
|
+
* O que `payMovement` recebe quando quem quita é a LINHA DO EXTRATO.
|
|
35
|
+
*
|
|
36
|
+
* O extrato responde as três perguntas do pagamento antes de alguém abrir a
|
|
37
|
+
* boca: QUANDO (a data da linha), ONDE (a conta do extrato) e QUANTO. E a
|
|
38
|
+
* FORMA não é uma quarta pergunta — a forma é o próprio extrato. O V1 grava
|
|
39
|
+
* esse pagamento com `Forma Pgto. N/A` justamente por isso, e o `p_method` da
|
|
40
|
+
* `financial_receive_payment` cai para `other` sozinho quando ninguém manda um.
|
|
41
|
+
*
|
|
42
|
+
* Por isso não existe um passo perguntando forma e conta: seria pedir o que a
|
|
43
|
+
* fonte já respondeu, e toda resposta divergente seria uma invenção sobre um
|
|
44
|
+
* dinheiro que já andou.
|
|
45
|
+
*
|
|
46
|
+
* `payment` continua existindo para quem chama a porta por fora com um
|
|
47
|
+
* pagamento diferente do que o extrato conta — a tela nunca manda um.
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildPayment(line: ReconcileLine, movementId: string, amount: number, payment: ReconcilePaymentInput | undefined, notes?: string): {
|
|
50
|
+
movementId: string;
|
|
51
|
+
amount: number;
|
|
52
|
+
paymentDate: string;
|
|
53
|
+
paymentMethodId: string | undefined;
|
|
54
|
+
paymentMethodTypeId: string | undefined;
|
|
55
|
+
bankAccountId: string | undefined;
|
|
56
|
+
cashSessionId: string | undefined;
|
|
57
|
+
cardBrand: string | undefined;
|
|
58
|
+
cardInstallments: number | undefined;
|
|
59
|
+
notes: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Juros e multa custam dinheiro; desconto devolve. A conta do ajuste anda no
|
|
63
|
+
* sentido de quem PAGA a diferença — numa conta a pagar, juros é mais despesa
|
|
64
|
+
* e desconto é uma receita que compensa.
|
|
65
|
+
*/
|
|
66
|
+
export declare function adjustmentDirection(billDirection: TransactionDirection, type: ReconcileAdjustment['type']): TransactionDirection;
|
|
67
|
+
/** O ajuste com sinal: o quanto ele empurra o total para cima (+) ou para baixo (−). */
|
|
68
|
+
export declare function signedAdjustment(adj: ReconcileAdjustment): number;
|
|
69
|
+
/**
|
|
70
|
+
* A diferença que os ajustes precisam explicar entre o extrato e a conta.
|
|
71
|
+
*
|
|
72
|
+
* Positiva = o banco tirou MAIS do que a conta pedia (juros, multa). Negativa =
|
|
73
|
+
* tirou menos (desconto).
|
|
74
|
+
*/
|
|
75
|
+
export declare function adjustmentGap(lineAmount: number, billOpenAmount: number): number;
|
|
76
|
+
/** Os ajustes explicam a diferença? Devolve o que falta dizer, ou `null`. */
|
|
77
|
+
export declare function adjustmentsMismatch(adjustments: ReconcileAdjustment[] | undefined, gap: number, fmt: (n: number) => string): string | null;
|
|
78
|
+
/** Um candidato depois de resolvido: a conta, e o que conciliar com ela FAZ. */
|
|
79
|
+
export interface ResolvedCandidate {
|
|
80
|
+
candidate: ReconciliationCandidate;
|
|
81
|
+
/**
|
|
82
|
+
* `settle` — a conta está em aberto e conciliar a quita.
|
|
83
|
+
* `link_only` — ela já foi paga na mão; conciliar só amarra a linha, porque
|
|
84
|
+
* criar um segundo pagamento dobraria o dinheiro.
|
|
85
|
+
*/
|
|
86
|
+
mode: 'settle' | 'link_only';
|
|
87
|
+
/** Quanto ainda falta pagar (0 numa conta já quitada). */
|
|
88
|
+
openAmount: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* O V1 separa `link` de `link_paid`, e a diferença é dinheiro: vincular uma
|
|
92
|
+
* conta JÁ PAGA como se estivesse aberta cria um segundo pagamento e o mês
|
|
93
|
+
* fecha com o dobro. A lista aqui diz, por candidato, qual dos dois é.
|
|
94
|
+
*
|
|
95
|
+
* E tira o duplicado: uma conta paga volta da busca duas vezes — a parcela e o
|
|
96
|
+
* pagamento dela —, e duas linhas idênticas na tela são duas chances de
|
|
97
|
+
* escolher a errada.
|
|
98
|
+
*/
|
|
99
|
+
export declare function resolveCandidates(candidates: ReconciliationCandidate[]): ResolvedCandidate[];
|
|
100
|
+
/** O texto do ajuste, para a descrição do lançamento que ele gera. */
|
|
101
|
+
export declare function adjustmentDescription(adj: ReconcileAdjustment): string;
|
|
102
|
+
/** O mínimo do provider que a conciliação usa. Ver `data/types.ts`. */
|
|
103
|
+
export interface ReconcileCapableProvider {
|
|
104
|
+
createInvoice(input: CreateInvoiceInput): Promise<{
|
|
105
|
+
id: string;
|
|
106
|
+
}>;
|
|
107
|
+
getMovements(query: {
|
|
108
|
+
invoiceId?: string;
|
|
109
|
+
}): Promise<{
|
|
110
|
+
data: FinancialMovement[];
|
|
111
|
+
}>;
|
|
112
|
+
payMovement(input: ReturnType<typeof buildPayment> & {
|
|
113
|
+
metadata?: Record<string, unknown>;
|
|
114
|
+
}): Promise<FinancialMovement>;
|
|
115
|
+
reconcileMovement(input: {
|
|
116
|
+
bankMovementId: string;
|
|
117
|
+
matchedMovementId?: string;
|
|
118
|
+
}): Promise<void>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* «Lançar como conta» — a conta nasce classificada, é quitada e a linha do
|
|
122
|
+
* extrato passa a ser a prova dela.
|
|
123
|
+
*
|
|
124
|
+
* Quitar é obrigatório e não é detalhe: com a evidência fora do razão
|
|
125
|
+
* (migration 112), uma linha marcada como conciliada SEM contrapartida deixa o
|
|
126
|
+
* dinheiro no banco e fora do livro, e o extrato para de bater em silêncio.
|
|
127
|
+
*/
|
|
128
|
+
export declare function runReconcileAsBill(provider: ReconcileCapableProvider, line: ReconcileLine, input: ReconcileAsBillInput): Promise<{
|
|
129
|
+
invoiceId: string;
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* «Vincular» — a conta já existe. Em aberto, conciliar a QUITA; já paga,
|
|
133
|
+
* conciliar só amarra.
|
|
134
|
+
*
|
|
135
|
+
* Os ajustes não entram no pagamento: `financial_receive_payment` recusa pagar
|
|
136
|
+
* mais que o saldo em aberto (23514), e recusa com razão — uma parcela de 100
|
|
137
|
+
* nunca foi de 112. Cada ajuste vira um lançamento próprio, classificado,
|
|
138
|
+
* quitado na mesma data e contra a mesma conta.
|
|
139
|
+
*/
|
|
140
|
+
export declare function runReconcileLink(provider: ReconcileCapableProvider, line: ReconcileLine, target: {
|
|
141
|
+
movementId: string;
|
|
142
|
+
mode: 'settle' | 'link_only';
|
|
143
|
+
openAmount: number;
|
|
144
|
+
}, options?: {
|
|
145
|
+
payment?: ReconcilePaymentInput;
|
|
146
|
+
adjustments?: ReconcileAdjustment[];
|
|
147
|
+
}): Promise<void>;
|
|
148
|
+
//# sourceMappingURL=reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/lib/reconcile.ts"],"names":[],"mappings":"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"}
|
package/dist/locales/en.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAs3BrC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pt-BR.d.ts","sourceRoot":"","sources":["../../src/locales/pt-BR.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAy3BvC,CAAA"}
|
|
@@ -110,6 +110,9 @@ export declare const MIGRATION_108_MUDOU_A_REGUA_MUDA_A_PREVISAO = "-- Mudou a r
|
|
|
110
110
|
export declare const MIGRATION_109_A_REGUA_GRAVA_CAMELCASE_E_O_SQL_LIA_SNAKE = "-- A r\u00E9gua grava `unitPrice`; o SQL lia `unit_price`.\n--\n-- A conta de luz consolidada nasceu com total R$ 120,00 e a linha dela zerada.\n-- A causa \u00E9 literal: `plg_financial_recurring_bills.items` \u00E9 escrito pela TELA,\n-- em JSON de JavaScript \u2014 `unitPrice`, `itemKind`, `accountId` \u2014, e as duas\n-- fun\u00E7\u00F5es que copiam esses itens leem `unit_price`, `item_kind`, `account_id`.\n-- Nenhuma casa; `->>` devolve NULL; o `coalesce` cai em zero. Sem erro, sem\n-- log: a fatura fica com o total certo (que vem da r\u00E9gua, n\u00E3o das linhas) e com\n-- uma linha que diz zero.\n--\n-- `financial_recurring_run` tem o mesmo defeito desde que foi escrita \u2014 eu o\n-- copiei para `financial_consolidate_occurrence` ao espelh\u00E1-la. As duas s\u00E3o\n-- corrigidas aqui.\n--\n-- \u2500\u2500 Por que ler as DUAS grafias \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- Padronizar o JSON numa s\u00F3 seria mais limpo e quebraria toda r\u00E9gua j\u00E1\n-- cadastrada no instante em que rodasse. Ler as duas custa um `coalesce` por\n-- campo e n\u00E3o deixa ningu\u00E9m para tr\u00E1s; quem vier depois escreve na grafia que\n-- quiser e as duas funcionam.\n--\n-- Idempotente: substitui as fun\u00E7\u00F5es e recalcula s\u00F3 o que est\u00E1 zerado.\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 1. As linhas de uma r\u00E9gua, lidas nas duas grafias\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nCREATE OR REPLACE FUNCTION public.plg_financial_line_field(p_line jsonb, p_snake text, p_camel text)\nRETURNS text\nLANGUAGE sql\nIMMUTABLE\nSET search_path TO ''\nAS $$\n SELECT coalesce(nullif(p_line ->> p_snake, ''), nullif(p_line ->> p_camel, ''));\n$$;\n\nCOMMENT ON FUNCTION public.plg_financial_line_field(jsonb, text, text) IS\n 'Um campo da linha de uma r\u00E9gua de recorr\u00EAncia, na grafia do SQL ou na do JavaScript. A tela grava camelCase; as fun\u00E7\u00F5es liam snake_case.';\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 2. Copiar as linhas passa a ser UMA fun\u00E7\u00E3o, usada pelas duas RPCs\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- Estava duplicada \u2014 e foi por isso que o defeito viajou de uma para a outra.\n\nCREATE OR REPLACE FUNCTION public.plg_financial_copy_bill_items(\n p_tenant uuid, p_invoice uuid, p_items jsonb\n)\nRETURNS integer\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_line jsonb;\n v_item uuid;\n v_i int := 0;\n v_qty numeric;\n v_unit numeric;\n v_disc numeric;\n v_surc numeric;\n v_acc text;\n v_cc text;\nBEGIN\n FOR v_line IN SELECT * FROM jsonb_array_elements(coalesce(p_items, '[]'::jsonb))\n LOOP\n v_qty := coalesce(public.plg_financial_line_field(v_line, 'quantity', 'quantity')::numeric, 1);\n v_unit := coalesce(public.plg_financial_line_field(v_line, 'unit_price', 'unitPrice')::numeric, 0);\n v_disc := coalesce(public.plg_financial_line_field(v_line, 'discount', 'discount')::numeric, 0);\n v_surc := coalesce(public.plg_financial_line_field(v_line, 'surcharge', 'surcharge')::numeric, 0);\n v_acc := public.plg_financial_line_field(v_line, 'account_id', 'accountId');\n v_cc := public.plg_financial_line_field(v_line, 'cost_center_id', 'costCenterId');\n\n INSERT INTO public.items (\n tenant_id, invoice_id, name, quantity, unit_price, discount, total, sort_order, metadata\n ) VALUES (\n p_tenant, p_invoice,\n public.plg_financial_line_field(v_line, 'description', 'description'),\n v_qty, v_unit, v_disc,\n round(v_qty * v_unit - v_disc + v_surc, 2),\n v_i,\n jsonb_build_object(\n 'itemKind', coalesce(public.plg_financial_line_field(v_line, 'item_kind', 'itemKind'), 'other'),\n 'referenceId', public.plg_financial_line_field(v_line, 'reference_id', 'referenceId'))\n )\n RETURNING id INTO v_item;\n\n IF v_acc IS NOT NULL OR v_cc IS NOT NULL THEN\n INSERT INTO public.plg_financial_invoice_items (\n item_id, parent_kind, tenant_id, chart_account_id, cost_center_id\n ) VALUES (v_item, 'invoice', p_tenant, v_acc::uuid, v_cc::uuid)\n ON CONFLICT (item_id) DO UPDATE\n SET chart_account_id = excluded.chart_account_id,\n cost_center_id = excluded.cost_center_id;\n END IF;\n\n v_i := v_i + 1;\n END LOOP;\n\n RETURN v_i;\nEND $$;\n\nCOMMENT ON FUNCTION public.plg_financial_copy_bill_items(uuid, uuid, jsonb) IS\n 'Copia as linhas de uma r\u00E9gua de recorr\u00EAncia para a fatura gerada. Uma s\u00F3 c\u00F3pia, usada pelo consolidar e pela rotina \u2014 duplic\u00E1-la foi como o defeito de grafia viajou entre as duas.';\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 3. As linhas zeradas que j\u00E1 foram criadas\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- S\u00F3 as de fatura gerada por recorr\u00EAncia, s\u00F3 as que est\u00E3o em zero, e s\u00F3\n-- enquanto nada foi recebido \u2014 o gatilho de imutabilidade continua valendo, e\n-- aqui ele n\u00E3o precisa sair do caminho: uma fatura de recorr\u00EAncia rec\u00E9m-gerada\n-- n\u00E3o tem pagamento.\n\nUPDATE public.items i\n SET unit_price = l.unit_price,\n quantity = l.quantity,\n total = round(l.quantity * l.unit_price, 2),\n name = coalesce(nullif(i.name, ''), l.nome),\n metadata = jsonb_set(coalesce(i.metadata, '{}'::jsonb), '{itemKind}', to_jsonb(l.kind), true),\n updated_at = now()\n FROM (\n SELECT f.id AS invoice_id,\n coalesce(public.plg_financial_line_field(li.value, 'quantity', 'quantity')::numeric, 1) AS quantity,\n coalesce(public.plg_financial_line_field(li.value, 'unit_price', 'unitPrice')::numeric, 0) AS unit_price,\n public.plg_financial_line_field(li.value, 'description', 'description') AS nome,\n coalesce(public.plg_financial_line_field(li.value, 'item_kind', 'itemKind'), 'other') AS kind,\n li.ordinality - 1 AS pos\n FROM public.plg_financial_invoices f\n JOIN public.plg_financial_recurring_bills b\n ON b.id = (f.metadata ->> 'recurring_bill_id')::uuid\n CROSS JOIN LATERAL jsonb_array_elements(coalesce(b.items, '[]'::jsonb)) WITH ORDINALITY AS li(value, ordinality)\n WHERE f.metadata ? 'recurring_bill_id'\n AND f.cancelled_at IS NULL\n ) AS l\n WHERE l.invoice_id = i.invoice_id\n AND l.pos = i.sort_order\n AND coalesce(i.unit_price, 0) = 0\n AND l.unit_price > 0\n AND NOT EXISTS (\n SELECT 1 FROM public.v_financial_installment_balances v\n WHERE v.invoice_id = i.invoice_id AND coalesce(v.paid, 0) > 0\n );\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 4. As duas RPCs passam a copiar pela fun\u00E7\u00E3o \u00FAnica\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nCREATE OR REPLACE FUNCTION public.financial_consolidate_occurrence(p_occurrence_id uuid)\nRETURNS jsonb\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_occ record;\n v_bill record;\n v_key text;\n v_res jsonb;\n v_invoice uuid;\nBEGIN\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'financial_consolidate_occurrence: sem tenant na sessao' USING ERRCODE = '42501';\n END IF;\n IF NOT app.has_permission('financial.create', NULL) THEN\n RAISE EXCEPTION 'financial_consolidate_occurrence: exige financial.create' USING ERRCODE = '42501';\n END IF;\n\n SELECT * INTO v_occ FROM public.plg_financial_recurring_bill_occurrences\n WHERE id = p_occurrence_id AND tenant_id = v_tenant;\n IF v_occ IS NULL THEN\n RAISE EXCEPTION 'financial_consolidate_occurrence: ocorrencia % nao encontrada', p_occurrence_id\n USING ERRCODE = 'P0002';\n END IF;\n IF v_occ.status = 'consolidated' THEN\n RETURN jsonb_build_object('occurrence_id', v_occ.id, 'invoice_id', v_occ.invoice_id, 'created', false);\n END IF;\n IF v_occ.status = 'cancelled' THEN\n RAISE EXCEPTION 'financial_consolidate_occurrence: ocorrencia cancelada' USING ERRCODE = '23514';\n END IF;\n\n SELECT * INTO v_bill FROM public.plg_financial_recurring_bills\n WHERE id = v_occ.recurring_bill_id AND tenant_id = v_tenant;\n IF v_bill IS NULL THEN\n RAISE EXCEPTION 'financial_consolidate_occurrence: regua da ocorrencia % sumiu', p_occurrence_id\n USING ERRCODE = 'P0002';\n END IF;\n\n v_key := 'recurring:' || v_bill.id::text || ':'\n || to_char(coalesce(v_occ.competence_date, v_occ.due_date), 'YYYY-MM');\n\n SELECT f.id INTO v_invoice FROM public.plg_financial_invoices f\n WHERE f.tenant_id = v_tenant AND f.metadata ->> 'recurring_key' = v_key\n AND f.cancelled_at IS NULL LIMIT 1;\n\n IF v_invoice IS NULL THEN\n v_res := public.financial_create_invoice(\n v_bill.direction, v_occ.amount, v_bill.counterparty_person_id, NULL,\n coalesce(v_occ.unit_id, v_bill.unit_id),\n jsonb_build_array(jsonb_build_object('number', 1, 'due_date', v_occ.due_date, 'amount', v_occ.amount)),\n coalesce(v_occ.competence_date, v_occ.due_date),\n v_bill.description, coalesce(v_occ.notes, v_bill.notes),\n jsonb_build_object('source', 'financial_consolidate_occurrence',\n 'recurring_bill_id', v_bill.id,\n 'recurring_occurrence_id', v_occ.id,\n 'recurring_key', v_key),\n v_key);\n v_invoice := (v_res ->> 'invoice_id')::uuid;\n PERFORM public.plg_financial_copy_bill_items(v_tenant, v_invoice, v_bill.items);\n END IF;\n\n UPDATE public.plg_financial_recurring_bill_occurrences\n SET status = 'consolidated', invoice_id = v_invoice, updated_at = now()\n WHERE id = v_occ.id;\n\n RETURN jsonb_build_object('occurrence_id', v_occ.id, 'invoice_id', v_invoice, 'created', true);\nEND $$;\n\nCREATE OR REPLACE FUNCTION public.financial_recurring_run(p_through date DEFAULT NULL::date)\nRETURNS jsonb\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $$\nDECLARE\n v_tenant uuid := app.current_tenant_id();\n v_through date := coalesce(p_through, (date_trunc('month', current_date) + interval '1 month - 1 day')::date);\n v_bill record; v_month date; v_due date; v_key text;\n v_made int := 0; v_total numeric := 0; v_res jsonb; v_invoice uuid;\nBEGIN\n IF v_tenant IS NULL THEN\n RAISE EXCEPTION 'financial_recurring_run: sem tenant na sessao' USING ERRCODE = '42501';\n END IF;\n IF NOT app.has_permission('financial.create', NULL) THEN\n RAISE EXCEPTION 'financial_recurring_run: exige financial.create' USING ERRCODE = '42501';\n END IF;\n\n FOR v_bill IN\n SELECT * FROM public.plg_financial_recurring_bills\n WHERE tenant_id = v_tenant AND is_active AND starts_on <= v_through\n AND (ends_on IS NULL OR ends_on >= starts_on)\n LOOP\n v_month := date_trunc('month', greatest(v_bill.starts_on, date_trunc('month', v_through)::date))::date;\n WHILE v_month <= v_through LOOP\n v_due := least((v_month + ((v_bill.due_day - 1) || ' days')::interval)::date,\n (v_month + interval '1 month - 1 day')::date);\n EXIT WHEN v_bill.ends_on IS NOT NULL AND v_due > v_bill.ends_on;\n v_key := 'recurring:' || v_bill.id::text || ':' || to_char(v_month, 'YYYY-MM');\n IF NOT EXISTS (SELECT 1 FROM public.plg_financial_invoices f\n WHERE f.tenant_id = v_tenant\n AND f.metadata ->> 'recurring_key' = v_key\n AND f.cancelled_at IS NULL) THEN\n v_res := public.financial_create_invoice(\n v_bill.direction, v_bill.amount, v_bill.counterparty_person_id, NULL, v_bill.unit_id,\n jsonb_build_array(jsonb_build_object('number', 1, 'due_date', v_due, 'amount', v_bill.amount)),\n v_month, v_bill.description, v_bill.notes,\n jsonb_build_object('source', 'financial_recurring_run',\n 'recurring_bill_id', v_bill.id, 'recurring_key', v_key),\n v_key);\n v_invoice := (v_res ->> 'invoice_id')::uuid;\n PERFORM public.plg_financial_copy_bill_items(v_tenant, v_invoice, v_bill.items);\n v_made := v_made + 1;\n v_total := v_total + v_bill.amount;\n END IF;\n v_month := (v_month + CASE v_bill.frequency\n WHEN 'weekly' THEN interval '7 days'\n WHEN 'quarterly' THEN interval '3 months'\n WHEN 'yearly' THEN interval '1 year'\n ELSE interval '1 month' END)::date;\n END LOOP;\n END LOOP;\n\n RETURN jsonb_build_object('through', v_through, 'created', v_made, 'total', round(v_total, 2));\nEND $$;\n";
|
|
111
111
|
export declare const MIGRATION_110_TROCAR_DE_FORNECEDOR_ENQUANTO_NINGUEM_PAGOU = "-- Trocar de fornecedor enquanto ningu\u00E9m pagou.\n--\n-- A trava \u00E9 do BANCO: `trg_plg_financial_invoices_immutable` recusa qualquer\n-- mudan\u00E7a em `counterparty_person_id` a partir do instante em que a conta \u00E9\n-- emitida \u2014 mesmo que ela n\u00E3o tenha recebido um centavo.\n--\n-- Isso j\u00E1 foi revisto duas vezes para os vizinhos dela. A 098 abriu a\n-- compet\u00EAncia e a 099 abriu o total, as duas com o MESMO limite: vale enquanto\n-- `sum(paid) = 0`. A contraparte ficou de fora \u2014 n\u00E3o por decis\u00E3o, ao que tudo\n-- indica, mas porque ningu\u00E9m tinha esbarrado nela.\n--\n-- E ela \u00E9 o campo mais errado de todos na hora de lan\u00E7ar: quem digita seis\n-- contas seguidas escolhe o fornecedor da linha de cima na quarta. Hoje a\n-- corre\u00E7\u00E3o \u00E9 cancelar a conta e lan\u00E7ar outra \u2014 um documento cancelado no\n-- hist\u00F3rico para consertar um clique.\n--\n-- \u2500\u2500 O que continua imut\u00E1vel, e por qu\u00EA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `number` \u00C9 a identidade do documento. Troc\u00E1-lo \u00E9 fazer o hist\u00F3rico\n-- falar de outra conta.\n-- `direction` Pagar e receber s\u00E3o lados opostos do raz\u00E3o; virar o sinal\n-- n\u00E3o \u00E9 corrigir, \u00E9 inverter o fato.\n-- `issue_date` A emiss\u00E3o \u00E9 quando o documento passou a existir.\n-- `currency` O valor gravado s\u00F3 significa alguma coisa com ela.\n-- `order_id` O v\u00EDnculo com a venda que a originou.\n--\n-- A contraparte entra no grupo que a 098 e a 099 j\u00E1 definiram: enquanto nada\n-- foi recebido, \u00E9 rascunho; depois do primeiro centavo, \u00E9 hist\u00F3ria.\n--\n-- Idempotente: substitui a fun\u00E7\u00E3o do gatilho.\n\nCREATE OR REPLACE FUNCTION public.trg_plg_financial_invoices_immutable()\nRETURNS trigger\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $function$\nDECLARE v_paid numeric;\nBEGIN\n IF OLD.issue_date IS NULL OR OLD.cancelled_at IS NOT NULL THEN RETURN NEW; END IF;\n IF NEW.cancelled_at IS NOT NULL AND OLD.cancelled_at IS NULL THEN RETURN NEW; END IF;\n\n -- O que \u00E9 identidade do documento n\u00E3o muda nunca.\n IF NEW.direction IS DISTINCT FROM OLD.direction\n OR NEW.order_id IS DISTINCT FROM OLD.order_id\n OR NEW.number IS DISTINCT FROM OLD.number\n OR NEW.issue_date IS DISTINCT FROM OLD.issue_date\n OR NEW.currency IS DISTINCT FROM OLD.currency THEN\n RAISE EXCEPTION 'plg_financial_invoices: invoice % is issued and cannot be altered', OLD.number\n USING ERRCODE = '23514',\n HINT = 'A closed invoice is immutable (PRD 04). Correct it with a new invoice, or cancel this one through financial_cancel_invoice.';\n END IF;\n\n -- Compet\u00EAncia (098), total (099) e CONTRAPARTE (110) t\u00EAm a mesma licen\u00E7a e o\n -- mesmo limite. A pergunta s\u00F3 se faz quando um dos tr\u00EAs mudou: ela varre as\n -- parcelas, e n\u00E3o vale pag\u00E1-la em toda grava\u00E7\u00E3o de observa\u00E7\u00E3o.\n IF NEW.competence_date IS DISTINCT FROM OLD.competence_date\n OR NEW.total IS DISTINCT FROM OLD.total\n OR NEW.counterparty_person_id IS DISTINCT FROM OLD.counterparty_person_id THEN\n SELECT coalesce(sum(b.paid), 0) INTO v_paid\n FROM public.v_financial_installment_balances b WHERE b.invoice_id = OLD.id;\n IF v_paid > 0 THEN\n RAISE EXCEPTION 'plg_financial_invoices: invoice % has % already received and cannot be rewritten', OLD.number, v_paid\n USING ERRCODE = '23514',\n HINT = 'Reverse the payments first, or correct it with a new invoice.';\n END IF;\n END IF;\n\n RETURN NEW;\nEND $function$;\n\nCOMMENT ON FUNCTION public.trg_plg_financial_invoices_immutable() IS\n 'Uma conta emitida \u00E9 imut\u00E1vel na IDENTIDADE (n\u00FAmero, dire\u00E7\u00E3o, emiss\u00E3o, moeda, pedido) sempre; e na compet\u00EAncia, no total e na contraparte s\u00F3 depois do primeiro centavo recebido.';\n";
|
|
112
112
|
export declare const MIGRATION_111_REPARCELAR_SEM_APAGAR_A_PARCELA = "-- Reparcelar sem APAGAR a parcela.\n--\n-- Trocar o valor de uma conta cujo pagamento foi estornado falhava com:\n--\n-- plg_financial_movements is append-only: amount, kind, accounts and LINKS\n-- of movement \u2026 cannot change \u2014 post a reversal instead\n--\n-- S\u00E3o duas regras certas se atropelando:\n--\n-- `financial_reschedule_invoice` APAGA as parcelas e as reescreve \u2014 \u00E9 como\n-- ele transforma 2x em 3x sem passar por um estado que `(invoice_id, number)`\n-- recusa.\n--\n-- `plg_financial_movements.financial_invoice_installment_id` \u00E9 FK com ON\n-- DELETE SET NULL, e o movimento \u00E9 append-only justamente nos LINKS.\n--\n-- O pagamento estornado continua existindo \u2014 \u00E9 isso que um estorno significa:\n-- o par fica no livro, l\u00EDquido em zero. Ele aponta para a parcela. Apagar a\n-- parcela manda o banco anular esse ponteiro, e o gatilho recusa \u2014 com raz\u00E3o,\n-- porque um lan\u00E7amento que muda de dono depois de escrito deixa de ser\n-- hist\u00F3rico.\n--\n-- \u2500\u2500 A corre\u00E7\u00E3o \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- A parcela de n\u00FAmero N continua sendo a parcela de n\u00FAmero N: ela \u00E9 ATUALIZADA\n-- no lugar, e o id n\u00E3o muda. S\u00F3 some a que sobrou quando o cronograma encolheu\n-- \u2014 e essa, se tiver movimento pendurado, o banco recusa, que \u00E9 o certo.\n--\n-- De quebra, o que estava anexado \u00E0 parcela deixa de precisar do resgate por\n-- n\u00FAmero: n\u00E3o h\u00E1 mais o que resgatar, porque a linha nunca deixou de existir.\n--\n-- Idempotente: substitui a fun\u00E7\u00E3o.\n\nCREATE OR REPLACE FUNCTION public.financial_reschedule_invoice(\n p_invoice_id uuid,\n p_installments jsonb,\n p_idempotency_key text DEFAULT NULL::text\n)\nRETURNS jsonb\nLANGUAGE plpgsql\nSECURITY DEFINER\nSET search_path TO ''\nAS $function$\nDECLARE\n v_tenant uuid := public.plg_financial_require_tenant();\n v_invoice public.plg_financial_invoices%ROWTYPE;\n v_paid numeric;\n v_mirror int;\n v_sum numeric := 0;\n v_i jsonb;\n v_n int := 0;\n v_out jsonb := '[]'::jsonb;\n v_inst_id uuid;\n v_due date;\n v_amount numeric;\n v_meta jsonb;\n v_total int;\nBEGIN\n SELECT * INTO v_invoice FROM public.plg_financial_invoices WHERE id = p_invoice_id AND tenant_id = v_tenant;\n IF NOT FOUND THEN\n RAISE EXCEPTION 'financial_reschedule_invoice: invoice % not found', p_invoice_id USING ERRCODE = 'P0002';\n END IF;\n PERFORM public.plg_financial_require_permission('financial.edit', v_invoice.unit_id);\n PERFORM public.plg_financial_claim_idempotency(v_tenant, p_idempotency_key);\n\n IF v_invoice.cancelled_at IS NOT NULL THEN\n RAISE EXCEPTION 'financial_reschedule_invoice: invoice % is cancelled', v_invoice.number USING ERRCODE = '55000';\n END IF;\n\n SELECT coalesce(sum(b.paid), 0) INTO v_paid\n FROM public.v_financial_installment_balances b WHERE b.invoice_id = p_invoice_id;\n IF v_paid > 0 THEN\n RAISE EXCEPTION 'financial_reschedule_invoice: invoice % has % already received; its schedule is history now', v_invoice.number, v_paid\n USING ERRCODE = '55000',\n HINT = 'Move the due date of an unpaid installment instead, or cancel and reissue.';\n END IF;\n\n -- O espelho legado (`bill`) \u00E9 append-only: nem apaga nem muda de valor.\n SELECT count(*) INTO v_mirror FROM public.plg_financial_movements m\n WHERE m.financial_invoice_id = p_invoice_id AND m.movement_kind = 'bill' AND m.status <> 'cancelled';\n IF v_mirror > 0 THEN\n RAISE EXCEPTION 'financial_reschedule_invoice: invoice % carries legacy bill movements and cannot be rescheduled', v_invoice.number\n USING ERRCODE = '55000',\n HINT = 'Cancel and reissue this invoice.';\n END IF;\n\n IF jsonb_typeof(p_installments) <> 'array' OR jsonb_array_length(p_installments) = 0 THEN\n RAISE EXCEPTION 'financial_reschedule_invoice: installments must be a non-empty array' USING ERRCODE = '22023';\n END IF;\n FOR v_i IN SELECT * FROM jsonb_array_elements(p_installments) LOOP\n v_sum := v_sum + round(coalesce((v_i ->> 'amount')::numeric, 0), 2);\n END LOOP;\n IF v_sum <> round(v_invoice.total, 2) THEN\n RAISE EXCEPTION 'financial_reschedule_invoice: installments sum to % but the invoice total is %', v_sum, v_invoice.total\n USING ERRCODE = '23514';\n END IF;\n\n v_total := jsonb_array_length(p_installments);\n\n -- 1. A sobra sai PRIMEIRO. Se ela tiver movimento, o banco recusa aqui \u2014 e \u00E9\n -- a recusa certa: encolher o cronograma apagaria a linha que um\n -- lan\u00E7amento aponta.\n DELETE FROM public.plg_financial_invoice_installments\n WHERE invoice_id = p_invoice_id AND number > v_total;\n\n -- 2. E a parcela de n\u00FAmero N continua sendo a de n\u00FAmero N.\n FOR v_i IN SELECT * FROM jsonb_array_elements(p_installments) LOOP\n v_n := v_n + 1;\n v_due := coalesce((v_i ->> 'due_date')::date, v_invoice.competence_date, current_date);\n v_amount := round(coalesce((v_i ->> 'amount')::numeric, 0), 2);\n v_meta := CASE WHEN jsonb_typeof(v_i -> 'metadata') = 'object' THEN v_i -> 'metadata' ELSE NULL END;\n\n UPDATE public.plg_financial_invoice_installments\n SET due_date = v_due,\n amount = v_amount,\n metadata = coalesce(v_meta, metadata),\n updated_at = now()\n WHERE invoice_id = p_invoice_id AND number = v_n\n RETURNING id INTO v_inst_id;\n\n IF v_inst_id IS NULL THEN\n INSERT INTO public.plg_financial_invoice_installments\n (tenant_id, unit_id, invoice_id, number, due_date, amount, metadata)\n VALUES (v_tenant, v_invoice.unit_id, p_invoice_id, v_n, v_due, v_amount, coalesce(v_meta, '{}'::jsonb))\n RETURNING id INTO v_inst_id;\n END IF;\n\n v_out := v_out || jsonb_build_object('id', v_inst_id, 'number', v_n, 'due_date', v_due, 'amount', v_amount);\n END LOOP;\n\n PERFORM public.plg_financial_audit(v_tenant, 'financial.invoice.reschedule', 'plg_financial_invoices', p_invoice_id::text,\n jsonb_build_object('number', v_invoice.number, 'installments', v_n, 'idempotency_key', p_idempotency_key));\n\n RETURN jsonb_build_object('invoice_id', p_invoice_id, 'installments', v_out);\nEND $function$;\n\nCOMMENT ON FUNCTION public.financial_reschedule_invoice(uuid, jsonb, text) IS\n 'Reescreve o cronograma ATUALIZANDO a parcela de cada n\u00FAmero, sem apag\u00E1-la: um pagamento estornado continua apontando para ela, e o movimento \u00E9 append-only nos links.';\n";
|
|
113
|
+
export declare const MIGRATION_112_A_LINHA_DO_EXTRATO_NAO_E_UM_LANCAMENTO_AINDA = "-- A linha do extrato n\u00E3o \u00E9 um lan\u00E7amento ainda.\n--\n-- \u2500\u2500 O defeito, primeiro, porque \u00E9 ele que decide o desenho \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `importBankTransactions` (data/supabase.ts) insere a linha importada como\n-- MOVIMENTO, assim:\n--\n-- movement_kind: 'payment', amount, status: 'paid',\n-- external_id, external_source -- e nenhuma perna\n--\n-- e o baseline n\u00E3o deixa:\n--\n-- CONSTRAINT plg_financial_movements_legs_check CHECK (\n-- movement_kind IN ('bill','commission')\n-- OR metadata ? 'legacy_mirror'\n-- OR (debit_account_id IS NOT NULL AND credit_account_id IS NOT NULL\n-- AND debit_account_id <> credit_account_id))\n--\n-- Todo INSERT daquele caminho \u00E9 recusado. Os testes do plugin passam porque\n-- exercitam o provider MOCK, que n\u00E3o tem constraint nenhuma \u2014 verde que n\u00E3o \u00E9\n-- verdade em lugar nenhum. \u00C9 por isso que a Concilia\u00E7\u00E3o do V2 nunca listou uma\n-- transa\u00E7\u00E3o: n\u00E3o havia como gravar uma.\n--\n-- \u2500\u2500 E a constraint est\u00E1 CERTA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- Uma linha do extrato rec\u00E9m-chegada n\u00E3o tem duas pernas porque ainda n\u00E3o se\n-- sabe contra o qu\u00EA ela lan\u00E7a. \"RSHOP POSTO STA C-001016, R$ 100,00, d\u00E9bito\"\n-- \u00E9 evid\u00EAncia de que o dinheiro saiu do Ita\u00FA; a outra ponta \u2014 combust\u00EDvel?\n-- adiantamento? transfer\u00EAncia para a conta da outra loja? \u2014 \u00E9 justamente o que\n-- a concilia\u00E7\u00E3o existe para descobrir. For\u00E7\u00E1-la a nascer com uma conta-ponte\n-- inventada \u00E9 gravar um palpite com cara de fato, e \u00E9 o palpite que depois\n-- ningu\u00E9m consegue distinguir do lan\u00E7amento de verdade.\n--\n-- Ent\u00E3o a evid\u00EAncia ganha onde morar, e o movimento continua sendo o evento\n-- econ\u00F4mico. A view da 031 j\u00E1 trabalha exatamente nessa distin\u00E7\u00E3o:\n--\n-- \u00ABEconomic cash events. Native movements always count; imported statement\n-- lines count only after standalone acceptance, never when matched.\u00BB\n--\n-- \u2500\u2500 O que o V1 guarda, e por que quase tudo atravessa \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `ob_statement_transactions` tem 25 colunas e a tela do V1 mostra ou busca em\n-- quase todas. `payer_cpf_cnpj` \u00E9 o que casa um PIX com o cliente; `category` e\n-- `transaction_type` s\u00E3o a classifica\u00E7\u00E3o que o provedor j\u00E1 fez; `code` e\n-- `document` s\u00E3o o que o operador digita no campo de busca quando tem o\n-- comprovante na m\u00E3o; `balance` \u00E9 o saldo do banco NAQUELA linha, que \u00E9 como se\n-- confere se o extrato bate. `raw_payload` fica porque o provedor muda de\n-- contrato sem avisar, e quem tem o cru consegue reprocessar.\n--\n-- `provider_deleted` n\u00E3o \u00E9 enfeite: o Open Finance REMOVE lan\u00E7amento (um PIX\n-- devolvido, um estorno do adquirente). A linha n\u00E3o pode sumir da tabela, ou o\n-- que j\u00E1 foi conciliado contra ela vira \u00F3rf\u00E3o sem explica\u00E7\u00E3o \u2014 ela \u00E9 marcada, e\n-- a tela deixa de mostr\u00E1-la.\n--\n-- Idempotente.\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 1. A evid\u00EAncia\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_bank_statement_lines (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n unit_id uuid,\n -- A conta do extrato. `kind = 'bank'` na pr\u00E1tica, mas sem CHECK: o V1 tamb\u00E9m\n -- traz fatura de cart\u00E3o por este caminho (`statement_type = 'CREDIT_CARD'`).\n bank_account_id uuid NOT NULL REFERENCES public.plg_financial_accounts(id) ON DELETE CASCADE,\n\n -- Identidade do provedor. \u00C9 o par que torna a importa\u00E7\u00E3o idempotente, e \u00E9 o\n -- mesmo contrato que `plg_financial_movements (external_source, external_id)`\n -- j\u00E1 usa \u2014 reimportar o mesmo per\u00EDodo n\u00E3o duplica, que \u00E9 o comportamento\n -- que o sync do V1 d\u00E1 e sem o qual \u00ABSincronizar agora\u00BB vira uma armadilha.\n external_source text NOT NULL,\n external_id text NOT NULL,\n\n posted_on date NOT NULL,\n -- Quando o provedor diz que a transa\u00E7\u00E3o foi efetivada, se disser. Difere de\n -- `posted_on` em cart\u00E3o e em TED de fim de semana.\n effective_at timestamptz,\n direction text NOT NULL CHECK (direction IN ('credit', 'debit')),\n -- Sempre POSITIVO. O sinal est\u00E1 em `direction`, e guardar o valor com sinal\n -- faria toda soma da tela depender de lembrar disso.\n amount numeric(14,2) NOT NULL CHECK (amount >= 0),\n -- O saldo do banco NESTA linha. \u00C9 com ele que se confere se o extrato bate.\n balance_after numeric(14,2),\n\n description text,\n -- O nome que o provedor d\u00E1 \u00E0 contraparte ('itaubba', o nome do lojista).\n counterparty_name text,\n counterparty_document text,\n document text,\n code text,\n category text,\n transaction_type text,\n\n -- O provedor tirou a linha do extrato. Ela N\u00C3O \u00E9 apagada: o que j\u00E1 foi\n -- conciliado contra ela precisa continuar explic\u00E1vel.\n provider_deleted boolean NOT NULL DEFAULT false,\n -- O cru, porque o contrato do provedor muda sem avisar.\n raw_payload jsonb,\n\n -- A concilia\u00E7\u00E3o. `matched_movement_id` nulo com `reconciled_at` preenchido \u00E9\n -- a linha ACEITA COMO AVULSA \u2014 e \u00E9 a\u00ED que ela vira o evento econ\u00F4mico.\n reconciled_at timestamptz,\n matched_movement_id uuid REFERENCES public.plg_financial_movements(id) ON DELETE SET NULL,\n\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now(),\n\n UNIQUE (tenant_id, external_source, external_id)\n);\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 2. Unidade, \u00EDndices, updated_at\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nDO $$\nBEGIN\n ALTER TABLE public.plg_financial_bank_statement_lines\n ADD CONSTRAINT plg_financial_bank_statement_lines_unit_fkey\n FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\n\n-- A consulta da tela, na ordem em que ela filtra: conta, per\u00EDodo, e a data\n-- descendente que \u00E9 como o extrato se l\u00EA.\nCREATE INDEX IF NOT EXISTS plg_financial_bank_statement_lines_conta_periodo_idx\n ON public.plg_financial_bank_statement_lines (bank_account_id, posted_on DESC)\n WHERE provider_deleted = false;\n\n-- \u00ABStatus: Pendente\u00BB \u00E9 o filtro mais usado da tela, e \u00E9 o que sobra depois de\n-- um m\u00EAs de concilia\u00E7\u00E3o \u2014 o \u00EDndice parcial cobre exatamente essa fila.\nCREATE INDEX IF NOT EXISTS plg_financial_bank_statement_lines_pendentes_idx\n ON public.plg_financial_bank_statement_lines (tenant_id, posted_on DESC)\n WHERE reconciled_at IS NULL AND provider_deleted = false;\n\nCREATE INDEX IF NOT EXISTS plg_financial_bank_statement_lines_movimento_idx\n ON public.plg_financial_bank_statement_lines (matched_movement_id)\n WHERE matched_movement_id IS NOT NULL;\n\nDO $$\nBEGIN\n CREATE TRIGGER plg_financial_bank_statement_lines_updated_at\n BEFORE UPDATE ON public.plg_financial_bank_statement_lines\n FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 3. A cerca, pelo template da casa\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- Recurso pr\u00F3prio (`financial.bank_statement`) e n\u00E3o o do movimento: quem\n-- concilia n\u00E3o \u00E9 necessariamente quem lan\u00E7a. No V1 a tela \u00E9 do financeiro e do\n-- dono, e a recep\u00E7\u00E3o n\u00E3o a v\u00EA \u2014 um recurso separado \u00E9 o que permite dizer isso\n-- sem abrir o raz\u00E3o inteiro junto.\n--\n-- `unit_optional`: a linha carrega a unidade da conta quando a conta tem uma, e\n-- uma linha sem unidade n\u00E3o pode sumir da concilia\u00E7\u00E3o por causa de campo vazio.\nSELECT app.scaffold_table('public.plg_financial_bank_statement_lines'::regclass,\n 'financial.bank_statement', 'financial', false, 'enforce');\nSELECT app.scaffold_scope('public.plg_financial_bank_statement_lines'::regclass, 'unit_optional', true);\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- 4. O extrato como evento econ\u00F4mico\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- A 031 decidiu quando uma linha importada CONTA. Agora que a evid\u00EAncia saiu de\n-- `plg_financial_movements`, aquela regra vale aqui: a linha conta quando foi\n-- aceita como avulsa (`reconciled_at` preenchido, `matched_movement_id` nulo).\n-- Casada, quem conta \u00E9 o movimento \u2014 a linha \u00E9 s\u00F3 a prova de que ele aconteceu.\nCREATE OR REPLACE VIEW public.v_financial_bank_statement_unreconciled\nWITH (security_invoker = true) AS\nSELECT line.*\n FROM public.plg_financial_bank_statement_lines line\n WHERE line.reconciled_at IS NULL\n AND line.provider_deleted = false;\n\nCOMMENT ON VIEW public.v_financial_bank_statement_unreconciled IS\n 'Linhas do extrato que ainda n\u00E3o casaram com nada. A fila da Concilia\u00E7\u00E3o Banc\u00E1ria.';\n\nGRANT SELECT ON public.v_financial_bank_statement_unreconciled TO authenticated, service_role;\n";
|
|
114
|
+
export declare const MIGRATION_113_SO_A_CONTA_INTEGRADA_APARECE_NA_CONCILIACAO = "-- S\u00F3 a conta INTEGRADA aparece na Concilia\u00E7\u00E3o.\n--\n-- \u2500\u2500 O filtro que faltava \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- O V1 (`BankReconciliation.tsx:263`) monta o seletor assim:\n--\n-- .eq('active', true)\n-- .eq('openfinance_configured', true) \u2190 este\n-- account_type IN ('conta_bancaria','cartao_credito_pagamento')\n-- + cart\u00E3o exige openfinance_card_last4 com 4 d\u00EDgitos\n--\n-- \u00C9 por isso que l\u00E1 aparece UM Ita\u00FA: \u00E9 o \u00FAnico com Open Banking ligado. O V2\n-- listava toda conta banc\u00E1ria, cart\u00E3o e caixa do plano \u2014 inclusive as que nunca\n-- v\u00E3o trazer uma linha. Quem escolhe uma delas v\u00EA a lista vazia e conclui que a\n-- tela est\u00E1 quebrada; o defeito \u00E9 o convite, n\u00E3o a lista.\n--\n-- \u2500\u2500 Por que uma tabela, e n\u00E3o uma coluna \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n--\n-- `openfinance_configured` \u00E9 um booleano porque o V1 tem UM provedor. Aqui a\n-- conta pode ser servida por mais de um (o banco por Open Finance, o cart\u00E3o\n-- pelo adquirente), e o v\u00EDnculo carrega coisas que n\u00E3o s\u00E3o da conta nem do\n-- provedor sozinhos: como o provedor CHAMA aquela conta (`external_account_ref`\n-- \u2014 o hash da conta, os quatro \u00FAltimos do cart\u00E3o) e se a origem ainda est\u00E1\n-- viva. Numa coluna, ligar o segundo provedor obriga a escolher qual dos dois\n-- fica.\n--\n-- O `connection_id` aponta para `connections` SEM `REFERENCES`: aquela tabela \u00E9\n-- de packages/db e o v\u00EDnculo \u00E9 opcional (uma origem pode ser semeada antes de\n-- existir conex\u00E3o, e \u00E9 assim que o porte prova a tela). A aus\u00EAncia da FK est\u00E1\n-- anotada aqui porque ela \u00E9 uma escolha, n\u00E3o um esquecimento.\n--\n-- Idempotente.\n\nCREATE TABLE IF NOT EXISTS public.plg_financial_account_statement_sources (\n id uuid PRIMARY KEY DEFAULT gen_random_uuid(),\n tenant_id uuid NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,\n unit_id uuid,\n account_id uuid NOT NULL REFERENCES public.plg_financial_accounts(id) ON DELETE CASCADE,\n\n -- Quem traz o extrato desta conta: 'plugbank', 'inter', 'stone'\u2026\n -- Sem CHECK: a lista de provedores \u00E9 do mercado, n\u00E3o do schema, e uma\n -- constraint aqui derruba a concilia\u00E7\u00E3o no dia em que entrar o pr\u00F3ximo.\n provider text NOT NULL,\n -- A conex\u00E3o do conector, quando existe. Sem FK: ver o cabe\u00E7alho.\n connection_id uuid,\n -- Como o PROVEDOR chama esta conta. \u00C9 o que casa a linha que ele devolve com\n -- a conta daqui \u2014 no V1 s\u00E3o `openfinance_account_hash` e\n -- `openfinance_card_last4`.\n external_account_ref text,\n\n statement_kind text NOT NULL DEFAULT 'bank'\n CHECK (statement_kind IN ('bank', 'credit_card')),\n card_last4 text,\n -- A regra do V1, escrita: extrato de cart\u00E3o sem os quatro \u00FAltimos n\u00E3o casa\n -- com nada, ent\u00E3o ele n\u00E3o pode nem ser cadastrado.\n CONSTRAINT plg_financial_account_statement_sources_cartao_check\n CHECK (statement_kind <> 'credit_card' OR card_last4 ~ '^[0-9]{4}$'),\n\n -- Desligar a origem N\u00C3O apaga a linha: o extrato que j\u00E1 entrou por ela\n -- continua precisando dizer de onde veio.\n is_active boolean NOT NULL DEFAULT true,\n last_synced_at timestamptz,\n last_sync_status text,\n last_sync_error text,\n\n metadata jsonb NOT NULL DEFAULT '{}'::jsonb,\n created_at timestamptz NOT NULL DEFAULT now(),\n updated_at timestamptz NOT NULL DEFAULT now()\n);\n\nDO $$\nBEGIN\n ALTER TABLE public.plg_financial_account_statement_sources\n ADD CONSTRAINT plg_financial_account_statement_sources_unit_fkey\n FOREIGN KEY (tenant_id, unit_id) REFERENCES app.units(tenant_id, id) ON DELETE SET NULL;\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\n\n-- Uma conta n\u00E3o se liga duas vezes ao MESMO provedor pela mesma refer\u00EAncia\n-- externa. \u00CDndice e n\u00E3o constraint: `external_account_ref` \u00E9 nulo enquanto a\n-- conex\u00E3o n\u00E3o disse o nome dela, e `UNIQUE` deixaria passar N nulos.\nCREATE UNIQUE INDEX IF NOT EXISTS plg_financial_account_statement_sources_unica_idx\n ON public.plg_financial_account_statement_sources\n (tenant_id, account_id, provider, coalesce(external_account_ref, ''));\n\n-- A pergunta que a tela faz: quais contas deste inquilino t\u00EAm origem viva?\nCREATE INDEX IF NOT EXISTS plg_financial_account_statement_sources_ativas_idx\n ON public.plg_financial_account_statement_sources (tenant_id, account_id)\n WHERE is_active = true;\n\nDO $$\nBEGIN\n CREATE TRIGGER plg_financial_account_statement_sources_updated_at\n BEFORE UPDATE ON public.plg_financial_account_statement_sources\n FOR EACH ROW EXECUTE FUNCTION public.handle_updated_at();\nEXCEPTION WHEN duplicate_object THEN NULL;\nEND $$;\n\n-- Mesma cerca do extrato: quem pode ver a concilia\u00E7\u00E3o pode ver de onde ela vem.\nSELECT app.scaffold_table('public.plg_financial_account_statement_sources'::regclass,\n 'financial.bank_statement', 'financial', false, 'enforce');\nSELECT app.scaffold_scope('public.plg_financial_account_statement_sources'::regclass, 'unit_optional', true);\n\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n-- O seletor da Concilia\u00E7\u00E3o, como uma pergunta s\u00F3\n-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n--\n-- Equivale ao `openfinance_configured = true` do V1, e resolve de quebra o que\n-- fazia a lista nascer vazia: `getBankAccounts` varria o plano INTEIRO ordenado\n-- por nome, e num inquilino com milhares de contas de pessoa o teto da resposta\n-- se enchia antes de chegar em \u00ABIta\u00FA\u00BB.\nCREATE OR REPLACE VIEW public.v_financial_statement_accounts\nWITH (security_invoker = true) AS\nSELECT account.*,\n source.provider,\n source.statement_kind,\n source.card_last4,\n source.last_synced_at\n FROM public.plg_financial_accounts account\n JOIN public.plg_financial_account_statement_sources source\n ON source.account_id = account.id\n AND source.is_active = true\n WHERE account.is_active = true;\n\nCOMMENT ON VIEW public.v_financial_statement_accounts IS\n 'As contas que T\u00CAM extrato: as que carregam uma origem ativa. \u00C9 o seletor da Concilia\u00E7\u00E3o Banc\u00E1ria, e o equivalente ao openfinance_configured do V1.';\n\nGRANT SELECT ON public.v_financial_statement_accounts TO authenticated, service_role;\n";
|
|
115
|
+
export declare const MIGRATION_114_A_PARCELA_DIZ_POR_QUAL_CONTA_ELA_FOI_PAGA = "-- ============================================================================\n-- 114 \u2014 a parcela diz POR QUAL CONTA ela foi paga.\n--\n-- A lista do V1 recorta por \"Conta de pagamento\" / \"Conta de recebimento\", e\n-- aqui nao havia por onde: o vinculo parcela -> conta bancaria mora duas tabelas\n-- adiante (alocacao -> movimento), e pergunt\u00E1-lo de fora custaria uma lista de\n-- ids do tamanho do historico da conta antes da primeira linha aparecer.\n--\n-- O LATERAL que soma as baixas ja visita exatamente essas duas tabelas, pelo\n-- indice (installment_id). A conta de pagamento sai da MESMA visita, como um\n-- agregado a mais \u2014 o plano da consulta nao muda, e o recorte vira um `cs`\n-- sobre um array em vez de um `in` sobre dez mil ids.\n--\n-- ARRAY e nao coluna: uma parcela quitada em partes pode ter saido de duas\n-- contas, e escolher uma delas para caber numa coluna e escolher esconder a\n-- outra de quem filtra por ela.\n--\n-- Idempotente.\n-- ============================================================================\n\nDROP VIEW IF EXISTS public.v_financial_invoice_lines_due;\n\nCREATE VIEW public.v_financial_invoice_lines_due AS\nSELECT\n i.id AS installment_id,\n i.tenant_id,\n i.unit_id,\n i.invoice_id,\n t.direction,\n t.number,\n t.competence_date,\n t.issue_date,\n t.description,\n t.notes,\n t.metadata,\n t.order_id,\n t.counterparty_person_id,\n p.name AS counterparty_name,\n i.number AS installment_number,\n it.total AS installment_count,\n i.due_date,\n i.amount,\n COALESCE(pa.paid, 0::numeric)::numeric(14,2) AS paid,\n -- De quais contas bancarias saiu (ou entrou) o dinheiro desta parcela.\n -- Vazio enquanto ninguem pagou \u2014 e vazio nunca satisfaz um `cs`, que e\n -- exatamente o que o filtro quer dizer.\n COALESCE(pa.payment_account_ids, ARRAY[]::uuid[]) AS payment_account_ids,\n CASE\n WHEN i.cancelled_at IS NOT NULL OR t.cancelled_at IS NOT NULL THEN 0::numeric\n ELSE GREATEST(i.amount - COALESCE(pa.paid, 0::numeric), 0::numeric)\n END::numeric(14,2) AS balance,\n -- Mesmas palavras de `v_financial_installment_balances`. Se as duas\n -- divergirem, a lista e o detalhe passam a dizer coisas diferentes sobre a\n -- mesma parcela.\n CASE\n WHEN i.cancelled_at IS NOT NULL OR t.cancelled_at IS NOT NULL THEN 'cancelled'\n WHEN COALESCE(pa.paid, 0::numeric) >= i.amount THEN 'paid'\n WHEN COALESCE(pa.paid, 0::numeric) > 0::numeric THEN 'partial'\n WHEN i.due_date < CURRENT_DATE THEN 'overdue'\n ELSE 'pending'\n END AS status,\n i.cancelled_at,\n t.cancel_reason,\n t.created_by,\n i.created_at,\n i.updated_at\n FROM public.plg_financial_invoice_installments i\n JOIN public.plg_financial_invoices t ON t.id = i.invoice_id\n -- Correlacionado: so as baixas DESTA parcela, pelo indice (installment_id).\n LEFT JOIN LATERAL (\n SELECT sum(a.amount) AS paid,\n array_agg(DISTINCT m.bank_account_id)\n FILTER (WHERE m.bank_account_id IS NOT NULL) AS payment_account_ids\n FROM public.plg_financial_allocations a\n JOIN public.plg_financial_movements m ON m.id = a.payment_movement_id\n WHERE a.installment_id = i.id\n AND m.status <> 'cancelled'\n AND m.reversed_by_id IS NULL\n ) pa ON true\n -- \"3 de 4\": o denominador e do titulo, e sem ele a coluna de parcela mente.\n LEFT JOIN LATERAL (\n SELECT count(*) AS total\n FROM public.plg_financial_invoice_installments x\n WHERE x.invoice_id = i.invoice_id AND x.cancelled_at IS NULL\n ) it ON true\n LEFT JOIN public.people p ON p.id = t.counterparty_person_id;\n\nCOMMENT ON VIEW public.v_financial_invoice_lines_due IS\n 'Uma linha por PARCELA \u2014 a granularidade da lista de contas a pagar do V1, e '\n 'a unica em que \"o que vence no dia 11\" tem resposta. Filtra pelo indice '\n '(tenant_id, due_date) das parcelas: 0,15 s contra 7,5 s da forma por titulo. '\n 'payment_account_ids responde ao filtro \"conta de pagamento\" do V1 sem uma '\n 'segunda consulta.';\n\nALTER VIEW public.v_financial_invoice_lines_due SET (security_invoker = true);\nGRANT SELECT ON public.v_financial_invoice_lines_due TO authenticated, service_role;\n";
|
|
113
116
|
export declare const MIGRATIONS: Array<{
|
|
114
117
|
id: string;
|
|
115
118
|
sql: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -15,6 +15,10 @@ export interface FinancialUIState {
|
|
|
15
15
|
commissionsLoading: boolean;
|
|
16
16
|
cashSessions: CashSession[];
|
|
17
17
|
cashSessionsLoading: boolean;
|
|
18
|
+
/** The abertura/fechamento dialog lives in the SHELL header (CashSessionHeaderControl),
|
|
19
|
+
* outside any page's tree — a page button that wants to open "the same modal"
|
|
20
|
+
* has to flip a flag both sides share, not local state of its own. */
|
|
21
|
+
cashSessionModalOpen: boolean;
|
|
18
22
|
paymentMethods: PaymentMethod[];
|
|
19
23
|
paymentMethodTypes: PaymentMethodType[];
|
|
20
24
|
summary: FinancialSummary | null;
|
|
@@ -41,6 +45,7 @@ export interface FinancialUIState {
|
|
|
41
45
|
cancelInvoice(input: CancelInvoiceInput): Promise<void>;
|
|
42
46
|
openCashSession(input: OpenCashSessionInput): Promise<CashSession>;
|
|
43
47
|
closeCashSession(input: CloseCashSessionInput): Promise<CashSession>;
|
|
48
|
+
setCashSessionModalOpen(open: boolean): void;
|
|
44
49
|
}
|
|
45
50
|
export declare function createFinancialStore(provider: FinancialDataProvider): StoreApi<FinancialUIState>;
|
|
46
51
|
//# sourceMappingURL=store.d.ts.map
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAI5D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,KAAK,EACV,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EACpD,aAAa,EAAE,iBAAiB,EAAE,eAAe,EACjD,gBAAgB,EAAE,eAAe,EACjC,YAAY,EAAiB,cAAc,EAC3C,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EAC7E,oBAAoB,EAAE,qBAAqB,EAC3C,SAAS,EACT,eAAe,EAAE,eAAe,EAAE,wBAAwB,EAAE,0BAA0B,EACvF,MAAM,SAAS,CAAA;AAMhB,MAAM,WAAW,gBAAgB;IAE/B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAE1B,SAAS,EAAE,iBAAiB,EAAE,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;IAEzB,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mBAAmB,EAAE,OAAO,CAAA;IAE5B,WAAW,EAAE,eAAe,EAAE,CAAA;IAC9B,kBAAkB,EAAE,OAAO,CAAA;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAA;IAC3B,mBAAmB,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|