Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
ada:howto:sicoferp:factory:goodsoftwaredevelopmentpractices:org [2023/11/06 17:21] 192.168.177.82 |
ada:howto:sicoferp:factory:goodsoftwaredevelopmentpractices:org [2023/11/06 19:01] (actual) 192.168.177.82 |
||
---|---|---|---|
Línea 34: | Línea 34: | ||
===== Ejemplo práctico ===== | ===== Ejemplo práctico ===== | ||
+ | A continuación se comparte el siguiente gráfico de referencia que proponen una estructura de organización de un proyecto springboot. | ||
+ | {{ :ada:howto:sicoferp:factory:goodsoftwaredevelopmentpractices:org00.png?600 |}} | ||
+ | |||
+ | ==== Directorio: Config ==== | ||
+ | Contiene clases de configuración, donde configura los ajustes de la aplicación o otras configuraciones a nivel de aplicación. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package com.ada.viatico.proceso.config; | ||
+ | |||
+ | import java.util.List; | ||
+ | import java.util.TimeZone; | ||
+ | |||
+ | import javax.annotation.PostConstruct; | ||
+ | |||
+ | import org.slf4j.Logger; | ||
+ | import org.slf4j.LoggerFactory; | ||
+ | import org.springframework.beans.factory.annotation.Value; | ||
+ | import org.springframework.context.annotation.Bean; | ||
+ | import org.springframework.context.annotation.Configuration; | ||
+ | import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; | ||
+ | |||
+ | import io.swagger.v3.oas.models.OpenAPI; | ||
+ | import io.swagger.v3.oas.models.info.Contact; | ||
+ | import io.swagger.v3.oas.models.info.Info; | ||
+ | import io.swagger.v3.oas.models.info.License; | ||
+ | import io.swagger.v3.oas.models.servers.Server; | ||
+ | |||
+ | @Configuration | ||
+ | public class ViaticosConfig { | ||
+ | |||
+ | /** The log. */ | ||
+ | private static Logger log = LoggerFactory.getLogger(ViaticosConfig.class); | ||
+ | |||
+ | /** The url. */ | ||
+ | @Value("${openapi.url}") | ||
+ | private String url; | ||
+ | |||
+ | /** The application title. */ | ||
+ | @Value("${application.title}") | ||
+ | private String applicationTitle; | ||
+ | |||
+ | /** The application summary. */ | ||
+ | @Value("${application.version}") | ||
+ | private String applicationVersion; | ||
+ | |||
+ | @PostConstruct | ||
+ | public void init() { | ||
+ | log.info("Establicendo Zona Horaria..."); | ||
+ | TimeZone.setDefault(TimeZone.getTimeZone("America/Bogota")); | ||
+ | log.info("Zona Horaria establecida a {}", TimeZone.getDefault().getID()); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Property sources placeholder configurer. | ||
+ | * | ||
+ | * @return the property sources placeholder configurer | ||
+ | */ | ||
+ | @Bean | ||
+ | public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { | ||
+ | return new PropertySourcesPlaceholderConfigurer(); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * My open API. | ||
+ | * | ||
+ | * @return the open API | ||
+ | */ | ||
+ | @Bean | ||
+ | public OpenAPI myOpenAPI() { | ||
+ | Server server = new Server(); | ||
+ | server.setUrl(url); | ||
+ | server.setDescription("Server URL environment"); | ||
+ | |||
+ | Contact contact = new Contact(); | ||
+ | contact.setEmail("carlos.torres@ada.co; daniel.lopez@ada.co"); | ||
+ | contact.setName("Carlos Torres | Daniel López"); | ||
+ | contact.setUrl("www.ada.co"); | ||
+ | |||
+ | License mitLicense = new License().name("ADA License").url("www.ada.co/licenses/"); | ||
+ | |||
+ | Info info = new Info() | ||
+ | .title(applicationTitle) | ||
+ | .version("v" + applicationVersion) | ||
+ | .summary("Microservicio para gestionar Viáticos.") | ||
+ | .description("Servicio que realiza las operaciones de creación/aprobación de Solicitudes y Legalización de Viáticos.") | ||
+ | .contact(contact) | ||
+ | .termsOfService("https://www.ada.co/terms") | ||
+ | .license(mitLicense); | ||
+ | |||
+ | return new OpenAPI().info(info).servers(List.of(server)); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Directorio: Controller ==== | ||
+ | Contiene sus clases de controlador RESTful. Estas clases manejan solicitudes HTTP entrantes y definen los puntos finales de la API. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package com.ada.viatico.proceso.controller.v2; | ||
+ | |||
+ | import org.slf4j.Logger; | ||
+ | import org.slf4j.LoggerFactory; | ||
+ | import org.springframework.beans.factory.annotation.Autowired; | ||
+ | import org.springframework.http.HttpStatus; | ||
+ | import org.springframework.http.ResponseEntity; | ||
+ | import org.springframework.web.bind.annotation.CrossOrigin; | ||
+ | import org.springframework.web.bind.annotation.PostMapping; | ||
+ | import org.springframework.web.bind.annotation.RequestBody; | ||
+ | import org.springframework.web.bind.annotation.RequestMapping; | ||
+ | import org.springframework.web.bind.annotation.RequestMethod; | ||
+ | import org.springframework.web.bind.annotation.RestController; | ||
+ | |||
+ | import com.ada.viatico.proceso.dto.DatosGenerarAprobacion; | ||
+ | import com.ada.viatico.proceso.dto.GenericResponseDto; | ||
+ | import com.ada.viatico.proceso.repository.IMestroCompromisoRepo; | ||
+ | import com.ada.viatico.proceso.service.Impl.TicketsImp; | ||
+ | import com.ada.viatico.proceso.service.Impl.ViaticoSolicitudImpl; | ||
+ | import com.ada.viatico.proceso.service.v2.ViaticosServiceV2; | ||
+ | import com.ada.viatico.proceso.sfcomercial.dto.AprobacionLegalizacionDto; | ||
+ | import com.ada.viatico.proceso.utiliti.AdelantoSolicitud; | ||
+ | import com.ada.viatico.proceso.utiliti.GuardarLegalizacion; | ||
+ | import com.ada.viatico.proceso.utiliti.ProcesoGuardar; | ||
+ | import com.ada.viatico.proceso.utiliti.ProcesoViaticoAprobacion; | ||
+ | import com.ada.viatico.proceso.utiliti.ViaticosException; | ||
+ | |||
+ | import io.swagger.v3.oas.annotations.Operation; | ||
+ | import io.swagger.v3.oas.annotations.Parameter; | ||
+ | import io.swagger.v3.oas.annotations.enums.ParameterIn; | ||
+ | import io.swagger.v3.oas.annotations.media.Content; | ||
+ | import io.swagger.v3.oas.annotations.media.Schema; | ||
+ | import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||
+ | |||
+ | /** | ||
+ | * The Class ViaticosController. | ||
+ | * @version 2.0 | ||
+ | * @author carlos.torres@ada.co | ||
+ | */ | ||
+ | @CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.DELETE}) | ||
+ | @RestController | ||
+ | @RequestMapping("v2") | ||
+ | public class ViaticosControllerV2 { | ||
+ | |||
+ | /** The log. */ | ||
+ | private Logger log = LoggerFactory.getLogger(ViaticosControllerV2.class); | ||
+ | |||
+ | /** The ticketsimpl. */ | ||
+ | @Autowired | ||
+ | TicketsImp ticketsimpl; | ||
+ | |||
+ | /** The guardar. */ | ||
+ | @Autowired | ||
+ | ProcesoGuardar guardar; | ||
+ | |||
+ | /** The aprobacion. */ | ||
+ | @Autowired | ||
+ | ProcesoViaticoAprobacion aprobacion; | ||
+ | |||
+ | /** The solicitud repo. */ | ||
+ | @Autowired | ||
+ | ViaticoSolicitudImpl solicitudRepo; | ||
+ | |||
+ | /** The savelega. */ | ||
+ | @Autowired | ||
+ | GuardarLegalizacion savelega; | ||
+ | |||
+ | /** The repo compromiso. */ | ||
+ | @Autowired | ||
+ | IMestroCompromisoRepo repoCompromiso; | ||
+ | |||
+ | /** The solicitud adelanto. */ | ||
+ | @Autowired | ||
+ | AdelantoSolicitud solicitudAdelanto; | ||
+ | |||
+ | /** The viaticos service. */ | ||
+ | @Autowired | ||
+ | ViaticosServiceV2 viaticosServiceV2; | ||
+ | |||
+ | /** | ||
+ | * Aprobar legalizacion. | ||
+ | * | ||
+ | * @param aprobacionLegalizacionDto the aprobacion legalizacion dto | ||
+ | * @return the response entity | ||
+ | * @throws ViaticosException the viaticos exception | ||
+ | */ | ||
+ | @Operation(summary = "Aprobar Legalización.", description = "Aprueba la Legalización de un Viático.") | ||
+ | @ApiResponse(responseCode = "201", content = { @Content(schema = @Schema(implementation = GenericResponseDto.class)) }) | ||
+ | @ApiResponse(responseCode = "500", content = { @Content(schema = @Schema(implementation = ViaticosException.class)) }) | ||
+ | @Parameter(name = "aprobacionLegalizacionDto", description = "Componente que contiene los parametros necesarios para el proceso de legalización.", in = ParameterIn.QUERY, required = true) | ||
+ | @PostMapping("/aprobarlegalizacion") | ||
+ | public ResponseEntity<GenericResponseDto> aprobarLegalizacion(@RequestBody AprobacionLegalizacionDto aprobacionLegalizacionDto) throws ViaticosException { | ||
+ | var result = viaticosServiceV2.aprobarLegalizacion(aprobacionLegalizacionDto); | ||
+ | if(result.getCode() == -1L) { | ||
+ | log.info("approve legalization executed with errors."); | ||
+ | return new ResponseEntity<>(result, HttpStatus.INTERNAL_SERVER_ERROR); | ||
+ | } | ||
+ | log.info("approve legalization executed correctly."); | ||
+ | return new ResponseEntity<>(result, HttpStatus.CREATED); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Guardar viatico. | ||
+ | * | ||
+ | * @param datos the datos | ||
+ | * @return the response entity | ||
+ | * @throws ViaticosException the viaticos exception | ||
+ | */ | ||
+ | @Operation(summary = "Aprobar Solicitud.", description = "Aprueba la solicitud de un Viático.") | ||
+ | @ApiResponse(responseCode = "201", content = { @Content(schema = @Schema(implementation = GenericResponseDto.class)) }) | ||
+ | @ApiResponse(responseCode = "500", content = { @Content(schema = @Schema(implementation = ViaticosException.class)) }) | ||
+ | @Parameter(name = "datos", description = "Componente que contiene los parametros necesarios para el proceso de solicitud.", in = ParameterIn.QUERY, required = true) | ||
+ | @PostMapping("/generaraprobacion") | ||
+ | public ResponseEntity<GenericResponseDto> guardarViatico(@RequestBody DatosGenerarAprobacion datos) throws ViaticosException { | ||
+ | var result = viaticosServiceV2.aprobarSolicitud(datos); | ||
+ | if(result.getCode() == -1L) return new ResponseEntity<>(result, HttpStatus.SERVICE_UNAVAILABLE); | ||
+ | return new ResponseEntity<>(result, HttpStatus.CREATED); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Directorio: DBConnect ==== | ||
+ | Contiene sus clases para permitir conexiones multicliente y modelo multiempresa. | ||
+ | |||
+ | ==== Directorio: DTO(Objeto de transferencia de datos) ==== | ||
+ | Un DTO es un patrón de diseño utilizado para transferir datos entre diferentes capas o componentes de una aplicación. El objetivo principal de un DTO es encapsular datos y proporcionar una estructura de datos simple que pueda transmitirse fácilmente por la aplicación. Los DTO se utilizan a menudo para transferir datos entre el front-end y el back-end de una aplicación web, entre microservicios o entre diferentes capas de una aplicación, como la capa de servicio y la capa de presentación. | ||
+ | |||
+ | === Características de una DTO === | ||
+ | * Por lo general, contiene solo campos privados con captadores y definidores para acceder a los datos. | ||
+ | * Los DTO no contienen ninguna lógica empresarial y su objetivo principal es transportar datos. | ||
+ | * A menudo se utilizan para representar un subconjunto de datos de una entidad o una combinación de datos de varias entidades. | ||
+ | * Los DTO ayudan a reducir la cantidad de datos transferidos a través de la red, mejorando el rendimiento al evitar el intercambio excesivo de datos. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package com.ada.viatico.proceso.sfcomercial.dto; | ||
+ | |||
+ | import java.io.Serializable; | ||
+ | |||
+ | import io.swagger.v3.oas.annotations.media.Schema; | ||
+ | import lombok.Data; | ||
+ | |||
+ | /** | ||
+ | * Instantiates a new afectacion presupuestal dto. | ||
+ | */ | ||
+ | @Schema(description = "Dto que contiene la configuración de afectación presupuestal de un rubro de una disponibilidad..") | ||
+ | @Data | ||
+ | public class AfectacionPresupuestalDto implements Serializable { | ||
+ | |||
+ | /** The Constant serialVersionUID. */ | ||
+ | private static final long serialVersionUID = -7167570415608375973L; | ||
+ | |||
+ | /** The cod disponibilidad. */ | ||
+ | @Schema(description = "Código de la disponibilidad.") | ||
+ | Long codDisponibilidad; | ||
+ | |||
+ | /** The codigo rubro. */ | ||
+ | @Schema(description = "Código del rubro.") | ||
+ | Long codigoRubro; | ||
+ | |||
+ | /** The valor. */ | ||
+ | @Schema(description = "Valor de afectación del rubro prespuestal.") | ||
+ | Long valor; | ||
+ | |||
+ | /** The cod C costos. */ | ||
+ | @Schema(description = "Código del centro de costos.") | ||
+ | Long codCCostos; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Directorio: Entity / Model ==== | ||
+ | La carpeta del modelo almacena modelos de datos o entidades que representan la estructura y el comportamiento del dominio de la aplicación. Estas clases se asignan a tablas, vistas o consultas de bases de datos y definen las propiedades y relaciones de los datos de la aplicación. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package com.ada.viatico.proceso.entity; | ||
+ | |||
+ | import java.util.Date; | ||
+ | |||
+ | import javax.persistence.Column; | ||
+ | import javax.persistence.Entity; | ||
+ | import javax.persistence.Id; | ||
+ | import javax.persistence.Table; | ||
+ | |||
+ | import lombok.Data; | ||
+ | |||
+ | /** | ||
+ | * Instantiates a new comprobante de egreso. | ||
+ | */ | ||
+ | @Data | ||
+ | @Entity | ||
+ | @Table(schema = "TESORE01",name = "COMPROBANTE_DE_EGRESO") | ||
+ | public class ComprobanteDeEgreso { | ||
+ | |||
+ | /** The cod inter comprobante egreso. */ | ||
+ | @Id | ||
+ | @Column(name="COD_INTER_COMPROBANTE_EGRESO") | ||
+ | private Long codInterComprobanteEgreso; | ||
+ | |||
+ | /** The consecutivo. */ | ||
+ | @Column(name="CONSECUTIVO") | ||
+ | private Long consecutivo; | ||
+ | |||
+ | /** The tipo. */ | ||
+ | @Column(name="TIPO") | ||
+ | private String tipo; | ||
+ | |||
+ | /** The estado. */ | ||
+ | @Column(name="ESTADO") | ||
+ | private String estado; | ||
+ | |||
+ | /** The fecha elaboracion. */ | ||
+ | @Column(name="FECHA_ELABORACION") | ||
+ | private Date fechaElaboracion; | ||
+ | |||
+ | /** The fecha impresion. */ | ||
+ | @Column(name="FECHA_IMPRESION") | ||
+ | private Date fechaImpresion; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Directorio: Repository ==== | ||
+ | Contiene clases de repositorio que se ocupan del acceso a datos. Estas clases suelen utilizar un marco ORM (Object-Relational Mapping) o JPA (Java Persistence API) para interactuar con la base de datos. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package co.ada.sicof.mobile.repository; | ||
+ | |||
+ | import co.ada.core.db.config.repository.JpaAdaRepository; | ||
+ | import co.ada.sicof.mobile.entity.Empresa; | ||
+ | |||
+ | /** | ||
+ | * The Interface EmpresaRepository. | ||
+ | */ | ||
+ | public interface EmpresaRepository extends JpaAdaRepository<Empresa, Long> { | ||
+ | |||
+ | /** | ||
+ | * Find by codigo empresa. | ||
+ | * | ||
+ | * @param codigoEmpresa the codigo empresa | ||
+ | * @return the empresa | ||
+ | */ | ||
+ | public Empresa findByCodigoEmpresa(Long codigoEmpresa); | ||
+ | |||
+ | /** | ||
+ | * Find by codigo mempresa. | ||
+ | * | ||
+ | * @param codigoMempresa the codigo mempresa | ||
+ | * @return the empresa | ||
+ | */ | ||
+ | public Empresa findByCodigoMempresa(String codigoMempresa); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Directorio: Service ==== | ||
+ | Contiene clases de servicio que implementan la lógica empresarial. Los controladores utilizan estos servicios para realizar operaciones con datos. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package com.ada.viatico.proceso.service.v2; | ||
+ | |||
+ | import org.slf4j.Logger; | ||
+ | import org.slf4j.LoggerFactory; | ||
+ | import org.springframework.beans.factory.annotation.Autowired; | ||
+ | import org.springframework.stereotype.Service; | ||
+ | import org.springframework.transaction.annotation.Transactional; | ||
+ | |||
+ | import com.ada.viatico.proceso.component.LegalizacionComponentV2; | ||
+ | import com.ada.viatico.proceso.component.SolicitudComponentV2; | ||
+ | import com.ada.viatico.proceso.dto.DatosGenerarAprobacion; | ||
+ | import com.ada.viatico.proceso.dto.GenericResponseDto; | ||
+ | import com.ada.viatico.proceso.repository.ITmpCompromisoRepository; | ||
+ | import com.ada.viatico.proceso.service.Impl.TicketsImp; | ||
+ | import com.ada.viatico.proceso.service.Impl.ViaticoSolicitudImpl; | ||
+ | import com.ada.viatico.proceso.sfcomercial.dto.AprobacionLegalizacionDto; | ||
+ | import com.ada.viatico.proceso.utiliti.ViaticosException; | ||
+ | |||
+ | /** | ||
+ | * The Class ViaticosServiceV2. | ||
+ | * @version 2.0 | ||
+ | */ | ||
+ | @Service | ||
+ | public class ViaticosServiceV2 { | ||
+ | |||
+ | /** The log. */ | ||
+ | Logger log = LoggerFactory.getLogger(ViaticosServiceV2.class); | ||
+ | |||
+ | /** The Constant APROBRAR. */ | ||
+ | private static final String APROBRAR = "A"; | ||
+ | |||
+ | /** The ticketsimpl. */ | ||
+ | @Autowired | ||
+ | private TicketsImp ticketsimpl; | ||
+ | |||
+ | /** The solicitud repo. */ | ||
+ | @Autowired | ||
+ | private ViaticoSolicitudImpl solicitudRepo; | ||
+ | |||
+ | /** The compromiso tmp. */ | ||
+ | @Autowired | ||
+ | public ITmpCompromisoRepository compromisoTmp; | ||
+ | |||
+ | /** The legalizacion component V 2. */ | ||
+ | @Autowired | ||
+ | private LegalizacionComponentV2 legalizacionComponentV2; | ||
+ | |||
+ | /** The solicitud component. */ | ||
+ | @Autowired | ||
+ | private SolicitudComponentV2 solicitudComponentV2; | ||
+ | |||
+ | /** | ||
+ | * Aprobar solicitud. | ||
+ | * | ||
+ | * @param datos the datos | ||
+ | * @return the generic response dto | ||
+ | * @throws ViaticosException the viaticos exception | ||
+ | */ | ||
+ | @Transactional(rollbackFor = ViaticosException.class) | ||
+ | public GenericResponseDto aprobarSolicitud(DatosGenerarAprobacion datos) throws ViaticosException { | ||
+ | if (datos.getEstadoSolicitudTipo().equals(APROBRAR)) { | ||
+ | return solicitudComponentV2.realizarAprobacion(datos); | ||
+ | } else { | ||
+ | return solicitudComponentV2.cancelarAprobacion(datos); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Aprobar legalizacion. | ||
+ | * | ||
+ | * @param aprobacionLegalizacionDto the aprobacion legalizacion dto | ||
+ | * @param viaticoDetalleSolicitud the viatico detalle solicitud | ||
+ | * @param viaticoDetalleAprobacion the viatico detalle aprobacion | ||
+ | * @return the generic response dto | ||
+ | * @throws ViaticosException the viaticos exception | ||
+ | */ | ||
+ | @Transactional(rollbackFor = ViaticosException.class) | ||
+ | public GenericResponseDto aprobarLegalizacion(AprobacionLegalizacionDto aprobacionLegalizacionDto) throws ViaticosException { | ||
+ | if(aprobacionLegalizacionDto.getEstadoTipo().equals("A")) { | ||
+ | GenericResponseDto genericResponseDto = legalizacionComponentV2.generarProcesoInterfaz(aprobacionLegalizacionDto); | ||
+ | if(genericResponseDto.getCode() == 1L) { | ||
+ | solicitudRepo.generarUpdateEstadoTipo("A", aprobacionLegalizacionDto.getIdTicket()); | ||
+ | ticketsimpl.generarUpdateEstadoTicket("A", aprobacionLegalizacionDto.getIdTicketLegalizado(), aprobacionLegalizacionDto.getDescripcion()); | ||
+ | compromisoTmp.actualizarOrdenador(0L, aprobacionLegalizacionDto.getIdTicket()); | ||
+ | } | ||
+ | return genericResponseDto; | ||
+ | }else { | ||
+ | solicitudRepo.generarUpdateEstadoTipo("V", aprobacionLegalizacionDto.getIdTicket()); | ||
+ | ticketsimpl.generarUpdateEstadoTicket("V", aprobacionLegalizacionDto.getIdTicketLegalizado(), aprobacionLegalizacionDto.getDescripcion()); | ||
+ | compromisoTmp.actualizarOrdenador(aprobacionLegalizacionDto.getKaNlTerceroFuncionario(),aprobacionLegalizacionDto.getIdTicket()); | ||
+ | } | ||
+ | return new GenericResponseDto(1L, "El documento sigue pendiente por proceso de aprobación."); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Directorio: Utils(Utilidades) ==== | ||
+ | Es un directorio general donde se registran clases de utilidad para mantener la base de código organizada y modular. | ||
+ | |||
+ | <code java> | ||
+ | /** | ||
+ | * Copyright © 2023 ADA Corporation. All rights reserved. | ||
+ | * | ||
+ | * This component is protected by copyright. | ||
+ | * | ||
+ | * Use of this component is subject to the terms of the license agreement. | ||
+ | */ | ||
+ | package com.ada.viatico.proceso.sfcomercial; | ||
+ | |||
+ | import java.text.ParseException; | ||
+ | import java.text.SimpleDateFormat; | ||
+ | import java.time.LocalDateTime; | ||
+ | import java.time.format.DateTimeFormatter; | ||
+ | import java.util.Date; | ||
+ | |||
+ | /** | ||
+ | * The Class Utility. | ||
+ | */ | ||
+ | public class Utility { | ||
+ | |||
+ | /** The instance. */ | ||
+ | private static Utility instance; | ||
+ | |||
+ | /** The Constant colombia. */ | ||
+ | // Create a new Locale | ||
+ | //public static final Locale colombia =new Locale("es", "CO"); | ||
+ | |||
+ | /** The Constant pesoFormat. */ | ||
+ | // Create a formatter given the Locale | ||
+ | //public static final NumberFormat pesoFormat = NumberFormat.getCurrencyInstance(colombia); | ||
+ | |||
+ | public static final Long PRESUPUESTO=1L; | ||
+ | public static final Long TESORERIA=2L; | ||
+ | public static final Long CONTABILIDAD=2L; | ||
+ | |||
+ | |||
+ | public static final Long COMPROMISO=2L; | ||
+ | public static final Long COMPROBANTE_EGRESO=1L; | ||
+ | public static final Long COMPROBANTE_INGRESO=2L; | ||
+ | |||
+ | /** | ||
+ | * Instantiates a new utility. | ||
+ | */ | ||
+ | private Utility() { | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Gets the single instance of Utility. | ||
+ | * | ||
+ | * @return single instance of Utility | ||
+ | */ | ||
+ | public static Utility getInstance() { | ||
+ | if (instance == null) | ||
+ | instance = new Utility(); | ||
+ | return instance; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Convert from util date. | ||
+ | * | ||
+ | * @param utilDate the util date | ||
+ | * @return the java.sql. date | ||
+ | */ | ||
+ | public static java.sql.Date convertFromUtilDate(java.util.Date utilDate) { | ||
+ | if (utilDate == null) | ||
+ | return null; | ||
+ | return new java.sql.Date(utilDate.getTime()); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Convert from sql date. | ||
+ | * | ||
+ | * @param sqlDate the sql date | ||
+ | * @return the java.util. date | ||
+ | */ | ||
+ | public static java.util.Date convertFromSqlDate(java.sql.Date sqlDate) { | ||
+ | if (sqlDate == null) | ||
+ | return null; | ||
+ | return new java.util.Date(sqlDate.getTime()); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Gets the date without time using format. | ||
+ | * | ||
+ | * @return the date without time using format | ||
+ | * @throws ParseException the parse exception | ||
+ | */ | ||
+ | public static Date getDateWithoutTimeUsingFormat() throws ParseException { | ||
+ | SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); | ||
+ | // Formatear la fecha actual sin hora y convertirla a Date | ||
+ | return formatter.parse(formatter.format(new Date())); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Gets the numero. | ||
+ | * | ||
+ | * @return the numero | ||
+ | */ | ||
+ | public static String getNumero() { | ||
+ | String formato = "yyyyMMddHHmmss"; | ||
+ | DateTimeFormatter formateador = DateTimeFormatter.ofPattern(formato); | ||
+ | LocalDateTime ahora = LocalDateTime.now(); | ||
+ | return formateador.format(ahora); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Otros Directorios ==== | ||
+ | Además de las carpetas src/main/java, hay otras carpetas que deben tenerse en una aplicación Springboot. | ||
+ | |||
+ | * **src/main/resources**: esta carpeta contiene recursos que no son Java, como archivos estáticos, plantillas y archivos de configuración. | ||
+ | * **src/test**: esta carpeta contiene todas sus clases de prueba. Dentro de esta carpeta hay otra carpeta que es igual a la estructura de carpetas //src/main/java//. Como ejemplo, la carpeta //src/test/java/service// contiene clases de prueba para probar las clases de servicio de las clases //src/main/java/service//. | ||
+ | |||
+ | ==== Nota ==== | ||
+ | La estructura de carpetas puede variar de una empresa a otra. Pero esta es la estructura de carpetas básica de una aplicación Spring Boot que se recomienda se implemente en la mayoria de proyectos. | ||
[[ada:howto:sicoferp:factory:goodsoftwaredevelopmentpractices|←Volver atras]] | [[ada:howto:sicoferp:factory:goodsoftwaredevelopmentpractices|←Volver atras]] | ||
+ | |||
+ | Contenido adaptado desde el sitio web: https://malshani-wijekoon.medium.com/spring-boot-folder-structure-best-practices-18ef78a81819 | ||