/*
   This source code has been generated with HMGGEN - Harbour Application Generator.
   Please do not remove the BEGIN and END tags and place your own code between the 
   predefined BEGIN and END tags.	
*/

#include <hmg.ch>
#include "hbclass.ch"
/* BEGIN */
/* END */

class [_collclass]
   Method Init() constructor
   Method Find([_parentid], [_FirstToLower(collclass)], refdat)
   Method Get(id, [_FirstToLower(classname)], requestor, refdat)
   /* BEGIN */
   /* END */
endclass   

Method Init() class [_collclass]
return self

Method Find([_parentid], [_FirstToLower(collclass)], refdat) class [_collclass]
   local old := select(), obj := {}
   select 0
   use [_Lower(filename)] index [_Lower(filename)]a 
   /* BEGIN */
   /* END */	
   if pcount() < 3 .or. empty(refdat)
      seek str([_parentid], 10)
      do while .not. eof() .and. [_Lower(filename)]->[_Upper(parentid)] = [_Lower(parentid)]
         aadd([_FirstToLower(collclass)], [_classname]():New():Transfer()) 
         skip
      enddo
   else
      // time travelling
      set deleted off
      seek str([_parentid], 10)
      do while .not. eof() .and. [_Lower(filename)]->[_Upper(parentid)] = [_Lower(parentid)]
         obj := SaveRec(obj)
         DbfLogRollback("[_filename]", [_Lower(filename)]->ID, refdat)
         if [_Lower(filename)]->DELETED == "N" .and. [_Lower(filename)]->INGDAT <= refdat 
            aadd([_FirstToLower(collclass)], [_classname]():New():Transfer()) 
         endif
         RestRec(obj)
         skip
      enddo
      set deleted on
   endif
   use
   select(old)
return [_FirstToLower(collclass)]
   
Method Get(id, [_FirstToLower(classname)], requestor, refdat) class [_collclass]
   local old := select(), n, obj := {}
   if requestor != "old"
      select 0
      use [_filename] index [_filename]
   endif
   seek str(id, 10)
   if found()
      if pcount() > 3 .and. !empty(refdat)
         obj := SaveRec(obj)
         DbfLogRollback("[_filename]", [_Lower(filename)]->ID, refdat)
         [_FirstToLower(classname)]:Transfer()	
         RestRec(obj)
      else
         [_FirstToLower(classname)]:Transfer()	
      endif
   endif
   if requestor != "old" 
[_incltb6()]      /* BEGIN */
      /* END */
      use
   endif  
   select(old)
return [_FirstToLower(classname)]

class [_classname]
   data id
[_incltb2()]   data deleted
   data userid
   data txdate     
   data txtime
   Method Init() constructor
   Method Save(txdate, txtime, userid, ingdat)
   Method Equals(old) protected
   Method Transfer()
   Method Replace(txdate, txtime, userid) protected
   Method LogChanges(old_rec, txdate, txtime, ingdat) protected
   /* BEGIN */
   /* END */
endclass

Method Init() class [_classname]
   self:id := 0
[_incltb8()]   self:deleted := "N"
   self:userid := ""
   self:txdate := ctod(" -  -    ")     
   self:txtime := ""
   /* BEGIN */
   /* END */
return self

Method Save(txdate, txtime, userid, ingdat) 
local id, newId, bChanged, old_rec, old := select(), aBrokenRules := {}
select 0
[_incltb7()]bChanged := .F.
id = self:id
if id <= 0
   // insert request
else
   // update or delete request
   old_rec = [_FirstToLower(collclass)]():Get(id, [_FirstToLower(classname)]():New(), "old")
   if found()
      // check whether content has changed
      if self:Equals(old_rec)
         // do nothing
      else 
         // check concurrent update
         if self:txdate = old_rec:txdate .and. self:txtime = old_rec:txtime
            if self:deleted = "Y"
               RecLock(1)
               [_Lower(filename)]->DELETED := self:deleted
               [_Lower(filename)]->USERID := userid
               [_Lower(filename)]->TXDATE := txdate
               [_Lower(filename)]->TXTIME := txtime
               delete
               unlock
[_incltb9(15)]            else
               bChanged := .T.
            endif
         else 
            MsgInfo("record has been updated by: " + old_rec:userid)
         endif
      endif
   else
      // defensive programming
      MsgInfo("record deleted by other user")
   endif
endif
if id <= 0 .or. bChanged
   // evaluation of business rules, use aBrokenRules
   /* BEGIN */
   /* END */
   // end evaluation of business rules
   if empty(aBrokenRules)
      if id <= 0	
         newId = DbfGetID("[_filename]")
         self:id = newId
         AddRec(1)	
         [_Lower(filename)]->ID := self:id
         /* BEGIN */
         /* END */
         self:Replace(txdate, txtime, userid)
         unlock
      else
         RecLock(1)
         self:Replace(txdate, txtime, userid)
         unlock
[_incltb9(9)]      endif
      self:userid := userid
      self:txdate := txdate
      self:txtime := txtime
   endif
endif
use
select(old)
return(aBrokenRules)

Method Equals(old_rec) class [_classname]
local retval := .T.
   set exact on
[_incltb3()]   if self:deleted != old_rec:deleted
      retval := .F.
   endif
   set exact off
return(retval)
 
Method Transfer() class [_classname]
   self:id := [_Lower(filename)]->ID 	
[_incltb1()]   self:deleted := [_Lower(filename)]->DELETED 	
   self:userid := [_Lower(filename)]->USERID 	
   self:txdate := [_Lower(filename)]->TXDATE 	
   self:txtime := [_Lower(filename)]->TXTIME 	
return(self)

Method Replace(txdate, txtime, userid) class [_classname]
[_incltb4()]   [_Lower(filename)]->DELETED := self:deleted
   [_Lower(filename)]->USERID := userid
   [_Lower(filename)]->TXDATE := txdate
   [_Lower(filename)]->TXTIME := txtime
return(nil)

Method LogChanges(old_rec, txdate, txtime, ingdat) class [_classname]
[_incltb5()]   if self:deleted != old_rec:deleted
      DbfLogAdd(alias(), "DELETED", old_rec:id, old_rec:deleted, old_rec:txdate, old_rec:txtime, ingdat, "00:00:00", old_rec:userid)
   endif
return(nil)

// put here your udf's
