diff --git a/Core/Model/Base/TransformerDocument.php b/Core/Model/Base/TransformerDocument.php index 12e0694634..14790181ab 100644 --- a/Core/Model/Base/TransformerDocument.php +++ b/Core/Model/Base/TransformerDocument.php @@ -58,12 +58,19 @@ abstract class TransformerDocument extends BusinessDocument */ public $idestado; + /** + * Document previous status, from the EstadoDocumento model. + * + * @var int + */ + public $idestadoanterior; + /** * Campos que se pueden modificar aunque el documento no sea editable. * * @var array */ - private static $unlocked_fields = ['femail', 'idestado', 'numdocs', 'pagada']; + private static $unlocked_fields = ['femail', 'idestado', 'idestadoanterior', 'numdocs', 'pagada']; /** * Adds a field to the list of unlocked fields (editable even when document is not editable). @@ -176,6 +183,14 @@ public function delete(): bool // change parent doc status foreach ($parents as $parent) { + // si tiene idestadoanterior lo asignamos + if(false === empty($parent->idestadoanterior)){ + $parent->idestado = $parent->idestadoanterior; + $parent->save(); + continue; + } + + // si no tiene idestadoanterior asignamos el default como se hacia antes foreach ($parent->getAvailableStatus() as $status) { if ($status->predeterminado) { $parent->idestado = $status->idestado; @@ -339,6 +354,9 @@ protected function onChange(string $field): bool return parent::onChange($field); } + // guardamos el estado anterior para poder revertirlo + $this->idestadoanterior = $this->getOriginal('idestado'); + $status = $this->getStatus(); if (empty($status->generadoc) || false === self::$document_generation) { // update lines to update stock diff --git a/Core/Table/albaranescli.xml b/Core/Table/albaranescli.xml index 4c4e7d1244..2325c27588 100644 --- a/Core/Table/albaranescli.xml +++ b/Core/Table/albaranescli.xml @@ -122,6 +122,10 @@ idestado integer + + idestadoanterior + integer + irpf double precision @@ -250,6 +254,10 @@ ca_albaranescli_idestados FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_albaranescli_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_albaranescli_nick FOREIGN KEY (nick) REFERENCES users (nick) ON DELETE SET NULL ON UPDATE CASCADE diff --git a/Core/Table/albaranesprov.xml b/Core/Table/albaranesprov.xml index bfd06f9552..2eb63cee83 100644 --- a/Core/Table/albaranesprov.xml +++ b/Core/Table/albaranesprov.xml @@ -82,6 +82,10 @@ idestado integer + + idestadoanterior + integer + irpf double precision @@ -191,6 +195,10 @@ ca_albaranesprov_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_albaranesprov_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_albaranesprov_nick FOREIGN KEY (nick) REFERENCES users (nick) ON DELETE SET NULL ON UPDATE CASCADE diff --git a/Core/Table/facturascli.xml b/Core/Table/facturascli.xml index b6625644b2..5a32c5a8cb 100644 --- a/Core/Table/facturascli.xml +++ b/Core/Table/facturascli.xml @@ -129,6 +129,10 @@ idestado integer + + idestadoanterior + integer + idfactura serial @@ -281,6 +285,10 @@ ca_facturascli_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_facturascli_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_facturascli_idfacturarect FOREIGN KEY (idfacturarect) REFERENCES facturascli (idfactura) ON DELETE RESTRICT ON UPDATE CASCADE diff --git a/Core/Table/facturasprov.xml b/Core/Table/facturasprov.xml index f9b827f38f..deba03870a 100644 --- a/Core/Table/facturasprov.xml +++ b/Core/Table/facturasprov.xml @@ -89,6 +89,10 @@ idestado integer + + idestadoanterior + integer + idfactura serial @@ -221,6 +225,10 @@ ca_facturasprov_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_facturasprov_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_facturasprov_idfacturarect FOREIGN KEY (idfacturarect) REFERENCES facturasprov (idfactura) ON DELETE RESTRICT ON UPDATE CASCADE diff --git a/Core/Table/pedidoscli.xml b/Core/Table/pedidoscli.xml index 75b3591961..8466055732 100644 --- a/Core/Table/pedidoscli.xml +++ b/Core/Table/pedidoscli.xml @@ -121,6 +121,10 @@ idestado integer + + idestadoanterior + integer + idpedido serial @@ -254,6 +258,10 @@ ca_pedidoscli_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_pedidoscli_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_pedidoscli_nick FOREIGN KEY (nick) REFERENCES users (nick) ON DELETE SET NULL ON UPDATE CASCADE diff --git a/Core/Table/pedidosprov.xml b/Core/Table/pedidosprov.xml index 206f20e598..9edb252a04 100644 --- a/Core/Table/pedidosprov.xml +++ b/Core/Table/pedidosprov.xml @@ -77,6 +77,10 @@ idestado integer + + idestadoanterior + integer + idpedido serial @@ -190,6 +194,10 @@ ca_pedidosprov_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_pedidosprov_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_pedidosprov_nick FOREIGN KEY (nick) REFERENCES users (nick) ON DELETE SET NULL ON UPDATE CASCADE diff --git a/Core/Table/presupuestoscli.xml b/Core/Table/presupuestoscli.xml index 833956a10c..51dbe74bd4 100644 --- a/Core/Table/presupuestoscli.xml +++ b/Core/Table/presupuestoscli.xml @@ -120,6 +120,10 @@ idestado integer + + idestadoanterior + integer + idpresupuesto serial @@ -253,6 +257,10 @@ ca_presupuestoscli_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_presupuestoscli_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_presupuestoscli_nick FOREIGN KEY (nick) REFERENCES users (nick) ON DELETE SET NULL ON UPDATE CASCADE diff --git a/Core/Table/presupuestosprov.xml b/Core/Table/presupuestosprov.xml index aef62be357..50713cf42d 100644 --- a/Core/Table/presupuestosprov.xml +++ b/Core/Table/presupuestosprov.xml @@ -77,6 +77,10 @@ idestado integer + + idestadoanterior + integer + idpresupuesto serial @@ -178,6 +182,10 @@ ca_presupuestosprov_idestado FOREIGN KEY (idestado) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + + ca_presupuestosprov_idestadoanterior + FOREIGN KEY (idestadoanterior) REFERENCES estados_documentos (idestado) ON DELETE RESTRICT ON UPDATE CASCADE + ca_presupuestosprov_codproveedor FOREIGN KEY (codproveedor) REFERENCES proveedores (codproveedor) ON DELETE RESTRICT ON UPDATE CASCADE diff --git a/Test/Core/Model/Base/TransformerDocumentTest.php b/Test/Core/Model/Base/TransformerDocumentTest.php new file mode 100644 index 0000000000..2b8edfc067 --- /dev/null +++ b/Test/Core/Model/Base/TransformerDocumentTest.php @@ -0,0 +1,102 @@ +getRandomCustomerOrder(); + + // nos guardamos el estado original del pedido + $idEstadoOriginal = $doc->idestado; + + // transformamos en albaran + $estadoGenerarAlbaran = $this->getEstadoGenerarAlbaran(); + $doc->idestado = $estadoGenerarAlbaran->idestado; + $this->assertTrue($doc->save()); + + // eliminamos albaran + foreach ($doc->childrenDocuments() as $children_document) { + $this->assertTrue($children_document->delete()); + } + + // recargamos el pedido + $doc->reload(); + + // comprobamos que el estado del pedido es el de origen y no el predeterminado + $this->assertEquals($idEstadoOriginal, $doc->idestado); + } + + protected function tearDown(): void + { + $this->logErrors(); + } + + private function getRandomCustomerOrder(): PedidoCliente + { + // creamos un estado NO PREDETERMINADO + $estadoAceptado = $this->getEstadoAceptado(); + + $subject = $this->getRandomCustomer(); + $this->assertTrue($subject->save()); + + $doc = new PedidoCliente(); + $doc->setSubject($subject); + $doc->idestado = $estadoAceptado->idestado; + $this->assertTrue($doc->save()); + + $line = $doc->getNewLine(); + $line->cantidad = 1; + $line->pvpunitario = 100; + $this->assertTrue($line->save()); + + $lines = $doc->getLines(); + Calculator::calculate($doc, $lines, true); + + return $doc; + } + + private function getEstadoAceptado(): EstadoDocumento + { + $estadoAceptado = new EstadoDocumento(); + $estadoAceptado->nombre = 'Aceptado'; + $estadoAceptado->tipodoc = 'PedidoCliente'; + $estadoAceptado->generadoc = ''; + $this->assertTrue($estadoAceptado->save()); + + return $estadoAceptado; + } + + private function getEstadoGenerarAlbaran(): EstadoDocumento + { + foreach (EstadoDocumento::all() as $estado_documento) { + if ($estado_documento->tipodoc === 'PedidoCliente' && $estado_documento->generadoc === 'AlbaranCliente') { + return $estado_documento; + } + } + + return new EstadoDocumento(); + } +}