<?php
namespace App\Entity;
use App\Repository\CompanyProfileRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* FIRMA KUNYESI — bu kurulumun sahibi firma (singleton, tek satir).
*
* 2026-09-27'ye kadar adi `administrative` idi ve yalnizca iki is yapiyordu: hangi partner'in
* "biz" oldugunu isaretlemek + bir `company_name` kopyasi tutmak. Kullanici karari ile tablo
* KUNYEYE terfi etti; ad kopyasi KALDIRILDI.
*
* ── Model karari (kullanici karari 2026-09-27, 2. tur) ───────────────────────
* KUNYE TEK DUZENLEME NOKTASIDIR: firmaya ait her sey (ad, adres, iletisim, yasal kimlikler,
* banka, odeme sartlari, tanitim) BU tabloda durur ve Ayarlar → Firma'dan yazilir.
* Kullanicinin sozu: *"butun company ile ilgili editlerimi buradan yapiyor olabilmem lazim"*.
*
* 🔁 PARTNER'a TEK YONLU SENKRON: kayit sonrasi `name/tel/email/city/country` partner kaydina
* yazilir — `partner.company` NOT NULL'dir ve projeler/teklifler adi ORADAN okur.
* Akis DAIMA kunye → partner; ters yon YOKTUR. Partner ekraninda bu kayit kilitli gosterilir.
*
* 🪤 Once `company_name` diye bir KOPYA kolon vardi ve partner kaynakti; ayristigi icin dusuruldu
* ("Romon Engeering GmbH" vs "ROMON Engineering GmbH"). Buradaki `name` onun devami DEGIL:
* yon tersine dondu, artik kaynak burasi. Partner'dan kunyeye ASLA yazilmaz.
*
* 🤖 `about_short` / `about_long` yapay zeka icin de kaynaktir: AI Hub'a giden ayar belgesine
* (`DesktopSettingsService::hubDocument()`) `company` bolumu olarak girer.
*
* @ORM\Entity(repositoryClass=CompanyProfileRepository::class)
* @ORM\Table(name="company_profile")
*/
class CompanyProfile
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "partner.manage.base",
* "partner.list.base",
* "worker.actually.activity",
* "company_profile@ref",
* "company_profile@base",
* "company_profile@core"
* })
*/
private $id;
/**
* Firmanin PARTNER kaydi — kimlik, adres, telefon, e-posta oradan okunur.
*
* 🪤 `cascade` icinde **`remove` YOK** (2026-09-30 bulgusu): kunyeyi silmek PARTNERI de
* siliyordu, partner silinince de `worker_activities` / `project_stakeholders`
* ON DELETE CASCADE ile gidiyordu — yani "eslesmeyi kaldir" firmanin TUM calisan
* sozlesmelerini silmeye kalkiyordu. Yalniz `project_order_tasks` FK'si patladigi icin
* (1451) veri kaybi yasanmadi; test `testUnpairRemovesTheProfileRow` bunu yakaladi.
* Kunye TUREVDIR, partner bagimsiz kayittir — silme asla yukari akmaz.
*
* @ORM\OneToOne(targetEntity=Partner::class, inversedBy="companyProfile", cascade={"persist"})
* @ORM\JoinColumn(name="paired_partner_id", nullable=false)
* @Groups({ "company_profile@core" })
*/
private $paired_partner;
// ── Kimlik (TEK KAYNAK — partner'a senkronlanir) ────────────────────────
/**
* Firma adi. `partner.company` bunun TUREVIDIR (NOT NULL oldugu icin senkron sarttir).
*
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@base", "company_profile@core" })
*/
private $name;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $tel;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $email;
// ── Adres (kullanici karari: duz alanlar, ayri tabloya gidilmez) ────────
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $street;
/**
* @ORM\Column(type="string", length=32, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $house_number;
/**
* @ORM\Column(type="string", length=25, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $postcode;
/**
* @ORM\Column(type="string", length=128, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $city;
/**
* @ORM\ManyToOne(targetEntity=Countries::class)
* @ORM\JoinColumn(name="country_id", nullable=true)
* @Groups({ "company_profile@core" })
*/
private $country;
// ── Yasal kimlik ────────────────────────────────────────────────────────
/** Ticaret unvani (partner adindan farkliysa; fatura/teklif basliginda kullanilir).
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $legal_name;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $tax_no;
/** USt-IdNr / VAT ID.
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $vat_id;
/** Handelsregister no (ör. HRB 12345).
* @ORM\Column(type="string", length=128, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $trade_register;
/** Sicilin tutuldugu mahkeme (Amtsgericht).
* @ORM\Column(type="string", length=128, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $register_court;
/** Yetkili / genel mudur — imza sirkulerinde gorunen ad.
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $managing_director;
// ── Banka ───────────────────────────────────────────────────────────────
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $bank_name;
/**
* @ORM\Column(type="string", length=64, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $iban;
/**
* @ORM\Column(type="string", length=32, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $bic;
// ── Ticari sartlar ──────────────────────────────────────────────────────
/** Odeme vadesi (gun). Musteri bazinda ezilebilir — burasi firmanin VARSAYILANI.
* @ORM\Column(type="integer", nullable=true)
* @Groups({ "company_profile@core" })
*/
private $payment_terms_days;
/** Serbest metin sart notu (gecikme faizi, erken odeme indirimi…).
* @ORM\Column(type="string", length=500, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $payment_terms_note;
// ── Tanitim / biyografi (AI kaynagi) ────────────────────────────────────
/** Tek cumlelik tanitim.
* @ORM\Column(type="string", length=500, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $about_short;
/** Uzun tanitim / biyografi — AI belgesine bu metin girer.
* @ORM\Column(type="text", nullable=true)
* @Groups({ "company_profile@core" })
*/
private $about_long;
// ── Surum damgasi (desktop_settings kalibi) ─────────────────────────────
/**
* @ORM\Column(type="integer", options={"default": 0})
* @Groups({ "company_profile@core" })
*/
private $version = 0;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Groups({ "company_profile@core" })
*/
private $updated_at;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({ "company_profile@core" })
*/
private $updated_by;
public function getId(): ?int
{
return $this->id;
}
public function getPairedPartner(): ?Partner
{
return $this->paired_partner;
}
public function setPairedPartner(Partner $paired_partner): self
{
$this->paired_partner = $paired_partner;
return $this;
}
/** Firmanin adi — TEK kaynak BU tablodur; kunye bos ise partner'dan okunur (gecis dolumu). */
public function getCompanyName(): ?string
{
if ($this->name !== null && trim($this->name) !== '') {
return $this->name;
}
return $this->paired_partner ? $this->paired_partner->getCompany() : null;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
public function getTel(): ?string
{
return $this->tel;
}
public function setTel(?string $tel): self
{
$this->tel = $tel;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
public function getStreet(): ?string
{
return $this->street;
}
public function setStreet(?string $street): self
{
$this->street = $street;
return $this;
}
public function getHouseNumber(): ?string
{
return $this->house_number;
}
public function setHouseNumber(?string $house_number): self
{
$this->house_number = $house_number;
return $this;
}
public function getPostcode(): ?string
{
return $this->postcode;
}
public function setPostcode(?string $postcode): self
{
$this->postcode = $postcode;
return $this;
}
public function getCity(): ?string
{
return $this->city;
}
public function setCity(?string $city): self
{
$this->city = $city;
return $this;
}
public function getCountry(): ?Countries
{
return $this->country;
}
public function setCountry(?Countries $country): self
{
$this->country = $country;
return $this;
}
public function getLegalName(): ?string
{
return $this->legal_name;
}
public function setLegalName(?string $legal_name): self
{
$this->legal_name = $legal_name;
return $this;
}
public function getTaxNo(): ?string
{
return $this->tax_no;
}
public function setTaxNo(?string $tax_no): self
{
$this->tax_no = $tax_no;
return $this;
}
public function getVatId(): ?string
{
return $this->vat_id;
}
public function setVatId(?string $vat_id): self
{
$this->vat_id = $vat_id;
return $this;
}
public function getTradeRegister(): ?string
{
return $this->trade_register;
}
public function setTradeRegister(?string $trade_register): self
{
$this->trade_register = $trade_register;
return $this;
}
public function getRegisterCourt(): ?string
{
return $this->register_court;
}
public function setRegisterCourt(?string $register_court): self
{
$this->register_court = $register_court;
return $this;
}
public function getManagingDirector(): ?string
{
return $this->managing_director;
}
public function setManagingDirector(?string $managing_director): self
{
$this->managing_director = $managing_director;
return $this;
}
public function getBankName(): ?string
{
return $this->bank_name;
}
public function setBankName(?string $bank_name): self
{
$this->bank_name = $bank_name;
return $this;
}
public function getIban(): ?string
{
return $this->iban;
}
public function setIban(?string $iban): self
{
$this->iban = $iban;
return $this;
}
public function getBic(): ?string
{
return $this->bic;
}
public function setBic(?string $bic): self
{
$this->bic = $bic;
return $this;
}
public function getPaymentTermsDays(): ?int
{
return $this->payment_terms_days;
}
public function setPaymentTermsDays(?int $payment_terms_days): self
{
$this->payment_terms_days = $payment_terms_days;
return $this;
}
public function getPaymentTermsNote(): ?string
{
return $this->payment_terms_note;
}
public function setPaymentTermsNote(?string $payment_terms_note): self
{
$this->payment_terms_note = $payment_terms_note;
return $this;
}
public function getAboutShort(): ?string
{
return $this->about_short;
}
public function setAboutShort(?string $about_short): self
{
$this->about_short = $about_short;
return $this;
}
public function getAboutLong(): ?string
{
return $this->about_long;
}
public function setAboutLong(?string $about_long): self
{
$this->about_long = $about_long;
return $this;
}
public function getVersion(): int
{
return (int) $this->version;
}
public function setVersion(int $version): self
{
$this->version = $version;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updated_at;
}
public function setUpdatedAt(?\DateTimeInterface $updated_at): self
{
$this->updated_at = $updated_at;
return $this;
}
public function getUpdatedBy(): ?string
{
return $this->updated_by;
}
public function setUpdatedBy(?string $updated_by): self
{
$this->updated_by = $updated_by;
return $this;
}
}