Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. Accounting
  3. PLE Cash & Bank Book v 19.0
  4. Sales Conditions FAQ

PLE Cash & Bank Book

by Ganemo https://www.ganemo.co
Odoo

$ 788.54

In-App Purchases
v 19.0 Third Party
This module requires Odoo Enterprise Edition.
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Invoicing (account)
• Discuss (mail)
• Contacts (contacts)
Community Apps Dependencies Show
• Electronic Purchase Record
• Place invoice data in reconciliations
• Base Spot
• Catálogos SUNAT
• Electronic Sales Record (PLE)
• View Multicompany Country Filter
• Peruvian Localization Menu
• Document Type Validation
• DUA in Invoice
• Origen de Documentos Rectificados
Lines of code 6238
Technical Name ple_cash_book
LicenseOPL-1
Websitehttps://www.ganemo.co
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Invoicing (account)
• Discuss (mail)
• Contacts (contacts)
Community Apps Dependencies Show
• Electronic Purchase Record
• Place invoice data in reconciliations
• Base Spot
• Catálogos SUNAT
• Electronic Sales Record (PLE)
• View Multicompany Country Filter
• Peruvian Localization Menu
• Document Type Validation
• DUA in Invoice
• Origen de Documentos Rectificados
Lines of code 6238
Technical Name ple_cash_book
LicenseOPL-1
Websitehttps://www.ganemo.co
  • Description
  • License

Technical Specification for AI & LLM

This Odoo module 'ple_cash_book' generates the PLE Cash & Bank Book reports required by SUNAT (Peru). It produces TXT 1.1 (Cash) and TXT 1.2 (Bank) files from journal entries, using parameterized SQL queries for security. Extends account.account with bank_id and account.payment with means_payment_id fields. Multi-company support via company_root_id JSONB filtering on account codes. Compatible with Odoo 19 Enterprise (Odoo.SH, Ganemo Online). Multi-language support for English and Spanish included.

Enterprise (Odoo.SH, Ganemo Online or Ganemo.SH)
English & Spanish Included

PLE Cash & Bank

SUNAT Electronic Book Compliance

Generate the official Cash & Bank Register (Libro Caja y Bancos) in TXT format, ready to present to SUNAT via the PLE electronic book program. Mandatory for companies with complete accounting in Peru.

What We're Solving

----------------

TXT 1.1 — Cash Report

Automatically generates the Cash Register report in SUNAT's required TXT format. Extracts journal entries from cash-type accounts, including account codes, document types, correlatives, dates, descriptions, debit/credit amounts, and operation codes — all structured per SUNAT specifications.

TXT 1.2 — Bank Report

Generates the Bank Account Register report with bank-specific fields like SUNAT bank codes, account numbers, payment methods, operation descriptions, and reconciliation data. Pulls bank identification from Peru's official bank catalog via l10n_pe.

Secure SQL Queries

All database queries use parameterized SQL to prevent SQL injection vulnerabilities. Date ranges and company IDs are passed as parameters, not interpolated strings — ensuring data integrity and security.

Multi-Company Ready

Supports multi-company environments natively. Reports filter data by the active company using Odoo's company_root_id JSONB field on account codes, ensuring each company generates its own isolated PLE reports.

Setup & User Manual

Step-by-Step implementation

1. Prerequisites & Initial Configuration

Complete all steps below before generating your first PLE report. Each step is critical — missing any will result in empty or incomplete reports.

Step 1.1 — Install Dependencies

This module requires the following modules to be installed before installation:

  • ple_purchase_book — Provides the base PLE report framework (ple.report.base) and shared SQL functions.
  • invoice_type_document — Provides document type integration for serie/correlative fields on journal entries.
  • l10n_pe (Peruvian Localization) — Must already be active with the Peruvian chart of accounts loaded. It provides the bank catalog with SUNAT codes (l10n_pe_edi_code).
Path: Apps → Search "ple_cash_book" → Install. Dependencies install automatically if available.
Step 1.2 — Configure Company Settings

The PLE reports need your company's contributor type defined. This determines how correlative numbers appear in the TXT file.

  1. Go to Settings → Companies → Your Company.
  2. Find the field "PLE Contributor Type" (ple_type_contributor).
  3. Set it to one of the following:
    • CUO — Standard companies: Uses unique operation codes from journal entries (ple_correlative).
    • RER — Simplified regime: Fills correlative as M-RER for all entries.
  4. Ensure the company has a valid RUC (Peruvian tax ID) set in the VAT field.
Critical: If ple_type_contributor is not set, the correlative column in the TXT will be empty, which causes SUNAT PLE validation errors.
Step 1.3 — Tag Accounts in Chart of Accounts

This is the most important step. The module selects journal entries based on the ple_selection field on each account. If no accounts are tagged, the report will be empty.

  1. Go to Accounting → Configuration → Chart of Accounts.
  2. For each cash account (e.g., 1011 — Caja, 1012 — Fondo Fijo):
    • Set "PLE Selection" to "1.1 Cash & Bank Book: Cash".
  3. For each bank account (e.g., 1041 — Cuentas Corrientes):
    • Set "PLE Selection" to "1.2 Cash & Bank Book: Bank Accounts".
Tip: You can filter by "Type = Bank and Cash" in the Chart of Accounts to quickly find all relevant accounts.
Step 1.4 — Link Bank Accounts (For TXT 1.2 Only)

For the Bank Report (TXT 1.2) to include bank codes and account numbers, you must configure the relationship chain:

