/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package clips.directory.editors.update.updaters.collaborators;
import beans.user.collaborator.entities.CollaboratorFunctionsDetails;
import beans.user.search.ClientFilter;
import cli_fmw.delegate.directory.UpdaterDirectory;
import cli_fmw.delegate.directory.complex.DirectoryLocator;
import cli_fmw.main.ClipsException;
import cli_fmw.main.MainWindow;
import cli_fmw.main.audit.AuditManager;
import cli_fmw.utils.MessageBox;
import cli_fmw.utils.ModalDialog;
import cli_fmw.utils.SelectorEditable;
import clips.delegate.client.ClientLocal;
import clips.delegate.client.ClientSearchLocal;
import clips.delegate.client.CollaboratorFunctionsChunk;
import clips.delegate.client.CollaboratorLocal;
import clips.delegate.directory.ro.DirectoryCollaborator;
import clips.delegate.directory.ro.DirectoryCollaboratorItem;
import clips.delegate.directory.ro.DirectoryLpuItem;
import clips.delegate.directory.simple.dvr.DirectoryDvr;
import clips.delegate.directory.simple.dvr.DirectoryDvrItem;
import clips.delegate.directory.simple.medicalAidType.DirectoryMedicalAidType;
import clips.delegate.directory.simple.medicalAidType.DirectoryMedicalAidTypeItem;
import clips.delegate.directory.simple.name.DirectoryName;
import clips.delegate.directory.simple.name.DirectoryNameItem;
import clips.delegate.directory.simple.pathron.DirectoryPathron;
import clips.delegate.directory.simple.pathron.DirectoryPathronItem;
import clips.delegate.directory.simple.receptionType.DirectoryReceptionType;
import clips.delegate.directory.simple.receptionType.DirectoryReceptionTypeItem;
import clips.delegate.directory.simple.speciality.DirectorySpeciality;
import clips.delegate.directory.simple.surname.DirectorySurname;
import clips.delegate.directory.simple.surname.DirectorySurnameItem;
import clips.login.UserInfo;
import clips.main.ClipsConfig;
import framework.beans.directory.DirectoryItemDetails;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.xBaseJ.micro.DBF;
import org.xBaseJ.micro.fields.Field;
import org.xBaseJ.micro.xBaseJException;
/**
*
* @author vip
*/
public class UpdaterCollaborators extends UpdaterDirectory{
private ArrayList<CollaboratorLocal> collabList;
private ArrayList<CollabData> colDataList;
private HashMap<ColDataKey,ArrayList<ClientLocal>> colClientMap;
private ClientSearchLocal clientSearchLocal;
private DirectoryCollaborator dirCollab;
private enum Col{
ID,
FAMILY,
NAME,
FATHER,
KOD_SPEC,
KOD_PRIEM,
DOLV,
VMU,
SNILS,
}
private AuditManager am;
public UpdaterCollaborators(AuditManager am) {
this.am = am;
}
@Override
public String getFilename() {
return "WRACH.DBF";
}
@Override
public String getTitle() {
return "Врачи";
}
@Override
protected void updateImpl() throws ClipsException {
dirCollab = DirectoryLocator.getDirectory(DirectoryCollaborator.class);
collabList = null;
clientSearchLocal = new ClientSearchLocal(am);
ClipsConfig cfg = ClipsConfig.getInstance();
File file = new File(cfg.getLastDBFImportPath(),getFilename());
DBF dbf = createDBF(file);
HashMap<Col, Field> fields = new HashMap<Col, Field>();
try {
for (int i = 0; i < Col.values().length; i++) {
Col col = Col.values()[i];
fields.put(col, dbf.getField(col.toString()));
}
} catch (xBaseJException ex) {
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName(), ex);
}
int recordCount = dbf.getRecordCount();
DirectorySurname dirSurname = DirectoryLocator.getDirectory(DirectorySurname.class);
DirectoryName dirName = DirectoryLocator.getDirectory(DirectoryName.class);
DirectoryPathron dirPathron = DirectoryLocator.getDirectory(DirectoryPathron.class);
DirectorySpeciality dirSpec = DirectoryLocator.getDirectory(DirectorySpeciality.class);
DirectoryReceptionType dirRecType = DirectoryLocator.getDirectory(DirectoryReceptionType.class);
DirectoryDvr dirDvr = DirectoryLocator.getDirectory(DirectoryDvr.class);
DirectoryMedicalAidType dirVmu = DirectoryLocator.getDirectory(DirectoryMedicalAidType.class);
colDataList = new ArrayList<CollabData>();
colClientMap = new HashMap<ColDataKey, ArrayList<ClientLocal>>();
for (int i = 0; i < recordCount; i++) {
try {
dbf.read();
if (dbf.deleted()) {
continue;
}
if (fields.get(Col.FAMILY).get().trim().isEmpty()) {
continue;
}
String extKey = fields.get(Col.ID).get().trim();
DirectorySurnameItem surename = dirSurname.getItemFromTitle(fields.get(Col.FAMILY).get().trim());
if (surename == null) {
DirectoryItemDetails d = new DirectoryItemDetails(fields.get(Col.FAMILY).get().trim());
surename = new DirectorySurnameItem(d);
dirSurname.getItems().append(surename);
}
int surnameID = surename.getID();
DirectoryNameItem name = dirName.getItemFromTitle(fields.get(Col.NAME).get().trim());
if (name == null) {
DirectoryItemDetails d = new DirectoryItemDetails(fields.get(Col.NAME).get().trim());
name = new DirectoryNameItem(d);
dirName.getItems().append(name);
}
int nameID = name.getID();
//Финт ушами - исправление отчества
String father = fields.get(Col.FATHER).get().trim();
if (father.equals("Тимирьянович")) {
father = "Тимерзянович";
}
DirectoryPathronItem pathron = dirPathron.getItemFromTitle(father);
if (pathron == null) {
DirectoryItemDetails d = new DirectoryItemDetails(father);
pathron = new DirectoryPathronItem(d);
dirPathron.getItems().append(pathron);
}
int pathronID = pathron.getID();
int specID = dirSpec.getItemFromExtKey(fields.get(Col.KOD_SPEC).get().trim()).getID();
DirectoryReceptionTypeItem recType = dirRecType.getItemFromExtKey(fields.get(Col.KOD_PRIEM).get().trim());
if (recType == null) {
recType = dirRecType.getItemFromExtKey("600");
}
int receptionTypeID = recType.getID();
DirectoryDvrItem dvr = dirDvr.getItemFromExtKey(fields.get(Col.DOLV).get().trim());
if (dvr == null) {
dvr = dirDvr.getItemFromID(0);
}
int dvrID = dvr.getID();
DirectoryMedicalAidTypeItem vmu = dirVmu.getItemFromExtKey(fields.get(Col.VMU).get().trim());
if (vmu == null) {
vmu = dirVmu.getItemFromID(0);
}
int vmuID = vmu.getID();
String snils = fields.get(Col.SNILS).get().trim();
CollabData cd = new CollabData(extKey, surnameID, nameID, pathronID, specID, receptionTypeID, dvrID, vmuID);
ColDataKey key = new ColDataKey(surnameID, nameID, pathronID);
colClientMap.put(key, findClient(surename.getTitle(), name.getTitle(), pathron.getTitle(), snils));
colDataList.add(cd);
} catch (IOException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
} catch (xBaseJException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
} catch (NumberFormatException ex) {
closeDBF(dbf);
throw new ClipsException("Ошибка при чтении данных из файла " + dbf.getName() + " (строка " + i + ")", ex);
}
}
changeData();
}
private void changeData() {
try {
DialogPolling dlg = new DialogPolling(MainWindow.mainWindow, colClientMap, am);
dlg.setVisible(true);
if (dlg.getDlgResult() == ModalDialog.DLG_OK) {
saveData();
}
} catch (ClipsException ex) {
MessageBox.showException(ex);
}
}
private void saveData() throws ClipsException {
for (int i = 0; i < colDataList.size(); i++) {
CollabData cd = colDataList.get(i);
ColDataKey key = new ColDataKey(cd.surnameID, cd.nameID, cd.pathronID);
ClientLocal client = colClientMap.get(key).get(0);
CollaboratorLocal collab = findCollab(client);
if (collab == null) {
collab = new CollaboratorLocal(client);
collab.save1();
dirCollab = DirectoryLocator.getDirectory(DirectoryCollaborator.class, true);
System.out.println("Загружен " + i + " " + collab);
} else {
System.out.println("Найден " + i + " " + collab + " ID = " + collab.getID());
}
CollaboratorFunctionsChunk collFunc = findFunc(collab, cd.specID, cd.receptionTypeID, cd.dvrID, cd.vmuID);
if (collFunc == null) {
CollaboratorFunctionsDetails d = new CollaboratorFunctionsDetails();
d.collaboratorID = collab.getID();
d.dvrID = cd.dvrID;
d.firstMedicalAidID = cd.vmuID;
d.receptionTypeID = cd.receptionTypeID;
d.specialityID = cd.specID;
d.external_key = cd.extKey;
collFunc = new CollaboratorFunctionsChunk(collab, d);
collab.getFunctions().append(collFunc);
collab.save1();
}
}
}
private CollaboratorLocal findCollab(ClientLocal client) throws ClipsException {
collabList = new ArrayList<CollaboratorLocal>();
DirectoryLpuItem lpu = UserInfo.get().getCollaborator().getLpu();
List<DirectoryCollaboratorItem> items = dirCollab.getItemsFiltered(lpu, false, false, false);
for (int i = 0; i < items.size(); i++) {
CollaboratorLocal collab = new CollaboratorLocal(items.get(i).getID(), am);
collabList.add(collab);
}
for (int i = 0; i < collabList.size(); i++) {
if (collabList.get(i).getClient().getID() == client.getID()) {
return collabList.get(i);
}
}
return null;
}
private ArrayList<ClientLocal> findClient(String surname, String name, String pathron, String snils) throws ClipsException {
ClientFilter filter = new ClientFilter();
filter.surname = surname;
filter.name = name;
filter.pathron = pathron;
ArrayList<ClientLocal> list = clientSearchLocal.getClientList(filter);
if (list.size() > 1) {
//Если найдено несколько пробуем уточнить по снилсу
ArrayList<ClientLocal> tmp = new ArrayList<ClientLocal>(list);
for (Iterator<ClientLocal> it = tmp.iterator(); it.hasNext();) {
ClientLocal clientLocal = it.next();
if (!clientLocal.getSnils().equals(snils)) {
it.remove();
}
}
if (tmp.size() == 1) {
return tmp;
}
}
return list;
}
private CollaboratorFunctionsChunk findFunc(CollaboratorLocal collab, int specID, int receptionTypeID, int dvrID, int vmuID) throws ClipsException {
SelectorEditable<CollaboratorFunctionsChunk> functions = collab.getFunctions();
for (int i = 0; i < functions.size(); i++) {
CollaboratorFunctionsChunk chunk = functions.get(i);
if (chunk.getSpeciality().getID() == specID
&& chunk.getReceptionType().getID() == receptionTypeID
&& chunk.getDvr().getID() == dvrID
&& chunk.getFirstMedicalAid().getID() == vmuID) {
return chunk;
}
}
return null;
}
}