openSOURCE

openSOURCE

Did You Know?

All the tech in one platform

Form View

Tab Treatment History → smart button ke treatment.session

Estimated reading: 6 minutes 23 views

1) Tujuan

  • Menyediakan riwayat tindakan pasien dari waktu ke waktu (siapa dokter, layanan apa, hasil, billing).
  • Menjadi titik mulai operasional klinis: Start SessionAdd Notes/OutcomeDoneBill.
  • Memunculkan gate klinis (consent/baseline) sebelum tindakan dimulai.

2) Model & Relasi

  • treatment.session (modul Treatment) dengan relasi:
    • patient_idclinic.patient (M2O, required, ondelete=cascade)
    • doctor_idhr.employee/clinic.doctor (sesuai modul Dokter & Scheduling)
    • booking_idclinic.booking (opsional)
    • company_idres.company
    • photo_idsclinic.patient.photo (O2M, opsional; pairing baseline/after di modul Photos)
  • Status: draftin_progressdone (→ invoiced, opsional) / cancelled.
clinic.patient.last_visit_date di-update saat sesi berstatus done.

3) Field Kunci di treatment.session (ringkas)

  • Identitas: patient_id, doctor_id, company_id, date_start, date_end, duration
  • Tindakan: procedure_ids (M2M → treatment.procedure), device_id (ops), area (ops)
  • Outcome: notes_clinical (Text), complication (Selection/Boolean), followup_days (Int)
  • Kepatuhan: consent_ok (Boolean ro, compute), baseline_ok (Boolean ro, compute)
  • Keuangan: to_invoice (Boolean), invoice_id (M2O → account.move, ops)
  • Status: state (Selection: draft/in_progress/done/cancelled)

4) Layout XML di Tab (O2M Inline)

<page string="Treatment History"
      groups="clinic.group_clinical,clinic.group_manager,clinic.group_admin">

  <group>
    <field name="session_ids" context="{'default_patient_id': id, 'default_company_id': company_id}"
           domain="[('patient_id','=', id)]" colspan="4">
      <tree string="Sessions" editable="bottom"
            decoration-danger="state=='cancelled'"
            decoration-muted="state=='draft'">
        <field name="date_start"/>
        <field name="doctor_id"/>
        <field name="procedure_summary" string="Procedures"/>
        <field name="consent_ok"   widget="boolean_button" readonly="1"/>
        <field name="baseline_ok"  widget="boolean_button" readonly="1"/>
        <field name="state"/>
        <field name="to_invoice"   optional="hide"/>
        <field name="invoice_id"   optional="hide"/>
      </tree>

      <!-- Form mini saat create/edit inline -->
      <form string="Session">
        <group>
          <group>
            <field name="date_start"/>
            <field name="date_end" attrs="{'invisible':[('state','!=','done')]}"/>
            <field name="doctor_id"/>
            <field name="booking_id" readonly="1" optional="hide"/>
          </group>
          <group>
            <field name="procedure_ids" widget="many2many_tags"/>
            <field name="device_id" optional="hide"/>
            <field name="area" optional="hide"/>
          </group>
        </group>
        <group string="Outcome" attrs="{'invisible':[('state','!=','done')]}">
          <field name="notes_clinical"/>
          <field name="complication"/>
          <field name="followup_days"/>
        </group>
        <group string="Compliance (auto)" colspan="2">
          <field name="consent_ok"  readonly="1"/>
          <field name="baseline_ok" readonly="1"/>
        </group>
        <group string="Billing" attrs="{'invisible':[('state','!=','done')]}">
          <field name="to_invoice"/>
          <field name="invoice_id" readonly="1"/>
        </group>
        <footer>
          <button name="action_start" type="object" string="Start"
                  attrs="{'invisible':[('state','!=','draft')]}"/>
          <button name="action_done"  type="object" string="Done"
                  attrs="{'invisible':[('state','!=','in_progress')]}"/>
          <button name="action_cancel" type="object" string="Cancel"
                  attrs="{'invisible':[('state','=','cancelled')]}"
                  class="btn-secondary"/>
          <button string="Close" class="btn-link" special="cancel"/>
        </footer>
      </form>
    </field>
  </group>

  <!-- Smart link sekunder -->
  <button name="action_open_sessions" type="object" class="btn-link">
    Lihat semua sesi (list penuh)
  </button>
</page>

