import { Populated } from '../core/mongoose.js'; import { AptlyAddress, AptlySearchAddress } from './address.js'; import { AptlyAllowance, AptlyAllowanceChargeSchema, AptlyExtensionAmount, AptlyLegalMonetaryTotal } from './algorithm.js'; import { AptlyCompany, AptlyCompanySchema } from './company.js'; import { AptlyCustomerData, AptlyCustomerDataSchema } from './customer.js'; import { AptlyDocumentSchema } from './document.js'; import { AptlyBaseSchema } from './extends.js'; import { AptlyOptionPopulatedSchema, AptlyOptionSchema } from './option.js'; import { AptlyOrderPaymentStatus, AptlyOrderSchema } from './order.js'; import { AptlyOrganization, AptlyOrganizationSchema } from './organization.js'; import { AptlyPickSchema } from './pick.js'; import { AptlyProjectSchema } from './project.js'; import { AptlyUnitSchema } from './unit.js'; import { AptlyUserSchema } from './user.js'; import { AptlyCategorySchema } from './category'; import { AptlyApp, AptlyAppSchema } from './app'; export type AptlyOffer = AptlyOfferSchema; export interface AptlyOfferSchema extends AptlyBaseSchema, Omit { organization: ID | AptlyOrganizationSchema | null; project: ID | AptlyProjectSchema | null; unit: ID | AptlyUnitSchema | null; order: ID | AptlyOrderSchema | null; company: ID | AptlyCompanySchema | null; document: ID | AptlyDocumentSchema | null; categories: (ID | AptlyCategorySchema)[]; invoice: boolean; apps: (ID | AptlyAppSchema)[]; createdBy: Populated> | null; expiresAt: DATE | null; sentAt: DATE | null; number: number | null; description: string; identification: string; incVAT: boolean; hidePrices: boolean; amount: number | null; allowance?: AptlyAllowance | null; algorithm: ID | null; items: AptlyOfferItemSchema[]; customer: AptlyCustomerDataSchema | null; shipping: AptlyAddress | null; ourContact: Populated> | null; openedAt: DATE | null; acceptedAt: DATE | null; acceptedBy: ID | AptlyUserSchema | null; locked: boolean; } export type AptlyOfferItem = AptlyOfferItemSchema; export interface AptlyOfferItemSchema { _id: ID; option: ID | AptlyOptionSchema; quantity: number; amount: number; title?: string; algorithm: ID | null; note: string; createdAt?: DATE; index: number; allowance?: AptlyAllowance | null; } export type AptlyUserOffer = AptlyUserOfferSchema; export interface AptlyUserOfferSchema extends Omit, 'amount' | 'items' | 'apps'> { apps: Pick, '_id' | 'name' | 'implements'>[]; options: AptlyOptionPopulatedSchema[]; picks?: AptlyPickSchema[]; } export interface AptlyOfferSendInvoiceBody { invoice?: boolean; apps?: (string | AptlyApp)[]; __hr?: undefined; } export interface AptlyOfferSendLinkBody { email: string; } export interface AptlyOfferSendUnitBody extends AptlyOfferSendInvoiceBody { unit: string; address: AptlySearchAddress | null; email?: string; firstName?: string; lastName?: string; phone?: string; } export interface AptlyOfferSendPrivateBody extends AptlyOfferSendInvoiceBody, Omit { unit: string | null; address: AptlySearchAddress | null; } export interface AptlyOfferSendCustomerBody extends AptlyOfferSendInvoiceBody, Omit { customer: string | null; address: AptlySearchAddress | null; shipping?: AptlyAddress | null; } export interface AptlyOfferSendCompanyBody extends AptlyOfferSendInvoiceBody, Omit { company: Pick & Pick; address: AptlyAddress; } export interface AptlyOfferQRBody { src: string; href: string; } export type AptlyPublicOfferCheckout = AptlyPublicOfferCheckoutSchema; export interface AptlyPublicOfferCheckoutSchema extends Pick { status: AptlyOrderPaymentStatus; offer: Omit, 'options'>; options: AptlyOptionPopulatedSchema[]; organization: Pick, 'name' | 'logoMedia'>; project: Pick, 'name' | 'paymentApp' | 'signApp'> | null; unit: Pick, '_id' | 'name'> | null; order?: Pick, '_id' | 'status' | 'paymentSession' | 'billing' | 'shippingDate'>; app: Pick, '_id' | 'name' | 'implements'> | null; actions: { payment?: { active: boolean; }; sign?: { active: boolean; }; confirm?: { active: boolean; }; }; extensionAmount: number; extensionVatAmount: number; total: AptlyLegalMonetaryTotal; allowanceCharges: AptlyAllowanceChargeSchema[]; terms?: AptlyDocumentSchema | null; } export interface AptlyPublicOfferAcceptBody { customer: AptlyCustomerData; shipping: AptlyAddress; billing: AptlyAddress | null; redirectUri: string; }