Files
old-svijetlastrana/application/applicationservice/organization.go
2018-05-03 07:55:09 +02:00

240 lines
8.0 KiB
Go

package applicationservice
import (
"fmt"
"strconv"
"strings"
"bitbucket.org/nemt/nemt-portal-api/application/entitymapping"
"bitbucket.org/nemt/nemt-portal-api/application/third/npd/npdmodel"
"bitbucket.org/nemt/nemt-portal-api/application/viewmodel"
"bitbucket.org/nemt/nemt-portal-api/domain/entity"
"bitbucket.org/nemt/nemt-portal-api/domain/service"
"github.com/pquerna/ffjson/ffjson"
)
// providerService holds methods to provider application service
type organizationService struct {
svc *service.Service
mapEntity *entitymapping.Mapper
}
// newProviderService returns a providerService instance
func newOrganizationService(svc *service.Service, mapper *entitymapping.Mapper) *organizationService {
return &organizationService{
svc: svc,
mapEntity: mapper,
}
}
func (s *organizationService) GetAllTypes() ([]viewmodel.OrganizationType, error) {
result, err := s.svc.Organization.GetAllTypes()
if err != nil {
return nil, err
}
return s.mapEntity.Organization.ToOrganizationTypeModelSlice(result), nil
}
func (s *organizationService) GetByType(organizationTypeKey string, user viewmodel.User) ([]viewmodel.Organization, error) {
userEntity := s.mapEntity.User.ToUserEntity(user)
result, err := s.svc.Organization.GetByType(organizationTypeKey, userEntity)
if err != nil {
return nil, err
}
return s.mapEntity.Organization.ToOrganizationModelSlice(result), nil
}
func (s *organizationService) GetByUUID(organizationUUID string, user viewmodel.User) (viewmodel.Organization, error) {
userEntity := s.mapEntity.User.ToUserEntity(user)
result, err := s.svc.Organization.GetByUUID(organizationUUID, userEntity)
if err != nil {
return viewmodel.Organization{}, err
}
return s.mapEntity.Organization.ToOrganizationModel(result), nil
}
func (s *organizationService) GetByName(name string, searchType string, user viewmodel.User) ([]viewmodel.Organization, error) {
userEntity := s.mapEntity.User.ToUserEntity(user)
result, err := s.svc.Organization.GetByName(name, searchType, userEntity)
if err != nil {
return nil, err
}
return s.mapEntity.Organization.ToOrganizationModelSlice(result), nil
}
func (s *organizationService) SetParentOrganization(organizationUUID string, parentOrganizationUUID string, user viewmodel.User) (viewmodel.Organization, error) {
userEntity := s.mapEntity.User.ToUserEntity(user)
child, err := s.svc.Organization.GetByUUID(organizationUUID, userEntity)
if err != nil {
return viewmodel.Organization{}, err
}
parent, err := s.svc.Organization.GetByUUID(parentOrganizationUUID, userEntity)
if err != nil {
return viewmodel.Organization{}, err
}
if err := s.svc.Organization.SetParentOrganization(child.ID, parent.ID); err != nil {
return viewmodel.Organization{}, err
}
return s.GetByUUID(organizationUUID, user)
}
func (s *organizationService) InactivateOrganizationAddress(organizationUUID string, address viewmodel.OrganizationAddress, userView viewmodel.User) error {
userEntity := s.mapEntity.User.ToUserEntity(userView)
entityAddress := s.mapEntity.Organization.ToOrganizationAddressEntity(address)
entityAddress.Organization = &entity.Organization{
UUID: organizationUUID,
}
user, err := s.svc.Users.GetByUUID(address.UpdatedUser.ID, "")
if err != nil {
return err
}
entityAddress.UpdatedUser = user
if err := s.svc.Organization.InactivateOrganizationAddress(entityAddress, userEntity); err != nil {
return err
} else {
return nil
}
}
func (s *organizationService) SetOrganizationAddress(organizationUUID string, address viewmodel.OrganizationAddress, userView viewmodel.User) (viewmodel.OrganizationAddress, error) {
userEntity := s.mapEntity.User.ToUserEntity(userView)
entityAddress := s.mapEntity.Organization.ToOrganizationAddressEntity(address)
entityAddress.Organization = &entity.Organization{
UUID: organizationUUID,
}
user, err := s.svc.Users.GetByUUID(address.CreatedUser.ID, "")
if err != nil {
return viewmodel.OrganizationAddress{}, err
}
entityAddress.CreatedUser = user
entityAddress.UpdatedUser = user
entityAddress, err = s.svc.Organization.SetOrganizationAddress(entityAddress, userEntity)
if err != nil {
return viewmodel.OrganizationAddress{}, err
}
return s.mapEntity.Organization.ToOrganizationAddressModel(entityAddress), nil
}
func (s *organizationService) InactivateOrganizationContact(organizationUUID string, contact viewmodel.OrganizationContact, userView viewmodel.User) error {
userEntity := s.mapEntity.User.ToUserEntity(userView)
entityContact := s.mapEntity.Organization.ToOrganizationContactEntity(contact)
entityContact.Organization = &entity.Organization{
UUID: organizationUUID,
}
user, err := s.svc.Users.GetByUUID(contact.CreatedUser.ID, "")
if err != nil {
return err
}
entityContact.UpdatedUser = user
if err := s.svc.Organization.InactivateOrganizationContact(entityContact, userEntity); err != nil {
return err
} else {
return nil
}
}
func (s *organizationService) SetOrganizationContact(organizationUUID string, contact viewmodel.OrganizationContact, userView viewmodel.User) (viewmodel.OrganizationContact, error) {
userEntity := s.mapEntity.User.ToUserEntity(userView)
entityContact := s.mapEntity.Organization.ToOrganizationContactEntity(contact)
entityContact.Organization = &entity.Organization{
UUID: organizationUUID,
}
user, err := s.svc.Users.GetByUUID(contact.CreatedUser.ID, "")
if err != nil {
return viewmodel.OrganizationContact{}, err
}
entityContact.CreatedUser = user
entityContact.UpdatedUser = user
entityContact, err = s.svc.Organization.SetOrganizationContact(entityContact, userEntity)
if err != nil {
return viewmodel.OrganizationContact{}, err
}
return s.mapEntity.Organization.ToOrganizationContactModel(entityContact), nil
}
func (s *organizationService) AddOrganization(organization viewmodel.Organization, user viewmodel.User) (viewmodel.Organization, error) {
enOrg := s.mapEntity.Organization.ToOrganizationEntity(organization)
enUser := s.mapEntity.User.ToUserEntity(user)
author, err := s.svc.Users.GetByUUID(organization.Author.ID, "")
if err != nil {
return viewmodel.Organization{}, nil
}
enOrg.Author = author
enOrg.LastEditor = enOrg.Author
if organization.Reference != nil {
switch organization.Type.Key {
case "provider":
var provider npdmodel.ProviderResponse
bProvider, err := ffjson.Marshal(organization.Reference)
if err != nil {
fmt.Println("Error to marshal provider")
return viewmodel.Organization{}, nil
}
if err := ffjson.Unmarshal(bProvider, &provider); err != nil {
fmt.Println("Error to convert provider")
return viewmodel.Organization{}, nil
}
eProviders, err := s.svc.Provider.Save(s.mapEntity.Provider.ToProviderEntitySlice([]npdmodel.ProviderResponse{provider}), enUser)
if err != nil {
fmt.Println("Error to save provider")
return viewmodel.Organization{}, nil
}
respProvider := eProviders[0]
enOrg.ReferenceID = respProvider.ProviderID
lat, _ := strconv.ParseFloat(provider.Latitude, 64)
long, _ := strconv.ParseFloat(provider.Longitude, 64)
address := entity.OrganizationAddress{
InternalID: provider.MukID,
Name: "Main Address",
Address: fmt.Sprintf("%s %s - %s, %s (%s)", provider.StreetName1, provider.StreetName2, provider.CityName, provider.State, provider.ZipCode),
Latitude: lat,
Longitude: long,
CreatedUser: enOrg.Author,
UpdatedUser: enOrg.LastEditor,
}
enOrg.Addresses = append(enOrg.Addresses, address)
fmt.Println("Phone Number: ", provider.PhoneNumber)
if provider.PhoneNumber != "" {
formattedPhone := "+1" + strings.Replace(provider.PhoneNumber, "-", "", -1)
contact := entity.OrganizationContact{
Type: entity.ContactType{
Key: "phone",
},
Contact: formattedPhone,
Name: "Main Phone",
CreatedUser: enOrg.Author,
UpdatedUser: enOrg.LastEditor,
}
enOrg.Contacts = append(enOrg.Contacts, contact)
}
}
}
enOrg, err = s.svc.Organization.AddOrganization(enOrg, enUser)
if err != nil {
return viewmodel.Organization{}, nil
}
return s.GetByUUID(enOrg.UUID, user)
}