@@ -832,7 +832,7 @@ static function makeRecordIdentifier($record) {
832832 global $ user ;
833833 // Start with client.
834834 if ($ user ->isPluginEnabled ('cl ' ))
835- $ record_identifier = $ record ['client_id ' ] ? 'cl ' .$ record ['client_id ' ] : '' ;
835+ $ record_identifier = $ record ['client_id ' ] ? 'cl: ' .$ record ['client_id ' ] : '' ;
836836 // Add billable flag.
837837 if (!empty ($ record_identifier )) $ record_identifier .= ', ' ;
838838 $ record_identifier .= 'bl: ' .$ record ['billable ' ];
@@ -851,6 +851,28 @@ static function makeRecordIdentifier($record) {
851851 return $ record_identifier ;
852852 }
853853
854+ // parseFromWeekViewRow - obtains field value encoded in row identifier.
855+ // For example, for a row id like "cl:546,bl:0,pr:23456,ts:27464,cf_1:example text"
856+ // requesting a client "cl" should return 546.
857+ static function parseFromWeekViewRow ($ row_id , $ field_label ) {
858+ // Find beginning of label.
859+ $ pos = strpos ($ row_id , $ field_label );
860+ if ($ pos === false ) return null ; // Not found.
861+
862+ // Strip suffix from row id.
863+ $ suffixPos = strrpos ($ row_id , '_ ' );
864+ if ($ suffixPos )
865+ $ remaninder = substr ($ row_id , 0 , $ suffixPos );
866+
867+ // Find beginning of value.
868+ $ posBegin = 1 + strpos ($ remaninder , ': ' , $ pos );
869+ // Find end of value.
870+ $ posEnd = strpos ($ remaninder , ', ' , $ posBegin );
871+ if ($ posEnd === false ) $ posEnd = strlen ($ remaninder );
872+ // Return value.
873+ return substr ($ remaninder , $ posBegin , $ posEnd - $ posBegin );
874+ }
875+
854876 // makeRecordLabel - builds a human readable label for a row in week view,
855877 // which is a combination ot record properties.
856878 // Client - Project - Task - Custom field 1.
@@ -902,24 +924,15 @@ static function getDayHeadersForWeek($start_date) {
902924 return $ dayHeaders ;
903925 }
904926
905- // getLockedDaysForWeek - builds an arrays of locked days in week.
927+ // getLockedDaysForWeek - builds an array of locked days in week.
906928 static function getLockedDaysForWeek ($ start_date ) {
907929 global $ user ;
908930 $ lockedDays = array ();
909931 $ objDate = new DateAndTime (DB_DATEFORMAT , $ start_date );
910- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
911- $ objDate ->incDay ();
912- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
913- $ objDate ->incDay ();
914- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
915- $ objDate ->incDay ();
916- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
917- $ objDate ->incDay ();
918- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
919- $ objDate ->incDay ();
920- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
921- $ objDate ->incDay ();
922- $ lockedDays [] = $ user ->isDateLocked ($ objDate );
932+ for ($ i = 0 ; $ i < 7 ; $ i ++) {
933+ $ lockedDays [] = $ user ->isDateLocked ($ objDate );
934+ $ objDate ->incDay ();
935+ }
923936 unset($ objDate );
924937 return $ lockedDays ;
925938 }
@@ -947,12 +960,64 @@ static function getDayTotals($dataArray, $dayHeaders) {
947960 return $ dayTotals ;
948961 }
949962
963+ // dateFromDayHeader calculates date from start date and day header in week view.
964+ static function dateFromDayHeader ($ start_date , $ day_header ) {
965+ $ objDate = new DateAndTime (DB_DATEFORMAT , $ start_date );
966+ $ currentDayHeader = (string ) $ objDate ->getDate (); // It returns an int on first call.
967+ if (strlen ($ currentDayHeader ) == 1 ) // Which is an implementation detail of DateAndTime class.
968+ $ currentDayHeader = '0 ' .$ currentDayHeader ; // Add a 0 for single digit day.
969+ $ i = 1 ;
970+ while ($ currentDayHeader != $ day_header && $ i < 7 ) {
971+ // Iterate through remaining days to find a match.
972+ $ objDate ->incDay ();
973+ $ currentDayHeader = $ objDate ->getDate (); // After incDay it returns a string with leading 0, when necessary.
974+ $ i ++;
975+ }
976+ return $ objDate ->toString (DB_DATEFORMAT );
977+ }
978+
950979 // insertDurationFromWeekView - inserts a new record in log tables from a week view post.
951980 static function insertDurationFromWeekView ($ fields , $ err ) {
952- $ err ->add ("Week view is work in progress. Inserting records is not yet implemented. Try again later. " );
953- // $row_id, $day_header, $posted_duration, $start_date) { // TODO: potential fields?
981+ global $ i18n ;
982+ global $ user ;
983+
984+ // Determine date for a new entry.
985+ $ entry_date = ttTimeHelper::dateFromDayHeader ($ fields ['start_date ' ], $ fields ['day_header ' ]);
986+ $ objEntryDate = new DateAndTime (DB_DATEFORMAT , $ entry_date );
987+
988+ // Prohibit creating entries in future.
989+ if (defined ('FUTURE_ENTRIES ' ) && !isTrue (FUTURE_ENTRIES ) && $ fields ['browser_today ' ]) {
990+ $ objBrowserToday = new DateAndTime (DB_DATEFORMAT , $ fields ['browser_today ' ]);
991+ if ($ objEntryDate ->after ($ objBrowserToday )) {
992+ $ err ->add ($ i18n ->getKey ('error.future_date ' ));
993+ return false ;
994+ }
995+ }
996+
997+ // Temporary check for custom field and exit if one is found, as this is not yet implemented.
998+ $ temp = ttTimeHelper::parseFromWeekViewRow ($ fields ['row_id ' ], 'cf_1 ' );
999+ if ($ temp ) {
1000+ $ err ->add ("Week view is work in progress. Inserting records with custom fields is not yet implemented. Try again later. " );
1001+ return false ;
1002+ }
1003+
1004+ // Prepare an array of fields for regular insert function.
1005+ $ fields4insert = array ();
1006+ $ fields4insert ['user_id ' ] = $ user ->getActiveUser ();
1007+ $ fields4insert ['date ' ] = $ entry_date ;
1008+ $ fields4insert ['duration ' ] = $ fields ['duration ' ];
1009+ $ fields4insert ['client ' ] = ttTimeHelper::parseFromWeekViewRow ($ fields ['row_id ' ], 'cl ' );
1010+ $ fields4insert ['billable ' ] = ttTimeHelper::parseFromWeekViewRow ($ fields ['row_id ' ], 'bl ' );
1011+ $ fields4insert ['project ' ] = ttTimeHelper::parseFromWeekViewRow ($ fields ['row_id ' ], 'pr ' );
1012+ $ fields4insert ['task ' ] = ttTimeHelper::parseFromWeekViewRow ($ fields ['row_id ' ], 'ts ' );
1013+
1014+ // Try to insert a record.
1015+ $ id = ttTimeHelper::insert ($ fields4insert );
1016+ if (!$ id ) return false ; // Something failed.
1017+
1018+ // TODO: Deal with custom fieeld log here. Currently not implemented.
9541019
955- return false ; // Not implemented.
1020+ return true ; // Not implemented.
9561021 }
9571022
9581023
0 commit comments