formular.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package asuModels
  2. //go:generate reform --gofmt=false .
  3. import (
  4. "database/sql"
  5. "fmt"
  6. "github.com/xaionaro-go/extime"
  7. "html/template"
  8. "strings"
  9. )
  10. //reform:formular
  11. type Formular struct {
  12. EmpGUID int `reform:"EmpGUID" view:"readonly"`
  13. StfCardId int `reform:"StfCardId" view:"readonly"`
  14. PersonnelNumber int `reform:"TabN" view:"readonly"`
  15. FormularType string `reform:"Tip_formular" view:"readonly"`
  16. StartDate *extime.Date `reform:"StartDate" view:"readonly"`
  17. EndDate *extime.Date `reform:"EndDate" view:"readonly"`
  18. AppointmentName string `reform:"Name" view:"readonly"`
  19. AppointmentShortName *string `reform:"Prof_BriefName" view:"readonly"`
  20. WorkStart *extime.Date `reform:"Start_work" view:"readonly"`
  21. Category string `reform:"Category" view:"readonly"`
  22. CategoryCode int `reform:"Cod_Catgory" view:"readonly"`
  23. UnitName string `reform:"Name_podr" view:"readonly"`
  24. UnitShortName *string `reform:"Podr_BriefName" view:"readonly"`
  25. UnitCode string `reform:"Code" view:"readonly"`
  26. ChiefName *string `reform:"ChiefName" view:"readonly"`
  27. Rate *float64 `reform:"RateAmount" view:"readonly"`
  28. IsHead *bool `reform:"IsHead" view:"readonly"`
  29. UnitId int `reform:"OrgDiv" view:"readonly"`
  30. PersNumber *int `reform:"PersNumber" view:"readonly"`
  31. unit Unit `reform:"-"`
  32. unitReady bool `reform:"-"`
  33. person Person `reform:"-"`
  34. personReady bool `reform:"-"`
  35. isActive bool `reform:"-"`
  36. isActiveReady bool `reform:"-"`
  37. //FormularTypeCode int `reform:"Cod_Tip_formular"`
  38. //WorkEnd *string `reform:"End_work"`
  39. //Profession int `reform:"Profession"`
  40. //Lastname string `reform:"SurName"`
  41. //Firstname string `reform:"FirstName"`
  42. //Patronymic string `reform:"MiddleName"`
  43. //OrgInn string `reform:"OrgInn"`
  44. //DivInn string `reform:"DivInn"`
  45. //Sex int `reform:"Sex"`
  46. //WorkState int `reform:"WorkState"`
  47. //ProfKvalLevel string `reform:"ProfKvalLevel"`
  48. //ProfKvalGroup int `reform:"ProfKvalGroup"`
  49. //EmpCardId string `reform:"EmpCardId"`
  50. //VacDays *int `reform:"VacDays"`
  51. //ExtraVacDays *int `reform:"ExtraVacDays"`
  52. }
  53. func (f *Formular) AfterFind() error {
  54. if f.UnitShortName != nil {
  55. *f.UnitShortName = strings.Trim(*f.UnitShortName, " ")
  56. }
  57. f.UnitName = strings.Trim(f.UnitName, " ")
  58. return nil
  59. }
  60. func (sql Formular) ActiveOnly() *FormularScope {
  61. return sql.Scope().ActiveOnly()
  62. }
  63. func (sql *FormularScope) ActiveOnly() *FormularScope {
  64. return sql.Where("(StartDate IS NULL OR StartDate < NOW()) AND (EndDate IS NULL OR EndDate+24*3600 > NOW())")
  65. }
  66. func (sql Formular) PPSOnly() *FormularScope {
  67. return sql.Scope().PPSOnly()
  68. }
  69. func (sql *FormularScope) PPSOnly() *FormularScope {
  70. return sql.Where("CategoryCode IN (1, 8)")
  71. }
  72. // TODO: Remove this "VIEW" from this model
  73. func (f Formular) View_readTag(fieldName string, parent interface{}, args []interface{}) template.HTML {
  74. unitName := f.UnitName
  75. if f.UnitShortName != nil {
  76. unitName = *f.UnitShortName + " (" + unitName + ")"
  77. }
  78. return template.HTML(fmt.Sprintf(`<a href="/asu/formulars/%v?fullscreen=true">%v — %v: [%v] %v — %v</a>`, f.StfCardId, f.StartDate, f.EndDate, f.UnitCode, f.AppointmentName, unitName))
  79. }
  80. func (f *Formular) PrepareUnit() *Formular {
  81. var err error
  82. f.unit, err = UnitSQL.First(Unit{Id: f.UnitId})
  83. if err != nil && err != sql.ErrNoRows {
  84. //revel.ERROR.Printf("Got error: %v", err.Error())
  85. return f
  86. }
  87. f.unitReady = true
  88. return f
  89. }
  90. func (f Formular) IsUnitReady() bool {
  91. return f.unitReady
  92. }
  93. func (f Formular) GetUnit() Unit {
  94. if !f.unitReady {
  95. panic("formular is not ready for method GetUnit: it's required to call PrepareUnit method, first")
  96. }
  97. return f.unit
  98. }
  99. func (f *Formular) PreparePerson() *Formular {
  100. var err error
  101. f.person, err = PersonSQL.First(Person{EmpGUID: f.EmpGUID})
  102. if err != nil && err != sql.ErrNoRows {
  103. //revel.ERROR.Printf("Got error: %v", err.Error())
  104. return f
  105. }
  106. f.personReady = true
  107. return f
  108. }
  109. func (f Formular) IsPersonReady() bool {
  110. return f.personReady
  111. }
  112. func (f Formular) GetPerson() Person {
  113. if !f.personReady {
  114. panic("formular is not ready for method GetPerson: it's required to call PreparePerson method, first")
  115. }
  116. return f.person
  117. }
  118. func (f *Formular) PrepareIsActive() *Formular {
  119. now := extime.Now()
  120. startIsGood := false
  121. endIsGood := false
  122. if f.StartDate != nil {
  123. startIsGood = f.StartDate.UnixNano() <= now.UnixNano()
  124. }
  125. if f.EndDate == nil {
  126. endIsGood = true
  127. } else {
  128. endIsGood = f.EndDate.UnixNano()+24*3600*1000*1000*1000 >= now.UnixNano()
  129. }
  130. f.isActive = startIsGood && endIsGood
  131. f.isActiveReady = true
  132. return f
  133. }
  134. func (f Formular) IsActive() bool {
  135. if !f.isActiveReady {
  136. panic("formular is not ready for method IsActive: it's required to call PrepareIsActive method, first")
  137. }
  138. return f.isActive
  139. }
  140. type Formulars []Formular
  141. func (formulars Formulars) PrepareIsActive() Formulars {
  142. for idx, _ := range formulars {
  143. formulars[idx].PrepareIsActive()
  144. }
  145. return formulars
  146. }
  147. func (formulars Formulars) ToMap() map[int]*Formular {
  148. formularMap := map[int]*Formular{}
  149. for idx, formular := range formulars {
  150. formularMap[formular.StfCardId] = &formulars[idx]
  151. }
  152. return formularMap
  153. }
  154. func (formulars Formulars) GetStfCardIds() (stfCardIds []int) {
  155. for _, formular := range formulars {
  156. stfCardIds = append(stfCardIds, formular.StfCardId)
  157. }
  158. return
  159. }
  160. func (formulars Formulars) GetEmpGUIDs() (empGUIDs []int) {
  161. empGUIDMap := map[int]bool{}
  162. for _, formular := range formulars {
  163. empGUIDMap[formular.EmpGUID] = true
  164. }
  165. for empGUID := range empGUIDMap {
  166. empGUIDs = append(empGUIDs, empGUID)
  167. }
  168. return
  169. }
  170. func (formulars Formulars) PreparePeople() Formulars {
  171. ids := formulars.GetEmpGUIDs()
  172. if len(ids) == 0 {
  173. return formulars
  174. }
  175. people, err := PersonSQL.Select("EmpGUID IN (?)", ids)
  176. if err != nil && err != sql.ErrNoRows {
  177. panic(err)
  178. }
  179. personMap := People(people).ToMap()
  180. for idx, formular := range formulars {
  181. formulars[idx].person = *personMap[formular.EmpGUID]
  182. formulars[idx].personReady = true
  183. }
  184. return formulars
  185. }
  186. func (formulars Formulars) GetPeople() (people People) {
  187. for _, formular := range formulars {
  188. people = append(people, formular.GetPerson())
  189. }
  190. return
  191. }