Skip to content

Commit 0409cd9

Browse files
authored
Merge pull request #82 from abdedarghal111/tarea2099
Tarea2099
2 parents 83bf429 + 995e0a3 commit 0409cd9

7 files changed

Lines changed: 707 additions & 0 deletions

File tree

samples/CalculatorMod.php.sample

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
namespace FacturaScripts\[[NAME_SPACE]]\Mod;
4+
5+
use FacturaScripts\Core\Template\CalculatorModClass;
6+
use FacturaScripts\Core\Model\Base\BusinessDocument;
7+
use FacturaScripts\Core\Model\Base\BusinessDocumentLine;
8+
use FacturaScripts\Core\Model\RegimenIVA;
9+
10+
/**
11+
* Mod para modificar los cálculos de totales y subtotales de los albaranes, facturas, etc.
12+
*
13+
* @see https://facturascripts.com/publicaciones/como-modificar-el-calculator-desde-un-plugin
14+
*/
15+
class [[NAME]] implements CalculatorModClass
16+
{
17+
/** @var string */
18+
private $regimenIVA;
19+
20+
/**
21+
* Podemos utilizar apply para aplicar configuraciones o precargar datos.
22+
*/
23+
public function apply(BusinessDocument &$doc, array &$lines): bool
24+
{
25+
// Obtener y guardar el régimen de IVA una sola vez
26+
// $subject = $doc->getSubject();
27+
// $this->regimenIVA = $subject->regimeniva ?? RegimenIVA::TAX_SYSTEM_GENERAL;
28+
return true;
29+
}
30+
31+
/**
32+
* La función calculate se usa para recalcular el total del documento.
33+
*/
34+
public function calculate(BusinessDocument &$doc, array &$lines): bool
35+
{
36+
// $doc->total = 'aquí tu cálculo';
37+
return true;
38+
}
39+
40+
/**
41+
* Para recalcular las líneas de los documentos se usa calculateLine.
42+
*/
43+
public function calculateLine(BusinessDocument $doc, BusinessDocumentLine &$line): bool
44+
{
45+
// $line->pvptotal = 'aquí tu cálculo';
46+
return true;
47+
}
48+
49+
/**
50+
* Para inicializar los registros se usa clear. Normalmente se inicializan todos los valores a 0,
51+
* aunque si es necesario se puede utilizar otro valor.
52+
*/
53+
public function clear(BusinessDocument &$doc, array &$lines): bool
54+
{
55+
/*
56+
$doc->total = 0.0;
57+
58+
foreach ($lines as $line) {
59+
$line->total = 0.0;
60+
}
61+
*/
62+
63+
return true;
64+
}
65+
66+
/**
67+
* Para modificar los subtotales se utiliza getSubtotals, donde los subtotales se especifican mediante un array.
68+
*/
69+
public function getSubtotals(array &$subtotals, BusinessDocument $doc, array $lines)
70+
{
71+
// $subtotals['neto'] += 10;
72+
// $subtotals['total'] += 10;
73+
return true;
74+
}
75+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?php
2+
3+
namespace FacturaScripts\[[NAME_SPACE]]\Mod;
4+
5+
use FacturaScripts\Core\Contract\PurchasesModInterface;
6+
use FacturaScripts\Core\Model\Base\PurchaseDocument;
7+
8+
/**
9+
* Mod para modificar los formularios de compra (Cabecera y Pie).
10+
*
11+
* @see https://facturascripts.com/publicaciones/formularios-de-edicion-de-facturas-albaranes-etc
12+
*/
13+
class [[NAME]] implements PurchasesModInterface
14+
{
15+
/**
16+
* Aplica los cambios al modelo usando los datos recibidos del formulario.
17+
*/
18+
public function apply(PurchaseDocument &$model, array $formData): void
19+
{
20+
// Ejemplo de cómo recoger y asignar datos al modelo:
21+
// $model->pruebaNewFields = $formData['pruebaNewFields'];
22+
// $model->pruebaNewModalFields = $formData['pruebaNewModalFields'];
23+
}
24+
25+
/**
26+
* Se ejecuta antes de aplicar los datos.
27+
*/
28+
public function applyBefore(PurchaseDocument &$model, array $formData): void
29+
{
30+
}
31+
32+
/**
33+
* Permite cargar archivos javascript o css adicionales si fuera necesario.
34+
*/
35+
public function assets(): void
36+
{
37+
}
38+
39+
/**
40+
* Registra nuevos campos que aparecerán en la pestaña general de la cabecera.
41+
* Retorna un array con los identificadores de los campos.
42+
*/
43+
public function newFields(): array
44+
{
45+
// Ejemplo de registro de campo:
46+
// return ['pruebaNewFields'];
47+
return [];
48+
}
49+
50+
/**
51+
* Registra nuevos campos para el modal de detalles adicionales de la cabecera (botón de los tres puntos).
52+
* Retorna un array con los identificadores de los campos.
53+
*/
54+
public function newModalFields(): array
55+
{
56+
// Ejemplo de registro de campo en modal:
57+
// return ['pruebaNewModalFields'];
58+
return [];
59+
}
60+
61+
/**
62+
* Registra nuevos botones o campos select que se añadirán al bloque principal de la cabecera.
63+
*/
64+
public function newBtnFields(): array
65+
{
66+
// Ejemplo de registro de un botón:
67+
// return ['pruebaNewBtnFields'];
68+
return [];
69+
}
70+
71+
/**
72+
* Devuelve el HTML correspondiente a cada uno de los campos registrados.
73+
*/
74+
public function renderField(PurchaseDocument $model, string $field): ?string
75+
{
76+
// Ejemplo de cómo asignar el html de un campo:
77+
/*
78+
if ($field == 'pruebaNewFields') {
79+
return static::pruebaNewFields($model);
80+
}
81+
if ($field == 'pruebaNewModalFields') {
82+
return static::pruebaNewModalFields($model);
83+
}
84+
if ($field == 'pruebaNewBtnFields') {
85+
return static::pruebaNewBtnFields($model);
86+
}
87+
*/
88+
89+
return null;
90+
}
91+
92+
/*
93+
Ejemplos de métodos privados para generar el HTML:
94+
95+
private static function pruebaNewFields(PurchaseDocument $model): string
96+
{
97+
$html = '<div class="col-sm"><div class="form-group">';
98+
$html .= 'pruebaNewFields<input class="form-control border-danger" type="text" name="pruebaNewFields" placeholder="opcional" value="">';
99+
$html .= '</div></div>';
100+
101+
return $html;
102+
}
103+
104+
private static function pruebaNewModalFields(PurchaseDocument $model): string
105+
{
106+
$html = '<div class="col-sm"><div class="form-group">';
107+
$html .= 'pruebaNewModalFields<input class="form-control border-danger" type="text" name="pruebaNewModalFields" placeholder="opcional" value="">';
108+
$html .= '</div></div>';
109+
110+
return $html;
111+
}
112+
113+
private static function pruebaNewBtnFields(PurchaseDocument $model): string
114+
{
115+
$html = '<div class="col-sm-auto"><div class="form-group">';
116+
$html .= '<button type="button" class="btn btn-danger">pruebaNewBtnFields</button>';
117+
$html .= '</div></div>';
118+
119+
return $html;
120+
}
121+
*/
122+
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<?php
2+
3+
namespace FacturaScripts\Plugins\TestPlugin\Mod;
4+
5+
use FacturaScripts\Core\Contract\PurchasesLineModInterface;
6+
use FacturaScripts\Core\Model\Base\PurchaseDocument;
7+
use FacturaScripts\Core\Model\Base\BusinessDocumentLine;
8+
9+
/**
10+
* Mod para modificar las líneas de los formularios de compras.
11+
*
12+
* @see https://facturascripts.com/publicaciones/formularios-de-edicion-de-facturas-albaranes-etc
13+
*/
14+
class [[NAME]] implements PurchasesLineModInterface
15+
{
16+
/**
17+
* Aplica los cambios a nivel general después de guardar los datos de la línea.
18+
*/
19+
public function apply(PurchaseDocument &$model, array &$lines, array $formData): void
20+
{
21+
}
22+
23+
/**
24+
* Obtiene los datos de los nuevos campos del formulario y los asigna al modelo de la línea,
25+
* para poder guardarlos en la base de datos.
26+
*/
27+
public function applyToLine(array $formData, BusinessDocumentLine &$line, string $id): void
28+
{
29+
// Ejemplo:
30+
// $line->pruebaNewFields = $formData['pruebaNewFields_' . $id];
31+
// $line->pruebaNewModalFields = $formData['pruebaNewModalFields_' . $id];
32+
}
33+
34+
/**
35+
* Permite cargar archivos javascript o css adicionales si fuera necesario.
36+
*/
37+
public function assets(): void
38+
{
39+
}
40+
41+
/**
42+
* Retorna una línea rápida vacía si necesitas procesar algo en concreto al añadir nuevas líneas de forma masiva.
43+
*/
44+
public function getFastLine(PurchaseDocument $model, array $formData): ?BusinessDocumentLine
45+
{
46+
return null;
47+
}
48+
49+
/**
50+
* Actualiza los datos de una columna sin perder el foco del cursor en el modo edición de línea.
51+
*/
52+
public function map(array $lines, PurchaseDocument $model): array
53+
{
54+
/* Ejemplo de actualizar un dato al editar otro:
55+
$map = [];
56+
$num = 0;
57+
foreach ($lines as $line) {
58+
$num++;
59+
$idlinea = $line->idlinea ?? 'n' . $num;
60+
$map['pruebaNewFields_' . $idlinea] = 'aquí hacemos nuestro cálculo';
61+
}
62+
return $map;
63+
*/
64+
return [];
65+
}
66+
67+
/**
68+
* Registra las nuevas columnas a añadir directamente en la línea de compra.
69+
*/
70+
public function newFields(): array
71+
{
72+
// return ['pruebaNewFields'];
73+
return [];
74+
}
75+
76+
/**
77+
* Registra nuevos campos que aparecerán dentro del botón "..." de cada línea.
78+
*/
79+
public function newModalFields(): array
80+
{
81+
// return ['pruebaNewModalFields'];
82+
return [];
83+
}
84+
85+
/**
86+
* Devuelve el HTML correspondiente al campo de la línea que se debe renderizar.
87+
*/
88+
public function renderField(string $idlinea, BusinessDocumentLine $line, PurchaseDocument $model, string $field): ?string
89+
{
90+
/*
91+
if ($field == 'pruebaNewFields') {
92+
return static::pruebaNewFields($model);
93+
}
94+
if ($field == 'pruebaNewModalFields') {
95+
return static::pruebaNewModalFields($model);
96+
}
97+
*/
98+
99+
return null;
100+
}
101+
102+
/**
103+
* Devuelve el título HTML correspondiente a la cabecera de la columna añadida en newFields().
104+
*/
105+
public function renderTitle(PurchaseDocument $model, string $field): ?string
106+
{
107+
/*
108+
if ($field == 'pruebaNewFields') {
109+
return static::pruebaNewFieldsTitle();
110+
}
111+
*/
112+
113+
return null;
114+
}
115+
116+
public function newTitles(): array
117+
{
118+
return [];
119+
}
120+
121+
/*
122+
Ejemplos de cómo generar el HTML de la línea:
123+
124+
private static function pruebaNewFields(string $idlinea, BusinessDocumentLine $line, PurchaseDocument $model): string
125+
{
126+
// Nota: order-1 a order-12 define la posición de la columna.
127+
$html = '<div class="col-sm col-lg-1 order-2">';
128+
$html .= '<div class="d-lg-none mt-3 small">Prueba</div>';
129+
$html .= '<input class="form-control" type="text" name="pruebaNewFields_' . $idlinea . '" value="' . $line->pruebaNewFields . '">';
130+
$html .= '</div>';
131+
return $html;
132+
}
133+
134+
private function pruebaNewFieldsTitle(): string
135+
{
136+
return '<div class="col-lg-1 order-2">Prueba</div>';
137+
}
138+
139+
private static function pruebaNewModalFields(string $idlinea, BusinessDocumentLine $line, PurchaseDocument $model): string
140+
{
141+
$html = '<div class="col-6"><div class="mb-2">';
142+
$html .= 'pruebaNewModalFields<input class="form-control border-danger" type="text" name="pruebaNewModalFields_' . $idlinea . '" value="' . $line->pruebaNewModalFields . '">';
143+
$html .= '</div></div>';
144+
return $html;
145+
}
146+
*/
147+
}

0 commit comments

Comments
 (0)