feat(protese): fluxo do lado do protético — entrada de OS, baixa/cobrança e importar OS indicada
Fecha o ciclo operacional do laboratório, antes só "receptor passivo" das OS da clínica. 1. Dar entrada em OS pelo lab — POST /api/protese/lab/os: o dono do laboratório registra um trabalho recebido fora do app, escolhendo cliente existente OU avulso (clínica/consultório/ dentista, materializado como registro mínimo) + produto do catálogo ou tipo livre. A OS já entra com laboratorio_id e custódia no laboratório. UI: botão "Dar entrada" + modal na LabHome. 2. Dar baixa em pagamento — já existia (lado 'lab'); mantido na PagamentosSecao. 3. Solicitar pagamento — POST /api/protese/os/:id/cobrar: calcula o saldo devedor (custo − pago) e notifica o cliente, registrando no histórico. UI: botão "Solicitar pagamento (saldo)" na PagamentosSecao do modo bancada. 4. Importar/vincular OS indicada — GET /api/protese/lab/os-indicadas (OS com protetico_id=me e laboratorio_id NULL) + POST /api/protese/os/:id/vincular-lab (seta laboratorio_id, status→recebido, notifica a clínica). Sem isso a OS só aparecia ao dono via fallback; importando, a equipe/técnicos e o financeiro do lab passam a vê-la. UI: seção "OS indicadas a você" na LabHome. origemDe agora reconhece cliente avulso tipo 'dentista'. Validado em DEV (todos os 4 endpoints). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1099,6 +1099,25 @@ export const HybridBackend = {
|
||||
const res = await apiFetch(`${API_URL}/protese/lab/fechamento`);
|
||||
return await res.json().catch(() => []);
|
||||
},
|
||||
// Fase 6: OS indicadas (sem lab vinculado) + importar/vincular ao meu laboratório.
|
||||
getLabOsIndicadas: async (): Promise<any[]> => {
|
||||
const res = await apiFetch(`${API_URL}/protese/lab/os-indicadas`);
|
||||
return await res.json().catch(() => []);
|
||||
},
|
||||
vincularOsLab: async (osId: string) => {
|
||||
const res = await apiFetch(`${API_URL}/protese/os/${osId}/vincular-lab`, { method: 'POST' });
|
||||
return await res.json().catch(() => ({ error: 'falha' }));
|
||||
},
|
||||
// Fase 6: solicitar pagamento (cobrar saldo) ao cliente.
|
||||
cobrarOs: async (osId: string, body: { valor?: number; observacao?: string } = {}) => {
|
||||
const res = await apiFetch(`${API_URL}/protese/os/${osId}/cobrar`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
|
||||
return await res.json().catch(() => ({ error: 'falha' }));
|
||||
},
|
||||
// Fase 6: dar entrada em OS pelo lado do laboratório (cliente existente ou avulso).
|
||||
criarLabOs: async (body: any) => {
|
||||
const res = await apiFetch(`${API_URL}/protese/lab/os`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
|
||||
return await res.json().catch(() => ({ error: 'falha' }));
|
||||
},
|
||||
// Fase 4: dados do laboratório (PF/PJ, CPF/CNPJ) + equipe de técnicos
|
||||
getLabDados: async (): Promise<any> => {
|
||||
const res = await apiFetch(`${API_URL}/protese/lab`);
|
||||
|
||||
Reference in New Issue
Block a user