primeira versão

This commit is contained in:
2026-02-17 23:47:16 +01:00
commit d76d610955
32 changed files with 2304 additions and 0 deletions

200
views/crianca_view.xml Normal file
View File

@@ -0,0 +1,200 @@
<odoo>
<!-- KANBAN -->
<record id="view_recreacao_crianca_kanban" model="ir.ui.view">
<field name="name">recreacao.crianca.kanban</field>
<field name="model">recreacao.crianca</field>
<field name="arch" type="xml">
<kanban class="o_kanban_mobile">
<field name="id"/>
<field name="name"/>
<field name="foto"/>
<field name="status_dia"/>
<field name="tem_alergia"/>
<field name="plano_id"/>
<field name="idade"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click o_kanban_record_has_image_fill o_res_partner_kanban">
<!-- Foto -->
<t t-if="record.foto.raw_value">
<div class="o_kanban_image">
<img t-att-src="kanban_image('recreacao.crianca', 'foto', record.id.raw_value)" alt="Foto"/>
</div>
</t>
<t t-else="">
<div class="o_kanban_image">
<img alt="Sem Foto" src="/base/static/img/avatar_grey.png"/>
</div>
</t>
<div class="oe_kanban_details">
<div class="o_kanban_record_top">
<div class="o_kanban_record_headings">
<strong class="o_kanban_record_title"><field name="name"/></strong>
</div>
<div class="o_dropdown_kanban dropdown">
<a class="dropdown-toggle o-no-caret btn" role="button" data-bs-toggle="dropdown" href="#" aria-label="Dropdown">
<span class="fa fa-ellipsis-v"/>
</a>
<div class="dropdown-menu" role="menu">
<a role="menuitem" type="edit" class="dropdown-item">Editar</a>
<a role="menuitem" type="object" name="action_abrir_historico" class="dropdown-item">Ver Diário</a>
<!-- CORRIGIDO AQUI: Nome da nova função -->
<a role="menuitem" type="object" name="action_gerar_cobranca" class="dropdown-item">Gerar Cobrança</a>
<a role="menuitem" type="delete" class="dropdown-item text-danger">Excluir</a>
</div>
</div>
</div>
<ul>
<li><span class="text-muted"><field name="idade"/></span></li>
<li><span class="badge text-bg-light"><field name="plano_id"/></span></li>
<li t-if="record.tem_alergia.raw_value">
<span class="badge text-bg-danger">⚠️ ALÉRGICO</span>
</li>
</ul>
<div class="o_kanban_record_bottom" style="margin-top: 8px;">
<div class="oe_kanban_bottom_left">
<button name="action_abrir_whatsapp" type="object" class="btn btn-sm btn-outline-success" style="border-radius: 50%; width: 32px; height: 32px; padding: 0;">
<i class="fa fa-whatsapp" style="font-size: 18px;"/>
</button>
</div>
<div class="oe_kanban_bottom_right">
<t t-if="record.status_dia.raw_value == 'ausente'">
<button name="action_marcar_entrada" type="object" class="btn btn-primary btn-sm">
<i class="fa fa-sign-in"/> Entrada
</button>
</t>
<t t-if="record.status_dia.raw_value == 'presente'">
<button name="action_marcar_saida" type="object" class="btn btn-danger btn-sm">
<i class="fa fa-sign-out"/> Saída
</button>
</t>
<t t-if="record.status_dia.raw_value == 'finalizado'">
<span class="badge rounded-pill text-bg-secondary">
<i class="fa fa-home"/> JÁ SAIU
</span>
</t>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- LISTA GERAL -->
<record id="view_recreacao_crianca_tree" model="ir.ui.view">
<field name="name">recreacao.crianca.tree</field>
<field name="model">recreacao.crianca</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="idade"/>
<field name="responsavel_financeiro_id"/>
<field name="plano_id"/>
<field name="status_dia" widget="badge"
decoration-success="status_dia == 'presente'"
decoration-muted="status_dia == 'finalizado'"/>
</tree>
</field>
</record>
<!-- FORMULÁRIO -->
<record id="view_recreacao_crianca_form" model="ir.ui.view">
<field name="name">recreacao.crianca.form</field>
<field name="model">recreacao.crianca</field>
<field name="arch" type="xml">
<form>
<header>
<button name="action_marcar_entrada" string="Registrar Entrada" type="object" class="oe_highlight" invisible="status_dia != 'ausente'"/>
<button name="action_marcar_saida" string="Registrar Saída" type="object" class="btn-danger" invisible="status_dia != 'presente'"/>
<!-- CORRIGIDO AQUI: Botão novo -->
<button name="action_gerar_cobranca" string="Gerar Cobrança" type="object" class="btn-primary"/>
<field name="status_dia" widget="statusbar"/>
</header>
<sheet>
<field name="foto" widget="image" class="oe_avatar"/>
<div class="oe_title">
<h1><field name="name" placeholder="Nome da Criança"/></h1>
</div>
<group>
<group string="Filiação">
<field name="mae_id" context="{'default_is_company': False}"/>
<field name="pai_id" context="{'default_is_company': False}"/>
<field name="responsavel_financeiro_id"/>
</group>
<group string="Plano">
<field name="plano_id"/>
<field name="valor_plano"/>
<field name="data_nascimento"/>
<field name="idade"/>
</group>
</group>
<div class="alert alert-danger" role="alert" invisible="not tem_alergia and not toma_remedio">
<strong>ATENÇÃO:</strong> Criança com restrições médicas!
</div>
<notebook>
<page string="🏥 Saúde">
<group>
<group>
<field name="tem_alergia"/>
<field name="alergias" invisible="not tem_alergia"/>
</group>
<group>
<field name="toma_remedio"/>
<field name="medicamentos" invisible="not toma_remedio"/>
<field name="horario_medicacao" invisible="not toma_remedio"/>
</group>
</group>
<field name="observacoes_saude"/>
</page>
<page string="Histórico / Diário">
<field name="diario_ids">
<tree editable="bottom" default_order="data desc, create_date desc"
decoration-success="tipo=='entrada'"
decoration-danger="tipo=='saida'">
<field name="data"/>
<field name="hora_registro"/>
<field name="tipo"/>
<field name="descricao"/>
</tree>
</field>
</page>
<!-- NOVO: Aba Financeiro -->
<page string="💲 Financeiro">
<field name="financeiro_ids" readonly="1">
<tree decoration-success="status=='pago'" decoration-danger="status=='pendente'">
<field name="data_vencimento"/>
<field name="name"/>
<field name="valor"/>
<field name="status" widget="badge"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<!-- CHATTER (Rodapé para mensagens) -->
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
<record id="action_recreacao_crianca" model="ir.actions.act_window">
<field name="name">Alunos</field>
<field name="res_model">recreacao.crianca</field>
<field name="view_mode">kanban,tree,form</field>
</record>
<menuitem id="menu_recreacao_crianca" name="Painel de Alunos" parent="menu_recreacao_root" action="action_recreacao_crianca" sequence="1"/>
</odoo>

