/Nomina/Nomina.cpp

https://bitbucket.org/alejandrodu/legacy · C++ · 653 lines · 405 code · 186 blank · 62 comment · 56 complexity · c0620f4e0c601e9116c2f46768ea3e17 MD5 · raw file

  1. ///////////////////////////////////////////////////////////////////////////////////////////
  2. // Nomina.cpp
  3. ///////////////////////////////////////////////////////////////////////////////////////////
  4. #include "Nomina.h"
  5. #include <iostream.h>
  6. #include <fstream.h>
  7. #include <stdlib.h>
  8. ///////////////////////////////////////////////////////////////////////////////////////////
  9. // Constructor
  10. ///////////////////////////////////////////////////////////////////////////////////////////
  11. Nomina::Nomina()
  12. {
  13. lista = new Lista; // crear una nueva lista
  14. }
  15. ///////////////////////////////////////////////////////////////////////////////////////////
  16. // Destructor
  17. ///////////////////////////////////////////////////////////////////////////////////////////
  18. Nomina::~Nomina()
  19. {
  20. delete lista; // liberar la memoria
  21. }
  22. ///////////////////////////////////////////////////////////////////////////////////////////
  23. // Crea el archivo especificado
  24. ///////////////////////////////////////////////////////////////////////////////////////////
  25. bool Nomina::Nuevo(char *archivo)
  26. {
  27. ofstream file(archivo); // crear el objeto para el archivo con el nombre solicitado
  28. if(!file) // verificar
  29. return false;
  30. return true;
  31. }
  32. ///////////////////////////////////////////////////////////////////////////////////////////
  33. // Carga el archivo de nómina especificado
  34. ///////////////////////////////////////////////////////////////////////////////////////////
  35. bool Nomina::Cargar(char *archivo)
  36. {
  37. Administrador *a;
  38. Tactico *t;
  39. Operativo *o;
  40. Docente *d;
  41. Nodo *p = lista->ObtNodo(); // obtener el primer nodo de la lista enlazada
  42. ifstream file(archivo); // manejador del archivo
  43. int tipo, // tipo de empleado
  44. n;
  45. char nombre[100],
  46. cedula[30],
  47. cad[100];
  48. if(!file) // verificar
  49. return false;
  50. delete lista; // eliminar la lista antigua
  51. lista = new Lista; // crear una nueva (vacía)
  52. while(file.getline(cad, 100)) { // mientras no se llegue al final del archivo
  53. tipo = atoi(cad); // convertir de cadena a entero
  54. file.getline(nombre, 100); // leer el nombre
  55. file.getline(cedula, 30); // leer la cédula
  56. switch(tipo) { // según el tipo de empleado
  57. case DOCENTE:
  58. d = new Docente; // instanciar un objeto nuevo
  59. // establecer atributos
  60. d->EstNombre(nombre);
  61. d->EstCedula(cedula);
  62. file.getline(cad, 100); // leer salario
  63. n = atoi(cad); // convertir a int
  64. d->EstSalario(n); // establecer el atributo
  65. file.getline(cad, 100); // leer horas dictadas
  66. n = atoi(cad); // convertir a int
  67. d->EstHoras(n); // establecer el atributo
  68. file.getline(cad, 100); // leer horas extra
  69. n = atoi(cad); // // convertir a int
  70. d->EstHorasExtra(n); // establecer el atributo
  71. lista->InsertarNodo(d); // agregar el empleado a la lista
  72. break;
  73. case ADMINISTRADOR:
  74. a = new Administrador; // crear un objeto nuevo
  75. // establecer atributos
  76. a->EstNombre(nombre);
  77. a->EstCedula(cedula);
  78. lista->InsertarNodo(a); // agregar el empleado a la lista
  79. break;
  80. case TACTICO:
  81. t = new Tactico; // crear un objeto nuevo
  82. // establecer atributos
  83. t->EstNombre(nombre);
  84. t->EstCedula(cedula);
  85. file.getline(cad, 100);
  86. n = atoi(cad);
  87. t->EstHorasExtra(n);
  88. lista->InsertarNodo(t); // agregar el empleado a la lista
  89. break;
  90. case OPERATIVO:
  91. o = new Operativo; // crear un objeto nuevo
  92. // establecer atributos
  93. o->EstNombre(nombre);
  94. o->EstCedula(cedula);
  95. file.getline(cad, 100);
  96. n = atoi(cad);
  97. o->EstHorasExtra(n);
  98. lista->InsertarNodo(o); // agregar el empleado a la lista
  99. break;
  100. default:
  101. return false;
  102. break;
  103. }
  104. }
  105. cout << "\n Archivo <" << archivo << "> cargado.";
  106. return true;
  107. }
  108. ///////////////////////////////////////////////////////////////////////////////////////////
  109. // Guarda los datos en el archivo de nómina especificado
  110. ///////////////////////////////////////////////////////////////////////////////////////////
  111. bool Nomina::Guardar(char *archivo)
  112. {
  113. Empleado *emp;
  114. Nodo *p = lista->ObtNodo();
  115. ofstream file(archivo); // abrir el archivo
  116. if(!file) // verificar
  117. return false;
  118. while(p) { // mientras el empleado no sea nulo (no se llegue al final de la lista)
  119. emp = p->pEmpleado; // obtener el empleado del nodo actual
  120. emp->Guardar(file); // llamar al método adecuado
  121. p = p->pSiguiente; // pasar al siguiente nodo
  122. }
  123. cout << "\n Archivo <" << archivo << "> guardado.";
  124. cout << endl << "\n <Presione ENTER para continuar>";
  125. cin.get();
  126. return true;
  127. }
  128. ///////////////////////////////////////////////////////////////////////////////////////////
  129. // Añade un administrador a la lista de empleados
  130. ///////////////////////////////////////////////////////////////////////////////////////////
  131. void Nomina::AgregarAdministrador()
  132. {
  133. Administrador *e = new Administrador;
  134. char cad[100];
  135. cout << " C.C.: ";
  136. cin.getline(cad, 30);
  137. if(lista->Buscar(cad) != -1) { // verificar que no exista
  138. cout << "\n Este registro ya existe en la nomina.";
  139. cout << endl << "\n <Presione ENTER para continuar>";
  140. cin.get();
  141. return;
  142. }
  143. e->EstCedula(cad);
  144. cout << " Nombre: ";
  145. cin.getline(cad, 100);
  146. e->EstNombre(cad);
  147. lista->InsertarNodo(e); // agregar el nuevo empleado a la lista
  148. }
  149. ///////////////////////////////////////////////////////////////////////////////////////////
  150. // Añade un operativo a la lista de empleados
  151. ///////////////////////////////////////////////////////////////////////////////////////////
  152. void Nomina::AgregarOperativo()
  153. {
  154. Operativo *e = new Operativo;
  155. char cad[100];
  156. int n;
  157. cout << " C.C.: ";
  158. cin.getline(cad, 30);
  159. if(lista->Buscar(cad) != -1) { // verificar que no exista
  160. cout << "\n Este registro ya existe en la nomina.";
  161. cout << endl << "\n <Presione ENTER para continuar>";
  162. cin.get();
  163. return;
  164. }
  165. e->EstCedula(cad);
  166. cout << " Nombre: ";
  167. cin.getline(cad, 100);
  168. e->EstNombre(cad);
  169. cout << " Horas extra: ";
  170. cin.getline(cad, 30);
  171. n = atoi(cad);
  172. e->EstHorasExtra(n);
  173. lista->InsertarNodo(e); // agregar el nuevo empleado a la lista
  174. }
  175. ///////////////////////////////////////////////////////////////////////////////////////////
  176. // Añade un tactico a la lista de empleados
  177. ///////////////////////////////////////////////////////////////////////////////////////////
  178. void Nomina::AgregarTactico()
  179. {
  180. Tactico *e = new Tactico;
  181. char cad[100];
  182. int n;
  183. cout << " C.C.: ";
  184. cin.getline(cad, 30);
  185. if(lista->Buscar(cad) != -1) { // verificar que no exista
  186. cout << "\n Este registro ya existe en la nomina.";
  187. cout << endl << "\n <Presione ENTER para continuar>";
  188. cin.get();
  189. return;
  190. }
  191. e->EstCedula(cad);
  192. cout << " Nombre: ";
  193. cin.getline(cad, 100);
  194. e->EstNombre(cad);
  195. cout << " Horas extra: ";
  196. cin.getline(cad, 30);
  197. n = atoi(cad);
  198. e->EstHorasExtra(n);
  199. lista->InsertarNodo(e); // agregar el nuevo empleado a la lista
  200. }
  201. ///////////////////////////////////////////////////////////////////////////////////////////
  202. // Añade un docente a la lista de empleados
  203. ///////////////////////////////////////////////////////////////////////////////////////////
  204. void Nomina::AgregarDocente()
  205. {
  206. Docente *e = new Docente;
  207. char cad[100];
  208. int n;
  209. cout << " C.C.: ";
  210. cin.getline(cad, 30);
  211. if(lista->Buscar(cad) != -1) { // verificar que no exista
  212. cout << "\n Este registro ya existe en la nomina.";
  213. cout << endl << "\n <Presione ENTER para continuar>";
  214. cin.get();
  215. return;
  216. }
  217. e->EstCedula(cad);
  218. cout << " Nombre: ";
  219. cin.getline(cad, 100);
  220. e->EstNombre(cad);
  221. // solicitar el título del docente
  222. cout << " Titulo (1 - Pregrado 2 - Especializacion 3 - Maestria 4 - Doctorado) ? ";
  223. cin.getline(cad, 30);
  224. n = atoi(cad);
  225. // establecer el salario según el título
  226. if(n == 1)
  227. n = SALARIO_PREGRADO;
  228. else if(n == 2)
  229. n = SALARIO_ESPECIALIZACION;
  230. else if(n == 3)
  231. n = SALARIO_MAESTRIA;
  232. else if(n == 4)
  233. n = SALARIO_DOCTORADO;
  234. e->EstSalario(n);
  235. cout << " Horas dictadas: ";
  236. cin.getline(cad, 30);
  237. n = atoi(cad);
  238. e->EstHoras(n);
  239. cout << " Horas extra: ";
  240. cin.getline(cad, 30);
  241. n = atoi(cad);
  242. e->EstHorasExtra(n);
  243. lista->InsertarNodo(e); // agregar el nuevo empleado a la lista
  244. }
  245. ///////////////////////////////////////////////////////////////////////////////////////////
  246. // Elimina un empleado la lista
  247. ///////////////////////////////////////////////////////////////////////////////////////////
  248. void Nomina::EliminarEmpleado()
  249. {
  250. char cad[30];
  251. int i;
  252. cout << "\n Cedula: ";
  253. cin.getline(cad, 30); // solicitud
  254. i = lista->Buscar(cad); // buscar y obtener el índice delntro de la lista
  255. if(i != -1) // si se encontró
  256. {
  257. if(lista->RemoverNodo(i)) { // remover y verificar
  258. cout << "\n El registro ha sido eliminado.";
  259. }
  260. else {
  261. cout << "\n No se pudo eliminar el registro.";
  262. }
  263. }
  264. else { // si no se encontró
  265. cout << "\n El registro solicitado no existe.";
  266. }
  267. cout << endl << "\n <Presione ENTER para continuar>";
  268. cin.get();
  269. }
  270. ///////////////////////////////////////////////////////////////////////////////////////////
  271. // Imprime la liquidación de cada empleado
  272. ///////////////////////////////////////////////////////////////////////////////////////////
  273. void Nomina::Listado()
  274. {
  275. Empleado *emp;
  276. Nodo *p = lista->ObtNodo(); // obtener el primer nodo de la lista enlazada
  277. long salario,
  278. total = 0;
  279. int n = 0;
  280. char nombre[100],
  281. cedula[30];
  282. cout << "\n\n\n";
  283. if(!p) {
  284. cout << " No hay registros.";
  285. cout << endl << "\n <Presione ENTER para continuar>";
  286. cin.get();
  287. return;
  288. }
  289. // imprimir cabecera
  290. cout << " ------------------------------------------------------------------------------\n";
  291. cout << " | Nombre Cedula Liquidacion |\n";
  292. cout << " ------------------------------------------------------------------------------\n";
  293. do { // para cada nodo
  294. if(n > 19) { // si ya se imprimieron más de 19 empleados
  295. n = 0; // volver a comenzar
  296. cout << endl << " <Presione ENTER para continuar>";
  297. cin.get();
  298. // imprimir cabecera nuevamente
  299. cout << " ------------------------------------------------------------------------------\n";
  300. cout << " | Nombre Cedula Liquidacion |\n";
  301. cout << " ------------------------------------------------------------------------------\n";
  302. }
  303. emp = p->pEmpleado; // obtener el empleado del nodo actual
  304. // obtener datos
  305. emp->ObtNombre(nombre);
  306. emp->ObtCedula(cedula);
  307. salario = emp->Liquidacion(); // obtener liquidación
  308. total += salario; // sumar al total
  309. // imprimir datos
  310. cout << " ";
  311. cout.setf(ios::left);
  312. cout.width(45);
  313. cout << nombre;
  314. cout.width(12);
  315. cout << cedula << flush;
  316. cout << salario << "\n";
  317. p = p->pSiguiente; // pasar al siguiente nodo
  318. n++; // siguiente línea
  319. } while (p); // mientras no se llegue al final de la lista enlazada
  320. // imprimir el total al finalizar la lista
  321. cout << endl;
  322. cout << " Total: $" << total;
  323. cout << endl << "\n <Presione ENTER para continuar>";
  324. cin.get();
  325. }
  326. ///////////////////////////////////////////////////////////////////////////////////////////
  327. // Imprime la liquidación total de la nómina
  328. ///////////////////////////////////////////////////////////////////////////////////////////
  329. void Nomina::Total()
  330. {
  331. Empleado *emp;
  332. Nodo *p = lista->ObtNodo();
  333. int i = 0;
  334. long salario,
  335. total = 0;
  336. for(i = 0; p; i++) { // cada nodo
  337. emp = p->pEmpleado; // obtener el empleado
  338. salario = emp->Liquidacion(); // obtener liquidación
  339. total += salario; // sumar al total
  340. p = p->pSiguiente; // pasar al siguiente nodo
  341. }
  342. if(i) { // si se imprimió al menos un empleado
  343. cout << "\n\n Liquidacion para " << i << " empleados.";
  344. cout << "\n\n Total: $" << total;
  345. }
  346. else {
  347. cout << "\n No hay registros.";
  348. }
  349. cout << endl << "\n <Presione ENTER para continuar>";
  350. cin.get();
  351. }
  352. ///////////////////////////////////////////////////////////////////////////////////////////
  353. // Imprime la liquidación total de empleados administrativos
  354. ///////////////////////////////////////////////////////////////////////////////////////////
  355. void Nomina::TotalAdministrativos()
  356. {
  357. Empleado *emp;
  358. Nodo *p = lista->ObtNodo();
  359. int i = 0;
  360. long salario,
  361. total = 0;
  362. while(p) {
  363. emp = p->pEmpleado;
  364. if(emp->ObtTipo() == ADMINISTRADOR) {
  365. i++;
  366. salario = emp->Liquidacion();
  367. total += salario;
  368. }
  369. p = p->pSiguiente;
  370. }
  371. if(i) {
  372. cout << "\n\n Liquidacion para " << i << " empleados administrativos.";
  373. cout << "\n\n Total: $" << total;
  374. }
  375. else {
  376. cout << "\n No hay registros de este tipo.";
  377. }
  378. cout << endl << "\n <Presione ENTER para continuar>";
  379. cin.get();
  380. }
  381. ///////////////////////////////////////////////////////////////////////////////////////////
  382. // Imprime la liquidación total de empleados tacticos
  383. ///////////////////////////////////////////////////////////////////////////////////////////
  384. void Nomina::TotalTacticos()
  385. {
  386. Empleado *emp;
  387. Nodo *p = lista->ObtNodo();
  388. int i = 0;
  389. long salario,
  390. total = 0;
  391. while(p) {
  392. emp = p->pEmpleado;
  393. if(emp->ObtTipo() == TACTICO) {
  394. i++;
  395. salario = emp->Liquidacion();
  396. total += salario;
  397. }
  398. p = p->pSiguiente;
  399. }
  400. if(i) {
  401. cout << "\n\n Liquidacion para " << i << " empleados tacticos.";
  402. cout << "\n\n Total: $" << total;
  403. }
  404. else {
  405. cout << "\n No hay registros de este tipo.";
  406. }
  407. cout << endl << "\n <Presione ENTER para continuar>";
  408. cin.get();
  409. }
  410. ///////////////////////////////////////////////////////////////////////////////////////////
  411. // Imprime la liquidación total de empleados operativos
  412. ///////////////////////////////////////////////////////////////////////////////////////////
  413. void Nomina::TotalOperativos()
  414. {
  415. Empleado *emp;
  416. Nodo *p = lista->ObtNodo();
  417. int i = 0;
  418. long salario,
  419. total = 0;
  420. while(p) {
  421. emp = p->pEmpleado;
  422. if(emp->ObtTipo() == OPERATIVO) {
  423. i++;
  424. salario = emp->Liquidacion();
  425. total += salario;
  426. }
  427. p = p->pSiguiente;
  428. }
  429. if(i) {
  430. cout << "\n\n Liquidacion para " << i << " empleados operativos.";
  431. cout << "\n\n Total: $" << total;
  432. }
  433. else {
  434. cout << "\n No hay registros de este tipo.";
  435. }
  436. cout << endl << "\n <Presione ENTER para continuar>";
  437. cin.get();
  438. }
  439. ///////////////////////////////////////////////////////////////////////////////////////////
  440. // Imprime la liquidación total de los docentes
  441. ///////////////////////////////////////////////////////////////////////////////////////////
  442. void Nomina::TotalDocentes()
  443. {
  444. Empleado *emp;
  445. Nodo *p = lista->ObtNodo();
  446. int i = 0;
  447. long salario,
  448. total = 0;
  449. while(p) {
  450. emp = p->pEmpleado;
  451. if(emp->ObtTipo() == DOCENTE) {
  452. i++;
  453. salario = emp->Liquidacion();
  454. total += salario;
  455. }
  456. p = p->pSiguiente;
  457. }
  458. if(i) {
  459. cout << "\n\n Liquidacion para " << i << " docentes.";
  460. cout << "\n\n Total: $" << total;
  461. }
  462. else {
  463. cout << "\n No hay registros de este tipo.";
  464. }
  465. cout << endl << "\n <Presione ENTER para continuar>";
  466. cin.get();
  467. }