5) Perilaku & Guard Klinis

  • Start:
    • Validasi consent: ada clinic.patient.consent bertatus signed dan masih valid untuk jenis prosedur.
    • Validasi baseline: jika prosedur/device memerlukan baseline, pastikan baseline_ok (foto tanpa pairing).
    • Jika gagal → tampilkan wizard Get Consent / Upload Baseline.
  • Done:
    • Wajib mengisi Outcome (notes, komplikasi jika ada).
    • Opsional: minta after photo bila prosedur memerlukannya.
    • Opsi centang to_invoice untuk menandai ke kasir; bisa membuat draft invoice otomatis.

6) Server Methods (contoh ringkas pada treatment.session)

class TreatmentSession(models.Model):
    _name = 'treatment.session'
    _description = 'Treatment Session'

    patient_id  = fields.Many2one('clinic.patient', required=True, ondelete='cascade', index=True)
    doctor_id   = fields.Many2one('hr.employee', required=True, index=True)
    date_start  = fields.Datetime(required=True, default=lambda self: fields.Datetime.now())
    date_end    = fields.Datetime()
    state       = fields.Selection([
        ('draft','Draft'), ('in_progress','In Progress'),
        ('done','Done'), ('cancelled','Cancelled')
    ], default='draft', index=True)

    consent_ok  = fields.Boolean(compute='_compute_compliance', store=True)
    baseline_ok = fields.Boolean(compute='_compute_compliance', store=True)
    to_invoice  = fields.Boolean()
    invoice_id  = fields.Many2one('account.move')

    @api.depends('patient_id', 'patient_id.consents_count', 'patient_id.photos_count')
    def _compute_compliance(self):
        for s in self:
            s.consent_ok = s._has_valid_consent()
            s.baseline_ok = s._has_valid_baseline()

    def action_start(self):
        for s in self:
            if not s._has_valid_consent():
                return s._action_wizard_get_consent()
            if s._procedure_requires_baseline() and not s._has_valid_baseline():
                return s._action_wizard_upload_baseline()
            s.write({'state': 'in_progress'})
        return True

    def action_done(self):
        for s in self:
            # Validasi minimal outcome
            if not s.notes_clinical:
                raise ValidationError(_("Isi catatan klinis sebelum menyelesaikan sesi."))
            vals = {'state': 'done', 'date_end': fields.Datetime.now()}
            s.write(vals)
            # Update last_visit_date pada patient
            s.patient_id.sudo().write({'last_visit_date': fields.Date.context_today(self)})
            # (Ops) Auto invoice
            if s.to_invoice and not s.invoice_id:
                s._create_draft_invoice()
        return True

7) Integrasi Billing

  • to_invoice → jika dicentang saat Done, jalankan pembuatan draft invoice (account.move) untuk patient.partner_id.
  • invoice_id ditautkan kembali ke sesi; smart button di sesi/pasien menuju invoice.

8) Keamanan & Hak Akses

  • Tab ini: clinic.group_clinical, clinic.group_manager, clinic.group_admin.
  • FO/Cashier melihat ringkasan read-only (via Treatment History di List atau counter) tanpa form sesi detail.
  • Hanya Manager/Admin yang dapat unlink sesi; Klinisi dapat create/edit selama draft/in_progress.

9) UX & Produktivitas

  • Editable=bottom: tambah sesi baru cepat dari tabel bawah.
  • Badge Compliance: consent_ok/baseline_ok tampil sebagai boolean_button (read-only).
  • Link Cepat: dari baris sesi → Open Patient, Open Photos, Open Invoice (jika ada).
  • Filter Mini: Show only done / last 6 months (preset domain pada context action “open all sessions”).

10) Kinerja

  • Indeks pada patient_id, doctor_id, state, date_start.
  • Gunakan read_group untuk menghitung last_visit_date/jumlah sesi jika perlu di laporan.
  • Hindari memuat foto binary di form mini; gunakan relasi ke Photos dengan thumbnail saat diperlukan.

11) Acceptance (Treatment History)

  1. Daftar sesi tampil dalam tab dengan kolom tanggal, dokter, prosedur, compliance, status.
  2. Tombol Start/Done/Cancel bekerja, menegakkan gate consent/baseline.
  3. Menyelesaikan sesi mengisi date_end, memperbarui last_visit_date pada pasien, dan (opsional) membuat draft invoice.
  4. FO/Cashier tidak bisa mengubah sesi; Klinis/Manager/Admin sesuai hak akses.
— Selanjutnya: Tab: Photos (Gallery).

Leave a Comment

Share this Doc

Tab Treatment History → smart button ke treatment.session

Or copy link

CONTENTS