50
views/diario_view.xml Normal file
View File

@@ -0,0 +1,50 @@
<odoo>
<!-- LISTA GERAL DO DIÁRIO -->
<record id="view_recreacao_diario_tree" model="ir.ui.view">
<field name="name">recreacao.diario.tree</field>
<field name="model">recreacao.diario</field>
<field name="arch" type="xml">
<tree string="Diário de Classe"
decoration-success="tipo=='entrada'"
decoration-danger="tipo=='saida'"
decoration-warning="tipo=='ocorrencia'">
<field name="data"/>
<field name="hora_registro"/> <!-- Novo -->
<field name="crianca_id"/>
<field name="tipo" widget="badge"/>
<field name="descricao"/>
</tree>
</field>
</record>
<!-- FORMULÁRIO DO DIÁRIO -->
<record id="view_recreacao_diario_form" model="ir.ui.view">
<field name="name">recreacao.diario.form</field>
<field name="model">recreacao.diario</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<group>
<field name="data"/>
<field name="hora_registro"/>
<field name="crianca_id" options="{'no_create': True}"/>
</group>
<group>
<field name="tipo"/>
</group>
</group>
<field name="descricao" placeholder="Descreva o que aconteceu..."/>
</sheet>
</form>
</field>
</record>
<record id="action_recreacao_diario" model="ir.actions.act_window">
<field name="name">Diário Geral</field>
<field name="res_model">recreacao.diario</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_recreacao_diario" name="Diário Geral" parent="menu_recreacao_root" action="action_recreacao_diario" sequence="10"/>
</odoo>

