Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CCAP 636], Implement ccms data storage #1115

Merged
merged 9 commits into from
Feb 7, 2025
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -86,8 +86,10 @@ dependencies {
testImplementation 'com.deque.html.axe-core:selenium:4.10.1'
testImplementation 'org.projectlombok:lombok:1.18.36'
testImplementation 'net.javacrumbs.json-unit:json-unit-assertj:4.1.0'

testImplementation 'io.zonky.test:embedded-database-spring-test:2.6.0'
testImplementation 'io.zonky.test:embedded-postgres:2.1.0'
testAnnotationProcessor 'org.projectlombok:lombok'

testCompileOnly 'org.projectlombok:lombok'

runtimeOnly 'org.postgresql:postgresql:42.7.5'
Expand Down
41 changes: 41 additions & 0 deletions src/main/java/org/ilgcc/app/data/CCMSDataService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package org.ilgcc.app.data;

import java.math.BigInteger;
import java.util.List;
import java.util.Optional;

public interface CCMSDataService {

/**
* Retrieves a county based on the given zip code.
*
* @param zipCode the zip code to search for
* @return an Optional containing the matching county if found, or an empty Optional if not found
*/
Optional<County> getCountyByZipCode(String zipCode);

/**
* Retrieves a provider based on the given provider ID.
*
* @param providerId the unique identifier of the provider
* @return an Optional containing the provider if found, or an empty Optional if not found
*/
Optional<Provider> getProviderById(BigInteger providerId);

/**
* Retrieves a resource organization associated with a given provider ID.
*
* @param providerId the unique identifier of the provider
* @return an Optional containing the matching resource organization if found, or an empty Optional if not found
*/
Optional<ResourceOrganization> getResourceOrganizationByProviderId(BigInteger providerId);

/**
* Retrieves a list of resource organizations based on the given caseload code.
*
* @param caseloadCode the caseload code to search for
* @return a list of matching resource organizations
*/
List<ResourceOrganization> getResourceOrganizationsByCaseloadCode(String caseloadCode);
}

44 changes: 44 additions & 0 deletions src/main/java/org/ilgcc/app/data/County.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.ilgcc.app.data;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Component;

@Entity
@Table(name = "zip_codes")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Component
@Builder
public class County implements Serializable {

@Id
@Column(name = "zip_code")
private String zipCode;

@Column(name = "city")
private String city;

@Column(name = "county")
private String county;

@Column(name = "fips_county_code")
private Integer fipsCountyCode;

@Column(name = "dpa_county_code")
private Integer dpaCountyCode;

@Column(name = "caseload_code")
private String caseloadCode;

}
9 changes: 9 additions & 0 deletions src/main/java/org/ilgcc/app/data/CountyRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.ilgcc.app.data;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface CountyRepository extends JpaRepository<County, String> {

}
9 changes: 9 additions & 0 deletions src/main/java/org/ilgcc/app/data/Provider.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.io.Serializable;
import java.math.BigInteger;
Expand All @@ -12,6 +14,8 @@
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;
import org.springframework.stereotype.Component;


Expand Down Expand Up @@ -55,4 +59,9 @@ public class Provider implements Serializable {

@Column(name = "date_of_last_approval")
private OffsetDateTime dateOfLastApproval;

@JoinColumn(name = "resource_org_id", nullable = true)
@OnDelete(action = OnDeleteAction.CASCADE)
@ManyToOne
private ResourceOrganization resourceOrganization;
}
1 change: 1 addition & 0 deletions src/main/java/org/ilgcc/app/data/ProviderRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ public interface ProviderRepository extends JpaRepository<Provider, BigInteger>
+ "AND date_of_last_approval >= :threeYearsAgo", nativeQuery = true)
boolean existsByStatusInAndProviderIdAndDateOfLastApprovalAfter(@Param("statuses") List<String> statuses,
@Param("providerId") BigInteger providerId, @Param("threeYearsAgo") LocalDate threeYearsAgo);

}
51 changes: 51 additions & 0 deletions src/main/java/org/ilgcc/app/data/ResourceOrganization.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.ilgcc.app.data;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import java.math.BigInteger;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.Builder;
import org.springframework.stereotype.Component;

