#include <iostream>
#include <iomanip>
#include <ctime> // Agregamos la libreria para manejo de fechas
using namespace std;
struct direccion {
string provincia;
string ciudad;
string calle;
};
struct fecha {
int dia;
int mes;
int anio;
};
struct clientes {
int id;
string nombres;
direccion domicilio;
fecha f_alta;
string tiempo;
};
bool esFechaValida(const fecha& f) {
if (f.anio < 1980 || f.anio > 2023) {
return false;
}
if (f.mes < 1 || f.mes > 12) {
return false;
}
if (f.dia < 1 || f.dia > 31) {
return false;
}
if ((f.mes == 4 || f.mes == 6 || f.mes == 9 || f.mes == 11) && f.dia > 30) {
return false;
}
if (f.mes == 2) {
if ((f.anio % 4 == 0 && f.anio % 100 != 0) || (f.anio % 400 == 0)) {
if (f.dia > 29) {
return false;
}
} else {
if (f.dia > 28) {
return false;
}
}
}
return true;
}
bool esCadenaValida(const string& cadena) {
for (char c : cadena) {
if (!isalpha(c) && !isspace(c)) {
return false;
}
}
return true;
}
bool esFechaPasada(const fecha& f) {
time_t now = time(0);
tm* ltm = localtime(&now);
if (f.anio > ltm->tm_year + 1900) {
return false;
}
if (f.anio == ltm->tm_year + 1900 && f.mes > ltm->tm_mon + 1) {
return false;
}
if (f.anio == ltm->tm_year + 1900 && f.mes == ltm->tm_mon + 1 && f.dia > ltm-
>tm_mday) {
return false;
}
return true;
}
void llena_bd(clientes c[], int n){
int i;
for (i = 0; i < n; ++i) {
cin.ignore();
cout<<"\n*****************";
cout << "\nDatos Cliente No " << i+1 << endl;
c[i].id = i+1;
// Validación de nombre
do {
cout << "\tNombres: ";
getline(cin, c[i].nombres);
} while (!esCadenaValida(c[i].nombres));
cout << "Datos del Domicilio: " << endl;
// Validación de provincia
do {
cout << "\tProvincia: ";
getline(cin, c[i].domicilio.provincia);
} while (!esCadenaValida(c[i].domicilio.provincia));
// Validación de ciudad
do {
cout << "\tCiudad: ";
getline(cin, c[i].domicilio.ciudad);
} while (!esCadenaValida(c[i].domicilio.ciudad));
// Validación de calle
do {
cout << "\tCalle: ";
getline(cin, c[i].domicilio.calle);
} while (!esCadenaValida(c[i].domicilio.calle));
// Validación de fecha
do {
cout << "Fecha de Ingreso Cliente: " << endl;
cout << "\tdia: ";
cin >> c[i].f_alta.dia;
cout << "\tmes: ";
cin >> c[i].f_alta.mes;
cout << "\tanio: ";
cin >> c[i].f_alta.anio;
} while (!esFechaValida(c[i].f_alta) || !esFechaPasada(c[i].f_alta));
}
}
void ver_bd(clientes c[], int n){
int i;
cout<<"\n********************";
cout << "\nRegistros de la Base de Datos: " << endl;
for (i = 0; i < n; i++) {
cout << left << setw(3) << c[i].id
<< left << setw(10) << c[i].nombres
<< left << setw(15) << c[i].domicilio.provincia
<< left << setw(15) << c[i].domicilio.ciudad
<< left << setw(15) << c[i].domicilio.calle
<< left << setw(15) << c[i].tiempo << endl;
}
}
void calcularTiempoAlta(clientes c[], int n) {
time_t now = time(0); // Obtiene la fecha y hora actual
tm *ltm = localtime(&now);
for (int i = 0; i < n; ++i) {
// Calcula la diferencia en años, meses y días
int years = ltm->tm_year + 1900 - c[i].f_alta.anio;
int months = ltm->tm_mon + 1 - c[i].f_alta.mes;
int days = ltm->tm_mday - c[i].f_alta.dia;
// Ajusta si la diferencia de meses o días es negativa
if (days < 0) {
months -= 1;
days += 30; // Consideramos un mes como 30 días
}
if (months < 0) {
years -= 1;
months += 12;
}
// Almacena el tiempo en el formato "años meses días"
c[i].tiempo = to_string(years) + " anios " + to_string(months) + " meses "
+ to_string(days) + " dias";
}
}
int main() {
int nc;
cout << "******Bienvenido a la base de datos de clientes de la empresa******";
cout << "\n\nCuantos clientes tiene la BD: ";
cin >> nc;
clientes cli[nc];
llena_bd(cli, nc);
calcularTiempoAlta(cli, nc);
ver_bd(cli, nc);
time_t now = time(0);
tm ltm;
localtime_s(<m, &now); // Función para obtener la fecha y hora actual en la
estructura tm
int currentDay = ltm.tm_mday;
int currentMonth = ltm.tm_mon + 1;
int currentYear = ltm.tm_year + 1900;
cout << "\nFecha actual: " << currentDay << "/" << currentMonth << "/" <<
currentYear << endl;
cout << "\nCalculo del tiempo en la empresa para cada cliente:" << endl;
for (int i = 0; i < nc; ++i) {
cout << "Cliente " << i + 1 << ": " << cli[i].tiempo << endl;
int diffYears = currentYear - cli[i].f_alta.anio;
int diffMonths = currentMonth - cli[i].f_alta.mes;
int diffDays = currentDay - cli[i].f_alta.dia;
if (diffDays < 0) {
diffMonths -= 1;
diffDays += 30;
}
if (diffMonths < 0) {
diffYears -= 1;
diffMonths += 12;
}
cout << "Tiempo en la empresa para Cliente " << i + 1 << ": " << diffYears
<< " anios, " << diffMonths << " meses, " << diffDays << " dias" << endl;
}
return 0;
}