118
views/financeiro_view.xml Normal file
View File

@@ -0,0 +1,118 @@
<odoo>
<record id="view_recreacao_financeiro_tree" model="ir.ui.view">
<field name="name">recreacao.financeiro.tree</field>
<field name="model">recreacao.financeiro</field>
<field name="arch" type="xml">
<tree editable="bottom"
decoration-success="tipo=='receita'"
decoration-danger="tipo=='despesa'"
decoration-muted="status=='cancelado'"
limit="15">
<field name="data_vencimento" decoration-bf="1"/>
<field name="name" placeholder="Ex: Mensalidade João"/>
<field name="forma_pagamento"
decoration-info="forma_pagamento == 'pix'"
decoration-success="forma_pagamento == 'dinheiro'"
decoration-warning="forma_pagamento == 'cartao'"
decoration-bf="1"
optional="show"/>
<field name="tipo"
decoration-success="tipo=='receita'"
decoration-danger="tipo=='despesa'"
decoration-bf="1"/>
<field name="partner_id" widget="res_partner_many2one" optional="show"/>
<field name="crianca_id" optional="hide"/>
<field name="valor" sum="Total do Período" decoration-bf="1"/>
<field name="status" widget="badge"
decoration-success="status=='pago'"
decoration-warning="status=='pendente'"
readonly="1"/>
<button name="action_pagar"
string=" "
type="object"
icon="fa-check"
title="Confirmar Pagamento"
class="btn-success"
invisible="status != 'pendente'"/>
</tree>
</field>
</record>
<record id="view_recreacao_financeiro_graph" model="ir.ui.view">
<field name="name">recreacao.financeiro.graph</field>
<field name="model">recreacao.financeiro</field>
<field name="arch" type="xml">
<graph string="Fluxo de Caixa" type="bar" stacked="True">
<field name="data_vencimento" type="row" interval="month"/>
<field name="tipo" type="col"/>
<field name="valor" type="measure"/>
</graph>
</field>
</record>
<record id="view_recreacao_financeiro_search" model="ir.ui.view">
<field name="name">recreacao.financeiro.search</field>
<field name="model">recreacao.financeiro</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="partner_id"/>
<field name="crianca_id"/>
<filter string="Entradas (Receitas)" name="filter_receitas" domain="[('tipo','=','receita')]"/>
<filter string="Saídas (Despesas)" name="filter_despesas" domain="[('tipo','=','despesa')]"/>
<separator/>
<filter string="Pendentes" name="filter_pendentes" domain="[('status','=','pendente')]"/>
<filter string="Pagos" name="filter_pagos" domain="[('status','=','pago')]"/>
<separator/>
<filter string="PIX" name="filter_pix" domain="[('forma_pagamento','=','pix')]"/>
<filter string="Dinheiro" name="filter_dinheiro" domain="[('forma_pagamento','=','dinheiro')]"/>
<group expand="1" string="Agrupar Por">
<filter string="Mês" name="group_month" context="{'group_by':'data_vencimento:month'}"/>
<filter string="Tipo" name="group_tipo" context="{'group_by':'tipo'}"/>
<filter string="Status" name="group_status" context="{'group_by':'status'}"/>
<filter string="Forma de Pagto" name="group_pagto" context="{'group_by':'forma_pagamento'}"/>
</group>
</search>
</field>
</record>
<record id="action_recreacao_financeiro" model="ir.actions.act_window">
<field name="name">Movimentações Financeiras</field>
<field name="res_model">recreacao.financeiro</field>
<field name="view_mode">tree,graph,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Gerencie aqui o caixa da recreação.
</p>
</field>
</record>
<menuitem id="menu_recreacao_financeiro_root"
name="Financeiro"
parent="menu_recreacao_root"
sequence="10"/>
<menuitem id="menu_recreacao_financeiro_movimentos"
name="Movimentações (Caixa)"
parent="menu_recreacao_financeiro_root"
action="action_recreacao_financeiro"
sequence="1"/>
<menuitem id="menu_recreacao_relatorio_mensal_pdf"
name="Imprimir Fluxo (PDF)"
parent="menu_recreacao_financeiro_root"
action="action_recreacao_financeiro_wizard"
sequence="2"/>
</odoo>

