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();
+ }
+}