@Entity
@Table(name = "resource_organizations")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Component
@Builder
public class ResourceOrganization {
@Id
@Column(name = "resource_org_id")
private BigInteger resourceOrgId;

@Column(name = "caseload_code")
private String caseloadCode;

@Column(name = "name")
private String name;

@Column(name = "address")
private String address;

@Column(name = "phone")
private String phone;

@Column(name = "email")
private String email;

@Column(name = "sda")
private Short sda;

@OneToMany(mappedBy = "resourceOrganization", fetch =FetchType.LAZY)
private Set<Provider> providers;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.ilgcc.app.data;

import java.math.BigInteger;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ResourceOrganizationRepository extends JpaRepository<ResourceOrganization, Long> {

List<ResourceOrganization> findByCaseloadCode(String caseloadCode);

Optional<ResourceOrganization> findByProvidersProviderId(BigInteger providerId);
}
47 changes: 47 additions & 0 deletions src/main/java/org/ilgcc/app/data/importer/CCMSDataServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package org.ilgcc.app.data.importer;

import java.math.BigInteger;
import java.util.List;
import java.util.Optional;
import org.ilgcc.app.data.CCMSDataService;
import org.ilgcc.app.data.County;
import org.ilgcc.app.data.CountyRepository;
import org.ilgcc.app.data.Provider;
import org.ilgcc.app.data.ProviderRepository;
import org.ilgcc.app.data.ResourceOrganization;
import org.ilgcc.app.data.ResourceOrganizationRepository;
import org.springframework.stereotype.Service;

@Service
public class CCMSDataServiceImpl implements CCMSDataService {

private final ProviderRepository providerRepository;
private final CountyRepository countyRepository;
private final ResourceOrganizationRepository resourceOrganizationRepository;

public CCMSDataServiceImpl(ProviderRepository providerRepository, CountyRepository countyRepository, ResourceOrganizationRepository resourceOrganizationRepository) {
this.providerRepository = providerRepository;
this.countyRepository = countyRepository;
this.resourceOrganizationRepository = resourceOrganizationRepository;
}

@Override
public Optional<County> getCountyByZipCode(String zipCode) {
return countyRepository.findById(zipCode);
}

@Override
public Optional<Provider> getProviderById(BigInteger providerId) {
return providerRepository.findById(providerId);
}

@Override
public Optional<ResourceOrganization> getResourceOrganizationByProviderId(BigInteger providerId) {
return resourceOrganizationRepository.findByProvidersProviderId(providerId);
}

@Override
public List<ResourceOrganization> getResourceOrganizationsByCaseloadCode(String caseloadCode) {
return resourceOrganizationRepository.findByCaseloadCode(caseloadCode);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
DO
$$
BEGIN
-- Create 'resource_organizations' table if it does not exist
IF
NOT EXISTS (SELECT * FROM pg_tables WHERE tablename = 'resource_organizations') THEN
CREATE TABLE resource_organizations
(
resource_org_id BIGINT PRIMARY KEY,
caseload_code VARCHAR,
name VARCHAR,
address VARCHAR,
phone VARCHAR,
email VARCHAR,
sda SMALLINT
);

END IF;


-- Create 'zip_codes' table if it does not exist
IF
NOT EXISTS (SELECT * FROM pg_tables WHERE tablename = 'zip_codes') THEN
CREATE TABLE zip_codes
(
zip_code BIGINT PRIMARY KEY,
city VARCHAR,
county VARCHAR,
fips_county_code INT,
dpa_county_code INT,
caseload_code VARCHAR
);

END IF;

-- Create indexes for case load and county
CREATE INDEX caseload_code_idx ON resource_organizations (caseload_code);
CREATE INDEX county_idx ON zip_codes (county);

END
$$;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- Add the 'resource_org_id' column to the 'providers' table
ALTER TABLE providers ADD COLUMN resource_org_id BIGINT;

-- Add foreign key constraint on the providers table
ALTER TABLE providers
ADD CONSTRAINT fk_providers_resource_org
FOREIGN KEY (resource_org_id) REFERENCES resource_organizations(resource_org_id)
ON DELETE CASCADE;
Loading