View File

@@ -0,0 +1,40 @@
<odoo>
<record id="view_recreacao_financeiro_wizard_form" model="ir.ui.view">
<field name="name">recreacao.financeiro.wizard.form</field>
<field name="model">recreacao.financeiro.wizard</field>
<field name="arch" type="xml">
<form string="Relatório Financeiro Mensal">
<group>
<group>
<field name="data_inicio"/>
</group>
<group>
<field name="data_fim"/>
</group>
</group>
<footer>
<button name="action_gerar_pdf" string="Imprimir PDF" type="object" class="btn-primary"/>
<button string="Cancelar" class="btn-secondary" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="action_recreacao_financeiro_wizard" model="ir.actions.act_window">
<field name="name">Relatório Mensal</field>
<field name="res_model">recreacao.financeiro.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
<!-- Adiciona o botão no menu Financeiro -->
<menuitem id="menu_recreacao_relatorio"
name="Relatórios"
parent="menu_recreacao_root"
sequence="20"/>
<menuitem id="menu_recreacao_relatorio_mensal"
name="Fluxo de Caixa (PDF)"
parent="menu_recreacao_relatorio"
action="action_recreacao_financeiro_wizard"/>
</odoo>

25
views/plano_view.xml Normal file
View File

@@ -0,0 +1,25 @@
<odoo>
<record id="view_recreacao_plano_tree" model="ir.ui.view">
<field name="name">recreacao.plano.tree</field>
<field name="model">recreacao.plano</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="name"/>
<field name="tipo_cobranca"/> <!-- Campo Novo -->
<field name="valor"/>
<field name="horario_inicio" widget="float_time"/>
<field name="horario_fim" widget="float_time"/>
</tree>
</field>
</record>
<record id="action_recreacao_plano" model="ir.actions.act_window">
<field name="name">Planos e Preços</field>
<field name="res_model">recreacao.plano</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_recreacao_root" name="Recreação" web_icon="contacts,static/description/icon.png"/>
<menuitem id="menu_recreacao_config" name="Configurações" parent="menu_recreacao_root" sequence="100"/>
<menuitem id="menu_recreacao_plano" name="Planos" parent="menu_recreacao_config" action="action_recreacao_plano"/>
</odoo>

View File

@@ -0,0 +1,20 @@
<odoo>
<record id="view_partner_form_recreacao" model="ir.ui.view">
<field name="name">res.partner.form.recreacao</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Filhos na Recreação">
<field name="crianca_ids">
<tree>
<field name="name"/>
<field name="plano_id"/>
<field name="idade"/>
</tree>
</field>
</page>
</notebook>
</field>
</record>
</odoo>

15
views/web_layout.xml Normal file
View File

@@ -0,0 +1,15 @@
<odoo>
<template id="custom_favicon_backend" inherit_id="web.layout" name="Custom Favicon &amp; Manifest">
<xpath expr="//head" position="inside">
<!-- Ícones de navegador -->
<link rel="shortcut icon" href="/plugin_recre/static/img/favicon.ico" type="image/x-icon"/>
<link rel="icon" href="/plugin_recre/static/img/favicon.ico" type="image/x-icon"/>
<!-- O SEGREDO DO ANDROID: Link para o nosso JSON -->
<link rel="manifest" href="/plugin_recre/static/manifest.json"/>
<!-- Meta tag para pintar a barra do navegador do celular -->
<meta name="theme-color" content="#714B67"/>
</xpath>
</template>
</odoo>