Skip to content

Commit bf6101e

Browse files
author
Daniel Fernández Giménez
committed
Actualizada gestión de patrones de proyecto con reinicio anual configurable
1 parent d0f00f0 commit bf6101e

4 files changed

Lines changed: 79 additions & 52 deletions

File tree

Init.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ private function setupSettings(): void
162162
{
163163
Tools::settings('proyectos', 'patron', 'PR-{ANYO}-{NUM}');
164164
Tools::settings('proyectos', 'longnumero', 6);
165-
Tools::settings('proyectos', 'reiniciarpatronanualmente', 0);
165+
Tools::settings('proyectos', 'reiniciar_patron_anualmente', 0);
166166
Tools::settingsSave();
167167
}
168168

Lib/ProjectCodeGenerator.php

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,35 +31,38 @@
3131
*/
3232
class ProjectCodeGenerator
3333
{
34-
/**
35-
* @param Proyecto $project
36-
*/
37-
public static function new(&$project)
34+
public static function new(Proyecto &$project)
3835
{
3936
$patron = Tools::settings('proyectos', 'patron', 'PR-{ANYO}-{NUM}');
4037
$long_numero = Tools::settings('proyectos', 'longnumero', 6);
41-
$reset = (bool) Tools::settings('proyectos', 'reiniciarpatronanualmente', 0);
38+
$reset = (bool)Tools::settings('proyectos', 'reiniciar_patron_anualmente', 0);
4239

4340
$proyecto = new Proyecto();
4441

42+
$fecha = empty($project->fecha) ? date('Y-m-d') : $project->fecha;
43+
$timestamp = strtotime($fecha);
44+
$year = date('Y', $timestamp);
45+
$year2 = date('y', $timestamp);
46+
$month = date('m', $timestamp);
47+
$day = date('d', $timestamp);
48+
4549
if (!$reset) {
4650
// default behaviour: keep existing global counting
4751
$numero = 1 + $proyecto->count();
4852
} else {
4953
// build prefix replacing date placeholders but leaving numeric placeholders empty
5054
$replacements = [
51-
'{ANYO}' => date('Y'),
52-
'{ANYO2}' => date('y'),
53-
'{MES}' => date('m'),
54-
'{DIA}' => date('d'),
55+
'{ANYO}' => $year,
56+
'{ANYO2}' => $year2,
57+
'{MES}' => $month,
58+
'{DIA}' => $day,
5559
'{NUM}' => '',
5660
'{0NUM}' => ''
5761
];
5862

5963
$prefix = strtr($patron, $replacements);
6064

6165
// find projects that start with the same prefix and belong to the same company, limited to current year
62-
$year = date('Y');
6366
$where = [
6467
new DataBaseWhere('nombre', $prefix . '%', 'LIKE'),
6568
new DataBaseWhere('idempresa', $project->idempresa),
@@ -89,10 +92,10 @@ public static function new(&$project)
8992
}
9093

9194
$project->nombre = strtr($patron, [
92-
'{ANYO}' => date('Y'),
93-
'{ANYO2}' => date('y'),
94-
'{MES}' => date('m'),
95-
'{DIA}' => date('d'),
95+
'{ANYO}' => $year,
96+
'{ANYO2}' => $year2,
97+
'{MES}' => $month,
98+
'{DIA}' => $day,
9699
'{NUM}' => (string)$numero,
97100
'{0NUM}' => str_pad((string)$numero, $long_numero, '0', STR_PAD_LEFT)
98101
]);

Test/main/ProyectoPatternResetTest.php

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,62 +4,86 @@
44

55
use FacturaScripts\Plugins\Proyectos\Model\Proyecto;
66
use FacturaScripts\Core\Tools;
7-
use FacturaScripts\Test\Traits\DefaultSettingsTrait;
87
use FacturaScripts\Test\Traits\LogErrorsTrait;
98
use PHPUnit\Framework\TestCase;
109

1110
final class ProyectoPatternResetTest extends TestCase
1211
{
1312
use LogErrorsTrait;
14-
use DefaultSettingsTrait;
1513

16-
public static function setUpBeforeClass(): void
14+
private $projects = [];
15+
16+
public function testAnnualPatternResetDisabled(): void
1717
{
18-
self::setDefaultSettings();
19-
self::installAccountingPlan();
20-
self::removeTaxRegularization();
18+
Tools::settingsSet('proyectos', 'patron', 'PR-{ANYO}-{NUM}');
19+
Tools::settingsSet('proyectos', 'longnumero', 1);
20+
Tools::settingsSet('proyectos', 'reiniciar_patron_anualmente', 0);
21+
22+
// obtenemos el año anterior
23+
$prevYear = date('Y') - 1;
24+
25+
// obtenemos el año actual
26+
$currentYear = date('Y');
27+
28+
// Crear 3 proyectos en año anterior
29+
for ($i = 1; $i <= 3; $i++) {
30+
$p = new Proyecto();
31+
$p->descripcion = "Proyecto $i año anterior";
32+
$p->fecha = "$prevYear-01-01";
33+
$this->assertTrue($p->save(), "No se pudo guardar el proyecto $i del año anterior");
34+
$this->projects[] = $p;
35+
$this->assertEquals("PR-$prevYear-$i", $p->nombre, "El patrón del proyecto $i del año anterior es incorrecto");
36+
}
37+
38+
// Crear 3 proyectos en año actual
39+
for ($i = 4; $i <= 6; $i++) {
40+
$p = new Proyecto();
41+
$p->descripcion = "Proyecto $i año actual";
42+
$p->fecha = "$currentYear-01-01";
43+
$this->assertTrue($p->save(), "No se pudo guardar el proyecto $i del año actual");
44+
$this->projects[] = $p;
45+
$this->assertEquals("PR-$currentYear-$i", $p->nombre, "El patrón del proyecto $i del año actual es incorrecto");
46+
}
2147
}
2248

23-
public function testAnnualPatternReset(): void
49+
public function testAnnualPatternResetEnabled(): void
2450
{
25-
// activar ajuste
26-
Tools::settings('proyectos', 'reiniciarpatronanualmente', 1);
27-
Tools::settingsSave();
51+
Tools::settingsSet('proyectos', 'patron', 'PR-{ANYO}-{NUM}');
52+
Tools::settingsSet('proyectos', 'longnumero', 1);
53+
Tools::settingsSet('proyectos', 'reiniciar_patron_anualmente', 1);
2854

55+
// obtenemos el año anterior
2956
$prevYear = date('Y') - 1;
30-
$patron = Tools::settings('proyectos', 'patron', 'PR-{ANYO}-{NUM}');
31-
$long = Tools::settings('proyectos', 'longnumero', 6);
32-
33-
// crear proyecto del año anterior
34-
$old = new Proyecto();
35-
$old->nombre = strtr($patron, [
36-
'{ANYO}' => (string)$prevYear,
37-
'{ANYO2}' => substr((string)$prevYear, 2),
38-
'{MES}' => '01',
39-
'{DIA}' => '01',
40-
'{NUM}' => '5',
41-
'{0NUM}' => str_pad('5', $long, '0', STR_PAD_LEFT)
42-
]);
43-
$old->fecha = $prevYear . '-01-01';
44-
$old->descripcion = 'old';
45-
$this->assertTrue($old->save());
4657

47-
// crear proyecto nuevo (debe generarse y empezar en 1)
48-
$new = new Proyecto();
49-
$new->descripcion = 'nuevo';
50-
$this->assertTrue($new->save());
58+
// obtenemos el año actual
59+
$currentYear = date('Y');
5160

52-
$this->assertMatchesRegularExpression('/(\\d+)$/', $new->nombre, 'El nombre generado debe terminar en dígitos');
53-
preg_match('/(\\d+)$/', $new->nombre, $m);
54-
$this->assertEquals(1, intval($m[1]), 'Se esperaba que la numeración empiece en 1 para el ejercicio actual');
61+
// Crear 3 proyectos para el año anterior
62+
for ($i = 1; $i <= 3; $i++) {
63+
$p = new Proyecto();
64+
$p->descripcion = "Proyecto $i año anterior (reset on)";
65+
$p->fecha = "$prevYear-01-01";
66+
$this->assertTrue($p->save(), "No se pudo guardar el proyecto $i del año anterior con reset");
67+
$this->projects[] = $p;
68+
$this->assertEquals("PR-$prevYear-$i", $p->nombre, "El patrón del proyecto $i del año anterior es incorrecto con reset");
69+
}
5570

56-
// limpieza
57-
$this->assertTrue($new->delete());
58-
$this->assertTrue($old->delete());
71+
// Crear 3 proyectos para el año actual
72+
for ($i = 1; $i <= 3; $i++) {
73+
$p = new Proyecto();
74+
$p->descripcion = "Proyecto $i año actual (reset on)";
75+
$p->fecha = "$currentYear-01-01";
76+
$this->assertTrue($p->save(), "No se pudo guardar el proyecto $i del año actual con reset");
77+
$this->projects[] = $p;
78+
$this->assertEquals("PR-$currentYear-$i", $p->nombre, "El patrón del proyecto $i del año actual debe reiniciarse a $i");
79+
}
5980
}
6081

6182
protected function tearDown(): void
6283
{
84+
foreach ($this->projects as $p) {
85+
$p->delete();
86+
}
6387
$this->logErrors();
6488
}
6589
}

XMLView/ConfigProyectos.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<widget type="text" fieldname="patron" required="true"/>
1010
</column>
1111
<column name="reset-pattern" numcolumns="12" order="115" title="reiniciar-patron-anualmente">
12-
<widget type="checkbox" fieldname="reiniciarpatronanualmente"/>
12+
<widget type="checkbox" fieldname="reiniciar_patron_anualmente"/>
1313
</column>
1414
<column name="number-length" numcolumns="3" order="110">
1515
<widget type="number" fieldname="longnumero" decimal="0" min="1" required="true"/>

0 commit comments

Comments
 (0)