Account (account.account) → Bank Account (res.partner.bank) → Bank (res.bank + l10n_pe_edi_code)
  1. In the Chart of Accounts, open each bank-tagged account.
  2. Set the "Bank Account" (bank_id) field to the corresponding res.partner.bank record (your company's bank account number).
  3. That bank account must be linked to a Bank (res.bank) that has a valid SUNAT code (l10n_pe_edi_code).
Note: SUNAT bank codes are automatically loaded by the l10n_pe module. Go to Contacts → Configuration → Banks to verify they have codes assigned (e.g., "02" for BCP, "03" for Interbank).
Step 1.5 — Configure Payment Methods (Medio de Pago)

When registering payments against bank journals, the "Payment Method (Medio de Pago)" field becomes visible. This maps to SUNAT's payment method catalog.

  1. This field (means_payment_id) defaults to code "003" (Transferencia de fondos) automatically.
  2. When registering a payment, if the journal type is Bank, the field becomes visible. Change it if needed (e.g., "001" for Cash, "007" for Check).
  3. If the journal type is Cash, the field is hidden since cash payments don't require a SUNAT payment method.
Visibility Rule: The field appears only when the payment journal's type is "bank". This is controlled by the inv computed field on the payment register wizard.

Report Conditions Checklist

A journal entry (account.move.line) will appear in the report only if ALL of the following conditions are met:

# Condition Where to Configure Applies To
1 Account has ple_selection = 'cash' or 'bank' Chart of Accounts → PLE Selection field Both
2 Journal entry is in Posted state Validate/Post the journal entries Both
3 Entry date is within the report's date range Report form: Period (Start → End) Both
4 Entry belongs to the same company as the report Automatic (multi-company rule) Both
5 Account is assigned to the report's company Chart of Accounts → Allowed Companies Both
6 Account has bank_id linked (for bank code/account number) Chart of Accounts → Bank Account field Bank only
7 Payment has means_payment_id (for payment method column) Payment registration → Payment Method field Bank only
Common pitfall: If your report generates empty files, check conditions 1-3 first. The most frequent cause is that no accounts have been tagged with the ple_selection field.

Smart Defaults & Auto-Fill

When you create a new report, the following fields are pre-filled to save time:

Period Dates

Start Date → 1st day of the previous month.
End Date → Last day of the previous month.
Example: If today is Feb 14, defaults to Jan 1 → Jan 31.

Auto-Adjust End Date

When you change the Start Date, the End Date automatically updates to the last day of that month.
Example: Change Start to Mar 15 → End becomes Mar 31.

Submission State

Estado de Envío defaults to "Empresa o Entidad Operativa" — the standard value for active companies.
Change only if your company has a special SUNAT status.

2. Generating PLE Reports — Step by Step

Complete workflow from creation to SUNAT submission:

Step 2.1 — Create Report

Navigate to Accounting → PLE → Cash & Bank Book. Click New. The Period fields auto-fill to the previous month. Verify Company is correct — it filters to your active company. Adjust dates if you need a different period.

Step 2.2 — Generate Data

Click Generate Report. The system executes SQL queries that scan all posted journal entries in Cash/Bank accounts within your date range. Both TXT and Excel files are generated simultaneously for Cash (1.1) and Bank (1.2) sections.

Step 2.3 — Download & Review

Download the Excel files for internal review — they contain the same data in a human-readable format. Download the TXT files for SUNAT upload. Each section (Cash / Bank Accounts) has its own pair of files. If a section has no records, a message will indicate it.

Step 2.4 — Declare & Close

After uploading the TXT files to SUNAT's PLE program and confirming acceptance: click Declare to SUNAT to mark the report as Declared. If you need to make corrections, click Return to Draft to rollback, modify entries, and regenerate.

Report Lifecycle (States)
Draft → Generate Report → Generated → Declare to SUNAT → Declared ← Return to Draft ←

3. TXT 1.1 — Cash Book — Field Mapping (19 Columns)

Complete column reference for Libro Caja y Bancos — Detalle de los Movimientos del Efectivo. Each row maps a TXT column to its SQL data source and explains the population logic.

# SUNAT Field Name TXT Key Data Source Population Logic & Conditionals Fallback
1 Periodo period account_move_line.date Formatted as YYYYMM00 using TO_CHAR(date, 'YYYYMM00'). The last two digits are always 00 per SUNAT spec. Empty string
2 CUO (Código Único de Operación) cuo account_move.name The journal entry name with all /, -, and spaces removed. Example: INV/2026/00001 → INV202600001. —
3 Número Correlativo del Asiento correlative res_company.ple_type_contributor + account_move_line.ple_correlative Conditional logic:
• If ple_type_contributor = 'CUO' → Uses ple_correlative from the first move line of the journal entry.
• If ple_type_contributor = 'RER' → Fixed string M-RER.
• Otherwise → Empty string.
M000000001
4 Código Cuenta Contable account_code account_account.code_store Account code from the JSONB field code_store, keyed by active company root ID. All /, -, and . characters are stripped. Example: 10.11 → 1011. Empty string
5 Código Unidad de Operación unit_operation_code SQL function get_unit_operation_code(move_id) Custom SQL function that resolves the operation unit code for the journal entry. Returns the code associated with the analytic distribution of the move. Empty string
6 Código Centro de Costos cost_center_code Hardcoded '' Always empty. Cost center codes are not currently populated in this module. Reserved for future implementation. Empty string
7 Tipo de Moneda de Origen currency_name res_currency.name ISO 4217 currency code from the move line's currency. Joined via account_move_line.currency_id. PEN
8 Tipo de Comprobante de Pago type_payment_document l10n_latam_document_type.code SUNAT document type code from the move line's l10n_latam_document_type_id. Example: 01 = Factura, 03 = Boleta. 00
9 Número Serie del Comprobante serie account_move_line.serie_correlative Conditional logic:
• If serie_correlative is NOT NULL → Splits by -, takes the first part, strips spaces, truncated to 4 characters.
• Otherwise → 0000.
0000
10 Número del Comprobante de Pago document_number account_move_line.serie_correlative Conditional logic:
• If serie_correlative is NOT NULL → Splits by -, takes the second part, strips spaces, truncated to 8 characters.
• Otherwise → 00000000.
00000000
11 Fecha Contable accounting_date account_move.date Formatted as DD/MM/YYYY. The accounting date of the parent journal entry. Empty string
12 Fecha de Vencimiento date_due account_move.invoice_date_due Formatted as DD/MM/YYYY. The due date from the journal entry. May be empty for non-invoice entries. Empty string
13 Fecha de la Operación o Emisión operation_date account_move.date Formatted as DD/MM/YYYY. Same as accounting date (column 11). Represents the effective operation date. Empty string
14 Glosa de la Operación gloss account_move.ref or account_move_line.name Conditional logic:
• If account_move.ref is NOT NULL → Uses the move's ref (reference) field.
• Otherwise → Uses the first 200 characters of the move line's name (label).
—
15 Glosa Referencial referential_gloss account_move_line.name The move line's label/description. Used as a secondary reference text. Empty string
16 Debe (Debit) debit account_move_line.debit Formatted via UDF_numeric_char() SQL function which converts the numeric value to a string with 2 decimal places. Example: 1500.5 → 1500.50. 0.00
17 Haber (Credit) credit account_move_line.credit Same formatting as Debit (column 16) via UDF_numeric_char(). 0.00
18 Dato Estructurado data_structured SQL function data_structured_cash() + Python post-processing Complex conditional logic (Python post-processing):
The SQL function data_structured_cash(serie_correlative) returns a pipe-delimited string split by **-**.
Python parses this and applies rules:
• If journal type = sale AND document type = F → Code 140100
• If journal type = purchase AND document type = F:
  - Sub-type F → Code 080100
  - Other sub-types → Code 080200
Final format: {code}&{field5}&{sanitized_name}&{correlative}
• If no structured data available → Empty string.
Empty string
19 Estado de la Operación state Hardcoded 1 Always 1 (active/valid operation). Set during Python post-processing, not from SQL. Per SUNAT spec: 1 = Active, 8 = Modified, 9 = Deleted. 1
TXT Separator: All columns are separated by the pipe character |. Each row ends with | followed by \r\n (CRLF). The complete template is: period|cuo|correlative|account_code|unit_operation_code|cost_center_code|currency_name|type_payment_document|serie|document_number|accounting_date|date_due|operation_date|gloss|referential_gloss|debit|credit|data_structured|state|

4. TXT 1.2 — Bank Accounts — Field Mapping (15 Columns)

Complete column reference for Libro Caja y Bancos — Detalle de los Movimientos de la Cuenta Corriente. This report contains bank-specific fields not present in TXT 1.1.

# SUNAT Field Name TXT Key Data Source Population Logic & Conditionals Fallback
1 Periodo period account_move_line.date Formatted as YYYYMM00. Same logic as TXT 1.1 column 1. Empty string
2 CUO (Código Único de Operación) cuo account_move.name Same logic as TXT 1.1 column 2. Journal entry name with /, -, spaces removed. —
3 Número Correlativo del Asiento correlative res_company.ple_type_contributor Same conditional logic as TXT 1.1 column 3: CUO → ple_correlative, RER → M-RER. M000000001
4 Código de la Entidad Financiera bank_code res_bank.l10n_pe_edi_code Join chain: account_account.bank_id → res_partner_bank.bank_id → res_bank.l10n_pe_edi_code.
SUNAT bank catalog code. Example: 02 = BCP, 03 = Interbank, 11 = BBVA.
Requires Step 1.4 configuration (bank account linked on the accounting account).
Empty string
5 Código de la Cuenta Bancaria account_bank_code res_partner_bank.acc_number Join chain: account_account.bank_id → res_partner_bank.acc_number.
The company's bank account number. Example: 19123456789012.
Requires Step 1.4 configuration.
Empty string
6 Fecha de la Operación date account_move_line.date Formatted as DD/MM/YYYY. The accounting date of the move line. —
7 Medio de Pago payment_method payment_methods_codes.code Join chain: account_move_line.payment_id → account_payment.means_payment_id → payment_methods_codes.code.
SUNAT payment method code. Example: 001 = Efectivo, 003 = Transferencia, 007 = Cheque.
Only populated when the move line is linked to a payment (payment_id IS NOT NULL).
003
8 Descripción de la Operación Bancaria operation_description account_move_line.name The move line's label/description. Used as the operation narrative for the bank statement. -
9 Tipo de Documento del Girador partner_type_document l10n_latam_identification_type.l10n_pe_vat_code Join chain: account_move_line.partner_id → res_partner.l10n_latam_identification_type_id → l10n_latam_identification_type.l10n_pe_vat_code.
SUNAT identification type code. Example: 6 = RUC, 1 = DNI, 4 = Carnet de Extranjería.
-
10 Número de Documento del Girador partner_document_number res_partner.vat The partner's tax identification number (RUC, DNI, etc.). Comes from the move line's partner_id. -
11 Nombre Completo del Girador partner_name res_partner.name Full name of the partner associated with the move line. For companies: the commercial name. VARIOS
12 Número de Transacción Bancaria transaction_number account_move.ref or account_move.name Conditional logic (SQL + Python):
SQL step:
• If account_move.ref IS NOT NULL → validate_string(ref, 20) (truncated to 20 chars).
• Else if account_move.name IS NOT NULL → validate_string(name, 20).
• Otherwise → Empty string.
Python post-processing: All non-alphanumeric characters, spaces, and line breaks are removed via re.sub(r"[^a-zA-Z0-9]", "", name).
Empty string
13 Debe (Debit) debit account_move_line.debit Formatted via UDF_numeric_char(). Same as TXT 1.1 column 16. 0.00
14 Haber (Credit) credit account_move_line.credit Formatted via UDF_numeric_char(). Same as TXT 1.1 column 17. 0.00
15 Estado de la Operación state Hardcoded 1 Always 1 (active). Set in Python, same as TXT 1.1 column 19. 1
TXT Separator: Same as TXT 1.1 — pipe | delimited with CRLF line endings. Template: period|cuo|correlative|bank_code|account_bank_code|date|payment_method|operation_description|partner_type_document|partner_document_number|partner_name|transaction_number|debit|credit|state|
SQL Helper Functions Used
  • UDF_numeric_char(value) — Converts a numeric to a formatted string with 2 decimal places.
  • get_unit_operation_code(move_id) — Resolves the operation unit code for a journal entry.
  • data_structured_cash(serie_correlative) — Returns structured data string for cross-referencing with other PLE books.
  • validate_string(text, max_length) — Truncates and sanitizes text to a maximum length.

Global Ready | Multi-Language Support

This module is fully translated into English and Spanish (en_US, es_ES, es_PE, es_MX), ensuring a professional experience for international organizations.

English Spanish

Why Choose Ganemo?

----------------

Ganemo is the world's leading Odoo App developer and a multi-award-winning Gold Partner. For over 5 years, we have been recognized as the #1 seller of high-quality apps on the Odoo App Store. Trusted as the "Best Partner" in USA, Mexico, Chile, Spain, Colombia, Ecuador, and Peru, we deliver robust, secure, and localization-compliant solutions for global businesses.

Get a Quote & Resolve Commercial Doubts

Join thousands of satisfied clients on Odoo. Contact our sales team directly.

QR WhatsApp

Official WhatsApp

Fastest response time.

COPY
LINK
https://wa.me/18286726150

+1 (828) 672-6150

QR Sales Email

Sales Email

For commercial inquiries.

COPY
ADDR
leads@ganemo.com

leads@ganemo.com

QR Book Demo

Book a Demo

Let's explore your needs.

COPY
LINK
ganemo.co/appointment/5

Schedule Meeting

Need More? We Do It All

Professional Odoo Services

ERP Implementation

Transform your business with a full Odoo implementation. We analyze, configure, and train your team to maximize productivity. From Accounting to Inventory, we handle the complexity so you can focus on growth.

Module Dev & Migration

Need a custom feature? Or stuck on an older version? We develop high-performance custom modules and migrate your existing code to Odoo 19 with zero data loss. Expert developers at your service.

QA / User Testing Scenarios

Enterprise Validation Plan

Scenario 1: Generate Cash Report (TXT 1.1)

  1. Go to Accounting > PLE > Libro Caja y Bancos.
  2. Create a new record. Set Start Date and End Date for the period.
  3. Click Generar Reporte.
  4. Result: The Cash TXT and Excel files should appear for download. Verify the TXT contains valid SUNAT-formatted data with pipe separators.

Scenario 2: Generate Bank Report (TXT 1.2)

  1. Ensure at least one bank-type account has a Bank entity linked with a valid SUNAT code.
  2. Create journal entries in that bank account for the target period.
  3. Generate the report as in Scenario 1.
  4. Result: The Bank TXT file should include the bank code, account number, and payment method columns. Verify against SUNAT's format specification.

Scenario 3: Report Lifecycle (States)

  1. Create and generate a report → State should be load.
  2. Click Declarar a SUNAT → State should be closed.
  3. Click Regresar a Borrador → State should return to draft.
  4. Result: Buttons visibility should change correctly at each state.

Scenario 4: Payment Method on Register

  1. Go to an invoice and click Register Payment.
  2. Select a Bank journal → The Payment Method (Medio de Pago) field should appear.
  3. Switch to a Cash journal → The field should be hidden.
  4. Result: The inv computed field correctly toggles visibility based on journal type.

Scenario 5: Empty Report (No Matching Records)

  1. Create a new report for a period where no posted journal entries exist in Cash/Bank accounts.
  2. Click Generate Report.
  3. Result: The report should generate successfully but show an informational message: "No hay contenido en el registro...". TXT files should contain the header without data rows. The Excel files should reflect zero rows.

Scenario 6: Multi-Company Isolation

  1. Log in to Company A. Create and generate a PLE Cash report.
  2. Switch to Company B. Navigate to Cash & Bank Book.
  3. Result: You should only see reports belonging to Company B. Company A's reports must not be visible. Each report's TXT file should contain only data from the respective company.

Scenario 7: Default Date Period Verification

  1. Navigate to Cash & Bank Book and click New.
  2. Result: The Start Date should default to the 1st day of the previous month and the End Date to the last day of the previous month. Example: If today is Feb 14, defaults should be Jan 1 → Jan 31.
  3. Verify the Estado de Envío defaults to "Empresa o Entidad Operativa".

Scenario 8: Date Constraint Validation

  1. Create a new report. Set Start Date = Feb 28 and End Date = Feb 01 (end before start).
  2. Attempt to save the record.
  3. Result: The system should block the save with a validation error: "The end date must be equal to or after the start date.". The report must not be created.

Scenario 9: Search View — Filters & Grouping

  1. Go to the Cash & Bank Book list view.
  2. Test each quick filter: Draft, Generated, Declared. Verify only matching records appear.
  3. Test Group By → Company, State, Period (Month). Verify records group correctly.
  4. Use the search bar to search by Company name and Start Date.
  5. Result: All filters, groupings, and searches should work independently and in combination.

Scenario 10: Payment Method on Direct Payment

  1. Go to Accounting → Payments and create a new payment directly (not from an invoice).
  2. Select a Bank journal.
  3. Result: The means_payment_id field should default to code "003" (Transferencia de fondos). The field should be editable.
  4. Switch to a Cash journal → The field value persists but is less relevant for cash operations.

Scenario 11: Bank Account Configuration Cascade

  1. Go to Chart of Accounts. Select a bank-tagged account (ple_selection = bank).
  2. Set the Bank Account field to a valid res.partner.bank record.
  3. Generate a PLE Cash & Bank report for a period with entries in that account.
  4. Result: The Bank TXT file should show the SUNAT bank code (l10n_pe_edi_code) and account number (acc_number) in the corresponding columns.
  5. Remove the Bank Account link and regenerate. The bank code and account columns should now be empty.

Scenario 12: Report Re-generation (Overwrite)

  1. Generate a report for January 2026. Note the TXT file names and contents.
  2. Post a new journal entry in a Cash account dated January 2026.
  3. Click Return to Draft on the existing report, then Generate Report again.
  4. Result: The regenerated files should now include the new entry. Previous file data is fully overwritten — no duplicate accumulation.

FAQ & Troubleshooting

Common Resolutions

Bank code is empty in the TXT file?

Reason: The bank entity linked to the account may not have a SUNAT code assigned.

Fix: Go to Contacts > Configuration > Banks and ensure the bank has a valid l10n_pe_edi_code. The Peruvian localization module should have populated this automatically.

Report generates empty files?

Reason: No journal entries exist for the selected date range in cash or bank accounts.

Fix: Verify that posted journal entries exist in Cash/Bank accounts within the date range. Also check that the correct company is selected.

SQL error when generating report?

Reason: A stored SQL function may not be loaded.

Fix: Upgrade the module (-u ple_cash_book) to reload the SQL functions from the sql/ directory. The functions data_structured_cash, find_full_reconcile, get_unit_operation_code, and UDF_numeric_char must exist in the database.

Is this compatible with Multi-company?

Answer: Yes!

Detail: Each report filters by the active company using company_root_id. Data from other companies is automatically excluded. Each company generates its own PLE files.

Payment method field not visible during payment?

Answer: The "Medio de Pago" field only appears when the selected journal's type is Bank.

Detail: This behavior is intentional. Cash payments don't require a SUNAT payment method code. If you're using a Bank journal and still don't see it, check that the invoice_type_document module is installed — it provides the view extension.

How do I change the PLE contributor type (CUO/RER)?

Answer: Go to Settings → Companies → Your Company and update the ple_type_contributor field.

Detail: This field controls how the correlative column is filled in TXT files: CUO uses the journal entry's ple_correlative, while RER fills all entries with M-RER. The field is provided by the ple_purchase_book base module.

Can I regenerate a report that was already declared?

Answer: Yes, but you must first return it to Draft.

Detail: Click Return to Draft to unlock the report. Then click Generate Report again. The new data will overwrite the previous files. This is useful if you posted new entries after the initial generation.

The report shows data from other companies?

Answer: This should not happen. A record rule restricts visibility.

Detail: The module includes a ir.rule that filters reports by company_id in company_ids. If you see cross-company data, verify that: (a) the record rule XML is loaded, (b) you are not a superuser (superusers bypass rules), and (c) the module was updated after the security file was added.

What do the TXT filename codes mean?

Answer: The filenames follow SUNAT's naming convention for PLE files.

Structure: LE{RUC}{YYYYMM00}{011100}{OperInd}{Content}{Currency}{1}.TXT
Example: LE20551583041202601000101110011.TXT — This is a Cash report (0101) for RUC 20551583041, period Jan 2026, with content (1) in PEN (1).

Date fields auto-fill with the wrong period?

Answer: The defaults are based on the server's current date, not the user's local timezone.

Detail: If the server is in UTC and your local time is past midnight but UTC isn't, the "previous month" calculation may differ by one day. This is standard Odoo behavior. Simply adjust the dates manually if needed.

Can I use this module in Community edition?

Answer: Yes, this module is fully compatible with Odoo Community.

Detail: The module uses only standard ORM, SQL queries, and base Accounting features. No Enterprise-only dependencies (like consolidation, analytic plans, or inter-company) are required. License: LGPL-3.

What's the difference between Cash and Bank sections?

Answer: They correspond to different SUNAT PLE sub-registers with different columns.

Detail: Cash (TXT 1.1) covers accounts tagged as ple_selection = 'cash' — typically petty cash and cash registers. Bank (TXT 1.2) covers accounts tagged as ple_selection = 'bank' — with additional columns for bank code, account number, and payment method. Both are generated simultaneously from a single report record.

Commercial & Sales

For inquiries about licenses, demos, or partnerships.

QR WhatsApp
Official WhatsApp

Fastest response time.

COPY
LINK
https://wa.me/18286726150

+1 (828) 672-6150

QR Sales Email
Sales Email

For commercial inquiries.

COPY
ADDR
leads@ganemo.com
QR Book Demo
Book a Demo

Let's explore your needs.

COPY
LINK
ganemo.co/appointment/5

Technical Support

Existing customers regarding module functionality.

QR Technical Support
Help Desk

Exclusive channel for technical assistance and bug reports.

COPY
ADDR
ayuda@ganemo.com

© 2026 Ganemo. All rights reserved. visit ganemo.com

Odoo Proprietary License v1.0

This software and associated files (the "Software") may only be used (executed,
modified, executed after modifications) if you have purchased a valid license
from the authors, typically via Odoo Apps, or if you have received a written
agreement from the authors of the Software (see the COPYRIGHT file).

You may develop Odoo modules that use the Software as a library (typically
by depending on it, importing it and using its resources), but without copying
any source code or material from the Software. You may distribute those
modules under the license of your choice, provided that this license is
compatible with the terms of the Odoo Proprietary License (For example:
LGPL, MIT, or proprietary licenses similar to this one).

It is forbidden to publish, distribute, sublicense, or sell copies of the Software
or modified copies of the Software.

The above copyright notice and this permission notice must be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author or have a question related to your purchase, please use the support page.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with