{"id":16509,"date":"2024-05-15T09:50:24","date_gmt":"2024-05-15T15:50:24","guid":{"rendered":"https:\/\/sada.services\/?p=16509"},"modified":"2024-05-15T10:19:47","modified_gmt":"2024-05-15T16:19:47","slug":"sigesa-maestro-detalle","status":"publish","type":"post","link":"https:\/\/sada.services\/?p=16509","title":{"rendered":"SIGESA: Maestro detalle"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li>Aqu\u00ed vamos a explicar como crear un maestro detalle don de maestro es POAI y productoPOAI es un detalle<\/li>\n\n\n\n<li>En BD<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"436\" height=\"744\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_529.png\" alt=\"\" class=\"wp-image-16511\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_529.png 436w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_529-176x300.png 176w\" sizes=\"(max-width: 436px) 100vw, 436px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Actualmente el maestro POAI es esta en funcionamiento solo le agregamos su hijo<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Domain: ProductoPOAI<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (c) 2022.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * http:\/\/www.una.ac.cr\n *\n *\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.domain;\n\nimport java.util.List;\n\nimport javax.persistence.AttributeOverride;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\nimport javax.persistence.OneToMany;\nimport javax.persistence.SequenceGenerator;\nimport javax.persistence.Table;\nimport cr.ac.una.cgi.sdkuna.domain.CampoConfigurable;\nimport cr.ac.una.cgi.sdkuna.domain.Usuario;\nimport cr.ac.una.cgi.sdkuna.generic.BaseEntity;\nimport cr.ac.una.cgi.sigesa.epf.cpr.domain.ProgramaPresupuestario;\n\n\/**\n * Entity para la administraci\u00f3n de la entidad {@link ProductoPOAI}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\u00b4\n * @version 0.0.1\n * @since 13\/05\/2024\n *\/\n@Entity\n@Table(name = \"PRODUCTO_POAI\")\n@AttributeOverride(name = \"id\", column\n        = @Column(name = \"ID_PRODUCTO_POAI\"))\n@SequenceGenerator(name = \"sequence\", sequenceName = \"SQ_PRODUCTO_POAI\", allocationSize = 1)\npublic class ProductoPOAI extends BaseEntity&lt;Usuario, CampoConfigurable> {\n\n    public ProductoPOAI() {\n    }\n\n    @ManyToOne\n    @JoinColumn(name = \"PLAN_OPERATIVO_ANUAL_INST\")\n    private PlanOperativoAnualInstitucional planOperativoAnualInstitucional;\n\n    @ManyToOne\n    @JoinColumn(name = \"PROGRAMA_PRESUPUESTARIO\")\n    private ProgramaPresupuestario programaPresupuestario;\n    \n    @Column(name = \"CODIGO\")\n    private Integer codigo;\n    \n    @Column(name = \"DESCRIPCION\")\n    private String descripcion;  \n    \n    @ManyToOne(fetch = FetchType.LAZY)\n    @JoinColumn(name = \"PRODUCTO_POAI_ORIGEN\")\n    private ProductoPOAI productoPOAIOrigen; \n    \n    public PlanOperativoAnualInstitucional getPlanOperativoAnualInstitucional() {\n        return planOperativoAnualInstitucional;\n    }\n\n    public void setPlanOperativoAnualInstitucional(PlanOperativoAnualInstitucional planOperativoAnualInstitucional) {\n        this.planOperativoAnualInstitucional = planOperativoAnualInstitucional;\n    }\n\n    public ProgramaPresupuestario getProgramaPresupuestario() {\n        return programaPresupuestario;\n    }\n\n    public void setProgramaPresupuestario(ProgramaPresupuestario programaPresupuestario) {\n        this.programaPresupuestario = programaPresupuestario;\n    }\n\n    public Integer getCodigo() {\n        return codigo;\n    }\n\n    public void setCodigo(Integer codigo) {\n        this.codigo = codigo;\n    }\n\n    public String getDescripcion() {\n        return descripcion;\n    }\n\n    public void setDescripcion(String descripcion) {\n        this.descripcion = descripcion;\n    }\n\n    public ProductoPOAI getProductoPOAIOrigen() {\n        return productoPOAIOrigen;\n    }\n\n    public void setProductoPOAIOrigen(ProductoPOAI productoPOAIOrigen) {\n        this.productoPOAIOrigen = productoPOAIOrigen;\n    }\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Repository: ProductoPOAIRepository<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (c) 2022.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * http:\/\/www.una.ac.cr\n *\n *\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.repository;\n\nimport org.springframework.stereotype.Repository;\nimport cr.ac.una.cgi.sdkuna.generic.GenericRepository;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\n\n\/**\n * Repository para la administraci\u00f3n de la entidad {@link ProductoPOAI}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @version 0.0.1\n * @since 13\/05\/2024\n *\/\n@Repository\npublic interface ProductoPOAIRepository extends GenericRepository&lt;ProductoPOAI> {\n\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Service: ProductoService<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (c) 2022.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * http:\/\/www.una.ac.cr\n *\n *\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.service;\n\nimport java.util.List;\n\nimport cr.ac.una.cgi.sdkuna.api.service.EntityService;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\n\n\/**\n * Interface para la administraci\u00f3n de la entidad {@link ProductoPOAI}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @version 0.0.1\n * @since 13\/05\/2024\n *\/\npublic interface ProductoPOAIService extends EntityService&lt;ProductoPOAI> {\n    public List&lt;ProductoPOAI> ordenaProductoPOAIByCodigo(List&lt;ProductoPOAI> listaProductoPOAI);\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ServiceImpl: ProductoServiceImpl<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (c) 2022.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * http:\/\/www.una.ac.cr\n *\n *\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.service;\n\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\nimport cr.ac.una.cgi.sdkuna.api.service.EntityServiceImpl;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.repository.ProductoPOAIRepository;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\n\/**\n * Clase que implementa el servicio {@link ProductoPOAIService} para la entidad\n * {@link ProductoPOAI}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @version 0.0.1\n * @since 13\/05\/2024\n *\/\n@Service\n@Transactional\npublic class ProductoPOAIServiceImpl extends EntityServiceImpl&lt;ProductoPOAI, ProductoPOAIRepository> implements ProductoPOAIService {\n\n    @Override\n    public List&lt;ProductoPOAI> ordenaProductoPOAIByCodigo(List&lt;ProductoPOAI> listaProductoPOAI) {\n        Collections.sort(listaProductoPOAI, new Comparator&lt;ProductoPOAI>() {\n\n            @Override\n            public int compare(ProductoPOAI op1, ProductoPOAI op2) {\n                return op1.getCodigo().compareTo(op2.getCodigo());\n            }\n        });\n        return listaProductoPOAI;\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Bean ASER: ProductoPOAIBean<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es de tipo ASER por que es un hijo y no un CRUD<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (C) 2021.\n *\n * Centro de Gestion Informatica\n * Direccion de Tecnologias de la Informacion y Comunicacion\n * Universidad Nacional - Costa Rica\n * http:\/\/www.una.ac.cr\n * \n *\/\npackage cr.ac.una.cgi.sigesa.ppi.ppo.view.model;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport javax.annotation.PostConstruct;\nimport org.springframework.context.annotation.Scope;\nimport org.springframework.stereotype.Component;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASER;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASERColumn;\nimport cr.ac.una.cgi.sdkuna.view.commons.ASERImpl;\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\n\n\/**\n * Spring Bean Session para la administraci\u00f3n de la entidad {@link ProductoPOAI}\n *\n * @author Gustavo Matamoros Gonz\u00e1lez\n * @version 0.0.1\n * @since 13\/05\/2024\n *\/\n@Component\n@Scope(\"session\")\npublic class ProductoPOAIBean extends ASERImpl&lt;ProductoPOAI> implements ASER {\n\n    public ProductoPOAIBean() {\n    }\n\n    @PostConstruct\n    public void init() {\n\n        List&lt;ASERColumn> columns = new ArrayList&lt;>();\n        \n        \n        columns.add(new ASERColumn(\"codigo\", getI18n(\"productoPOAI_codigo_label\"), true));\n        columns.add(new ASERColumn(\"descripcion\", getI18n(\"productoPOAI_descripcion_label\"), true));\n\n        this.setColumnsDetails(columns);\n    }\n\n    public void initProperties() {\n\n        if (!isPostBack()) {\n\n        }\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Crear relaci\u00f3n maestro detalle<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lo primero que debemos hacer es crear una lista de los hijos dentro del domain del maestro<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Domain: POAI<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Creamos la lista\n@OneToMany(fetch = FetchType.LAZY, mappedBy = \"planOperativoAnualInstitucional\")\n    private List&lt;ProductoPOAI> listaProductosPOAI;\n\n# GET y SET\npublic List&lt;ProductoPOAI> getListaProductosPOAI() {\n        return listaProductosPOAI;\n    }\n\n    public void setListaProductosPOAI(List&lt;ProductoPOAI> listaProductosPOAI) {\n        this.listaProductosPOAI = listaProductosPOAI;\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Donde <strong>mappedBy = \u00abplanOperativoAnualInstitucional\u00bb<\/strong> es el nombre de campo donde productoPOAI relaciona el POAI<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"436\" height=\"744\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_529-1.png\" alt=\"\" class=\"wp-image-16513\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_529-1.png 436w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_529-1-176x300.png 176w\" sizes=\"(max-width: 436px) 100vw, 436px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>En la clase<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"383\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_530-1024x383.png\" alt=\"\" class=\"wp-image-16514\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_530-1024x383.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_530-300x112.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_530-768x288.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_530.png 1135w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora los productos tienen que venir ordenados por c\u00f3digo, por eso en el service de Porducto esta esta funci\u00f3n que ordena<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public List&lt;ProductoPOAI> ordenaProductoPOAIByCodigo(List&lt;ProductoPOAI> listaProductoPOAI);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Service Maestro: POAI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agregamos el metodo que ordena<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># import\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\n\n\/**\n         * Retorna una lista de Produtos POAI Ordenados\n         * \n         * @author Gustavo Matamoros Gonz\u00e1lez\n         * @issue PPI-500 \n         * @since 14\/05\/2024\n         * @param listaProductoPOAI\n         *\/\n        public List&lt;ProductoPOAI> ordenaProductoPOAIByCodigo(List&lt;ProductoPOAI> listaProductoPOAI);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">ServiceImpl: POAI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code># import\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\n\n# Autowired\n@Autowired\n    ProductoPOAIService productoPOAIService;\n\n# metodo\n@Override\n    public List&lt;ProductoPOAI> ordenaProductoPOAIByCodigo(List&lt;ProductoPOAI> listaProductoPOAI){\n            return productoPOAIService.ordenaProductoPOAIByCodigo(listaProductoPOAI);\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Bean: POAI<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora hacemos los cambios necesarios para que POAI cargue los ProductosPOAI<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>#import\nimport cr.ac.una.cgi.sigesa.ppi.ppo.domain.ProductoPOAI;\n\n# autowired del bean\n@Autowired\n    ProductoPOAIBean productoPOAIBean;\n\n# listas para obtener los Productos y filtrarlo\n private List&lt;ProductoPOAI> productoPOAIList = new ArrayList&lt;>();\n    private List&lt;ProductoPOAI> productoPOAIFilteredList = new ArrayList&lt;>();\n\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li># initProperties() : indicamos que si es nuevo el POAI cree una lista vacia de productos<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>this.getEntity().setListaProductosPOAI(new ArrayList());<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Asi<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void initProperties() {\n        if (!isPostBack()) {\n   \n            \n            if (this.getEntity().getId() != null) {\n             \n            } else {\n                this.getEntity().setListaObjetivosPOAI(new ArrayList());\n                this.getEntity().setListaProductosPOAI(new ArrayList());\n            }\n                     \n        }\n\n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora en initDetails mandamos a cargar la lista con los datos de la entidad y inicializamos el bean<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Cargar Productos\n            this.getEntity().setListaProductosPOAI(productoPOAIBean.setDetails(this.getEntity().getListaProductosPOAI()));            \n            this.productoPOAIList.addAll(this.getEntity().getListaProductosPOAI());          \n            productoPOAIBean.init();<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AS\u00ed<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void initDetails() {\n        if (!isPostBack()) {\n            \n\n            \/\/ Cargar Productos\n            this.getEntity().setListaProductosPOAI(productoPOAIBean.setDetails(this.getEntity().getListaProductosPOAI()));            \n            this.productoPOAIList.addAll(this.getEntity().getListaProductosPOAI());          \n            productoPOAIBean.init();\n            \n            \n        }\n       \n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora por la forma que esta programado donde el usuario puede cambiar de programa presupuestario<\/li>\n<\/ul>\n\n\n\n\n\n<ul class=\"wp-block-list\">\n<li>Debemos crear un metodo que actualice la lista para el evento onChange<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"479\" src=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_531-1024x479.png\" alt=\"\" class=\"wp-image-16519\" srcset=\"https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_531-1024x479.png 1024w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_531-300x140.png 300w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_531-768x359.png 768w, https:\/\/sada.services\/wp-content\/uploads\/2024\/05\/Seleccion_531.png 1198w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creamos el metodo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>public void actualizaProgramaPresupuestarioProductoFiltro() {\n\n        this.productoPOAIFilteredList.clear();\n        this.getEntity().getListaProductosPOAI().clear();\n\n        for (ProductoPOAI producto : this.productoPOAIList) {\n            if (producto.getProgramaPresupuestario().getId().equals(this.getProgramaPresupuestario().getId())) {\n                productoPOAIFilteredList.add(producto);\n            }\n        }\n\n        this.getEntity().setListaProductosPOAI(productoPOAIBean.setDetails(service.ordenaProductoPOAIByCodigo(productoPOAIFilteredList)));            \n        productoPOAIBean.init();\n        \n    }<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ahora modificamos el EditForm para agregar el tab del Hijo (Producto)<\/li>\n\n\n\n<li>Tenemos este tabView<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;p:tabView id=\"planOperativoAnualInstitucionalTabView\">\n                &lt;p:ajax event=\"tabChange\" process=\"@this\" \/><\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Y le agregamos el tab nuevo del hijo<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- TAB: PRODUCTOS-->\n                &lt;p:tab title=\"#{i18n.planOperativoAnualInstitucionalBean_productos_tab}\">\n                    &lt;p:panelGrid columns=\"1\" styleClass=\"una-panelgrid una-width-100\">\n\n                        &lt;p:outputPanel id=\"programasPresupuestariosProductosOutputPanel\">\n                            &lt;p:selectOneRadio value=\"#{planOperativoAnualInstitucionalBean.programaPresupuestario}\"\n                                disabled=\"#{false}\" id=\"selectOneProgramaPresupuestarioProducto\"\n                                onchange=\"#{planOperativoAnualInstitucionalBean.actualizaProgramaPresupuestarioProductoFiltro()}\"\n                                converter=\"#{programaPresupuestarioBean.converter}\">\n                                &lt;f:selectItems\n                                    value=\"#{planOperativoAnualInstitucionalBean.getListaProgramasPresupuestarios()}\"\n                                    var=\"prg\" itemLabel=\"#{prg.nombre}\" itemValue=\"#{prg}\" \/>\n                                &lt;p:ajax process=\"@this\" \n                                    update=\"@this, :formMantenimiento:planOperativoAnualInstitucionalTabView:productosPOAINoEditTable:dataTable\" \/>\n                            &lt;\/p:selectOneRadio>\n\n                        &lt;\/p:outputPanel>\n\n                        &lt;p:outputPanel id=\"productosPOAIOutputPanel\">\n                            &lt;components:detailNoEditTableHorizontal id=\"productosPOAINoEditTable\"\n                                                            bean=\"#{productoPOAIBean}\"\n                                                            masterBean=\"#{planOperativoAnualInstitucionalBean}\"\n                                                            container=\"planOperativoAnualInstitucionalTabView:\"\n                                                            showNewButton=\"#{true}\"\n                                                            editForm=\"productoEditForm\"                                                            \n                                                            header=\"#{i18n.planOperativoAnualInstitucional_productos_lista_label}\" \n                                                            showDeleteButton =\"#{true}\"\/>\n\n                        &lt;\/p:outputPanel>\n\n                    &lt;\/p:panelGrid>\n                &lt;\/p:tab><\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Domain: ProductoPOAI Repository: ProductoPOAIRepository Service: ProductoService ServiceImpl: ProductoServiceImpl Bean ASER: ProductoPOAIBean Crear relaci\u00f3n maestro detalle Domain: POAI Service Maestro: POAI ServiceImpl: POAI Bean: POAI<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[443],"tags":[625,624],"class_list":["post-16509","post","type-post","status-publish","format-standard","hentry","category-sigesa","tag-detalle","tag-maestro"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16509","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16509"}],"version-history":[{"count":5,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16509\/revisions"}],"predecessor-version":[{"id":16522,"href":"https:\/\/sada.services\/index.php?rest_route=\/wp\/v2\/posts\/16509\/revisions\/16522"}],"wp:attachment":[{"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16509"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=16509"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sada.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=16509"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}