first commit (2007-05-21)

This commit is contained in:
2021-09-01 17:28:46 +02:00
commit c0f47b6ee9
36 changed files with 3437 additions and 0 deletions

534
src/main.cpp Normal file
View File

@ -0,0 +1,534 @@
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <Math.hpp>
#include <inifiles.hpp>
#include "main.h"
#include "splash.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "VidGrab"
#pragma link "ZAbstractDataset"
#pragma link "ZAbstractRODataset"
#pragma link "ZConnection"
#pragma link "ZDataset"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
currentUID = 0;
txt0->Caption = "";
camPreviewStarted = false;
pFondoAPP = new TPicture();
AnsiString filename;
Randomize();
filename = ExtractFileDir( Application->ExeName )+"\\bg\\bg0"+AnsiString(RandomRange(1,7))+".jpg";
if ( FileExists(filename) )
pFondoAPP->LoadFromFile(filename);
Color = clBlack;
if ( pFondoAPP->Graphic && !pFondoAPP->Graphic->Empty )
{
Image1->Picture->Assign(pFondoAPP);
Image1->Top = (this->Width-pFondoAPP->Width)/2;
Image1->Left = (this->Height-pFondoAPP->Height)/2;
Image1->Width = pFondoAPP->Width;//Min(this->Width,pFondoAPP->Width);
Image1->Height = pFondoAPP->Height;//Min(this->Height,pFondoAPP->Height);
// Canvas->Draw( (this->Width-pFondoAPP->Width)/2,(this->Height-pFondoAPP->Height)/2,pFondoAPP->Graphic);
}
VideoGrabber1->Visible = false;
// VideoGrabber1->StartPreview();
if ( splashScreen )
{
splashScreen->loaded_main = true;
if ( splashScreen->timeOut ) splashScreen->Close();
}
initDB();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::initDB(void)
{
TIniFile *ini;
ini = new TIniFile( ExtractFileDir( Application->ExeName ) + "\\controlHorario.INI" );
ZConnection1->HostName = ini->ReadString( "DB", "Host", "localhost" );
ZConnection1->Database = ini->ReadString( "DB", "DB", "controlHorario" );
ZConnection1->LoginPrompt = ini->ReadBool( "DB", "LoginPrompt", false );
ZConnection1->User = ini->ReadString( "DB", "Login", "controlHorario_user" );
ZConnection1->Password = ini->ReadString( "DB", "Password", "controlHorario_pass" );
ZConnection1->Port = ini->ReadInteger( "DB", "Port", 3306 );
ZConnection1->Protocol = ini->ReadString( "DB", "protocol", "mysql-4.1" );
try {
ZConnection1->Connect();
} catch(...) {
// nothing
ZConnection1AfterDisconnect(NULL);
}
delete ini;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
/*
Color = clBlack;
if ( pFondoAPP->Graphic && !pFondoAPP->Graphic->Empty )
Canvas->Draw( (this->Width-pFondoAPP->Width)/2,(this->Height-pFondoAPP->Height)/2,pFondoAPP->Graphic);
*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
/* Recorrer todos los elementos y reubicarlos...
*/
int i,offsetX, offsetY;
if ( this->Width > 792 ) offsetX = (this->Width-792)/2; else offsetX = 0;
if ( this->Width > 566 ) offsetY = (this->Height-566)/2; else offsetY = 0;
Left = 0;
Top = 0;
TComponent *Temp;
for ( i=this->ComponentCount-1; i>=0; i-- )
{
Temp = this->Components[i];
// only move components that are not controls
if (dynamic_cast<TControl *>(Temp) != NULL)
{
if ( Temp!=clock )
{
((TControl *)Temp)->Left += offsetX;
((TControl *)Temp)->Top += offsetY;
}
}
}
}
//---------------------------------------------------------------------------
/*
if ( camPreviewStarted )
VideoGrabber1->CaptureFrameTo (fc_TBitmap, "");
*/
//---------------------------------------------------------------------------
void __fastcall TForm1::VideoGrabber1FrameCaptureCompleted(TObject *Sender,
const TFrameData &FrameData, TFrameCaptureDest DestType,
AnsiString FileName, bool Success)
{
// Graphics::TBitmap *Frame_Bitmap;
switch (DestType) {
case fc_BmpFile:
// Memo1->Lines->Add (FileName + " created");
break;
case fc_JpegFile:
// Memo1->Lines->Add (FileName + " created");
break;
case fc_TBitmap:
// Frame_Bitmap = (Graphics::TBitmap*) FrameData;
//Requires "jpeg.hpp" to be included in the source file
TJPEGImage *jp = new TJPEGImage();
try
{
jp->Assign(FrameData.Bitmap);
jp->SaveToFile("cam_"+AnsiString(FrameData.FrameNumber)+".jpg");
}
__finally
{
delete jp;
}
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
VideoGrabber1->StopPreview();
if ( VideoGrabber1->Busy ) CanClose = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::VideoGrabber1PreviewStarted(TObject *Sender)
{
camPreviewStarted = true;
VideoGrabber1->Visible = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
clock->Caption = (TDateTime::CurrentTime()).TimeString();
if ( !ZConnection1->Connected && nextTry>=0 )
{
if ( nextTry==0 )
{
try {
nextTry = -1;
ZConnection1->Connect();
} catch(...) {
// nothing
ZConnection1AfterDisconnect(NULL);
}
} else {
txt0->Caption = "ERROR CONECTANDO DB ("+AnsiString(nextTry)+" sg.)";
nextTry--;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
if ( !ZConnection1->Connected ) return;
if ( Key==VK_RETURN )
{
if ( barCode01->Caption.Length() != 12 )
{
showText("Error, c<>digo no v<>lido","VUELVA A PASAR TARJETAS");
currentUID = 0;
} else {
int prefijo = barCode01->Caption.SubString(1,2).ToIntDef(0);
int codigo = barCode01->Caption.SubString(3,10).ToIntDef(0);
switch ( prefijo )
{
// C<>digos de tarjetas
case 05:
if ( existeUsuario( codigo, &ultimoEstado, &currentUser ) )
{
if ( ultimoEstado=='E' )
{
showText(currentUser,"Pase orden de Trabajo <20> Tarjeta de Salida");
currentUID = codigo;
} else {
if ( currentUID == codigo )
{
picarEntradaUsuario( codigo );
showText("ENTRADA CORRECTA", "ENTRADA CORRECTA");
currentUID = 0;
} else {
showText(currentUser, "Vuelva a pasar Tarjeta de USUARIO");
currentUID = codigo;
}
}
} else {
showText("Usuario inactivo","TARJETA NO V<>LIDA");
currentUID = 0;
}
break;
// Orden de trabajo
case 50:
if ( currentUID > 0 && ultimoEstado=='E' )
{
// Comprobamos que el operario no tenga abierta ninguna orden de trabajo
int oT = tieneOrdenTrabajoAbierta( currentUID );
if ( oT>0 && oT!=codigo )
{
showText("ERROR ORDEN de trabajo en curso","CIERRE LA ORDEN de trabajo n<>mero "+AnsiString(oT));
currentUID = 0;
} else {
AnsiString estado;
if ( existeOrdenTrabajo( codigo, currentUID, &estado ) )
{
if ( estado=="A" )
{
cierraTrabajo( currentUID, codigo );
showText(currentUser,"CERRADA ORDEN de trabajo");
} else {
iniciaTrabajo( currentUID, codigo );
showText(currentUser,"INICIADA ORDEN de trabajo");
}
} else {
showText("ORDEN de trabajo no activa","<EFBFBD> ASIGNADA A OTRO EMPLEADO");
}
currentUID = 0;
}
}
break;
// Comandos para el sistema
case 99:
switch( codigo )
{
// Salida de usuario
case 1:
if ( currentUID>0 && ultimoEstado=='E' )
{
cierraTrabajos( currentUID );
picarSalidaUsuario( currentUID );
showText(currentUser,"SALIDA CORRECTA");
} else
showText("Pase primero tarjeta de usuario","USUARIO SIN IDENTIFICAR");
break;
// Shutdown (Apagar el sistema)
case 1010:
break;
// Cerrar el programa
case 1005:
Close();
break;
// Minimizar el programa
case 2:
Application->Minimize();
break;
default:
showText("Error, c<>digo no v<>lido","VUELVA A PASAR TARJETAS");
}
currentUID = 0;
break;
case 0:
default:
showText("Error, c<>digo no v<>lido","VUELVA A PASAR TARJETAS");
currentUID = 0;
break;
}
}
barCode01->Caption = "";
barCode02->Caption = "";
} else {
if ( barCode01->Caption.Length() > 12 )
{
barCode01->Caption = "";
barCode02->Caption = "";
}
barCode01->Caption = barCode01->Caption + AnsiString(Key);
barCode02->Caption = barCode01->Caption;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::showText(AnsiString txt,AnsiString txtAux)
{
Timer2->Enabled = false;
txt0->Caption = txt;
txt1->Caption = txtAux;
Timer2->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
txt0->Caption = "";
txt1->Caption = "";
Timer2->Enabled = false;
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::existeUsuario( int uid, char *ultimoEstado, AnsiString *user )
{
bool dev;
// Comprobamos que exista el usuario
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("SELECT CONCAT_WS(' ',Nombre,Apellidos) operario FROM personas WHERE id="+AnsiString(uid));
ZQuery1->Active = ZQuery1->Connection->Connected;
if ( ZQuery1->RecordCount>0 )
{
*user = ZQuery1->FieldByName("operario")->AsString;
showText( ZQuery1->FieldByName("operario")->AsString,"" );
// Rescatamos el <20>ltimo estado de este usuario
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("SELECT flag FROM controlHorario_accesos WHERE idp="+AnsiString(uid)+" AND modid=0 ORDER BY id DESC LIMIT 0,1");
ZQuery1->Active = ZQuery1->Connection->Connected;
if ( ZQuery1->RecordCount>0 && ZQuery1->FieldByName("flag")->AsString != "S" )
*ultimoEstado = 'E';
else
*ultimoEstado = 'S';
dev = true;
} else
dev = false;
return dev;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::picarEntradaUsuario( int uid )
{
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("INSERT INTO controlHorario_accesos (timestamp,idp,evento,flag,modid,modlnk) VALUES (UNIX_TIMESTAMP(),"+AnsiString(uid)+",0,'E',0,0)");
ZQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
int __fastcall TForm1::tieneOrdenTrabajoAbierta( int uid )
{
int oT = 0;
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("SELECT idpp FROM controlHorario_pProduccionPer WHERE estado='A' AND idp="+AnsiString(uid));
ZQuery1->Active = ZQuery1->Connection->Connected;
if ( ZQuery1->RecordCount> 0 )
oT = ZQuery1->FieldByName("idpp")->AsInteger;
return oT;
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::existeOrdenTrabajo( int orden, int uid, AnsiString *estado )
{
bool dev;
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("SELECT estado FROM controlHorario_pProduccionPer WHERE idpp="+AnsiString(orden)+" AND idp="+AnsiString(uid));
ZQuery1->Active = ZQuery1->Connection->Connected;
if ( ZQuery1->RecordCount>0 )
{
*estado = ZQuery1->FieldByName("estado")->AsString;
dev = true;
} else {
dev = false;
}
return dev;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cierraTrabajo( int uid, int orden )
{
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("UPDATE controlHorario_pProduccionPer SET estado='C' WHERE idpp="+AnsiString(orden)+" AND idp="+AnsiString(uid));
ZQuery1->ExecSQL();
// Si no hay mas operarios trabajando en el parte
ZQuery2->SQL->Clear();
ZQuery2->SQL->Add("SELECT COUNT(*) c FROM controlHorario_pProduccionPer WHERE estado='A' AND idpp="+AnsiString(orden));
ZQuery2->Active = ZQuery2->Connection->Connected;
// ...lo damos por concluido
if ( ZQuery2->FieldByName("c")->AsInteger<=0 )
{
ZQuery2->SQL->Clear();
ZQuery2->SQL->Add("UPDATE controlHorario_pProduccionCab SET estado='P' WHERE id="+AnsiString(orden) );
ZQuery2->ExecSQL();
}
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("INSERT INTO controlHorario_accesos (timestamp,idp,evento,flag,modid,modlnk) VALUES (UNIX_TIMESTAMP(),"+AnsiString(uid)+",0,'S',36,"+AnsiString(orden)+")");
ZQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::iniciaTrabajo( int uid, int orden )
{
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("UPDATE controlHorario_pProduccionCab SET estado='A' WHERE id="+AnsiString(orden));
ZQuery1->ExecSQL();
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("INSERT INTO controlHorario_pProduccionPer (idpp,idp,estado) VALUE ("+AnsiString(orden)+","+AnsiString(uid)+",'A') ON DUPLICATE KEY UPDATE estado='A'");
ZQuery1->ExecSQL();
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("INSERT INTO controlHorario_accesos (timestamp,idp,evento,flag,modid,modlnk) VALUES (UNIX_TIMESTAMP(),"+AnsiString(uid)+",0,'E',36,"+AnsiString(orden)+")");
ZQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cierraTrabajos( int uid )
{
int idpp;
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("INSERT INTO controlHorario_accesos (timestamp,idp,evento,flag,modid,modlnk) ");
ZQuery1->SQL->Add(" SELECT UNIX_TIMESTAMP(),"+AnsiString(uid)+",0,'S',36,p.idpp ");
ZQuery1->SQL->Add(" FROM controlHorario_pProduccionPer p WHERE p.estado='A' AND p.idp="+AnsiString(uid));
ZQuery1->ExecSQL();
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("SELECT idpp FROM controlHorario_pProduccionPer WHERE estado='A' AND idp="+AnsiString(uid));
ZQuery1->Active = ZQuery1->Connection->Connected;
ZQuery1->First();
while( !ZQuery1->Eof )
{
idpp = ZQuery1->FieldByName("idpp")->AsInteger;
// Fijamos el estado del operario en este parte a cerrado
ZQuery2->SQL->Clear();
ZQuery2->SQL->Add("UPDATE controlHorario_pProduccionPer SET estado='C' WHERE idpp="+AnsiString(idpp)+" AND idp="+AnsiString(uid));
ZQuery2->ExecSQL();
// Si no hay mas operarios trabajando en el parte
ZQuery2->SQL->Clear();
ZQuery2->SQL->Add("SELECT COUNT(*) c FROM controlHorario_pProduccionPer WHERE estado='A' AND idpp="+AnsiString(idpp));
ZQuery2->Active = ZQuery2->Connection->Connected;
// ...lo damos por concluido
if ( ZQuery2->FieldByName("c")->AsInteger<=0 )
{
ZQuery2->SQL->Clear();
ZQuery2->SQL->Add("UPDATE controlHorario_pProduccionCab SET estado='P' WHERE id="+AnsiString(idpp) );
ZQuery2->ExecSQL();
}
ZQuery1->Next();
}
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("UPDATE controlHorario_pProduccionPer SET estado='C' WHERE estado='A' AND idp="+AnsiString(uid));
ZQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::picarSalidaUsuario( int uid )
{
ZQuery1->SQL->Clear();
ZQuery1->SQL->Add("INSERT INTO controlHorario_accesos (timestamp,idp,evento,flag,modid,modlnk) VALUES (UNIX_TIMESTAMP(),"+AnsiString(uid)+",0,'S',0,0)");
ZQuery1->ExecSQL();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ZConnection1AfterDisconnect(TObject *Sender)
{
// Reintentar conexi<78>n en 20sg
nextTry = 20;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ZConnection1BeforeConnect(TObject *Sender)
{
txt0->Caption = "CONECTANDO A RED. Por favor, espere...";
txt0->Caption = ";-)";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ZConnection1AfterConnect(TObject *Sender)
{
txt0->Caption = "";
txt1->Caption = "";
}
//---------------------------------------------------------------------------