Files
opensourcepos/app/Language/es-ES/Taxes.php
T
jekkosandobjecttothis 625bb3536a fix(taxes): reject negative tax rates and percentages (#4730)
* fix(taxes): reject negative tax rates and percentages

Reject negative tax values across all tax entry points so they can
never be persisted and produce inverted sales totals:

- Items::postSave / postBulkUpdate: validate tax_percents.* as
  nonNegativeDecimal (was unvalidated, persisted raw).
- Items::save_tax_data (CSV import): fail the row on a negative
  Tax N Percent instead of silently dropping the tax.
- Taxes::postSave: reject negative tax_rate before saving.
- Config::postSaveTax: reject negative default tax rates.

Adds non-negative regression tests for Items, Taxes and Config, plus
boundary tests proving a zero tax rate/percent is still accepted. New
language strings for the rejection messages.

* test: adopt test{Method}_{Purpose} naming convention for new tests

Align the negative-tax test method names with the convention established
in ConfigTest (testPostSave_RejectsNegativeTaxPercent, etc.), per review.

* fix(config): add language entries to all locales, extract TaxFixtureTrait

* fix(i18n): place tax_rate_non_negative in alphabetical order

Move the new tax_rate_non_negative entry to its correct alphabetical
position (after tax_rate_error_adding_updating) in all locale files.

---------

Co-authored-by: objecttothis <17935339+objecttothis@users.noreply.github.com>
2026-10-09 08:58:00 +02:00

85 lines
6.3 KiB
PHP

<?php
return [
"add_exception" => "Añadir excepción",
"cascade" => "Cascada",
"cascade_sequence" => "Secuencia en cascada",
"city" => "Ciudad",
"code" => "Código",
"confirm_delete" => "¿Está seguro de querer borrar los códigos de impuestos seleccionados? Esta acción no se puede deshacer",
"confirm_restore" => "Esta seguro de querer restaurar la(s) Imp(s) seleccionada(s)?",
"default_tax_category" => "Categoría por defecto",
"default_tax_rate" => "Tasa impositiva por defecto",
"error_adding_updating" => "Error añadiendo o actualizando el impuesto",
"group_seq" => "Seq. de grupo",
"jurisdiction_name" => "Nombre de jurisdicción",
"name" => "Nombre",
"new" => "Impuesto nuevo",
"no_taxes" => "Sin Importe de Impuestos",
"no_taxes_to_display" => "No hay impuestos para mostrar",
"reporting_authority" => "Autoridad Informante",
"round_half_down" => "Mitad abajo",
"round_half_even" => "Mitad par",
"round_half_odd" => "Mitad impar",
"round_half_up" => "Mitad arriba",
"rounding_code" => "Tipo de redondeo",
"sales_tax" => "Impuestos de ventas",
"sales_tax_by_invoice" => "Impuestos de ventas por factura",
"sequence" => "Secuencia",
"state" => "Estado",
"successful_deleted" => "Se ha esborrado correctamente",
"tax_categories" => "Tipos de impuestos",
"tax_categories_configuration" => "Configuración de tipos de impuestos",
"tax_categories_saved_successfully" => "Guardados los cambios en tipos de impuestos",
"tax_categories_saved_unsuccessfully" => "No se han guardado los cambios en los tipos de impuestos",
"tax_category" => "Categoría de impuesto",
"tax_category_code" => "Código de tipo de impuesto",
"tax_category_duplicate" => "Tipo de impuesto duplicado",
"tax_category_invalid_chars" => "Caracteres inválidos en el tipo de impuesto",
"tax_category_name" => "Nombre del tipo de impuesto",
"tax_category_new" => "Nuevo tipo de impuesto",
"tax_category_required" => "Tipo de impuesto es requerido",
"tax_code" => "Código",
"tax_code_cannot_be_deleted" => "Fallo al borrar tipo de impuesto",
"tax_code_duplicate" => "Código de Impuesto Duplicado",
"tax_code_invalid_chars" => "Caracteres Inválidos en el Código de Impuesto",
"tax_code_name" => "Nombre",
"tax_code_required" => "El código de impuesto es un campo obligatorio",
"tax_code_successful_deleted" => "Se ha borrado correctamente el impuesto",
"tax_code_successful_updated" => "Se ha actualizado correctamente",
"tax_code_successful_updating" => "Se ha actualizado correctamente el impuesto",
"tax_code_successfully_added" => "Se ha añadido correctamente",
"tax_code_type" => "Tipo de impuesto",
"tax_codes" => "Códigos de impuestos",
"tax_codes_configuration" => "Configuración de códigos de impuestos",
"tax_codes_saved_successfully" => "Cambios guardados en el código de impuesto",
"tax_codes_saved_unsuccessfully" => "No se guardaron los cambios en el código de impuesto",
"tax_excluded" => "Exento de impuestos",
"tax_group" => "Grupo de impuestos",
"tax_group_not_unique" => "El grupo de impuestos {0} no es único",
"tax_group_sequence" => "Secuencia de grupo de impuestos",
"tax_included" => "Impuestos incluidos",
"tax_jurisdiction" => "Jurisdicción Tributaria",
"tax_jurisdiction_duplicate" => "Jurisdicción Fiscal Duplicada",
"tax_jurisdiction_invalid_chars" => "Caracteres no Válidos en el Nombre de Jurisdicción",
"tax_jurisdiction_required" => "Es requerida una Jurisdicción Tributaria",
"tax_jurisdictions" => "Jurisdicciones Tributarias",
"tax_jurisdictions_configuration" => "Configuración de las Jurisdicciones Tributarias",
"tax_jurisdictions_saved_successfully" => "Cambios en la Jurisdicción Tributaria guardados",
"tax_jurisdictions_saved_unsuccessfully" => "Cambios en la Jurisdicción Tributaria no guardados",
"tax_rate" => "Tasa de Impuesto",
"tax_rate_configuration" => "Configuración de Tasa de Impuesto",
"tax_rate_error_adding_updating" => "Añadir o actualizar Tasa de Impuesto ha fallado",
"tax_rate_non_negative" => "",
"tax_rate_numeric" => "La Tasa de Impuesto debe ser un número",
"tax_rate_required" => "La Tasa de Impuesto es un campo obligatorio",
"tax_rate_successful_updated" => "Has actualizado exitosamente",
"tax_rate_successfully_added" => "Has agregado exitosamente",
"tax_rates" => "Tasas de Impuestos",
"tax_rates_configuration" => "Configuración de las Tasas de Impuestos",
"tax_rounding" => "Redondeo de Impuestos",
"tax_type" => "Tipo de Impuesto",
"update" => "Actualizar Tasa de Impuesto",
"vat_tax" => "IVA",
];