import { DollarSign } from 'lucide-react';
import { ContractItemType } from '../../../types/contract-item.types';
import { DELIVERABLE_TYPE_LABELS, DeliverableType } from '../../../constants/deliverable-type';
import type { DeliverableDetail } from '../../../types/deliverable.types';
interface Props {
deliverable: DeliverableDetail;
}
function formatCurrency(value: number): string {
return value.toLocaleString('pt-BR', {
style: 'currency',
currency: 'BRL',
});
}
function formatNumber(value: number): string {
return value.toLocaleString('pt-BR', {
minimumFractionDigits: 0,
maximumFractionDigits: 2,
});
}
function resolveTimebox(deliverable: DeliverableDetail): {
value: number | null;
source: 'CONTRACT_ITEM' | 'DELIVERABLE' | null;
} {
if (deliverable.type === DeliverableType.MANUTENCAO) {
return { value: deliverable.timeboxManutencao ?? null, source: 'DELIVERABLE' };
}
const ci = deliverable.contractItem;
if (!ci) return { value: null, source: null };
switch (deliverable.type) {
case DeliverableType.DESCOBERTA:
return { value: ci.timeboxDescoberta, source: 'CONTRACT_ITEM' };
case DeliverableType.DESIGN:
return { value: ci.timeboxDesign, source: 'CONTRACT_ITEM' };
case DeliverableType.ARQUITETURA:
return { value: ci.timeboxArquitetura, source: 'CONTRACT_ITEM' };
case DeliverableType.CONSTRUCAO:
return { value: ci.timeboxConstrucao, source: 'CONTRACT_ITEM' };
default:
return { value: null, source: null };
}
}
export function EntregavelValuationCard({ deliverable }: Props) {
const ci = deliverable.contractItem;
const isSaas = ci?.itemType === ContractItemType.SAAS_LICENSE;
const { value: timebox, source } = resolveTimebox(deliverable);
const totalValueNumber = deliverable.totalValue != null ? Number(deliverable.totalValue) : null;
if (deliverable.type === DeliverableType.LICENCA) {
if (totalValueNumber == null || ci?.ustValue == null) {
return (
Valor Total
{formatCurrency(totalValueNumber)}
1 licença × R$ {formatNumber(ci.ustValue)}/unidade
Valor Total
R$ 0,00
Licença SaaS — faturamento via OS MãeValor Total
Não valorado
Valor Total
{formatCurrency(totalValueNumber)}
{formatNumber(timebox)}h × {deliverable.numWeeks} sem × R$ {formatNumber(ci.ustValue)} /UST
Time-box{' '} {source === 'DELIVERABLE' ? '(definido no Entregável)' : '(definido no Item de Contrato)'}
{title}
{description}