Address.php
5 years ago
Payment.php
5 years ago
Person.php
5 years ago
PhoneNumber.php
5 years ago
Text.php
5 years ago
Person.php
239 lines
| 1 | <?php |
| 2 | namespace Faker\Provider\ro_RO; |
| 3 | |
| 4 | class Person extends \Faker\Provider\Person |
| 5 | { |
| 6 | // http://en.wikipedia.org/wiki/Romanian_name, prefixes are for more formal purposes |
| 7 | protected static $maleNameFormats = array( |
| 8 | '{{firstNameMale}} {{lastName}}', |
| 9 | '{{firstNameMale}} {{lastName}}', |
| 10 | '{{firstNameMale}} {{lastName}}', |
| 11 | '{{titleMale}} {{firstNameMale}} {{lastName}}', |
| 12 | ); |
| 13 | |
| 14 | protected static $femaleNameFormats = array( |
| 15 | '{{firstNameFemale}} {{lastName}}', |
| 16 | '{{firstNameFemale}} {{lastName}}', |
| 17 | '{{firstNameFemale}} {{lastName}}', |
| 18 | '{{titleFemale}} {{firstNameFemale}} {{lastName}}' |
| 19 | ); |
| 20 | |
| 21 | //http://ro.wikipedia.org/wiki/List%C4%83_de_prenume_rom%C3%A2ne%C8%99ti#Feminine |
| 22 | protected static $firstNameFemale = array( |
| 23 | 'Ada', 'Adela', 'Adelaida', 'Adelina', 'Adina', 'Adriana', 'Agata', 'Aglaia', 'Agripina', 'Aida', 'Alberta', 'Albertina', 'Alexandra', 'Alexandrina', 'Alida', 'Alina', 'Alice', 'Alis', 'Alma', |
| 24 | 'Amalia', 'Amelia', 'Amanda', 'Ana', 'Anabela', 'Anaida', 'Anamaria', 'Anastasia', 'Anca', 'Ancuța', 'Anda', 'Andra', 'Andrada', 'Andreea', 'Anemona', 'Aneta', 'Angela', 'Anghelina', 'Anica', |
| 25 | 'Anișoara', 'Antoaneta', 'Antonia', 'Antonela', 'Anuța', 'Ariadna', 'Ariana', 'Arina', 'Aristița', 'Artemisa', 'Astrid', 'Atena', 'Augustina', 'Aura', 'Aurelia', 'Aureliana', 'Aurica', 'Aurora', |
| 26 | 'Beatrice', 'Betina', 'Bianca', 'Blanduzia', 'Bogdana', 'Brândușa', 'Camelia', 'Carina', 'Carla', 'Carmen', 'Carmina', 'Carolina', 'Casandra', 'Casiana', 'Caterina', 'Catinca', 'Catrina', 'Catrinel', |
| 27 | 'Cătălina', 'Cecilia', 'Celia', 'Cerasela', 'Cezara', 'Cipriana', 'Clara', 'Clarisa', 'Claudia', 'Clementina', 'Cleopatra', 'Codrina', 'Codruța', 'Constantina', 'Constanța', 'Consuela', 'Coralia', |
| 28 | 'Corina', 'Cornelia', 'Cosmina', 'Crenguța', 'Crina', 'Cristina', 'Daciana', 'Dafina', 'Daiana', 'Dalia', 'Dana', 'Daniela', 'Daria', 'Dariana', 'Delia', 'Demetra', 'Denisa', 'Despina', 'Diana', |
| 29 | 'Dida', 'Didina', 'Dimitrina', 'Dina', 'Dochia', 'Doina', 'Domnica', 'Dora', 'Doriana', 'Dorina', 'Dorli', 'Draga', 'Dumitra', 'Dumitrana', 'Ecaterina', 'Eftimia', 'Elena', 'Eleonora', 'Eliana', |
| 30 | 'Elisabeta', 'Elisaveta', 'Eliza', 'Elodia', 'Elvira', 'Emilia', 'Emanuela', 'Erica', 'Estera', 'Eufrosina', 'Eugenia', 'Eusebia', 'Eva', 'Evanghelina', 'Evelina', 'Fabia', 'Fabiana', 'Felicia', |
| 31 | 'Filofteia', 'Fiona', 'Flavia', 'Floare', 'Floarea', 'Flora', 'Floriana', 'Florica', 'Florina', 'Florentina', 'Florența', 'Francesca', 'Frusina', 'Gabriela', 'Geanina', 'Gențiana', 'Georgeta', |
| 32 | 'Georgia', 'Georgiana', 'Geta', 'Gherghina', 'Gianina', 'Gina', 'Giorgiana', 'Grațiana', 'Grațiela', 'Hortensia', 'Henrieta', 'Heracleea', 'Iasmina', 'Ica', 'Ileana', 'Ilinca', 'Ilona', 'Ina', |
| 33 | 'Ioana', 'Ioanina', 'Iolanda', 'Ionela', 'Ionelia', 'Iosefina', 'Irina', 'Iridenta', 'Iris', 'Isabela', 'Iulia', 'Iuliana', 'Iustina', 'Ivona', 'Izabela', 'Jana', 'Janeta', 'Janina', 'Jasmina', |
| 34 | 'Jeana', 'Julia', 'Julieta', 'Larisa', 'Laura', 'Laurenția', 'Lavinia', 'Lăcrămioara', 'Leana', 'Lelia', 'Leontina', 'Leopoldina', 'Letiția', 'Lia', 'Liana', 'Lidia', 'Ligia', 'Lili', 'Liliana', |
| 35 | 'Lioara', 'Livia', 'Loredana', 'Lorelei', 'Lorena', 'Luana', 'Lucia', 'Luciana', 'Lucreția', 'Ludovica', 'Ludmila', 'Luiza', 'Luminița', 'Magdalena', 'Maia', 'Manuela', 'Mara', 'Marcela', 'Marga', |
| 36 | 'Margareta', 'Marcheta', 'Maria', 'Mariana', 'Maricica', 'Marilena', 'Marina', 'Marinela', 'Marioara', 'Marta', 'Matilda', 'Malvina', 'Mădălina', 'Mălina', 'Mărioara', 'Măriuca', 'Melania', 'Melina', |
| 37 | 'Mihaela', 'Milena', 'Mina', 'Minodora', 'Mioara', 'Mirabela', 'Mirela', 'Mirona', 'Miruna', 'Mona', 'Monalisa', 'Monica', 'Nadia', 'Narcisa', 'Natalia', 'Natașa', 'Noemi', 'Nicoleta', 'Niculina', |
| 38 | 'Nidia', 'Nora', 'Norica', 'Oana', 'Octavia', 'Octaviana', 'Ofelia', 'Olga', 'Olimpia', 'Olivia', 'Ortansa', 'Otilia', 'Ozana', 'Pamela', 'Paraschiva', 'Paula', 'Paulica', 'Paulina', 'Patricia', |
| 39 | 'Petronela', 'Petruța', 'Pompilia', 'Profira', 'Rada', 'Rafila', 'Raluca', 'Ramona', 'Rebeca', 'Renata', 'Rica', 'Roberta', 'Robertina', 'Rodica', 'Romanița', 'Romina', 'Roza', 'Rozalia', 'Roxana', |
| 40 | 'Roxelana', 'Ruxanda', 'Ruxandra', 'Sabina', 'Sabrina', 'Safta', 'Salomea', 'Sanda', 'Saveta', 'Savina', 'Sânziana', 'Semenica', 'Severina', 'Sidonia', 'Silvia', 'Silvana', 'Silviana', |
| 41 | 'Simina', 'Simona', 'Smaranda', 'Sofia', 'Sonia', 'Sorana', 'Sorina', 'Speranța', 'Stana', 'Stanca', 'Stela', 'Steliana', 'Steluța', 'Suzana', 'Svetlana', 'Ștefana', 'Ștefania', 'Tamara', 'Tania', |
| 42 | 'Tatiana', 'Teea', 'Teodora', 'Teodosia', 'Teona', 'Tiberia', 'Timea', 'Tinca', 'Tincuța', 'Tudora', 'Tudorița', 'Tudosia', 'Valentina', 'Valeria', 'Vanesa', 'Varvara', 'Vasilica', 'Venera', 'Vera', |
| 43 | 'Veronica', 'Veta', 'Vicenția', 'Victoria', 'Violeta', 'Viorela', 'Viorica', 'Virginia', 'Viviana', 'Voichița', 'Xenia', 'Zaharia', 'Zamfira', 'Zaraza', 'Zenobia', 'Zenovia', 'Zina', 'Zoe' |
| 44 | ); |
| 45 | |
| 46 | //http://ro.wikipedia.org/wiki/List%C4%83_de_prenume_rom%C3%A2ne%C8%99ti#Feminine |
| 47 | protected static $firstNameMale = array( |
| 48 | 'Achim', 'Adam', 'Adelin', 'Adonis', 'Adrian', 'Adi', 'Agnos', 'Albert', 'Alex', 'Alexandru', 'Alexe', 'Aleodor', 'Alin', 'Alistar', 'Amedeu', 'Amza', 'Anatolie', 'Andrei', 'Angel', 'Anghel', 'Antim', |
| 49 | 'Anton', 'Antonie', 'Antoniu', 'Arian', 'Aristide', 'Arsenie', 'Augustin', 'Aurel', 'Aurelian', 'Aurică', 'Avram', 'Axinte', 'Barbu', 'Bartolomeu', 'Basarab', 'Bănel', 'Bebe', 'Beniamin', 'Benone', |
| 50 | 'Bernard', 'Bogdan', 'Brăduț', 'Bucur', 'Caius', 'Camil', 'Cantemir', 'Carol', 'Casian', 'Cazimir', 'Călin', 'Cătălin', 'Cedrin', 'Cezar', 'Ciprian', 'Claudiu', 'Codin', 'Codrin', 'Codruț', 'Cornel', |
| 51 | 'Corneliu', 'Corvin', 'Constantin', 'Cosmin', 'Costache', 'Costel', 'Costin', 'Crin', 'Cristea', 'Cristian', 'Cristobal', 'Cristofor', 'Dacian', 'Damian', 'Dan', 'Daniel', 'Darius', 'David', |
| 52 | 'Decebal', 'Denis', 'Dinu', 'Dominic', 'Dorel', 'Dorian', 'Dorin', 'Dorinel', 'Doru', 'Dragoș', 'Ducu', 'Dumitru', 'Edgar', 'Edmond', 'Eduard', 'Eftimie', 'Emil', 'Emilian', 'Emanoil', 'Emanuel', |
| 53 | 'Emanuil', 'Eremia', 'Eric', 'Ernest', 'Eugen', 'Eusebiu', 'Eustațiu', 'Fabian', 'Felix', 'Filip', 'Fiodor', 'Flaviu', 'Florea', 'Florentin', 'Florian', 'Florin', 'Francisc', 'Frederic', |
| 54 | 'Gabi', 'Gabriel', 'Gelu', 'George', 'Georgel', 'Georgian', 'Ghenadie', 'Gheorghe', 'Gheorghiță', 'Ghiță', 'Gică', 'Gicu', 'Giorgian', 'Grațian', 'Gregorian', 'Grigore', |
| 55 | 'Haralamb', 'Haralambie', 'Horațiu', 'Horea', 'Horia', 'Iacob', 'Iancu', 'Ianis', 'Ieremia', 'Ilarie', 'Ilarion', 'Ilie', 'Inocențiu', 'Ioan', 'Ion', 'Ionel', 'Ionică', 'Ionuț', 'Iosif', 'Irinel', |
| 56 | 'Iulian', 'Iuliu', 'Iurie', 'Iustin', 'Iustinian', 'Ivan', 'Jan', 'Jean', 'Jenel', 'Ladislau', 'Lascăr', 'Laurențiu', 'Laurian', 'Lazăr', 'Leonard', 'Leontin', 'Lică', 'Liviu', 'Lorin', 'Luca', |
| 57 | 'Lucențiu', 'Lucian', 'Lucrețiu', 'Ludovic', 'Manole', 'Marcel', 'Marcu', 'Marian', 'Marin', 'Marius', 'Martin', 'Matei', 'Maxim', 'Maximilian', 'Mădălin', 'Mihai', 'Mihail', 'Mihnea', 'Mircea', |
| 58 | 'Miron', 'Mitică', 'Mitruț', 'Mugur', 'Mugurel', 'Nae', 'Narcis', 'Nechifor', 'Nelu', 'Nichifor', 'Nicoară', 'Nicodim', 'Nicolae', 'Nicolaie', 'Nicu', 'Nicuță', 'Niculiță', 'Nicușor', 'Norbert', |
| 59 | 'Norman', 'Octav', 'Octavian', 'Octaviu', 'Olimpian', 'Olimpiu', 'Oliviu', 'Ovidiu', 'Pamfil', 'Panait', 'Panagachie', 'Paul', 'Pavel', 'Pătru', 'Petre', 'Petrică', 'Petrișor', 'Petru', 'Petruț', |
| 60 | 'Pompiliu', 'Radu', 'Rafael', 'Rareș', 'Raul', 'Răducu', 'Răzvan', 'Relu', 'Remus', 'Robert', 'Romeo', 'Romulus', 'Sabin', 'Sandu', 'Sava', 'Sebastian', 'Sergiu', 'Sever', 'Severin', 'Silvian', |
| 61 | 'Silviu', 'Simi', 'Simion', 'Sinică', 'Sorin', 'Stan', 'Stancu', 'Stelian', 'Sandu', 'Șerban', 'Ștefan', 'Teodor', 'Teofil', 'Teohari', 'Theodor', 'Tiberiu', 'Timotei', 'Titus', 'Todor', 'Toma', |
| 62 | 'Traian', 'Tudor', 'Valentin', 'Valeriu', 'Valter', 'Vasile', 'Vasilică', 'Veniamin', 'Vicențiu', 'Victor', 'Vincențiu', 'Viorel', 'Visarion', 'Vlad', 'Vladimir', 'Vlaicu', 'Voicu', 'Zamfir', 'Zeno' |
| 63 | ); |
| 64 | |
| 65 | //courtesy of Florin LIPAN, at nume.ottomotor.ro |
| 66 | protected static $lastName = array( |
| 67 | 'Achim', 'Adam', 'Albu', 'Aldea', 'Alexa', 'Alexandrescu', 'Alexandru', 'Alexe', 'Andrei', 'Anghel', 'Antal', 'Anton', 'Apostol', 'Ardelean', 'Ardeleanu', 'Avram', |
| 68 | 'Baciu', 'Badea', 'Balan', 'Balint', 'Banica', 'Banu', 'Barbu', 'Barbulescu', 'Bejan', 'Biro', 'Blaga', 'Boboc', 'Bodea', 'Bogdan', 'Bota', 'Botezatu', 'Bratu', 'Bucur', 'Buda', 'Bunea', 'Burlacu', |
| 69 | 'Calin', 'Catana', 'Cazacu', 'Chiriac', 'Chirila', 'Chirita', 'Chis', 'Chivu', 'Ciobanu', 'Ciocan', 'Cojocaru', 'Coman', 'Constantin', 'Constantinescu', 'Cornea', 'Cosma', 'Costache', |
| 70 | 'Costea', 'Costin', 'Covaci', 'Cozma', 'Craciun', 'Cretu', 'Crisan', 'Cristea', 'Cristescu', 'Croitoru', 'Cucu', |
| 71 | 'Damian', 'Dan', 'Danciu', 'Danila', 'Dascalu', 'David', 'Diaconescu', 'Diaconu', 'Dima', 'Dinca', 'Dinu', 'Dobre', 'Dobrescu', 'Dogaru', 'Dragan', 'Draghici', |
| 72 | 'Dragoi', 'Dragomir', 'Dumitrache', 'Dumitrascu', 'Dumitrescu', 'Dumitriu', 'Dumitru', 'Duta', |
| 73 | 'Enache', 'Ene', 'Farcas', 'Filimon', 'Filip', 'Florea', 'Florescu', 'Fodor', 'Fratila', |
| 74 | 'Gabor', 'Gal', 'Ganea', 'Gavrila', 'Georgescu', 'Gheorghe', 'Gheorghita', 'Gheorghiu', 'Gherman', 'Ghita', 'Giurgiu', 'Grecu', 'Grigoras', 'Grigore', 'Grigorescu', 'Grosu', 'Groza', |
| 75 | 'Horvath', 'Iacob', 'Iancu', 'Ichim', 'Ignat', 'Ilie', 'Iliescu', 'Ion', 'Ionescu', 'Ionita', 'Iordache', 'Iorga', 'Iosif', 'Irimia', 'Ispas', 'Istrate', 'Ivan', 'Ivascu', |
| 76 | 'Kiss', 'Kovacs', 'Lazar', 'Luca', 'Lungu', 'Lupu', 'Macovei', 'Maftei', 'Man', 'Manea', 'Manolache', 'Manole', 'Marcu', 'Marginean', 'Marian', 'Marin', 'Marinescu', 'Martin', 'Mateescu', |
| 77 | 'Matei', 'Maxim', 'Mazilu', 'Micu', 'Mihai', 'Mihaila', 'Mihailescu', 'Mihalache', 'Mihalcea', 'Milea', 'Militaru', 'Mircea', 'Mirea', 'Miron', 'Miu', 'Mocanu', 'Moga', 'Moise', 'Moldovan', |
| 78 | 'Moldoveanu', 'Molnar', 'Morar', 'Moraru', 'Muntean', 'Munteanu', 'Muresan', 'Musat', 'Nagy', 'Nastase', 'Neacsu', 'Neagoe', 'Neagu', 'Neamtu', 'Nechita', 'Necula', 'Nedelcu', |
| 79 | 'Negoita', 'Negrea', 'Negru', 'Nemes', 'Nica', 'Nicoara', 'Nicolae', 'Nicolescu', 'Niculae', 'Niculescu', 'Nistor', 'Nita', 'Nitu', |
| 80 | 'Oancea', 'Olariu', 'Olaru', 'Oltean', 'Olteanu', 'Oprea', 'Opris', 'Paduraru', 'Pana', 'Panait', 'Paraschiv', 'Parvu', 'Pasca', 'Pascu', 'Patrascu', 'Paun', 'Pavel', 'Petcu', 'Peter', |
| 81 | 'Petre', 'Petrea', 'Petrescu', 'Pintea', 'Pintilie', 'Pirvu', 'Pop', 'Popa', 'Popescu', 'Popovici', 'Preda', 'Prodan', 'Puiu', 'Radoi', 'Radu', 'Radulescu', 'Roman', 'Rosca', 'Rosu', |
| 82 | 'Rotaru', 'Rus', 'Rusu', 'Sabau', 'Sandor', 'Sandu', 'Sarbu', 'Sava', 'Savu', 'Serban', 'Sima', 'Simion', 'Simionescu', 'Simon', 'Sirbu', 'Soare', 'Solomon', 'Staicu', 'Stan', |
| 83 | 'Stanciu', 'Stancu', 'Stanescu', 'Stefan', 'Stefanescu', 'Stoian', 'Stoica', 'Stroe', 'Suciu', 'Szabo', 'Szasz', 'Szekely', 'Tamas', 'Tanase', 'Tataru', 'Teodorescu', 'Toader', |
| 84 | 'Toma', 'Tomescu', 'Toth', 'Trandafir', 'Trif', 'Trifan', 'Tudor', 'Tudorache', 'Tudose', 'Turcu', 'Ungureanu', 'Ursu', 'Vaduva', 'Varga', 'Vasile', 'Vasilescu', 'Vasiliu', 'Veres', |
| 85 | 'Vintila', 'Visan', 'Vlad', 'Voicu', 'Voinea', 'Zaharia', 'Zamfir' |
| 86 | ); |
| 87 | |
| 88 | protected static $titleMale = array('dl.', 'ing.', 'dr.'); |
| 89 | protected static $titleFemale = array('d-na.', 'd-șoara', 'ing.', 'dr.'); |
| 90 | |
| 91 | protected static $cnpCountyCodes = array( |
| 92 | 'AB' => '01', 'AR' => '02', 'AG' => '03', 'B' => '40', 'BC' => '04', 'BH' => '05', |
| 93 | 'BN' => '06', 'BT' => '07', 'BV' => '08', 'BR' => '09', 'BZ' => '10', 'CS' => '11', |
| 94 | 'CL' => '51', 'CJ' => '12', 'CT' => '13', 'CV' => '14', 'DB' => '15', 'DJ' => '16', |
| 95 | 'GL' => '17', 'GR' => '52', 'GJ' => '18', 'HR' => '19', 'HD' => '20', 'IL' => '21', |
| 96 | 'IS' => '22', 'IF' => '23', 'MM' => '24', 'MH' => '25', 'MS' => '26', 'NT' => '27', |
| 97 | 'OT' => '28', 'PH' => '29', 'SM' => '30', 'SJ' => '31', 'SB' => '32', 'SV' => '33', |
| 98 | 'TR' => '34', 'TM' => '35', 'TL' => '36', 'VS' => '37', 'VL' => '38', 'VN' => '39', |
| 99 | |
| 100 | 'B1' => '41', 'B2' => '42', 'B3' => '43', 'B4' => '44', 'B5' => '45', 'B6' => '46' |
| 101 | ); |
| 102 | |
| 103 | /** |
| 104 | * Personal Numerical Code (CNP) |
| 105 | * |
| 106 | * @link http://ro.wikipedia.org/wiki/Cod_numeric_personal |
| 107 | * @example 1111111111118 |
| 108 | * |
| 109 | * @param null|string $gender Person::GENDER_MALE or Person::GENDER_FEMALE |
| 110 | * @param null|string $dateOfBirth (1800-2099) 'Y-m-d', 'Y-m', 'Y' I.E. '1981-06-16', '2085-03', '1900' |
| 111 | * @param null|string $county county code where the CNP was issued |
| 112 | * @param null|bool $isResident flag if the person resides in Romania |
| 113 | * @return string 13 digits CNP code |
| 114 | */ |
| 115 | public function cnp($gender = null, $dateOfBirth = null, $county = null, $isResident = true) |
| 116 | { |
| 117 | $genders = array(Person::GENDER_MALE, Person::GENDER_FEMALE); |
| 118 | if (empty($gender)) { |
| 119 | $gender = static::randomElement($genders); |
| 120 | } elseif (!in_array($gender, $genders)) { |
| 121 | throw new \InvalidArgumentException("Gender must be '{Person::GENDER_MALE}' or '{Person::GENDER_FEMALE}'"); |
| 122 | } |
| 123 | |
| 124 | $date = $this->getDateOfBirth($dateOfBirth); |
| 125 | |
| 126 | if (is_null($county)) { |
| 127 | $countyCode = static::randomElement(array_values(static::$cnpCountyCodes)); |
| 128 | } elseif (!array_key_exists($county, static::$cnpCountyCodes)) { |
| 129 | throw new \InvalidArgumentException("Invalid county code '{$county}' received"); |
| 130 | } else { |
| 131 | $countyCode = static::$cnpCountyCodes[$county]; |
| 132 | } |
| 133 | |
| 134 | $cnp = (string)$this->getGenderDigit($date, $gender, $isResident) |
| 135 | . $date->format('ymd') |
| 136 | . $countyCode |
| 137 | . static::numerify('##%') |
| 138 | ; |
| 139 | |
| 140 | $checksum = $this->getChecksumDigit($cnp); |
| 141 | |
| 142 | return $cnp.$checksum; |
| 143 | } |
| 144 | |
| 145 | /** |
| 146 | * @param $dateOfBirth |
| 147 | * @return \DateTime |
| 148 | */ |
| 149 | protected function getDateOfBirth($dateOfBirth) |
| 150 | { |
| 151 | if (empty($dateOfBirth)) { |
| 152 | $dateOfBirthParts = array(static::numberBetween(1800, 2099)); |
| 153 | } else { |
| 154 | $dateOfBirthParts = explode('-', $dateOfBirth); |
| 155 | } |
| 156 | $baseDate = \Faker\Provider\DateTime::dateTimeBetween("first day of {$dateOfBirthParts[0]}", "last day of {$dateOfBirthParts[0]}"); |
| 157 | |
| 158 | switch (count($dateOfBirthParts)) { |
| 159 | case 1: |
| 160 | $dateOfBirthParts[] = $baseDate->format('m'); |
| 161 | //don't break, we need the day also |
| 162 | case 2: |
| 163 | $dateOfBirthParts[] = $baseDate->format('d'); |
| 164 | //don't break, next line will |
| 165 | case 3: |
| 166 | break; |
| 167 | default: |
| 168 | throw new \InvalidArgumentException("Invalid date of birth - must be null or in the 'Y-m-d', 'Y-m', 'Y' format"); |
| 169 | } |
| 170 | |
| 171 | if ($dateOfBirthParts[0] < 1800 || $dateOfBirthParts[0] > 2099) { |
| 172 | throw new \InvalidArgumentException("Invalid date of birth - year must be between 1900 and 2099, '{$dateOfBirthParts[0]}' received"); |
| 173 | } |
| 174 | |
| 175 | $dateOfBirthFinal = implode('-', $dateOfBirthParts); |
| 176 | $date = \DateTime::createFromFormat('Y-m-d', $dateOfBirthFinal); |
| 177 | //a full (invalid) date might have been supplied, check if it converts |
| 178 | if ($date->format('Y-m-d') !== $dateOfBirthFinal) { |
| 179 | throw new \InvalidArgumentException("Invalid date of birth - '{$date->format('Y-m-d')}' generated based on '{$dateOfBirth}' received"); |
| 180 | } |
| 181 | |
| 182 | return $date; |
| 183 | } |
| 184 | |
| 185 | /** |
| 186 | * |
| 187 | * https://ro.wikipedia.org/wiki/Cod_numeric_personal#S |
| 188 | * |
| 189 | * @param \DateTime $dateOfBirth |
| 190 | * @param bool $isResident |
| 191 | * @param string $gender |
| 192 | * @return int |
| 193 | */ |
| 194 | protected static function getGenderDigit(\DateTime $dateOfBirth, $gender, $isResident) |
| 195 | { |
| 196 | if (!$isResident) { |
| 197 | return 9; |
| 198 | } |
| 199 | |
| 200 | if ($dateOfBirth->format('Y') < 1900) { |
| 201 | if ($gender == Person::GENDER_MALE) { |
| 202 | return 3; |
| 203 | } |
| 204 | return 4; |
| 205 | } |
| 206 | |
| 207 | if ($dateOfBirth->format('Y') < 2000) { |
| 208 | if ($gender == Person::GENDER_MALE) { |
| 209 | return 1; |
| 210 | } |
| 211 | return 2; |
| 212 | } |
| 213 | |
| 214 | if ($gender == Person::GENDER_MALE) { |
| 215 | return 5; |
| 216 | } |
| 217 | return 6; |
| 218 | } |
| 219 | |
| 220 | /** |
| 221 | * Calculates a checksum for the Personal Numerical Code (CNP). |
| 222 | * |
| 223 | * @param string $value 12 digit CNP |
| 224 | * @return int checksum digit |
| 225 | */ |
| 226 | protected function getChecksumDigit($value) |
| 227 | { |
| 228 | $checkNumber = 279146358279; |
| 229 | |
| 230 | $checksum = 0; |
| 231 | foreach (range(0, 11) as $digit) { |
| 232 | $checksum += (int)substr($value, $digit, 1) * (int)substr($checkNumber, $digit, 1); |
| 233 | } |
| 234 | $checksum = $checksum % 11; |
| 235 | |
| 236 | return $checksum == 10 ? 1 : $checksum; |
| 237 | } |
| 238 | } |
| 239 |