@@ -151,6 +151,62 @@ protected function addCommonViewFilters(string $viewName, string $modelName): vo
151151 ->addFilterCheckbox ('numdocs ' , 'has-attachments ' , 'numdocs ' , '!= ' , 0 );
152152 }
153153
154+ protected function autocompleteAction (): array
155+ {
156+ // recogemos los datos
157+ $ data = $ this ->requestGet (['field ' , 'fieldcode ' , 'fieldfilter ' , 'fieldtitle ' , 'formname ' , 'source ' , 'strict ' , 'term ' ]);
158+
159+ // si no es una vinculación de documentos de compra o venta, ejecutamos el parent
160+ if ($ data ['field ' ] !== 'linkupcode ' ) {
161+ return parent ::autocompleteAction ();
162+ }
163+
164+ if ($ data ['source ' ] == '' ) {
165+ return $ this ->getAutocompleteValues ($ data ['formname ' ], $ data ['field ' ]);
166+ }
167+
168+ $ where = [];
169+ foreach (DataBaseWhere::applyOperation ($ data ['fieldfilter ' ] ?? '' ) as $ field => $ operation ) {
170+ // validar nombre de campo para prevenir SQL injection
171+ if (1 !== preg_match ('/^[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)?$/ ' , $ field )) {
172+ Tools::log ()->warning ('autocomplete: invalid field filter name ' );
173+ return [];
174+ }
175+ $ value = $ this ->request ->queryOrInput ($ field );
176+ $ where [] = new DataBaseWhere ($ field , $ value , '= ' , $ operation );
177+ }
178+
179+ $ results = [];
180+ foreach ($ this ->codeModel ->search ($ data ['source ' ], $ data ['fieldcode ' ], $ data ['fieldtitle ' ], $ data ['term ' ], $ where ) as $ value ) {
181+ $ results [] = ['key ' => Tools::fixHtml ($ value ->code ), 'value ' => Tools::fixHtml ($ value ->description )];
182+ }
183+
184+ // buscamos también por numproveedor o numero2 según el tipo de documento
185+ $ additionalField = str_ends_with ($ data ['source ' ], 'prov ' ) ? 'numproveedor ' : 'numero2 ' ;
186+ foreach ($ this ->codeModel ->search ($ data ['source ' ], $ data ['fieldcode ' ], $ additionalField , $ data ['term ' ], $ where ) as $ value ) {
187+ $ key = Tools::fixHtml ($ value ->code );
188+ // evitamos duplicados
189+ $ found = false ;
190+ foreach ($ results as $ result ) {
191+ if ($ result ['key ' ] === $ key ) {
192+ $ found = true ;
193+ break ;
194+ }
195+ }
196+ if (false === $ found ) {
197+ $ results [] = ['key ' => $ key , 'value ' => Tools::fixHtml ($ value ->description )];
198+ }
199+ }
200+
201+ if (empty ($ results ) && '0 ' == $ data ['strict ' ]) {
202+ $ results [] = ['key ' => $ data ['term ' ], 'value ' => $ data ['term ' ]];
203+ } elseif (empty ($ results )) {
204+ $ results [] = ['key ' => null , 'value ' => Tools::trans ('no-data ' )];
205+ }
206+
207+ return $ results ;
208+ }
209+
154210 protected function createViews ()
155211 {
156212 parent ::createViews ();
@@ -474,7 +530,7 @@ protected function createViewsUsers(string $viewName = 'EditUserProyecto'): void
474530 /**
475531 * @param EditView $view
476532 */
477- protected function disableProjectColumns (&$ view )
533+ protected function disableProjectColumns (&$ view ): void
478534 {
479535 foreach ($ view ->getColumns () as $ group ) {
480536 foreach ($ group ->columns as $ col ) {
@@ -493,6 +549,12 @@ protected function disableProjectColumns(&$view)
493549 protected function execPreviousAction ($ action )
494550 {
495551 switch ($ action ) {
552+ case 'autocomplete ' :
553+ $ this ->setTemplate (false );
554+ $ results = $ this ->autocompleteAction ();
555+ $ this ->response ->json ($ results );
556+ return false ;
557+
496558 case 'import-task ' :
497559 return $ this ->importTaskAction ();
498560
0 commit comments