forked from git.gladyson/openmonetis
- Replace ESLint with Biome for linting and formatting - Configure Biome with tabs, double quotes, and organized imports - Move all SQL/Drizzle queries from page.tsx files to data.ts files - Create new data.ts files for: ajustes, dashboard, relatorios/categorias - Update existing data.ts files: extrato, fatura (add lancamentos queries) - Remove all drizzle-orm imports from page.tsx files - Update README.md with new tooling info Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
301 lines
8.5 KiB
TypeScript
301 lines
8.5 KiB
TypeScript
"use client";
|
|
|
|
import { Label } from "@/components/ui/label";
|
|
import {
|
|
Select,
|
|
SelectContent,
|
|
SelectItem,
|
|
SelectTrigger,
|
|
SelectValue,
|
|
} from "@/components/ui/select";
|
|
import { LANCAMENTO_PAYMENT_METHODS } from "@/lib/lancamentos/constants";
|
|
import { cn } from "@/lib/utils/ui";
|
|
import {
|
|
ContaCartaoSelectContent,
|
|
PaymentMethodSelectContent,
|
|
} from "../../select-items";
|
|
import type { PaymentMethodSectionProps } from "./lancamento-dialog-types";
|
|
|
|
export function PaymentMethodSection({
|
|
formState,
|
|
onFieldChange,
|
|
contaOptions,
|
|
cartaoOptions,
|
|
isUpdateMode,
|
|
disablePaymentMethod,
|
|
disableCartaoSelect,
|
|
}: PaymentMethodSectionProps) {
|
|
const isCartaoSelected = formState.paymentMethod === "Cartão de crédito";
|
|
const showContaSelect = [
|
|
"Pix",
|
|
"Dinheiro",
|
|
"Boleto",
|
|
"Cartão de débito",
|
|
"Pré-Pago | VR/VA",
|
|
"Transferência bancária",
|
|
].includes(formState.paymentMethod);
|
|
|
|
// Filtrar contas apenas do tipo "Pré-Pago | VR/VA" quando forma de pagamento for "Pré-Pago | VR/VA"
|
|
const filteredContaOptions =
|
|
formState.paymentMethod === "Pré-Pago | VR/VA"
|
|
? contaOptions.filter(
|
|
(option) => option.accountType === "Pré-Pago | VR/VA",
|
|
)
|
|
: contaOptions;
|
|
|
|
return (
|
|
<>
|
|
{!isUpdateMode ? (
|
|
<div className="flex w-full flex-col gap-2 md:flex-row">
|
|
<div
|
|
className={cn(
|
|
"space-y-1 w-full",
|
|
isCartaoSelected || showContaSelect ? "md:w-1/2" : "md:w-full",
|
|
)}
|
|
>
|
|
<Label htmlFor="paymentMethod">Forma de pagamento</Label>
|
|
<Select
|
|
value={formState.paymentMethod}
|
|
onValueChange={(value) => onFieldChange("paymentMethod", value)}
|
|
disabled={disablePaymentMethod}
|
|
>
|
|
<SelectTrigger
|
|
id="paymentMethod"
|
|
className="w-full"
|
|
disabled={disablePaymentMethod}
|
|
>
|
|
<SelectValue placeholder="Selecione" className="w-full">
|
|
{formState.paymentMethod && (
|
|
<PaymentMethodSelectContent
|
|
label={formState.paymentMethod}
|
|
/>
|
|
)}
|
|
</SelectValue>
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{LANCAMENTO_PAYMENT_METHODS.map((method) => (
|
|
<SelectItem key={method} value={method}>
|
|
<PaymentMethodSelectContent label={method} />
|
|
</SelectItem>
|
|
))}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
{isCartaoSelected ? (
|
|
<div className="space-y-1 w-full md:w-1/2">
|
|
<Label htmlFor="cartao">Cartão</Label>
|
|
<Select
|
|
value={formState.cartaoId}
|
|
onValueChange={(value) => onFieldChange("cartaoId", value)}
|
|
disabled={disableCartaoSelect}
|
|
>
|
|
<SelectTrigger
|
|
id="cartao"
|
|
className="w-full"
|
|
disabled={disableCartaoSelect}
|
|
>
|
|
<SelectValue placeholder="Selecione">
|
|
{formState.cartaoId &&
|
|
(() => {
|
|
const selectedOption = cartaoOptions.find(
|
|
(opt) => opt.value === formState.cartaoId,
|
|
);
|
|
return selectedOption ? (
|
|
<ContaCartaoSelectContent
|
|
label={selectedOption.label}
|
|
logo={selectedOption.logo}
|
|
isCartao={true}
|
|
/>
|
|
) : null;
|
|
})()}
|
|
</SelectValue>
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{cartaoOptions.length === 0 ? (
|
|
<div className="px-2 py-6 text-center">
|
|
<p className="text-sm text-muted-foreground">
|
|
Nenhum cartão cadastrado
|
|
</p>
|
|
</div>
|
|
) : (
|
|
cartaoOptions.map((option) => (
|
|
<SelectItem key={option.value} value={option.value}>
|
|
<ContaCartaoSelectContent
|
|
label={option.label}
|
|
logo={option.logo}
|
|
isCartao={true}
|
|
/>
|
|
</SelectItem>
|
|
))
|
|
)}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
) : null}
|
|
|
|
{!isCartaoSelected && showContaSelect ? (
|
|
<div
|
|
className={cn(
|
|
"space-y-1 w-full",
|
|
!isUpdateMode ? "md:w-1/2" : "md:w-full",
|
|
)}
|
|
>
|
|
<Label htmlFor="conta">Conta</Label>
|
|
<Select
|
|
value={formState.contaId}
|
|
onValueChange={(value) => onFieldChange("contaId", value)}
|
|
>
|
|
<SelectTrigger id="conta" className="w-full">
|
|
<SelectValue placeholder="Selecione">
|
|
{formState.contaId &&
|
|
(() => {
|
|
const selectedOption = filteredContaOptions.find(
|
|
(opt) => opt.value === formState.contaId,
|
|
);
|
|
return selectedOption ? (
|
|
<ContaCartaoSelectContent
|
|
label={selectedOption.label}
|
|
logo={selectedOption.logo}
|
|
isCartao={false}
|
|
/>
|
|
) : null;
|
|
})()}
|
|
</SelectValue>
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{filteredContaOptions.length === 0 ? (
|
|
<div className="px-2 py-6 text-center">
|
|
<p className="text-sm text-muted-foreground">
|
|
Nenhuma conta cadastrada
|
|
</p>
|
|
</div>
|
|
) : (
|
|
filteredContaOptions.map((option) => (
|
|
<SelectItem key={option.value} value={option.value}>
|
|
<ContaCartaoSelectContent
|
|
label={option.label}
|
|
logo={option.logo}
|
|
isCartao={false}
|
|
/>
|
|
</SelectItem>
|
|
))
|
|
)}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
) : null}
|
|
</div>
|
|
) : null}
|
|
|
|
{isUpdateMode ? (
|
|
<div className="flex w-full flex-col gap-2 md:flex-row">
|
|
{isCartaoSelected ? (
|
|
<div
|
|
className={cn(
|
|
"space-y-1 w-full",
|
|
!isUpdateMode ? "md:w-1/2" : "md:w-full",
|
|
)}
|
|
>
|
|
<Label htmlFor="cartaoUpdate">Cartão</Label>
|
|
<Select
|
|
value={formState.cartaoId}
|
|
onValueChange={(value) => onFieldChange("cartaoId", value)}
|
|
>
|
|
<SelectTrigger id="cartaoUpdate" className="w-full">
|
|
<SelectValue placeholder="Selecione">
|
|
{formState.cartaoId &&
|
|
(() => {
|
|
const selectedOption = cartaoOptions.find(
|
|
(opt) => opt.value === formState.cartaoId,
|
|
);
|
|
return selectedOption ? (
|
|
<ContaCartaoSelectContent
|
|
label={selectedOption.label}
|
|
logo={selectedOption.logo}
|
|
isCartao={true}
|
|
/>
|
|
) : null;
|
|
})()}
|
|
</SelectValue>
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{cartaoOptions.length === 0 ? (
|
|
<div className="px-2 py-6 text-center">
|
|
<p className="text-sm text-muted-foreground">
|
|
Nenhum cartão cadastrado
|
|
</p>
|
|
</div>
|
|
) : (
|
|
cartaoOptions.map((option) => (
|
|
<SelectItem key={option.value} value={option.value}>
|
|
<ContaCartaoSelectContent
|
|
label={option.label}
|
|
logo={option.logo}
|
|
isCartao={true}
|
|
/>
|
|
</SelectItem>
|
|
))
|
|
)}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
) : null}
|
|
|
|
{!isCartaoSelected && showContaSelect ? (
|
|
<div
|
|
className={cn(
|
|
"space-y-1 w-full",
|
|
!isUpdateMode ? "md:w-1/2" : "md:w-full",
|
|
)}
|
|
>
|
|
<Label htmlFor="contaUpdate">Conta</Label>
|
|
<Select
|
|
value={formState.contaId}
|
|
onValueChange={(value) => onFieldChange("contaId", value)}
|
|
>
|
|
<SelectTrigger id="contaUpdate" className="w-full">
|
|
<SelectValue placeholder="Selecione">
|
|
{formState.contaId &&
|
|
(() => {
|
|
const selectedOption = filteredContaOptions.find(
|
|
(opt) => opt.value === formState.contaId,
|
|
);
|
|
return selectedOption ? (
|
|
<ContaCartaoSelectContent
|
|
label={selectedOption.label}
|
|
logo={selectedOption.logo}
|
|
isCartao={false}
|
|
/>
|
|
) : null;
|
|
})()}
|
|
</SelectValue>
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{filteredContaOptions.length === 0 ? (
|
|
<div className="px-2 py-6 text-center">
|
|
<p className="text-sm text-muted-foreground">
|
|
Nenhuma conta cadastrada
|
|
</p>
|
|
</div>
|
|
) : (
|
|
filteredContaOptions.map((option) => (
|
|
<SelectItem key={option.value} value={option.value}>
|
|
<ContaCartaoSelectContent
|
|
label={option.label}
|
|
logo={option.logo}
|
|
isCartao={false}
|
|
/>
|
|
</SelectItem>
|
|
))
|
|
)}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
) : null}
|
|
</div>
|
|
) : null}
|
|
</>
|
|
);
|
|
}
|