@placeshakr/config 10.28.1 → 10.30.2-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/policy.js +6 -0
- package/dist/auth/policy.js.map +1 -1
- package/dist/billing/index.js +9 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/pennylane.js +400 -0
- package/dist/billing/pennylane.js.map +1 -0
- package/dist/billing/permissions.js +27 -0
- package/dist/billing/permissions.js.map +1 -0
- package/dist/billing/prefill.js +208 -0
- package/dist/billing/prefill.js.map +1 -0
- package/dist/billing/types.js +3 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/billing/validate.js +189 -0
- package/dist/billing/validate.js.map +1 -0
- package/dist/environment/base.js +30 -1
- package/dist/environment/base.js.map +1 -1
- package/dist/environment/decorators.js +2 -0
- package/dist/environment/decorators.js.map +1 -1
- package/dist/helpers/index.js +1 -0
- package/dist/helpers/index.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/types/auth/policy.d.ts +2 -1
- package/dist/types/auth/policy.d.ts.map +1 -1
- package/dist/types/billing/index.d.ts +6 -0
- package/dist/types/billing/index.d.ts.map +1 -0
- package/dist/types/billing/pennylane.d.ts +191 -0
- package/dist/types/billing/pennylane.d.ts.map +1 -0
- package/dist/types/billing/permissions.d.ts +23 -0
- package/dist/types/billing/permissions.d.ts.map +1 -0
- package/dist/types/billing/prefill.d.ts +42 -0
- package/dist/types/billing/prefill.d.ts.map +1 -0
- package/dist/types/billing/types.d.ts +30 -0
- package/dist/types/billing/types.d.ts.map +1 -0
- package/dist/types/billing/validate.d.ts +48 -0
- package/dist/types/billing/validate.d.ts.map +1 -0
- package/dist/types/environment/base.d.ts.map +1 -1
- package/dist/types/environment/decorators.d.ts.map +1 -1
- package/dist/types/environment/types.d.ts +5 -0
- package/dist/types/environment/types.d.ts.map +1 -1
- package/dist/types/helpers/index.d.ts +1 -0
- package/dist/types/helpers/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +478 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types.js +70 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/src/auth/policy.ts +21 -1
- package/src/billing/index.ts +5 -0
- package/src/billing/pennylane.ts +530 -0
- package/src/billing/permissions.ts +25 -0
- package/src/billing/prefill.ts +309 -0
- package/src/billing/types.ts +32 -0
- package/src/billing/validate.ts +198 -0
- package/src/environment/base.ts +32 -1
- package/src/environment/decorators.ts +2 -0
- package/src/environment/types.ts +5 -0
- package/src/helpers/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/types.ts +512 -1
package/src/types.ts
CHANGED
|
@@ -527,6 +527,8 @@ export interface Enterprise extends Resource {
|
|
|
527
527
|
whatsapp?: boolean;
|
|
528
528
|
marketplace?: boolean;
|
|
529
529
|
multiProfessionals?: boolean;
|
|
530
|
+
/** Integracion con PennyLane: activa el listado Bills y el sync. */
|
|
531
|
+
pennylane?: boolean;
|
|
530
532
|
};
|
|
531
533
|
|
|
532
534
|
/**
|
|
@@ -690,6 +692,13 @@ export interface User extends Resource {
|
|
|
690
692
|
type Permissions = Record<string, boolean>;
|
|
691
693
|
|
|
692
694
|
export interface Profile extends Resource {
|
|
695
|
+
/**
|
|
696
|
+
* Datos de facturacion del tercero. Vive en Profile —y no en Client, Pro y
|
|
697
|
+
* Seller por separado— porque los tres lo heredan y el SDK escribe contra
|
|
698
|
+
* este tipo. Ver [[BillingIdentity]] y `config/src/billing`.
|
|
699
|
+
*/
|
|
700
|
+
billing?: BillingIdentity;
|
|
701
|
+
|
|
693
702
|
/**
|
|
694
703
|
*
|
|
695
704
|
*/
|
|
@@ -1009,7 +1018,12 @@ export interface Seller extends Profile {
|
|
|
1009
1018
|
/**
|
|
1010
1019
|
* the provider related
|
|
1011
1020
|
*/
|
|
1012
|
-
provider
|
|
1021
|
+
provider?: string;
|
|
1022
|
+
|
|
1023
|
+
/**
|
|
1024
|
+
* the providers related
|
|
1025
|
+
*/
|
|
1026
|
+
providers?: string[];
|
|
1013
1027
|
|
|
1014
1028
|
/**
|
|
1015
1029
|
* indicates if is a team leader
|
|
@@ -1100,6 +1114,12 @@ export interface Commissions {
|
|
|
1100
1114
|
* Represents an provider
|
|
1101
1115
|
*/
|
|
1102
1116
|
export interface Provider extends Resource {
|
|
1117
|
+
/**
|
|
1118
|
+
* Datos de facturacion. Se completa de forma incremental al facturar.
|
|
1119
|
+
* Ver [[BillingIdentity]] y `config/src/billing`.
|
|
1120
|
+
*/
|
|
1121
|
+
billing?: BillingIdentity;
|
|
1122
|
+
|
|
1103
1123
|
/**
|
|
1104
1124
|
* The provider name
|
|
1105
1125
|
*/
|
|
@@ -2488,9 +2508,32 @@ export type Bill = Resource & {
|
|
|
2488
2508
|
// used to save information related with any possible external system
|
|
2489
2509
|
metadata?: {
|
|
2490
2510
|
sentToIpaidthat?: boolean;
|
|
2511
|
+
/** @deprecated usar metadata.pennylane. Se mantiene hasta retirar el envio por email. */
|
|
2491
2512
|
sentToPennyLane?: boolean;
|
|
2513
|
+
/** @deprecated usar metadata.pennylane.lastSyncAt */
|
|
2492
2514
|
sentToPennyLaneDate?: number;
|
|
2515
|
+
/**
|
|
2516
|
+
* Estado de sincronizacion con PennyLane. Sustituye a los dos booleanos
|
|
2517
|
+
* de arriba: guarda el id contable, el hash del ultimo payload enviado
|
|
2518
|
+
* (idempotencia) y el error, para poder reintentar sin duplicar.
|
|
2519
|
+
*/
|
|
2520
|
+
pennylane?: PennylaneBillSync;
|
|
2493
2521
|
};
|
|
2522
|
+
|
|
2523
|
+
/**
|
|
2524
|
+
* Origen del documento cuando no se ha creado en Articho. Las facturas con
|
|
2525
|
+
* source distinto de undefined no se editan ni se borran desde la app: la
|
|
2526
|
+
* autoridad esta en firestore.rules.
|
|
2527
|
+
*/
|
|
2528
|
+
source?: 'pennylane';
|
|
2529
|
+
imported?: boolean;
|
|
2530
|
+
|
|
2531
|
+
/**
|
|
2532
|
+
* Datos de facturacion del destinatario, cuando este no tiene ficha propia
|
|
2533
|
+
* (fournisseur de materiaux, de services y personnalise). Para CLIENT, PRO y
|
|
2534
|
+
* PROVIDER viven en la ficha del tercero. Ver `config/src/billing`.
|
|
2535
|
+
*/
|
|
2536
|
+
billing?: BillingIdentity;
|
|
2494
2537
|
};
|
|
2495
2538
|
|
|
2496
2539
|
export type BillReceived = Bill & {
|
|
@@ -2651,6 +2694,12 @@ export type Price = {
|
|
|
2651
2694
|
* Represents a materials provider
|
|
2652
2695
|
*/
|
|
2653
2696
|
export interface MaterialsProvider extends Resource {
|
|
2697
|
+
/**
|
|
2698
|
+
* Datos de facturacion. Se completa de forma incremental al facturar.
|
|
2699
|
+
* Ver [[BillingIdentity]] y `config/src/billing`.
|
|
2700
|
+
*/
|
|
2701
|
+
billing?: BillingIdentity;
|
|
2702
|
+
|
|
2654
2703
|
/**
|
|
2655
2704
|
* The material provider name
|
|
2656
2705
|
*/
|
|
@@ -3404,6 +3453,11 @@ export interface Invitation {
|
|
|
3404
3453
|
*/
|
|
3405
3454
|
provider?: Provider;
|
|
3406
3455
|
|
|
3456
|
+
/**
|
|
3457
|
+
* Invited user's providers list
|
|
3458
|
+
*/
|
|
3459
|
+
providers?: Provider[] | string[];
|
|
3460
|
+
|
|
3407
3461
|
/**
|
|
3408
3462
|
* Invited user's district where he/she works
|
|
3409
3463
|
*/
|
|
@@ -4553,3 +4607,460 @@ export enum EmailEventsEnum {
|
|
|
4553
4607
|
RESET_USER_PASSWORD = 'RESET_USER_PASSWORD',
|
|
4554
4608
|
DOCUMENTS_ISSUES = 'DOCUMENTS_ISSUES',
|
|
4555
4609
|
}
|
|
4610
|
+
|
|
4611
|
+
/* -------------------------------------------------------------------------- */
|
|
4612
|
+
/* PennyLane */
|
|
4613
|
+
/* -------------------------------------------------------------------------- */
|
|
4614
|
+
|
|
4615
|
+
/** Estado de la sincronizacion de una factura concreta con PennyLane. */
|
|
4616
|
+
export type PennylaneBillSync = {
|
|
4617
|
+
status: 'PENDING' | 'SYNCED' | 'FAILED' | 'SKIPPED';
|
|
4618
|
+
/** Id de la factura en PennyLane. */
|
|
4619
|
+
invoiceId?: string;
|
|
4620
|
+
/** Id de la factura acreditada en PennyLane (para avoirs). */
|
|
4621
|
+
creditedInvoiceId?: string;
|
|
4622
|
+
/** Id del avoir en PennyLane que cancela esta factura. */
|
|
4623
|
+
creditNoteId?: string;
|
|
4624
|
+
creditNoteNumber?: string;
|
|
4625
|
+
creditNoteStatus?: 'PENDING' | 'SYNCED' | 'FAILED' | 'SKIPPED';
|
|
4626
|
+
creditNoteError?: string;
|
|
4627
|
+
/** Documento espejo en enterprises/{id}/importedBills. */
|
|
4628
|
+
importedBillId?: string;
|
|
4629
|
+
fileAttachmentId?: string;
|
|
4630
|
+
/**
|
|
4631
|
+
* Hash del payload enviado. PennyLane no ofrece Idempotency-Key, asi que la
|
|
4632
|
+
* deduplicacion es nuestra: mismo hash que el ultimo SYNCED, no se reenvia.
|
|
4633
|
+
*/
|
|
4634
|
+
payloadHash?: string;
|
|
4635
|
+
attempts?: number;
|
|
4636
|
+
lastAttemptAt?: number;
|
|
4637
|
+
lastSyncAt?: number;
|
|
4638
|
+
syncedAt?: number;
|
|
4639
|
+
error?: { code: string; message: string; status?: number };
|
|
4640
|
+
};
|
|
4641
|
+
|
|
4642
|
+
/** De que campo de la factura de PennyLane se lee cada referencia. */
|
|
4643
|
+
export type PennylaneReferenceConfig = {
|
|
4644
|
+
/** Campo donde el proveedor escribe la referencia de chantier. */
|
|
4645
|
+
projectField: 'label' | 'invoice_number' | 'lines';
|
|
4646
|
+
/** Campo donde el proveedor escribe la referencia de devis. */
|
|
4647
|
+
devisField: 'label' | 'invoice_number' | 'lines';
|
|
4648
|
+
/** Expresion regular con un grupo de captura. */
|
|
4649
|
+
projectPattern?: string;
|
|
4650
|
+
devisPattern?: string;
|
|
4651
|
+
};
|
|
4652
|
+
|
|
4653
|
+
export type PennylaneIgnoredSupplier = {
|
|
4654
|
+
name: string;
|
|
4655
|
+
regNo?: string | null;
|
|
4656
|
+
pennylaneId?: string | null;
|
|
4657
|
+
ignoredAt: number;
|
|
4658
|
+
ignoredBy?: string | null;
|
|
4659
|
+
};
|
|
4660
|
+
|
|
4661
|
+
/** Configuracion de PennyLane por empresa: enterprises/{id}/configurations/pennylane */
|
|
4662
|
+
export type PennylaneConfiguration = {
|
|
4663
|
+
enabled: boolean;
|
|
4664
|
+
/** Identificador numérico de la empresa en PennyLane (ej. '156553'). */
|
|
4665
|
+
companyId?: string;
|
|
4666
|
+
push: { issued: boolean; received: boolean };
|
|
4667
|
+
pull: { supplierInvoices: boolean };
|
|
4668
|
+
/** false = enviar solo importes agregados + PDF. */
|
|
4669
|
+
sendLineItems: boolean;
|
|
4670
|
+
/** true mientras el mapeo contable no este cerrado con el contable. */
|
|
4671
|
+
importAsIncomplete: boolean;
|
|
4672
|
+
references: PennylaneReferenceConfig;
|
|
4673
|
+
/** Estados de PennyLane que no se traen (borradores y ruido inicial). */
|
|
4674
|
+
excludedStates?: string[];
|
|
4675
|
+
/** Dias hacia atras en la carga inicial o el resync completo. */
|
|
4676
|
+
lookbackDays?: number;
|
|
4677
|
+
defaultLedgerAccountId?: string;
|
|
4678
|
+
ledgerAccountByCategory?: Record<string, string>;
|
|
4679
|
+
/** Analitico por chantier. Ver [[PennylaneCategoryConfig]]. */
|
|
4680
|
+
categories?: PennylaneCategoryConfig;
|
|
4681
|
+
/** Lista de proveedores cuyas facturas se ignoran automáticamente al sincronizar. */
|
|
4682
|
+
ignoredSuppliers?: PennylaneIgnoredSupplier[];
|
|
4683
|
+
/** Estado del sync. Solo lo escriben las Cloud Functions. */
|
|
4684
|
+
sync?: {
|
|
4685
|
+
supplierInvoices?: PennylaneSyncState;
|
|
4686
|
+
customerInvoices?: PennylaneSyncState;
|
|
4687
|
+
};
|
|
4688
|
+
};
|
|
4689
|
+
|
|
4690
|
+
/**
|
|
4691
|
+
* Analitico por chantier: una categoria de PennyLane por proyecto de Articho,
|
|
4692
|
+
* la misma para las facturas emitidas y las recibidas de ese proyecto.
|
|
4693
|
+
*
|
|
4694
|
+
* El GRUPO de categorias no se puede crear por API: lo da de alta una persona
|
|
4695
|
+
* en PennyLane y su id se pega aqui. Y las categorias, una vez creadas, NO se
|
|
4696
|
+
* pueden borrar por API —solo renombrar—, asi que se crean perezosamente: la
|
|
4697
|
+
* primera vez que un proyecto recibe o emite una factura, nunca al crear el
|
|
4698
|
+
* proyecto. Un proyecto que nunca factura no ensucia el plan analitico.
|
|
4699
|
+
*/
|
|
4700
|
+
export type PennylaneCategoryConfig = {
|
|
4701
|
+
/** Interruptor. Sin esto el sync no toca categorias. */
|
|
4702
|
+
enabled: boolean;
|
|
4703
|
+
/**
|
|
4704
|
+
* Id del grupo creado a mano en PennyLane (p. ej. "Chantiers Articho").
|
|
4705
|
+
* Es distinto en cada empresa: son espacios de PennyLane distintos.
|
|
4706
|
+
*/
|
|
4707
|
+
groupId: number;
|
|
4708
|
+
/** Categorizar tambien las facturas que Articho emite. */
|
|
4709
|
+
includeCustomerInvoices?: boolean;
|
|
4710
|
+
};
|
|
4711
|
+
|
|
4712
|
+
export type PennylaneSyncState = {
|
|
4713
|
+
/**
|
|
4714
|
+
* Marca de tiempo del ultimo cambio procesado. El changelog de PennyLane
|
|
4715
|
+
* solo retiene 4 semanas: si esto se queda atras, hay perdida de datos.
|
|
4716
|
+
*/
|
|
4717
|
+
checkpoint: number;
|
|
4718
|
+
lastRunAt: number;
|
|
4719
|
+
lastError?: string | null;
|
|
4720
|
+
};
|
|
4721
|
+
|
|
4722
|
+
export enum ImportedBillStatus {
|
|
4723
|
+
/** Llego de PennyLane y no se ha podido resolver proyecto o devis. */
|
|
4724
|
+
PENDING_ASSIGNMENT = 'PENDING_ASSIGNMENT',
|
|
4725
|
+
/** Proyecto y devis resueltos: falta que un administrador confirme. */
|
|
4726
|
+
READY_TO_ASSIGN = 'READY_TO_ASSIGN',
|
|
4727
|
+
/** Ya tiene una factura creada dentro de un proyecto. */
|
|
4728
|
+
ASSIGNED = 'ASSIGNED',
|
|
4729
|
+
/** Descartada a mano. */
|
|
4730
|
+
IGNORED = 'IGNORED',
|
|
4731
|
+
/** Duplicado de otra factura importada. */
|
|
4732
|
+
DUPLICATE = 'DUPLICATE',
|
|
4733
|
+
}
|
|
4734
|
+
|
|
4735
|
+
export enum PennylaneSyncEventType {
|
|
4736
|
+
IMPORTED = 'IMPORTED',
|
|
4737
|
+
EXTERNAL_STATUS_CHANGE = 'EXTERNAL_STATUS_CHANGE',
|
|
4738
|
+
BILL_STATUS_UPDATED = 'BILL_STATUS_UPDATED',
|
|
4739
|
+
ASSIGNED = 'ASSIGNED',
|
|
4740
|
+
IGNORED = 'IGNORED',
|
|
4741
|
+
ERROR = 'ERROR',
|
|
4742
|
+
}
|
|
4743
|
+
|
|
4744
|
+
/**
|
|
4745
|
+
* Un evento por cada cosa que le pasa a una factura importada. Sin esto, una
|
|
4746
|
+
* factura que cambia sola de estado es indistinguible de un bug.
|
|
4747
|
+
*/
|
|
4748
|
+
export type PennylaneSyncEvent = {
|
|
4749
|
+
id: string;
|
|
4750
|
+
date: number;
|
|
4751
|
+
type: PennylaneSyncEventType;
|
|
4752
|
+
message: string;
|
|
4753
|
+
before?: Record<string, unknown>;
|
|
4754
|
+
after?: Record<string, unknown>;
|
|
4755
|
+
payload?: Record<string, unknown>;
|
|
4756
|
+
};
|
|
4757
|
+
|
|
4758
|
+
/**
|
|
4759
|
+
* Espejo de una factura de PennyLane dentro de Articho.
|
|
4760
|
+
*
|
|
4761
|
+
* Vive a nivel de empresa y no dentro de un proyecto a proposito: una factura
|
|
4762
|
+
* que entra electronicamente no sabe a que proyecto pertenece. Es tambien la
|
|
4763
|
+
* fuente del listado "Bills" del menu de administradores.
|
|
4764
|
+
*/
|
|
4765
|
+
export type ImportedBill = {
|
|
4766
|
+
id: string;
|
|
4767
|
+
source: 'pennylane';
|
|
4768
|
+
direction: 'supplier' | 'customer';
|
|
4769
|
+
/** Id en PennyLane. Clave de deduplicacion. */
|
|
4770
|
+
externalId: string;
|
|
4771
|
+
enterpriseId: string;
|
|
4772
|
+
status: ImportedBillStatus;
|
|
4773
|
+
|
|
4774
|
+
invoice: {
|
|
4775
|
+
reference: string;
|
|
4776
|
+
label?: string;
|
|
4777
|
+
date: number;
|
|
4778
|
+
dueDate?: number | null;
|
|
4779
|
+
currency: string;
|
|
4780
|
+
amountHT: number;
|
|
4781
|
+
amountTVA: number;
|
|
4782
|
+
amountTTC: number;
|
|
4783
|
+
isPaid: boolean;
|
|
4784
|
+
paidAt?: number | null;
|
|
4785
|
+
externalStatus?: string | null;
|
|
4786
|
+
/** Origen de la importacion en PennyLane: Email, API, PA/PDP... */
|
|
4787
|
+
externalSource?: string | null;
|
|
4788
|
+
fileUrl?: string | null;
|
|
4789
|
+
};
|
|
4790
|
+
|
|
4791
|
+
counterparty: {
|
|
4792
|
+
name: string;
|
|
4793
|
+
regNo?: string | null;
|
|
4794
|
+
pennylaneId?: string | null;
|
|
4795
|
+
};
|
|
4796
|
+
|
|
4797
|
+
/** Referencias tal y como venian en la factura, y de que campo salieron. */
|
|
4798
|
+
references: {
|
|
4799
|
+
projectRef?: string | null;
|
|
4800
|
+
devisRef?: string | null;
|
|
4801
|
+
sources?: { project?: string; devis?: string };
|
|
4802
|
+
};
|
|
4803
|
+
|
|
4804
|
+
/** Resolucion automatica. Nunca crea la factura por si sola. */
|
|
4805
|
+
suggestion?: {
|
|
4806
|
+
projectId?: string | null;
|
|
4807
|
+
devisId?: string | null;
|
|
4808
|
+
reasons: string[];
|
|
4809
|
+
};
|
|
4810
|
+
|
|
4811
|
+
/** Asociacion confirmada por un administrador. */
|
|
4812
|
+
assignment?: {
|
|
4813
|
+
projectId: string;
|
|
4814
|
+
devisId: string;
|
|
4815
|
+
billId: string;
|
|
4816
|
+
projectName?: string | null;
|
|
4817
|
+
projectReference?: string | null;
|
|
4818
|
+
devisName?: string | null;
|
|
4819
|
+
assignedBy: string;
|
|
4820
|
+
assignedAt: number;
|
|
4821
|
+
} | null;
|
|
4822
|
+
|
|
4823
|
+
lastSyncAt: number;
|
|
4824
|
+
createdAt: number;
|
|
4825
|
+
};
|
|
4826
|
+
|
|
4827
|
+
/* -------------------------------------------------------------------------- */
|
|
4828
|
+
/* Identidad de facturacion */
|
|
4829
|
+
/* -------------------------------------------------------------------------- */
|
|
4830
|
+
|
|
4831
|
+
/**
|
|
4832
|
+
* Direccion postal desglosada.
|
|
4833
|
+
*
|
|
4834
|
+
* El campo `address` suelto que ya existe en varias entidades no sirve para
|
|
4835
|
+
* facturar: PennyLane —y la facturacion electronica en general— exige calle,
|
|
4836
|
+
* codigo postal, ciudad y pais como campos separados. Y `GeoLocation` solo
|
|
4837
|
+
* guarda lat/lng, asi que no hay de donde derivarlos.
|
|
4838
|
+
*/
|
|
4839
|
+
export type PostalAddress = {
|
|
4840
|
+
address: string;
|
|
4841
|
+
postalCode: string;
|
|
4842
|
+
city: string;
|
|
4843
|
+
/** Codigo ISO de dos letras: FR, ES, BE... */
|
|
4844
|
+
countryAlpha2: string;
|
|
4845
|
+
};
|
|
4846
|
+
|
|
4847
|
+
export enum BillingPaymentConditions {
|
|
4848
|
+
UPON_RECEIPT = 'upon_receipt',
|
|
4849
|
+
DAYS_7 = '7_days',
|
|
4850
|
+
DAYS_15 = '15_days',
|
|
4851
|
+
DAYS_30 = '30_days',
|
|
4852
|
+
DAYS_30_EOM = '30_days_end_of_month',
|
|
4853
|
+
DAYS_45 = '45_days',
|
|
4854
|
+
DAYS_45_EOM = '45_days_end_of_month',
|
|
4855
|
+
DAYS_60 = '60_days',
|
|
4856
|
+
}
|
|
4857
|
+
|
|
4858
|
+
export enum BillingLanguage {
|
|
4859
|
+
FR = 'fr_FR',
|
|
4860
|
+
EN = 'en_GB',
|
|
4861
|
+
DE = 'de_DE',
|
|
4862
|
+
ES = 'es_ES',
|
|
4863
|
+
}
|
|
4864
|
+
|
|
4865
|
+
/**
|
|
4866
|
+
* Datos necesarios para emitir una factura a esta entidad.
|
|
4867
|
+
*
|
|
4868
|
+
* Es el mismo objeto para las cinco entidades facturables (Client, Pro,
|
|
4869
|
+
* Seller, Provider, MaterialsProvider) a proposito: un solo tipo, un solo
|
|
4870
|
+
* validador y un solo formulario, en lugar de cinco variantes que divergen.
|
|
4871
|
+
*
|
|
4872
|
+
* Se rellena de forma incremental: el modal de envio a PennyLane pide lo que
|
|
4873
|
+
* falte justo antes de facturar y lo guarda aqui, de modo que solo se completa
|
|
4874
|
+
* para las entidades a las que de verdad se les factura.
|
|
4875
|
+
*/
|
|
4876
|
+
/**
|
|
4877
|
+
* Persona juridica o persona fisica.
|
|
4878
|
+
*
|
|
4879
|
+
* No es un detalle de forma: decide que exige la ley y que endpoint de
|
|
4880
|
+
* PennyLane se usa. Una factura a una empresa entra en la facturacion
|
|
4881
|
+
* electronica —SIREN obligatorio, transmision por la red—; una a un particular
|
|
4882
|
+
* queda fuera del ambito y solo genera e-reporting, sin identificar al cliente.
|
|
4883
|
+
*
|
|
4884
|
+
* Un `undefined` significa "todavia no lo sabemos", que es distinto de las
|
|
4885
|
+
* otras dos: el formulario tiene que preguntarlo, no suponerlo.
|
|
4886
|
+
*/
|
|
4887
|
+
export type BillingLegalType = 'company' | 'individual';
|
|
4888
|
+
|
|
4889
|
+
export type BillingIdentity = {
|
|
4890
|
+
/** Empresa o particular. Ver [[BillingLegalType]]. */
|
|
4891
|
+
legalType?: BillingLegalType;
|
|
4892
|
+
|
|
4893
|
+
/**
|
|
4894
|
+
* Razon social. Obligatoria en empresas.
|
|
4895
|
+
*
|
|
4896
|
+
* En un particular no se pide: se compone de nombre y apellidos con
|
|
4897
|
+
* [[billingDisplayName]], para no tener dos sitios donde vive el mismo dato
|
|
4898
|
+
* y que acaben diciendo cosas distintas.
|
|
4899
|
+
*/
|
|
4900
|
+
legalName: string;
|
|
4901
|
+
|
|
4902
|
+
/** Nombre. Obligatorio en particulares; PennyLane lo pide separado. */
|
|
4903
|
+
firstName?: string;
|
|
4904
|
+
/** Apellidos. Obligatorio en particulares. */
|
|
4905
|
+
lastName?: string;
|
|
4906
|
+
/** Direccion de facturacion. Obligatoria. */
|
|
4907
|
+
address: PostalAddress;
|
|
4908
|
+
/** Direccion de entrega, si difiere de la de facturacion. */
|
|
4909
|
+
deliveryAddress?: PostalAddress;
|
|
4910
|
+
/** SIREN (9 digitos) o SIRET (14). */
|
|
4911
|
+
registrationNumber?: string;
|
|
4912
|
+
/** Numero de TVA intracomunitario. No confundir con el tipo de IVA. */
|
|
4913
|
+
vatNumber?: string;
|
|
4914
|
+
/** Correos a los que enviar la factura. */
|
|
4915
|
+
emails?: string[];
|
|
4916
|
+
phone?: string;
|
|
4917
|
+
/** Persona o servicio destinatario dentro de la empresa. */
|
|
4918
|
+
recipient?: string;
|
|
4919
|
+
paymentConditions?: BillingPaymentConditions;
|
|
4920
|
+
language?: BillingLanguage;
|
|
4921
|
+
/** Notas que acompanan a la ficha del tercero. */
|
|
4922
|
+
notes?: string;
|
|
4923
|
+
/**
|
|
4924
|
+
* Id del tercero en PennyLane, cacheado tras la primera factura. Evita
|
|
4925
|
+
* volver a buscarlo y, sobre todo, evita duplicar la ficha.
|
|
4926
|
+
*/
|
|
4927
|
+
pennylaneCustomerId?: string;
|
|
4928
|
+
|
|
4929
|
+
/**
|
|
4930
|
+
* Lo que dice el registro publico de la empresa, tal y como se leyo la
|
|
4931
|
+
* ultima vez. No va impreso en la factura: es la procedencia de lo que hay
|
|
4932
|
+
* arriba. Ver [[BillingInseeData]].
|
|
4933
|
+
*/
|
|
4934
|
+
insee?: BillingInseeData;
|
|
4935
|
+
|
|
4936
|
+
/**
|
|
4937
|
+
* Que problemas se encontraron la ultima vez que se intento completar esta
|
|
4938
|
+
* ficha desde los registros publicos. Pensado para pintarse como tooltip.
|
|
4939
|
+
* Ver [[BillingEnrichment]].
|
|
4940
|
+
*/
|
|
4941
|
+
enrichment?: BillingEnrichment;
|
|
4942
|
+
|
|
4943
|
+
updatedAt?: number;
|
|
4944
|
+
updatedBy?: string;
|
|
4945
|
+
};
|
|
4946
|
+
|
|
4947
|
+
/**
|
|
4948
|
+
* Lo que el registro publico dice de la empresa de un tercero.
|
|
4949
|
+
*
|
|
4950
|
+
* Lo escribe `scripts/enrich-billing-from-insee.js`. Cuelga de
|
|
4951
|
+
* [[BillingIdentity]] junto al resto de lo que hace falta para facturar, pero
|
|
4952
|
+
* en su propio bloque: los campos de arriba son lo que va impreso en la
|
|
4953
|
+
* factura y los puede corregir una persona; esto es lo que dice el registro y
|
|
4954
|
+
* se reescribe en cada pasada.
|
|
4955
|
+
*/
|
|
4956
|
+
export interface BillingInseeData {
|
|
4957
|
+
/** SIREN, 9 digitos. */
|
|
4958
|
+
siren?: string;
|
|
4959
|
+
/** SIRET del establecimiento consultado, 14 digitos. */
|
|
4960
|
+
siret?: string;
|
|
4961
|
+
/** Si el establecimiento consultado es el domicilio social. */
|
|
4962
|
+
siege?: boolean;
|
|
4963
|
+
/** Categoria juridica (`categorieJuridiqueUniteLegale`). */
|
|
4964
|
+
legalForm?: string | null;
|
|
4965
|
+
/** Codigo APE/NAF (`activitePrincipaleUniteLegale`). */
|
|
4966
|
+
nafCode?: string | null;
|
|
4967
|
+
/** Estado de la unidad legal: `A` activa, `C` cesada. */
|
|
4968
|
+
state?: string | null;
|
|
4969
|
+
/** Estado del establecimiento: `A` activo, `F` cerrado. */
|
|
4970
|
+
establishmentState?: string | null;
|
|
4971
|
+
/** Nombre comercial, si difiere de la razon social. */
|
|
4972
|
+
tradeName?: string | null;
|
|
4973
|
+
/** Como se resolvio: `siret`, `siege` o `siege-fallback`. */
|
|
4974
|
+
matchedBy?: string;
|
|
4975
|
+
/**
|
|
4976
|
+
* Presente solo si el SIREN no venia en la ficha y se dedujo buscando por
|
|
4977
|
+
* razon social. Sirve para no confundir un dato aportado con uno inferido.
|
|
4978
|
+
*/
|
|
4979
|
+
sirenFoundBy?: string;
|
|
4980
|
+
/** Resultado de validar el numero de TVA contra VIES. */
|
|
4981
|
+
vatCheck?: BillingVatCheck;
|
|
4982
|
+
/** Cuando se consulto el registro por ultima vez. */
|
|
4983
|
+
checkedAt?: number;
|
|
4984
|
+
}
|
|
4985
|
+
|
|
4986
|
+
/**
|
|
4987
|
+
* Validacion del numero de TVA intracomunitario contra el registro VIES.
|
|
4988
|
+
*
|
|
4989
|
+
* El numero no lo publica el INSEE: se calcula a partir del SIREN, y la
|
|
4990
|
+
* formula siempre devuelve algo bien formado, tambien para quien esta en
|
|
4991
|
+
* franquicia en base y no tiene numero real. `valid: false` significa que el
|
|
4992
|
+
* numero no existe, no que este mal escrito.
|
|
4993
|
+
*/
|
|
4994
|
+
export interface BillingVatCheck {
|
|
4995
|
+
/** El numero que se comprobo. */
|
|
4996
|
+
number: string;
|
|
4997
|
+
status: 'VALID' | 'INVALID' | 'UNAVAILABLE';
|
|
4998
|
+
/** `null` cuando VIES no contesto: no se sabe, que no es lo mismo que no. */
|
|
4999
|
+
valid: boolean | null;
|
|
5000
|
+
reason?: string | null;
|
|
5001
|
+
source: string;
|
|
5002
|
+
checkedAt: number;
|
|
5003
|
+
}
|
|
5004
|
+
|
|
5005
|
+
/**
|
|
5006
|
+
* Gravedad de una incidencia de enriquecimiento.
|
|
5007
|
+
*
|
|
5008
|
+
* - `ok` la ficha se completo sin nada que senalar.
|
|
5009
|
+
* - `warning` se completo, pero hay algo que conviene mirar.
|
|
5010
|
+
* - `error` no se pudo completar: falta el identificador, no esta en el
|
|
5011
|
+
* registro, o la consulta fallo.
|
|
5012
|
+
*/
|
|
5013
|
+
export type BillingEnrichmentLevel = 'ok' | 'warning' | 'error';
|
|
5014
|
+
|
|
5015
|
+
/**
|
|
5016
|
+
* Codigo de cada incidencia. Existe para poder filtrar y contar sin parsear
|
|
5017
|
+
* el texto, que esta escrito para leerse y puede cambiar de redaccion.
|
|
5018
|
+
*/
|
|
5019
|
+
export enum BillingEnrichmentCode {
|
|
5020
|
+
/** La ficha no trae ni SIREN ni SIRET. */
|
|
5021
|
+
NO_IDENTIFIER = 'NO_IDENTIFIER',
|
|
5022
|
+
/** Hay varias empresas con esa razon social: hace falta elegir a mano. */
|
|
5023
|
+
SIREN_AMBIGUOUS = 'SIREN_AMBIGUOUS',
|
|
5024
|
+
/** El identificador no aparece en el registro. */
|
|
5025
|
+
NOT_FOUND = 'NOT_FOUND',
|
|
5026
|
+
/** La unidad legal figura cesada. */
|
|
5027
|
+
COMPANY_CLOSED = 'COMPANY_CLOSED',
|
|
5028
|
+
/** El establecimiento figura cerrado; la empresa puede seguir viva. */
|
|
5029
|
+
ESTABLISHMENT_CLOSED = 'ESTABLISHMENT_CLOSED',
|
|
5030
|
+
/** El numero de TVA no consta en VIES. Probable franquicia en base. */
|
|
5031
|
+
VAT_NOT_REGISTERED = 'VAT_NOT_REGISTERED',
|
|
5032
|
+
/** VIES no contesto: el numero se guardo sin verificar. */
|
|
5033
|
+
VAT_UNVERIFIED = 'VAT_UNVERIFIED',
|
|
5034
|
+
/** VIES devuelve una razon social distinta de la del INSEE. */
|
|
5035
|
+
VAT_NAME_MISMATCH = 'VAT_NAME_MISMATCH',
|
|
5036
|
+
/** Establecimiento fuera de Francia: falta informar el pais. */
|
|
5037
|
+
FOREIGN_ADDRESS = 'FOREIGN_ADDRESS',
|
|
5038
|
+
MISSING_POSTAL_CODE = 'MISSING_POSTAL_CODE',
|
|
5039
|
+
MISSING_STREET = 'MISSING_STREET',
|
|
5040
|
+
/** La consulta al registro fallo (red, cuota, credenciales). */
|
|
5041
|
+
LOOKUP_ERROR = 'LOOKUP_ERROR',
|
|
5042
|
+
}
|
|
5043
|
+
|
|
5044
|
+
/**
|
|
5045
|
+
* Que paso la ultima vez que se intento completar los datos de facturacion de
|
|
5046
|
+
* esta ficha desde los registros publicos.
|
|
5047
|
+
*
|
|
5048
|
+
* `text` es el campo que se pinta: texto plano, un mensaje por linea, listo
|
|
5049
|
+
* para un `title` o un tooltip. `messages` y `codes` estan para quien prefiera
|
|
5050
|
+
* pintarlos sueltos o filtrar por tipo de incidencia.
|
|
5051
|
+
*
|
|
5052
|
+
* El bloque se reescribe entero en cada pasada. Que este ausente significa que
|
|
5053
|
+
* la ficha nunca se reviso; que `level` sea `ok` significa que se reviso y no
|
|
5054
|
+
* habia nada que senalar.
|
|
5055
|
+
*/
|
|
5056
|
+
export interface BillingEnrichment {
|
|
5057
|
+
/** Un mensaje por linea, separados por `\n`. Vacio cuando `level` es `ok`. */
|
|
5058
|
+
text: string;
|
|
5059
|
+
/** Los mismos mensajes, sin unir. */
|
|
5060
|
+
messages: string[];
|
|
5061
|
+
codes: BillingEnrichmentCode[];
|
|
5062
|
+
level: BillingEnrichmentLevel;
|
|
5063
|
+
/** Quien lo escribio, p. ej. `insee-script`. */
|
|
5064
|
+
source: string;
|
|
5065
|
+
checkedAt: number;
|
|
5066
|
+
}
|