From ca1ed3f870ea97225e2ab404b73baa0e6a34b65b Mon Sep 17 00:00:00 2001 From: Juan Pablo Vial Date: Tue, 24 Jun 2025 21:55:02 -0400 Subject: [PATCH] Pruebas de integracion con seeds --- app/resources/database/seeds/Comuna.php | 383 +----------------- app/resources/database/seeds/Provincia.php | 42 ++ app/resources/database/seeds/Region.php | 42 ++ app/resources/database/seeds/TipoSociedad.php | 43 ++ app/resources/database/seeds/TipoUnidad.php | 43 ++ app/resources/database/seeds/comuna.csv | 347 ++++++++++++++++ app/resources/database/seeds/provincia.csv | 55 +++ app/resources/database/seeds/region.csv | 16 + app/src/Model/Inmobiliaria.php | 12 +- app/src/Model/Venta/Datos.php | 12 +- app/src/Model/Venta/Propiedad.php | 2 +- app/src/Model/Venta/Propietario.php | 4 +- app/src/Repository/Inmobiliaria.php | 8 +- .../Proyecto/ProyectoTipoUnidad.php | 3 +- app/src/Repository/Venta/Unidad.php | 6 +- app/test.bootstrap.php | 41 +- app/tests/extension/AbstractSeed.php | 147 +++++++ app/tests/extension/Faker/Provider/Rut.php | 38 ++ app/tests/extension/SeedInterface.php | 27 ++ app/tests/extension/Seeds/Direcciones.php | 33 ++ app/tests/extension/Seeds/Inmobiliarias.php | 39 ++ app/tests/extension/Seeds/Proyectos.php | 40 ++ app/tests/extension/TestSeeder.php | 70 ++++ .../API/Ventas/MediosPago/TokuTest.php | 28 ++ app/tests/integration/QueueTest.php | 67 ++- bin/test-app.bat | 3 + 26 files changed, 1133 insertions(+), 418 deletions(-) create mode 100644 app/resources/database/seeds/Provincia.php create mode 100644 app/resources/database/seeds/Region.php create mode 100644 app/resources/database/seeds/TipoSociedad.php create mode 100644 app/resources/database/seeds/TipoUnidad.php create mode 100644 app/resources/database/seeds/comuna.csv create mode 100644 app/resources/database/seeds/provincia.csv create mode 100644 app/resources/database/seeds/region.csv create mode 100644 app/tests/extension/AbstractSeed.php create mode 100644 app/tests/extension/Faker/Provider/Rut.php create mode 100644 app/tests/extension/SeedInterface.php create mode 100644 app/tests/extension/Seeds/Direcciones.php create mode 100644 app/tests/extension/Seeds/Inmobiliarias.php create mode 100644 app/tests/extension/Seeds/Proyectos.php create mode 100644 app/tests/extension/TestSeeder.php create mode 100644 app/tests/integration/API/Ventas/MediosPago/TokuTest.php create mode 100644 bin/test-app.bat diff --git a/app/resources/database/seeds/Comuna.php b/app/resources/database/seeds/Comuna.php index b77de3f..0c8c4b8 100644 --- a/app/resources/database/seeds/Comuna.php +++ b/app/resources/database/seeds/Comuna.php @@ -16,376 +16,27 @@ class Comuna extends AbstractSeed */ public function run(): void { -/*id descripcion provincia -1101 Iquique 11 -1107 Alto Hospicio 11 -1401 Pozo Almonte 14 -1402 Camiña 14 -1403 Colchane 14 -1404 Huara 14 -1405 Pica 14 -2101 Antofagasta 21 -2102 Mejillones 21 -2103 Sierra Gorda 21 -2104 Taltal 21 -2201 Calama 22 -2202 Ollagüe 22 -2203 San Pedro de Atacama 22 -2301 Tocopilla 23 -2302 María Elena 23 -3101 Copiapó 31 -3102 Caldera 31 -3103 Tierra Amarilla 31 -3201 Chañaral 32 -3202 Diego de Almagro 32 -3301 Vallenar 33 -3302 Alto del Carmen 33 -3303 Freirina 33 -3304 Huasco 33 -4101 La Serena 41 -4102 Coquimbo 41 -4103 Andacollo 41 -4104 La Higuera 41 -4105 Paiguano 41 -4106 Vicuña 41 -4201 Illapel 42 -4202 Canela 42 -4203 Los Vilos 42 -4204 Salamanca 42 -4301 Ovalle 43 -4302 Combarbalá 43 -4303 Monte Patria 43 -4304 Punitaqui 43 -4305 Río Hurtado 43 -5101 Valparaíso 51 -5102 Casablanca 51 -5103 Concón 51 -5104 Juan Fernández 51 -5105 Puchuncaví 51 -5107 Quintero 51 -5109 Viña del Mar 51 -5201 Isla de Pascua 52 -5301 Los Andes 53 -5302 Calle Larga 53 -5303 Rinconada 53 -5304 San Esteban 53 -5401 La Ligua 54 -5402 Cabildo 54 -5403 Papudo 54 -5404 Petorca 54 -5405 Zapallar 54 -5501 Quillota 55 -5502 Calera 55 -5503 Hijuelas 55 -5504 La Cruz 55 -5506 Nogales 55 -5601 San Antonio 56 -5602 Algarrobo 56 -5603 Cartagena 56 -5604 El Quisco 56 -5605 El Tabo 56 -5606 Santo Domingo 56 -5701 San Felipe 57 -5702 Catemu 57 -5703 Llaillay 57 -5704 Panquehue 57 -5705 Putaendo 57 -5706 Santa María 57 -5801 Quilpué 58 -5802 Limache 58 -5803 Olmué 58 -5804 Villa Alemana 58 -6101 Rancagua 61 -6102 Codegua 61 -6103 Coinco 61 -6104 Coltauco 61 -6105 Doñihue 61 -6106 Graneros 61 -6107 Las Cabras 61 -6108 Machalí 61 -6109 Malloa 61 -6110 Mostazal 61 -6111 Olivar 61 -6112 Peumo 61 -6113 Pichidegua 61 -6114 Quinta de Tilcoco 61 -6115 Rengo 61 -6116 Requínoa 61 -6117 San Vicente 61 -6201 Pichilemu 62 -6202 La Estrella 62 -6203 Litueche 62 -6204 Marchihue 62 -6205 Navidad 62 -6206 Paredones 62 -6301 San Fernando 63 -6302 Chépica 63 -6303 Chimbarongo 63 -6304 Lolol 63 -6305 Nancagua 63 -6306 Palmilla 63 -6307 Peralillo 63 -6308 Placilla 63 -6309 Pumanque 63 -6310 Santa Cruz 63 -7101 Talca 71 -7102 Constitución 71 -7103 Curepto 71 -7104 Empedrado 71 -7105 Maule 71 -7106 Pelarco 71 -7107 Pencahue 71 -7108 Río Claro 71 -7109 San Clemente 71 -7110 San Rafael 71 -7201 Cauquenes 72 -7202 Chanco 72 -7203 Pelluhue 72 -7301 Curicó 73 -7302 Hualañé 73 -7303 Licantén 73 -7304 Molina 73 -7305 Rauco 73 -7306 Romeral 73 -7307 Sagrada Familia 73 -7308 Teno 73 -7309 Vichuquén 73 -7401 Linares 74 -7402 Colbún 74 -7403 Longaví 74 -7404 Parral 74 -7405 Retiro 74 -7406 San Javier 74 -7407 Villa Alegre 74 -7408 Yerbas Buenas 74 -8101 Concepción 81 -8102 Coronel 81 -8103 Chiguayante 81 -8104 Florida 81 -8105 Hualqui 81 -8106 Lota 81 -8107 Penco 81 -8108 San Pedro de la Paz 81 -8109 Santa Juana 81 -8110 Talcahuano 81 -8111 Tomé 81 -8112 Hualpén 81 -8201 Lebu 82 -8202 Arauco 82 -8203 Cañete 82 -8204 Contulmo 82 -8205 Curanilahue 82 -8206 Los Álamos 82 -8207 Tirúa 82 -8301 Los Ángeles 83 -8302 Antuco 83 -8303 Cabrero 83 -8304 Laja 83 -8305 Mulchén 83 -8306 Nacimiento 83 -8307 Negrete 83 -8308 Quilaco 83 -8309 Quilleco 83 -8310 San Rosendo 83 -8311 Santa Bárbara 83 -8312 Tucapel 83 -8313 Yumbel 83 -8314 Alto Biobío 83 -8401 Chillán 84 -8402 Bulnes 84 -8403 Cobquecura 84 -8404 Coelemu 84 -8405 Coihueco 84 -8406 Chillán Viejo 84 -8407 El Carmen 84 -8408 Ninhue 84 -8409 Ñiquén 84 -8410 Pemuco 84 -8411 Pinto 84 -8412 Portezuelo 84 -8413 Quillón 84 -8414 Quirihue 84 -8415 Ránquil 84 -8416 San Carlos 84 -8417 San Fabián 84 -8418 San Ignacio 84 -8419 San Nicolás 84 -8420 Treguaco 84 -8421 Yungay 84 -9101 Temuco 91 -9102 Carahue 91 -9103 Cunco 91 -9104 Curarrehue 91 -9105 Freire 91 -9106 Galvarino 91 -9107 Gorbea 91 -9108 Lautaro 91 -9109 Loncoche 91 -9110 Melipeuco 91 -9111 Nueva Imperial 91 -9112 Padre las Casas 91 -9113 Perquenco 91 -9114 Pitrufquén 91 -9115 Pucón 91 -9116 Saavedra 91 -9117 Teodoro Schmidt 91 -9118 Toltén 91 -9119 Vilcún 91 -9120 Villarrica 91 -9121 Cholchol 91 -9201 Angol 92 -9202 Collipulli 92 -9203 Curacautín 92 -9204 Ercilla 92 -9205 Lonquimay 92 -9206 Los Sauces 92 -9207 Lumaco 92 -9208 Purén 92 -9209 Renaico 92 -9210 Traiguén 92 -9211 Victoria 92 -10101 Puerto Montt 101 -10102 Calbuco 101 -10103 Cochamó 101 -10104 Fresia 101 -10105 Frutillar 101 -10106 Los Muermos 101 -10107 Llanquihue 101 -10108 Maullín 101 -10109 Puerto Varas 101 -10201 Castro 102 -10202 Ancud 102 -10203 Chonchi 102 -10204 Curaco de Vélez 102 -10205 Dalcahue 102 -10206 Puqueldón 102 -10207 Queilén 102 -10208 Quellón 102 -10209 Quemchi 102 -10210 Quinchao 102 -10301 Osorno 103 -10302 Puerto Octay 103 -10303 Purranque 103 -10304 Puyehue 103 -10305 Río Negro 103 -10306 San Juan de la Costa 103 -10307 San Pablo 103 -10401 Chaitén 104 -10402 Futaleufú 104 -10403 Hualaihué 104 -10404 Palena 104 -11101 Coihaique 111 -11102 Lago Verde 111 -11201 Aisén 112 -11202 Cisnes 112 -11203 Guaitecas 112 -11301 Cochrane 113 -11302 O’Higgins 113 -11303 Tortel 113 -11401 Chile Chico 114 -11402 Río Ibáñez 114 -12101 Punta Arenas 121 -12102 Laguna Blanca 121 -12103 Río Verde 121 -12104 San Gregorio 121 -12201 Cabo de Hornos (Ex Navarino) 122 -12202 Antártica 122 -12301 Porvenir 123 -12302 Primavera 123 -12303 Timaukel 123 -12401 Natales 124 -12402 Torres del Paine 124 -13101 Santiago 131 -13102 Cerrillos 131 -13103 Cerro Navia 131 -13104 Conchalí 131 -13105 El Bosque 131 -13106 Estación Central 131 -13107 Huechuraba 131 -13108 Independencia 131 -13109 La Cisterna 131 -13110 La Florida 131 -13111 La Granja 131 -13112 La Pintana 131 -13113 La Reina 131 -13114 Las Condes 131 -13115 Lo Barnechea 131 -13116 Lo Espejo 131 -13117 Lo Prado 131 -13118 Macul 131 -13119 Maipú 131 -13120 Ñuñoa 131 -13121 Pedro Aguirre Cerda 131 -13122 Peñalolén 131 -13123 Providencia 131 -13124 Pudahuel 131 -13125 Quilicura 131 -13126 Quinta Normal 131 -13127 Recoleta 131 -13128 Renca 131 -13129 San Joaquín 131 -13130 San Miguel 131 -13131 San Ramón 131 -13132 Vitacura 131 -13201 Puente Alto 132 -13202 Pirque 132 -13203 San José de Maipo 132 -13301 Colina 133 -13302 Lampa 133 -13303 Tiltil 133 -13401 San Bernardo 134 -13402 Buin 134 -13403 Calera de Tango 134 -13404 Paine 134 -13501 Melipilla 135 -13502 Alhué 135 -13503 Curacaví 135 -13504 María Pinto 135 -13505 San Pedro 135 -13601 Talagante 136 -13602 El Monte 136 -13603 Isla de Maipo 136 -13604 Padre Hurtado 136 -13605 Peñaflor 136 -14101 Valdivia 141 -14102 Corral 141 -14103 Lanco 141 -14104 Los Lagos 141 -14105 Máfil 141 -14106 Mariquina 141 -14107 Paillaco 141 -14108 Panguipulli 141 -14201 La Unión 142 -14202 Futrono 142 -14203 Lago Ranco 142 -14204 Río Bueno 142 -15101 Arica 151 -15102 Camarones 151 -15201 Putre 152 -15202 General Lagos 152 -*/ $this->execute('SET unique_checks=0; SET foreign_key_checks=0;'); $table = $this->table('comuna'); $table->truncate(); - $data = [ - ['id' => 1101, 'descripcion' => 'Iquique', 'provincia' => 11], - ['id' => 1107, 'descripcion' => 'Alto Hospicio', 'provincia' => 11], - ['id' => 1401, 'descripcion' => 'Pozo Almonte', 'provincia' => 14], - ['id' => 1402, 'descripcion' => 'Camiña', 'provincia' => 14], - ['id' => 1403, 'descripcion' => 'Colchane', 'provincia' => 14], - ['id' => 1404, 'descripcion' => 'Huara', 'provincia' => 14], - ['id' => 1405, 'descripcion' => 'Pica', 'provincia' => 14], - ['id' => 2101, 'descripcion' => 'Antofagasta', 'provincia' => 21], - ['id' => 2102, 'descripcion' => 'Mejillones', 'provincia' => 21], - ['id' => 2103, 'descripcion' => 'Sierra Gorda', 'provincia' => 21], - ['id' => 2104, 'descripcion' => 'Taltal', 'provincia' => 21], - ['id' => 2201, 'descripcion' => 'Calama', 'provincia' => 22], - ['id' => 2202, 'descripcion' => 'Ollagüe', 'provincia' => 22], - ['id' => 2203, 'descripcion' => 'San Pedro de Alcántara', 'provincia' => 22], - ['id' => 2301, 'descripcion' => 'Tocopilla', 'provincia' => 23], - ['id' => 2302, 'descripcion' => 'María Elena', 'provincia' => 23], - ]; + $filename = implode(DIRECTORY_SEPARATOR, [getcwd(), 'resources', 'database', 'seeds', 'comuna.csv']); + $dataRows = explode(PHP_EOL, trim(file_get_contents($filename))); + $data = array_map(fn($row) => explode(';', $row), $dataRows); + $columns = array_shift($data); + $columns = array_map(function($column) { + if (str_contains($column, 'id')) { + return 'id'; + } + return $column; + }, $columns); + $data = array_map(function ($row) use ($columns) { + return array_combine($columns, $row); + }, $data); + + $table->insert($data)->save(); + + $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); } } diff --git a/app/resources/database/seeds/Provincia.php b/app/resources/database/seeds/Provincia.php new file mode 100644 index 0000000..27dda24 --- /dev/null +++ b/app/resources/database/seeds/Provincia.php @@ -0,0 +1,42 @@ +execute('SET unique_checks=0; SET foreign_key_checks=0;'); + + $table = $this->table('provincia'); + $table->truncate(); + + $filename = implode(DIRECTORY_SEPARATOR, [getcwd(), 'resources', 'database', 'seeds', 'provincia.csv']); + $dataRows = explode(PHP_EOL, trim(file_get_contents($filename))); + $data = array_map(fn($row) => explode(';', $row), $dataRows); + $columns = array_shift($data); + $columns = array_map(function($column) { + if (str_contains($column, 'id')) { + return 'id'; + } + return $column; + }, $columns); + $data = array_map(function ($row) use ($columns) { + return array_combine($columns, $row); + }, $data); + + $table->insert($data)->save(); + + $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); + } +} diff --git a/app/resources/database/seeds/Region.php b/app/resources/database/seeds/Region.php new file mode 100644 index 0000000..df7e812 --- /dev/null +++ b/app/resources/database/seeds/Region.php @@ -0,0 +1,42 @@ +execute('SET unique_checks=0; SET foreign_key_checks=0;'); + + $table = $this->table('region'); + $table->truncate(); + + $filename = implode(DIRECTORY_SEPARATOR, [getcwd(), 'resources', 'database', 'seeds', 'region.csv']); + $dataRows = explode(PHP_EOL, trim(file_get_contents($filename))); + $data = array_map(fn($row) => explode(';', $row), $dataRows); + $columns = array_shift($data); + $columns = array_map(function($column) { + if (str_contains($column, 'id')) { + return 'id'; + } + return $column; + }, $columns); + $data = array_map(function ($row) use ($columns) { + return array_combine($columns, $row); + }, $data); + + $table->insert($data)->save(); + + $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); + } +} diff --git a/app/resources/database/seeds/TipoSociedad.php b/app/resources/database/seeds/TipoSociedad.php new file mode 100644 index 0000000..e0c4e52 --- /dev/null +++ b/app/resources/database/seeds/TipoSociedad.php @@ -0,0 +1,43 @@ +execute('SET unique_checks=0; SET foreign_key_checks=0;'); + + $table = $this->table('tipo_sociedad'); + $table->truncate(); + + $data = [ + [ + 'descripcion' => 'Limitada', + 'abreviacion' => 'Ltda', + ], + [ + 'descripcion' => 'Sociedad Anónima', + 'abreviacion' => 'SA', + ], + [ + 'descripcion' => 'Sociedad por Acciones', + 'abreviacion' => 'SpA', + ] + ]; + + $table->insert($data)->saveData(); + + $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); + } +} diff --git a/app/resources/database/seeds/TipoUnidad.php b/app/resources/database/seeds/TipoUnidad.php new file mode 100644 index 0000000..9d58fbe --- /dev/null +++ b/app/resources/database/seeds/TipoUnidad.php @@ -0,0 +1,43 @@ +execute('SET unique_checks=0; SET foreign_key_checks=0;'); + + $table = $this->table('tipo_unidad'); + $table->truncate(); + + $data = [ + [ + 'descripcion' => 'departamento', + 'orden' => 0, + ], + [ + 'descripcion' => 'estacionamiento', + 'orden' => 1, + ], + [ + 'descripcion' => 'bodega', + 'orden' => 2, + ] + ]; + + $table->insert($data)->saveData(); + + $this->execute('SET unique_checks=1; SET foreign_key_checks=1;'); + } +} diff --git a/app/resources/database/seeds/comuna.csv b/app/resources/database/seeds/comuna.csv new file mode 100644 index 0000000..206a0b3 --- /dev/null +++ b/app/resources/database/seeds/comuna.csv @@ -0,0 +1,347 @@ +id;descripcion;provincia +1101;Iquique;11 +1107;Alto Hospicio;11 +1401;Pozo Almonte;14 +1402;Camiña;14 +1403;Colchane;14 +1404;Huara;14 +1405;Pica;14 +2101;Antofagasta;21 +2102;Mejillones;21 +2103;Sierra Gorda;21 +2104;Taltal;21 +2201;Calama;22 +2202;Ollagüe;22 +2203;San Pedro de Atacama;22 +2301;Tocopilla;23 +2302;María Elena;23 +3101;Copiapó;31 +3102;Caldera;31 +3103;Tierra Amarilla;31 +3201;Chañaral;32 +3202;Diego de Almagro;32 +3301;Vallenar;33 +3302;Alto del Carmen;33 +3303;Freirina;33 +3304;Huasco;33 +4101;La Serena;41 +4102;Coquimbo;41 +4103;Andacollo;41 +4104;La Higuera;41 +4105;Paiguano;41 +4106;Vicuña;41 +4201;Illapel;42 +4202;Canela;42 +4203;Los Vilos;42 +4204;Salamanca;42 +4301;Ovalle;43 +4302;Combarbalá;43 +4303;Monte Patria;43 +4304;Punitaqui;43 +4305;Río Hurtado;43 +5101;Valparaíso;51 +5102;Casablanca;51 +5103;Concón;51 +5104;Juan Fernández;51 +5105;Puchuncaví;51 +5107;Quintero;51 +5109;Viña del Mar;51 +5201;Isla de Pascua;52 +5301;Los Andes;53 +5302;Calle Larga;53 +5303;Rinconada;53 +5304;San Esteban;53 +5401;La Ligua;54 +5402;Cabildo;54 +5403;Papudo;54 +5404;Petorca;54 +5405;Zapallar;54 +5501;Quillota;55 +5502;Calera;55 +5503;Hijuelas;55 +5504;La Cruz;55 +5506;Nogales;55 +5601;San Antonio;56 +5602;Algarrobo;56 +5603;Cartagena;56 +5604;El Quisco;56 +5605;El Tabo;56 +5606;Santo Domingo;56 +5701;San Felipe;57 +5702;Catemu;57 +5703;Llaillay;57 +5704;Panquehue;57 +5705;Putaendo;57 +5706;Santa María;57 +5801;Quilpué;58 +5802;Limache;58 +5803;Olmué;58 +5804;Villa Alemana;58 +6101;Rancagua;61 +6102;Codegua;61 +6103;Coinco;61 +6104;Coltauco;61 +6105;Doñihue;61 +6106;Graneros;61 +6107;Las Cabras;61 +6108;Machalí;61 +6109;Malloa;61 +6110;Mostazal;61 +6111;Olivar;61 +6112;Peumo;61 +6113;Pichidegua;61 +6114;Quinta de Tilcoco;61 +6115;Rengo;61 +6116;Requínoa;61 +6117;San Vicente;61 +6201;Pichilemu;62 +6202;La Estrella;62 +6203;Litueche;62 +6204;Marchihue;62 +6205;Navidad;62 +6206;Paredones;62 +6301;San Fernando;63 +6302;Chépica;63 +6303;Chimbarongo;63 +6304;Lolol;63 +6305;Nancagua;63 +6306;Palmilla;63 +6307;Peralillo;63 +6308;Placilla;63 +6309;Pumanque;63 +6310;Santa Cruz;63 +7101;Talca;71 +7102;Constitución;71 +7103;Curepto;71 +7104;Empedrado;71 +7105;Maule;71 +7106;Pelarco;71 +7107;Pencahue;71 +7108;Río Claro;71 +7109;San Clemente;71 +7110;San Rafael;71 +7201;Cauquenes;72 +7202;Chanco;72 +7203;Pelluhue;72 +7301;Curicó;73 +7302;Hualañé;73 +7303;Licantén;73 +7304;Molina;73 +7305;Rauco;73 +7306;Romeral;73 +7307;Sagrada Familia;73 +7308;Teno;73 +7309;Vichuquén;73 +7401;Linares;74 +7402;Colbún;74 +7403;Longaví;74 +7404;Parral;74 +7405;Retiro;74 +7406;San Javier;74 +7407;Villa Alegre;74 +7408;Yerbas Buenas;74 +8101;Concepción;81 +8102;Coronel;81 +8103;Chiguayante;81 +8104;Florida;81 +8105;Hualqui;81 +8106;Lota;81 +8107;Penco;81 +8108;San Pedro de la Paz;81 +8109;Santa Juana;81 +8110;Talcahuano;81 +8111;Tomé;81 +8112;Hualpén;81 +8201;Lebu;82 +8202;Arauco;82 +8203;Cañete;82 +8204;Contulmo;82 +8205;Curanilahue;82 +8206;Los Álamos;82 +8207;Tirúa;82 +8301;Los Ángeles;83 +8302;Antuco;83 +8303;Cabrero;83 +8304;Laja;83 +8305;Mulchén;83 +8306;Nacimiento;83 +8307;Negrete;83 +8308;Quilaco;83 +8309;Quilleco;83 +8310;San Rosendo;83 +8311;Santa Bárbara;83 +8312;Tucapel;83 +8313;Yumbel;83 +8314;Alto Biobío;83 +8401;Chillán;84 +8402;Bulnes;84 +8403;Cobquecura;84 +8404;Coelemu;84 +8405;Coihueco;84 +8406;Chillán Viejo;84 +8407;El Carmen;84 +8408;Ninhue;84 +8409;Ñiquén;84 +8410;Pemuco;84 +8411;Pinto;84 +8412;Portezuelo;84 +8413;Quillón;84 +8414;Quirihue;84 +8415;Ránquil;84 +8416;San Carlos;84 +8417;San Fabián;84 +8418;San Ignacio;84 +8419;San Nicolás;84 +8420;Treguaco;84 +8421;Yungay;84 +9101;Temuco;91 +9102;Carahue;91 +9103;Cunco;91 +9104;Curarrehue;91 +9105;Freire;91 +9106;Galvarino;91 +9107;Gorbea;91 +9108;Lautaro;91 +9109;Loncoche;91 +9110;Melipeuco;91 +9111;Nueva Imperial;91 +9112;Padre las Casas;91 +9113;Perquenco;91 +9114;Pitrufquén;91 +9115;Pucón;91 +9116;Saavedra;91 +9117;Teodoro Schmidt;91 +9118;Toltén;91 +9119;Vilcún;91 +9120;Villarrica;91 +9121;Cholchol;91 +9201;Angol;92 +9202;Collipulli;92 +9203;Curacautín;92 +9204;Ercilla;92 +9205;Lonquimay;92 +9206;Los Sauces;92 +9207;Lumaco;92 +9208;Purén;92 +9209;Renaico;92 +9210;Traiguén;92 +9211;Victoria;92 +10101;Puerto Montt;101 +10102;Calbuco;101 +10103;Cochamó;101 +10104;Fresia;101 +10105;Frutillar;101 +10106;Los Muermos;101 +10107;Llanquihue;101 +10108;Maullín;101 +10109;Puerto Varas;101 +10201;Castro;102 +10202;Ancud;102 +10203;Chonchi;102 +10204;Curaco de Vélez;102 +10205;Dalcahue;102 +10206;Puqueldón;102 +10207;Queilén;102 +10208;Quellón;102 +10209;Quemchi;102 +10210;Quinchao;102 +10301;Osorno;103 +10302;Puerto Octay;103 +10303;Purranque;103 +10304;Puyehue;103 +10305;Río Negro;103 +10306;San Juan de la Costa;103 +10307;San Pablo;103 +10401;Chaitén;104 +10402;Futaleufú;104 +10403;Hualaihué;104 +10404;Palena;104 +11101;Coihaique;111 +11102;Lago Verde;111 +11201;Aisén;112 +11202;Cisnes;112 +11203;Guaitecas;112 +11301;Cochrane;113 +11302;O’Higgins;113 +11303;Tortel;113 +11401;Chile Chico;114 +11402;Río Ibáñez;114 +12101;Punta Arenas;121 +12102;Laguna Blanca;121 +12103;Río Verde;121 +12104;San Gregorio;121 +12201;Cabo de Hornos (Ex Navarino);122 +12202;Antártica;122 +12301;Porvenir;123 +12302;Primavera;123 +12303;Timaukel;123 +12401;Natales;124 +12402;Torres del Paine;124 +13101;Santiago;131 +13102;Cerrillos;131 +13103;Cerro Navia;131 +13104;Conchalí;131 +13105;El Bosque;131 +13106;Estación Central;131 +13107;Huechuraba;131 +13108;Independencia;131 +13109;La Cisterna;131 +13110;La Florida;131 +13111;La Granja;131 +13112;La Pintana;131 +13113;La Reina;131 +13114;Las Condes;131 +13115;Lo Barnechea;131 +13116;Lo Espejo;131 +13117;Lo Prado;131 +13118;Macul;131 +13119;Maipú;131 +13120;Ñuñoa;131 +13121;Pedro Aguirre Cerda;131 +13122;Peñalolén;131 +13123;Providencia;131 +13124;Pudahuel;131 +13125;Quilicura;131 +13126;Quinta Normal;131 +13127;Recoleta;131 +13128;Renca;131 +13129;San Joaquín;131 +13130;San Miguel;131 +13131;San Ramón;131 +13132;Vitacura;131 +13201;Puente Alto;132 +13202;Pirque;132 +13203;San José de Maipo;132 +13301;Colina;133 +13302;Lampa;133 +13303;Tiltil;133 +13401;San Bernardo;134 +13402;Buin;134 +13403;Calera de Tango;134 +13404;Paine;134 +13501;Melipilla;135 +13502;Alhué;135 +13503;Curacaví;135 +13504;María Pinto;135 +13505;San Pedro;135 +13601;Talagante;136 +13602;El Monte;136 +13603;Isla de Maipo;136 +13604;Padre Hurtado;136 +13605;Peñaflor;136 +14101;Valdivia;141 +14102;Corral;141 +14103;Lanco;141 +14104;Los Lagos;141 +14105;Máfil;141 +14106;Mariquina;141 +14107;Paillaco;141 +14108;Panguipulli;141 +14201;La Unión;142 +14202;Futrono;142 +14203;Lago Ranco;142 +14204;Río Bueno;142 +15101;Arica;151 +15102;Camarones;151 +15201;Putre;152 +15202;General Lagos;152 diff --git a/app/resources/database/seeds/provincia.csv b/app/resources/database/seeds/provincia.csv new file mode 100644 index 0000000..0f5abbe --- /dev/null +++ b/app/resources/database/seeds/provincia.csv @@ -0,0 +1,55 @@ +id;descripcion;region +11;Iquique;1 +14;Tamarugal;1 +21;Antofagasta;2 +22;El Loa;2 +23;Tocopilla;2 +31;Copiap;3 +32;Chañaral;3 +33;Huasco;3 +41;Elqui;4 +42;Choapa;4 +43;Limari;4 +51;Valparaíso;5 +52;Isla de Pascua;5 +53;Los Andes;5 +54;Petorca;5 +55;Quillota;5 +56;San Antonio;5 +57;San Felipe;5 +58;Marga Marga;5 +61;Cachapoal;6 +62;Cardenal Caro;6 +63;Colchagua;6 +71;Talca;7 +72;Cauquenes;7 +73;Curico;7 +74;Linares;7 +81;Concepci;8 +82;Arauco;8 +83;Bío- Bío;8 +84;Ñuble;8 +91;Cautín;9 +92;Malleco;9 +101;Llanquihue;10 +102;Chiloe;10 +103;Osorno;10 +104;Palena;10 +111;Coihaique;11 +112;Aisén;11 +113;Capitan Prat;11 +114;General Carrera;11 +121;Magallanes;12 +122;Antártica Chilena;12 +123;Tierra del Fuego;12 +124;Ultima Esperanza;12 +131;Santiago;13 +132;Cordillera;13 +133;Chacabuco;13 +134;Maipo;13 +135;Melipilla;13 +136;Talagante;13 +141;Valdivia;14 +142;Ranco;14 +151;Arica;15 +152;Parinacota;15 diff --git a/app/resources/database/seeds/region.csv b/app/resources/database/seeds/region.csv new file mode 100644 index 0000000..a6d8425 --- /dev/null +++ b/app/resources/database/seeds/region.csv @@ -0,0 +1,16 @@ +id;descripcion;numeral;numeracion +1;Región de Tarapacá;I;1 +2;Región de Antofagasta;II;2 +3;Región de Atacama;III;3 +4;Región de Coquimbo;IV;4 +5;Región de Valparaíso;V;5 +6;Región del Libertador Gral. Bernardo O’Higgins;VI;6 +7;Región del Maule;VII;7 +8;Región del Biobío;VIII;8 +9;Región de la Araucanía;IX;9 +10;Región de Los Lagos;X;10 +11;Región Aisén del Gral. Carlos Ibáñez del Campo;XI;11 +12;Región de Magallanes y de la Antártica Chilena;XII;12 +13;Región Metropolitana de Santiago;RM;13 +14;Región de Los Ríos;XIV;14 +15;Región de Arica y Parinacota;XV;15 diff --git a/app/src/Model/Inmobiliaria.php b/app/src/Model/Inmobiliaria.php index 73adc90..9eaa595 100644 --- a/app/src/Model/Inmobiliaria.php +++ b/app/src/Model/Inmobiliaria.php @@ -7,11 +7,11 @@ use Incoviba\Model\Inmobiliaria\TipoSociedad; class Inmobiliaria extends Model { public int $rut; - public ?string $dv; - public ?string $razon; - public ?string $abreviacion; - public ?TipoSociedad $tipoSociedad; - public string $sigla; + public ?string $dv = null; + public ?string $razon = null; + public ?string $abreviacion = null; + public ?TipoSociedad $tipoSociedad = null; + public ?string $sigla = null; public function rut(): string { @@ -37,7 +37,7 @@ class Inmobiliaria extends Model 'razon' => $this->razon ?? '', 'abreviacion' => $this->abreviacion ?? '', 'tipo_sociedad' => $this->tipoSociedad ?? '', - 'sigla' => $this->sigla, + 'sigla' => $this->sigla ?? '', ]; } } diff --git a/app/src/Model/Venta/Datos.php b/app/src/Model/Venta/Datos.php index b9a7ebd..58f4db5 100644 --- a/app/src/Model/Venta/Datos.php +++ b/app/src/Model/Venta/Datos.php @@ -6,12 +6,12 @@ use Incoviba\Model\Direccion; class Datos { - public ?string $sexo; - public ?string $estado_civil; - public ?string $profesion; - public ?Direccion $direccion; - public ?int $telefono; - public ?string $email; + public ?string $sexo = null; + public ?string $estado_civil = null; + public ?string $profesion = null; + public ?Direccion $direccion = null; + public ?int $telefono = null; + public ?string $email = null; public function jsonSerialize(): mixed { diff --git a/app/src/Model/Venta/Propiedad.php b/app/src/Model/Venta/Propiedad.php index c75cf21..7e032c3 100644 --- a/app/src/Model/Venta/Propiedad.php +++ b/app/src/Model/Venta/Propiedad.php @@ -9,7 +9,7 @@ class Propiedad extends Ideal\Model public array $unidades = []; public bool $estado; - public function principal(): Unidad + public function principal(): ?Unidad { if (count($this->departamentos()) > 0) { return $this->departamentos()[0]; diff --git a/app/src/Model/Venta/Propietario.php b/app/src/Model/Venta/Propietario.php index 77300eb..a83c06d 100644 --- a/app/src/Model/Venta/Propietario.php +++ b/app/src/Model/Venta/Propietario.php @@ -11,8 +11,8 @@ class Propietario extends Model public string $nombres; public array $apellidos; public Datos $datos; - public ?Propietario $representante; - public ?bool $otro; + public ?Propietario $representante = null; + public ?bool $otro = null; public function rut(): string { diff --git a/app/src/Repository/Inmobiliaria.php b/app/src/Repository/Inmobiliaria.php index ed80891..3e83c0b 100644 --- a/app/src/Repository/Inmobiliaria.php +++ b/app/src/Repository/Inmobiliaria.php @@ -22,7 +22,7 @@ class Inmobiliaria extends Ideal\Repository public function create(?array $data = null): Model\Inmobiliaria { - $map = (new Implement\Repository\MapperParser(['dv', 'razon', 'abreviacion', 'sigla'])) + $map = (new Implement\Repository\MapperParser(['rut', 'dv', 'razon', 'abreviacion', 'sigla'])) ->register('sociedad', (new Implement\Repository\Mapper()) ->setProperty('tipoSociedad') ->setFunction(function($data) { @@ -32,9 +32,9 @@ class Inmobiliaria extends Ideal\Repository } public function save(Define\Model $model): Model\Inmobiliaria { - $model->rut = $this->saveNew( - ['dv', 'razon', 'abreviacion', 'cuenta', 'banco', 'sociedad'], - [$model->dv, $model->razon, $model->abreviacion, $model->cuenta, $model->banco->id, $model->tipoSociedad->id] + $this->saveNew( + ['rut', 'dv', 'razon', 'abreviacion', 'cuenta', 'banco', 'sociedad'], + [$model->rut, $model?->dv, $model?->razon, $model?->abreviacion, $model?->cuenta, $model?->banco->id, $model?->tipoSociedad->id] ); return $model; } diff --git a/app/src/Repository/Proyecto/ProyectoTipoUnidad.php b/app/src/Repository/Proyecto/ProyectoTipoUnidad.php index b5d5c35..b1eda28 100644 --- a/app/src/Repository/Proyecto/ProyectoTipoUnidad.php +++ b/app/src/Repository/Proyecto/ProyectoTipoUnidad.php @@ -9,7 +9,8 @@ use Incoviba\Repository; class ProyectoTipoUnidad extends Ideal\Repository { - public function __construct(Define\Connection $connection, protected Repository\Proyecto $proyectoRepository, protected Repository\Proyecto\TipoUnidad $tipoUnidadRepository) + public function __construct(Define\Connection $connection, protected Repository\Proyecto $proyectoRepository, + protected Repository\Proyecto\TipoUnidad $tipoUnidadRepository) { parent::__construct($connection); $this->setTable('proyecto_tipo_unidad'); diff --git a/app/src/Repository/Venta/Unidad.php b/app/src/Repository/Venta/Unidad.php index c03c866..f49044d 100644 --- a/app/src/Repository/Venta/Unidad.php +++ b/app/src/Repository/Venta/Unidad.php @@ -23,6 +23,7 @@ class Unidad extends Ideal\Repository ->register('pt', (new Implement\Repository\Mapper()) ->setProperty('proyectoTipoUnidad') ->setFunction(function($data) { + var_dump($data['pt']); return $this->proyectoTipoUnidadService->getById($data['pt']); })); return $this->parseData(new Model\Venta\Unidad(), $data, $map); @@ -30,8 +31,9 @@ class Unidad extends Ideal\Repository public function save(Define\Model $model): Model\Venta\Unidad { $model->id = $this->saveNew( - ['subtipo', 'piso', 'descripcion', 'orientacion', 'pt'], - [$model->subtipo, $model->piso, $model->descripcion, $model->orientacion, $model->proyectoTipoUnidad->id] + ['proyecto', 'tipo', 'subtipo', 'piso', 'descripcion', 'abreviacion', 'orientacion', 'pt'], + [$model->proyectoTipoUnidad->proyecto->id, $model->proyectoTipoUnidad->tipoUnidad->id, $model->subtipo, + $model->piso, $model->descripcion, $model->proyectoTipoUnidad->abreviacion, $model->orientacion, $model->proyectoTipoUnidad->id] ); return $model; } diff --git a/app/test.bootstrap.php b/app/test.bootstrap.php index 32ebffb..e7a4a64 100644 --- a/app/test.bootstrap.php +++ b/app/test.bootstrap.php @@ -52,17 +52,15 @@ class TestBootstrap { public function __construct(protected array $configuration) {} - public function run(bool $resetDatabase = false): void + public function run(bool $debug = false): void { - if ($resetDatabase) { - if (Benchmark::execute([$this, 'isMigrated'])) { - Benchmark::execute([$this, 'resetDatabase']); - } - } if (!Benchmark::execute([$this, 'isMigrated'])) { Benchmark::execute([$this, 'migrate']); } - Benchmark::execute([$this, 'seedTables']); + $output = Benchmark::execute([$this, 'seedTables']); + if ($debug) { + var_dump($output); + } } protected string $baseCommand = "bin/phinx"; @@ -74,10 +72,10 @@ class TestBootstrap return $status['missing_count'] === 0 and $status['pending_count'] === 0; } - public function migrate(): void + public function migrate(): false|null|string { $cmd = "{$this->baseCommand} migrate -e testing"; - shell_exec($cmd); + return shell_exec($cmd); } public function resetDatabase(): void @@ -122,10 +120,15 @@ class TestBootstrap } } } - public function seedTables(): void + public function seedTables(): false|null|string { $cmd = "{$this->baseCommand} seed:run -e testing"; - shell_exec($cmd); + $output = shell_exec($cmd); + + $testSeeder = new Tests\Extension\TestSeeder($this->connect()); + $testSeeder->run(); + + return $output; } protected PDO $connection; @@ -161,18 +164,24 @@ spl_autoload_register(function($className) { ]; foreach ($namespaceMap as $namespace => $path) { if (str_starts_with($className, $namespace)) { - require str_replace($namespace, "{$path}/", $className) . ".php"; + require str_replace([$namespace, '\\'], ["{$path}/", DIRECTORY_SEPARATOR], $className) . ".php"; return; } } }); $bootstrap = new TestBootstrap($_ENV); -$resetDatabase = $_ENV['RESET_DATABASE'] ?? false; -Benchmark::execute([$bootstrap, 'run'], ['resetDatabase' => $resetDatabase]); +$resetDatabase = ($_ENV['RESET_DATABASE'] === 'true') ?? false; +$debug = ($_ENV['DEBUG'] === 'true') ?? false; + +Benchmark::execute([$bootstrap, 'run'], ['debug' => $debug]); Benchmark::print(); -register_shutdown_function(function() use ($bootstrap) { - Benchmark::execute([$bootstrap, 'resetDatabase']); +register_shutdown_function(function() use ($bootstrap, $resetDatabase) { + $method = 'truncateTables'; + if ($resetDatabase) { + $method = 'resetDatabase'; + } + Benchmark::execute([$bootstrap, $method]); Benchmark::print(); }); diff --git a/app/tests/extension/AbstractSeed.php b/app/tests/extension/AbstractSeed.php new file mode 100644 index 0000000..ff6092a --- /dev/null +++ b/app/tests/extension/AbstractSeed.php @@ -0,0 +1,147 @@ +setConnection($connection); + $this->faker = Faker\Factory::create('es_AR'); + $this->faker->addProvider(new Rut($this->faker)); + } + + protected PDO $connection; + protected Faker\Generator $faker; + public function setConnection(PDO $connection): SeedInterface + { + $this->connection = $connection; + return $this; + } + public function getConnection(): PDO + { + return $this->connection; + } + public function getDependencies(): array + { + return []; + } + + protected string $table; + protected function table(string $table): self + { + $this->table = $table; + return $this; + } + + protected array $queryQueue = []; + protected function insertValues(array $valueRows): self + { + $columns = array_keys($valueRows[0]); + $columnsString = implode(', ', array_map(fn($column) => "`{$column}`", $columns)); + $placeholderArray = array_map(fn($column) => ":{$column}", $columns); + $placeholders = implode(', ', $placeholderArray); + $query = "INSERT INTO `{$this->table}` ({$columnsString}) VALUES ({$placeholders})"; + $this->queryQueue []= ['query' => $query, 'values' => $valueRows]; + return $this; + } + protected function save(): self + { + foreach ($this->queryQueue as $entry) { + $query = $entry['query']; + $valueRows = $entry['values']; + + foreach ($valueRows as $valueRow) { + try { + $this->connection->beginTransaction(); + $statement = $this->connection->prepare($query); + if ($statement === false) { + $this->connection->rollBack(); + continue; + } + $statement->execute($valueRow); + $this->connection->commit(); + } catch (PDOException | \Throwable $exception) { + $this->connection->rollBack(); + } + } + } + return $this; + } + + protected function loadValues(string $table, array $conditions = [], string|array $columns = '*'): array + { + $columns = $this->processColumns($columns); + $query = "SELECT {$columns} FROM `{$table}`"; + if (count($conditions) > 0) { + $conditionsString = $this->processConditions($conditions); + $query = "{$query} WHERE {$conditionsString}"; + } + try { + $statement = $this->connection->prepare($query); + $statement->execute(); + } catch (PDOException) { + return []; + } + try { + if ($columns !== '*' and !str_contains($columns, ',')) { + return $statement->fetchAll(PDO::FETCH_COLUMN); + } + return $statement->fetchAll(PDO::FETCH_ASSOC); + } catch (PDOException) { + return []; + } + } + protected function processColumns(string|array $columns): string + { + if (is_array($columns)) { + $columns = implode(',', array_map(fn($column) => "`{$column}`", $columns)); + } + if ($columns === '*') { + return $columns; + } + $columns = array_map(fn($column) => trim($column), explode(',', $columns)); + return implode(', ', array_map(function($column) { + if (!str_contains($column, '`')) { + return "`{$column}`"; + } + return $column; + }, $columns)); + } + protected function processConditions(array $conditions): array + { + $processedConditions = []; + $processedValues = []; + foreach ($conditions as $condition) { + if (is_string($condition) and (str_starts_with(strtolower($condition), 'and') or str_starts_with(strtolower($condition), 'or'))) { + $processedConditions[] = $condition; + continue; + } + $column = $condition['column']; + $value = $condition['value']; + $match = $condition['match'] ?? 'AND'; + $operator = $condition['operator'] ?? '='; + $columnValue = ":{$column}"; + if (is_array($value)) { + $columnString = []; + foreach ($value as $idx => $val) { + $columnValue = ":{$column}_{$idx}"; + $columnString[] = $columnValue; + $processedValues["{$column}_{$idx}"] = $val; + } + $columnValue = '(' . implode(', ', $columnString) . ')'; + if (!str_contains($operator, 'IN')) { + $operator = 'IN'; + } + } else { + $processedValues[$column] = $value; + } + $processedConditions[] = "{$match} `{$column}` {$operator} {$columnValue}"; + } + return ['query' => implode(' ', $processedConditions), 'values' => $processedValues]; + } +} diff --git a/app/tests/extension/Faker/Provider/Rut.php b/app/tests/extension/Faker/Provider/Rut.php new file mode 100644 index 0000000..3bdc78d --- /dev/null +++ b/app/tests/extension/Faker/Provider/Rut.php @@ -0,0 +1,38 @@ +getDigito($base); + if ($withDotsAndSlash) { + return "{$digito}-{$rut}"; + } + return "{$digito}{$rut}"; + } + return $rut; + } + public function digitoVerificador(string $rut): bool|string + { + if ( !preg_match("/^[0-9.]+/",$rut)) return false; + $rut = str_replace('.','',$rut); + return $this->getDigito($rut); + } + + protected function getDigito(string $rut): string + { + $M=0;$S=1; + for(;$rut;$rut=floor($rut/10)) + $S=($S+$rut%10*(9-$M++%6))%11; + return $S?$S-1:'K'; + } +} diff --git a/app/tests/extension/SeedInterface.php b/app/tests/extension/SeedInterface.php new file mode 100644 index 0000000..5b911b3 --- /dev/null +++ b/app/tests/extension/SeedInterface.php @@ -0,0 +1,27 @@ +loadValues('comuna', columns: 'id'); + + $n = 50; + $data = []; + for ($i = 0; $i < $n; $i++) { + $row = [ + 'calle' => $this->faker->streetName, + 'numero' => $this->faker->randomNumber(5), + 'comuna' => $this->faker->randomElement($comunas), + 'extra' => '', + ]; + $extraRand = ((int) round(rand() / getrandmax())) === 1; + if ($extraRand) { + $nExtra = (int) round(rand(1, 3)); + $row['extra'] = $this->faker->words($nExtra, true); + } + $data[] = $row; + } + + $this->table('direccion') + ->insertValues($data) + ->save(); + } +} diff --git a/app/tests/extension/Seeds/Inmobiliarias.php b/app/tests/extension/Seeds/Inmobiliarias.php new file mode 100644 index 0000000..04b1238 --- /dev/null +++ b/app/tests/extension/Seeds/Inmobiliarias.php @@ -0,0 +1,39 @@ +loadValues('tipo_sociedad', columns: 'id'); + $suffixes = [ + 'Inmobiliaria ', + 'Administradora ', + 'Asesorías ', + '' + ]; + + $n = 5; + $data = []; + for ($i = 0; $i < $n; $i++) { + $rut = $this->faker->rut(false, false); + $abreviacion = $this->faker->streetName; + $suffix = $this->faker->randomElement($suffixes); + $razon = "{$suffix}{$abreviacion}"; + $sigla = strtoupper(substr($abreviacion, 0, 3)); + $data []= [ + 'rut' => $rut, + 'dv' => $this->faker->digitoVerificador($rut), + 'razon' => $razon, + 'abreviacion' => $abreviacion, + 'sigla' => $sigla, + 'sociedad' => $this->faker->randomElement($tipos), + ]; + } + $this->table('inmobiliaria') + ->insertValues($data) + ->save(); + } +} diff --git a/app/tests/extension/Seeds/Proyectos.php b/app/tests/extension/Seeds/Proyectos.php new file mode 100644 index 0000000..557e757 --- /dev/null +++ b/app/tests/extension/Seeds/Proyectos.php @@ -0,0 +1,40 @@ +loadValues('inmobiliaria', columns: 'rut'); + $direcciones = $this->loadValues('direccion', columns: 'id'); + + $n = 10; + $data = []; + for ($i = 0; $i < $n; $i++) { + $data[] = [ + 'inmobiliaria' => $this->faker->randomElement($inmobiliarias), + 'descripcion' => $this->faker->words(2, true), + 'direccion' => $this->faker->randomElement($direcciones), + 'superficie_sobre_nivel' => $this->faker->randomFloat(2, 1000, 10000), + 'superficie_bajo_nivel' => $this->faker->randomFloat(2, 0, 5000), + 'pisos' => $this->faker->randomNumber(2), + 'subterraneos' => $this->faker->randomNumber(2), + 'corredor' => $this->faker->randomFloat(4, 0, 1) + ]; + } + + $this->table('proyecto') + ->insertValues($data) + ->save(); + } +} diff --git a/app/tests/extension/TestSeeder.php b/app/tests/extension/TestSeeder.php new file mode 100644 index 0000000..2acccdb --- /dev/null +++ b/app/tests/extension/TestSeeder.php @@ -0,0 +1,70 @@ +getSeedClasses(); + $orderedSeeds = $this->orderedSeeds($seedClasses); + foreach ($orderedSeeds as $seed) { + $seed->run(); + } + } + + protected function getSeedClasses(): array + { + $seedsFolder = implode(DIRECTORY_SEPARATOR, [__DIR__, 'Seeds']); + $files = new FilesystemIterator($seedsFolder, FilesystemIterator::SKIP_DOTS); + $seeds = []; + foreach ($files as $file) { + $seeds []= $this->buildClassName($file->getBasename('.php')); + } + return $seeds; + } + protected function getSeed(string $seedClassName): SeedInterface + { + return new $seedClassName($this->connection); + } + + protected function buildClassName(string $fileBaseName): string + { + $namespace = implode('\\', [__NAMESPACE__, 'Seeds']); + return implode('\\', [$namespace, $fileBaseName]); + } + + protected function orderedSeeds(array $seedClasses): array + { + $orderedSeeds = []; + foreach ($seedClasses as $seedClassName) { + $seed = $this->getSeed($seedClassName); + if ($seed->getDependencies() === []) { + $orderedSeeds[$seedClassName] = $seed; + continue; + } + $orderedSeeds = array_merge($orderedSeeds, $this->orderedDependencies($orderedSeeds, $seedClasses, $seedClassName)); + } + return $orderedSeeds; + } + + protected function orderedDependencies(array $orderedSeeds, array $seedClasses, string $seedClassName): array + { + $seed = $this->getSeed($seedClassName); + $dependencies = $seed->getDependencies(); + foreach ($dependencies as $dependencyClass) { + if (!array_key_exists($dependencyClass, $orderedSeeds)) { + $orderedSeeds = array_merge($orderedSeeds, $this->orderedDependencies($orderedSeeds, $seedClasses, $dependencyClass)); + } + } + if (!array_key_exists($seedClassName, $orderedSeeds)) { + $orderedSeeds[$seedClassName] = $seed; + } + return $orderedSeeds; + } +} diff --git a/app/tests/integration/API/Ventas/MediosPago/TokuTest.php b/app/tests/integration/API/Ventas/MediosPago/TokuTest.php new file mode 100644 index 0000000..8b23eda --- /dev/null +++ b/app/tests/integration/API/Ventas/MediosPago/TokuTest.php @@ -0,0 +1,28 @@ +addProvider(new Rut($faker)); $pagoData = [ 'fecha' => '2022-01-01', 'valor' => 10000, @@ -37,31 +42,65 @@ class QueueTest extends TestCase $pago = $pagoService->getById($pago->id); $this->assertNotEquals(0.0, $pago->uf); - $comunaRepository = $this->container->get(Repository\Comuna::class); - $comunas = $comunaRepository->fetchAll(); - $id = $faker->numberBetween(0, count($comunas) - 1); - $comuna = $comunas[$id]; - $direccionData = [ - 'calle' => $faker->streetName, - 'numero' => $faker->buildingNumber, - 'comuna' => $comuna->id - ]; + $direccionRepository = $this->container->get(Repository\Direccion::class); + $direcciones = $direccionRepository->fetchAll(); + $direccion = $faker->randomElement($direcciones); + $rut = $faker->rut(false, false); $propietarioData = [ - 'rut' => $faker->numberBetween(10000000, 99999999), - 'nombre' => $faker->name, + 'rut' => $rut, + 'dv' => $faker->digitoVerificador($rut), + 'direccion' => $direccion->id, + 'nombres' => $faker->firstName, 'apellido_paterno' => $faker->lastName, 'apellido_materno' => $faker->lastName, + 'email' => $faker->email, + 'telefono' => $faker->randomNumber(9), ]; $propietarioRepository = $this->container->get(Repository\Venta\Propietario::class); $propietario = $propietarioRepository->create($propietarioData); $propietario = $propietarioRepository->save($propietario); + $proyectoRepository = $this->container->get(Repository\Proyecto::class); + $proyectos = $proyectoRepository->fetchAll(); + $proyecto = $faker->randomElement($proyectos); + $tipoUnidadRepository = $this->container->get(Repository\Proyecto\TipoUnidad::class); + $tiposUnidades = $tipoUnidadRepository->fetchAll(); + $tipoUnidad = $faker->randomElement($tiposUnidades); + $proyectoTipoUnidadData = [ + 'proyecto' => $proyecto->id, + 'tipo' => $tipoUnidad->id, + 'nombre' => $faker->word, + 'descripcion' => $faker->sentence, + 'abreviacion' => substr($faker->word, 0, 1), + 'logia' => $faker->randomFloat(2, 1, 20), + 'terraza' => $faker->randomFloat(2, 1, 20), + 'm2' => $faker->randomFloat(2, 20, 100), + ]; + $proyectoTipoUnidadRepository = $this->container->get(Repository\Proyecto\ProyectoTipoUnidad::class); + $proyectoTipoUnidad = $proyectoTipoUnidadRepository->create($proyectoTipoUnidadData); + $proyectoTipoUnidad = $proyectoTipoUnidadRepository->save($proyectoTipoUnidad); + $unidadData = [ + 'proyecto' => $proyecto->id, + 'tipo' => $tipoUnidad->id, + 'piso' => $faker->numberBetween(1, 300), + 'descripcion' => "{$tipoUnidad->descripcion} {$faker->numberBetween(1, 300)}", + 'orientacion' => $faker->randomElement(['N', 'NE', 'NO', 'S', 'SE', 'SO', 'E', 'O']), + 'pt' => $proyectoTipoUnidad->id, + ]; + $unidadRepository = $this->container->get(Repository\Venta\Unidad::class); + $unidad = $unidadRepository->create($unidadData); + $unidad = $unidadRepository->save($unidad); + $propiedadData = [ + 'unidad_principal' => $unidad->id, + ]; $propiedadRepository = $this->container->get(Repository\Venta\Propiedad::class); - $propiedad = $propiedadRepository->create(); + $propiedad = $propiedadRepository->create($propiedadData); $propiedad = $propiedadRepository->save($propiedad); + $fecha = $faker->date; $ventaData = [ - 'fecha' => '2022-01-01', + 'fecha' => $fecha, 'propietario' => $propietario->rut, 'propiedad' => $propiedad->id, + 'fecha_ingreso' => new DateTimeImmutable($fecha)->add(new DateInterval('P3D'))->format('Y-m-d'), ]; $ventaRepository = $this->container->get(Repository\Venta::class); $venta = $ventaRepository->create($ventaData); @@ -83,4 +122,4 @@ class QueueTest extends TestCase $cuota = $cuotaService->getById($cuota->id); $this->assertNotEquals(0.0, $cuota->pago->uf); } -} \ No newline at end of file +} diff --git a/bin/test-app.bat b/bin/test-app.bat new file mode 100644 index 0000000..25adabc --- /dev/null +++ b/bin/test-app.bat @@ -0,0 +1,3 @@ +@echo off + +docker compose --profile testing run --rm -it testing bin/phpunit %*