src/main/scala/fis/crm/model/CrmSchema.scala
author Tomas Zeman <tzeman@volny.cz>
Tue, 01 May 2012 23:54:09 +0200
changeset 91 494b3b9db463
parent 84 43674362ff5e
permissions -rw-r--r--
Company status
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
23
16066379860c Global entity removal from base schema
Tomas Zeman <tzeman@volny.cz>
parents: 10
diff changeset
     2
 * Copyright 2011-2012 Tomas Zeman <tzeman@volny.cz>
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package fis.crm.model
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
74
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    18
import fis.base.model.{BaseSchema, Entity}
91
494b3b9db463 Company status
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    19
import fis.cl.model.CodeListSchema
10
fc7b6a99deb4 81aa2ebe282b4664 Company model
Tomas Zeman <tzeman@volny.cz>
parents: 8
diff changeset
    20
import fis.geo.model.GeoSchema
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import net.liftweb.squerylrecord.RecordTypeMode._
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
91
494b3b9db463 Company status
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    23
trait CrmSchema extends BaseSchema with CodeListSchema with GeoSchema {
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
35
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    25
  val contactT = tableWithSeq[Contact]
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    26
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    27
  def allContacts: Iterable[Contact] = from(contactT) (c =>
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    28
    select(c) orderBy(c.lastName asc, c.firstName asc)
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    29
  )
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    30
23
16066379860c Global entity removal from base schema
Tomas Zeman <tzeman@volny.cz>
parents: 10
diff changeset
    31
  /*
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
  val entityContacts = manyToManyRelation(entities, contacts).
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
    via[EntityContact]((e, c, ec) => (
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
      e.id === ec.entityId,
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
      c.id === ec.contactId
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
    ))
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
  entityContacts.leftForeignKeyDeclaration.unConstrainReference
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
  val contactTypeToEntityContacts = oneToManyRelation(codeListItems,
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
    entityContacts).via((cli, ec) => cli.id === ec.typeId)
23
16066379860c Global entity removal from base schema
Tomas Zeman <tzeman@volny.cz>
parents: 10
diff changeset
    42
  */
10
fc7b6a99deb4 81aa2ebe282b4664 Company model
Tomas Zeman <tzeman@volny.cz>
parents: 8
diff changeset
    43
65
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    44
  val companyT = tableWithSeq[Company]
10
fc7b6a99deb4 81aa2ebe282b4664 Company model
Tomas Zeman <tzeman@volny.cz>
parents: 8
diff changeset
    45
91
494b3b9db463 Company status
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    46
  val companyStatus = oneToManyRelation(cli, companyT).
494b3b9db463 Company status
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    47
    via((i, c) => i.id === c.status)
494b3b9db463 Company status
Tomas Zeman <tzeman@volny.cz>
parents: 84
diff changeset
    48
65
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    49
  val companyAddress = oneToManyRelation(addressT, companyT).
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    50
    via((a, c) => c.address === a.id)
10
fc7b6a99deb4 81aa2ebe282b4664 Company model
Tomas Zeman <tzeman@volny.cz>
parents: 8
diff changeset
    51
65
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    52
  val companyPostAddress = oneToManyRelation(addressT, companyT).
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    53
    via((a, c) => c.postAddress === a.id)
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents: 65
diff changeset
    54
  companyPostAddress.foreignKeyDeclaration.constrainReference(onDelete setNull)
10
fc7b6a99deb4 81aa2ebe282b4664 Company model
Tomas Zeman <tzeman@volny.cz>
parents: 8
diff changeset
    55
65
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    56
  val bankAccountT = tableWithSeq[BankAccount]
10
fc7b6a99deb4 81aa2ebe282b4664 Company model
Tomas Zeman <tzeman@volny.cz>
parents: 8
diff changeset
    57
65
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    58
  val companyBankAccounts = oneToManyRelation(companyT, bankAccountT).
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    59
    via((c, a) => c.id === a.company)
a35a0edf9ddd Geo+Company record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 35
diff changeset
    60
  companyBankAccounts.foreignKeyDeclaration.constrainReference(onDelete cascade)
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents: 65
diff changeset
    61
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    62
  val companyContacts = manyToManyRelation(companyT, contactT).
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    63
    via[CompanyContact]((comp, cnt, cc) => (
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    64
      comp.id === cc.entity,
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    65
      cnt.id  === cc.contact
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    66
    ))
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    67
  companyContacts.leftForeignKeyDeclaration.constrainReference(onDelete cascade)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    68
  companyContacts.rightForeignKeyDeclaration.constrainReference(onDelete cascade)
74
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    69
  ContactEntities.register(companyContacts)
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    70
84
43674362ff5e Company select field
Tomas Zeman <tzeman@volny.cz>
parents: 74
diff changeset
    71
  Company.companies.default.set { () => from(companyT)(c =>
43674362ff5e Company select field
Tomas Zeman <tzeman@volny.cz>
parents: 74
diff changeset
    72
    select(c) orderBy(c.name asc)) }
69
b1dc0efd1303 Company UI
Tomas Zeman <tzeman@volny.cz>
parents: 65
diff changeset
    73
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
}
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
object CrmSchema extends CrmSchema
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    78
object CompanyContacts {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    79
  def apply(company: Company): Iterable[Contact] =
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    80
    from(CrmSchema.companyContacts.left(company)) (c =>
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    81
      select(c) orderBy(c.lastName asc, c.firstName asc)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    82
    )
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    83
}
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
    84
35
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    85
import org.squeryl.KeyedEntity
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    86
import org.squeryl.dsl._
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
    87
74
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    88
object ContactEntities {
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    89
  type T = ManyToManyRelation[Entity[_], Contact, _]
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    90
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    91
  import java.util.concurrent.{ConcurrentHashMap => CHash}
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    92
  import scala.collection.JavaConversions._
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    93
  private val rels = new CHash[String, T]
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    94
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    95
  def register[L <: Entity[_], A <: KeyedEntity[_]](
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    96
    rel: ManyToManyRelation[L, Contact, A])(implicit man:Manifest[L]) {
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    97
    rels.put(man.toString, rel.asInstanceOf[T])
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    98
  }
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
    99
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
   100
  def apply(c: Contact): Iterable[Entity[_]] = rels.values flatMap { _.right(c) }
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
   101
}
3ce7ecb6bc70 Contact entities
Tomas Zeman <tzeman@volny.cz>
parents: 72
diff changeset
   102
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   103
trait EntityContact[T] extends KeyedEntity[CompositeKey2[Long, Long]] {
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   104
  def entity: Long
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   105
  def contact: Long
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   106
  def id = CompositeKey2(entity, contact)
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   107
}
35
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   108
72
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   109
case class CompanyContact(entity: Long, contact: Long) extends
077b875a2a0c Company contacts
Tomas Zeman <tzeman@volny.cz>
parents: 69
diff changeset
   110
  EntityContact[Company]
35
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   111
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   112
case class EntityContactWithType[T](val entityId: Long, val contactId: Long,
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   113
  val typeId: Long) extends KeyedEntity[CompositeKey3[Long, Long, Long]] {
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   114
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   115
  def id = CompositeKey3(entityId, contactId, typeId)
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   116
}
d77d8194ee59 Contact record refactoring
Tomas Zeman <tzeman@volny.cz>
parents: 23
diff changeset
   117
8
828565e7f571 ff8d393251d4dae6 Contact model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
   118
// vim: set ts=2 sw=2 et: