<commit_before><?php

namespace Goteo\Model;

use Goteo\Library\Check;
use Goteo\Library\Text;
use Goteo\Model\User;
use Goteo\Model\Project;
use Goteo\Model\License;
use Goteo\Application\Config;

class Contract extends \Goteo\Core\Model {

    const NATURAL_PERSON = 'natural_person';
    const LEGAL_PERSON = 'legal_person';
    const LEGAL_ENTITIES = [self::NATURAL_PERSON, self::LEGAL_PERSON];

    const CIF = 'cif';
    const NIF = 'nif';
    const NIE = 'nie';
    const VAT = 'vat';
    const PASSPORT = 'passport';
    const LEGAL_DOCUMENTS = [self::NIF, self::NIE, self::PASSPORT];

    public
        $project,
        $number, //numero de contrato
        $date, // día anterior a la publicación
        $enddate, // un año después de la fecha del contrato
        $pdf, // si está generado aquí viene el nomre de archivo en
        $type, //  0 = persona física; 1 = representante asociacion; 2 = apoderado entidad mercantil

        // datos del representante
        $name,
        $legal_document_type,
        $nif,
        $birthdate,
        $office, // Cargo en la asociación o empresa
        $address,
        $location,
        $region,
        $zipcode,
        $country,

        // datos de la entidad
        $entity_name,
        $entity_cif,
        $entity_address,
        $entity_location,
        $entity_region,
        $entity_zipcode,
        $entity_country,

        // datos de cuentas (se guardan en project_account para procesos y aquí para el pdf)
        $bank,
        $bank_owner,
        $paypal,
        $paypal_owner,

        // datos de registro
        $reg_name,  // Nombre del registro en el que está incrita la entidad (nombre completo y ciudad)
        $reg_number, // Número de registro
        $reg_date,  // Fecha de escritura del notario
        $reg_id, // Número en el registro mercantil
        $reg_idname, // Nombre del notario
        $reg_idloc, // Ciudad de actuacióndel notario

        // proyecto
        $project_name,
        $project_url,
        $project_owner, // Id del impulsor
        $project_user, // Nombre del impulsor
        $project_profile, // URL del perfil del impulsor

        $project_description, // descripción del proyecto
        $project_invest, // objetivo de financiación
        $project_return, // retornos comprometidos
        $project_fee,   //  Platform fees

        // seguimiento (es un objeto, cada atributo es un valor de seguimiento)
        $status,

        // documentación
        $docs = array();


    /**
     * Sobrecarga de métodos 'getter'.
     *
     * @param type string $name
     * @return type mixed
     */

    public function __get($name) {
        switch ($name) {
            case "fullnum":
                //num-00000000
                return $this->number.'-'.$this->txtdate;
                break;
            default:
                return $this->$name;
        }
    }

    /**
     * Creación de registro de contrato.
     * Esto lo lanzará el cron/execute cuando el proyecto pase la primera ronda.
     *
     * Pero también se puede crear manualmente desde panel gestoria
     *   hay que tener en cuenta si ya tiene registro de contrato o no
     *
     * @param varchar(50) $id del proyecto
     * @return true (el control de errores habrá que hacerlo por email)
     */
    public static function create ($id, &$errors = array()) {

        $contract = Contract::get($id);

        if (!empty($contract)) {
            // ya tenemos registro de contrato

            // verificar fechas
            if ( empty($contract->date) || empty($contract->enddate) ) {

                // sacar datos del proyecto
                $projData = Project::get($id, 'es');
                if ( !empty($projData->published) ) {
                    $date = strtotime($projData->published);
                    $contract->date = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)));
                    $contract->enddate = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)+1));
                }

                return $contract->save($errors);

            } else {

                return $contract;

            }

        } else {
            // nuevo registro
            $contract = new Contract;
            $contract->project = $id;
            // sacar datos del proyecto
            $projData = Project::get($id, 'es');

            if ( !empty($projData->published) ) {
                $date = strtotime($projData->published);
                $contract->date = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)));
                $contract->enddate = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)+1));
            }

        }

        $contract->type = 0; // inicialmente persona fisica

        $contract->electronic = 1; // electronic by default


        // @FIXME esto tendria que venir de lo rellenado en el paso 2 del formulario de proyecto
        $personalData = User::getPersonal($projData->owner);
        // persona física o representante
        $contract->name = $personalData->contract_name;
        $contract->nif = $personalData->contract_nif;
        $contract->address = $personalData->address;
        $contract->location = $personalData->location;
        $contract->region = '';
        $contract->country = $personalData->country;

        $contract->project_name = $projData->name;
        $contract->project_url = SITE_URL . '/project/' .$projData->id;
        $contract->project_owner = $projData->owner;
        $contract->project_user = $projData->user->name;
        $contract->project_profile = SITE_URL . '/user/profile/' .$projData->owner;

        // campos de descripción del proyecto
        $contract->project_description = $projData->description;

        // texto montado desde costes
        $contract->project_invest = self::txtInvest($projData);

        // texto montado desde retornos
        $contract->project_return = self::txtReturn($projData);

        // cuentas
        $account = Project\Account::get($projData->id);

        $contract->bank = $account->bank;
        $contract->bank_owner = $account->bank_owner;
        $contract->paypal = $account->paypal;
        $contract->paypal_owner = $account->paypal_owner;
        $contract->fee = $account->fee;
<commit_msg>fix in create contract when there is nif in user_personal data<commit_after><?php

namespace Goteo\Model;

use Goteo\Library\Check;
use Goteo\Library\Text;
use Goteo\Model\User;
use Goteo\Model\Project;
use Goteo\Model\License;
use Goteo\Application\Config;

class Contract extends \Goteo\Core\Model {

    const NATURAL_PERSON = 'natural_person';
    const LEGAL_PERSON = 'legal_person';
    const LEGAL_ENTITIES = [self::NATURAL_PERSON, self::LEGAL_PERSON];

    const CIF = 'cif';
    const NIF = 'nif';
    const NIE = 'nie';
    const VAT = 'vat';
    const PASSPORT = 'passport';
    const LEGAL_DOCUMENTS = [self::NIF, self::NIE, self::PASSPORT];

    public
        $project,
        $number, //numero de contrato
        $date, // día anterior a la publicación
        $enddate, // un año después de la fecha del contrato
        $pdf, // si está generado aquí viene el nomre de archivo en
        $type, //  0 = persona física; 1 = representante asociacion; 2 = apoderado entidad mercantil

        // datos del representante
        $name,
        $legal_document_type,
        $nif,
        $birthdate,
        $office, // Cargo en la asociación o empresa
        $address,
        $location,
        $region,
        $zipcode,
        $country,

        // datos de la entidad
        $entity_name,
        $entity_cif,
        $entity_address,
        $entity_location,
        $entity_region,
        $entity_zipcode,
        $entity_country,

        // datos de cuentas (se guardan en project_account para procesos y aquí para el pdf)
        $bank,
        $bank_owner,
        $paypal,
        $paypal_owner,

        // datos de registro
        $reg_name,  // Nombre del registro en el que está incrita la entidad (nombre completo y ciudad)
        $reg_number, // Número de registro
        $reg_date,  // Fecha de escritura del notario
        $reg_id, // Número en el registro mercantil
        $reg_idname, // Nombre del notario
        $reg_idloc, // Ciudad de actuacióndel notario

        // proyecto
        $project_name,
        $project_url,
        $project_owner, // Id del impulsor
        $project_user, // Nombre del impulsor
        $project_profile, // URL del perfil del impulsor

        $project_description, // descripción del proyecto
        $project_invest, // objetivo de financiación
        $project_return, // retornos comprometidos
        $project_fee,   //  Platform fees

        // seguimiento (es un objeto, cada atributo es un valor de seguimiento)
        $status,

        // documentación
        $docs = array();


    /**
     * Sobrecarga de métodos 'getter'.
     *
     * @param type string $name
     * @return type mixed
     */

    public function __get($name) {
        switch ($name) {
            case "fullnum":
                //num-00000000
                return $this->number.'-'.$this->txtdate;
                break;
            default:
                return $this->$name;
        }
    }

    /**
     * Creación de registro de contrato.
     * Esto lo lanzará el cron/execute cuando el proyecto pase la primera ronda.
     *
     * Pero también se puede crear manualmente desde panel gestoria
     *   hay que tener en cuenta si ya tiene registro de contrato o no
     *
     * @param varchar(50) $id del proyecto
     * @return true (el control de errores habrá que hacerlo por email)
     */
    public static function create ($id, &$errors = array()) {

        $contract = Contract::get($id);

        if (!empty($contract)) {
            // ya tenemos registro de contrato

            // verificar fechas
            if ( empty($contract->date) || empty($contract->enddate) ) {

                // sacar datos del proyecto
                $projData = Project::get($id, 'es');
                if ( !empty($projData->published) ) {
                    $date = strtotime($projData->published);
                    $contract->date = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)));
                    $contract->enddate = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)+1));
                }

                return $contract->save($errors);

            } else {

                return $contract;

            }

        } else {
            // nuevo registro
            $contract = new Contract;
            $contract->project = $id;
            // sacar datos del proyecto
            $projData = Project::get($id, 'es');

            if ( !empty($projData->published) ) {
                $date = strtotime($projData->published);
                $contract->date = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)));
                $contract->enddate = date('Y-m-d', mktime(0, 0, 0, date('m', $date), date('d',$date)-1, date('Y', $date)+1));
            }

        }

        $contract->type = 0; // inicialmente persona fisica

        $contract->electronic = 1; // electronic by default


        // @FIXME esto tendria que venir de lo rellenado en el paso 2 del formulario de proyecto
        $personalData = User::getPersonal($projData->owner);
        // persona física o representante
        $contract->name = $personalData->contract_name;
        $contract->nif = $personalData->contract_nif;

        if ($contract->nif && Check::nif($contract->nif, $legal_document_type)) {
            $contract->legal_document_type = $legal_document_type;
        }
        $contract->address = $personalData->address;
        $contract->location = $personalData->location;
        $contract->region = '';
        $contract->country = $personalData->country;

        $contract->project_name = $projData->name;
        $contract->project_url = SITE_URL . '/project/' .$projData->id;
        $contract->project_owner = $projData->owner;
        $contract->project_user = $projData->user->name;
        $contract->project_profile = SITE_URL . '/user/profile/' .$projData->owner;

        // campos de descripción del proyecto
        $contract->project_description = $projData->description;

        // texto montado desde costes
        $contract->project_invest = self::txtInvest($projData);

        // texto montado desde retornos
        $contract->project_return = self::txtReturn($projData);

        // cuentas
        $account = Project\Account::get($projData->id);

        $contract->bank = $account->bank;
        $contract->bank_owner = $account->bank_owner;
        $contract->paypal = $account->paypal;
        $contract->paypal_owner = $account->paypal_owner;
        $contract->fee = $account->fee;

{'fraction_non_alphanumeric': 0.12635462301129813, 'fraction_numerical': 0.0052263469372069785, 'mean_word_length': 2.04516732974491, 'pattern_counts': {'":': 2, '<': 5, '<?xml version=': 0, '>': 116, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 2, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1049928', 'n_tokens_mistral': 4083, 'n_tokens_neox': 3893, 'n_words': 1004}