| Server IP : 162.214.74.102 / Your IP : 216.73.217.114 Web Server : Apache System : Linux dedi-4363141.lrsys.com.br 3.10.0-1160.119.1.el7.tuxcare.els25.x86_64 #1 SMP Wed Oct 1 17:37:27 UTC 2025 x86_64 User : lrsys ( 1015) PHP Version : 5.6.40 Disable Function : exec,passthru,shell_exec,system MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /home/lrsys/www/lrsys_apps/imobles/application/plugins/module_imobles/helpers/ |
Upload File : |
<?php
include_once __DIR__ . "/../models/TypeunityModel.php";
include_once __DIR__ . "/UnitsException.php";
class UnitsHelper {
public function batchOfUnits($units) {
$count_total = 0;
$csv_units = array();
$user = User::_info();
$validade = $this->validateFields($units);
if (!$validade === true)
{
$msg_erro .= "Dados Inválidados. Informar Webmaster<br/>";
return false;
}
$this->updateEntepriseValues($units[0]);
// Pego a primeira torre do empreendimento
$tower = ORM::for_table('module_imobles_enterprise_towers')->where('module_imobles_enterprise_id', $units[0]['enterprise_id'])->find_one();
if (!isset($tower->id))
{
$msg_erro .= 'Unidade Não cadastrada | Torre não encontrada: ' . $units[0]['enterprise_id'] . '<br/>';
return false;
}
foreach ($units as $data)
{
$count_total++;
$data['unit_number'] = $this->alphanumeric($data['unit_number']);
// Verifico se tem algum Tipo de Unidade cadastrado com as características da Unidade
$data['unit_type_id'] = $this->compareUnitTypes($data);
if(!$data['unit_type_id'])
{
//create unit type
// $model = new TypeunityModel();
// $unit_type_data = array();
// $unit_type_data['module_imobles_enterprise_id'] = $data['enterprise_id'];
// $unit_type_data['area'] = $data['area'];
// $unit_type_data['number_garage'] = $data['parking_spaces_count'];
// $unit_type_data['title'] = $data['area'] . 'm² | ' . $data['parking_spaces_count'] . ' Garagens';
// $unit_type = $model->createTypeunity($unit_type_data);
// $data['unit_type_id'] = $unit_type->id;
$msg_erro .= "Unidade Não cadastrada | Tipo de Unidade não encontrada: " . $data['enterprise_id']. "| ".$data["area"]. "| ".$data["parking_spaces_count"] . "<br/>";
continue;
}
// Verifico se a unidade já está cadastrada
$unit = ORM::for_table('module_imobles_enterprise_units')
->where('crawler_type_id', 4)
->where("verified", 1)
->where('number_unity', $data['unit_number'])
->where('module_imobles_enterprise_units_type_id', $data['unit_type_id'])
->find_one();
if (isset($unit->id))
{
// Atualizo a Unidade
$unit->verified = 1;
$unit->crawler_type_id = 4;
$unit->updated_at = date('Y-m-d H:i:s');
// TODO: revisar
$unit->unavailable = $data['availability'] == 1 ? null : 1;
$unit->save();
// Atualizo o Anúncio
// TODO: isso vai dar problema quando um PDF vier com ponto no preço
$price = str_replace('.','',$data['price']);
$price = str_replace(',','.',$price);
$arr_listing = ORM::for_table('module_imobles_listings')
->where('unit_id', $unit->id)
->where('crawler_type_id', 4)
->order_by_asc('id')->find_one();
if (isset($arr_listing->id))
{
$arr_listing->crawler_type = 'airtable';
$arr_listing->crawler_type_id = 4;
$arr_listing->verified = 1;
// TODO: está pegando o valor INTEIRO do PRICE. Verificar se está correto
$arr_listing->crawler_price = intval($price);
$arr_listing->updated_at = date('Y-m-d H:i:s');
$arr_listing->save();
}
} else {
// Cadastro a Unidade
$unit = ORM::for_table('module_imobles_enterprise_units')->create();
$unit->module_imobles_enterprise_units_type_id = $data['unit_type_id'];
$unit->module_imobles_enterprise_towers_id = $tower->id;
$unit->number_unity = $data['unit_number'];
$unit->garage_covered = $data['parking_cover'];
$unit->garage_area = $data['parking_area'];
$unit->created_at = date('Y-m-d H:i:s');
// $unit->created_by = 0;
$unit->crawler_type_id = 4;
$unit->verified = 1;
$unit->unavailable = $data['availability'] == 1 ? null : 1;
$unit->save();
// Cadastro o anúncio
// TODO: isso vai dar problema quando um PDF vier com ponto no preço
$price = str_replace('.','',$data['price']);
$price = str_replace(',','.',$price);
$d = ORM::for_table('module_imobles_listings')->create();
$d->entreprise_id = $data['enterprise_id'];
$d->unit_type_id = $data['unit_type_id'];
$d->unit_id = $unit->id;
$d->crawler_type = 'airtable';
$d->crawler_type_id = 4;
// TODO: está pegando o valor INTEIRO do PRICE. Verificar se está correto
$d->crawler_price = intval($price);
$d->created_at = date('Y-m-d H:i:s');
$d->created_by = 0;
$d->verified = 1;
$d->save();
}
// Guardo a Unidade no array de controle
$csv_units[$data['unit_type_id']][] = $unit->id;
}
// TODO: deletar todas unidades geradas pelo Airtable para o empreendimento (unit_number == null)
$units_delete = ORM::for_table('module_imobles_enterprise_units')
->where('crawler_type_id', 4)
->where_null('number_unity')
->where("module_imobles_enterprise_towers_id", $tower->id)
->where('verified', 1)
->find_many();
foreach($units_delete as $unit_delete)
{
$unit_delete->unavailable = 1;
$unit_delete->updated_at = date('Y-m-d H:i:s');
$unit_delete->updated_by = $user->id;
$unit_delete->delete_at = date('Y-m-d H:i:s');
$unit_delete->delete_by = $user->id;
$unit_delete->save();
}
foreach($csv_units as $key => $value)
{
// Deixo como indisponível todas as unidades que não foram tratadas
$invalidUnits = ORM::for_table('module_imobles_enterprise_units')
->where('crawler_type_id', 4)
->where_not_in('id', $value)
->where('unavailable', null)
->where("module_imobles_enterprise_units_type_id", $key)
->where('verified', 1)
->find_many();
if (count($invalidUnits))
{
foreach($invalidUnits as $invalid)
{
$invalid->unavailable = 1;
$invalid->updated_at = date('Y-m-d H:i:s');
$invalid->updated_by = $user->id;
$invalid->save();
}
}
}
}
private function validateFields($units) {
// unit number present
// area present
// installment < entry < financing < price
foreach($units as $data)
{
$values=['entry', 'financing', 'price'];
foreach($values as $v){
if(!$data[$v])
{
echo $v . 'is invalid';
return false;
}
}
if (!$data['unit_number'])
{
echo 'Invalid unit number';
return false;
}
if (!$data['area'] || $data['area'] < 30)
{
echo 'Invalid unit area';
return false;
}
if ($data['installment'] > $data['entry'])
{
echo 'Unit installment is larger than entry value';
return false;
}
if ($data['entry'] > $data['financing'])
{
echo 'Unit entry is larger than financing value';
return false;
}
if ($data['financing'] > $data['price'])
{
echo 'Unit financing is larger than total value';
return false;
}
}
return true;
}
private function compareUnitTypes($data) {
$unit_types = ORM::for_table('module_imobles_enterprise_units_type')
->select_many('id','area','number_garage')
->where('module_imobles_enterprise_id', $data['enterprise_id'])
->where('crawler_type_id', 4)
->find_many();
foreach($unit_types as $type) {
$area = str_replace(',', '.', $data['area']);
$area = trim($area);
if($area == $type->area && $type->number_garage == $data['parking_spaces_count']){
return $type->id;
}
}
return null;
}
private function alphanumeric($cell) {
$pattern = '/[^a-zA-Z0-9]/';
$clean = preg_replace($pattern, '', $cell);
return strtoupper($clean);
}
private function updateEntepriseValues($data) {
$enterprise = ORM::for_table('module_imobles_enterprise')
->select_many('id','value_input_porcentage', 'value_founding_porcentage', 'value_installment_porcentage')
->find_one($data['enterprise_id']);
$installment = $this->cleanFloat($data['installment']);
$entry = $this->cleanFloat($data['entry']);
$financing = $this->cleanFloat($data['financing']);
$price = $this->cleanFloat($data['price']);
if (!$data['installment']) {
$enterprise->value_installment_porcentage = 0.006746;
$enterprise->value_input_porcentage = 0.2;
$enterprise->value_founding_porcentage = 0.8;
$enterprise->save();
return;
}
$installment = ($installment / $price); // installment / total
$enterprise->value_installment_porcentage = $installment;
$entry = ($entry / $price); // entry / total
$enterprise->value_input_porcentage = $entry;
$financing = 1 - ($financing / $price); // 1 - (financing / total)
$enterprise->value_founding_porcentage = $financing;
$enterprise->save();
}
private function cleanFloat($num) {
$num = str_replace('.','', $num);
$num = str_replace(',','.', $num);
return floatval($num);
}
}