Beispiel #1
0
        public ActionResult NumberSearch( string data )
        {
            if( !Auth() )
                return CheckInMessage.createErrorReturn( "Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS );

            CheckInMessage dataIn = CheckInMessage.createFromString( data );
            CheckInNumberSearch cns = JsonConvert.DeserializeObject<CheckInNumberSearch>( dataIn.data );

            DbUtil.LogActivity( "Check-In Number Search: " + cns.search );

            List<CheckinMatch> matches = DbUtil.Db.CheckinMatch( cns.search ).ToList();

            CheckInMessage br = new CheckInMessage();
            br.setNoError();

            int tzOffset = DbUtil.Db.Setting( "TZOffset", "0" ).ToInt();

            List<CheckInFamily> families = new List<CheckInFamily>();

            if( matches.Count > 0 ) {
                foreach( CheckinMatch match in matches ) {
                    if( match.Familyid != null ) {
                        CheckInFamily family = new CheckInFamily( match.Familyid.Value, match.Name, match.Locked ?? false );

                        List<CheckinFamilyMember> members = (from a in DbUtil.Db.CheckinFamilyMembers( match.Familyid, cns.campus, cns.day ).ToList()
                                                             orderby a.Position, a.Position == 10 ? a.Genderid : 10, a.Age descending, a.Hour
                                                             select a).ToList();

                        foreach( CheckinFamilyMember member in members ) {
                            family.addMember( member, cns.day, tzOffset );
                        }

                        families.Add( family );

                        br.count++;
                    }
                }

                br.data = SerializeJSON( families, dataIn.version );
            }

            return br;
        }
Beispiel #2
0
        public ActionResult UnLockFamily( string data )
        {
            if( !Auth() )
                return CheckInMessage.createErrorReturn( "Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS );

            CheckInMessage dataIn = CheckInMessage.createFromString( data );

            FamilyCheckinLock lockf = DbUtil.Db.FamilyCheckinLocks.SingleOrDefault( f => f.FamilyId == dataIn.argInt );

            if( lockf != null ) {
                lockf.Locked = false;
                DbUtil.Db.SubmitChanges();
            }

            CheckInMessage br = new CheckInMessage();
            br.setNoError();
            br.id = dataIn.argInt;
            return br;
        }
Beispiel #3
0
        public ActionResult SaveSettings(string data)
        {
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage       dataIn = CheckInMessage.createFromString(data);
            CheckInSettingsEntry entry  = JsonConvert.DeserializeObject <CheckInSettingsEntry>(dataIn.data);

            CheckInSetting setting = (from e in CurrentDatabase.CheckInSettings
                                      where e.Name == entry.name
                                      select e).SingleOrDefault();

            CheckInMessage br = new CheckInMessage();

            if (setting == null)
            {
                setting = new CheckInSetting
                {
                    Name     = entry.name,
                    Settings = entry.settings
                };

                CurrentDatabase.CheckInSettings.InsertOnSubmit(setting);

                br.data = "Settings saved";
            }
            else
            {
                setting.Settings = entry.settings;

                br.data = "Settings updated";
            }

            CurrentDatabase.SubmitChanges();

            br.setNoError();
            br.id    = setting.Id;
            br.count = 1;

            return(br);
        }
Beispiel #4
0
        public ActionResult FamilyInfo(string data)
        {
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage dataIn = CheckInMessage.createFromString(data);

            Family family = CurrentDatabase.Families.First(fam => fam.FamilyId == dataIn.argInt);

            CheckInMessage br = new CheckInMessage();

            br.setNoError();
            br.count = 1;
            br.id    = family.FamilyId;
            br.data  = SerializeJSON(new CheckInFamilyInfo(family), dataIn.version);
            return(br);
        }
        public ActionResult JoinOrg(string data)
        {
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage dataIn = CheckInMessage.createFromString(data);
            CheckInJoinOrg cjo    = JsonConvert.DeserializeObject <CheckInJoinOrg>(dataIn.data);

            OrganizationMember om = CurrentDatabase.OrganizationMembers.SingleOrDefault(m => m.PeopleId == cjo.peopleID && m.OrganizationId == cjo.orgID);

            if (om == null && cjo.join)
            {
                om = OrganizationMember.InsertOrgMembers(CurrentDatabase, cjo.orgID, cjo.peopleID, MemberTypeCode.Member, DateTime.Today);
            }

            if (om != null && !cjo.join)
            {
                om.Drop(CurrentDatabase, CurrentImageDatabase, DateTime.Now);

                DbUtil.LogActivity($"Dropped {om.PeopleId} for {om.Organization.OrganizationId} via {dataIn.getSourceOS()} app", peopleid: om.PeopleId, orgid: om.OrganizationId);
            }

            CurrentDatabase.SubmitChanges();

            // Check Entry Point and replace if Check-In
            Person person = CurrentDatabase.People.FirstOrDefault(p => p.PeopleId == cjo.peopleID);

            if (person?.EntryPoint != null && person.EntryPoint.Code == "CHECKIN" && om != null)
            {
                person.EntryPoint = om.Organization.EntryPoint;
                CurrentDatabase.SubmitChanges();
            }

            CheckInMessage br = new CheckInMessage();

            br.setNoError();
            br.count = 1;

            return(br);
        }
        public ActionResult RecordAttend(string data)
        {
            // Authenticate first
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage dataIn = CheckInMessage.createFromString(data);
            CheckInAttend  cia    = JsonConvert.DeserializeObject <CheckInAttend>(dataIn.data);

            Meeting meeting = CurrentDatabase.Meetings.SingleOrDefault(m => m.OrganizationId == cia.orgID && m.MeetingDate == cia.datetime);

            if (meeting == null)
            {
                int meetingID = CurrentDatabase.CreateMeeting(cia.orgID, cia.datetime);

                meeting = CurrentDatabase.Meetings.SingleOrDefault(m => m.MeetingId == meetingID);
            }

            Attend.RecordAttend(CurrentDatabase, cia.peopleID, cia.orgID, cia.present, cia.datetime);

            CurrentDatabase.UpdateMeetingCounters(cia.orgID);
            DbUtil.LogActivity($"Check-In Record Attend Org ID:{cia.orgID} People ID:{cia.peopleID} User ID:{CurrentDatabase.UserPeopleId} Attended:{cia.present}");

            // Check Entry Point and replace if Check-In
            Person person = CurrentDatabase.People.FirstOrDefault(p => p.PeopleId == cia.peopleID);

            if (person != null && person.EntryPoint != null && person.EntryPoint.Code != null && person.EntryPoint.Code == "CHECKIN" && meeting != null)
            {
                person.EntryPoint = meeting.Organization.EntryPoint;
                CurrentDatabase.SubmitChanges();
            }

            CheckInMessage br = new CheckInMessage();

            br.setNoError();
            br.count = 1;

            return(br);
        }
Beispiel #7
0
        public ActionResult PrintLabels( string data )
        {
            if( !Auth() )
                return CheckInMessage.createErrorReturn( "Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS );

            CheckInMessage dataIn = CheckInMessage.createFromString( data );
            List<CheckInPrintLabel> labels = JsonConvert.DeserializeObject<List<CheckInPrintLabel>>( dataIn.data );

            string securityCode = DbUtil.Db.NextSecurityCode( ).Select( c => c.Code ).Single();

            StringBuilder builder = new StringBuilder();

            XmlWriter writer = XmlWriter.Create( builder );
            writer.WriteStartDocument();
            writer.WriteStartElement( "PrintJob" );

            writer.WriteElementString( "securitycode", securityCode );

            writer.WriteStartElement( "list" );

            foreach( CheckInPrintLabel label in labels ) {
                label.writeToXML( writer, securityCode );
            }

            // list
            writer.WriteEndElement();
            // PrintJob
            writer.WriteEndElement();
            writer.Close();

            PrintJob job = new PrintJob {Id = dataIn.argString, Data = builder.ToString(), Stamp = DateTime.Now};

            DbUtil.Db.PrintJobs.InsertOnSubmit( job );
            DbUtil.Db.SubmitChanges();

            CheckInMessage br = new CheckInMessage();
            br.setNoError();
            br.count = 1;

            return br;
        }
        public ActionResult Family(string data)
        {
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage      dataIn = CheckInMessage.createFromString(data);
            CheckInFamilySearch cfs    = JsonConvert.DeserializeObject <CheckInFamilySearch>(dataIn.data);

            DbUtil.LogActivity("Check-In Family: " + cfs.familyID);

            CheckInMessage br = new CheckInMessage();

            br.setNoError();

            int tzOffset = CurrentDatabase.Setting("TZOffset", "0").ToInt();

            List <CheckInFamily> families = new List <CheckInFamily>();

            FamilyCheckinLock familyLock = CurrentDatabase.FamilyCheckinLocks.SingleOrDefault(f => f.FamilyId == dataIn.argInt);

            CheckInFamily family = new CheckInFamily(cfs.familyID, "", familyLock?.Locked ?? false, CurrentDatabase, CurrentImageDatabase);

            List <CheckinFamilyMember> members = (from a in CurrentDatabase.CheckinFamilyMembers(cfs.familyID, cfs.campus, cfs.day).ToList()
                                                  orderby a.Position, a.Position == 10 ? a.Genderid : 10, a.Age descending, a.Hour
                                                  select a).ToList();

            foreach (CheckinFamilyMember member in members)
            {
                family.addMember(CurrentDatabase, CurrentImageDatabase, member, cfs.day, tzOffset);
            }

            families.Add(family);
            br.count = 1;

            br.data = SerializeJSON(families, dataIn.version);
            return(br);
        }
        public ActionResult FetchPerson(string data)
        {
            // Authenticate first
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage dataIn = CheckInMessage.createFromString(data);

            CheckInMessage br = new CheckInMessage();

            Person person = CurrentDatabase.People.SingleOrDefault(p => p.PeopleId == dataIn.argInt);

            if (person == null)
            {
                br.setError(CheckInMessage.API_ERROR_PERSON_NOT_FOUND);
                br.data = "Person not found.";
                return(br);
            }

            br.setNoError();
            br.count = 1;

            if (dataIn.device == CheckInMessage.API_DEVICE_ANDROID)
            {
                br.data = SerializeJSON(new CheckInPerson().populate(person), dataIn.version);
            }
            else
            {
                List <CheckInPerson> mp = new List <CheckInPerson> {
                    new CheckInPerson().populate(person)
                };
                br.data = SerializeJSON(mp, dataIn.version);
            }

            return(br);
        }
        public ActionResult NameSearch(string data)
        {
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage    dataIn = CheckInMessage.createFromString(data);
            CheckInNameSearch cns    = JsonConvert.DeserializeObject <CheckInNameSearch>(dataIn.data);

            cns.splitName();

            DbUtil.LogActivity("Check-In Name Search: " + cns.name);

            IQueryable <Person> q = CurrentDatabase.People.Select(p => p);

            if (cns.first.HasValue())
            {
                q = from p in q
                    where (p.LastName.StartsWith(cns.last) || p.MaidenName.StartsWith(cns.last)) &&
                    (p.FirstName.StartsWith(cns.first) || p.NickName.StartsWith(cns.first) || p.MiddleName.StartsWith(cns.first))
                    select p;
            }
            else
            {
                q = from p in q
                    where p.LastName.StartsWith(cns.last) || p.FirstName.StartsWith(cns.last) || p.NickName.StartsWith(cns.last) || p.MiddleName.StartsWith(cns.last)
                    select p;
            }

            List <CheckInPerson> q2 = (from p in q
                                       let recreg = p.RecRegs.FirstOrDefault()
                                                    orderby p.Name2, p.PeopleId
                                       where p.DeceasedDate == null
                                       select new CheckInPerson
            {
                id = p.PeopleId,
                familyID = p.FamilyId,
                first = p.PreferredName,
                last = p.LastName,
                goesby = p.NickName,
                altName = p.AltName,
                cell = p.CellPhone,
                home = p.HomePhone,
                address = p.Family.AddressLineOne,
                age = p.Age ?? 0
            }).Take(200).ToList();

            foreach (CheckInPerson person in q2)
            {
                person.loadImage(CurrentDatabase, CurrentImageDatabase);
            }

            CheckInMessage br = new CheckInMessage();

            br.setNoError();
            br.count = q2.Count();
            br.data  = SerializeJSON(q2, dataIn.version);

            return(br);
        }
        public ActionResult ClassSearch(string data)
        {
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage     dataIn = CheckInMessage.createFromString(data);
            CheckInClassSearch ccs    = JsonConvert.DeserializeObject <CheckInClassSearch>(dataIn.data);

            DbUtil.LogActivity("Check-In Class Search: " + ccs.peopleID);

            var person = (from p in CurrentDatabase.People
                          where p.PeopleId == ccs.peopleID
                          select new { p.FamilyId, p.BirthDate, p.Grade }).SingleOrDefault();

            if (person == null)
            {
                return(CheckInMessage.createErrorReturn("Person not found", CheckInMessage.API_ERROR_PERSON_NOT_FOUND));
            }

            CheckInMessage br = new CheckInMessage();

            br.setNoError();

            List <CheckInOrganization> orgs = (from o in CurrentDatabase.Organizations
                                               let sc = o.OrgSchedules.FirstOrDefault()
                                                        let meetingHours = CurrentDatabase.GetTodaysMeetingHours(o.OrganizationId, ccs.day)
                                                                           let bdaystart = o.BirthDayStart ?? DateTime.MaxValue
                                                                                           where (o.SuspendCheckin ?? false) == false || ccs.noAgeCheck
                                                                                           where person.BirthDate == null || person.BirthDate <= o.BirthDayEnd || o.BirthDayEnd == null || ccs.noAgeCheck
                                                                                           where person.BirthDate == null || person.BirthDate >= o.BirthDayStart || o.BirthDayStart == null || ccs.noAgeCheck
                                                                                           where o.CanSelfCheckin == true
                                                                                           where (o.ClassFilled ?? false) == false
                                                                                           where (o.CampusId == null && o.AllowNonCampusCheckIn == true) || o.CampusId == ccs.campus || ccs.campus == 0
                                                                                           where o.OrganizationStatusId == OrgStatusCode.Active
                                                                                           orderby sc.SchedTime.Value.TimeOfDay, bdaystart, o.OrganizationName
                                               from meeting in meetingHours
                                               select new CheckInOrganization()
            {
                id = o.OrganizationId,
                leader = o.LeaderName,
                name = o.OrganizationName,
                hour = meeting.Hour.Value,
                birthdayStart = o.BirthDayStart,
                birthdayEnd = o.BirthDayEnd,
                location = o.Location,
                allowOverlap = o.AllowAttendOverlap
            }).ToList();

            // Add lead time adjustment for different timezones here
            int tzOffset = CurrentDatabase.Setting("TZOffset", "0").ToInt();

            foreach (CheckInOrganization org in orgs)
            {
                org.adjustLeadTime(ccs.day, tzOffset);
            }

            br.data = SerializeJSON(orgs, dataIn.version);

            return(br);
        }
        public ActionResult AddEditPerson(string data)
        {
            // Authenticate first
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage       dataIn = CheckInMessage.createFromString(data);
            CheckInAddEditPerson aep    = JsonConvert.DeserializeObject <CheckInAddEditPerson>(dataIn.data);

            aep.clean();

            CheckInAddEditPersonResults results = new CheckInAddEditPersonResults();

            Family f;
            Person p;

            if (aep.edit)
            {
                p = CurrentDatabase.LoadPersonById(aep.id);

                f = CurrentDatabase.Families.First(fam => fam.FamilyId == p.FamilyId);

                f.HomePhone      = aep.homePhone;
                f.AddressLineOne = aep.address;
                f.AddressLineTwo = aep.address2;
                f.CityName       = aep.city;
                f.StateCode      = aep.state;
                f.ZipCode        = aep.zipcode;
                f.CountryName    = aep.country;
            }
            else
            {
                results.newPerson = true;

                p = new Person
                {
                    CreatedDate    = Util.Now,
                    CreatedBy      = CurrentDatabase.UserId,
                    MemberStatusId = MemberStatusCode.JustAdded,
                    AddressTypeId  = 10,
                    OriginId       = OriginCode.Visit,
                    EntryPoint     = getCheckInEntryPointID()
                };

                if (aep.campus > 0)
                {
                    p.CampusId = aep.campus;
                }

                p.Name = "";

                if (aep.familyID > 0)
                {
                    f = CurrentDatabase.Families.First(fam => fam.FamilyId == aep.familyID);
                }
                else
                {
                    results.newFamily = true;

                    f = new Family();
                    CurrentDatabase.Families.InsertOnSubmit(f);
                }

                f.HomePhone      = aep.homePhone;
                f.AddressLineOne = aep.address;
                f.AddressLineTwo = aep.address2;
                f.CityName       = aep.city;
                f.StateCode      = aep.state;
                f.ZipCode        = aep.zipcode;
                f.CountryName    = aep.country;

                f.People.Add(p);

                p.PositionInFamilyId = CurrentDatabase.ComputePositionInFamily(aep.getAge(), aep.maritalStatusID == MaritalStatusCode.Married, f.FamilyId) ?? PositionInFamily.PrimaryAdult;
            }

            p.FirstName = aep.firstName;
            p.LastName  = aep.lastName;
            p.NickName  = aep.goesBy;
            p.AltName   = aep.altName;

            if (dataIn.version >= CheckInMessage.API_V3)
            {
                p.SetRecReg().Fname = aep.father;
                p.SetRecReg().Mname = aep.mother;
            }

            // Check-In API Version 2 or greater adds the ability to clear the birthday
            if (dataIn.version >= CheckInMessage.API_V2)
            {
                if (aep.birthdaySet && aep.birthday != null)
                {
                    p.BirthDay   = aep.birthday.Value.Day;
                    p.BirthMonth = aep.birthday.Value.Month;
                    p.BirthYear  = aep.birthday.Value.Year;
                }
                else
                {
                    if (aep.birthdayClear)
                    {
                        p.BirthDay   = null;
                        p.BirthMonth = null;
                        p.BirthYear  = null;
                    }
                }
            }
            else
            {
                if (aep.birthday != null)
                {
                    p.BirthDay   = aep.birthday.Value.Day;
                    p.BirthMonth = aep.birthday.Value.Month;
                    p.BirthYear  = aep.birthday.Value.Year;
                }
            }

            p.GenderId        = aep.genderID;
            p.MaritalStatusId = aep.maritalStatusID;

            p.FixTitle();

            p.EmailAddress = aep.eMail;
            p.CellPhone    = aep.cellPhone;
            p.HomePhone    = aep.homePhone;

            p.SetRecReg().MedicalDescription = aep.allergies;

            p.SetRecReg().Emcontact = aep.emergencyName;
            p.SetRecReg().Emphone   = aep.emergencyPhone.Truncate(50);

            p.SetRecReg().ActiveInAnotherChurch = !string.IsNullOrEmpty(aep.church);
            p.OtherPreviousChurch = aep.church;

            CurrentDatabase.SubmitChanges();

            results.familyID = f.FamilyId;
            results.peopleID = p.PeopleId;
            results.position = p.PositionInFamilyId;

            CheckInMessage br = new CheckInMessage();

            br.setNoError();
            br.count = 1;
            br.data  = SerializeJSON(results, dataIn.version);

            return(br);
        }
        public ActionResult SaveFamilyImage(string data)
        {
            // Authenticate first
            if (!Auth())
            {
                return(CheckInMessage.createErrorReturn("Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS));
            }

            CheckInMessage   dataIn = CheckInMessage.createFromString(data);
            CheckInSaveImage cisi   = JsonConvert.DeserializeObject <CheckInSaveImage>(dataIn.data);

            CheckInMessage br = new CheckInMessage();

            byte[] imageBytes = Convert.FromBase64String(cisi.image);

            Family family = CurrentDatabase.Families.SingleOrDefault(pp => pp.FamilyId == cisi.id);

            if (family != null && family.Picture != null)
            {
                // Thumb image
                Image imageDataThumb = CurrentImageDatabase.Images.SingleOrDefault(i => i.Id == family.Picture.ThumbId);

                if (imageDataThumb != null)
                {
                    CurrentImageDatabase.Images.DeleteOnSubmit(imageDataThumb);
                }

                // Small image
                Image imageDataSmall = CurrentImageDatabase.Images.SingleOrDefault(i => i.Id == family.Picture.SmallId);

                if (imageDataSmall != null)
                {
                    CurrentImageDatabase.Images.DeleteOnSubmit(imageDataSmall);
                }

                // Medium image
                Image imageDataMedium = CurrentImageDatabase.Images.SingleOrDefault(i => i.Id == family.Picture.MediumId);

                if (imageDataMedium != null)
                {
                    CurrentImageDatabase.Images.DeleteOnSubmit(imageDataMedium);
                }

                // Large image
                Image imageDataLarge = CurrentImageDatabase.Images.SingleOrDefault(i => i.Id == family.Picture.LargeId);

                if (imageDataLarge != null)
                {
                    CurrentImageDatabase.Images.DeleteOnSubmit(imageDataLarge);
                }

                family.Picture.ThumbId  = Image.NewImageFromBits(imageBytes, 50, 50, CurrentImageDatabase).Id;
                family.Picture.SmallId  = Image.NewImageFromBits(imageBytes, 120, 120, CurrentImageDatabase).Id;
                family.Picture.MediumId = Image.NewImageFromBits(imageBytes, 320, 400, CurrentImageDatabase).Id;
                family.Picture.LargeId  = Image.NewImageFromBits(imageBytes, CurrentImageDatabase).Id;
            }
            else
            {
                Picture newPicture = new Picture
                {
                    ThumbId  = Image.NewImageFromBits(imageBytes, 50, 50, CurrentImageDatabase).Id,
                    SmallId  = Image.NewImageFromBits(imageBytes, 120, 120, CurrentImageDatabase).Id,
                    MediumId = Image.NewImageFromBits(imageBytes, 320, 400, CurrentImageDatabase).Id,
                    LargeId  = Image.NewImageFromBits(imageBytes, CurrentImageDatabase).Id
                };

                if (family != null)
                {
                    family.Picture = newPicture;
                }
            }

            CurrentDatabase.SubmitChanges();

            br.setNoError();
            br.data  = "Image updated.";
            br.id    = cisi.id;
            br.count = 1;

            return(br);
        }
Beispiel #14
0
        public ActionResult SaveImage( string data )
        {
            // Authenticate first
            if( !Auth() )
                return CheckInMessage.createErrorReturn( "Authentication failed, please try again", CheckInMessage.API_ERROR_INVALID_CREDENTIALS );

            CheckInMessage dataIn = CheckInMessage.createFromString( data );
            CheckInSaveImage cisi = JsonConvert.DeserializeObject<CheckInSaveImage>( dataIn.data );

            CheckInMessage br = new CheckInMessage();

            byte[] imageBytes = Convert.FromBase64String( cisi.image );

            Person person = DbUtil.Db.People.SingleOrDefault( pp => pp.PeopleId == cisi.id );

            if( person != null && person.Picture != null ) {
                // Thumb image
                Image imageDataThumb = ImageData.DbUtil.Db.Images.SingleOrDefault( i => i.Id == person.Picture.ThumbId );

                if( imageDataThumb != null )
                    ImageData.DbUtil.Db.Images.DeleteOnSubmit( imageDataThumb );

                // Small image
                Image imageDataSmall = ImageData.DbUtil.Db.Images.SingleOrDefault( i => i.Id == person.Picture.SmallId );

                if( imageDataSmall != null )
                    ImageData.DbUtil.Db.Images.DeleteOnSubmit( imageDataSmall );

                // Medium image
                Image imageDataMedium = ImageData.DbUtil.Db.Images.SingleOrDefault( i => i.Id == person.Picture.MediumId );

                if( imageDataMedium != null )
                    ImageData.DbUtil.Db.Images.DeleteOnSubmit( imageDataMedium );

                // Large image
                Image imageDataLarge = ImageData.DbUtil.Db.Images.SingleOrDefault( i => i.Id == person.Picture.LargeId );

                if( imageDataLarge != null )
                    ImageData.DbUtil.Db.Images.DeleteOnSubmit( imageDataLarge );

                person.Picture.ThumbId = Image.NewImageFromBits( imageBytes, 50, 50 ).Id;
                person.Picture.SmallId = Image.NewImageFromBits( imageBytes, 120, 120 ).Id;
                person.Picture.MediumId = Image.NewImageFromBits( imageBytes, 320, 400 ).Id;
                person.Picture.LargeId = Image.NewImageFromBits( imageBytes ).Id;
            } else {
                Picture newPicture = new Picture
                {
                    ThumbId = Image.NewImageFromBits( imageBytes, 50, 50 ).Id,
                    SmallId = Image.NewImageFromBits( imageBytes, 120, 120 ).Id,
                    MediumId = Image.NewImageFromBits( imageBytes, 320, 400 ).Id,
                    LargeId = Image.NewImageFromBits( imageBytes ).Id
                };

                if( person != null ) person.Picture = newPicture;
            }

            person?.LogPictureUpload( DbUtil.Db, Util.UserPeopleId ?? 1 );

            DbUtil.Db.SubmitChanges();

            br.setNoError();
            br.data = "Image updated";
            br.id = cisi.id;
            br.count = 1;

            return br;
        }