public function resourceToModel($res, $patient)
{
$patient->nhs_num = $res->nhs_num;
$patient->hos_num = $res->hos_num;
$patient->gender = $res->gender;
$patient->dob = $res->birth_date;
$patient->date_of_death = $res->date_of_death;
$patient->gp_id = $res->gp_ref ? $res->gp_ref->getId() : null;
$patient->practice_id = $res->prac_ref ? $res->prac_ref->getId() : null;
$this->saveModel($patient);
$contact = $patient->contact;
$contact->title = $res->title;
$contact->last_name = $res->family_name;
$contact->first_name = $res->given_name;
$contact->primary_phone = $res->primary_phone;
$this->saveModel($contact);
$cur_addrs = array();
foreach ($contact->addresses as $addr) {
$cur_addrs[$addr->id] = PatientAddress::fromModel($addr);
}
$add_addrs = array();
$matched_ids = array();
foreach ($res->addresses as $new_addr) {
$found = false;
foreach ($cur_addrs as $id => $cur_addr) {
if ($cur_addr->isEqual($new_addr)) {
$matched_ids[] = $id;
$found = true;
unset($cur_addrs[$id]);
break;
}
}
if (!$found) {
$add_addrs[] = $new_addr;
}
}
$crit = new \CDbCriteria();
$crit->compare('contact_id', $contact->id)->addNotInCondition('id', $matched_ids);
\Address::model()->deleteAll($crit);
foreach ($add_addrs as $add_addr) {
$addr = new \Address();
$addr->contact_id = $contact->id;
$add_addr->toModel($addr);
$this->saveModel($addr);
}
$cur_cb_ids = array();
foreach ($patient->commissioningbodies as $cb) {
$cur_cb_ids[] = $cb->id;
}
$new_cb_ids = array();
foreach ($res->cb_refs as $cb_ref) {
$new_cb_ids[] = $cb_ref->getId();
}
$add_cb_ids = array_diff($new_cb_ids, $cur_cb_ids);
$del_cb_ids = array_diff($cur_cb_ids, $new_cb_ids);
foreach ($add_cb_ids as $cb_id) {
$cba = new \CommissioningBodyPatientAssignment();
$cba->commissioning_body_id = $cb_id;
$cba->patient_id = $patient->id;
$this->saveModel($cba);
}
if ($del_cb_ids) {
$crit = new \CDbCriteria();
$crit->compare('patient_id', $patient->id)->addInCondition('commissioning_body_id', $del_cb_ids);
\CommissioningBodyPatientAssignment::model()->deleteAll($crit);
}
}