diff --git a/src/main/java/com/imprimelibros/erp/paises/Paises.java b/src/main/java/com/imprimelibros/erp/paises/Paises.java new file mode 100644 index 0000000..3904924 --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/paises/Paises.java @@ -0,0 +1,82 @@ +package com.imprimelibros.erp.paises; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "paises") +public class Paises { + + @Id + @Column(name = "keyword", length = 64, nullable = false) + private String keyword; + + @Column(name = "code", length = 2, nullable = false, unique = true) + private String code; + + @Column(name = "code3", length = 3, nullable = false, unique = true) + private String code3; + + @Column(name = "currency", length = 3, nullable = false) + private String currency; + + // --- Getters & Setters --- + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getCode3() { + return code3; + } + + public void setCode3(String code3) { + this.code3 = code3; + } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + // --- toString, equals & hashCode --- + + @Override + public String toString() { + return "Paises{" + + "keyword='" + keyword + '\'' + + ", code='" + code + '\'' + + ", code3='" + code3 + '\'' + + ", currency='" + currency + '\'' + + '}'; + } + + @Override + public int hashCode() { + return keyword != null ? keyword.hashCode() : 0; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof Paises other)) return false; + return keyword != null && keyword.equals(other.keyword); + } +} diff --git a/src/main/java/com/imprimelibros/erp/paises/PaisesController.java b/src/main/java/com/imprimelibros/erp/paises/PaisesController.java new file mode 100644 index 0000000..18c7645 --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/paises/PaisesController.java @@ -0,0 +1,73 @@ +package com.imprimelibros.erp.paises; + +import org.springframework.context.MessageSource; +import org.springframework.web.bind.annotation.*; + +import java.text.Collator; +import java.util.*; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/paises") +public class PaisesController { + + private final PaisesRepository paisesRepository; + private final MessageSource messageSource; + + public PaisesController(PaisesRepository paisesRepository, MessageSource messageSource) { + this.paisesRepository = paisesRepository; + this.messageSource = messageSource; + } + + /** + * Compatible con Select2 (AJAX): + * - Soporta parámetros opcionales: + * - q / term : texto a buscar + * - lang : ej. "es", "en" (si se omite usa Locale actual) + * + * Respuesta: + * { "results": [ { "id": "espania", "text": "España" }, ... ] } + */ + @GetMapping + public Map getPaises( + @RequestParam(value = "q", required = false) String q1, + @RequestParam(value = "term", required = false) String q2, + Locale locale) { + + // Termino de búsqueda (Select2 usa 'q' o 'term' según versión/config) + String search = Optional.ofNullable(q1).orElse(q2); + if (search != null) { + search = search.trim(); + } + final String q = (search == null || search.isEmpty()) + ? null + : search.toLowerCase(locale); + + List all = paisesRepository.findAll(); + + // Mapear a opciones id/text con i18n y filtrar por búsqueda si llega + List> options = all.stream() + .map(cc -> { + String key = cc.getKeyword(); + String text = messageSource.getMessage("paises." + key, null, key, locale); + Map m = new HashMap<>(); + m.put("id", key); // lo normal en Select2: id = valor que guardarás (keyword) + m.put("text", text); // texto mostrado, i18n con fallback a keyword + return m; + }) + .filter(opt -> { + if (q == null || q.isEmpty()) + return true; + String text = opt.get("text").toLowerCase(locale); + String id = opt.get("id").toLowerCase(locale); + return text.contains(q) || id.contains(q); + }) + .sorted(Comparator.comparing(m -> m.get("text"), Collator.getInstance(locale))) + .collect(Collectors.toList()); + + // Estructura Select2 + Map resp = new HashMap<>(); + resp.put("results", options); + return resp; + } +} diff --git a/src/main/java/com/imprimelibros/erp/paises/PaisesRepository.java b/src/main/java/com/imprimelibros/erp/paises/PaisesRepository.java new file mode 100644 index 0000000..fd9bef6 --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/paises/PaisesRepository.java @@ -0,0 +1,16 @@ +package com.imprimelibros.erp.paises; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface PaisesRepository extends JpaRepository { + + Optional findByCode(String code); + + Optional findByCode3(String code3); + + Optional findByCurrency(String currency); +} diff --git a/src/main/java/com/imprimelibros/erp/paises/PaisesService.java b/src/main/java/com/imprimelibros/erp/paises/PaisesService.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/db/changelog/changesets/0003-create-paises.yml b/src/main/resources/db/changelog/changesets/0003-create-paises.yml new file mode 100644 index 0000000..da3e899 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/0003-create-paises.yml @@ -0,0 +1,52 @@ +databaseChangeLog: + - changeSet: + id: 0003-create-paises + author: jjo + changes: + - createTable: + tableName: paises + columns: + - column: + name: keyword + type: varchar(64) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_paises + - column: + name: code + type: char(2) + constraints: + nullable: false + - column: + name: code3 + type: char(3) + constraints: + nullable: false + - column: + name: currency + type: char(3) + constraints: + nullable: false + + - addUniqueConstraint: + tableName: paises + columnNames: code + constraintName: uq_paises_code + + - addUniqueConstraint: + tableName: paises + columnNames: code3 + constraintName: uq_paises_code3 + + - loadData: + tableName: paises + file: db/changelog/data/paises.csv + separator: "," + encoding: UTF-8 + quotchar: '"' + + rollback: + - dropTable: + tableName: paises + cascadeConstraints: true diff --git a/src/main/resources/db/changelog/data/paises.csv b/src/main/resources/db/changelog/data/paises.csv new file mode 100644 index 0000000..12cea57 --- /dev/null +++ b/src/main/resources/db/changelog/data/paises.csv @@ -0,0 +1,40 @@ +keyword,code,code3,currency +argentina,ar,arg,ARS +austria,at,aut,EUR +australia,au,aus,AUD +bosnia_herzegovina,ba,bih,BAM +belgica,be,bel,EUR +bulgaria,bg,bgr,BGN +canada,ca,can,CAD +suiza,ch,che,CHF +chile,cl,chl,CLP +colombia,co,col,COP +republica_checa,cz,cze,CZK +alemania,de,deu,EUR +dinamarca,dk,dnk,DKK +estonia,ee,est,EUR +espania,es,esp,EUR +finlandia,fi,fin,EUR +francia,fr,fra,EUR +reino_unido,gb,gbr,GBP +grecia,gr,grc,EUR +croacia,hr,hrv,EUR +hungria,hu,hun,HUF +irlanda,ie,irl,EUR +israel,il,isr,ILS +italia,it,ita,EUR +lituania,lt,ltu,EUR +luxemburgo,lu,lux,EUR +letonia,lv,lva,EUR +mexico,mx,mex,MXN +holanda,nl,nld,EUR +noruega,no,nor,NOK +peru,pe,per,PEN +polonia,pl,pol,PLN +portugal,pt,prt,EUR +rumania,ro,rou,RON +serbia,rs,srb,RSD +suecia,se,swe,SEK +eslovenia,si,svn,EUR +eslovaquia,sk,svk,EUR +eeuu,us,usa,USD diff --git a/src/main/resources/db/changelog/master.yml b/src/main/resources/db/changelog/master.yml index d57981d..f52abaa 100644 --- a/src/main/resources/db/changelog/master.yml +++ b/src/main/resources/db/changelog/master.yml @@ -2,4 +2,6 @@ databaseChangeLog: - include: file: db/changelog/changesets/0001-baseline.yml - include: - file: db/changelog/changesets/0002-create-pedidos.yml \ No newline at end of file + file: db/changelog/changesets/0002-create-pedidos.yml + - include: + file: db/changelog/changesets/0003-create-paises.yml \ No newline at end of file diff --git a/src/main/resources/i18n/paises_en.properties b/src/main/resources/i18n/paises_en.properties new file mode 100644 index 0000000..39efe2d --- /dev/null +++ b/src/main/resources/i18n/paises_en.properties @@ -0,0 +1,39 @@ +paises.argentina=Argentina +paises.austria=Austria +paises.australia=Australia +paises.bosnia_herzegovina=Bosnia and Herzegovina +paises.belgica=Belgium +paises.bulgaria=Bulgaria +paises.canada=Canada +paises.suiza=Switzerland +paises.chile=Chile +paises.colombia=Colombia +paises.republica_checa=Czech Republic +paises.alemania=Germany +paises.dinamarca=Denmark +paises.estonia=Estonia +paises.espania=Spain +paises.finlandia=Finland +paises.francia=France +paises.reino_unido=United Kingdom +paises.grecia=Greece +paises.croacia=Croatia +paises.hungria=Hungary +paises.irlanda=Ireland +paises.israel=Israel +paises.italia=Italy +paises.lituania=Lithuania +paises.luxemburgo=Luxembourg +paises.letonia=Latvia +paises.mexico=Mexico +paises.holanda=Netherlands +paises.noruega=Norway +paises.peru=Peru +paises.polonia=Poland +paises.portugal=Portugal +paises.rumania=Romania +paises.serbia=Serbia +paises.suecia=Sweden +paises.eslovenia=Slovenia +paises.eslovaquia=Slovakia +paises.eeuu=United States diff --git a/src/main/resources/i18n/paises_es.properties b/src/main/resources/i18n/paises_es.properties new file mode 100644 index 0000000..2036962 --- /dev/null +++ b/src/main/resources/i18n/paises_es.properties @@ -0,0 +1,39 @@ +paises.argentina=Argentina +paises.austria=Austria +paises.australia=Australia +paises.bosnia_herzegovina=Bosnia y Herzegovina +paises.belgica=Bélgica +paises.bulgaria=Bulgaria +paises.canada=Canadá +paises.suiza=Suiza +paises.chile=Chile +paises.colombia=Colombia +paises.republica_checa=República Checa +paises.alemania=Alemania +paises.dinamarca=Dinamarca +paises.estonia=Estonia +paises.espania=España +paises.finlandia=Finlandia +paises.francia=Francia +paises.reino_unido=Reino Unido +paises.grecia=Grecia +paises.croacia=Croacia +paises.hungria=Hungría +paises.irlanda=Irlanda +paises.israel=Israel +paises.italia=Italia +paises.lituania=Lituania +paises.luxemburgo=Luxemburgo +paises.letonia=Letonia +paises.mexico=México +paises.holanda=Países Bajos +paises.noruega=Noruega +paises.peru=Perú +paises.polonia=Polonia +paises.portugal=Portugal +paises.rumania=Rumanía +paises.serbia=Serbia +paises.suecia=Suecia +paises.eslovenia=Eslovenia +paises.eslovaquia=Eslovaquia +paises.eeuu=Estados Unidos